Configuring a Windows Domain to Dynamically Analyze an Obfuscated Lateral Movement Tool

Read the original article: Configuring a Windows Domain to Dynamically Analyze an Obfuscated
Lateral Movement Tool


We recently encountered a large obfuscated malware sample that
offered several interesting analysis challenges. It used
virtualization that prevented us from producing a fully-deobfuscated
memory dump for static analysis. Statically analyzing a large
virtualized sample can take anywhere from several days to several
weeks. Bypassing this time-consuming step presented an opportunity for
collaboration between the FLARE reverse engineering team and the
Mandiant consulting team which ultimately saved many hours of
difficult reverse engineering.

We suspected the sample to be a lateral movement tool, so we needed
an appropriate environment for dynamic analysis. Configuring the
environment proved to be essential, and we want to empower other
analysts who encounter samples that leverage a domain. Here we will
explain the process of setting up a virtualized Windows domain to run
the malware, as well as the analysis techniques we used to confirm
some of the malware functionality.

Preliminary Analysis

When analyzing a new malware sample, we begin with basic static
analysis, where we can often get an idea of what type of sample it is
and what it’s capabilities might be. We can use this to inform the
subsequent stages of the analysis process and focus on the relevant
data. We begin with a Portable Executable analysis tool such as CFF
Explorer. In this case, we found that the sample is quite large at
6.64 MB. This usually indicates that the sample includes statically
linked libraries such as Boost or OpenSSL, which can make analysis difficult.

Additionally, we noticed that the import table includes eight
dynamically linked DLLs with only one imported function each as shown
in Figure 1. This is a common technique used by packers and
obfuscators to import DLLs that can later be used for runtime linking,
without exposing the actual APIs used by the malware.



Figure 1: Suspicious imports

Our strings analysis confirmed our suspicion that the malware would
be difficult to analyze statically. Because the file is so large,
there were over 75,000 strings to consider. We used StringSifter to
rank the strings according to relevance to malware analysis, but we
did not identify anything useful. Figure 2 shows the most relevant
strings according to StringSifter.



Figure 2: StringSifter output

When we encounter these types of obstacles, we can often turn to
dynamic analysis to reveal the malware’s behavior. In this case, our
basic dynamic analysis provided hope. Upon execution the sample
printed a usage statement:

Usage: evil.exe [/P:str] [/S[:str]]
[/B:str] [/F:str] [/C] [/L:str] [/H:str] [/T:int] [/E:int]
[/R]
   /P:str — path to payload file.
 
 /S[:str] — share for reverse copy.
   /B:str — path
to file to load settings from.
   /F:str — write log
to specified file.
   /C — write log to console.
   /L:str — path to file with host list.
   /H:str —
host name to process.
   /T:int — maximum number of
concurrent threads.
   /E:int — number of seconds to
delay before payload deletion (set to 0 to avoid
remove).
   /R — remove payload from hosts (/P and /S
will be ignored).
If /S specifed without value, random
name will be used.
/L and /H can be combined and
specified more than once. At least one must present.
/B
will be processed after all other flags and will override any
specified values (if any).
All parameters are case
sensetive.

Figure 3: Usage statement

We attempted to unpack the sample by suspending the process and
dumping the memory. This proved difficult as the malware exited almost
instantly and deleted itself. We eventually managed to produce a
partially-unpacked memory dump by using the commands in Figure 4.

sleep 2 && evil.exe
/P:"C:\Windows\System32\calc.exe" /E:1000 /F:log.txt
/H:some_host

Figure 4: Commands executed to run binary

We chose an arbitrary payload file and a large interval for payload
deletion. We also provided a log filename and a hostname for payload
execution. These parameters were designed to force a slower execution
time so we could suspend the process before it terminated.

We used Process
Dump
to produce a memory snapshot after the two second delay.
Unfortunately, virtualization still hindered static analysis and our
sample remained mostly obfuscated, but we did manage to extract some
strings which provided the breakthrough we needed.

Figure 5 shows some of the interesting strings we encountered that
were not present in the original binary.

dumpedswaqp.exe
psxexesvc
schtasks.exe /create /tn "%s" /tr "%s" /s
"%s" /sc onstart /ru system /f
schtasks.exe
/run /tn "%s" /s "%s"
schtasks.exe
/delete /tn "%s" /s "%s" /f
ServicesActive
Payload direct-copied
Payload
reverse-copied
Payload removed
Task
created
Task executed
Task deleted
SM
opened
Service created
Service started
Service stopped
Service removed
Total hosts: %d,
Threads: %d
SHARE_%c%c%c%c
Share "%s"
created, path "%s"
Share "%s"
removed
Error at hooking API "%S"
Dumping first %d bytes:
DllRegisterServer
DllInstall
register
install

Figure 5: Strings output from memory dump

Based on the analysis thus far, we suspected remote system access.
However, we were unable to confirm our suspicions without providing an
environment for lateral movement. To expedite analysis, we created a
virtualized Windows domain.

This requires some configuration, so we have documented the process
here to aid others when using this analysis technique.

