Skip to content

Plaso

What Plaso does

Guided SUSA tool journey

Plaso supports timeline and correlation. In this guide, you will use it to build and filter a small multi-source timeline while preserving source provenance. The procedure and screenshots provide the practical reference; the surrounding context explains what to record and how to judge the result.

Tool guide at a glance

Investigation task

Build and filter a small multi-source timeline while preserving source provenance.

Starting material

Verified training artefacts with known source time zones and provenance.

Successful outcome

A normalised, filtered timeline whose important rows remain traceable to source evidence.

Evidence and safety

Retain original timestamp values and precision. Chronological proximity does not prove causation. Record the input identifier, tool version, relevant commands or settings, time and time zone, output location, and any errors or limitations as you work.

Choose your journey

How the labs complement this guide

The Interactive Lab is a safe browser simulation for practising the workflow and validation logic. The Full Lab is an independent exercise for an isolated, authorised environment. Confirm the installed tool version and expected output before relying on either exercise in a real case.

Accessing Plaso in SUSA

Plaso (log2timeline) is a tool used to collect, parse, and correlate timestamps from multiple artefacts into a single timeline.

Importing a Plaso WSL distro from a Docker Image

Run the following commands in SANS SIFT VM or Linux VM of your choice. The commands are based on Microsoft’s documentation.

Use docker to pull the latest version of Plaso:

docker pull log2timeline/plaso:latest
root@siftworkstation:/cases# docker pull log2timeline/plaso:latest
latest: Pulling from log2timeline/plaso
a3629ac5b9f4: Pull complete 
6a3a6e4df7ce: Pull complete 
a1418a9ea6a2: Pull complete 
4f4fb700ef54: Pull complete 
1eeb3b3a10d8: Pull complete 
Digest: sha256:e4813c242d649dda83add1f939bb0c5dad7eb1ad6bcc2db9d4e14f3f0ae1a140
Status: Downloaded newer image for log2timeline/plaso:latest
docker.io/log2timeline/plaso:latest

Verify that the image has been pulled successfully:

docker image ls
root@siftworkstation:/cases# docker image ls
REPOSITORY           TAG        IMAGE ID       CREATED       SIZE
log2timeline/plaso   latest     9b64af4581bc   8 weeks ago   480MB
<SNIP>

Create and start a Docker container from the log2timeline/plaso:latest image and run the log2timeline.py --version command within it. This names the Docker container Plaso-latest.

docker run -t --name Plaso-latest log2timeline/plaso:latest log2timeline.py --version
root@siftworkstation:/cases# docker run -t --name Plaso-latest log2timeline/plaso:latest log2timeline.py --version
plaso - log2timeline version 20260119

Export all of the files in the new log2timeline/plaso:latest container into a tar archive file named Plaso-latest.tar located in the /cases directory.

docker export Plaso-latest > /cases/Plaso-latest.tar
root@siftworkstation:/cases# docker export Plaso-latest > /cases/Plaso-latest.tar

Delete the temporary container we created for export purposes.

docker rm Plaso-latest
root@siftworkstation:/cases# docker rm Plaso-latest
Plaso-latest

Copy the Plaso-latest.tar from the Linux VM to the Windows VM (C:\Tools\Plaso-latest). Refer to Using the SMB share on the Linux VM section if required.

In the Windows VM from an Administrator command terminal, make a folder called Plaso-latest to provide a directory location where the custom WSL distro will store its files.

mkdir C:\Tools\Plaso-latest

Next, navigate to the C:\Tools\Plaso-latest directory, import the tar file into WSL using the following commands:

cd C:\Tools\Plaso-latest
wsl --import Plaso-latest C:\Tools\Plaso-latest .\Plaso-latest.tar

Screenshot: Next, navigate to the C:\Tools\Plaso-latest directory, import the tar file into WSL using the following commands:

The custom WSL distro for Plaso should be ready. Run the command wsl -l -v to check which distribution you have installed. Use the command wsl -d Plaso-latest to run the new distro directly, or select from the Windows terminal new tab drop-down list.

Screenshot: The custom WSL distro for Plaso should be ready. Run the command wsl -l -v to check which distribution you have installed. Use the comman…

Screenshot: The custom WSL distro for Plaso should be ready. Run the command wsl -l -v to check which distribution you have installed. Use the comman…

