Link: elfu-zeeklogs.zip

Terminal - PowerShell


I find Sparkle in the room off the left side of the quad, between the NetWars and Speak Unpreparedness Room:


I’m Sparkle Redberry and Imma chargin’ my laser!

Problem is: the settings are off.

Do you know any PowerShell?

It’d be GREAT if you could hop in and recalibrate this thing.

It spreads holiday cheer across the Earth …

… when it’s working!

When I visit the computer controlling the laser, there’s a PowerShell prompt on Linux:

WARNGING: ctrl + c restricted in this terminal - Do not use endless loops
Type exit to exit PowerShell.
PowerShell 6.2.3
Copyright (c) Microsoft Corporation. All rights reserved.
Type 'help' to get help.
🗲                                                                                🗲
🗲 Elf University Student Research Terminal - Christmas Cheer Laser Project       🗲
🗲 ------------------------------------------------------------------------------ 🗲
🗲 The research department at Elf University is currently working on a top-secret 🗲
🗲 Laser which shoots laser beams of Christmas cheer at a range of hundreds of    🗲
🗲 miles. The student research team was successfully able to tweak the laser to   🗲
🗲 JUST the right settings to achieve 5 Mega-Jollies per liter of laser output.   🗲
🗲 Unfortunately, someone broke into the research terminal, changed the laser     🗲
🗲 settings through the Web API and left a note behind at /home/callingcard.txt.  🗲
🗲 Read the calling card and follow the clues to find the correct laser Settings. 🗲
🗲 Apply these correct settings to the laser using it's Web API to achieve laser  🗲
🗲 output of 5 Mega-Jollies per liter.                                            🗲
🗲                                                                                🗲
🗲 Use (Invoke-WebRequest -Uri http://localhost:1225/).RawContent for more info.  🗲
🗲                                                                                🗲
PS /home/elf> 


I’ll start with the calling card file left by the intruder:

PS /> get-content /home/callingcard.txt
What's become of your dear laser?
Fa la la la la, la la la la
Seems you can't now seem to raise her!
Fa la la la la, la la la la
Could commands hold riddles in hist'ry?
Fa la la la la, la la la la
Nay! You'll ever suffer myst'ry!
Fa la la la la, la la la la

The hint in there is about the history. There’s a few ways to check history. I can check the PowerShell history. That’s typically in AppData/local on Windows, but I’ll find it in .local on Linux. Unfortunately, it seems to have started with my session:

PS /> Get-Content /home/elf/.local/share/powershell/PSReadLine/ConsoleHost_history.txt
Get-Content /home/callingcard.txt
Get-Content ./.local/share/powershell/PSReadLine/ConsoleHost_history.txt

There’s no .bash_history file in the only home directory:

PS /> Get-ChildItem -Force /home/elf
    Directory: /home/elf
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d--h--          12/24/19  4:27 PM                .cache
d--h--          12/24/19  4:27 PM                .local
d-r---          12/13/19  5:15 PM                depths
---h--            4/4/18  6:30 PM            220 .bash_logout
---h--            4/4/18  6:30 PM           3771 .bashrc
---h--            4/4/18  6:30 PM            807 .profile
--r---          12/13/19  4:29 PM           2029 motd

But when I run Get-History, I two things - the correct value for the angle (in item 7), and a clue:

PS /> Get-History
  Id CommandLine
  -- -----------
   1 Get-Help -Name Get-Process 
   2 Get-Help -Name Get-* 
   3 Set-ExecutionPolicy Unrestricted 
   4 Get-Service | ConvertTo-HTML -Property Name, Status > C:\services.htm 
   5 Get-Service | Export-CSV c:\service.csv 
   6 Get-Service | Select-Object Name, Status | Export-CSV c:\service.csv 
   7 (Invoke-WebRequest
   8 Get-EventLog -Log "Application" 
   9 I have many name=value variables that I share to applications system wide. At a command…
  10 Get-Content /home/callingcard.txt
  11 Get-Content ./.local/share/powershell/PSReadLine/ConsoleHost_history.txt
  12 Get-ChildItem -Force

Item 9 is interesting. I’ll get the full command, and it provides the next step:

PS /> Get-History -id 9 | Format-List -Property *
Id                 : 9
CommandLine        : I have many name=value variables that I share to applications system wide. At a command I will reveal my secrets once you Get my Child Items.
ExecutionStatus    : Completed
StartExecutionTime : 11/29/19 4:57:16 PM
EndExecutionTime   : 11/29/19 4:57:16 PM
Duration           : 00:00:00.6090308

That’s clearly a reference to environment variables. In PowerShell, I can switch to a virtual drive, Env:/ and then use Get-ChildItem (or gci) to see what’s there:

PS /> cd env: 
PS Env:/> gci
Name                           Value
----                           -----
_                              /bin/su
HOME                           /home/elf
HOSTNAME                       f96310ac76d0
LANG                           en_US.UTF-8
LC_ALL                         en_US.UTF-8
LOGNAME                        elf
MAIL                           /var/mail/elf
PATH                           /opt/microsoft/powershell/6:/usr/local/sbin:/usr/local/bin:/u…
PSModulePath                   /home/elf/.local/share/powershell/Modules:/usr/local/share/po…
PWD                            /home/elf
RESOURCE_ID                    6ef39372-aa62-463c-8f20-c5e62b2d2ae4
riddle                         Squeezed and compressed I am hidden away. Expand me from my p…
SHELL                          /home/elf/elf
SHLVL                          1
TERM                           xterm
USER                           elf
USERDOMAIN                     laserterminal
userdomain                     laserterminal
USERNAME                       elf
username                       elf

There’s a variable named riddle, and the value is truncated. I’ll use the same trick as before:

PS Env:/> gci ./riddle | Format-List -Property value
Value : Squeezed and compressed I am hidden away. Expand me from my prison and I will show 
        you the way. Recurse through all /etc and Sort on my LastWriteTime to reveal im the 
        newest of all.

The way that LastWriteTime is written in the riddle is a hint. I can use gci to get all the files in /etc and sort by LastWriteTime to get the more recent. Ignoring the error about a path I can’t access, I see that “Expand me from my prison” was also a clue:

PS /> gci -Recurse /etc | sort LastWriteTime | select -Last 1
gci : Access to the path '/etc/ssl/private' is denied.
At line:1 char:1
+ gci -Recurse | sort LastWriteTime | select -Last 1
+ ~~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (/etc/ssl/private:String) [Get-ChildItem], Unautho
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildIte
    Directory: /etc/apt
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
--r---          12/24/19  4:27 PM        5662902 archive

I can extract the files from the archive. There were some errors generated, but I found when I set the output directory, I got what I needed:

PS /> Expand-Archive /etc/apt/archive -DestinationPath /home/elf
PS /> gci /home/elf

    Directory: /home/elf                                                                      
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---          12/13/19  5:15 PM                depths
d-----          12/24/19  5:21 PM                refraction
--r---          12/13/19  4:29 PM           2029 motd
PS /> gci -Recurse /home/elf/refraction/
    Directory: /home/elf/refraction
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------           11/7/19 11:57 AM            134 riddle
------           11/5/19  2:26 PM        5724384 runme.elf

I’ll start with runme.elf. An elf file is a Linux executable. I can try to run it, but it throws an error:

PS /home/elf/refraction> ./runme.elf         
Program 'runme.elf' failed to run: No such file or directoryAt line:1 char:1
+ ./runme.elf
+ ~~~~~~~~~~~.
At line:1 char:1
+ ./runme.elf
+ ~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
+ FullyQualifiedErrorId : NativeCommandFailed

The execute permission on the file isn’t set. On Linux, I set that with chmod. Then I can run the file and get the refraction value:

PS /home/elf/refraction> chmod +x ./runme.elf
PS /home/elf/refraction> ./runme.elf

Now continue with riddle:

PS /> Get-Content /home/elf/refraction/riddle
Very shallow am I in the depths of your elf home. You can find my entity by using my md5 identity:

There is a depth directory in the elf home directory. I can do this search in a few steps in a pipeline. First, I’ll use Get-ChildItem with -File to only get files (not directories) and -Recurse to find files in directories. I’ll pipe that to Get-FileHash with the -Algorithm MD5 flag. That goes into a Where-Object to get the object with a hash value of the one I’m looking for. Then, when an object comes out of that, I’ll have it to into select Path so that I get the file path:

PS /> Get-ChildItem -File -Recurse /home/elf/depths | Get-FileHash -Algorithm MD5 |  Where-Object Hash -eq 25520151A320B5B0D21561F92C8F6224 | select Path

The content is the desired temperature, as well as another riddle:

PS /> Get-Content /home/elf/depths/produce/thhy5hll.txt
I am one of many thousand similar txt's contained within the deepest of /home/elf/depths. Finding me will give you the most strength but doing so will require Piping all the FullName's to Sort Length.

I found a bit of code on StackExchange that showed how to do this. I just needed to change name to fullname. It is getting all the files and directories in /home/elf/depths, and for each, it is using Select to keep two fields, the fullName, and a field NameLength that I create which is equal to the length of fullName. Then I sort based on NameLength, and select the last item:

PS /> gci -Recurse /home/elf/depths/ | Select fullName,@{Name="NameLength";Expression={$_.full
name.length}} | sort namelength | select -last 1 | Format-List 
FullName   : /home/elf/depths/larger/cloud/behavior/beauty/enemy/produce/age/chair/unknown/es
NameLength : 388

That’s quite a name. I can get the contents:

PS /> Get-Content /home/elf/depths/larger/cloud/behavior/beauty/enemy/produce/age/chair/unknown/escape/vote/long/writer/behind/ahead/thin/occasionally/explore/tape/wherever/practical/therefore/cool/plate/ice/play/truth/potatoes/beauty/fourth/careful/dawn/adult/either/burn/end/accurate/rubbed/cake/main/she/threw/eager/trip/to/soon/think/fall/is/greatest/become/accident/labor/sail/dropped/fox/0jhj5xz6.txt
Get process information to include Username identification. Stop Process to show me you're skilled and in this order they must be killed:
Do this for me and then you /shall/see .

I can run Get-Process with the -IncludeUserName flag to see the processes and the users, and sleep processes for each of the users above:

PS /> Get-Process -IncludeUserName
     WS(M)   CPU(s)      Id UserName                       ProcessName
     -----   ------      -- --------                       -----------
     26.98     0.36       6 root                           CheerLaserServi
    120.33     2.62      31 elf                            elf
      3.30     0.03       1 root                           init
      0.71     0.00      23 bushy                          sleep
      0.80     0.00      26 alabaster                      sleep
      0.71     0.00      27 minty                          sleep
      0.72     0.00      29 holly                          sleep
      3.30     0.00      30 root                           su

I can also see that there’s nothing in the /shall directory:

PS /> gci -Force /shall/

I’ll kill the processes in the order described above (the ideas change on each load):

PS /> Stop-Process -id 23; Stop-Process -id 26; Stop-Process -id 27; Stop-Process -id 29

Now, there’s a see file in /shall/:

PS /> gci -Force /shall/                                                                
    Directory: /shall
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
--r---          12/24/19  5:55 PM            149 see

It contains the next step in the riddle:

PS /> Get-Content /shall/see
Get the .xml children of /etc - an event log to be found. Group all .Id's and the last thing will be in the Properties of the lonely unique event Id.

I’ll find the event log file using a Get-ChildItem with flags to only return .xml files:

PS /> Get-ChildItem -Path /etc/ -Recurse -File -Filter *.xml -ErrorAction SilentlyContinue
    Directory: /etc/systemd/system/timers.target.wants
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
--r---          11/18/19  7:53 PM       10006962 EventLog.xml

I can read the file in as xml:

PS /> [xml]$log = Get-Content /etc/systemd/system/timers.target.wants/EventLog.xml

Now I can reference parts of it:

PS /> $log
PS /> $log.Objs
Version xmlns                                           Obj
------- -----                                           --- http://schemas.microsoft.com/powershell/2004/04 {Obj, Obj, Obj, Obj…}

After some playing around with the data format, I was able to get a histogram of the log ids:

PS /> $log.objs.obj.props.I32 | where N -eq 'Id' | Group-Object -Property '#text' -NoElement
Count Name
----- ----
    1 1
   39 2
  179 3
    2 4
  905 5
   98 6

But there’s a better way to read xml, with Import-CliXML:

PS /> $log = Import-Clixml /etc/systemd/system/timers.target.wants/EventLog.xml
PS /> $log[0]

Message              : Network connection detected:
                       UtcTime: 2019-11-07 17:51:21.083
                       ProcessGuid: {BA5C6BBB-4C7A-5DC4-0000-0010F4540100}
                       ProcessId: 1068
                       Image: C:\Windows\System32\svchost.exe
                       User: NT AUTHORITY\LOCAL SERVICE
                       Protocol: udp
                       Initiated: true
                       SourceIsIpv6: false
                       SourceHostname: elfuresearch.localdomain
                       SourcePort: 123
                       SourcePortName: ntp
                       DestinationIsIpv6: false
                       DestinationPort: 123
                       DestinationPortName: ntp
Id                   : 3
Version              : 5
Qualifiers           : 
Level                : 4
Task                 : 3
Opcode               : 0
Keywords             : -9223372036854775808
RecordId             : 2194
ProviderName         : Microsoft-Windows-Sysmon
ProviderId           : 5770385f-c22a-43e0-bf4c-06f5698ffbd9
LogName              : Microsoft-Windows-Sysmon/Operational
ProcessId            : 1960
ThreadId             : 6648
MachineName          : elfuresearch
UserId               : S-1-5-18
TimeCreated          : 11/7/19 5:51:22 PM
ActivityId           : 
RelatedActivityId    : 
ContainerLog         : microsoft-windows-sysmon/operational
MatchedQueryIds      : {}
Bookmark             : System.Diagnostics.Eventing.Reader.EventBookmark
LevelDisplayName     : Information
OpcodeDisplayName    : Info
TaskDisplayName      : Network connection detected (rule: NetworkConnect)
KeywordsDisplayNames : {}
Properties           : {System.Diagnostics.Eventing.Reader.EventProperty, 

I can get the same histogram:

PS /> $log | Group-Object -Property Id -NoElement
Count Name
----- ----
    1 1
   39 2
  179 3
    2 4
  905 5
   98 6

ID 1 only has on log. So now I can find the log I want:

PS /> $log | where {$_.id -eq 1} | select message | format-list
Message : Process Create:
          UtcTime: 2019-11-07 17:59:56.525
          ProcessGuid: {BA5C6BBB-5B9C-5DC4-0000-00107660A900}
          ProcessId: 3664
          FileVersion: 10.0.14393.206 (rs1_release.160915-0644)
          Description: Windows PowerShell
          Product: Microsoft® Windows® Operating System
          Company: Microsoft Corporation
          OriginalFileName: PowerShell.EXE
          CommandLine: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c 
          "`$correct_gases_postbody = @{`n    O=6`n    H=7`n    He=3`n    N=4`n    Ne=22`n   
           Ar=11`n    Xe=10`n    F=20`n    Kr=8`n    Rn=9`n}`n"
          CurrentDirectory: C:\
          User: ELFURESEARCH\allservices
          LogonGuid: {BA5C6BBB-5B9C-5DC4-0000-0020F55CA900}
          LogonId: 0xA95CF5
          TerminalSessionId: 0
          IntegrityLevel: High
          Hashes: MD5=097CE5761C89434367598B34FE32893B
          ParentProcessGuid: {BA5C6BBB-4C79-5DC4-0000-001029350100}
          ParentImage: C:\Windows\System32\svchost.exe
          ParentCommandLine: C:\Windows\system32\svchost.exe -k netsvcs

I see the answer in the form of a PowerShell command that creates a variable that’s an array of elements and counts. I can load that variable into my environment with the following command:

PS /home/elf> iex "`$correct_gases_postbody = @{`n    O=6`n    H=7`n    He=3`n    N=4`n    Ne=22`n Ar=11`n    Xe=10`n    F=20`n    Kr=8`n    Rn=9`n}`n"
PS /> $correct_gases_postbody
Name                           Value
----                           -----
Kr                             8
Xe                             10
N                              4
He                             3
Ne                             22
Ar                             11
H                              7
O                              6
Rn                             9
F                              20

Now I have all the information I need to set the laser. I’ll check the output to start, and it comes up short:

PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/output).Content                    
Failure - Only 2.49 Mega-Jollies of Laser Output Reached!

I’ll update the values:

PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/refraction?val=1.867).Content      
Updated Lense Refraction Level - Check /api/output if 5 Mega-Jollies per liter reached.
PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/temperature?val=-33.5).Content     
Updated Laser Temperature - Check /api/output if 5 Mega-Jollies per liter reached.
PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/angle?val=65.5).Content            
Updated Mirror Angle - Check /api/output if 5 Mega-Jollies per liter reached. 
PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/gas -Method POST -Body $correct_gas
Updated Gas Measurements - Check /api/output if 5 Mega-Jollies per liter reached. 