Building a Test Environment

In the test environment, make sure to have clean Windows 10 and
Windows Server 2016 (Desktop Experience) virtual machines installed.
We recommend creating two Windows Server 2016 machines so the Domain
Controller can be separated from the other test systems.

In VMware Virtual Network Editor on the host system, create a custom
network with the following settings:

  • Under VMNet Information, select the “Host-only” radio
    button.
  • Ensure that “Connect a host virtual adapter” is
    disabled to prevent connection to the outside world.
  • Ensure
    that the “Use local DHCP service” option is disabled if static IP
    addresses will be used.

This is demonstrated in Figure 6.



Figure 6: Virtual network adapter configuration

Then, configure the guests’ network adapters to connect to this network.

  • Configure hostnames and static IP addresses for the virtual
    machines.
  • Choose the domain controller IP as the default
    gateway and DNS server for all guests. 

We used the system configurations shown in Figure 7.



Figure 7: Example system configurations

Once everything is configured, begin by installing Active Directory
Domain Services and DNS Server roles onto the designated domain
controller server. This can be done by selecting the options shown in
Figure 8 via the Windows Server Manager application. The default
settings can be used throughout the dialog as roles are added.



Figure 8: Roles needed on domain controller

Once the roles are installed, run the promotion operation as
demonstrated in Figure 9. The promotion option is accessible through
the notifications menu (flag icon) once the Active Directory Domain
Services role is added to the server. Add a new forest with a fully
qualified root domain name such as testdomain.local. Other
options may be left as default. Once the promotion process is
complete, reboot the system.



Figure 9: Promoting system to domain
controller in Server Manager

Once the domain controller is promoted, create a test user account
via Active Directory Users and Computers on the domain
controller. An example is shown in Figure 10.



Figure 10: Test user account

Once the test account is created, proceed to join the other systems
on the virtual network to the domain. This can be done through
Advanced System Settings as shown in Figure 11. Use the test account
credentials to join the system to the domain.



Figure 11: Configure the domain name for
each guest

Once all systems are joined to the domain, verify that each system
can ping the other systems. We recommend disabling the Windows
Firewall in the test environment to ensure that each system can access
all available services of another system in the test environment.

Give the test account administrative rights on all test systems.
This can be done by modifying the local administrator group on each
system manually with the command shown in Figure 12 or automated
through a Group
Policy Object (GPO)
.

net localgroup administrators sa_jdoe
/ADD

Figure 12: Command to add user to local
administrators group

Dynamic Analysis on the Domain

At this point, we were ready to begin our dynamic analysis. We
prepared our test environment by installing and launching Wireshark
and Process Monitor. We took snapshots of all three guests and ran the
malware in the context of the test domain account on the client as
shown in Figure 13.

evil.exe
/P:"C:\Windows\System32\calc.exe" /L:hostnames.txt
/F:log.txt /S /C

Figure 13: Command used to run the malware

We populated the hostnames.txt file with the following
line-delimited hostnames as demonstrated in Figure 14.

DBPROD.testdomain.local
client.testdomain.local
DC.testdomain.local

Figure 14: File contents of hostnames.txt

Packet Capture Analysis

Upon analyzing the traffic in the packet capture, we identified SMB
connections to each system in the host list. Before the SMB handshake
completed, Kerberos tickets were requested. A ticket granting ticket
(TGT) was requested for the user, and service tickets were requested
for each server as seen in Figure 15. To learn more about the Kerberos
authentication protocol, please see our
recent blog
post that introduces the protocol along with a new
Mandiant Red Team tool.



Figure 15: Kerberos authentication process

The malware accessed the C$ share over SMB and wrote the file
C:\Windows\swaqp.exe. It then used RPC to launch SVCCTL,
which is used to register and launch services. SVCCTL created
the swaqpd service. The service was used to execute the payload
and then was subsequently deleted. Finally, the file was deleted, and
no additional activity was observed. The traffic is shown in Figure 16.



Figure 16: Malware behavior observed in
packet capture

Our analysis of the malware behavior with Process Monitor confirmed
this observation. We then proceeded to run the malware with different
command line options and environments. Combined with our static
analysis, we were able to determine with confidence the malware
capabilities, which include copying a payload to a remote host,
installing and running a service, and deleting the evidence afterward.

Conclusion

Static analysis of a large, obfuscated sample can take dozens of
hours. Dynamic analysis can provide an alternate solution, but it
requires the analyst to predict and simulate a proper execution
environment. In this case we were able to combine our basic analysis
fundamentals with a virtualized Windows domain to get the job done. We
leveraged the diverse skills available to FireEye by combining FLARE
reverse engineering expertise with Mandiant consulting and Red Team
experience. This combination reduced analysis time to several hours.
We supported an active incident response investigation by quickly
extracting the necessary indicators from the compromised host. We hope
that sharing this experience can assist others in building their own
environment for lateral movement analysis.


Read the original article: Configuring a Windows Domain to Dynamically Analyze an Obfuscated
Lateral Movement Tool