Monday, October 16, 2017

Finding and Decoding Malicious PowerShell Scripts


PowerShell. It's everywhere. I've started coming across more and more malicious PowerShell scripts.
Why do attackers love using PowerShell? Because it's native to many versions of Windows, provides full access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WMI and .Net Framework and can execute malicious code in memory cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby evading AV. Oh yeah - did I mention a lack of logging too?

During cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 course of my analysis on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se types of cases, I have found several indications that PowerShell has been utilized by an attacker. These include installed services, registry entries and PowerShell scripts on disk. If logging is enabled, that can provide some nice artifacts as well. The perspective of my post is going to be from that of an analyst that may not be too familiar with PowerShell. I am going to discuss how I locate malicious PowerShell artifacts during my analysis, as well as some methods I use to decode obfuscated PowerShell scripts. This will be Part 1 in a 3 part series written over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next few weeks.

Part 1: PowerShell Scripts Installed as Services
First up to bat is my favorite - PowerShell scripts that I find as installed services in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 System event log. To find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se, one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first things I do is look for Event ID 7045. This event occurs when a service is installed on a system.  An example of a PowerShell script installed as a service is shown below:



Of note are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following red flags:

1) Random Service Name
2) The Service File Name has "%COMSPEC%", which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 environment variable for cmd.exe
3) A reference to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 powershell executable
4) Base 64 encoded data

So how might an entry like this make its way into an event log? While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are various ways to do this, one method would be to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 built in Windows Service Control Manger to create a service:

sc.exe create MyService binPath=%COMSPEC% powershell.exe -nop -w hidden -encodedcommand

sc start MyService

The above commands create a service named "MyService" and uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binPath=  option to launch cmd.exe which in turns executes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PowerShell code.  

An interesting thing to note - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re may be some failed errors logged after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 service is created in this manner. The errors do not mean that it was unsuccessful. Windows was just expecting a "real" service binary to be installed and "times out" waiting for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "service" to report back. How do I know this? In my testing I was able to set up a successful reverse shell using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above methodology, which generated a failed service error on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows machine. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left is a Metaspolit session I started on an attack virtual machine. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right is a Windows 7 host virtual machine. Although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows 7 machine states "The service did not respond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start or control request in a timely fashion," a reverse shell was still opened in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Metatsploit session:



Below are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two corresponding event log entries, 7000 and 7009, made in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 System event log. Although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 7009 message states "The FakeDriver service failed to start.." this does not mean that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binPath variable did not execute successfully. So beware, interpreting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se as in indication that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PowerShell did not execute may be false:




The 7045 System event log PoweShell command is encoded in base64 and python can be used to decode it. Interesting note - this base64 code is in Unicode, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re will be extra parameter specified when decoding it. (For display reasons I have truncated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base64 text - you would need to include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full base64 text to decode it):

import base64
code="JABjACAAPQAgAEAAIgAKAFsARABsAGwASQBtAHAA...."
base64.b64decode(code).decode('UTF16')

Here is what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoded PowerShell command looks like. A quick sweep of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code reveals some telling signs - references to creating a Net Socket with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCP protocol and an IP address:


This is similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type of code that Meterpreter uses to set up a reverse shell. The above PowerShell code was pretty easy to decode, however, it's usually more involved.

Next up is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r example - this time its just "regular" base64. Note again cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 %COMSPEC% variable and reference to powershell.exe:


Again, Python can be used to decode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base64 encoded PowerShell:
 


This time, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoded output is less than helpful. If we go back and take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 System event log entry more closely, we can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are references to "Gzip" and "Decompress":


Ahh.. so thinking in reverse, this data may have been compressed with Gzip cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n encoded using base64. Using python, I am going to write out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoded base64 into a file so I can try unzipping it:

import base64
code="H4sICCSPh1kCADEAT..."
decoded=base64.b64decode(code)
f=open("decoded.gzip",'wb')
f.write(decoded)
f.close

Using 7zip I am successfully able to unpack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gzip file! Since I did not get any errors, I may be on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right track:



Now if I open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unzipped file with a text editor, hopefully I will see some PowerShell code:



Ahh..what??? Ok - time to take a peek in a hex editor:


