This artefact can be used to retrieve and parse some GoodSync file in order to
This artifact have been created to identify potential exfiltrated files using GoodSync tool. You can read more about it on https://www.synacktiv.com/publications/legitimate-exfiltration-tools-summary-and-detection-for-incident-response-and-threat
name: Windows.Applications.GoodSync
author: Nathanaël Ndong, Synacktiv
description: |
This artefact can be used to retrieve and parse some GoodSync file in order to
- identify configured Good Sync account;
- identify data and time of transfered files.
This artifact have been created to identify potential exfiltrated files using GoodSync tool.
You can read more about it on https://www.synacktiv.com/publications/legitimate-exfiltration-tools-summary-and-detection-for-incident-response-and-threat
type: CLIENT
parameters:
- name: FileGlob
default: C:\Users\*\AppData\Local\GoodSync\GoodSync-*
sources:
- name: sync files
query: |
-- Grabs file path of provided file glob
LET InputLogPath <= SELECT FullPath
FROM glob(globs=FileGlob)
-- Parses file against regex
LET parse_log <= SELECT
parse_string_with_regex(
string=Line,
regex= '''^(?P<Date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s''' +
'''#\d+\s'''+
'''(?P<Message>.+?)$''')
as Record
FROM parse_lines(filename=InputLogPath.FullPath)
--SELECT * FROM parse_log WHERE Record.Message =~ "Copy New"
-- Prints matching data where there is an entry in Record.Message
LET extract_files(message) =
parse_string_with_regex(string=message,
regex=
'''^(?P<Protocol>\[.+?\])\s''' +
'''.?''' +
'''\s?(?P<Operation>Copy\sNew)\s''' +
'''\'(?P<Source>.+?)\'\s''' +
'''.+?\s''' +
'''\'(?P<Destination>.+?)\'\s''' +
'''\((?P<Byte>.+?)\)'''
)
SELECT Record.Date as Date,
extract_files(message=Record.Message).Protocol AS Protocol,
extract_files(message=Record.Message).Operation AS Operation,
extract_files(message=Record.Message).Source AS Source,
extract_files(message=Record.Message).Destination AS Destination,
extract_files(message=Record.Message).Size AS Size
FROM parse_log
WHERE Record.Message =~ "Copy New"
- name: good_sync_account
query: |
LET InputLogPath <= SELECT FullPath
FROM glob(globs=FileGlob)
LET parse_log <= SELECT
parse_string_with_regex(
string=Line,
regex= '''^(?P<Date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s''' +
'''#\d+\s'''+
'''(?P<Message>.+?)$''')
as Record
FROM parse_lines(filename=InputLogPath.FullPath)
LET extract_user(message)= parse_string_with_regex(string=message,
regex='''.+?\s.+?\s.+?\s''' +
'''UserId=''' +
'''(?P<UserId>.+?)\s''' +
'''m_bLicActive=''' +
'''(?P<Nb_licence>.+?)\s''' +
'''.+?''' +
'''(?P<Date_expiration>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s'''+
'''.+?\s.+?\s.+?''' +
'''(?P<Date_creation>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s'''
)
--SELECT * FROM parse_log WHERE Record.Message =~ "CheckLicenseViaGsAccount:"
SELECT Record.Date as Date,
extract_user(message=Record.Message).UserId AS GoodSync_Account,
extract_user(message=Record.Message).Nb_licence AS Active_Licence,
extract_user(message=Record.Message).Date_expiration AS Licence_Expiration,
extract_user(message=Record.Message).Date_creation AS Account_Creation
FROM parse_log
WHERE Record.Message =~ "CheckLicenseViaGsAccount:"