Threat Hunting – A Tale of Wishful Thinking and Willful Ignorance …

I will start by saying that I am a devoted advocate for threat hunting and I consider it a must-do part of any Incident Response program.

However…

It’s a very difficult task, and one that cannot be solved by a list of Event IDs, list of names for known bad programs, dual-purpose programs, OS commands abused by attackers, or clever regex kung-fu. I believe that the core of threat hunting relies on data reduction, and this often ends up with False Positive management. A really, really tough task. Unfortunately, most of the threat hunting ‘recipes’ that can be found online covering this topic are often focused on the True Positives; the presentations show screenshots confirming that certain events can highlight the execution of malware, etc.. Yes, this works fine. But it’s an error of availability. This works fine for a single test system, but it is much harder on a real system and completely non-scalable for a large number of systems.

Let me illustrate it by some simple math – the number of processes started logged by the Windows Event log on my lab workstation is easily 300 per day or more (sometimes it’s a few thousands if I do some batch file processing). This often escapes our consciousness, but cmd, strings, grep, tools of any sort, it all leaves a mark in the log. Let’s say the average system has 150 processes executed every day. Multiply it by 365 days, that’s 50K+ events. Multiply it by 50K devices and you get 2,737,500,000 events. And this is just process creation. A decent EDR will log threads’ creation, writing to other processes’ memory, file creation, registry modifications, account creation, escalations of  privileges, and so on and so forth. It’s a HUGE number of events. It has a tremendous value in terms of analysis and works very well as a post-mortem detective control, but it’s not necessarily designed to prevent/detect early the badness… We can do some data reduction using data stacking, etc., but even after that the variety of programs that you will see in these logs makes the task very very difficult. This gets especially hard in the environment where you have a large group of developers – these guys run crazy number of processes, experiment with weird software on their systems (they also _write_ programs and execute them for testing), and contribute a lot to the noise in the logs. And mind you, we would like to discover the insider threat as well…