Unfortunately, I still didn’t have 5 Mega-Jollies:

PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/output).Content
Failure - Only 3.88 Mega-Jollies of Laser Output Reached! 

I was stumped for a couple minutes, but then I tried turning it off and back on again, and it worked, and the challenge was solved:

PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/off).Content    
Christmas Cheer Laser Powered Off                                                          
PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/on).Content                        
Christmas Cheer Laser Powered On                                                           
PS /> (Invoke-WebRequest -Uri http://localhost:1225/api/output).Content                    
Success! - 5.76 Mega-Jollies of Laser Output Reached!   


On solving, Sparkle gives me a hint to use Rita to look at the Zeek logs:

You got it - three cheers for cheer!

For objective 5, have you taken a look at our Zeek logs?

Something’s gone wrong. But I hear someone named Rita can help us.

Can you and she figure out what happened?

Objective Challenge

I’m given a link to a .zip file which contains a folder with almost 900 Zeek logs. Zeek (formerly Bro) is a framework for analyzing network traffic. It summarized network traffic into a series of logs that can be analyzed.

Installing Rita

Rita (Real Time Threat Analytics) is a tool from Active Countermeasures that ingests Zeek logs and provides a bunch of analytics to look for patterns of known or potential badness.

The README.md on their GitHub page has detailed installation instructions via several different methods. I pulled up my Security Onion VM and ran the commands to install Rita:

oxdf@seco:~$ wget https://raw.githubusercontent.com/activecm/rita/master/install.sh
--2019-12-29 17:09:18--  https://raw.githubusercontent.com/activecm/rita/master/install.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)||:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19239 (19K) [text/plain]
Saving to: ‘install.sh’

install.sh          100%[===================>]  18.79K  --.-KB/s    in 0.02s   

2019-12-29 17:09:18 (1.18 MB/s) - ‘install.sh’ saved [19239/19239]

oxdf@seco:~$ sudo bash ./install.sh 
[sudo] password for oxdf: 

 _ \ _ _| __ __|  \
   /   |     |   _ \
_|_\ ___|   _| _/  _\  v3.1.1

Brought to you by Active CounterMeasures

[-] In order to run the installer, several basic packages must be installed. 
	[-] Updating packages... SUCCESS
	[-] Ensuring curl is installed... SUCCESS
	[-] Ensuring coreutils is installed... SUCCESS
	[-] Ensuring lsb-release is installed... SUCCESS
	[-] Ensuring yum-utils is installed... SUCCESS
[-] This installer will: 
	[-] Install MongoDB 
	[-] Install RITA to /usr/local/bin/rita 
	[-] Create a runtime directory for RITA in /var/lib/rita 
	[-] Create a configuration directory for RITA in /etc/rita 
[-] Bro IDS is already installed 
If you need to check or change your network interfaces, please do so now
by switching to a different terminal and making any changes.  Please note
that any interfaces you would like to use for packet capture must be up
and configured before you continue.  When the interfaces are ready,
please return to this terminal.

Would you like to continue running the Bro configuration script? 
You might answer no if you know you have already created a working
node.cfg and do not wish to replace it.  Otherwise we recommend
continuing with this script.
Continuing, all requirements met
This system has 1 cores.
The potentially sniffable interface is: enp0s3 
Here are the stats for enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:cc:ed:87 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    106740     397      0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    35022      375      0       0       0       0       
Would you like to include it as a sniff interface (y/n)?n

This configuration has no sniff interfaces, so bro will not be able to run.  Exiting bro configuration script.
[!] Automatic Bro configuration failed. 
[!] Please edit /opt/bro/etc/node.cfg and run 
[!] 'sudo broctl deploy' to start Bro. 
[!] Pausing for 20 seconds before continuing. 
	[!] Adding Bro IDS to the path in /etc/profile.d/bro-path.sh 
[-] Installing MongoDB... SUCCESS
[!] Starting MongoDB and enabling on startup. 
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /lib/systemd/system/mongod.service.
[!] Starting MongoDB process completed.
[!] You can access the MongoDB shell with 'mongo'. 
[!] If you need to stop MongoDB, 
[!] run 'sudo systemctl stop mongod'. 
[-] Installing RITA... SUCCESS
[!] To finish the installation, reload the system profile with 
[!] 'source /etc/profile'.

 _ \ _ _| __ __|  \
   /   |     |   _ \
_|_\ ___|   _| _/  _\  v3.1.1

Brought to you by Active CounterMeasures

Thank you for installing RITA! Happy hunting!

I edited /etc/rita/config.yaml to uncomment out the existing example InternalSubnets:

      -          # Private-Use Networks  RFC 1918
      -       # Private-Use Networks  RFC 1918
      -      # Private-Use Networks  RFC 1918

Running Rita

Now I can run the import command and point it at my logs:

root@seco:/mnt/hhc19/5# rita import elfu-zeeklogs/ hhc19

	[+] Importing [elfu-zeeklogs/]:
	[-] Verifying log files have not been previously parsed into the target dataset ... 
	[-] Parsing logs to: hhc19 ... 
	[-] Parsing elfu-zeeklogs/conn.log-00001_20190823120021.log -> hhc19
	[-] Parsing elfu-zeeklogs/conn.log-00002_20190823121227.log -> hhc19
	[-] Parsing elfu-zeeklogs/conn.log-00003_20190823122444.log -> hhc19
	[-] Parsing elfu-zeeklogs/conn.log-00004_20190823123904.log -> hhc19
	[-] Parsing elfu-zeeklogs/ssl.log-00094_20190824085227.log -> hhc19
	[-] Parsing elfu-zeeklogs/ssl.log-00095_20190824090519.log -> hhc19
	[-] Parsing elfu-zeeklogs/ssl.log-00096_20190824091651.log -> hhc19
	[-] Host Analysis:            41993 / 41993  [==================] 100 %
	[-] Uconn Analysis:           115915 / 115915  [==================] 100 %
	[-] Exploded DNS Analysis:    47836 / 47836  [==================] 100 %
	[-] Hostname Analysis:        47836 / 47836  [==================] 100 %
	[-] Beacon Analysis:          115915 / 115915  [==================] 100 %
	[-] UserAgent Analysis:       6 / 6  [==================] 100 %
	[!] No certificate data to analyze
	[-] Updating blacklisted peers ...
	[-] Indexing log entries ... 
	[-] Updating metadatabase ... 
	[-] Done!

The simplest way to look at the data when you’re not exactly sure what you’re looking at is to run html-report:

root@seco:/mnt/hhc19/5# rita html-report
[-] Writing: /mnt/hhc19/5/hhc19/hhc19
[-] Wrote outputs, check /mnt/hhc19/5/hhc19 for files

Report Analysis

Now I can open the resulting index.html in Firefox. On the beacons tab, I see:


The one with the highest score shows 7660 connections, every 10 seconds. The infected host is When I enter that, I complete the challenge.

After solving this, I realized that there’s an HTML Rita report included in the zip, in the ELFU directory. Running firefox elfu-zeeklogs/ELFU/index.html will get the same report!