Not much help eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. I am thinking this may be shellcode. As a next step, I am going to run it through PDF Stream Dumper's shellcode analysis tool, scdbg.exe:



Ta-Da! scdbg.exe was able to pull out some IOCs for me from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode.

To summarize, here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps I took took to decode this PowerShell entry:
  • Decoded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base64 PowerShell string
  • Wrote out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoded base64 to a zip file
  • Decompressed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gzip file using 7zip
  • Ran cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary output through scdbg.exe
As demonstrated above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can be several layers to get though before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 golds strikes.

One final example:


This looks familiar. First step, decoding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Unicode base64 gives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following result - which contains more base64 code inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base64 code! :


Obfuscated, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n obfuscated again with compression. This is very typical to what I have seen in cases. This time because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no reference to "gzip" in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compression text, I am just going to save cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second round of base64 to a regular zip file and try to open again with 7zip:

decoded2="nVPvT9swEP2ev+IUR...."
f=open("decoded2.zip,"wb")
f.write(base64.b64decode(decoded2)
f.close()

When trying to open up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zipped file with 7Zip I get an error:


And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 built in Window's utility:


I also tried various python libraries to unzip cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compressed file. After some research, I discovered that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compression used is related to some .Net libraries. Now, since I am a python gal, I wanted to figure out how to decompress this using Python so I could easily implement it into my scripting. Since Python is cross compatible with Linux, Windows and Mac, .Net is not native to its core. As such, I used Iron Python to do my bidding. (Now yes, you could absolutely use PowerShell to decode this, but what can I say - I wanted to do it Python)

According to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Iron Python website "IronPython is an open-source implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Python programming language which is tightly integrated with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .NET Framework. IronPython can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .NET Framework and Python libraries, and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r .NET languages can use Python code just as easily." Neat. Installing it on Windows is a breeze - just an MSI. Once installed, you simple run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scripts calling ipy.exe (I'll show an example later).

Armed with this, I was able to write some python code (io_decompress.py) that decompressed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zip file using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 python IO compression Library:

#import required .Net libraries

from System.IO import BinaryReader, StreamReader, MemoryStream
from System.IO.Compression import CompressionMode, DeflateStream
from System import Array, Byte
from System.IO import FileStream, FileMode
from System.Text import Encoding
from System.IO import File

#functions to decompress cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data
def decompress(data):
    io_zip = DeflateStream(MemoryStream(data), CompressionMode.Decompress)
    str = StreamReader(io_zip).ReadToEnd()
    io_zip.Close()
    return str

print "Decompressing stream..."
compressedBytes = File.ReadAllBytes("decoded2.zip")
decompressedString = decompress(compressedBytes)

f = open("decompressed.txt", "wb")
f.write(decompressedString)
f.close()

To run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script using IronPython was easy: ipy.exe io_decompress.py:


I was able to open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decompressed.txt file created by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script and was rewarded with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following plain text PowerShell script. Once again, note cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IP address:


To summarize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps taken for this event log entry:
  • Decoded Unicode base64
  • Decoded embedded base64 code
  • Decompressed resulting decoded base64 code
As we have seen from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 three examples above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are various techniques attackers may use to obfuscate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir PowerShell entries. These may be used in various combinations, some of which I have demonstrated above. The steps taken vary for each case, and within each case itself. I usually see 2-3 variations in each case that are pushed out to hundreds of systems over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 course of several months. Sometimes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps might be:base64, base64,decompress, shellcode. It might also be: base64, decompress, base64, code, base64, shellcode. See how quickly this becomes like a Matryoshka doll? When I wrap up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series, I will talk about ways to automate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. If you are using something like Harlan Carvy's timelines scripts to get text outputs, it becomes pretty easy.

So how to go about finding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se and decoding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in your exams?

  • Look for event log ID 7045 with "%COMSPEC%, powershell.exe, -encodedcommand, -w hidden , "From Base64String" etc.
  • Look for "Gzipstream" or "[IO.Compression.CompressionMode]::Decompress" for hints on what type of compression was used
  • Try running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting binary files through sdbg.exe, shellcode2exe or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r malware analysis tools

Part 2 will be about PowerShell in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 registry, followed by Part 3 on PowerShell logging and pulling information from memory.