In general, I divide threat hunting rules into two categories:

  • based on IOCs
    • this is very easy to implement
    • examples
      • unique_file_name.exe is bad – we can query systems for it on regular basis and if it is detected we trigger the alert
      • when new file extension used by ransomware becomes publicly known, we can query the logs for file creation events that hit on this new file extension
    • the ROI is poor though, because it’s a signature-based approach
    • … and yeah, unfortunately looking for specific process names often leads to False Positives as well…
  • based on assumptions and scenarios that attempt to detect stages of malicious/hacking activity (aiming at disturbing the kill chain)
    • this is difficult as the expected results are not known and lots of tuning is required to reduce the data returned by the query
    • the following rule sounds like a good example of this idea: ‘svchost.exe executed from a non-sysdir location’
      • I think this rule is extremely powerful, cuz it will catch any malware that drops and executes svchost.exe f.ex. from %appdata%
      • there is only one problem… it is a signature-based approach! and while it highlights an anomaly, it only covers a small part of the spectrum…
    • hold on… so what could be a real example of rule belonging to this category? what about ‘review all executable files dropped in the %appdata%’?
      • this is better, but how do you distinguish which dropped file is executable? it’s difficult even if we talk about file extensions only, as one could use ‘.exe’, ‘.dll’, ‘.scr’, ‘.pif’, but also ‘.foo’, ‘.dat’, and ‘.rar’, or ‘.zip’ – as long as one can load the file and execute it, the file extension doesn’t matter; and let’s not forget about the file content (PE file, scripting languages, macros) and… last but not least – yup, this is yet another signature-based rule!
    • okay, so what about this ‘look at all files dropped inside %appdata%’…
      • yeah, right…
    • hmm what about hackers using ‘ipconfig.exe’, ‘netstat.exe’, ‘net.exe’, ‘cscript.exe’, etc.? or even ‘psexec.exe’, ‘nmap.exe’ ?
      • good luck with that…
      • obviously, it’s signature-based approach as well, but even if we forget about it (it’s a very precise rule and these tools are used by hackers after all) – all of these are so frequently used by both users and embedded in many ‘enterprise’ solutions (some EDR solutions rely heavily on external hacking programs too!) – it’s impossible to sift through it
    • I guess there is no way to avoid some sort of hard coded values here (yup, signatures!)
    • A good example would be – show me all processes that use a single-double character as a name; this is hardcoded, but exploits the fact it’s an anomaly and hackers often use such files on the systems (and since I mentioned False Positives management – hello cywgin’s [.exe, ar.exe, as.exe, cp.exe, dd.exe, df.exe, du.exe, id.exe, ld.exe, ln.exe, ls.exe, mv.exe, nl.exe, nm.exe, od.exe, pg.exe, pr.exe, ps.exe, rm.exe, sh.exe, tr.exe, ul.exe, vi.exe, w.exe, wc.exe, xz.exe… and it’s just a tip of the iceberg in a corp. environment)
    • In some cases histograms, or some clever statistics backed by exclusions and some arbitrary values (signatures again!) can do the trick f.ex. ‘show me all uploads higher than xyz bytes in last 1h’
    • …

Threat hunting is anomaly hunting and defining an anomaly is extremely difficult, but we are getting better at it. The thing I want to highlight with this post is that the current state of threat hunting is that we finally know what to log and what to look at. We have absolutely no clue though how to sift through this data in a realistic, scaleable way to ensure we don’t miss a single threat. This is the very same problem security industry tries to solve for a very long time. Let’s not pretend that we did.

A few things about EICAR that you may be not aware of…

Update April 2017

As per info from Vess, the programmer who was responsible responsible for writing the EICAR file was Padgett Peterson.

If you get excited about EICAR file making the news as being able to make AV deleting logs when EICAR is used as a user name, password, User agent, etc. – it’s old news 😉 Read the history of the file including first attempts to abuse it here.

Old Post

When my wife studied her MA in graphic design and branding she got a lot of interesting home work. One of them was… ‘The square’. She spent a lot of time brainstorming and eventually produced a large collection of ideas that got her a good mark. Now, the simple purpose of that exercise was to play around with the idea of… ideas. As simple as it sounds, the moment you start exploring one ‘simple’ subject you will soon find yourself deep in a forest.

As I am adding support for many Quarantine files now (to DeXRAY) I suddenly found myself in a world of Antivirus analysis. One thing that somehow connects all of AV products is not their functionality, or Utopian vision of full protection, but… the EICAR file.

I decided to explore the topic of this file a bit – same as my wife was exploring the square. Yup, here’s a boring story SLASH a bunch of ideas associated with EICAR SLASH and other topics like this …

First of all – in case you don’t know – EICAR is a small file that is used as a test for security products (in the past it was mainly antivirus, but nowadays it should apply to any security solution that looks at files/content of any sort really). Once you deploy/install the solution/product, you can drop the EICAR file all over the place and see if solution picks it up. Notably, some AV vendors apparently do not understand what EICAR’s purpose is and decided not to detect it. I won’t be pointing fingers, but upload EICAR file to VirusTotal and you will know who I am talking about.

Naming conventions in AV is a subject to many debates over many years. EICAR looks like a no-brainer though as it’s an artificial file created with a single purpose and its origin and name are well-documented. It doesn’t help though… it would seem that vendors can’t agree on one, single name. Here is a histogram of names used by AV:

EICAR_test_file                  11
EICAR-Test-File                   7
EICAR-Test-File (not a virus)     4
Eicar test file                   3
EICAR (v)                         2
Eicar-Test-Signature              2
EICAR.Test.File                   2
EICAR.TestFile                    2
EICAR Test File (NOT a Virus!)    1
EICAR.TEST.NOT-A-VIRUS            1
EICAR-Test-File (not a virus) (B) 1
EICAR Test String                 1
DOS.EiracA.Trojan                 1
Marker.Dos.EICAR.dymlmx           1
EICAR.Test.File-NoVirus           1
NORMAL:EICAR-Test-File!84776 [F]  1
EICAR-Test-File!c                 1
EICAR Test-NOT virus!!!           1
Win32.Test.Eicar.a                1
Misc.Eicar-Test-File              1
EICAR_Test                        1
NotAThreat.EICAR[TestFile]        1
qex.eicar.gen.gen                 1
TestFile/Win32.EICAR              1
Virus:DOS/EICAR_Test_File         1
EICAR-AV-Test                     1
EICAR-AV-TEST-FILE                1
EICAR-test[h]                     1

And the bonus: one of these even has a typo. Can you spot it?

EICAR is a very strange phenomenon.

It is an organization. It is a file. It has a dedicated web site. It haz a dedicated con. Its original name is inclusive of Europe, and exclusive of other continents (EICAR stands for ‘European Institute for Computer Antivirus Research’; deprecated name, but always…).

Anagrams of EICAR are ERICA, CERIA and AREIC. They serve no purpose in this article.

Properties:

File size: 68 bytes
MD5: 44D88612FEA8A8F36DE82E1278ABB02F
SHA1: 3395856CE81F2B7382DEE72602F798B642F14140
SHA256: 275A021BBFB6489E54D471899F7DB9D1663FC695EC2FE2A2C4538AABF651FD0F
CTPH: 3:a+JraNvsgzsVqSwHq9:tJuOgzsko
Entropy: 4.872327687

Eicar is a DOS file and can be executed… but only under old versions of Windows.

eicar

The source code is using the same tricks as shellcodes:

  • code is obfuscated

eicar2

  • it is a self-modifying code (patching itself)

eicar3

eicar4

Does your sandbox solution accept EICAR? Test it.

There exist tools that help you to generate EICAR file and its cousins (file formats embedding EICAR).

There exist a close friend of EICAR called AMTSO (Anti-Malware Testing Standards Organization) that focuses on testing antimalware methods. It produces some more test files to support the original idea introduced by EICAR f.ex. Potentially Unwanted Application equivalent of EICAR:

puaeicar

with the histogram of detection names as follows (VT detection rate: 43/56 – mind you that the file was compiled on 2013-04-04 21:26:07 (Thursday)):

Application.Hacktool.Amtso.A                             5
Riskware ( 0040eff71 )                                   2
AMTSO-Test                                               2
PUA_Test_File                                            2
RiskTool.EICAR-Test-File.r5 (Not a Virus)                1
RiskWare[RiskTool:not-a-virus]/Win32.EICAR-Test-File     1
RiskTool.Win32.AMTSOTestFile (not malicious)             1
Amtso.Test.Pua.A                                         1
W32/PUAtest.B                                            1
AMTSO_PUA_TEST                                           1
RiskTool.Win32!O                                         1
Application.Win32.AmtsoTest.a                            1
Riskware.AMTSO-Test-PUA                                  1
Application/AMTSOPUPTestfile                             1
Trojan.Staser.gen                                        1
Application:W32/AMTSOPUATestfile                         1
W32/TestFile.LCMA-1046                                   1
Backdoor.CPEX.Win32.29390                                1
Risktool.W32.Eicar.Test!c                                1
Hacktool.Win32.EICAR-Test-File.aa                        1
RiskTool.Win32.AMTSOTestFile                             1
not-a-virus:RiskTool.Win32.EICAR-Test-File               1
AMTSO-PUA-Test                                           1
PE:Malware.Generic/QRS!1.9E2D [F]                        1
Riskware.Win32.EICARTestFile.dmxhvk                      1
PUA.AMTSOTest                                            1
SpyCar                                                   1
PUA/AMTSO-Test                                           1
Trojan/W32.Agent.33280.TI                                1
Win32/PUAtest.B potentially unwanted                     1
W32/TestFile                                             1
Win32:AmtsoTest-A [PUP]                                  1
AMTSO-PUA-Test (PUA)                                     1
RiskTool.EICAR-Test-File.a                               1
AMTSO Test File PUA (Not a Virus!)                       1
PUP/Win32.AMTSO_Test                                     1

…and the cloudish EICAR file as well. Here’s the histogram of names given to the cloudish EICAR file (only 23/56 vendors detect it on VT; compilation date:  2010-07-08 23:02:46 (Thursday), ouch!):

AMTSO_TEST_CLOUDCAR                    2
Cldcar-Test!3FB121FBBCCB               2
Trojan.Win32.Generic!BT                2
Trojan.Agent/Gen-CloudTest             1
Virus:DOS/EICAR_Test_File              1
Trojan.Generic                         1
Application.Win32.CloudTest.s          1
Win.Trojan.11584714-1                  1
Amtso.Test.Cloudcar.A                  1
Trojan.Brodcom.Win32.366               1
Trojan.Win32.DangerousObject.dlgbhn    1
AMTSO-CLOUD-Test                       1
Trojan.Win32.Z.Agent.7178[h]           1
CLOUDCAR_Test                          1
UDS:DangerousObject.Multi.Generic      1
DangerousObject.Multi.Generic!c        1
W32/GenBl.3FB121FB!Olympus             1
Mal/Generic-S                          1
AMTSO Test File (NOT a Virus!)         1
Trj/CI.A                               1

There also exist a close friend fo EICAR called GTUBE (Generic Test for Unsolicited Bulk Email) for testing anti-spam solutions. It is also 68 bytes long.

Last, but not least – there exists a shorter version of EICAR and it is 12 bytes SHORTER than the original!

The Base64-encoded EICAR looks like this:

WDVPIVAlQEFQWzRcUFpYNTQoUF4pN0NDKTd9JDIDYOUSPOTTHISEVJQ0FSLVNUQU5EQVJELUFOVElWSVJVUy1URVNU
LUZJTEUhJEgrSCo=

You may come across it as it is being used in various tests and… it is a method used by Esafe to save Quarantine files. And… maybe you can’t read this post in case your security product is over protective and detected the BASE64-encoded EICAR string. Well, if it does… it shouldn’t, as I included ‘DIDYOUSPOTTHIS’ in the BASE64 encoding above. Well, did you spot that DIDYOUSPOTTHIS?

EICAR is a tool. I use it to test Quarantine files’ encryption. When I find no encryption, or trivial encryption/encoding – I love EICAR. When I have to dig into some actual code to find out how they transform the original EICAR bytes into sth terrible I absolutely hate this little piece of hybrid data/code ;).