Screenshot: The custom WSL distro for Plaso should be ready. Run the command wsl -l -v to check which distribution you have installed. Use the comman…

Using the SMB share on the Linux VM

The Linux SIFT Workstation has been configured to share its /cases and /mnt directories via SMB. You can verify this SMB config by running the following command:

cat /etc/samba/smb.conf
root@siftworkstation:/cases# cat /etc/samba/smb.conf
[global]
workgroup = SANS
server string = SIFT WORKSTATION
netbios name = SIFTWORKSTATION
security = USER
map to guest = Bad User 
dns proxy = no
include = /etc/samba/smb-%L.conf
guest account = sansforensics

[cases]
path = /cases
browseable = yes
writeable = yes
guest ok = yes
inherit owner = yes
create mask = 744
inherit permissions = yes

[mnt]
path = /mnt
browseable = yes
read only = yes
guest ok = yes

Check if Samba service is running:

systemctl status smbd
root@siftworkstation:/cases# systemctl status smbd
● smbd.service - Samba SMB Daemon
     Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2026-04-07 20:41:56 UTC; 27min ago
       Docs: man:smbd(8)
             man:samba(7)
             man:smb.conf(5)
   Main PID: 1259 (smbd)
     Status: "smbd: ready to serve connections..."
      Tasks: 4 (limit: 4432)
     Memory: 15.0M
        CPU: 349ms
     CGroup: /system.slice/smbd.service
             ├─1259 /usr/sbin/smbd --foreground --no-process-group
             ├─1269 /usr/sbin/smbd --foreground --no-process-group
             ├─1270 /usr/sbin/smbd --foreground --no-process-group
             └─1276 /usr/lib/x86_64-linux-gnu/samba/samba-bgqd --ready-signal-fd=47 --parent-watch-fd=12 --debuglevel=0 -F

Apr 07 20:41:54 siftworkstation systemd[1]: Starting Samba SMB Daemon...
Apr 07 20:41:55 siftworkstation smbd[1259]: [2026/04/07 20:41:55.561519,  0] ../../source3/smbd/server.c:1734(main)
Apr 07 20:41:55 siftworkstation smbd[1259]:   smbd version 4.15.13-Ubuntu started.
Apr 07 20:41:55 siftworkstation smbd[1259]:   Copyright Andrew Tridgell and the Samba Team 1992-2021
Apr 07 20:41:56 siftworkstation systemd[1]: Started Samba SMB Daemon.

Newer versions of Windows do not allow accessing anonymous SMB shares by default. Also, Windows 11 24H2 Enterprise added an SMB signing requirement for both inbound and outbound connections, which breaks outbound connections to a Linux SMB server. Open a PowerShell command prompt as Administrator and run the following commands:

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" AllowInsecureGuestAuth -Type DWORD -Value 1 -Force
Set-SmbClientConfiguration -RequireSecuritySignature $false -Force

We can either use the hostname siftworkstation or the IP address of the Linux SIFT to connect to the share directly:

Screenshot: We can either use the hostname siftworkstation or the IP address of the Linux SIFT to connect to the share directly:

Plaso

Create a Virtual Disk Image of Windows VM using KAPE

Transfer KAPE to the target Windows VM and run gkape.

Select C drive as the Target source and E drive as the Target destination. Uncheck Flush.

Select SANS Triage and VHDX as the Container. Set Base name as cdrive. Click Execute.

Screenshot: Select SANS Triage and VHDX as the Container. Set Base name as cdrive. Click Execute

This process may take some time. After completion, it will create a compressed folder in E drive containing the virtual disk image. Copy this to the DFIR VM’s G drive and unzip it.

Screenshot: This process may take some time. After completion, it will create a compressed folder in E drive containing the virtual disk image. Copy…

Double-clicking the VHDX will mount it on the DFIR VM as an E drive.

Screenshot: Double-clicking the VHDX will mount it on the DFIR VM as an E drive

Create the Super Timeline

Parse the Virtual Disk Image using log2timeline.py

For demonstration purposes, I have created a Windows 11 VM and simulated user activity by installing Sysmon and Firefox. I have copied the virtual disk file to my DFIR VM.

log2timeline.py scans forensic evidence, extracts timestamped events from supported artefacts, and stores them in a Plaso database for later analysis.

