www.cyberark.com
Open in
urlscan Pro
104.17.196.105
Public Scan
URL:
https://www.cyberark.com/resources/threat-research-blog/masking-malicious-memory-artifacts-part-iii-bypassing-defensive-s...
Submission: On November 12 via manual from JP — Scanned from JP
Submission: On November 12 via manual from JP — Scanned from JP
Form analysis
1 forms found in the DOMGET https://www.cyberark.com/
<form role="search" method="get" class="ubermenu-searchform" action="https://www.cyberark.com/"> <input type="text" placeholder="What can we help you find?" value="" name="s" class="ubermenu-search-input"> <button type="submit"
class="ubermenu-search-submit"><i class="fas fa-search" title="Search"></i></button> </form>
Text Content
* Blogs * Marketplace * Partners * Careers * * Why CyberArk * * Identity Security Leader Security-forward identity and access management. Why CyberArk * * CyberArk Labs The industry’s top talent proactively researching attacks and trends to keep you ahead. -------------------------------------------------------------------------------- * Blogs Insights to help you move fearlessly forward in a digital world. -------------------------------------------------------------------------------- * Careers Join a passionate team that is humbled to be a trusted advisor to the world's top companies. -------------------------------------------------------------------------------- * * Financial "CyberArk delivers great products that lead the industry." Read Case Studies * Products * * Identity Security Platform Put security first without putting productivity second. Explore Platform * * Privilege * -------------------------------------------------------------------------------- * Privileged Access Manager * Vendor Privileged Access Manager * Cloud Entitlements Manager * Endpoint Privilege Manager * * Access * -------------------------------------------------------------------------------- * Workforce Identity * Customer Identity * * DevSecOps * -------------------------------------------------------------------------------- * Conjur Secrets Manager Enterprise * Conjur Secrets Manager Open Source * Credential Providers * QUICK LINKS * Marketplace * Solutions * * * By Business Initiative * * Defend Against Attacks * Defend Against Attacks * Defense-in-Depth * Ransomware Protection * Secure DevOps Pipelines and Cloud Native Apps * Zero Trust * Satisfy Audit & Compliance * Satisfy Audit & Compliance * * Drive Operational Efficiencies * Drive Operational Efficiencies * Secure Cloud Workloads * Remote Workforce Access * Enable the Digital Business * Enable the Digital Business * Secure Bots and Virtual Agents * By Industry * Banking Safeguard customer trust and drive stronger engagement. -------------------------------------------------------------------------------- * Insurance Create a competitive edge with secure digital innovation. -------------------------------------------------------------------------------- * Healthcare Keep ransomware and other threats at bay while you secure patient trust. -------------------------------------------------------------------------------- * Federal Ensure sensitive data is accessible to those that need it - and untouchable to everyone else. -------------------------------------------------------------------------------- * Services & Support * * How Can We Help? Expert guidance from strategy to implementation. Services & Support * * * CUSTOMER SUCCESS * -------------------------------------------------------------------------------- * Customer Stories * CyberArk Blueprint * Success Plans * * LEARNING * -------------------------------------------------------------------------------- * Training * Certification * Education Resources * * SERVICES * -------------------------------------------------------------------------------- * Security Services * Red Team Services * Remediation Services * * RESOURCES * -------------------------------------------------------------------------------- * Technical Community * Technical Support * Product Documentation * Try & Buy * * Try and Buy Get started with one of our 30-day trials. Start a Trial * * How to Buy Evaluate, purchase and renew CyberArk Identity Security solutions -------------------------------------------------------------------------------- * Contact Us How can we help you move fearlessly forward? -------------------------------------------------------------------------------- * Identity Security Subscriptions Learn more about our subscription offerings. -------------------------------------------------------------------------------- * Request a Demo * * * Blogs * Partners * Marketplace * Careers * Menu Item * Deutsch * Français * Italiano * Español * 日本語 * 简体中文 * 繁體中文 English – CyberArk Software Inc UP YOUR SECURITY I.Q. BY CHECKING OUT OUR COLLECTION OF CURATED RESOURCES. English – CyberArk Software Inc * Home * Products & Services * Products & Services * Privilege On Premises * CyberArk Identity * Cloud Entitlements Manager * Vendor Privileged Access Manager * Conjur Secrets Manager Enterprise * Endpoint Privilege Manager * CyberArk Privilege Cloud * Assessment Tools * Services & Support * Topics * Topics * Automate Privileged Tasks * Best Practices for Privileged Access Management * Meet Audit and Compliance * Mitigate Risk With Just-in-Time and Least Privilege * Remove Local Admin Rights on Workstations * Secure Application Credentials * Secure Cloud Environments * Secure DevOps Pipelines and Cloud Native Apps * Secure Human Privileged Access * Secure RPA Workloads * Secure Third-Party Vendor and Remote Access * Secure Workforce Access * Threat Research * Industry * Industry * Financial Services & Insurance * Healthcare * Public Sector & Government * Content Type * Content Type * Analyst Reports & Research * Blog Posts * Case Studies * eBooks * Infographics * On-Demand Events & Webinars * Product Announcements * Product Datasheets * Solution Briefs * Videos * Whitepapers * Customer Stories Resource Menu × All » Threat Research Blog » Masking Malicious Memory Artifacts – Part III: Bypassing Defensive Scanners × Share this Article * Facebook * Twitter * Email * LinkedIn MASKING MALICIOUS MEMORY ARTIFACTS – PART III: BYPASSING DEFENSIVE SCANNERS Forrest Orr8/3/20 * Share this! * Facebook * Twitter * Email * LinkedIn INTRODUCTION With fileless malware becoming a ubiquitous feature of most modern Red Teams, knowledge in the domain of memory stealth and detection is becoming an increasingly valuable skill to add to both an attacker and defender’s arsenal. I’ve written this text with the intention of further improving the skill of the reader as it relates to the topic of memory stealth on Windows for both designing and defending against such malware. First, I will first introduce my pseudo-malicious memory artifacts kit tool (open source on Github here). Second, using this tool I will investigate the weak points of several defensive scanners. Finally, I will explore what I deem to be the most valuable stealth techniques and concepts from an attack perspective based on the results of this investigation. This is the third in a series of posts on malware forensics and bypassing defensive scanners. It was written with the assumption that the reader understands the basics of Windows internals, memory scanners and malware design. CORPUS In order to accurately measure the efficacy of the scanners discussed in this text, I’ve constructed a modular pseudo-malware artifact generator program, which I refer to throughout this text as my artifact kit. It generates a myriad of dynamic shellcode and PE implants in memory, covering all of the most common and effective fileless memory residence techniques used by real malware in the wild. In this sense, while the actual shellcode or PE implant itself may not match that of a real malware sample, the attributes of the memory that encapsulates it are intended to mimic the attributes of every real malware that can or does already exist, whether they are performing process injections, process hollowing or self-unpacking. Similar to the modular/dynamic method of generating custom process injections by mixing and matching allocation methods, copy methods and execution methods implemented by FuzzySec and integrated into SharpSploit, the artifact kit in this text mixes and matches different memory allocation, code implant and stealth techniques to mimic the dynamic code operations made in fileless malware. The memory allocation types handled in this corpus are as follows: * Mapped image hollowing – a DLL of sufficient size to accommodate the payload code is used to create an image section via DLL!NtCreateSection with SEC_IMAGE, a view of which is then mapped into the target process using NTDLL.DLL!NtMapViewOfSection. In the part one of this series this is referred to as DLL hollowing. * Mapped TxF image hollowing – a transacted file handle is opened to a DLL and used to create a phantom image section from it with DLL!NtCreateSection with SEC_IMAGE, which is then mapped into the target process using NTDLL.DLL!NtMapViewOfSection. In the part one of this series this is referred to as phantom DLL hollowing. * Loaded image hollowing – a DLL is loaded normally using DLL!LdrLoadDll. * Private memory – allocated using DLL!NtAllocateVirtualMemory * Mapped memory – allocated by mapping a view of a section created from the page file using DLLNtCreateSection. Each of these allocation types can be used with either a shellcode or PE payload as their implant type. In cases where a variation of DLL hollowing is used as the allocation type in conjunction with shellcode, an appropriate implant offset within the .text section that does not conflict with relocations or data directories will be chosen for it. Figure 1. A hollowed Kernel32.dll image with a malicious shellcode implanted in its code section. In all allocation types where a PE payload is used, the PE will be directly written to the base of the region and bootstrapped (relocations applied, IAT resolved, etc.). Figure 2. A hollowed Kernel32.dll image overwritten with a malicious PE implant. In conjunction with all of these different allocation and payload types, one or more stealth techniques can, optionally, be applied: 1. Header wiping – in the event a PE payload is used, its header will be overwritten with 0’s. Figure 3. A malicious PE implant stored in private memory that has had its headers wiped. 1. Header mirroring – in the event a PE payload is used in conjunction with a variation of DLL hollowing, the header of the original DLL file underlying the hollowed section will be preserved. Figure 4. A hollowed Kernel32.dll image has had its original headers preserved. 1. RW -> RX – In the event that private or mapped allocation is used, it will initially be allocated as +RW permissions (+RWX is the default) and then modified to +RX after the implant has been written using NTDLL.DLL!NtProtectVirtualMemory. 2. Dotnet – In the event that a variation of DLL hollowing is selected as the allocation type, only PE DLLs with a .NET data directory will be selected. 3. Moating – allocated memory, regardless of its type, will require additional memory equal to the size of the “moat” (default of 1MB). When the implant is written to the new region, it will be written at an offset equal to the size of the moat; the data prior to which will be junk. Figure 5. A malicious PE implant has been placed at an offset one megabyte deep into an allocated region of private +RWX memory. Finally, the artifact kit allows the user to specify an execution method. This is the method by which execution control is passed to the payload after its container region has been created, its implant finished and its obfuscations finalized. This may be either: 1. A new thread with the use of the KERNEL32.DLL!CreateThread API. 2. A JMP hook placed on the entry point of the primary EXE module (which is called by the artifact kit to simulate the type of hook often used in process hollowing). 3. A direct assembly CALL instruction. This distinction between execution method has great significance, as the starting point of a thread and modification of existing image memory are some of the many artifacts a scanner may leverage to form an IOC, as we will explore later. An example of the practical usage of the artifact kit is as follows: we would like to mimic the memory artifacts generated by the loader of the Osiris malware family. I suggest reading this analysis of the Osiris loader prior to reading the remainder of this section. This loader begins by using the Lagos Island method in order to bypass hooks on ntdll.dll. We can artificially generate an identical artifact using the artifact kit: Figure 6. Artifact kit mimicking Lagos Island technique by mapping ntdll.dll using its hollowing feature without writing an implant to it. Using my tool Moneta (explored in detail in part two of this series) the memory of the artifact process is enumerated and the authentic/original ntdll.dll loaded via static imports at process startup can be seen at 0x00007FFEF4F60000 without IOCs: Figure 7. Moneta enumerating the memory within the artifact process – the real ntdll.dll Examining the memory scan output in further detail, a second ntdll.dll can be seen at 0x000001A30E010000. Notably, this ntdll.dll shows a missing PEB module IOC. This is because the Lagos Island method (as well as the hollower in the artifact kit) use NTDLL.DLL!NtCreateSection and NTDLL.DLL!NtMapViewOfSection rather than NTDLL.DLL!LdrLoadDll. This results in an image backed by the authentic ntdll.dll on disk being created in memory, but no corresponding entry for it being created in the PEB loaded modules list. This is an abnormality unique to Lagos Island, DLL hollowing and some usermode Rootkits that intentionally unlink themselves from the PEB to bypass scanners that rely on this list for their usermode process enumeration. Figure 8. Moneta enumerating the memory within the artifact process – the orphaned clone of ntdll.dll. Using the hook-free Lagos Island ntdll.dll clone, Osiris then activates its process hollowing routine which launches a signed wermgr.exe in suspended mode. Next, it creates a file in %TEMP% that holds its payload code using TxF (which prevents it from being scanned by AV when written to disk). A section is generated from the TxF handle to this file and a view of this section is mapped into the suspended wermgr.exe process. The image base in the PEB of wermgr.exe is redirected to this new image memory region and a JMP is written to the entry point of the original wermgr.exe image in memory to achieve code execution, as opposed to using KERNEL32.DLL!SetThreadContext (typically the preferred method in process hollowing). Simply resuming the suspended wermgr.exe process causes the malicious payload to be executed. In order to generate artifacts that will mimic this loader behavior and simulate the IOC contents of wermgr.exe, the artifact kit can be used to execute a PE payload using TxF image map hollowing as its allocation method, while using a JMP from the process entry point as its execution method. Figure 9. Artifact kit mimicking Osiris process hollowing via phantom DLL hollowing. Scanning the artifact process using Moneta, the suspicious Osiris artifacts become easy to distinguished from legitimate memory: Figure 10. Moneta enumerating the artifact memory within the artifact process – phantom DLL hollowing in conjunction with an inline hook. The first of the two IOCs above (enumerated in the first highlighted region) are a result of the technique that Osiris uses to do its hollowing. Due to the module containing the malicious code being mapped into the target process using TxF, its file object is non-queryable from the context of an external process, leading Moneta to classify it as a phantom module and marking it as an IOC. Secondly, due to this phantom module being manually mapped via NTDLL.DLL!NtMapViewOfSection, rather than legitimately using NTDLL.DLL!LdrLoadDll, it has not been added to the loaded modules list in the PEB, leading to an IOC stemming from the lack of a PEB module corresponding to the base address of 0x00007FF702DB0000 associated with the mapped image region. The third and final IOC (enumerated in the second highlighted region in Figure 10) corresponds to the .text section of the primary EXE module of the artifact process (in this case ArtifactKit64.exe itself) at 0x00007FF7D3EA1000. In the final column to the right-hand side of the highlighted region, the value of 0x1000 is displayed alongside the +RX region in .text. This is a measure of the number of private bytes in the working set associated with the memory region. For any +RX region (including the .text section), this value should always be 0, since the memory was not intended to be writable and should contain only static (as opposed to dynamic) code. I suggest reading part one of this series for a more in-depth explanation of this phenomenon. The fact that this region has private bytes associated with it comes as a result of the inline hook written to the entry point within the .text section by the artifact kit. This hook triggers a modified code IOC in imitation of the artifacts that would result from a process hollowing operation of the Osiris loader. The example provided above illustrates how the artifacts kit is able to mimic the memory footprint of real malware. In order to conduct the research described throughout the remainder of this text, the artifacts kit was used to generate every possible combination of memory allocation, obfuscation and implant types in combination with one another. The resulting artifacts were scanned with a series of defensive memory scanners to determine their visibility. The remainder of this text will focus on the insights gained from these scans and their wider implications when designing malware. MALFIND The Volatility framework serves as the backbone for many of the popular malware memory forensic scanners in use today. It makes use of a kernel mode driver in order to directly query usermode memory, primarily relying upon VADs for its analysis. Best known among these memory scanner plugins is Malfind, a plugin which exists both in the classic Volatility framework as well as Rekall (a similar project that began as a fork of Volatility). For a set of initial tests, I used the artifact kit to generate six variations of empty memory allocations without malicious implants to understand on a basic level which types of allocations Malfind considers suspicious. Figure 11. Malfind detection results for blank artifact kit allocation types. These results are somewhat surprising in that they illustrate a lack of detection for what would commonly be considered the most suspicious type of memory allocation, private +RWX regions. In contrast, a PAGE_EXECUTE_WRITECOPY allocation (Malfind doesn’t differentiate between this and +RWX) of image memory corresponding to a DLL that has been manually mapped rather than loaded via NTDLL.DLL!LdrLoadDll is detected. An explanation for why private +RWX is not detected in this case can be seen in Figure 12 below. def _is_vad_empty(self, vad, address_space): """ Check if a VAD region is either entirely unavailable due to paging, entirely consiting of zeros, or a combination of the two. This helps ignore false positives whose VAD flags match task._injection_filter requirements but there's no data and thus not worth reporting it. @param vad: an MMVAD object in kernel AS @param address_space: the process address space """ PAGE_SIZE = 0x1000 all_zero_page = "\x00" * PAGE_SIZE offset = 0 while offset < vad.Length: next_addr = vad.Start + offset if (address_space.is_valid_address(next_addr) and address_space.read(next_addr, PAGE_SIZE) != all_zero_page): return False offset += PAGE_SIZE return True Figure 12. Malfind.py lines 37-60 – Blank VAD filter logic within Malfind source code. This subroutine (as clearly stated in the highlighted region) is used to filter false positives by eliminating any region of memory filled only with 0’s from the results of a malware scan. In our case, the private and mapped +RWX regions allocated by the artifact kit will fall into this category and will thus be eliminated. An explanation of the second notable result from Figure 11 (the detection of unmodified manually mapped image regions) can be seen in Figure 13 below. for task in self.filter_processes(): # Build a dictionary for all three PEB lists where the # keys are base address and module objects are the values inloadorder = dict((mod.DllBase.v(), mod) for mod in task.get_load_modules()) ininitorder = dict((mod.DllBase.v(), mod) for mod in task.get_init_modules()) inmemorder = dict((mod.DllBase.v(), mod) for mod in task.get_mem_modules()) #Build a similar dictionary for the mapped files mapped_files = dict((vad.Start, name) for vad, name in self.list_mapped_files(task)) yield dict(divider=task) # For each base address with a mapped file, print info on # the other PEB lists to spot discrepancies. for base in list(mapped_files.keys()): yield dict(_EPROCESS=task, base=base, in_load=base in inloadorder, in_load_path=inloadorder.get( base, obj.NoneObject()).FullDllName, in_init=base in ininitorder, in_init_path=ininitorder.get( base, obj.NoneObject()).FullDllName, in_mem=base in inmemorder, in_mem_path=inmemorder.get( base, obj.NoneObject()).FullDllName, mapped=mapped_files[base]) Figure 13. Malfind.py lines 199-230 – PEB loaded modules list and mapped files being checked for discrepancies in Malfind. Malfind is generating dictionaries of all three of the linked lists stored in the PEB that provide lists (in different orders) of the loaded modules in the process and cross-referencing their base addresses with the base addresses of “mapped files.” Digging deeper into the list_mapped_files routine, called in the highlighted region, the logic being used for detection becomes more evident: def list_mapped_files(self, task): """Iterates over all vads and returns executable regions. Yields: vad objects which are both executable and have a file name. """ self.session.report_progress("Inspecting Pid %s", task.UniqueProcessId) for vad in task.RealVadRoot.traverse(): try: file_obj = vad.ControlArea.FilePointer protect = str(vad.u.VadFlags.ProtectionEnum) if "EXECUTE" in protect and "WRITE" in protect: yield vad, file_obj.file_name_with_drive() except AttributeError: pass Figure 14. Malfind.py lines 178-194 – Executable file mapping enumeration in Malfind. The list_mapped_files function shown in Figure 14 is looping through all of the regions of committed memory within the process (by allocation base via VAD) and checking to see whether or not they are derived from section objects that are +RWX and tied to valid file paths corresponding to a mounted filesystem. Notably, Malfind is not checking whether the memory is of a mapped or image type, only that it has a file underlying it on disk and that it is +RWX. This has the unintended side-effect of allowing an attacker to bypass this routine by using the page file as their underlying file object when allocating memory of the MEM_MAPPED type. With this logic in mind, it is clear why our unmapped DLL image triggered a detection despite not containing any malicious code: it has no corresponding entry in the PEB loaded modules list. Therefore, a bypass to this detection would be to use NTDLL.DLL!LdrLoadDll to generate image memory for DLL hollowing rather than NTDLL.DLL!NtCreateSection and NTDLL.DLL!NtMapViewOfSection. With a solid understanding of why Malfind produced the detections that it did for regions of blank memory, I next tested it against a total of eighteen different sets of artifacts wherein each allocation type was paired with each relevant stealth technique while using a PE as my implant payload: Figure 15. Malfind results from scans of PE implant artifacts. The results shown in Figure 15 above illustrate a lack of detection for all of the tested artifact variations with the exception of those relying upon image memory derived from manually mapped DLLs (which, as discussed previously, is due to their lack of an entry in the PEB loaded modules list). This is consistent with the results of the blank allocation scans shown in Figure 11; however, it should be noted that the reason the private and mapped implants have not been detected is that they were initially allocated as +RW and later changed to +RX rather than being allocated as +RWX. This same two-stage permission modification process is repeated for all tests relating to private and mapped memory throughout this text unless specified otherwise. In order to gain better visibility into the detection logic behind the private and mapped regions in these tests, I made a second series of twelve tests utilizing only private/mapped memory, this time each variation was repeated twice: once with the +RW -> +RX permission modification trick, and once with +RWX. The results were unsurprising: Figure 16. In-depth private memory artifact results from malfind. It seems that no matter what stealth (if any) is used within a private +RX region, it will never be detected by Malfind, while, in contrast, all variations of private +RWX memory containing PE implants will be detected by Malfind regardless of the stealth method chosen to hide them. The reason for this is illustrated in the snippet of Malfind source code seen in Figure 17 below. def _injection_filter(self, vad, task_as): """Detects injected vad regions. This looks for private allocations that are committed, memory-resident, non-empty (not all zeros) and with an original protection that includes write and execute. It is important to note that protections are applied at the allocation granularity (page level). Thus the original protection might not be the current protection, and it also might not apply to all pages in the VAD range. @param vad: an MMVAD object. @returns: True if the MMVAD looks like it might contain injected code. """ # Try to find injections. protect = str(vad.u.VadFlags.ProtectionEnum) write_exec = "EXECUTE" in protect and "WRITE" in protect # The Write/Execute check applies to everything if not write_exec: return False # This is a typical VirtualAlloc'd injection if ((vad.u.VadFlags.PrivateMemory == 1 and vad.Tag == "VadS") or # This is a stuxnet-style injection (vad.u.VadFlags.PrivateMemory == 0 and protect != "EXECUTE_WRITECOPY")): return not self._is_vad_empty(vad, task_as) return False Figure 17. Malfind.py lines 80-96 – +RWX memory detection in Malfind. Interestingly, on the first highlighted region Malfind is excluding any memory which is not both writable and executable from its results. Notably, because Malfind is using VADs for this filter condition, the permissions it is checking will always represent the initial allocation protections of a memory region, not necessarily their current protections (which are stored in the PTE for the underlying page, not the VAD). This means that an attacker could allocate a region with an initial protection of +RW, write their payload to it and then change it to +RWX without ever triggering a Malfind detection – even though Malfind is explicitly searching for +RWX regions. Furthermore, it explains why the RW -> RX trick used by the artifact kit bypassed all of the detections in Figure 16. As a final set of tests, ten variations of shellcode implants were generated using the artifact kit: Figure 18. Malfind results from scans of shellcode implant artifacts. These results are consistent with our previous findings in Malfind: its most robust detection capability involves finding image memory corresponding to files on disks that have no entries in the PEB loaded modules list. Whether a shellcode or PE is used for an implant appears to have no impact on its detection capabilities based on the logic observed within the Rekall variation of the plugin. The Malfind plugin within the traditional Volatility framework shares these same characteristics in common with the Rekall variation, but contains some additional filter capabilities designed to reduce false positives by attempting to classify the contents of a +RWX memory region as either a PE file or assembly byte code based on its prefix bytes. refined_criteria = >"MZ","\x55\x8B"] for task in data: for vad, address_space in task.get_vads(vad_filter = task._injection_filter): if self._is_vad_empty(vad, address_space): continue content = address_space.zread(vad.Start, 64) ifself._config.REFINED and content[0:2] not in refined_criteria: continue outfd.write("Process: {0} Pid: {1} Address: {2:#x}\n".format( task.ImageFileName, task.UniqueProcessId, vad.Start)) outfd.write("Vad Tag: {0} Protection: {1}\n".format( vad.Tag, vadinfo.PROTECT_FLAGS.get(vad.VadFlags.Protection.v(), ""))) outfd.write("Flags: {0}\n".format(str(vad.VadFlags))) outfd.write("\n") # this is for address reporting in the output data_start = vad.Start # all zeros in the first page followed by 558B at the base of # the second page is an indicator of wiped PE headers if content.count(chr(0)) == len(content): if address_space.zread(vad.Start, 0x1000).count(chr(0)) == 0x1000: next_page = address_space.zread(vad.Start + 0x1000, 64) if next_page[0:2] == "\x55\x8B": outfd.write("**** POSSIBLE WIPED PE HEADER AT BASE *****\n\n") content = next_page data_start = vad.Start + 0x1000 Figure 19. Malfind.py lines 462-495 – Volatility Malfind plugin filtering unknown +RWX regions by their first two bytes. In Figure 19 above, Malfind is using a more refined filter algorithm. As discussed in thorough detail in part two of this series, there are many +RWX regions of private and mapped memory allocated by the Windows OS itself. This results in a significant false positive issue for memory scanners, and in the source code above Malfind attempts to address this issue by trying to determine whether or not one such +RWX region contains either a shellcode or PE file based on its first two prefix bytes. In the third highlighted region, it also attempts to detect header wiping by skipping ahead 0x1000 bytes into a +RWX region which contains no MZ PE header and attempting to identify code at this offset (which would typically correspond to the .text section in an average PE). This is a clever trick Malfind uses to achieve an outcome of filtering false positives while detecting malicious implants simultaneously, even when the malware writer was prudent enough to wipe their PE implant headers. HOLLOWFIND While Malfind serves a practical role as a generic malicious memory scanner, it lacks specialization into any particular type of fileless tradecraft. In particular, it contains a significant weakness in the area of process hollowing. An alternative memory scanner, specialized into the area of process hollowing is Hollowfind. This scanner, like Malfind, is designed as a plugin for the Volatility framework and relies primarily upon VADs and other kernel objects in order to make its detections. I began my tests by generating a series of empty executable memory regions and having them scanned: Figure 20. Hollowfind is used to scan a series of blank allocations made by the artifact kit. In contrast to Malfind, Hollowfind flags both private and mapped +RWX regions as malicious even when they are empty. Similar to Malfind, the RW -> RX permission trick bypasses the generic suspicious memory region detection for MEM_PRIVATE and MEM_MAPPED regions in Hollowfind: outfd.write("Suspicious Memory Regions:\n") for vad, addr_space in proc.get_vads(): content = addr_space.read(vad.Start, 64) if content == None: continue vad_prot = str(vadinfo.PROTECT_FLAGS.get(vad.VadFlags.Protection.v())) if obj.Object("_IMAGE_DOS_HEADER", offset = vad.Start, vm = addr_space).e_magic != 0x5A4D: flag = "No PE/Possibly Code" if (vad_prot =="PAGE_EXECUTE_READWRITE"): sus_addr = vad.Start Figure 21. Malfind.py lines 275-284 – The generic non-hollowing detection in the Hollowfind source code. The source code shown in Figure 21 is part of Hollowfind’s generic (not process hollowing-specific) detection logic. In the event of a +RWX region of memory (whether it be private, mapped or image) that does not contain an MZ header, a detection will always be generated. This explains why both +RWX private/mapped regions were detected in Figure 20, despite not containing any data. It also explains why the manually mapped DLLs were not detected, since technically these regions are PAGE_EXECUTE_WRITECOPY rather than +RWX and also begin with MZ headers. Next, the artifact kit was used to generate eighteen additional variations of PE implants using different combinations of allocation types and stealth techniques. Figure 22. Hollowfind scanner results when applied to PE implants generated by the artifact kit. These results highlight a very interesting trend: there are no detections on any of the private/mapped regions (for reasons shown in Figure 21) however DLL hollowing in conjunction with header wiping is detected. Notably, normal DLL hollowing is not detected. So why would DLL hollowing be detected while using a stealth technique, while the lack of the said stealth technique provides the opposite result? if obj.Object("_IMAGE_DOS_HEADER", offset = vad.Start, vm = addr_space).e_magic != 0x5A4D: flag = "No PE/Possibly Code" if (vad_prot == "PAGE_EXECUTE_READWRITE"): sus_addr = vad.Start outfd.write("\t{0:#x}({1}) Protection: {2} Tag: {3}\n".format(vad.Start, flag, vad_prot, str(vad.Tag or ""))) if self._config.DUMP_DIR: filename = os.path.join(self._config.DUMP_DIR,"process.{0}.{1:#x}.dmp".format(hol_pid, sus_addr)) self.dump_vad(filename, vad, addr_space) elif (vad_prot =="PAGE_EXECUTE_WRITECOPY"): sus_addr = vad.Start Figure 23. Malfind.py lines 281-294 – Hollowfind source code for headerless image memory detection. In Figure 23 above, the generic (non-hollowing) suspicious memory region detection routine is revisited. In the first highlighted region, regions without MZ headers (PE files) are filtered out. However, in the second highlighted region, an initial allocation permission of PAGE_EXECUTE_WRITECOPY is used as an IOC and criteria for the detections we observed in Figure 22. PAGE_EXECUTE_WRITECOPY is an initial allocation permission that is unique to regions of image memory. This means that in theory there should never be a region with PAGE_EXECUTE_WRITECOPY permissions that does not begin with an MZ header. It is this logic that allows Hollowfind to detect our DLL hollowing in conjunction with header wiping. As a final set of tests, ten variations of shellcode implant were generated by the artifact kit and scanned with Hollowfind: Figure 24. Hollowfind scan results for shellcode implant artifact variations. The complete lack of detections for shellcode implants seen in Figure 24 is consistent with Hollowfind’s stated objective of detecting process hollowing (which typically utilizes PE implants), however there are variations of process hollowing that utilize shellcode that Hollowfind will miss based on these results. Notably, shellcode stored within +RWX regions of mapped or private memory will be detected by Hollowfind; however, due to the use of the RW -> RX permission trick by the artifact kit, no such detection is triggered. PE-SIEVE Pe-sieve is a runtime usermode memory scanner designed to identify and dump suspicious memory regions based on malware IOCs. Similar to Moneta, it relies on usermode APIs such as NTDLL.DLL!NtQueryVirtualMemory in order to do this rather than kernel mode objects such as VADs. In contrast to Moneta, it uses a variety of data analysis tricks to refine its detection criteria rather than relying exclusively upon memory attributes alone. I began my tests by scanning a series of blank dynamic code regions using the artifact kit: Figure 25. Pe-sieve is used to scan a series of blank allocations made by the artifact kit. These results are as close to a “perfect” defensive outcome as could be expected. None of these dynamic code allocations are inherently suspicious in of themselves (although, as shown previously, some scanners will mark private/mapped +RWX as suspicious regardless of its contents) with the exception of the phantom DLL load via a transacted section handle. Pe-sieve classified this region as an implant as shown in the JSON results below: { "pid" : 9052, "is_64_bit" : 0, "is_managed" : 0, "main_image_path" : "C:\\Users\\Forrest\\Documents\\GitHub\\ArtifactsKit\\ArtifactsKit\\Release\\ArtifactsKit32.exe", "scanned" : { "total" : 15, "skipped" : 0, "modified" : { "total" : 1, "patched" : 0, "iat_hooked" : 0, "replaced" : 0, "hdr_modified" : 0, "implanted_pe":1, "implanted_shc" : 0, "unreachable_file" : 0, "other" : 0 }, "errors" : 0 } Figure 26. Pe-sieve scan results for blank phantom DLL region. An explanation of the logic behind this detection can be found across several functions within pe-sieve’s code base. The region in question failed the check made by isRealMapping, a method that relies on loadMappedName that, in turn, utilizes the PSAPI.DLL!GetMappedFileNameA API. bool pesieve::MemPageData::loadMappedName() { if (!isInfoFilled() && !fillInfo()) { return false; } std::string mapped_filename = RemoteModuleData::getMappedName(this->processHandle, (HMODULE)this->alloc_base); if code (mapped_filename.length() == 0) { #ifdef _DEBUG std::cerr << "Could not retrieve name" << std::endl; #endif return false; } this->mapped_name = mapped_filename; return true; } bool pesieve::MemPageData::isRealMapping() { if (this->loadedData == nullptr && !fillInfo()) { #ifdef _DEBUG std::cerr << "Not loaded!" << std::endl; #endif return false; } if (loadMappedName()) { #ifdef _DEBUG std::cerr << "Could not retrieve name" << std::endl; #endif return false; } ... } std::string pesieve::RemoteModuleData::getMappedName(HANDLE processHandle, LPVOID modBaseAddr) { char filename[MAX_PATH] = { 0 }; if (!GetMappedFileNameA(processHandle, modBaseAddr, filename, MAX_PATH) != 0) { return ""; } std::string expanded = pesieve::util::expand_path(filename); if (expanded.length() == 0) { return filename; } return expanded; } Figure 27. Pe-sieve phantom image region detection. This is the same strategy I utilized in my own scanner, Moneta, to catch phantom DLL hollowing. It works by anticipating a failure to query the FILE_OBJECT underlying a region of image memory: a side-effect of the isolation intrinsic to transacted file handles that, in turn, underlie the image sections themselves. Notably, the fact that pe-sieve does not mark unmodified manual image section mappings as malicious demonstrates a high level of sophistication in regards to false positives. As was discussed in part two of this series, there are many existing phenomena in Windows that result in image mapping with no corresponding PEB loaded modules list entry, such as metadata files. Next, PE implants (pe-sieve’s strongest area) were scanned using every available permutation of allocation type and stealth technique in the artifacts kit for a total of eighteen variations: Figure 28. Pe-sieve scan results for PE artifacts Again, these results stand as impressive when compared to the Volatility-based scanners explored previously. Every permutation of PE implant has been detected with one notable exception: DLL hollowing of a legitimately loaded .NET DLL. Exploring the reason for this caveat in pe-sieve’s detection capabilities touches on some of the conclusions in the research I conducted with my tool Moneta in the second part of this research series. Specifically, the tendency for self-modification intrinsic to some Windows modules and .NET modules in particular. The logic responsible for this lack of detection on the part of pe-sieve can be found in headers_scanner.cpp on the pe-sieve Github page: HeadersScanReport* pesieve::HeadersScanner::scanRemote() { if (!moduleData.isInitialized() && !moduleData.loadOriginal()) { std::cerr << "[-] Module not initialized" << std::endl; return nullptr; } if (!remoteModData.isInitialized()) { std::cerr << "[-] Failed to read the module header" << std::endl; return nullptr; } HeadersScanReport *my_report = new HeadersScanReport(this->processHandle, moduleData.moduleHandle, remoteModData.getModuleSize()); BYTE hdr_buffer1[peconv::MAX_HEADER_SIZE] = { 0 }; memcpy(hdr_buffer1, remoteModData.headerBuffer, peconv::MAX_HEADER_SIZE); my_report->is64 = peconv::is64bit(hdr_buffer1); my_report->isDotNetModule = moduleData.isDotNet(); size_t hdrs_size = peconv::get_hdrs_size(hdr_buffer1); if (hdrs_size > peconv::MAX_HEADER_SIZE) { hdrs_size = peconv::MAX_HEADER_SIZE; } BYTE hdr_buffer2[peconv::MAX_HEADER_SIZE] = { 0 }; memcpy(hdr_buffer2, moduleData.original_module, hdrs_size); // some .NET modules overwrite their own headers, so at this point they should be excluded from the comparison DWORD ep1 = peconv::get_entry_point_rva(hdr_buffer1); DWORD ep2 = peconv::get_entry_point_rva(hdr_buffer2); if (ep1 != ep2) { my_report->epModified = true; } DWORD arch1 = peconv::get_nt_hdr_architecture(hdr_buffer1); DWORD arch2 = peconv::get_nt_hdr_architecture(hdr_buffer2); if (arch1 != arch2) { // this often happend in .NET modules //if there is an architecture mismatch it may indicate that a different version of the app was loaded (possibly legit) my_report->archMismatch = true; } //normalize before comparing: peconv::update_image_base(hdr_buffer1, 0); peconv::update_image_base(hdr_buffer2, 0); zeroUnusedFields(hdr_buffer1, hdrs_size); zeroUnusedFields(hdr_buffer2, hdrs_size); //compare: if (memcmp(hdr_buffer1, hdr_buffer2, hdrs_size) == 0) { my_report->status = SCAN_NOT_SUSPICIOUS; return my_report; } //modifications detected, now find more details: my_report->dosHdrModified = isDosHdrModified(hdr_buffer1, hdr_buffer2, hdrs_size); my_report->fileHdrModified = isFileHdrModified(hdr_buffer1, hdr_buffer2, hdrs_size); my_report->ntHdrModified = isNtHdrModified(hdr_buffer1, hdr_buffer2, hdrs_size); my_report->secHdrModified = isSecHdrModified(hdr_buffer1, hdr_buffer2, hdrs_size); ifcode (moduleData.isDotNet()) { #ifdef _DEBUG std::cout << "[#] .NET module detected as SUSPICIOUS\n"; #endif if (!my_report->isHdrReplaced() && (my_report->archMismatch && my_report->epModified) ) { //.NET modules may overwrite some parts of their own headers #ifdef _DEBUG std::cout << "[#] Filtered out modifications typical for .NET files, setting as not suspicious\n"; #endif my_report->status = SCAN_NOT_SUSPICIOUS; return my_report; } } my_report->status = SCAN_SUSPICIOUS; return my_report; } Figure 29. Pe-sieve header scanner logic ignoring .NET modules. Sure enough, the highlighted regions in the code in Figure 29 above illustrate that Hasherazade (the author of pe-sieve) has whitelisted .NET modules from certain detection criteria. In the first highlighted region, she states the reason for this: “some .NET modules overwrite their own headers.” Those who have read the second part in my memory forensics series will already be familiar with the phenomena she is alluding to in this comment. This particular function in pe-sieve is responsible for detecting discrepancies between the PE headers of regions of image memory and their underlying files on disk: a method which would be highly effective for detecting full overwrite DLL hollowing, but which would be bypassed using the technique of header mirroring shown in Figure 4. A further example of .NET module exemption from detection criteria can be seen in workingset_scanner.cpp. bool pesieve::WorkingSetScanner::scanImg() { const bool show_info = (!args.quiet); if (!memPage.loadMappedName()) { //cannot retrieve the mapped name return false; } const HMODULE module_start = (HMODULE)memPage.alloc_base; if (show_info) { std::cout << "[!] Scanning detached: " << std::hex << module_start << " : " << memPage.mapped_name << std::endl; } RemoteModuleData remoteModData(this->processHandle, module_start); if (!remoteModData.isInitialized()) { if (show_info) { std::cout << "[-] Could not read the remote PE at: " << std::hex << module_start << std::endl; } return false; } //load module from file: ModuleData modData(processHandle, module_start, memPage.mapped_name); const t_scan_status status = ProcessScanner::scanForHollows(processHandle, modData, remoteModData, processReport); #ifdef _DEBUG std::cout << "[*] Scanned for hollows. Status: " << status << std::endl; #endif if (status == SCAN_ERROR) { //failed scanning it as a loaded PE module return false; } if (status == SCAN_NOT_SUSPICIOUS) { if (modData.isDotNet()) { #ifdef _DEBUG std::cout <<"[*] Skipping a .NET module: " << modData.szModName << std::endl; #endif processReport.appendReport(new SkippedModuleReport(processHandle, modData.moduleHandle, modData.original_size, modData.szModName)); return true; } if (!args.no_hooks) { const t_scan_status hooks_stat = ProcessScanner::scanForHooks(processHandle, modData, remoteModData, processReport); #ifdef _DEBUG std::cout << "[*] Scanned for hooks. Status: " << hooks_stat << std::endl; #endif } } return true; } Figure 30. Pe-sieve working set scanner logic ignoring .NET modules. The code shown above in Figure 30 is what allows pe-sieve to detect DLL hollowing. By checking for private pages of memory corresponding to sensitive portions of a mapped image using the working set, pe-sieve is able to detect every variation of PE implant combined with DLL hollowing generated by the artifact kit, with the aforementioned exception of .NET modules. Yet again, the highlighted regions in Figure 30 illustrate how .NET modules are whitelisted from certain aspects of working set scans, a decision which allows my PE implant within a hollowed .NET module to go undetected. A final series of tests were conducted using ten variations of shellcode implant: Figure 31. Pe-sieve scanner results for shellcode implants. While the cause for the lack of detection of shellcode implants within .NET modules is simple to understand (these would also bypass the scanForHooks routine in the working set scanner) the lack of detection for MEM_PRIVATE and MEM_MAPPED regions in Figure 31 is particularly interesting. Keep in mind, that pe-sieve was highly effective at detecting PE implants within private and mapped memory (Figure 28 demonstrated this) even when techniques such as header wiping and even moating were applied. Therefore, it is not the case that Hasherazade was unaware of the suspicious nature of such memory when designing pe-sieve, but rather that she deemed the false positive potential of flagging executable private/mapped regions too high to be worth the risk without sufficient evidence. In this case, she relies upon additional IOC within such regions to indicate the presence of a PE before triggering a detection. Impressively, this is something she is able to do even when there is no PE header and the .text section cannot be found at a reliable offset. This is a strategy in stark contrast to my own tool Moneta, which avoids all explicit data analysis and instead relies upon other clues within a process to indicate a just cause for the presence of such dynamic code regions (for example +RWX private regions created as .NET heaps by the CLR). Detection for such shellcode implants within private and mapped memory appear to be the only significant blind spot in pe-sieve. LAST THOUGHTS As I stated in the conclusion to part two of this series, the phenomena I observed through use of Moneta has led me to the belief that fileless malware utilizing dynamic code cannot be reliably detected without bytescan signatures unless substantial efforts are taken by an advanced defender to perfectly profile and filter the false positives inherent to the Windows OS and common third party applications. My findings throughout this text, while testing existing defensive scanners, are consistent with this theory. The Volatility-based plugins were exceptionally outdated and as shown here are trivially simple to bypass. Pe-sieve is considerably more sophisticated but has clear weak points in areas prone to false positives. This basic reality will have enduring consequences for the detection of fileless malware. Defenders are at a considerable disadvantage in this area while attackers need only educate themselves on the basics of memory stealth tradecraft in order to put themselves outside the reach of detection. * Share this! * Facebook * Twitter * Email * LinkedIn PREVIOUS ARTICLE Using Kubelet Client to Attack the Kubernetes Cluster In this blog post, we are going to look at the Kubernetes agent, kubelet (see Figure 1), which is responsib... NEXT ARTICLE DIY: Hunting Azure Shadow Admins Like Never Before TL;DR Cloud technologies are ubiquitous and most organizations rely on cloud vendors to provide them with c... Gartner Names CyberArk a Leader in the 2021 Magic Quadrant for PAM Download Now RECOMMENDED FOR YOU * ‹ * › 9 days ago Cloud Shadow Admins Revisited in Light of Nobelium A RECENTLY DETECTED ATTACK CAMPAIGN INVOLVING THREAT ACTOR NOBELIUM HAS CAUGHT OUR ATTENTION DUE TO AN ATTACK VECTOR OUR TEAM HAS PREVIOUSLY RESEARCHED – CLOUD SHADOW ADMINS – THAT THE ADVERSARY... A RECENTLY DETECTED ATTACK CAMPAIGN INVOLVING THREAT ACTOR NOBELIUM HAS CAUGHT OUR ATTENTION DUE TO AN ATTACK VECTOR OUR TEAM HAS PREVIOUSLY RESE... Read Article 17 days ago Cracking WiFi at Scale with One Simple Trick HOW I CRACKED 70% OF TEL AVIV’S WIFI NETWORKS (FROM A SAMPLE OF 5,000 GATHERED WIFI). IN THE PAST SEVEN YEARS THAT I’VE LIVED IN TEL AVIV, I’VE CHANGED APARTMENTS FOUR TIMES. EVERY TIME I... HOW I CRACKED 70% OF TEL AVIV’S WIFI NETWORKS (FROM A SAMPLE OF 5,000 GATHERED WIFI). IN THE PAST SEVEN YEARS THAT I’VE LIVED IN TEL AVIV, I’VE CHANGED APARTMENTS FOUR... Read Blog 3 months ago Fuzzing RDP: Holding the Stick at Both Ends INTRODUCTION THIS POST DESCRIBES THE WORK WE’VE DONE ON FUZZING THE WINDOWS RDP CLIENT AND SERVER, THE CHALLENGES OF DOING SO, AND SOME OF THE RESULTS. THE REMOTE DESKTOP PROTOCOL (RDP) BY... INTRODUCTION THIS POST DESCRIBES THE WORK WE’VE DONE ON FUZZING THE WINDOWS RDP CLIENT AND SERVER, THE CHALLENGES OF DOING SO, AND SOME OF THE RESULTS. THE REMOTE DESKT... Read Blog 4 months ago FickerStealer: A New Rust Player in the Market THIS BLOG INTRODUCES A NEW INFORMATION STEALER, WRITTEN IN RUST AND INTERESTINGLY NAMED FICKERSTEALER. IN THIS BLOG POST, WE PROVIDE AN IN-DEPTH ANALYSIS OF THIS NEW THREAT AND ITS OBFUSCATION... THIS BLOG INTRODUCES A NEW INFORMATION STEALER, WRITTEN IN RUST AND INTERESTINGLY NAMED FICKERSTEALER. IN THIS BLOG POST, WE PROVIDE AN IN-DEPTH... Read Blog 4 months ago Bypassing Windows Hello Without Masks or Plastic Surgery BIOMETRIC AUTHENTICATION IS BEGINNING TO SEE RAPID ADOPTION ACROSS THE ENTERPRISE AS ORGANIZATIONS LOOK TO INCORPORATE PASSWORDLESS SOLUTIONS TO HELP MITIGATE THE NUMEROUS SECURITY RISKS INHERENT... BIOMETRIC AUTHENTICATION IS BEGINNING TO SEE RAPID ADOPTION ACROSS THE ENTERPRISE AS ORGANIZATIONS LOOK TO INCORPORATE PASSWORDLESS SOLUTIONS TO... Read Blog 5 months ago Best Defense? Our Red Team Lead Reveals 4 MFA Bypass Techniques DIGITAL TRANSFORMATION, WIDESPREAD REMOTE WORK DUE TO THE COVID-19 PANDEMIC AND EVER-INCREASING RELIANCE ON CLOUD SERVICES AND INFRASTRUCTURE HAVE ALL CONTRIBUTED TO NEW ENTERPRISE ACCESS... DIGITAL TRANSFORMATION, WIDESPREAD REMOTE WORK DUE TO THE COVID-19 PANDEMIC AND EVER-INCREASING RELIANCE ON CLOUD SERVICES... Read Blog 6 months ago Attacking Kubernetes Clusters Through Your Network Plumbing: Part 2 IN PART 1 OF THIS BLOG POST, WE DISCUSSED ATTACK VECTORS THAT UTILIZE THE DIFFERENT FEATURES OF THE DEVICES THAT NETWORK PLUGINS USE, SUCH AS BRIDGE DEVICES AND TUNNELING DEVICES (VXLAN IN... IN PART 1 OF THIS BLOG POST, WE DISCUSSED ATTACK VECTORS THAT UTILIZE THE DIFFERENT FEATURES OF THE DEVICES THAT NETWORK P... Read Blog 6 months ago Virtual Cloak: Virtualization as Malware VIRTUALIZATION IS A DOUBLE-EDGED SWORD THE GLORIOUS RISE OF THE CLOUD IN RECENT YEARS COULD BE ATTRIBUTED TO THE GRADUAL ADVANCEMENT OF MANY DIFFERENT TECHNOLOGIES, BOTH HARDWARE AND SOFTWARE... VIRTUALIZATION IS A DOUBLE-EDGED SWORD THE GLORIOUS RISE OF THE CLOUD IN RECENT YEARS COULD BE ATTRIBUTED TO THE GRADUAL ADVANCEMENT OF MANY DIFF... Read Blog 7 months ago Kubesploit: A New Offensive Tool for Testing Containerized Environments IN THIS BLOG POST, WE WILL INTRODUCE A NEW OPEN-SOURCE TOOL WE DEVELOPED, NAMED KUBESPLOIT, FOR TESTING KUBERNETES ENVIRONMENTS. THIS IS A FULL FRAMEWORK, DEDICATED TO KUBERNETES, TO ASSIST... IN THIS BLOG POST, WE WILL INTRODUCE A NEW OPEN-SOURCE TOOL WE DEVELOPED, NAMED KUBESPLOIT, FOR TESTING KUBERNETES ENVIRON... Read Blog 8 months ago The Mysterious Realm of JavaScriptCore TL;DR JAVASCRIPTCORE (JSC) IS THE JAVASCRIPT ENGINE USED BY SAFARI, MAIL, APP STORE AND MANY OTHER APPS IN MACOS. THE JSC ENGINE IS RESPONSIBLE FOR EXECUTING EVERY LINE OF JAVASCRIPT (JS) THAT... TL;DR JAVASCRIPTCORE (JSC) IS THE JAVASCRIPT ENGINE USED BY SAFARI, MAIL, APP STORE AND MANY OTHER APPS IN MACOS. THE JSC ENGINE IS RESPONSIBLE FOR EXECUTING EVERY LINE... Read Blog 8 months ago Kinsing: The Malware with Two Faces LATELY, WE’VE BEEN BUSY RESEARCHING THE DEVELOPING FIELD OF CLOUD AND CONTAINER THREATS. WHY FOCUS HERE? BECAUSE, AS THIS TECHNOLOGY BECOMES MORE POPULAR AND CONTINUES TO EVOLVE, ATTACKERS ARE... LATELY, WE’VE BEEN BUSY RESEARCHING THE DEVELOPING FIELD OF CLOUD AND CONTAINER THREATS. WHY FOCUS HERE? BECAUSE, AS THIS TECHNOLOGY BECOMES MORE POPULAR AND CONTINUES... Read Blog 8 months ago The Strange Case of How We Escaped the Docker Default Container TL;DR DURING AN INTERNAL CONTAINER-BASED RED TEAM ENGAGEMENT, THE DOCKER DEFAULT CONTAINER SPONTANEOUSLY AND SILENTLY CHANGED CGROUPS OVERNIGHT, WHICH ALLOWED US TO ESCALATE PRIVILEGES AND GAIN... TL;DR DURING AN INTERNAL CONTAINER-BASED RED TEAM ENGAGEMENT, THE DOCKER DEFAULT CONTAINER SPONTANEOUSLY AND SILENTLY CHAN... Read Blog 9 months ago Hunting Azure Blobs Exposes Millions of Sensitive Files WE HEAR ABOUT IT ALL THE TIME – DATA BREACHES THAT EXPOSE A COMPANY’S SENSITIVE INFORMATION. NEARLY ALL OF US HAVE BEEN WARNED THAT OUR PASSWORDS, EMAIL ADDRESSES OR EVEN CREDIT CARDS HAVE... WE HEAR ABOUT IT ALL THE TIME – DATA BREACHES THAT EXPOSE A COMPANY’S SENSITIVE INFORMATION. NEARLY ALL OF US HAVE BEEN WARNED THAT OUR PASSWORDS... Read Blog 10 months ago Meet Oski Stealer: An In-depth Analysis of the Popular Credential Stealer MEET OSKI STEALER: AN IN-DEPTH ANALYSIS OF THE POPULAR CREDENTIAL STEALER CREDENTIAL THEFT MALWARE CONTINUES TO BE ONE OF THE MOST PREVALENT TYPES OF MALWARE USED IN CYBER ATTACKS. THE MAIN... MEET OSKI STEALER: AN IN-DEPTH ANALYSIS OF THE POPULAR CREDENTIAL STEALER CREDENTIAL THEFT MALWARE CONTINUES TO BE ONE OF... Read Blog 11 months ago Golden SAML Revisited: The Solorigate Connection IN THE PAST FEW WEEKS, WE’VE BEEN WITNESSING ONE OF THE MOST ELABORATE SUPPLY-CHAIN ATTACKS UNFOLD WITH A THREAT ACTOR THAT INFECTED SOLARWINDS ORION SOURCE CODE AND USED THE UPDATE PROCESS TO GET... IN THE PAST FEW WEEKS, WE’VE BEEN WITNESSING ONE OF THE MOST ELABORATE SUPPLY-CHAIN ATTACKS UNFOLD WITH A THREAT ACTOR THAT INFECTED SOLARWINDS O... Read Blog 11 months ago Accessing and Dumping Firmware Through UART INTRODUCTION IN THE FIRST PART OF MY HARDWARE HACKING SERIES, WE DISCUSSED DUMPING FIRMWARE THROUGH THE SPI FLASH CHIP. IN THIS POST, WE WILL REVIEW THE PROCESS OF ACCESSING AND DUMPING THE... INTRODUCTION IN THE FIRST PART OF MY HARDWARE HACKING SERIES, WE DISCUSSED DUMPING FIRMWARE THROUGH THE SPI FLASH CHIP. IN THIS POST, WE WILL REV... Read Blog 11 months ago A Modern Exploration of Windows Memory Corruption Exploits – Part I: Stack Overflows INTRODUCTION THE TOPIC OF MEMORY CORRUPTION EXPLOITS CAN BE A DIFFICULT ONE TO INITIALLY BREAK IN TO. WHEN I FIRST BEGAN TO EXPLORE THIS TOPIC ON THE WINDOWS OS I WAS IMMEDIATELY STRUCK BY THE... INTRODUCTION THE TOPIC OF MEMORY CORRUPTION EXPLOITS CAN BE A DIFFICULT ONE TO INITIALLY BREAK IN TO. WHEN I FIRST BEGAN T... Read Blog about a year ago Intel, Please Stop Assisting Me THIS POST FOCUSES ON TWO VULNERABILITIES THE CYBERARK LABS TEAM UNCOVERED IN THE INTEL SUPPORT ASSISTANT THAT AFFECTED THE MILLIONS OF WINDOWS MACHINES THAT RUN THIS SOFTWARE. THE FIRST... THIS POST FOCUSES ON TWO VULNERABILITIES THE CYBERARK LABS TEAM UNCOVERED IN THE INTEL SUPPORT ASSISTANT THAT AFFECTED THE MILLIONS OF WINDOWS MACHINES THAT RUN THIS SO... Read Blog about a year ago Attacking Kubernetes Clusters Through Your Network Plumbing: Part 1 HAVE YOU EVER WONDERED HOW THE WATER SUPPLY GETS INTO YOUR HOME AND TO THE TAPS? HONESTLY IT MAY NOT BE SOMETHING YOU EVER THOUGHT ABOUT. WHEN RECEIVING A SYSTEM THAT WORKS “OUT OF THE... HAVE YOU EVER WONDERED HOW THE WATER SUPPLY GETS INTO YOUR HOME AND TO THE TAPS? HONESTLY IT MAY NOT BE SOMETHING YOU EVER... Read Blog about a year ago LoRaWAN & MQTT: What to Know When Securing Your IoT Network THE LORAWAN PROTOCOL WIRELESSLY CONNECTS BATTERY-POWERED DEVICES TO THE INTERNET. BECAUSE OF ITS ABILITY TO COMMUNICATE LONG-RANGE WITH LITTLE BATTERY CONSUMPTION, IT IS LIKELY TO BE THE NETWORK... THE LORAWAN PROTOCOL WIRELESSLY CONNECTS BATTERY-POWERED DEVICES TO THE INTERNET. BECAUSE OF ITS ABILITY TO COMMUNICATE LO... Read Blog Return to Home © CyberArk Software Inc × Resource Center * Home * Products & Services * Privilege On Premises * CyberArk Identity * Cloud Entitlements Manager * Vendor Privileged Access Manager * Conjur Secrets Manager Enterprise * Endpoint Privilege Manager * CyberArk Privilege Cloud * Assessment Tools * Services & Support * Topics * Automate Privileged Tasks * Best Practices for Privileged Access Management * Meet Audit and Compliance * Mitigate Risk With Just-in-Time and Least Privilege * Remove Local Admin Rights on Workstations * Secure Application Credentials * Secure Cloud Environments * Secure DevOps Pipelines and Cloud Native Apps * Secure Human Privileged Access * Secure RPA Workloads * Secure Third-Party Vendor and Remote Access * Secure Workforce Access * Threat Research * Industry * Financial Services & Insurance * Healthcare * Public Sector & Government * Content Type * Analyst Reports & Research * Blog Posts * Case Studies * eBooks * Infographics * On-Demand Events & Webinars * Product Announcements * Product Datasheets * Solution Briefs * Videos * Whitepapers * Customer Stories * Share this Hub * Facebook * Twitter * Email * LinkedIn × * STAY IN TOUCH Keep up to date on security best practices, events and webinars. Tell Me How Careers Contact Support * Support * Contact Support * Training & Certification * Customer Support * EPM SaaS Register / Login * Product Security * Resources * Resource Center * Blogs * CyberArk Blueprint * Scan Your Network * Marketplace * Partners * Partner Network * Partner Community * Partner Finder * Become a Partner * Alliance Partner * Company * Investor Relations * Management Team * Board of Directors * Newsroom * Office Locations * Corporate Responsibility Copyright © 2021 CyberArk Software Ltd. All rights reserved. * FOLLOW US * * * * * * Terms and Conditions * Privacy Policy * Cookie Preferences Cookie Preferences By continuing to use this website, you consent to our use of cookies. For more information, please read our cookie policy. To review cookie preferences, please view settings. Proceed View Settings Read our Cookie Policy