Open terminal and from the drop-down menu, select Plaso-latest.

Screenshot: Open terminal and from the drop-down menu, select Plaso-latest

Run the following command to verify that the mounted virtual disk image (E drive) can be seen from Plaso.

ls /mnt

Screenshot: Run the following command to verify that the mounted virtual disk image (E drive) can be seen from Plaso

Manually Mounting a Windows Drive

In some cases, the Plaso terminal may not automatically mount all Windows drives. This can occur with removable media, mounted forensic images, or virtual volumes. If the required drive is not present under /mnt, it can be mounted manually using the drvfs filesystem.

Check which drives are currently mounted:

ls /mnt
mount | grep /mnt

Screenshot: Check which drives are currently mounted:

If the required drive (for example, E:) is missing, create a mount point and mount it manually:

mkdir-p /mnt/e
mount-t drvfs E: /mnt/e

Verify that the drive has been mounted successfully:

ls /mnt
ls /mnt/e

Screenshot: Verify that the drive has been mounted successfully:

The drive can then be accessed using its Linux path (for example, /mnt/e) when running log2timeline.py.

We begin by parsing the contents of the mounted VHDX image using log2timeline. In the commands below, we specify the known time zone of the Windows host (UTC) and the preferred parsers. We are using the "win7" preset minus the "filestat" parser. We then run log2timeline.py a second time to add in the filesystem timeline body file we created with MFTECmd and mactime in previous exercise.

log2timeline.py --timezone 'UTC' --parsers 'win7,!filestat' --storage-file /mnt/g/timeline/windows-triage.plaso /mnt/e/C/

Screenshot: We begin by parsing the contents of the mounted VHDX image using log2timeline. In the commands below, we specify the known time zone of t…

Screenshot: We begin by parsing the contents of the mounted VHDX image using log2timeline. In the commands below, we specify the known time zone of t…

This process may take some time to complete. Once it is complete, before we add in the body file for the file system timestamps, we are going to filter out noisy events as we did in previous exercise.

grep -a -v -i -f /mnt/g/timeline/keyword_filter.txt /mnt/g/timeline/mft.body > /mnt/g/timeline/windows-mft-final.body

We also would like to change the forward slashes to backslashes to match the Windows path style. We can do that with the following sed command:

sed -i 's/\//\\/g' /mnt/g/timeline/windows-mft-final.body

Screenshot: We also would like to change the forward slashes to backslashes to match the Windows path style. We can do that with the following sed co…

We are now ready to import the final file system timeline data into log2timeline:

log2timeline.py --parsers 'mactime' --storage-file /mnt/g/timeline/windows-triage.plaso /mnt/g/timeline/windows-mft-final.body

Screenshot: We are now ready to import the final file system timeline data into log2timeline:

Screenshot: We are now ready to import the final file system timeline data into log2timeline:

After the log2timeline commands are complete, we have a Plaso database file with artifacts ready to export. To get the data exported into a CSV or other format for timeline review, we use psort.py. Run the following command to export the data to CSV:

psort.py --output-time-zone 'UTC' -o l2tcsv -w /mnt/g/timeline/windows-triage.csv /mnt/g/timeline/windows-triage.plaso 

Screenshot: After the log2timeline commands are complete, we have a Plaso database file with artifacts ready to export. To get the data exported into…

Verify the super timeline

Confirm that the CSV was created:

ls -lh /mnt/g/timeline/windows-triage.csv

Optionally verify that it contains records:

wc -l /mnt/g/timeline/windows-triage.csv

Screenshot: Optionally verify that it contains records:

Then return to Windows and browse to:

G:\timeline

Open windows-triage.csv using Timeline Explorer.

Note: Large timelines may take several minutes to load. Timeline Explorer may appear unresponsive while importing and indexing the CSV.

Screenshot:

Once loaded, confirm that the timeline contains:

  • timestamps in UTC;
  • Windows Event Log records;
  • file-system and MFT events;
  • records from other artifacts collected by KAPE; and
  • sortable fields such as date, time, source, sourcetype, type, and description.

Use Timeline Explorer’s column filters and keyword search to narrow the timeline according to the case. For example, filter by time range, username, executable, IP address, Event ID, or suspected indicator.

Screenshot: Use Timeline Explorer’s column filters and keyword search to narrow the timeline according to the case, such as by time range, userna…